commit a7c3157345cbe0a10eb789dacfbed7ec72f7cffc Author: wullie Date: Sun Nov 8 14:03:29 2026 +0000 init upload diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..adc2b1a --- /dev/null +++ b/.clang-format @@ -0,0 +1,16 @@ +Language: Cpp +BasedOnStyle: Mozilla +IndentWidth: 4 +AccessModifierOffset: -4 +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None + +BreakBeforeBraces: Custom +BraceWrapping: + AfterClass: true + AfterStruct: true + AfterEnum: true + AfterFunction: true + SplitEmptyFunction: false + SplitEmptyRecord: false + SplitEmptyNamespace: false diff --git a/.clang-tidy b/.clang-tidy new file mode 100644 index 0000000..180f676 --- /dev/null +++ b/.clang-tidy @@ -0,0 +1,6 @@ + +--- +Checks: '*,-fuchsia-*,-google-*,-zircon-*,-abseil-*,-modernize-use-trailing-return-type,-llvm-*,-llvmlibc-*,-performance-no-automatic-move,-cppcoreguidelines-owning-memory' +WarningsAsErrors: '*' +HeaderFilterRegex: '' +FormatStyle: none diff --git a/.cmake-format.yaml b/.cmake-format.yaml new file mode 100644 index 0000000..c4a575e --- /dev/null +++ b/.cmake-format.yaml @@ -0,0 +1,18 @@ +additional_commands: + foo: + flags: + - BAR + - BAZ + kwargs: + DEPENDS: '*' + HEADERS: '*' + SOURCES: '*' +bullet_char: '*' +dangle_parens: false +enum_char: . +line_ending: unix +line_width: 120 +max_pargs_hwrap: 3 +separate_ctrl_name_with_space: false +separate_fn_name_with_space: false +tab_size: 2 diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..4a4726a --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use_nix diff --git a/.github/ISSUE_TEMPLATE/bug-report.yaml b/.github/ISSUE_TEMPLATE/bug-report.yaml new file mode 100644 index 0000000..e8a1905 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.yaml @@ -0,0 +1,87 @@ +name: Bug Report +description: Found something you weren't expecting? Report it here! +labels: ["Unconfirmed Bug"] +body: +- type: markdown + attributes: + value: | + Thanks for taking the time to fill out this bug report. + NOTE: Please read the instructions below before filling the form. +- type: markdown + attributes: + value: | + 1. Please write in English, this is the language all maintainers can speak and write. + 2. Please take a moment to check that your issue doesn't already exist and not already reported. + 3. Please make sure the solution to your problem is not already mentioned in the FAQ (https://flameshot.org/docs/guide/faq/) + 4. Please provide the information for each field as complete as possible. +- type: textarea + id: flameshot-ver + attributes: + label: Flameshot Version + description: The Flameshot version (or commit reference) your are running. You can right-click on the tray icon > About > copy + placeholder: e.g Flameshot v0.10.1 (065aa98c) + validations: + required: true +- type: dropdown + id: installation-type + attributes: + label: Installation Type + description: How have you installed flameshot? + multiple: true + options: + - Linux, MacOS, or Windows Package manager (apt, pacman, eopkg, choco, brew, ...) + - User repository (AUR) + - Flatpak from Flathub + - Flatpak from Github + - Snap from Snapcraft + - Snap from + - AppImage + - Using the ready-made package from Github Releases + - Compiled from source + validations: + required: true +- type: input + id: os-ver + attributes: + label: Operating System type and version + description: "The operating system you are using Flameshot on:" + validations: + required: true +- type: textarea + id: description + attributes: + label: Description + description: | + Please provide a description of your issue here. Please explain in details what the issue is. If you can, provide screenshots or screen recordings to demonstrate the issue. + validations: + required: true +- type: textarea + id: steps-to-reproduce + attributes: + label: Steps to reproduce + description: Please write the steps we should take to reproduce this buggy behaviour + placeholder: | + 1. run `flameshot gui` + 2. select a region on the primary monitor + 3. save to file + 4. ... + validations: + required: false +- type: textarea + id: screenshots + attributes: + label: Screenshots or screen recordings + description: If you think it would be beneficial for us to understand the issue, please provide a screenshots or screen recording. For screen recording you can use [Peek](https://github.com/phw/peek) +- type: textarea + id: systeminfo + attributes: + label: System Information + description: | + Please provide the detailed information about your computer including: + 1. Operating system and version + 2. Your monitor configuration (easiest way would be to add a screenshot of your monitor setup from settings window) + 3. If using Linux (https://flameshot.org/docs/guide/issue-reporting/): + - Your Desktop Environment and your Window Manager + - if you are using Xorg or Wayland + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/feature-request.yaml b/.github/ISSUE_TEMPLATE/feature-request.yaml new file mode 100644 index 0000000..3670436 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.yaml @@ -0,0 +1,20 @@ +name: Feature Request +description: Got an idea for a feature that can make Flameshot even better? Propose your suggestion here! +labels: ["Enhancement"] +body: +- type: markdown + attributes: + value: | + 1. Please write in English, this is the language all maintainers can speak and write. + 2. Please only use this form to submit feature request and **not** bugs or questions. + 3. Please take a moment to check that your feature hasn't already been suggested. + 4. One picture worth a thousand words. If you think you can convey the message better by a drawing or pictrure, consider adding one. +- type: textarea + id: description + attributes: + label: Feature Description + placeholder: | + I think it would be great if ... + validations: + required: true + diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md new file mode 100644 index 0000000..9a6e4c6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/question.md @@ -0,0 +1,6 @@ + diff --git a/.github/workflows/Linux-arm-pack.yml b/.github/workflows/Linux-arm-pack.yml new file mode 100644 index 0000000..9ebab43 --- /dev/null +++ b/.github/workflows/Linux-arm-pack.yml @@ -0,0 +1,153 @@ +name: Packaging(Linux - ARM) + +on: + #push: + # branches: + # - master + # - fix* + # - move-arm-ci-to-new-ci + # paths-ignore: + # - 'README.md' + # - 'LICENSE' + # - 'docs/**' + + workflow_dispatch: + +env: + PRODUCT: flameshot + RELEASE: 1 + # dockerfiles, see https://github.com/flameshot-org/flameshot-dockerfiles + # docker images, see https://quay.io/repository/flameshot-org/ci-building + DOCKER_REPO: quay.io/flameshot-org/ci-building + # building tool: https://github.com/flameshot-org/packpack + PACKPACK_REPO: flameshot-org/packpack + +jobs: + deb-pack: + name: Build deb on ${{ matrix.dist.name }} ${{ matrix.dist.arch }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + dist: +# - { +# name: debian-11, +# os: debian, +# symbol: bullseye, +# arch: armhf +# } + - { + name: debian-12, + os: debian, + symbol: bookworm, + arch: arm64 + } + - { + name: debian-12, + os: debian, + symbol: bookworm, + arch: armhf + } + - { + name: ubuntu-22.04, + os: ubuntu, + symbol: jammy, + arch: arm64 + } + - { + name: ubuntu-24.04, + os: ubuntu, + symbol: noble, + arch: arm64 + } + + steps: + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Checkout Source code + if: github.event_name == 'push' + uses: actions/checkout@v4 + with: + fetch-depth: 0 +# ref: master + + - name: Checkout Source code + if: github.event_name == 'pull_request' + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: ${{ github.event.pull_request.head.sha }} + + - name: Checkout Source code + if: github.event_name == 'workflow_dispatch' + uses: actions/checkout@v4 + with: + ref: ${{ github.sha }} + + - name: Set env & Print flameshot version + shell: bash + run: | + last_committed_tag=$(git tag -l --sort=-v:refname | head -1) + git_revno=$(git rev-list $(git describe --tags --abbrev=0)..HEAD --count) + git_hash=$(git rev-parse --short HEAD) + ver_info=${last_committed_tag}+git${git_revno}.${git_hash} + echo "=======FLAMESHOT VERSION========" + echo ${last_committed_tag:1} + echo "Details: ${ver_info}" + echo "================================" + # This will allow to build pre-preleases without git tag + # echo "VERSION=${last_committed_tag:1}" >> $GITHUB_ENV + echo "VERSION=$(cat CMakeLists.txt |grep 'set.*(.*FLAMESHOT_VERSION' | sed 's/[^0-9.]*//' |sed 's/)//g')" >> $GITHUB_ENV + echo "VER_INFO=${ver_info}" >> $GITHUB_ENV + echo "GIT_HASH=${git_hash}" >> $GITHUB_ENV + + + - name: Get packpack tool + uses: actions/checkout@v4 + with: + repository: ${{ env.PACKPACK_REPO }} + path: tools + ref: multiarch + set-safe-directory: $GITHUB_WORKSPACE/tools + + - name: Packaging on ${{ matrix.dist.name }} ${{ matrix.dist.arch }} + env: + OS: ${{ matrix.dist.os }} + DIST: ${{ matrix.dist.symbol }} + DOCKER_ARCH: ${{ matrix.dist.arch }} + run: | + case ${DOCKER_ARCH} in + arm32v7) + export ARCH=arm/v7 + ;; + armhf) + export ARCH=arm/v7 + ;; + arm64*) + export ARCH=arm64 + ;; + *) + export ARCH=${DOCKER_ARCH} + ;; + esac + cp -r $GITHUB_WORKSPACE/packaging/debian $GITHUB_WORKSPACE + bash $GITHUB_WORKSPACE/tools/packpack + mv $GITHUB_WORKSPACE/build/${PRODUCT}_${VERSION}-${RELEASE}_${{ matrix.dist.arch }}.deb $GITHUB_WORKSPACE/build/${PRODUCT}-${VERSION}-${RELEASE}.${{ matrix.dist.name }}.${{ matrix.dist.arch }}.deb + + - name: SHA256Sum of ${{ matrix.dist.name }} ${{ matrix.dist.arch }} package + run: | + cd "$GITHUB_WORKSPACE/build/" || { >&2 echo "Cannot cd to '$GITHUB_WORKSPACE/build/'!"; exit 11 ; } + sha256sum ${PRODUCT}-${VERSION}-${RELEASE}.${{ matrix.dist.name }}.${{ matrix.dist.arch }}.deb | tee ${PRODUCT}-${VERSION}-${RELEASE}.${{ matrix.dist.name }}.${{ matrix.dist.arch }}.deb.sha256sum + + - name: Artifact Upload + uses: actions/upload-artifact@v4 + with: + name: ${{ env.PRODUCT }}-${{ env.VER_INFO }}-artifact-${{ matrix.dist.name }}-${{ matrix.dist.arch }} + path: | + ${{ github.workspace }}/build/${{ env.PRODUCT }}-*-${{ env.RELEASE }}.${{ matrix.dist.name }}.${{ matrix.dist.arch }}.deb + ${{ github.workspace }}/build/${{ env.PRODUCT }}-*-${{ env.RELEASE }}.${{ matrix.dist.name }}.${{ matrix.dist.arch }}.deb.sha256sum + overwrite: true diff --git a/.github/workflows/Linux-pack.yml b/.github/workflows/Linux-pack.yml new file mode 100644 index 0000000..7f308c0 --- /dev/null +++ b/.github/workflows/Linux-pack.yml @@ -0,0 +1,504 @@ +name: Packaging(Linux) + +on: + push: + branches: + - master + - fix* + paths-ignore: + - 'README.md' + - 'LICENSE' + - 'docs/**' + + pull_request: + paths-ignore: + - 'README.md' + - 'LICENSE' + - 'docs/**' + - 'data/translations/*.ts' + + workflow_dispatch: + +env: + PRODUCT: flameshot + RELEASE: 1 + # dockerfiles, see https://github.com/flameshot-org/flameshot-dockerfiles + # docker images, see https://quay.io/repository/flameshot-org/ci-building + DOCKER_REPO: quay.io/flameshot-org/ci-building + # building tool: https://github.com/flameshot-org/packpack + PACKPACK_REPO: flameshot-org/packpack + +jobs: + deb-pack: + name: Build deb on ${{ matrix.dist.name }} ${{ matrix.dist.arch }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + dist: + - { + name: debian-12, + os: debian, + symbol: bookworm, + arch: amd64 + } + - { + name: ubuntu-22.04, + os: ubuntu, + symbol: jammy, + arch: amd64 + } + - { + name: ubuntu-24.04, + os: ubuntu, + symbol: noble, + arch: amd64 + } + + steps: + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Checkout Source code + if: github.event_name == 'push' + uses: actions/checkout@v4 + with: + fetch-depth: 0 +# ref: master + + - name: Checkout Source code + if: github.event_name == 'pull_request' + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: ${{ github.event.pull_request.head.sha }} + + - name: Checkout Source code + if: github.event_name == 'workflow_dispatch' + uses: actions/checkout@v4 + with: + ref: ${{ github.sha }} + + - name: Set env & Print flameshot version + shell: bash + run: | + last_committed_tag=$(git tag -l --sort=-v:refname | head -1) + git_revno=$(git rev-list $(git describe --tags --abbrev=0)..HEAD --count) + git_hash=$(git rev-parse --short HEAD) + ver_info=${last_committed_tag}+git${git_revno}.${git_hash} + echo "=======FLAMESHOT VERSION========" + echo ${last_committed_tag:1} + echo "Details: ${ver_info}" + echo "================================" + # This will allow to build pre-preleases without git tag + # echo "VERSION=${last_committed_tag:1}" >> $GITHUB_ENV + echo "VERSION=$(cat CMakeLists.txt |grep 'set.*(.*FLAMESHOT_VERSION' | sed 's/[^0-9.]*//' |sed 's/)//g')" >> $GITHUB_ENV + echo "VER_INFO=${ver_info}" >> $GITHUB_ENV + echo "GIT_HASH=${git_hash}" >> $GITHUB_ENV + + - name: Get packpack tool + uses: actions/checkout@v4 + with: + repository: ${{ env.PACKPACK_REPO }} + path: tools + ref: multiarch + set-safe-directory: $GITHUB_WORKSPACE/tools + + - name: Packaging on ${{ matrix.dist.name }} ${{ matrix.dist.arch }} + env: + OS: ${{ matrix.dist.os }} + DIST: ${{ matrix.dist.symbol }} + PRESERVE_ENVVARS: "GIT_HASH" + run: | + cp -r $GITHUB_WORKSPACE/packaging/debian $GITHUB_WORKSPACE + bash $GITHUB_WORKSPACE/tools/packpack + mv $GITHUB_WORKSPACE/build/${PRODUCT}_${VERSION}-${RELEASE}_${{ matrix.dist.arch }}.deb $GITHUB_WORKSPACE/build/${PRODUCT}-${VERSION}-${RELEASE}.${{ matrix.dist.name }}.${{ matrix.dist.arch }}.deb + + - name: SHA256Sum of ${{ matrix.dist.name }} ${{ matrix.dist.arch }} package + run: | + cd "$GITHUB_WORKSPACE/build/" || { >&2 echo "Cannot cd to '$GITHUB_WORKSPACE/build/'!"; exit 11 ; } + sha256sum ${PRODUCT}-${VERSION}-${RELEASE}.${{ matrix.dist.name }}.${{ matrix.dist.arch }}.deb | tee ${PRODUCT}-${VERSION}-${RELEASE}.${{ matrix.dist.name }}.${{ matrix.dist.arch }}.deb.sha256sum + + - name: Artifact Upload + uses: actions/upload-artifact@v4 + with: + name: ${{ env.PRODUCT }}-${{ env.VER_INFO }}-artifact-${{ matrix.dist.name }}-${{ matrix.dist.arch }} + path: | + ${{ github.workspace }}/build/${{ env.PRODUCT }}-*-${{ env.RELEASE }}.${{ matrix.dist.name }}.${{ matrix.dist.arch }}.deb + ${{ github.workspace }}/build/${{ env.PRODUCT }}-*-${{ env.RELEASE }}.${{ matrix.dist.name }}.${{ matrix.dist.arch }}.deb.sha256sum + overwrite: true + + rpm-pack: + name: Build rpm on ${{ matrix.dist.name }} ${{ matrix.dist.arch }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + dist: + - { + name: fedora-41, + os: fedora, + symbol: 41, + arch: x86_64 + } + - { + name: fedora-42, + os: fedora, + symbol: 42, + arch: x86_64 + } + steps: + - name: Checkout Source code + if: github.event_name == 'push' + uses: actions/checkout@v4 + with: + fetch-depth: 0 +# ref: master + + - name: Checkout Source code + if: github.event_name == 'pull_request' + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: ${{ github.event.pull_request.head.sha }} + + - name: Checkout Source code + if: github.event_name == 'workflow_dispatch' + uses: actions/checkout@v4 + with: + ref: ${{ github.sha }} + + - name: Set env & Print flameshot version + shell: bash + run: | + last_committed_tag=$(git tag -l --sort=-v:refname | head -1) + git_revno=$(git rev-list $(git describe --tags --abbrev=0)..HEAD --count) + git_hash=$(git rev-parse --short HEAD) + ver_info=${last_committed_tag}+git${git_revno}.${git_hash} + echo "=======FLAMESHOT VERSION========" + echo ${last_committed_tag:1} + echo "Details: ${ver_info}" + echo "================================" + # This will allow to build pre-preleases without git tag + # echo "VERSION=${last_committed_tag:1}" >> $GITHUB_ENV + echo "VERSION=$(cat CMakeLists.txt |grep 'set.*(.*FLAMESHOT_VERSION' | sed 's/[^0-9.]*//' |sed 's/)//g')" >> $GITHUB_ENV + echo "VER_INFO=${ver_info}" >> $GITHUB_ENV + echo "GIT_HASH=${git_hash}" >> $GITHUB_ENV + + - name: Get packpack tool + uses: actions/checkout@v4 + with: + repository: ${{ env.PACKPACK_REPO }} + path: tools + ref: master + set-safe-directory: $GITHUB_WORKSPACE/tools + + - name: Packaging on ${{ matrix.dist.name }} ${{ matrix.dist.arch }} + if: matrix.dist.os == 'fedora' + run: | + mkdir $GITHUB_WORKSPACE/rpm + cp $GITHUB_WORKSPACE/packaging/rpm/fedora/flameshot.spec $GITHUB_WORKSPACE/rpm + bash $GITHUB_WORKSPACE/tools/packpack + env: + OS: ${{ matrix.dist.os }} + DIST: ${{ matrix.dist.symbol }} + PRESERVE_ENVVARS: "GIT_HASH" + + - name: Packaging on ${{ matrix.dist.name }} ${{ matrix.dist.arch }} + if: matrix.dist.os == 'opensuse-leap' + run: | + mkdir $GITHUB_WORKSPACE/rpm + cp $GITHUB_WORKSPACE/packaging/rpm/opensuse/flameshot.spec $GITHUB_WORKSPACE/rpm + bash $GITHUB_WORKSPACE/tools/packpack + env: + OS: ${{ matrix.dist.os }} + DIST: ${{ matrix.dist.symbol }} + + - name: Package Clean + if: matrix.dist.os == 'fedora' + run: | + rm -f ${{ github.workspace }}/build/${{ env.PRODUCT }}-debuginfo-*.rpm + rm -f ${{ github.workspace }}/build/${{ env.PRODUCT }}-debugsource-*.rpm + rm -f ${{ github.workspace }}/build/${{ env.PRODUCT }}-*.src.rpm + rm -f ${{ github.workspace }}/build/build.log + + - name: SHA256Sum of ${{ matrix.dist.name }} ${{ matrix.dist.arch }} package + if: matrix.dist.os == 'fedora' + run: | + cd "$GITHUB_WORKSPACE/build/" || { >&2 echo "Cannot cd to '$GITHUB_WORKSPACE/build/'!"; exit 11 ; } + sha256sum ${PRODUCT}-${VERSION}-${RELEASE}.fc*.${{ matrix.dist.arch }}.rpm | tee ${PRODUCT}-${VERSION}-${RELEASE}.fc${{ matrix.dist.symbol }}.${{ matrix.dist.arch }}.rpm.sha256sum + + - name: SHA256Sum of ${{ matrix.dist.name }} ${{ matrix.dist.arch }} package + if: matrix.dist.os == 'opensuse-leap' + run: | + mv $GITHUB_WORKSPACE/build/${PRODUCT}-${VERSION}-lp*.${{ matrix.dist.arch }}.rpm $GITHUB_WORKSPACE/build/${PRODUCT}-${VERSION}-${RELEASE}-lp${{ matrix.dist.symbol }}.${{ matrix.dist.arch }}.rpm + cd "$GITHUB_WORKSPACE/build/" || { >&2 echo "Cannot cd to '$GITHUB_WORKSPACE/build/'!"; exit 11 ; } + sha256sum ${PRODUCT}-${VERSION}-${RELEASE}-lp${{ matrix.dist.symbol }}.${{ matrix.dist.arch }}.rpm | tee ${PRODUCT}-${VERSION}-${RELEASE}-lp${{ matrix.dist.symbol }}.${{ matrix.dist.arch }}.rpm.sha256sum + + - name: Artifact Upload + if: matrix.dist.os == 'fedora' + uses: actions/upload-artifact@v4 + with: + name: ${{ env.PRODUCT }}-${{ env.VER_INFO }}-artifact-${{ matrix.dist.name }}-${{ matrix.dist.arch }} + path: | + ${{ github.workspace }}/build/ + overwrite: true + + - name: Artifact Upload + if: matrix.dist.os == 'opensuse-leap' + uses: actions/upload-artifact@v4 + with: + name: ${{ env.PRODUCT }}-${{ env.VER_INFO }}-artifact-${{ matrix.dist.name }}-${{ matrix.dist.arch }} + path: | + ${{ github.workspace }}/build/${{ env.PRODUCT }}-*-lp${{ matrix.dist.symbol }}.${{ matrix.dist.arch }}.rpm + ${{ github.workspace }}/build/${{ env.PRODUCT }}-*-lp${{ matrix.dist.symbol }}.${{ matrix.dist.arch }}.rpm.sha256sum + overwrite: true + + appimage-pack: + name: Build appimage on ${{ matrix.config.name }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + config: + - { + name: ubuntu-22.04, + os: ubuntu, + symbol: jammy, + arch: amd64, + image_repo: quay.io/flameshot-org/ci-building + } + container: + image: ${{ matrix.config.image_repo }}:${{ matrix.config.os }}-${{ matrix.config.symbol }} + options: --cap-add SYS_ADMIN --device /dev/fuse --security-opt apparmor:unconfined + steps: + - name: Configure git safe directory + shell: bash + run: | + git config --global --add safe.directory "$GITHUB_WORKSPACE" + + - name: Checkout Source code + if: github.event_name == 'push' + uses: actions/checkout@v4 + with: + fetch-depth: 0 +# ref: master + + - name: Checkout Source code + if: github.event_name == 'pull_request' + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: ${{ github.event.pull_request.head.sha }} + + - name: Checkout Source code + if: github.event_name == 'workflow_dispatch' + uses: actions/checkout@v4 + with: + ref: ${{ github.sha }} + + - name: Set env & Print flameshot version + shell: bash + run: | + last_committed_tag=$(git tag -l --sort=-v:refname | head -1) + git_revno=$(git rev-list $(git describe --tags --abbrev=0)..HEAD --count) + git_hash=$(git rev-parse --short HEAD) + ver_info=${last_committed_tag}+git${git_revno}.${git_hash} + echo "=======FLAMESHOT VERSION========" + echo ${last_committed_tag:1} + echo "Details: ${ver_info}" + echo "================================" + # This will allow to build pre-preleases without git tag + # echo "VERSION=${last_committed_tag:1}" >> $GITHUB_ENV + echo "VERSION=$(cat CMakeLists.txt |grep 'set.*(.*FLAMESHOT_VERSION' | sed 's/[^0-9.]*//' |sed 's/)//g')" >> $GITHUB_ENV + echo "VER_INFO=${ver_info}" >> $GITHUB_ENV + echo "GIT_HASH=${git_hash}" >> $GITHUB_ENV + + - name: Install Dependencies + run: | + sudo apt-get -y -qq update + sudo apt-get -y --no-install-recommends install fuse cmake extra-cmake-modules build-essential qt6-base-dev qt6-tools-dev qt6-tools-dev-tools libqt6svg6-dev qt6-l10n-tools qt6-wayland libgl-dev appstream hicolor-icon-theme openssl ca-certificates jq + + - name: Download linuxdeploy + run: | + wget -c -nv "https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage" + chmod a+x linuxdeploy-x86_64.AppImage + LINUXDEPLOY_BIN=${PWD}/linuxdeploy-x86_64.AppImage + + - name: Download linuxdeployqt-plugin-appimage + run: | + wget -c -nv "https://github.com/linuxdeploy/linuxdeploy-plugin-appimage/releases/download/continuous/linuxdeploy-plugin-appimage-x86_64.AppImage" + chmod a+x linuxdeploy-plugin-appimage-x86_64.AppImage + + - name: Download linuxdeployqt-plugin-qt + run: | + wget -c -nv "https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage" + chmod a+x linuxdeploy-plugin-qt-x86_64.AppImage + + - name: Packaging appimage + run: | + set -x + APPIMAGE_DST_PATH=$GITHUB_WORKSPACE/${PRODUCT}.AppDir + mkdir -p ${APPIMAGE_DST_PATH} + + cd $GITHUB_WORKSPACE + cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/usr -DUSE_LAUNCHER_ABSOLUTE_PATH:BOOL=OFF + make -j$(nproc) DESTDIR=${APPIMAGE_DST_PATH} install + rm -rf ${APPIMAGE_DST_PATH}/usr/include + rm -rf ${APPIMAGE_DST_PATH}/usr/lib + + export EXTRA_PLATFORM_PLUGINS="libqwayland-generic.so" + export EXTRA_QT_MODULES="waylandcompositor" + export QMAKE=/usr/lib/qt6/bin/qmake + ${PWD}/linuxdeploy-x86_64.AppImage --appdir ${APPIMAGE_DST_PATH} --plugin qt --output appimage + + mv $GITHUB_WORKSPACE/Flameshot-${VERSION}-x86_64.AppImage $GITHUB_WORKSPACE/Flameshot-${VERSION}.x86_64.AppImage + + - name: SHA256Sum of appimage package + run: | + cd "$GITHUB_WORKSPACE/" || { >&2 echo "Cannot cd to '$GITHUB_WORKSPACE/'!"; exit 11 ; } + sha256sum Flameshot-${VERSION}.x86_64.AppImage | tee Flameshot-${VERSION}.x86_64.AppImage.sha256sum + + - name: Artifact Upload + uses: actions/upload-artifact@v4 + with: + name: ${{ env.PRODUCT }}-${{ env.VER_INFO }}-artifact-appimage-x86_64 + path: | + ${{ github.workspace }}/Flameshot-*.x86_64.AppImage + ${{ github.workspace }}/Flameshot-*.x86_64.AppImage.sha256sum + overwrite: true + + flatpak-pack: + name: Build flatpak on ubuntu 24.04 + runs-on: ubuntu-24.04 + steps: + - name: Checkout Source code + if: github.event_name == 'push' + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: master + - name: Checkout Source code + if: github.event_name == 'pull_request' + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: ${{ github.event.pull_request.head.sha }} + + - name: Checkout Source code + if: github.event_name == 'workflow_dispatch' + uses: actions/checkout@v4 + with: + ref: ${{ github.sha }} + + - name: Set env & Print flameshot version + shell: bash + run: | + last_committed_tag=$(git tag -l --sort=-v:refname | head -1) + git_revno=$(git rev-list $(git describe --tags --abbrev=0)..HEAD --count) + git_hash=$(git rev-parse --short HEAD) + ver_info=${last_committed_tag}+git${git_revno}.${git_hash} + echo "=======FLAMESHOT VERSION========" + echo ${last_committed_tag:1} + echo "Details: ${ver_info}" + echo "================================" + # This will allow to build pre-preleases without git tag + # echo "VERSION=${last_committed_tag:1}" >> $GITHUB_ENV + echo "VERSION=$(cat CMakeLists.txt |grep 'set.*(.*FLAMESHOT_VERSION' | sed 's/[^0-9.]*//' |sed 's/)//g')" >> $GITHUB_ENV + echo "VER_INFO=${ver_info}" >> $GITHUB_ENV + echo "GIT_HASH=${git_hash}" >> $GITHUB_ENV + + - name: Setup flatpak + run: | + sudo apt-get -y -qq update + sudo apt-get install -y flatpak flatpak-builder + - name: Setup Flathub + run: | + flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo + flatpak install -y --noninteractive flathub org.kde.Sdk//6.9 org.kde.Platform//6.9 + - name: Packaging flatpak + run: | + BUNDLE="org.flameshot.Flameshot_${VERSION}_x86_64.flatpak" + MANIFEST_PATH=$GITHUB_WORKSPACE/packaging/flatpak/org.flameshot.Flameshot.yml + RUNTIME_REPO="https://flathub.org/repo/flathub.flatpakrepo" + APP_ID="org.flameshot.Flameshot" + BRANCH="master" + + flatpak-builder --user --disable-rofiles-fuse --repo=repo --force-clean flatpak_app ${MANIFEST_PATH} --install-deps-from=flathub + flatpak build-bundle repo ${BUNDLE} --runtime-repo=${RUNTIME_REPO} ${APP_ID} ${BRANCH} + mv $GITHUB_WORKSPACE/org.flameshot.Flameshot_${VERSION}_x86_64.flatpak $GITHUB_WORKSPACE/org.flameshot.Flameshot-${VERSION}.x86_64.flatpak + - name: SHA256Sum of flatpak package + run: | + cd "$GITHUB_WORKSPACE/" || { >&2 echo "Cannot cd to '$GITHUB_WORKSPACE/'!"; exit 11 ; } + sha256sum org.flameshot.Flameshot-${VERSION}.x86_64.flatpak | tee org.flameshot.Flameshot-${VERSION}.x86_64.flatpak.sha256sum + - name: Artifact Upload + uses: actions/upload-artifact@v4 + with: + name: ${{ env.PRODUCT }}-${{ env.VER_INFO }}-artifact-flatpak-x86_64 + path: | + ${{ github.workspace }}/org.flameshot.Flameshot-*.x86_64.flatpak + ${{ github.workspace }}/org.flameshot.Flameshot-*.x86_64.flatpak.sha256sum + overwrite: true + + snap-pack: + name: Build snap on ubuntu latest + runs-on: ubuntu-latest + steps: + - name: Checkout Source code + if: github.event_name == 'push' + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: master + - name: Checkout Source code + if: github.event_name == 'pull_request' + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: ${{ github.event.pull_request.head.sha }} + + + - name: Checkout Source code + if: github.event_name == 'workflow_dispatch' + uses: actions/checkout@v4 + with: + ref: ${{ github.sha }} + + - name: Set env & Print flameshot version + shell: bash + run: | + last_committed_tag=$(git tag -l --sort=-v:refname | head -1) + git_revno=$(git rev-list $(git describe --tags --abbrev=0)..HEAD --count) + git_hash=$(git rev-parse --short HEAD) + ver_info=${last_committed_tag}+git${git_revno}.${git_hash} + echo "=======FLAMESHOT VERSION========" + echo ${last_committed_tag:1} + echo "Details: ${ver_info}" + echo "================================" + # This will allow to build pre-preleases without git tag + # echo "VERSION=${last_committed_tag:1}" >> $GITHUB_ENV + echo "VERSION=$(cat CMakeLists.txt |grep 'set.*(.*FLAMESHOT_VERSION' | sed 's/[^0-9.]*//' |sed 's/)//g')" >> $GITHUB_ENV + echo "VER_INFO=${ver_info}" >> $GITHUB_ENV + echo "GIT_HASH=${git_hash}" >> $GITHUB_ENV + + - name: Packaging snap + uses: snapcore/action-build@v1 + id: snapcraft + + - name: Rename snap name + shell: bash + run: | + mkdir -p $GITHUB_WORKSPACE/build + cp ${{ steps.snapcraft.outputs.snap }} $GITHUB_WORKSPACE/build/${PRODUCT}-${VERSION}-${RELEASE}.amd64.snap + - name: SHA256Sum of snap package + run: | + cd "$GITHUB_WORKSPACE/build/" || { >&2 echo "Cannot cd to '$GITHUB_WORKSPACE/build/'!"; exit 11 ; } + sha256sum ${PRODUCT}-${VERSION}-${RELEASE}.amd64.snap | tee ${PRODUCT}-${VERSION}-${RELEASE}.amd64.snap.sha256sum + - name: Artifact Upload + uses: actions/upload-artifact@v4 + with: + name: ${{ env.PRODUCT }}-${{ env.VER_INFO }}-artifact-snap-x86_64 + path: | + ${{ github.workspace }}/build/${{ env.PRODUCT }}-*-${{ env.RELEASE }}.amd64.snap + ${{ github.workspace }}/build/${{ env.PRODUCT }}-*-${{ env.RELEASE }}.amd64.snap.sha256sum + overwrite: true diff --git a/.github/workflows/MacOS-pack.yml b/.github/workflows/MacOS-pack.yml new file mode 100644 index 0000000..9662703 --- /dev/null +++ b/.github/workflows/MacOS-pack.yml @@ -0,0 +1,99 @@ +name: Packaging(MacOS) + +on: + push: + branches: + - master + paths-ignore: + - 'README.md' + - 'LICENSE' + - 'docs/**' + + pull_request: + paths-ignore: + - 'README.md' + - 'LICENSE' + - 'docs/**' + - 'data/translations/*.ts' + + workflow_dispatch: + +env: + PRODUCT: flameshot + +jobs: + dmg-pack: + name: Build dmg on ${{ matrix.dist.os }} ${{ matrix.dist.arch }} + strategy: + fail-fast: false + matrix: + dist: + - { + os: macos-14, + arch: arm64 + } + - { + os: macos-13, + arch: intel + } + runs-on: ${{ matrix.dist.os }} + env: + APP_NAME: flameshot + DIR_BUILD: build + steps: + - name: Checkout Source code + if: github.event_name == 'push' + uses: actions/checkout@v4 + + - name: Checkout Source code + if: github.event_name == 'pull_request' + uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.sha }} + + - name: Checkout Source code + if: github.event_name == 'workflow_dispatch' + uses: actions/checkout@v4 + with: + ref: ${{ github.sha }} + + - name: Set env & Print flameshot version + shell: bash + run: | + last_committed_tag=$(git tag -l --sort=-v:refname | head -1) + git_revno=$(git rev-list $(git describe --tags --abbrev=0)..HEAD --count) + git_hash=$(git rev-parse --short HEAD) + ver_info=${last_committed_tag}+git${git_revno}.${git_hash} + echo "=======FLAMESHOT VERSION========" + echo ${last_committed_tag:1} + echo "Details: ${ver_info}" + echo "================================" + # This will allow to build pre-preleases without git tag + # echo "VERSION=${last_committed_tag:1}" >> $GITHUB_ENV + echo "VERSION=$(cat CMakeLists.txt |grep 'set.*(.*FLAMESHOT_VERSION' | sed 's/[^0-9.]*//' |sed 's/)//g')" >> $GITHUB_ENV + echo "VER_INFO=${ver_info}" >> $GITHUB_ENV + echo "GIT_HASH=${git_hash}" >> $GITHUB_ENV + + - name: Install Qt + run: brew install qt@6 + + - name: Configure + run: | + rm -rf "${DIR_BUILD}"/src/flameshot.dmg "${DIR_BUILD}"/src/flameshot.app/ + cmake -GNinja -S . -B "${DIR_BUILD}" -DQt6_DIR=$(brew --prefix qt6)/lib/cmake/Qt6 -DUSE_MONOCHROME_ICON=True + + - name: Compile + run: | + cmake --build "${DIR_BUILD}" + + - name: Build dmg package + run: | + cd "${DIR_BUILD}" + ninja create_dmg + + - name: Artifact Upload + uses: actions/upload-artifact@v4 + with: + name: ${{ env.PRODUCT }}-${{ env.VER_INFO }}-artifact-macos-${{ matrix.dist.arch }} + path: ${{ github.workspace }}/build/src/Flameshot-${{ env.VERSION }}.dmg + overwrite: true \ No newline at end of file diff --git a/.github/workflows/Windows-pack.yml b/.github/workflows/Windows-pack.yml new file mode 100644 index 0000000..0c68cf2 --- /dev/null +++ b/.github/workflows/Windows-pack.yml @@ -0,0 +1,197 @@ +name: Packaging(Windows) + +on: + push: + branches: + - master + - fix* + paths-ignore: + - 'README.md' + - 'LICENSE' + - 'docs/**' + + pull_request: + paths-ignore: + - 'README.md' + - 'LICENSE' + - 'docs/**' + - 'data/translations/*.ts' + + workflow_dispatch: + + +env: + PRODUCT: flameshot + +jobs: + windows-pack: + name: VS 2022 ${{ matrix.config.arch }}-${{ matrix.type }} + runs-on: windows-2025 + env: + VCINSTALLDIR: C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC + # 2025.02.14 + VCPKG_VERSION: d5ec528843d29e3a52d745a64b469f810b2cedbf + VCPKG_PACKAGES: openssl-windows + OPENSSL_ROOT_DIR: ${{ github.workspace }}\vcpkg\installed\${{ matrix.config.vcpkg_triplet }}\ + strategy: + fail-fast: false + matrix: + qt_ver: [6.9.1] + qt_target: [desktop] + config: + - { + arch: x64, + generator: "-G'Visual Studio 17 2022' -A x64", + vcpkg_triplet: x64-windows, + qt_arch: win64_msvc2022_64, + qt_arch_install: msvc2022_64, + pak_arch: win64 + } + type: [portable, installer] + steps: + - name: Checkout Source code + if: github.event_name == 'push' + uses: actions/checkout@v4 + with: + fetch-depth: 0 +# ref: master + + - name: Checkout Source code + if: github.event_name == 'pull_request' + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: ${{ github.event.pull_request.head.sha }} + + - name: Checkout Source code + if: github.event_name == 'workflow_dispatch' + uses: actions/checkout@v4 + with: + ref: ${{ github.sha }} + + - name: Fix Python path + shell: pwsh + run: | + Remove-Item "$env:LOCALAPPDATA\Microsoft\WindowsApps\python*.exe" -Force -ErrorAction SilentlyContinue + + - name: Set env & Print flameshot version + shell: bash + run: | + last_committed_tag=$(git tag -l --sort=-v:refname | head -1) + git_revno=$(git rev-list $(git describe --tags --abbrev=0)..HEAD --count) + git_hash=$(git rev-parse --short HEAD) + ver_info=${last_committed_tag}+git${git_revno}.${git_hash} + echo "=======FLAMESHOT VERSION========" + echo ${last_committed_tag:1} + echo "Details: ${ver_info}" + echo "================================" + # This will allow to build pre-preleases without git tag + # echo "VERSION=${last_committed_tag:1}" >> $GITHUB_ENV + echo "VERSION=$(cat CMakeLists.txt |grep 'set.*(.*FLAMESHOT_VERSION' | sed 's/[^0-9.]*//' |sed 's/)//g')" >> $GITHUB_ENV + echo "VER_INFO=${ver_info}" >> $GITHUB_ENV + echo "GIT_HASH=${git_hash}" >> $GITHUB_ENV + + - name: Restore from cache and run vcpkg + uses: lukka/run-vcpkg@v11 + with: + vcpkgArguments: ${{env.VCPKG_PACKAGES}} + vcpkgDirectory: '${{ github.workspace }}\vcpkg' + appendedCacheKey: ${{ matrix.config.vcpkg_triplet }} + vcpkgGitCommitId: ${{ env.VCPKG_VERSION }} + vcpkgTriplet: ${{ matrix.config.vcpkg_triplet }} + + - name: Install Qt + uses: jurplel/install-qt-action@v4 + with: + version: ${{ matrix.qt_ver }} + cache: 'true' + cache-key-prefix: install-qt-action-${{ matrix.qt_ver }} + target: ${{ matrix.qt_target }} + arch: ${{ matrix.config.qt_arch }} + modules: 'qtimageformats' + dir: '${{ github.workspace }}/build/' + + - name: Configure + working-directory: build + shell: pwsh + run: | + cmake .. ${{matrix.config.generator}} ` + -DCMAKE_TOOLCHAIN_FILE="${{ github.workspace }}\vcpkg\scripts\buildsystems\vcpkg.cmake" ` + -DENABLE_OPENSSL=ON ` + -DCMAKE_BUILD_TYPE=Release ` + -DRUN_IN_PLACE=${{ contains(matrix.type, 'portable') }} + + - name: Compile + working-directory: build + shell: pwsh + run: cmake --build . --config Release + + - name: CPack + working-directory: build + shell: pwsh + run: | + # Chocolately made their own package called cpack and its first in the path. This is a hack since we are only using cmake's cpack, doesn't seem to be required after a CI update + #Remove-Item C:\ProgramData\Chocolatey\bin\cpack.exe + If ($env:TYPE -eq "installer") + { + cpack -G WIX -B "$env:GITHUB_WORKSPACE\build\Package" + } + ElseIf($env:TYPE -eq "portable") + { + cpack -G ZIP -B "$env:GITHUB_WORKSPACE\build\Package" + } + env: + TYPE: ${{matrix.type}} + + - name: Package Clean + shell: pwsh + run: | + # Remove-Item $env:GITHUB_WORKSPACE\build\Package\_CPack_Packages -Recurse + New-Item -Path $env:GITHUB_WORKSPACE\build\Package\installer -ItemType Directory + New-Item -Path $env:GITHUB_WORKSPACE\build\Package\portable -ItemType Directory + + - name: Package Prepare (installer) + if: matrix.type == 'installer' + shell: pwsh + run: | + Move-Item -Path $env:GITHUB_WORKSPACE/build/Package/Flameshot-*-${{ matrix.config.pak_arch }}.msi -Destination $env:GITHUB_WORKSPACE/build/Package/installer/Flameshot-${{ env.VERSION }}-${{ matrix.config.pak_arch }}.msi + + - name: Package Prepare (portable) + if: matrix.type == 'portable' + shell: pwsh + run: | + Move-Item -Path $env:GITHUB_WORKSPACE/build/Package/flameshot-*-${{ matrix.config.pak_arch }}.zip -Destination $env:GITHUB_WORKSPACE/build/Package/portable/flameshot-${{ env.VERSION }}-${{ matrix.config.pak_arch }}.zip + + - name: SHA256Sum of Windows installer + if: matrix.type == 'installer' + shell: bash + run: | + sha256sum $GITHUB_WORKSPACE/build/Package/installer/Flameshot-${{ env.VERSION }}-${{ matrix.config.pak_arch }}.msi + sha256sum $GITHUB_WORKSPACE/build/Package/installer/Flameshot-${{ env.VERSION }}-${{ matrix.config.pak_arch }}.msi > $GITHUB_WORKSPACE/build/Package/installer/Flameshot-${{ env.VERSION }}-${{ matrix.config.pak_arch }}.msi.sha256sum + + - name: SHA256Sum of Windows portable + if: matrix.type == 'portable' + shell: bash + run: | + sha256sum $GITHUB_WORKSPACE/build/Package/portable/flameshot-${{ env.VERSION }}-${{ matrix.config.pak_arch }}.zip + sha256sum $GITHUB_WORKSPACE/build/Package/portable/flameshot-${{ env.VERSION }}-${{ matrix.config.pak_arch }}.zip > $GITHUB_WORKSPACE/build/Package/portable/flameshot-${{ env.VERSION }}-${{ matrix.config.pak_arch }}.zip.sha256sum + + - name: Artifact Upload + if: matrix.type == 'installer' + uses: actions/upload-artifact@v4 + with: + name: ${{ env.PRODUCT }}-${{ env.VER_INFO }}-artifact-win-${{ matrix.config.arch }}-${{ matrix.type }} + path: | + ${{ github.workspace }}/build/Package/installer/Flameshot-${{ env.VERSION }}-${{ matrix.config.pak_arch }}.msi + ${{ github.workspace }}/build/Package/installer/Flameshot-${{ env.VERSION }}-${{ matrix.config.pak_arch }}.msi.sha256sum + overwrite: true + + - name: Artifact Upload + if: matrix.type == 'portable' + uses: actions/upload-artifact@v4 + with: + name: ${{ env.PRODUCT }}-${{ env.VER_INFO }}-artifact-win-${{ matrix.config.arch }}-${{ matrix.type }} + path: | + ${{ github.workspace }}/build/Package/portable/flameshot-${{ env.VERSION }}-${{ matrix.config.pak_arch }}.zip + ${{ github.workspace }}/build/Package/portable/flameshot-${{ env.VERSION }}-${{ matrix.config.pak_arch }}.zip.sha256sum + overwrite: true diff --git a/.github/workflows/build_cmake.yml b/.github/workflows/build_cmake.yml new file mode 100644 index 0000000..6bcaa9e --- /dev/null +++ b/.github/workflows/build_cmake.yml @@ -0,0 +1,132 @@ +name: Building(CMake) + +on: + push: + branches: [ master ] + paths-ignore: + - 'README.md' + - 'LICENSE' + - 'docs/**' + pull_request: + branches: [ master ] + paths-ignore: + - 'README.md' + - 'LICENSE' + - 'docs/**' + - 'data/translations/*.ts' + + workflow_dispatch: + +env: + # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) + BUILD_TYPE: RelWithDebInfo + +jobs: + linux-build: + name: ${{ matrix.os}} + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-24.04] + + steps: + - name: Checkout Source code + if: github.event_name == 'push' + uses: actions/checkout@v4 + + - name: Checkout Source code + if: github.event_name == 'pull_request' + uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.sha }} + + - name: Checkout Source code + if: github.event_name == 'workflow_dispatch' + uses: actions/checkout@v4 + with: + ref: ${{ github.sha }} + + - name: Install Dependencies + run: | + sudo apt-get -y -qq update + sudo apt-get -y --no-install-recommends install \ + cmake \ + extra-cmake-modules \ + build-essential \ + qt6-base-dev \ + qt6-svg-dev \ + qt6-tools-dev \ + + - name: Create Build Environment + # Some projects don't allow in-source building, so create a separate build directory + # We'll use this as our working directory for all subsequent commands + run: cmake -E make_directory ${{runner.workspace}}/build + + - name: Configure CMake + # Use a bash shell so we can use the same syntax for environment variable + # access regardless of the host operating system + shell: bash + working-directory: ${{runner.workspace}}/build + # Note the current convention is to use the -S and -B options here to specify source + # and build directories, but this is only available with CMake 3.13 and higher. + # The CMake binaries on the Github Actions machines are (as of this writing) 3.12 + # + # We need to source the profile file to make sure conan is in PATH + run: | + cmake $GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE + - name: Build + working-directory: ${{runner.workspace}}/build + shell: bash + # Execute the build. You can specify a specific target with "--target " + run: cmake --build . --config $BUILD_TYPE + + - name: Test + working-directory: ${{runner.workspace}}/build + shell: bash + # Execute tests defined by the CMake configuration. + # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail + run: ctest -C $BUILD_TYPE + + windows-build: + runs-on: ${{ matrix.config.os }} + strategy: + fail-fast: false + matrix: + config: + - { + name: "Windows 2022 MSVC", + artifact: "Windows-MSVC.tar.xz", + os: windows-2022, + cc: "cl", cxx: "cl", + environment_script: "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Auxiliary/Build/vcvars64.bat", + qt_ver: '6.9.1' + } + + steps: + - uses: actions/checkout@v4 + + - name: Fix Python path + shell: pwsh + run: | + Remove-Item "$env:LOCALAPPDATA\Microsoft\WindowsApps\python*.exe" -Force -ErrorAction SilentlyContinue + + - name: Install Qt + uses: jurplel/install-qt-action@v4 + with: + version: ${{ matrix.config.qt_ver }} + cache: 'true' + cache-key-prefix: install-qt-action-${{ matrix.config.qt_ver }} + target: desktop + dir: '${{ github.workspace }}/build/' + + - name: Configure + working-directory: build + shell: powershell + run: | + cmake -DCMAKE_BUILD_TYPE=$env:BUILD_TYPE ../ + + - name: Build + working-directory: build + shell: powershell + run: | + cmake --build . --config $env:BUILD_TYPE diff --git a/.github/workflows/clang-format.yml b/.github/workflows/clang-format.yml new file mode 100644 index 0000000..2594be0 --- /dev/null +++ b/.github/workflows/clang-format.yml @@ -0,0 +1,37 @@ +name: test-clang-format + +on: + push: + paths-ignore: + - 'README.md' + - 'LICENSE' + - 'docs/**' + - 'data/translations/*.ts' + pull_request: + paths-ignore: + - 'README.md' + - 'LICENSE' + - 'docs/**' + - 'data/translations/*.ts' + + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout Source code + if: github.event_name == 'push' + uses: actions/checkout@v4 + - name: Checkout Source code + if: github.event_name == 'pull_request' + uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.sha }} + - uses: DoozyX/clang-format-lint-action@v0.13 + with: + source: './src' + extensions: 'h,cpp' + clangFormatVersion: 11 + style: file diff --git a/.github/workflows/deploy-dev-docs.yml b/.github/workflows/deploy-dev-docs.yml new file mode 100644 index 0000000..b472ed4 --- /dev/null +++ b/.github/workflows/deploy-dev-docs.yml @@ -0,0 +1,75 @@ +name: Deploy developer docs + +on: + push: + branches: [ master, docs ] + paths: + - 'src/**' + - 'docs/dev/**' + - '.github/workflows/deploy-dev-docs.yml' + +jobs: + build-and-deploy: + runs-on: ubuntu-22.04 + steps: + - name: Install dependencies + run: | + sudo apt-get --yes --quiet update + sudo apt-get --yes --no-install-recommends install doxygen + pip install \ + mkdocs \ + mkdocs-material \ + git+https://github.com/veracioux/mkdoxy@v1.0.0 + + - name: Checkout flameshot source + uses: actions/checkout@v4 + with: + path: 'flameshot' + + - name: Build docs + working-directory: ${{github.workspace}}/flameshot/docs/dev + run: | + make build + + - name: Checkout flameshot website + uses: actions/checkout@v4 + with: + repository: 'flameshot-org/flameshot-org.github.io' + ref: 'gh-pages' + path: 'website' + + - name: Configure git credentials for website repo + working-directory: ${{github.workspace}}/website + run: | + git config user.name "GitHub Actions" + git config user.email "github-actions-bot@users.noreply.github.com" + git config http.https://github.com/.extraheader 'AUTHORIZATION basic ${{secrets.TOKEN_PUSH_TO_WEBSITE_REPO}}' + git remote add destination "https://x-access-token:${{secrets.TOKEN_PUSH_TO_WEBSITE_REPO}}@github.com/flameshot-org/flameshot-org.github.io" + + - name: Add developer docs to website deployment + working-directory: ${{github.workspace}}/website + run: | + # Create empty dev-docs-staging branch + git checkout --orphan dev-docs-staging + git rm -r --cached . + rm -rf docs/dev + # Copy generated docs over + mkdir -p docs + mv "${{github.workspace}}/flameshot/docs/dev/output" \ + "./docs/dev" + # Commit docs/dev to the dev-docs-staging branch + git add docs/dev + HASH="$(git --git-dir="${{github.workspace}}/flameshot/.git" rev-parse HEAD)" + git commit --message "Add developer docs from flameshot@$HASH" + # Apply changes to gh-pages + git checkout --force gh-pages + git checkout dev-docs-staging -- docs/dev + # Commit (we use `|| true` because the commit could be empty and thus fail) + git commit --message "Add developer docs from flameshot@$HASH" || true + + - name: Push to website repo + working-directory: ${{github.workspace}}/website + run: | + git push --force destination dev-docs-staging + git push destination gh-pages + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5659461 --- /dev/null +++ b/.gitignore @@ -0,0 +1,78 @@ +# common + +.idea +.cache +# C++ objects and libs + +*.slo +*.lo +*.o +*.a +*.la +*.lai +*.so +*.dll +*.dylib + +# Qt-es + +/.qmake.cache +/.qmake.stash +*.pro.user +*.pro.user.* +*.qbs.user +*.qbs.user.* +*.moc +moc_*.cpp +qrc_*.cpp +ui_*.h +Makefile* +*build-* +*.qm + +# QtCreator + +*.autosave + +# QtCtreator Qml +*.qmlproject.user +*.qmlproject.user.* + +# QtCtreator CMake +CMakeLists.txt.user + +# python +venv/* + +# Created by https://www.gitignore.io/api/snapcraft + +### Snapcraft ### +# Snapcraft +parts/ +prime/ +stage/ +*.snap +.snapcraft/ +flameshot*.tar.bz2 + +.vscode/ +build/ +data/flatpak/.flatpak-builder +# NVIM +*~ + +# Jetbrains +.idea/ +.run + +# MacOS +.DS_Store + +# End of https://www.gitignore.io/api/snapcraft + +#MacOS Crap +.DS_Store + +# Miscellaneous +!docs/dev/Makefile +.direnv diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..9931075 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,210 @@ +cmake_minimum_required(VERSION 3.13) +# cmake_policy(SET CMP0076 OLD) + +set(FLAMESHOT_VERSION 13.3.0) + +# Flameshot-org +set(GIT_API_URL "https://api.github.com/repos/flameshot-org/flameshot/releases/latest") + +project( + flameshot + VERSION ${FLAMESHOT_VERSION} + LANGUAGES CXX) +set(PROJECT_NAME_CAPITALIZED "Flameshot") + +include(FetchContent) +#Must be set before fetching external content! +#QT_DEFAULT_MAJOR_VERSION used by QHotkey +set(QT_DEFAULT_MAJOR_VERSION 6 CACHE STRING "") +#QT_VERSION_MAJOR used by Flameshot and QtColorWidgets +set(QT_VERSION_MAJOR 6 CACHE STRING "") +#BUILD_SHARED_LIBS used by QHotkey and QtColorWidgets +option(BUILD_SHARED_LIBS OFF) + +#Needed due to linker error with QtColorWidget +set(CMAKE_POSITION_INDEPENDENT_CODE ON) + + +# Dependency can be fetched via flatpak builder +if(EXISTS "${CMAKE_SOURCE_DIR}/external/Qt-Color-Widgets/CMakeLists.txt") + add_subdirectory("${CMAKE_SOURCE_DIR}/external/Qt-Color-Widgets" EXCLUDE_FROM_ALL) +else() + FetchContent_Declare( + qtColorWidgets + GIT_REPOSITORY https://gitlab.com/mattbas/Qt-Color-Widgets.git + GIT_TAG 352bc8f99bf2174d5724ee70623427aa31ddc26a + ) + #Workaround for duplicate GUID in windows WIX installer + if (WIN32) + FetchContent_GetProperties(qtColorWidgets) + if(NOT qtcolorwidgets_POPULATED) + FetchContent_Populate(qtColorWidgets) + add_subdirectory(${qtcolorwidgets_SOURCE_DIR} ${qtcolorwidgets_BINARY_DIR} EXCLUDE_FROM_ALL) + endif() + else() + FetchContent_MakeAvailable(qtColorWidgets) + endif() +endif() + +# This can be read from ${PROJECT_NAME} after project() is called +if (APPLE) + set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version") +endif() + + +# Configuration options +set(DEFAULT_RUN_IN_PLACE FALSE) +if(WIN32) + set(DEFAULT_RUN_IN_PLACE TRUE) + # For Windows RC file. + add_definitions(-DFLAMESHOT_VERSION_MAJOR=${CMAKE_PROJECT_VERSION_MAJOR}) + add_definitions(-DFLAMESHOT_VERSION_MINOR=${CMAKE_PROJECT_VERSION_MINOR}) + add_definitions(-DFLAMESHOT_VERSION_BUGFIX=${CMAKE_PROJECT_VERSION_PATCH}) + add_definitions(-DFLAMESHOT_VERSION_BUILD=1) + add_definitions(-DFLAMESHOT_VERSION_STRING="${PROJECT_VERSION}") +elseif(APPLE) + set(Qt6_DIR "$(brew --prefix qt6)/lib/cmake/Qt6/" CACHE PATH "directory where Qt6Config.cmake exists.") +endif() +set(RUN_IN_PLACE + ${DEFAULT_RUN_IN_PLACE} + CACHE BOOL "Run directly in source directory structure") + + +option(FLAMESHOT_DEBUG_CAPTURE "Enable mode to make debugging easier" OFF) +option(USE_MONOCHROME_ICON "Build using monochrome icon as default" OFF) +option(GENERATE_TS "Regenerate translation source files" OFF) +option(USE_KDSINGLEAPPLICATION "Use KDSingleApplication library" ON) +option(USE_BUNDLED_KDSINGLEAPPLICATION "Use a bundled version of the KDSingleApplication library" ${USE_KDSINGLEAPPLICATION}) +option(USE_LAUNCHER_ABSOLUTE_PATH "Use absolute path for the desktop launcher" ON) +option(USE_WAYLAND_CLIPBOARD "USE KF Gui Wayland Clipboard" OFF) +option(DISABLE_UPDATE_CHECKER "Disable check for updates" OFF) +option(ENABLE_IMGUR "Enable Imgur Uploader" OFF) + +if (ENABLE_IMGUR) + add_compile_definitions(ENABLE_IMGUR) +endif() + +if (DISABLE_UPDATE_CHECKER) + add_compile_definitions(DISABLE_UPDATE_CHECKER) +endif () + +include(cmake/StandardProjectSettings.cmake) + +add_library(project_options INTERFACE) +target_compile_features(project_options INTERFACE cxx_std_20) + +add_library(project_warnings INTERFACE) + +# enable cache system +include(cmake/Cache.cmake) + +# standard compiler warnings +include(cmake/CompilerWarnings.cmake) +# set_project_warnings(project_warnings) + +# sanitizer options if supported by compiler +include(cmake/Sanitizers.cmake) +enable_sanitizers(project_options) + +# allow for static analysis options include(cmake/StaticAnalyzers.cmake) + +if (USE_KDSINGLEAPPLICATION) + if (USE_BUNDLED_KDSINGLEAPPLICATION) + set(KDSingleApplication_EXAMPLES OFF CACHE BOOL "Don't build the examples") + set(KDSingleApplication_STATIC ON CACHE BOOL "Build static versions of the libraries") + + # Check if KDSingleApplication is available locally + if(EXISTS "${CMAKE_SOURCE_DIR}/external/KDSingleApplication/CMakeLists.txt") + add_subdirectory("${CMAKE_SOURCE_DIR}/external/KDSingleApplication") + else() + FetchContent_Declare( + kdsingleApplication + GIT_REPOSITORY https://github.com/KDAB/KDSingleApplication.git + GIT_TAG v1.2.0 + ) + FetchContent_MakeAvailable(kdsingleApplication) + endif() + else() + find_package(KDSingleApplication-qt6 REQUIRED) + endif() +endif() + +# ToDo: Check if this is used anywhere +option(BUILD_STATIC_LIBS ON) + +if (APPLE) + FetchContent_Declare( + qHotKey + GIT_REPOSITORY https://github.com/flameshot-org/QHotkey + GIT_TAG master + ) + FetchContent_MakeAvailable(QHotKey) +endif() + +add_subdirectory(src) + +# CPack +set(CPACK_PACKAGE_VENDOR "flameshot-org") +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Powerful yet simple to use screenshot software.") +set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION}) +set(CPACK_PACKAGE_HOMEPAGE_URL "https://flameshot.org") +set(CPACK_PACKAGE_CONTACT "flameshot-org developers ") +set(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/data/img/app/org.flameshot.Flameshot.svg") # TODO: Can any generator make +# use of this? +set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README.md") # TODO: Where is this used? Do we need a better +# source? + +if(WIN32) + # Include all dynamically linked runtime libraries such as MSVCRxxx.dll + include(InstallRequiredSystemLibraries) + + if(RUN_IN_PLACE) + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}-win64") + else() + set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}-win32") + endif() + + set(CPACK_GENERATOR ZIP) + + else() + set(CPACK_GENERATOR WIX ZIP) + set(CPACK_PACKAGE_NAME "${PROJECT_NAME_CAPITALIZED}") + set(CPACK_PACKAGE_INSTALL_DIRECTORY "${PROJECT_NAME_CAPITALIZED}") + set(CPACK_PACKAGE_EXECUTABLES ${PROJECT_NAME} "${PROJECT_NAME_CAPITALIZED}") + set(CPACK_CREATE_DESKTOP_LINKS ${PROJECT_NAME}) + + # WIX (Windows .msi installer) + # 48x48 pixels + set(CPACK_WIX_PRODUCT_ICON "${CMAKE_SOURCE_DIR}/data/img/app/flameshot.ico") + # Supported languages can be found at http://wixtoolset.org/documentation/manual/v3/wixui/wixui_localization.html + # set(CPACK_WIX_CULTURES "ar-SA,bg-BG,ca-ES,hr-HR,cs-CZ,da-DK,nl-NL,en-US,et-EE,fi-FI,fr-FR,de-DE") + set(CPACK_WIX_UI_BANNER "${CMAKE_SOURCE_DIR}/packaging/win-installer/Bitmaps/CPACK_WIX_UI_BANNER.BMP") + set(CPACK_WIX_UI_DIALOG "${CMAKE_SOURCE_DIR}/packaging/win-installer/Bitmaps/CPACK_WIX_UI_DIALOG.BMP") + set(CPACK_WIX_PROPERTY_ARPHELPLINK "${CPACK_PACKAGE_HOMEPAGE_URL}") + set(CPACK_WIX_PROPERTY_ARPURLINFOABOUT "${CPACK_PACKAGE_HOMEPAGE_URL}") + set(CPACK_WIX_ROOT_FEATURE_DESCRIPTION "${CPACK_PACKAGE_DESCRIPTION_SUMMARY}") + set(CPACK_WIX_LIGHT_EXTRA_FLAGS "-dcl:high") # set high compression + + set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/packaging/win-installer/LICENSE/GPL-3.0.txt") + set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/README.md") + + # The correct way would be to include both x32 and x64 into one installer and install the appropriate one. CMake + # does not support that, so there are two separate GUID's + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(CPACK_WIX_UPGRADE_GUID "26D8062A-66D9-48D9-8924-42090FB9B3F9") + else() + set(CPACK_WIX_UPGRADE_GUID "2C53E1B9-51D9-4429-AAE4-B02221959AA5") + endif() + endif() +elseif(APPLE) + set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY 0) + set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}-osx") + set(CPACK_GENERATOR ZIP) +else() + set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}-linux") + set(CPACK_GENERATOR TGZ) + set(CPACK_SOURCE_GENERATOR TGZ) +endif() + +include(CPack) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..fd78b51 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at borgman.jeremy@pm.me. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/PKGBUILD b/PKGBUILD new file mode 100644 index 0000000..034b4df --- /dev/null +++ b/PKGBUILD @@ -0,0 +1,47 @@ +pkgname=flameshot-git +_pkgname=flameshot +pkgver=r2022.277eb2f4 +pkgrel=1 +pkgdesc="Powerful yet simple to use screenshot software" +arch=('i686' 'x86_64' 'aarch64' 'armv7h') +url="https://github.com/flameshot-org/flameshot" +license=('GPL-3.0-or-later') +depends=('qt6-base' 'qt6-svg' 'hicolor-icon-theme' 'kguiaddons') +makedepends=('qt6-tools' 'cmake' 'ninja') +optdepends=( + 'gnome-shell-extension-appindicator: for system tray icon if you are using Gnome' + 'grim: for wlroots wayland support' + 'xdg-desktop-portal: for wayland support, you will need the implementation for your wayland desktop environment' + 'qt6-imageformats: for additional export image formats (e.g. tiff, webp, and more)' +) +provides=(flameshot) +conflicts=(flameshot) +source=() + +prepare() { + cp -R "${startdir}/" "${srcdir}/${_pkgname}/" +} + +pkgver() { + cd "${srcdir}/${_pkgname}" + + printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)" +} + +build() { + cd "${srcdir}/${_pkgname}" + + cmake -GNinja -B build -S . \ + -DCMAKE_BUILD_TYPE=None \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DUSE_WAYLAND_CLIPBOARD=1 \ + -DDISABLE_UPDATE_CHECKER=1 \ + + cmake --build build +} + +package() { + cd "${srcdir}/${_pkgname}" + + DESTDIR="${pkgdir}" cmake --install build +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..2171a82 --- /dev/null +++ b/README.md @@ -0,0 +1,584 @@ +
+

+

+ + Flameshot + +
+ Flameshot +

+

Powerful yet simple to use screenshot software.

+

+

+ + GNU/Linux Build Status + + + Windows Build Status + + + MacOS Build Status + + + Nightly Build + + + Latest Stable Release + + + Total Downloads + + + License + + + Translation status + + + Docs + +
+ + Get it from the Snap Store + + + Download on Flathub + +

+
+ + + +## Preview + +![image](https://raw.githubusercontent.com/flameshot-org/flameshot/master/data/img/preview/animatedUsage.gif) + +## Index + +- [Features](#features) +- [Usage](#usage) + - [CLI configuration](#cli-configuration) + - [Config file](#config-file) +- [Keyboard Shortcuts](#keyboard-shortcuts) + - [Local](#local) + - [Global](#global) + - [On KDE Plasma desktop](#on-kde-plasma-desktop) + - [On Ubuntu](#on-ubuntu-tested-on-2204) + - [On XFCE 4](#on-xfce-4) + - [On Fluxbox](#on-fluxbox) +- [Considerations](#considerations) +- [Installation](#installation) + - [Prebuilt Packages](#prebuilt-packages) + - [Packages from Repository](#packages-from-repository) + - [MacOS](#macos) + - [Windows](#windows) +- [Compilation](#compilation) + - [Dependencies](#dependencies) + - [Compile-time](#compile-time) + - [Run-time](#run-time) + - [Optional](#optional) + - [Debian](#debian) + - [Fedora](#fedora) + - [Arch](#arch) + - [Build](#build) + - [Install](#install) +- [License](#license) +- [Privacy Policy](#privacy-policy) +- [Code Signing Policy](#code-signing-policy) +- [Contribute](#contribute) +- [Acknowledgment](#acknowledgment) + +## Features + +- Customizable appearance. +- Easy to use. +- In-app screenshot editing. +- DBus interface. +- Upload to Imgur. + +## Usage + +Executing the command `flameshot` without parameters will launch a running +instance of the program in the background without taking actions. +If your desktop environment provides tray area, a tray icon will also +appear in the tray for users to perform configuration and management. + +Example commands: + +- Capture with GUI: + + ```shell + flameshot gui + ``` + +- Capture with GUI with custom save path: + + ```shell + flameshot gui -p ~/myStuff/captures + ``` + +- Capture with GUI after 2 seconds delay (can be useful to take screenshots of mouse hover tooltips, etc.): + + ```shell + flameshot gui -d 2000 + ``` + +- Fullscreen capture with custom save path (no GUI) and delayed: + + ```shell + flameshot full -p ~/myStuff/captures -d 5000 + ``` + +- Fullscreen capture with custom save path copying to clipboard: + + ```shell + flameshot full -c -p ~/myStuff/captures + ``` + +- Capture the screen containing the mouse and print the image (bytes) in PNG format: + + ```shell + flameshot screen -r + ``` + +- Capture the screen number 1 and copy it to the clipboard: + + ```shell + flameshot screen -n 1 -c + ``` + +In case of doubt choose the first or the second command as shortcut in your favorite desktop environment. + +A systray icon will be in your system's panel while Flameshot is running. +Do a right click on the tray icon and you'll see some menu items to open the configuration window and the information window. +Check out the About window to see all available shortcuts in the graphical capture mode. + +### Usage on Windows + +On Windows, `flameshot.exe` will behave as expected for all supported command-line arguments, +but it will not output any text to the console. This is problematic if, for example, you are +running `flameshot.exe -h`. + +If you require console output, run `flameshot-cli.exe` instead. `flameshot-cli.exe` is a minimal wrapper around `flameshot.exe` that ensures all stdout is captured and output to the console. + +### CLI configuration + +You can use the graphical menu to configure Flameshot, but alternatively you can use your terminal or scripts to do so. + +- Open the configuration menu: + + ```shell + flameshot config + ``` + +- Show the initial help message in the capture mode: + + ```shell + flameshot config --showhelp true + ``` + +- For more information about the available options use the help flag: + + ```shell + flameshot config -h + ``` + +### Config file + +You can also edit some of the settings (like overriding the default colors) in the configuration file.\ +Linux path: `~/.config/flameshot/flameshot.ini`.\ +Windows path: `C:\Users\{YOURNAME}\AppData\Roaming\flameshot\flameshot.ini`. + +When copying over the config file from Linux to Windows or vice versa, +make sure to correct the `savePath` variable,\ +so that the screenshots save in the right directory on your desired file system. + +## Keyboard shortcuts + +### Local + +These shortcuts are available in GUI mode: + +| Keys | Description | +|--- |--- | +| P | Set the Pencil as paint tool | +| D | Set the Line as paint tool | +| A | Set the Arrow as paint tool | +| S | Set Selection as paint tool | +| R | Set the Rectangle as paint tool | +| C | Set the Circle as paint tool | +| M | Set the Marker as paint tool | +| T | Add text to your capture | +| B | Set Pixelate as the paint tool | +| ←, ↓, ↑, → | Move selection 1px | +| Shift + ←, ↓, ↑, → | Resize selection 1px | +| Ctrl + Shift + ←, ↓, ↑, → | Symmetrically resize selection 2px | +| Esc | Quit capture | +| Ctrl + M | Move the selection area | +| Ctrl + C | Copy to clipboard | +| Ctrl + S | Save selection as a file | +| Ctrl + Z | Undo the last modification | +| Ctrl + Shift + Z | Redo the next modification | +| Ctrl + Q | Leave the capture screen | +| Ctrl + O | Choose an app to open the capture | +| Ctrl + Return | Commit text in text area| +| Ctrl + Backspace | Cancel current selection | +| Return | Upload the selection to Imgur | +| Spacebar | Toggle visibility of sidebar with options of the selected tool, color picker for the drawing color and history menu | +| G | Starts the color picker | +| Right Click | Show the color wheel | +| Mouse Wheel | Change the tool's thickness | +| Print screen | Capture Screen | +| Shift + Print | Screenshot History | +| Ctrl + drawing *line*, *arrow* or *marker* | Drawing only horizontally, vertically or diagonally | +| Ctrl + drawing *rectangle* or *circle* | Keeping aspect ratio | + +Shift + drag a handler of the selection area: mirror redimension in the opposite handler. + +### Global + +Flameshot uses Print screen (Windows) and cmd-shift-x (macOS) as default global hotkeys. + +On Linux, Flameshot doesn't yet support Prt Sc out of the box, but with a bit of configuration you can set this up: + +#### On KDE Plasma desktop + +To make configuration easier, there's a [file](docs/shortcuts-config/flameshot-shortcuts-kde.khotkeys) in the repository that more or less automates this process. This file will assign the following hotkeys by default: + +| Keys | Description | +|--- |--- | +| Prt Sc | Start the Flameshot screenshot tool and take a screenshot | +| Ctrl + Prt Sc | Wait for 3 seconds, then start the Flameshot screenshot tool and take a screenshot | +| Shift + Prt Sc | Take a full-screen (all monitors) screenshot and save it | +| Ctrl + Shift + Prt Sc | Take a full-screen (all monitors) screenshot and copy it to the clipboard | + +If you don't like the defaults, they can be changed later. + +Steps for using the configuration: + +1. The configuration file makes Flameshot automatically save screenshots to `~/Pictures/Screenshots` without opening the save dialog. Make sure that folder exists by running: + + ```shell + mkdir -p ~/Pictures/Screenshots + ``` + + (If you don't like the default location, you can skip this step and configure your preferred directory later.) +2. Download the configuration file: + + ```shell + cd ~/Desktop + wget https://raw.githubusercontent.com/flameshot-org/flameshot/master/docs/shortcuts-config/flameshot-shortcuts-kde.khotkeys + ``` +3. Make sure you have the `khotkeys` installed using your package manager to enable custom shortcuts in KDE Plasma. +4. Go to _System Settings_ → _Shortcuts_ → _Custom Shortcuts_. +5. If an entry exists for Spectacle (the default KDE screenshot utility), you'll need to disable it because its shortcuts might conflict with Flameshot's. Do this by unchecking the _Spectacle_ entry. +6. Click _Edit_ → _Import..._, navigate to the configuration file and open it. +7. Now the Flameshot entry should appear in the list. Click _Apply_ to apply the changes. +8. If you want to change the default hotkeys, you can expand the entry, select the appropriate action and modify it as you wish; the process is pretty self-explanatory. +9. If you installed Flameshot as a Flatpak, you will need to create a symlink to the command: + + ```shell + ln -s /var/lib/flatpak/exports/bin/org.flameshot.Flameshot ~/.local/bin/flameshot + ``` + +#### On Ubuntu (Tested 22.04) + +To use Flameshot instead of the default screenshot application in Ubuntu we need to remove the binding on Prt Sc key, and then create a new binding for `/usr/bin/flameshot gui` ([adapted](https://askubuntu.com/posts/1039949/revisions) from [Pavel's answer on AskUbuntu](https://askubuntu.com/revisions/1036473/1)). + +1. Remove the binding on Prt Sc: + + Ubuntu 22.04: Go to _Settings_ > _Keyboard_ > _View and Customise Shortcuts_ > _Screenshots_ > _Take a screenshot interactively_ and press `backspace` + +2. Add custom binding on Prt Sc: + + Ubuntu 22.04: Go to _Settings_ > _Keyboard_ > _View and Customise Shortcuts_ > _Custom shortcuts_ and press the '+' button at the bottom. + +3. Name the command as you like it, e.g. `flameshot`. And in the command insert `/usr/bin/flameshot gui`. + +4. Then click "_Set Shortcut.._" and press Prt Sc. This will show as "_print_". + +Now every time you press Prt Sc, it will start the Flameshot GUI instead of the default application. + +#### On XFCE 4 + +1. Go to `Keyboard` settings +2. Switch to the tab `Application Shortcuts` +3. Find the entry + + ```text + Command Shortcut + xfce4-screenshooter -fd 1 Print + ``` +4. Replace `xfce4-screenshooter -fd 1` with `flameshot gui` + +Now every time you press Prt Sc it will start Flameshot GUI instead of the default application. + +#### On Fluxbox + +1. Edit your `~/.fluxbox/keys` file +2. Add a new entry. `Print` is the key name, `flameshot gui` is the shell command; for more options see [the fluxbox wiki](https://sillyslux.github.io/fluxbox-wiki/en/wiki/Keyboard-Shortcuts/). + + ```text + Print :Exec flameshot gui + ``` +3. Refresh Fluxbox configuration with **Reconfigure** option from the menu. + +## Considerations + +- Experimental Gnome Wayland and Plasma Wayland support. + +- If you are using Gnome you need to install the [AppIndicator and KStatusNotifierItem Support](https://extensions.gnome.org/extension/615/appindicator-support/) extension in order to see the system tray icon. + +- Press Enter or Ctrl + C when you are in a capture mode and you don't have an active selection and the whole desktop will be copied to your clipboard. Pressing Ctrl + S will save your capture to a file. Check the [Shortcuts](#keyboard-shortcuts) for more information. + +- Flameshot works best with a desktop environment that includes D-Bus. See this [article](https://wiki.archlinux.org/index.php/Flameshot#Troubleshooting) for tips on using Flameshot in a minimal window manager (dwm, i3, xmonad, etc). + +- In order to speed up the first launch of Flameshot (D-Bus init of the app can be slow), consider starting the application automatically on boot. + - Quick tip: If you don't have Flameshot to autostart at boot and you want to set keyboard shortcut, use the following as the command for the keybinding: + ```sh + ( flameshot &; ) && ( sleep 0.5s && flameshot gui ) + ``` + +## Installation + +Flameshot can be installed on Linux, Microsoft Windows, and macOS. + +### Prebuilt packages + +Some prebuilt packages are provided on [the release page of the GitHub project repository](https://github.com/flameshot-org/flameshot/releases). + +### Packages from Repository + +There are packages available in the repository of some Linux distributions: + +- [Arch](https://archlinux.org/packages/extra/x86_64/flameshot/): `pacman -S flameshot` + + Snapshot also available via AUR: [flameshot-git](https://aur.archlinux.org/packages/flameshot-git). +- [Debian 10+](https://tracker.debian.org/pkg/flameshot): `apt install flameshot` + + Package for Debian 9 ("Stretch") also [available via stretch-backports](https://backports.debian.org/). +- [Ubuntu](https://launchpad.net/ubuntu/+source/flameshot): `apt install flameshot` +- [openSUSE](https://software.opensuse.org/package/flameshot): `zypper install flameshot` +- [Void Linux](https://github.com/void-linux/void-packages/tree/master/srcpkgs/flameshot): `xbps-install flameshot` +- [Solus](https://dev.getsol.us/source/flameshot/): `eopkg it flameshot` +- [Fedora](https://src.fedoraproject.org/rpms/flameshot): `dnf install flameshot` +- [NixOS](https://search.nixos.org/packages?query=flameshot): `nix-env -iA nixos.flameshot` +- [ALT](https://packages.altlinux.org/en/sisyphus/srpms/flameshot/): `su - -c "apt-get install flameshot"` +- [Snap/Flatpak/AppImage](https://github.com/flameshotapp/packages) +- [Docker](https://github.com/ManuelLR/docker-flameshot) +- [Windows](https://github.com/majkinetor/au-packages/tree/master/flameshot) + +### macOS + +- [MacPorts](https://www.macports.org): `sudo port selfupdate && sudo port install flameshot` +- [Homebrew](https://brew.sh): `brew install --cask flameshot` + +**Note** that because of macOS security features, you may not be able to open flameshot when installed using brew. +If you see the message `“flameshot” cannot be opened because the developer cannot be verified.` you will need to +follow the steps below: +1. Go to the Applications folder (Finder > Go > Applications, or Shift+Command+A) +1. Right-Click on "flameshot.app" and choose "Open" from the context menu +2. In the dialog click "Open" + +On MacOs 15 and above, you will have to go to system settings -> privacy and security after doing this and click "Open Anyway" or you can open flameshot first time with the following command. + +```sudo xattr -rd com.apple.quarantine /Applications/flameshot.app``` + +After following all those steps above, `flameshot` will open without problems in your Mac. + +### Windows + +- [Chocolatey](https://chocolatey.org/packages/flameshot) + +
+ Expand this section to see what distros are using an up to date version of flameshot + + Packaging status + +
+ +### Tray icon + +**Note** that for the Flameshot icon to appear in your tray area, you should have a systray software installed. This is especially true for users who use minimal [window managers](https://wiki.archlinux.org/index.php/window_manager) such as [dwm](https://dwm.suckless.org/). In some [Desktop Environment](https://wiki.archlinux.org/index.php/Desktop_environment) installations (e.g Gnome), the systray might be missing and you can install an application or plugin (e.g [Gnome shell extension](https://extensions.gnome.org/extension/1503/tray-icons/)) to add the systray to your setup. It has been [reported](https://github.com/flameshot-org/flameshot/issues/1009#issuecomment-700781081)) that icon of some software, including Flameshot, does not show in [gnome-shell-extension-appindicator](https://github.com/ubuntu/gnome-shell-extension-appindicator). + + +Alternatively, in case you don't want to have a systray, you can always call Flameshot from the terminal. See [Usage section](#usage). + +## Compilation + +To build the application in your system, you'll need to install the dependencies needed for it and package names might be different for each distribution, see [Dependencies](#dependencies) below for more information. You can also install most of the Qt dependencies via [their installer](https://www.qt.io/download-qt-installer). If you were developing Qt apps before, you probably already have them. + +This project uses [CMake](https://cmake.org/) build system, so you need to install it in order to build the project (on most Linux distributions it is available in the standard repositories as a package called `cmake`). If your distribution provides too old version of CMake (e.g. Ubuntu or Debian) you can [download it on the official website](https://cmake.org/download/). + +Also you can open and build/debug the project in a C++ IDE. For example, in Qt Creator you should be able to simply open `CMakeLists.txt` via `Open File or Project` in the menu after installing CMake into your system. [More information about CMake projects in Qt Creator](https://doc.qt.io/qtcreator/creator-project-cmake.html). + +### Dependencies + +#### Compile-time + +- Qt >= 6.0 + + Development tools +- GCC >= 7.4 +- CMake >= 3.29 + +#### Run-time + +- Qt + + SVG + +#### Optional + +- Git +- OpenSSL +- CA Certificates +- Qt Image Formats - for additional export image formats (e.g. tiff, webp, and more) + +#### Debian + +```shell +# Compile-time +apt install g++ cmake build-essential qt6-base-dev qt6-tools-dev-tools qt6-svg-dev qt6-tools-dev + +# Run-time +apt install libkf6guiaddons-dev libqt6dbus6 libqt6network6 libqt6core6 libqt6widgets6 libqt6gui6 libqt6svg6 qt6-qpa-plugins + +# Optional +apt install git openssl ca-certificates qt6-image-formats-plugins +``` + +#### Fedora + +```shell +# Compile-time +dnf install gcc-c++ cmake qt6-qtbase-devel qt6-qtsvg-devel qt6-qttools qt6-linguist qt6-qttools-devel kf6-kguiaddons-devel + +# Run-time +dnf install qt6-qtbase qt6-qtsvg kf6-kguiaddons + +# Optional +dnf install git openssl ca-certificates qt6-qtimageformats +``` + +#### Arch + +```shell +# Compile-time +pacman -S cmake base-devel git qt6-base qt6-tools kguiaddons + +# Run-time +pacman -S qt6-svg + +# Optional +pacman -S openssl ca-certificates qt6-imageformats +``` + +#### NixOS + +```shell +nix-shell +``` + +#### macOS + +First of all you need to install [brew](https://brew.sh) and then install the dependencies +```shell +brew install qt6 +brew install cmake +``` + +### Build + +After installing all the dependencies, Flameshot can be built. + +#### Installation/build dir +For the translations to be loaded correctly, the build process needs to be aware of where you want +to install Flameshot. + +```shell +# Directory where build files will be placed, may be relative +export BUILD_DIR=build + +# Directory prefix where Flameshot will be installed. If you are just building and don't want to +# install, comment this environment variable. +# This excludes the bin/flameshot part of the install, +# e.g. in /opt/flameshot/bin/flameshot, the CMAKE_INSTALL_PREFIX is /opt/flameshot +# This must be an absolute path. Requires CMAKE 3.29. +export CMAKE_INSTALL_PREFIX=/opt/flameshot + +# Linux +cmake -S . -B "$BUILD_DIR" \ + && cmake --build "$BUILD_DIR" + +#MacOS +cmake -S . -B "$BUILD_DIR" \ + -DQt6_DIR="$(brew --prefix qt6)/lib/cmake/Qt6" \ + && cmake --build "$BUILD_DIR" +``` + +When the `cmake --build` command has completed you can launch Flameshot from the `project_folder/build/src` folder. + +### Install + +Note that if you install from source, there _is no_ uninstaller, so consider installing to a custom directory. + +#### To install into a custom directory +Make sure you are using cmake `>= 3.29` and build Flameshot with `$CMAKE_INSTALL_PREFIX` set to the +installation directory. If this is not done, the translations won't be found when using a custom directory. +Then, run the following: + +```bash +# !Build with CMAKE_INSTALL_PREFIX and use cmake >= 3.29! Using an older cmake will cause +# installation into the default /usr/local dir. + +# You may need to run this with privileges +cmake --install "$BUILD_DIR" +``` + +#### To install to the default install directory +```bash +# You may need to run this with privileges +cmake --install "$BUILD_DIR" +``` + +### FAQ + + + +## License + +- The main code is licensed under [GPLv3](LICENSE) +- The logo of Flameshot is licensed under [Free Art License v1.3](data/img/app/flameshotLogoLicense.txt) +- The button icons are licensed under Apache License 2.0. See: https://github.com/google/material-design-icons +- The code at capture/capturewidget.cpp is based on https://github.com/ckaiser/Lightscreen/blob/master/dialogs/areadialog.cpp (GPLv2) +- The code at capture/capturewidget.h is based on https://github.com/ckaiser/Lightscreen/blob/master/dialogs/areadialog.h (GPLv2) +- I copied a few lines of code from KSnapshot regiongrabber.cpp revision `796531` (LGPL) +- Qt-Color-Widgets taken and modified from https://github.com/mbasaglia/Qt-Color-Widgets (see their license and exceptions in the project) (LGPL/GPL) + +Info: If I take code from your project and that implies a relicense to GPLv3, you can reuse my changes with the original previous license of your project applied. + +## Privacy Policy + +This program will not transfer any information to other networked systems unless specifically requested by the user or the person installing or operating it. + +## Code Signing Policy + +For Windows binaries, this program uses free code signing provided by [SignPath.io](https://signpath.io?utm_source=foundation&utm_medium=github&utm_campaign=flameshot), and a certificate by the [SignPath Foundation](https://signpath.org?utm_source=foundation&utm_medium=github&utm_campaign=flameshot). + +Code signing is currently a manual process so not every patch release will be signed. + +## Contribute + +If you want to contribute check the [CONTRIBUTING.md](docs/CONTRIBUTING.md) + +## Acknowledgment + +Thanks to those who have shown interest in the early development process: +- [lupoDharkael](https://github.com/lupoDharkael) +- [Cosmo](https://github.com/philpem) +- [XerTheSquirrel](https://github.com/XerTheSquirrel) +- [The members of Sugus GNU/Linux](https://github.com/SUGUS-GNULinux) +- ismatori + +Thanks to sponsors: +- [Namecheap](https://www.namecheap.com/) +- [JetBrains](https://www.jetbrains.com/) +- [SignPath](https://signpath.io/) +- [addy.io](https://addy.io/) diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000..83661e9 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,47 @@ +image: + - Visual Studio 2022 +clone_folder: c:\projects\source + +environment: + Qt6_INSTALL_DIR: 'C:\Qt\6.9\msvc2022_64' + PATH: '%Qt6_INSTALL_DIR%\bin;%PATH%' + +build_script: +- cmd: >- + + set QTDIR=%Qt6_INSTALL_DIR% + + set "VCINSTALLDIR=C:\Program Files (x86)\Microsoft Visual Studio\2022\Community\VC" + + set "OPENSSL_ROOT_DIR=C:/OpenSSL-v111-Win64" + + cmake -S c:\projects\source -B build -G "Visual Studio 17 2022" -DCMAKE_BUILD_TYPE:STRING=Release -DENABLE_OPENSSL=ON -DRUN_IN_PLACE=OFF + + cmake --build build --parallel 2 --config "Release" + + cd build + + cpack -G WIX -B package + + mkdir artifact + + cp package/*.msi artifact/. + + cp src/Release/*.exe artifact/. + + 7z a -tzip artifact.zip artifact/ + +artifacts: +- path: build\package\*.msi + name: installer +- path: build\src\Release\*.exe + name: executable +- path: build\artifact.zip + name: archive + +deploy: +- provider: Webhook + url: https://app.signpath.io/API/v1/042f605f-b378-45d8-ad16-b7695b071036/Integrations/AppVeyor?ProjectSlug=flameshot&SigningPolicySlug=test-signing + #url: https://app.signpath.io/API/v1/042f605f-b378-45d8-ad16-b7695b071036/Integrations/AppVeyor?ProjectSlug=flameshot&SigningPolicySlug=release-signing + authorization: + secure: G5nNnkfRSJ+EEx+7LlUSSoEyoL+pHYItvjrNxbWITE7RB+cm9qzuHRdwmrZdEDjdVCLZ2TkNawynMxYcGMZAQA== diff --git a/cmake/Cache.cmake b/cmake/Cache.cmake new file mode 100644 index 0000000..31f5e7e --- /dev/null +++ b/cmake/Cache.cmake @@ -0,0 +1,29 @@ +option(ENABLE_CACHE "Enable cache if available" ON) +if(NOT ENABLE_CACHE) + return() +endif() + +set(CACHE_OPTION + "ccache" + CACHE STRING "Compiler cache to be used") +set(CACHE_OPTION_VALUES "ccache" "sccache") +set_property(CACHE CACHE_OPTION PROPERTY STRINGS ${CACHE_OPTION_VALUES}) +list( + FIND + CACHE_OPTION_VALUES + ${CACHE_OPTION} + CACHE_OPTION_INDEX) + +if(${CACHE_OPTION_INDEX} EQUAL -1) + message( + STATUS + "Using custom compiler cache system: '${CACHE_OPTION}', explicitly supported entries are ${CACHE_OPTION_VALUES}") +endif() + +find_program(CACHE_BINARY ${CACHE_OPTION}) +if(CACHE_BINARY) + message(STATUS "${CACHE_OPTION} found and enabled") + set(CMAKE_CXX_COMPILER_LAUNCHER ${CACHE_BINARY}) +else() + message(WARNING "${CACHE_OPTION} is enabled but was not found. Not using it") +endif() diff --git a/cmake/CompilerWarnings.cmake b/cmake/CompilerWarnings.cmake new file mode 100644 index 0000000..8243154 --- /dev/null +++ b/cmake/CompilerWarnings.cmake @@ -0,0 +1,78 @@ +# from here: +# +# https://github.com/lefticus/cppbestpractices/blob/master/02-Use_the_Tools_Available.md + +function(set_project_warnings project_name) + option(WARNINGS_AS_ERRORS "Treat compiler warnings as errors" TRUE) + + set(MSVC_WARNINGS + /W4 # Baseline reasonable warnings + /w14242 # 'identifier': conversion from 'type1' to 'type1', possible loss of data + /w14254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data + /w14263 # 'function': member function does not override any base class virtual member function + /w14265 # 'classname': class has virtual functions, but destructor is not virtual instances of this class may not + # be destructed correctly + /w14287 # 'operator': unsigned/negative constant mismatch + /we4289 # nonstandard extension used: 'variable': loop control variable declared in the for-loop is used outside + # the for-loop scope + /w14296 # 'operator': expression is always 'boolean_value' + /w14311 # 'variable': pointer truncation from 'type1' to 'type2' + /w14545 # expression before comma evaluates to a function which is missing an argument list + /w14546 # function call before comma missing argument list + /w14547 # 'operator': operator before comma has no effect; expected operator with side-effect + /w14549 # 'operator': operator before comma has no effect; did you intend 'operator'? + /w14555 # expression has no effect; expected expression with side- effect + /w14619 # pragma warning: there is no warning number 'number' + /w14640 # Enable warning on thread un-safe static member initialization + /w14826 # Conversion from 'type1' to 'type_2' is sign-extended. This may cause unexpected runtime behavior. + /w14905 # wide string literal cast to 'LPSTR' + /w14906 # string literal cast to 'LPWSTR' + /w14928 # illegal copy-initialization; more than one user-defined conversion has been implicitly applied + /permissive- # standards conformance mode for MSVC compiler. + ) + + set(CLANG_WARNINGS + -Wall + -Wextra # reasonable and standard + -Wshadow # warn the user if a variable declaration shadows one from a parent context + -Wnon-virtual-dtor # warn the user if a class with virtual functions has a non-virtual destructor. This helps + # catch hard to track down memory errors + -Wold-style-cast # warn for c-style casts + -Wcast-align # warn for potential performance problem casts + -Wunused # warn on anything being unused + -Woverloaded-virtual # warn if you overload (not override) a virtual function + -Wpedantic # warn if non-standard C++ is used + -Wconversion # warn on type conversions that may lose data + -Wsign-conversion # warn on sign conversions + -Wnull-dereference # warn if a null dereference is detected + -Wdouble-promotion # warn if float is implicit promoted to double + -Wformat=2 # warn on security issues around functions that format output (ie printf) + ) + + if(WARNINGS_AS_ERRORS) + set(CLANG_WARNINGS ${CLANG_WARNINGS} -Werror) + set(MSVC_WARNINGS ${MSVC_WARNINGS} /WX) + endif() + + set(GCC_WARNINGS + ${CLANG_WARNINGS} + -Wmisleading-indentation # warn if indentation implies blocks where blocks do not exist + -Wduplicated-cond # warn if if / else chain has duplicated conditions + -Wduplicated-branches # warn if if / else branches have duplicated code + -Wlogical-op # warn about logical operations being used where bitwise were probably wanted + -Wuseless-cast # warn if you perform a cast to the same type + ) + + if(MSVC) + set(PROJECT_WARNINGS ${MSVC_WARNINGS}) + elseif(CMAKE_CXX_COMPILER_ID MATCHES ".*Clang") + set(PROJECT_WARNINGS ${CLANG_WARNINGS}) + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set(PROJECT_WARNINGS ${GCC_WARNINGS}) + else() + message(AUTHOR_WARNING "No compiler warnings set for '${CMAKE_CXX_COMPILER_ID}' compiler.") + endif() + + target_compile_options(${project_name} INTERFACE ${PROJECT_WARNINGS}) + +endfunction() diff --git a/cmake/Sanitizers.cmake b/cmake/Sanitizers.cmake new file mode 100644 index 0000000..4342f7d --- /dev/null +++ b/cmake/Sanitizers.cmake @@ -0,0 +1,66 @@ +function(enable_sanitizers project_name) + + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES ".*Clang") + option(ENABLE_COVERAGE "Enable coverage reporting for gcc/clang" FALSE) + + if(ENABLE_COVERAGE) + target_compile_options(${project_name} INTERFACE --coverage -O0 -g) + target_link_libraries(${project_name} INTERFACE --coverage) + endif() + + set(SANITIZERS "") + + option(ENABLE_SANITIZER_ADDRESS "Enable address sanitizer" FALSE) + if(ENABLE_SANITIZER_ADDRESS) + list(APPEND SANITIZERS "address") + endif() + + option(ENABLE_SANITIZER_LEAK "Enable leak sanitizer" FALSE) + if(ENABLE_SANITIZER_LEAK) + list(APPEND SANITIZERS "leak") + endif() + + option(ENABLE_SANITIZER_UNDEFINED_BEHAVIOR "Enable undefined behavior sanitizer" FALSE) + if(ENABLE_SANITIZER_UNDEFINED_BEHAVIOR) + list(APPEND SANITIZERS "undefined") + endif() + + option(ENABLE_SANITIZER_THREAD "Enable thread sanitizer" FALSE) + if(ENABLE_SANITIZER_THREAD) + if("address" IN_LIST SANITIZERS OR "leak" IN_LIST SANITIZERS) + message(WARNING "Thread sanitizer does not work with Address and Leak sanitizer enabled") + else() + list(APPEND SANITIZERS "thread") + endif() + endif() + + option(ENABLE_SANITIZER_MEMORY "Enable memory sanitizer" FALSE) + if(ENABLE_SANITIZER_MEMORY AND CMAKE_CXX_COMPILER_ID MATCHES ".*Clang") + if("address" IN_LIST SANITIZERS + OR "thread" IN_LIST SANITIZERS + OR "leak" IN_LIST SANITIZERS) + message(WARNING "Memory sanitizer does not work with Address, Thread and Leak sanitizer enabled") + else() + list(APPEND SANITIZERS "memory") + endif() + endif() + + list( + JOIN + SANITIZERS + "," + LIST_OF_SANITIZERS) + + endif() + + if(LIST_OF_SANITIZERS) + if(NOT + "${LIST_OF_SANITIZERS}" + STREQUAL + "") + target_compile_options(${project_name} INTERFACE -fsanitize=${LIST_OF_SANITIZERS}) + target_link_libraries(${project_name} INTERFACE -fsanitize=${LIST_OF_SANITIZERS}) + endif() + endif() + +endfunction() diff --git a/cmake/StandardProjectSettings.cmake b/cmake/StandardProjectSettings.cmake new file mode 100644 index 0000000..1ee6f5a --- /dev/null +++ b/cmake/StandardProjectSettings.cmake @@ -0,0 +1,34 @@ +# Set a default build type if none was specified +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + message(STATUS "Setting build type to 'RelWithDebInfo' as none was specified.") + set(CMAKE_BUILD_TYPE + RelWithDebInfo + CACHE STRING "Choose the type of build." FORCE) + # Set the possible values of build type for cmake-gui, ccmake + set_property( + CACHE CMAKE_BUILD_TYPE + PROPERTY STRINGS + "Debug" + "Release" + "MinSizeRel" + "RelWithDebInfo") +endif() + +# Generate compile_commands.json to make it easier to work with clang based tools +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +option(ENABLE_IPO "Enable Interprocedural Optimization, aka Link Time Optimization (LTO)" OFF) + +if(ENABLE_IPO) + include(CheckIPOSupported) + check_ipo_supported( + RESULT + result + OUTPUT + output) + if(result) + set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) + else() + message(SEND_ERROR "IPO is not supported: ${output}") + endif() +endif() diff --git a/cmake/StaticAnalyzers.cmake b/cmake/StaticAnalyzers.cmake new file mode 100644 index 0000000..4396444 --- /dev/null +++ b/cmake/StaticAnalyzers.cmake @@ -0,0 +1,37 @@ +option(ENABLE_CPPCHECK "Enable static analysis with cppcheck" OFF) +option(ENABLE_CLANG_TIDY "Enable static analysis with clang-tidy" OFF) +option(ENABLE_INCLUDE_WHAT_YOU_USE "Enable static analysis with include-what-you-use" OFF) + +if(ENABLE_CPPCHECK) + find_program(CPPCHECK cppcheck) + if(CPPCHECK) + set(CMAKE_CXX_CPPCHECK + ${CPPCHECK} + --suppress=missingInclude + --enable=all + --inline-suppr + --inconclusive + -i + ${CMAKE_SOURCE_DIR}/imgui/lib) + else() + message(SEND_ERROR "cppcheck requested but executable not found") + endif() +endif() + +if(ENABLE_CLANG_TIDY) + find_program(CLANGTIDY clang-tidy) + if(CLANGTIDY) + set(CMAKE_CXX_CLANG_TIDY ${CLANGTIDY} -extra-arg=-Wno-unknown-warning-option) + else() + message(SEND_ERROR "clang-tidy requested but executable not found") + endif() +endif() + +if(ENABLE_INCLUDE_WHAT_YOU_USE) + find_program(INCLUDE_WHAT_YOU_USE include-what-you-use) + if(INCLUDE_WHAT_YOU_USE) + set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE ${INCLUDE_WHAT_YOU_USE}) + else() + message(SEND_ERROR "include-what-you-use requested but executable not found") + endif() +endif() diff --git a/data/appdata/org.flameshot.Flameshot.metainfo.xml b/data/appdata/org.flameshot.Flameshot.metainfo.xml new file mode 100644 index 0000000..a8fefae --- /dev/null +++ b/data/appdata/org.flameshot.Flameshot.metainfo.xml @@ -0,0 +1,112 @@ + + + + org.flameshot.Flameshot + + CC0-1.0 + + GPL-3.0-or-later + + Flameshot + + flameshot + + + Flameshot Developers + + + + touch + + + + keyboard + pointing + + + Take and annotate screenshots + + +

+ Powerful and simple to use screenshot software with built-in + editor with advanced features. +

+

Features:

+
    +
  • Customizable appearance
  • +
  • Very easy to use
  • +
  • In-app screenshot editing and annotation
  • +
  • DBus interface
  • +
  • Upload to Imgur
  • +
+
+ + + + + + https://raw.githubusercontent.com/flameshot-org/flameshot/master/docs/images/large_demo.png + Flameshot Usage + + + https://raw.githubusercontent.com/flameshot-org/flameshot/master/docs/images/small_demo.png + Demo of Pixelation, Arrow, Box, And Counter Bubble + + + https://raw.githubusercontent.com/flameshot-org/flameshot/master/docs/images/launcher.png + The Launcher Window + + + https://raw.githubusercontent.com/flameshot-org/flameshot/master/docs/images/config_interface.png + Configuration Window - Interface tab + + + https://raw.githubusercontent.com/flameshot-org/flameshot/master/docs/images/config_shortcuts.png + Configuration Window - Shortcuts tab + + + + https://github.com/flameshot-org/flameshot + https://github.com/flameshot-org/flameshot/issues + https://hosted.weblate.org/projects/flameshot/ + https://github.com/flameshot-org/flameshot/blob/master/docs/CONTRIBUTING.md + https://github.com/flameshot-org/flameshot/ + + https://github.com/flameshot-org/flameshot/issues/new + + org.flameshot.Flameshot.desktop + + + #d6a8e3 + #5c0075 + + + + + Utility + Graphics + + + + + + + + + + + + + + + + + + + + +
+ diff --git a/data/dbus/org.flameshot.Flameshot.service.in b/data/dbus/org.flameshot.Flameshot.service.in new file mode 100644 index 0000000..781ffa8 --- /dev/null +++ b/data/dbus/org.flameshot.Flameshot.service.in @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=org.flameshot.Flameshot +Exec=${CMAKE_INSTALL_FULL_BINDIR}/flameshot diff --git a/data/dbus/org.flameshot.Flameshot.xml b/data/dbus/org.flameshot.Flameshot.xml new file mode 100644 index 0000000..2463d8f --- /dev/null +++ b/data/dbus/org.flameshot.Flameshot.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/dbus/org.freedesktop.Notifications.xml b/data/dbus/org.freedesktop.Notifications.xml new file mode 100644 index 0000000..00e85ea --- /dev/null +++ b/data/dbus/org.freedesktop.Notifications.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/desktopEntry/package/org.flameshot.Flameshot.desktop b/data/desktopEntry/package/org.flameshot.Flameshot.desktop new file mode 100644 index 0000000..8be6b47 --- /dev/null +++ b/data/desktopEntry/package/org.flameshot.Flameshot.desktop @@ -0,0 +1,94 @@ +[Desktop Entry] +Name=Flameshot +Name[zh_CN]=火焰截图 +GenericName=Screenshot tool +GenericName[zh_CN]=屏幕截图工具 +GenericName[pl]=Zrzuty ekranu +GenericName[fr]=Outil de capture d'écran +GenericName[nl]=Schermfotoprogramma +GenericName[nl_NL]=Schermfotoprogramma +GenericName[ja]=スクリーンショットツール +GenericName[ru]=Создание скриншотов +GenericName[sk]=Nástroj na zachytávanie obrazovky +GenericName[sr]=Снимач екрана +GenericName[uk]=Інструмент скриншотів +GenericName[es]=Herramienta de captura de pantalla +GenericName[pt_BR]=Ferramenta de captura de tela +Comment=Powerful yet simple to use screenshot software. +Comment[zh_CN]=强大又易用的屏幕截图软件 +Comment[pl]=Proste w użyciu narzędzie do zrzutów ekranu +Comment[fr]=Logiciel de capture d'écran puissant et simple d'utilisation. +Comment[nl]=Een eenvoudig doch krachtig schermfotoprogramma. +Comment[nl_NL]=Een eenvoudig doch krachtig schermfotoprogramma. +Comment[ja]=パワフルで使いやすいスクリーンショットソフトウェア。 +Comment[ru]=Простой и функциональный инструмент для создания скриншотов +Comment[sk]=Mocný, no zároveň jednoduchý softvér na zachytávanie obrazovky. +Comment[sr]=Једноставан, а моћан алат за снимање екрана +Comment[uk]=Потужний простий у використанні додаток для створення знімків екрану. +Comment[es]=Software de captura de pantalla potente y fácil de usar. +Comment[de]=Schlichte, leistungsstarke Screenshot-Software +Comment[pt_BR]=Software de captura de tela poderoso, mas simples de usar. +Keywords=flameshot;screenshot;capture;shutter; +Keywords[zh_CN]=flameshot;screenshot;capture;shutter;截图;屏幕; +Keywords[fr]=flameshot;capture d'écran;capter;shutter; +Keywords[ja]=flameshot;screenshot;capture;shutter;スクリーンショット;キャプチャー; +Keywords[nl]=flameshot;schermfoto;screenshot;schermafdruk;vastleggen;schermopname; +Keywords[nl_NL]=flameshot;schermfoto;screenshot;schermafdruk;vastleggen;schermopname; +Keywords[es]=flameshot;screenshot;capture;shutter;captura; +Keywords[de]=flameshot;screenshot;Bildschirmfoto;Aufnahme; +Keywords[pt_BR]=flameshot;screenshot;captura de tela;captura;shutter; +Exec=@LAUNCHER_EXECUTABLE@ +Icon=org.flameshot.Flameshot +Terminal=false +Type=Application +Categories=Graphics; +StartupNotify=false +StartupWMClass=flameshot +Actions=Configure;Capture;Launcher; +X-DBUS-StartupType=Unique +X-DBUS-ServiceName=org.flameshot.Flameshot +X-KDE-DBUS-Restricted-Interfaces=org.kde.kwin.Screenshot,org.kde.KWin.ScreenShot2 + +[Desktop Action Configure] +Name=Configure +Name[zh_CN]=配置 +Name[pl]=Konfiguruj +Name[fr]=Configurer +Name[ja]=設定 +Name[ru]=Настройки +Name[sk]=Nastaviť +Name[nl]=Instellen +Name[nl_NL]=Instellen +Name[sr]=Подешавања +Name[uk]=Налаштувати +Name[es]=Configurar +Name[de]=Einstellungen +Name[pt_BR]=Configurar +Exec=flameshot config + +[Desktop Action Capture] +Name=Take screenshot +Name[zh_CN]=进行截图 +Name[pl]=Zrzut ekranu +Name[fr]=Prendre une capture d'écran +Name[ja]=スクリーンショットを撮る +Name[ru]=Сделать скриншот +Name[sk]=Zachytiť obrazovku +Name[sr]=Сними екран +Name[uk]=Зробити знімок +Name[nl]=Schermfoto maken +Name[nl_NL]=Schermfoto maken +Name[es]=Tomar captura de pantalla +Name[de]=Bildschirmfoto aufnehmen +Name[pt_BR]=Capturar tela +Exec=flameshot gui --delay 500 + +[Desktop Action Launcher] +Name=Open launcher +Name[de]=Starter öffnen +Name[nl]=Starter openen +Name[nl_NL]=Starter openen +Name[sk]=Otvoriť spúšťač +Name[zh_CN]=打开启动器 +Name[pt_BR]=Abrir lançador +Exec=flameshot launcher diff --git a/data/flameshot.rc b/data/flameshot.rc new file mode 100644 index 0000000..142e631 --- /dev/null +++ b/data/flameshot.rc @@ -0,0 +1,47 @@ +#pragma code_page(65001) // UTF-8 + +IDI_ICON1 ICON "img\\app\\flameshot.ico" + +#include + +#define VER_FILEVERSION FLAMESHOT_VERSION_MAJOR,FLAMESHOT_VERSION_MINOR,FLAMESHOT_VERSION_BUGFIX,FLAMESHOT_VERSION_BUILD +#define VER_FILEVERSION_STR FLAMESHOT_VERSION_STRING + +#define VER_PRODUCTVERSION FLAMESHOT_VERSION_MAJOR,FLAMESHOT_VERSION_MINOR,FLAMESHOT_VERSION_BUGFIX,FLAMESHOT_VERSION_BUILD +#define VER_PRODUCTVERSION_STR FLAMESHOT_VERSION_STRING + +#ifndef DEBUG +#define VER_DEBUG 0 +#else +#define VER_DEBUG VS_FF_DEBUG +#endif + +VS_VERSION_INFO VERSIONINFO +FILEVERSION VER_FILEVERSION +PRODUCTVERSION VER_PRODUCTVERSION +FILEFLAGSMASK VER_DEBUG +FILEFLAGS VER_DEBUG +FILEOS VOS__WINDOWS32 +FILETYPE VFT_APP +FILESUBTYPE VFT2_UNKNOWN +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", "The flameshot Org." + VALUE "FileDescription", "Flameshot" + VALUE "FileVersion", VER_FILEVERSION_STR + VALUE "InternalName", "flameshot" + VALUE "LegalCopyright", "Copyright (C) 2017-2020 flameshot.org" + VALUE "OriginalFilename", "flameshot.exe" + VALUE "ProductName", "Flameshot" + VALUE "ProductVersion", VER_PRODUCTVERSION_STR + END + END + + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 0x04b0 /* U.S. English (Unicode) */ + END +END diff --git a/data/graphics.qrc b/data/graphics.qrc new file mode 100644 index 0000000..a43024e --- /dev/null +++ b/data/graphics.qrc @@ -0,0 +1,105 @@ + + + img/app/org.flameshot.Flameshot.svg + img/app/flameshot.svg + img/app/org.flameshot.Flameshot.png + img/app/flameshot.png + img/app/flameshot.mask.png + img/app/flameshot.mask.svg + img/app/flameshot.monochrome.png + img/app/flameshot.monochrome.svg + img/app/keyboard.svg + img/material/black/accept.svg + img/material/black/arrow-bottom-left.svg + img/material/black/centeralign.svg + img/material/black/circle-outline.svg + img/material/black/close.svg + img/material/black/cloud-upload.svg + img/material/black/colorize.svg + img/material/black/config.svg + img/material/black/content-copy.svg + img/material/black/content-save.svg + img/material/black/cursor-move.svg + img/material/black/delete.svg + img/material/black/exit-to-app.svg + img/material/black/format-text.svg + img/material/black/format_bold.svg + img/material/black/format_italic.svg + img/material/black/format_strikethrough.svg + img/material/black/format_underlined.svg + img/material/black/graphics.svg + img/material/black/leftalign.svg + img/material/black/line.svg + img/material/black/marker.svg + img/material/black/mouse-off.svg + img/material/black/mouse.svg + img/material/black/name_edition.svg + img/material/black/open_with.svg + img/material/black/pencil.svg + img/material/black/pin.svg + img/material/black/pixelate.svg + img/material/black/redo-variant.svg + img/material/black/rightalign.svg + img/material/black/size_indicator.svg + img/material/black/square-outline.svg + img/material/black/square.svg + img/material/black/text.svg + img/material/black/undo-variant.svg + img/material/black/circlecount-outline.svg + img/material/black/filepath.svg + img/material/black/invert.svg + img/material/black/minus.svg + img/material/black/plus.svg + img/material/black/shortcut.svg + img/material/white/accept.svg + img/material/white/arrow-bottom-left.svg + img/material/white/centeralign.svg + img/material/white/circle-outline.svg + img/material/white/circlecount-outline.svg + img/material/white/close.svg + img/material/white/cloud-upload.svg + img/material/white/colorize.svg + img/material/white/config.svg + img/material/white/content-copy.svg + img/material/white/content-save.svg + img/material/white/cursor-move.svg + img/material/white/exit-to-app.svg + img/material/white/filepath.svg + img/material/white/format-text.svg + img/material/white/format_bold.svg + img/material/white/format_italic.svg + img/material/white/format_strikethrough.svg + img/material/white/format_underlined.svg + img/material/white/graphics.svg + img/material/white/invert.svg + img/material/white/leftalign.svg + img/material/white/line.svg + img/material/white/marker.svg + img/material/white/minus.svg + img/material/white/mouse-off.svg + img/material/white/mouse.svg + img/material/white/name_edition.svg + img/material/white/open_with.svg + img/material/white/pencil.svg + img/material/white/pin.svg + img/material/white/pixelate.svg + img/material/white/plus.svg + img/material/white/redo-variant.svg + img/material/white/rightalign.svg + img/material/white/shortcut.svg + img/material/white/size_indicator.svg + img/material/white/square-outline.svg + img/material/white/square.svg + img/material/white/text.svg + img/material/white/undo-variant.svg + img/material/black/move_down.svg + img/material/black/move_up.svg + img/material/white/move_down.svg + img/material/white/move_up.svg + img/material/white/delete.svg + img/material/black/apps.svg + img/material/black/image.svg + img/material/white/apps.svg + img/material/white/image.svg + + diff --git a/data/img/app/flameshot.ico b/data/img/app/flameshot.ico new file mode 100644 index 0000000..6d3a1d9 Binary files /dev/null and b/data/img/app/flameshot.ico differ diff --git a/data/img/app/flameshot.mask.png b/data/img/app/flameshot.mask.png new file mode 100644 index 0000000..ecaf279 Binary files /dev/null and b/data/img/app/flameshot.mask.png differ diff --git a/data/img/app/flameshot.mask.svg b/data/img/app/flameshot.mask.svg new file mode 100644 index 0000000..ffc75a7 --- /dev/null +++ b/data/img/app/flameshot.mask.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/data/img/app/flameshot.monochrome-1024.png b/data/img/app/flameshot.monochrome-1024.png new file mode 100644 index 0000000..fcff07c Binary files /dev/null and b/data/img/app/flameshot.monochrome-1024.png differ diff --git a/data/img/app/flameshot.monochrome.png b/data/img/app/flameshot.monochrome.png new file mode 100644 index 0000000..beffefe Binary files /dev/null and b/data/img/app/flameshot.monochrome.png differ diff --git a/data/img/app/flameshot.monochrome.svg b/data/img/app/flameshot.monochrome.svg new file mode 100644 index 0000000..e75fa98 --- /dev/null +++ b/data/img/app/flameshot.monochrome.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/data/img/app/flameshot.png b/data/img/app/flameshot.png new file mode 100644 index 0000000..483b595 Binary files /dev/null and b/data/img/app/flameshot.png differ diff --git a/data/img/app/flameshot.svg b/data/img/app/flameshot.svg new file mode 100644 index 0000000..3d92f3e --- /dev/null +++ b/data/img/app/flameshot.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/data/img/app/flameshotLogoLicense.txt b/data/img/app/flameshotLogoLicense.txt new file mode 100644 index 0000000..027fc78 --- /dev/null +++ b/data/img/app/flameshotLogoLicense.txt @@ -0,0 +1,253 @@ +Free Art License 1.3 + + +[ Copyleft Attitude ] + +Free Art License 1.3 (FAL 1.3) + +Preamble + +The Free Art License grants the right to freely copy, distribute, and +transform creative works without infringing the author's rights. + +The Free Art License recognizes and protects these rights. Their +implementation has been reformulated in order to allow everyone to use +creations of the human mind in a creative manner, regardless of their +types and ways of expression. + +While the public's access to creations of the human mind usually is +restricted by the implementation of copyright law, it is favoured by +the Free Art License. This license intends to allow the use of a +work’s resources; to establish new conditions for creating in order to +increase creation opportunities. The Free Art License grants the right +to use a work, and acknowledges the right holder’s and the user’s +rights and responsibility. + +The invention and development of digital technologies, Internet and +Free Software have changed creation methods: creations of the human +mind can obviously be distributed, exchanged, and transformed. They +allow to produce common works to which everyone can contribute to the +benefit of all. + +The main rationale for this Free Art License is to promote and protect +these creations of the human mind according to the principles of +copyleft: freedom to use, copy, distribute, transform, and prohibition +of exclusive appropriation. + +Definitions + +“work” either means the initial work, the subsequent works or the +common work as defined hereafter: + +“common work” means a work composed of the initial work and all +subsequent contributions to it (originals and copies). The initial +author is the one who, by choosing this license, defines the +conditions under which contributions are made. + +“Initial work” means the work created by the initiator of the common +work (as defined above), the copies of which can be modified by +whoever wants to + +“Subsequent works” means the contributions made by authors who +participate in the evolution of the common work by exercising the +rights to reproduce, distribute, and modify that are granted by the +license. + +“Originals” (sources or resources of the work) means all copies of +either the initial work or any subsequent work mentioning a date and +used by their author(s) as references for any subsequent updates, +interpretations, copies or reproductions. + +“Copy” means any reproduction of an original as defined by this +license. + +1. OBJECT + +The aim of this license is to define the conditions under which one +can use this work freely. + +2. SCOPE + +This work is subject to copyright law. Through this license its author +specifies the extent to which you can copy, distribute, and modify it. + +2.1 FREEDOM TO COPY (OR TO MAKE REPRODUCTIONS) + +You have the right to copy this work for yourself, your friends or any +other person, whatever the technique used. + +2.2 FREEDOM TO DISTRIBUTE, TO PERFORM IN PUBLIC + +You have the right to distribute copies of this work; whether modified +or not, whatever the medium and the place, with or without any charge, +provided that you: attach this license without any modification to the +copies of this work or indicate precisely where the license can be +found, specify to the recipient the names of the author(s) of the +originals, including yours if you have modified the work, specify to +the recipient where to access the originals (either initial or +subsequent). + +The authors of the originals may, if they wish to, give you the right +to distribute the originals under the same conditions as the copies. + +2.3 FREEDOM TO MODIFY + +You have the right to modify copies of the originals (whether initial +or subsequent) provided you comply with the following conditions: all +conditions in article 2.2 above, if you distribute modified copies; +indicate that the work has been modified and, if it is possible, what +kind of modifications have been made; distribute the subsequent work +under the same license or any compatible license. + +The author(s) of the original work may give you the right to modify it +under the same conditions as the copies. + +3. RELATED RIGHTS + +Activities giving rise to author’s rights and related rights shall not +challenge the rights granted by this license. + +For example, this is the reason why performances must be subject to +the same license or a compatible license. Similarly, integrating the +work in a database, a compilation or an anthology shall not prevent +anyone from using the work under the same conditions as those defined +in this license. + +4. INCORPORATION OF THE WORK + +Incorporating this work into a larger work that is not subject to the +Free Art License shall not challenge the rights granted by this +license. + +If the work can no longer be accessed apart from the larger work in +which it is incorporated, then incorporation shall only be allowed +under the condition that the larger work is subject either to the Free +Art License or a compatible license. + +5. COMPATIBILITY + +A license is compatible with the Free Art License provided: it gives +the right to copy, distribute, and modify copies of the work including +for commercial purposes and without any other restrictions than those +required by the respect of the other compatibility criteria; it +ensures proper attribution of the work to its authors and access to +previous versions of the work when possible; it recognizes the Free +Art License as compatible (reciprocity); it requires that changes made +to the work be subject to the same license or to a license which also +meets these compatibility criteria. + +6. YOUR INTELLECTUAL RIGHTS + +This license does not aim at denying your author's rights in your +contribution or any related right. By choosing to contribute to the +development of this common work, you only agree to grant others the +same rights with regard to your contribution as those you were granted +by this license. Conferring these rights does not mean you have to +give up your intellectual rights. + +7. YOUR RESPONSIBILITIES + +The freedom to use the work as defined by the Free Art License (right +to copy, distribute, modify) implies that everyone is responsible for +their own actions. + +8. DURATION OF THE LICENSE + +This license takes effect as of your acceptance of its terms. The act +of copying, distributing, or modifying the work constitutes a tacit +agreement. This license will remain in effect for as long as the +copyright which is attached to the work. If you do not respect the +terms of this license, you automatically lose the rights that it +confers. + +If the legal status or legislation to which you are subject makes it +impossible for you to respect the terms of this license, you may not +make use of the rights which it confers. + +9. VARIOUS VERSIONS OF THE LICENSE + +This license may undergo periodic modifications to incorporate +improvements by its authors (instigators of the “Copyleft Attitude” +movement) by way of new, numbered versions. + +You will always have the choice of accepting the terms contained in +the version under which the copy of the work was distributed to you, +or alternatively, to use the provisions of one of the subsequent +versions. + +10. SUB-LICENSING + +Sub-licenses are not authorized by this license. Any person wishing to +make use of the rights that it confers will be directly bound to the +authors of the common work. + +11. LEGAL FRAMEWORK + +This license is written with respect to both French law and the Berne +Convention for the Protection of Literary and Artistic Works. + +USER GUIDE + +- How to use the Free Art License? + +To benefit from the Free Art License, you only need to mention the +following elements on your work: + + [Name of the author, title, date of the work. When applicable, names + of authors of the common work and, if possible, where to find the + originals]. + +Copyleft: This is a free work, you can copy, distribute, and modify it +under the terms of the Free Art License +http://artlibre.org/licence/lal/en/ + +- Why to use the Free Art License? + + 1.To give the greatest number of people access to your work. + + 2.To allow it to be distributed freely. + + 3.To allow it to evolve by allowing its copy, distribution, and + transformation by others. + + 4.So that you benefit from the resources of a work when it is under + the Free Art License: to be able to copy, distribute or transform + it freely. + + 5.But also, because the Free Art License offers a legal framework to + disallow any misappropriation. It is forbidden to take hold of + your work and bypass the creative process for one's exclusive + possession. + + +- When to use the Free Art License? + +Any time you want to benefit and make others benefit from the right to +copy, distribute and transform creative works without any exclusive +appropriation, you should use the Free Art License. You can for +example use it for scientific, artistic or educational projects. + +- What kinds of works can be subject to the Free Art License? + +The Free Art License can be applied to digital as well as physical +works. You can choose to apply the Free Art License on any text, +picture, sound, gesture, or whatever sort of stuff on which you have +sufficient author's rights. + +- Historical background of this license: + +It is the result of observing, using and creating digital +technologies, free software, the Internet and art. It arose from the +“Copyleft Attitude” meetings which took place in Paris in 2000. For +the first time, these meetings brought together members of the Free +Software community, artists, and members of the art world. The goal +was to adapt the principles of Copyleft and free software to all sorts +of creations. http://www.artlibre.org + +Copyleft Attitude, 2007. + +You can make reproductions and distribute this license verbatim +(without any changes). + + Translation : Jonathan Clarke, Benjamin Jean, Griselda Jung, Fanny + Mourguet, Antoine Pitrou. Thanks to framalang.org diff --git a/data/img/app/keyboard.svg b/data/img/app/keyboard.svg new file mode 100644 index 0000000..d385f03 --- /dev/null +++ b/data/img/app/keyboard.svg @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/data/img/app/org.flameshot.Flameshot-1024.png b/data/img/app/org.flameshot.Flameshot-1024.png new file mode 100644 index 0000000..43d793b Binary files /dev/null and b/data/img/app/org.flameshot.Flameshot-1024.png differ diff --git a/data/img/app/org.flameshot.Flameshot.png b/data/img/app/org.flameshot.Flameshot.png new file mode 100644 index 0000000..71e7976 Binary files /dev/null and b/data/img/app/org.flameshot.Flameshot.png differ diff --git a/data/img/app/org.flameshot.Flameshot.svg b/data/img/app/org.flameshot.Flameshot.svg new file mode 100644 index 0000000..f72f8c1 --- /dev/null +++ b/data/img/app/org.flameshot.Flameshot.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + diff --git a/data/img/hicolor/128x128/apps/flameshot.png b/data/img/hicolor/128x128/apps/flameshot.png new file mode 100644 index 0000000..483b595 Binary files /dev/null and b/data/img/hicolor/128x128/apps/flameshot.png differ diff --git a/data/img/hicolor/128x128/apps/org.flameshot.Flameshot.png b/data/img/hicolor/128x128/apps/org.flameshot.Flameshot.png new file mode 100644 index 0000000..483b595 Binary files /dev/null and b/data/img/hicolor/128x128/apps/org.flameshot.Flameshot.png differ diff --git a/data/img/hicolor/48x48/apps/flameshot.png b/data/img/hicolor/48x48/apps/flameshot.png new file mode 100644 index 0000000..214b437 Binary files /dev/null and b/data/img/hicolor/48x48/apps/flameshot.png differ diff --git a/data/img/hicolor/48x48/apps/org.flameshot.Flameshot.png b/data/img/hicolor/48x48/apps/org.flameshot.Flameshot.png new file mode 100644 index 0000000..214b437 Binary files /dev/null and b/data/img/hicolor/48x48/apps/org.flameshot.Flameshot.png differ diff --git a/data/img/hicolor/scalable/apps/flameshot.svg b/data/img/hicolor/scalable/apps/flameshot.svg new file mode 100644 index 0000000..e06a9f4 --- /dev/null +++ b/data/img/hicolor/scalable/apps/flameshot.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/data/img/hicolor/scalable/apps/org.flameshot.Flameshot.svg b/data/img/hicolor/scalable/apps/org.flameshot.Flameshot.svg new file mode 100644 index 0000000..e06a9f4 --- /dev/null +++ b/data/img/hicolor/scalable/apps/org.flameshot.Flameshot.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/data/img/material/LICENSE.txt b/data/img/material/LICENSE.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/data/img/material/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/data/img/material/README.md b/data/img/material/README.md new file mode 100644 index 0000000..53bed87 --- /dev/null +++ b/data/img/material/README.md @@ -0,0 +1 @@ +Google Material Design Icons are licensed under Apache License 2.0 (see LICENSE.txt) diff --git a/data/img/material/black/accept.svg b/data/img/material/black/accept.svg new file mode 100644 index 0000000..27b0894 --- /dev/null +++ b/data/img/material/black/accept.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/black/apps.svg b/data/img/material/black/apps.svg new file mode 100644 index 0000000..be40831 --- /dev/null +++ b/data/img/material/black/apps.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/img/material/black/arrow-bottom-left.svg b/data/img/material/black/arrow-bottom-left.svg new file mode 100644 index 0000000..396abfa --- /dev/null +++ b/data/img/material/black/arrow-bottom-left.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/black/centeralign.svg b/data/img/material/black/centeralign.svg new file mode 100644 index 0000000..0fc6c45 --- /dev/null +++ b/data/img/material/black/centeralign.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/black/circle-outline.svg b/data/img/material/black/circle-outline.svg new file mode 100644 index 0000000..811fbe5 --- /dev/null +++ b/data/img/material/black/circle-outline.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/black/circlecount-outline.svg b/data/img/material/black/circlecount-outline.svg new file mode 100644 index 0000000..ca11d12 --- /dev/null +++ b/data/img/material/black/circlecount-outline.svg @@ -0,0 +1,4 @@ + + + 1 + diff --git a/data/img/material/black/close.svg b/data/img/material/black/close.svg new file mode 100644 index 0000000..4049435 --- /dev/null +++ b/data/img/material/black/close.svg @@ -0,0 +1,3 @@ + + + diff --git a/data/img/material/black/cloud-upload.svg b/data/img/material/black/cloud-upload.svg new file mode 100644 index 0000000..813faab --- /dev/null +++ b/data/img/material/black/cloud-upload.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/black/colorize.svg b/data/img/material/black/colorize.svg new file mode 100644 index 0000000..434fc32 --- /dev/null +++ b/data/img/material/black/colorize.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/black/config.svg b/data/img/material/black/config.svg new file mode 100644 index 0000000..7d36d43 --- /dev/null +++ b/data/img/material/black/config.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/black/content-copy.svg b/data/img/material/black/content-copy.svg new file mode 100644 index 0000000..9e28717 --- /dev/null +++ b/data/img/material/black/content-copy.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/black/content-save.svg b/data/img/material/black/content-save.svg new file mode 100644 index 0000000..5cd16b8 --- /dev/null +++ b/data/img/material/black/content-save.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/black/cursor-move.svg b/data/img/material/black/cursor-move.svg new file mode 100644 index 0000000..8aa4659 --- /dev/null +++ b/data/img/material/black/cursor-move.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/black/delete.svg b/data/img/material/black/delete.svg new file mode 100644 index 0000000..c978728 --- /dev/null +++ b/data/img/material/black/delete.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/black/exit-to-app.svg b/data/img/material/black/exit-to-app.svg new file mode 100644 index 0000000..40e6757 --- /dev/null +++ b/data/img/material/black/exit-to-app.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/black/filepath.svg b/data/img/material/black/filepath.svg new file mode 100644 index 0000000..e11ea94 --- /dev/null +++ b/data/img/material/black/filepath.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/black/format-text.svg b/data/img/material/black/format-text.svg new file mode 100644 index 0000000..f5c0045 --- /dev/null +++ b/data/img/material/black/format-text.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/black/format_bold.svg b/data/img/material/black/format_bold.svg new file mode 100644 index 0000000..83b55ee --- /dev/null +++ b/data/img/material/black/format_bold.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/black/format_italic.svg b/data/img/material/black/format_italic.svg new file mode 100644 index 0000000..bf2afcf --- /dev/null +++ b/data/img/material/black/format_italic.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/black/format_strikethrough.svg b/data/img/material/black/format_strikethrough.svg new file mode 100644 index 0000000..243e319 --- /dev/null +++ b/data/img/material/black/format_strikethrough.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/black/format_underlined.svg b/data/img/material/black/format_underlined.svg new file mode 100644 index 0000000..e6cc0f0 --- /dev/null +++ b/data/img/material/black/format_underlined.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/black/graphics.svg b/data/img/material/black/graphics.svg new file mode 100644 index 0000000..642ea83 --- /dev/null +++ b/data/img/material/black/graphics.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/black/image.svg b/data/img/material/black/image.svg new file mode 100644 index 0000000..f06871c --- /dev/null +++ b/data/img/material/black/image.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/img/material/black/invert.svg b/data/img/material/black/invert.svg new file mode 100644 index 0000000..58e987e --- /dev/null +++ b/data/img/material/black/invert.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/black/leftalign.svg b/data/img/material/black/leftalign.svg new file mode 100644 index 0000000..07b75b0 --- /dev/null +++ b/data/img/material/black/leftalign.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/black/line.svg b/data/img/material/black/line.svg new file mode 100644 index 0000000..c65c1d5 --- /dev/null +++ b/data/img/material/black/line.svg @@ -0,0 +1,3 @@ + + + diff --git a/data/img/material/black/marker.svg b/data/img/material/black/marker.svg new file mode 100644 index 0000000..ab143f0 --- /dev/null +++ b/data/img/material/black/marker.svg @@ -0,0 +1,3 @@ + + + diff --git a/data/img/material/black/minus.svg b/data/img/material/black/minus.svg new file mode 100644 index 0000000..1d7c1d0 --- /dev/null +++ b/data/img/material/black/minus.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/black/mouse-off.svg b/data/img/material/black/mouse-off.svg new file mode 100644 index 0000000..c040736 --- /dev/null +++ b/data/img/material/black/mouse-off.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/black/mouse.svg b/data/img/material/black/mouse.svg new file mode 100644 index 0000000..1605c8c --- /dev/null +++ b/data/img/material/black/mouse.svg @@ -0,0 +1,3 @@ + + + diff --git a/data/img/material/black/move_down.svg b/data/img/material/black/move_down.svg new file mode 100644 index 0000000..cf86ece --- /dev/null +++ b/data/img/material/black/move_down.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/black/move_up.svg b/data/img/material/black/move_up.svg new file mode 100644 index 0000000..2b3fd42 --- /dev/null +++ b/data/img/material/black/move_up.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/black/name_edition.svg b/data/img/material/black/name_edition.svg new file mode 100644 index 0000000..6eb207f --- /dev/null +++ b/data/img/material/black/name_edition.svg @@ -0,0 +1,3 @@ + + + diff --git a/data/img/material/black/open_with.svg b/data/img/material/black/open_with.svg new file mode 100644 index 0000000..e477ddd --- /dev/null +++ b/data/img/material/black/open_with.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/black/pencil.svg b/data/img/material/black/pencil.svg new file mode 100644 index 0000000..30320d2 --- /dev/null +++ b/data/img/material/black/pencil.svg @@ -0,0 +1,3 @@ + + + diff --git a/data/img/material/black/pin.svg b/data/img/material/black/pin.svg new file mode 100644 index 0000000..2bbc1f0 --- /dev/null +++ b/data/img/material/black/pin.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/black/pixelate.svg b/data/img/material/black/pixelate.svg new file mode 100644 index 0000000..50c4a52 --- /dev/null +++ b/data/img/material/black/pixelate.svg @@ -0,0 +1,3 @@ + + + diff --git a/data/img/material/black/plus.svg b/data/img/material/black/plus.svg new file mode 100644 index 0000000..37fa8f6 --- /dev/null +++ b/data/img/material/black/plus.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/black/redo-variant.svg b/data/img/material/black/redo-variant.svg new file mode 100644 index 0000000..aafb0d8 --- /dev/null +++ b/data/img/material/black/redo-variant.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/black/rightalign.svg b/data/img/material/black/rightalign.svg new file mode 100644 index 0000000..b5dfc43 --- /dev/null +++ b/data/img/material/black/rightalign.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/black/shortcut.svg b/data/img/material/black/shortcut.svg new file mode 100644 index 0000000..14b3235 --- /dev/null +++ b/data/img/material/black/shortcut.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/data/img/material/black/size_indicator.svg b/data/img/material/black/size_indicator.svg new file mode 100644 index 0000000..2c6132b --- /dev/null +++ b/data/img/material/black/size_indicator.svg @@ -0,0 +1,4 @@ + + + + diff --git a/data/img/material/black/square-outline.svg b/data/img/material/black/square-outline.svg new file mode 100644 index 0000000..63fbf2e --- /dev/null +++ b/data/img/material/black/square-outline.svg @@ -0,0 +1,3 @@ + + + diff --git a/data/img/material/black/square.svg b/data/img/material/black/square.svg new file mode 100644 index 0000000..31b8298 --- /dev/null +++ b/data/img/material/black/square.svg @@ -0,0 +1,3 @@ + + + diff --git a/data/img/material/black/text.svg b/data/img/material/black/text.svg new file mode 100644 index 0000000..19024ee --- /dev/null +++ b/data/img/material/black/text.svg @@ -0,0 +1,4 @@ + + + + diff --git a/data/img/material/black/undo-variant.svg b/data/img/material/black/undo-variant.svg new file mode 100644 index 0000000..4296534 --- /dev/null +++ b/data/img/material/black/undo-variant.svg @@ -0,0 +1,3 @@ + + + diff --git a/data/img/material/white/accept.svg b/data/img/material/white/accept.svg new file mode 100644 index 0000000..b3d2eaf --- /dev/null +++ b/data/img/material/white/accept.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/apps.svg b/data/img/material/white/apps.svg new file mode 100644 index 0000000..6010350 --- /dev/null +++ b/data/img/material/white/apps.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/img/material/white/arrow-bottom-left.svg b/data/img/material/white/arrow-bottom-left.svg new file mode 100644 index 0000000..0f79b82 --- /dev/null +++ b/data/img/material/white/arrow-bottom-left.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/centeralign.svg b/data/img/material/white/centeralign.svg new file mode 100644 index 0000000..2bff80c --- /dev/null +++ b/data/img/material/white/centeralign.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/circle-outline.svg b/data/img/material/white/circle-outline.svg new file mode 100644 index 0000000..73fc904 --- /dev/null +++ b/data/img/material/white/circle-outline.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/circlecount-outline.svg b/data/img/material/white/circlecount-outline.svg new file mode 100644 index 0000000..910b076 --- /dev/null +++ b/data/img/material/white/circlecount-outline.svg @@ -0,0 +1,4 @@ + + + 1 + diff --git a/data/img/material/white/close.svg b/data/img/material/white/close.svg new file mode 100644 index 0000000..748ac1e --- /dev/null +++ b/data/img/material/white/close.svg @@ -0,0 +1,3 @@ + + + diff --git a/data/img/material/white/cloud-upload.svg b/data/img/material/white/cloud-upload.svg new file mode 100644 index 0000000..30d889e --- /dev/null +++ b/data/img/material/white/cloud-upload.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/colorize.svg b/data/img/material/white/colorize.svg new file mode 100644 index 0000000..a222ab6 --- /dev/null +++ b/data/img/material/white/colorize.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/config.svg b/data/img/material/white/config.svg new file mode 100644 index 0000000..1b18f46 --- /dev/null +++ b/data/img/material/white/config.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/content-copy.svg b/data/img/material/white/content-copy.svg new file mode 100644 index 0000000..d885c33 --- /dev/null +++ b/data/img/material/white/content-copy.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/content-save.svg b/data/img/material/white/content-save.svg new file mode 100644 index 0000000..6235126 --- /dev/null +++ b/data/img/material/white/content-save.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/cursor-move.svg b/data/img/material/white/cursor-move.svg new file mode 100644 index 0000000..39f3902 --- /dev/null +++ b/data/img/material/white/cursor-move.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/delete.svg b/data/img/material/white/delete.svg new file mode 100644 index 0000000..3836277 --- /dev/null +++ b/data/img/material/white/delete.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/exit-to-app.svg b/data/img/material/white/exit-to-app.svg new file mode 100644 index 0000000..4f97159 --- /dev/null +++ b/data/img/material/white/exit-to-app.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/filepath.svg b/data/img/material/white/filepath.svg new file mode 100644 index 0000000..8c2ec94 --- /dev/null +++ b/data/img/material/white/filepath.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/format-text.svg b/data/img/material/white/format-text.svg new file mode 100644 index 0000000..fec5e78 --- /dev/null +++ b/data/img/material/white/format-text.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/format_bold.svg b/data/img/material/white/format_bold.svg new file mode 100644 index 0000000..eb3127c --- /dev/null +++ b/data/img/material/white/format_bold.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/format_italic.svg b/data/img/material/white/format_italic.svg new file mode 100644 index 0000000..a50acba --- /dev/null +++ b/data/img/material/white/format_italic.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/format_strikethrough.svg b/data/img/material/white/format_strikethrough.svg new file mode 100644 index 0000000..b269f91 --- /dev/null +++ b/data/img/material/white/format_strikethrough.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/format_underlined.svg b/data/img/material/white/format_underlined.svg new file mode 100644 index 0000000..0acc81f --- /dev/null +++ b/data/img/material/white/format_underlined.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/graphics.svg b/data/img/material/white/graphics.svg new file mode 100644 index 0000000..8a7ff77 --- /dev/null +++ b/data/img/material/white/graphics.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/image.svg b/data/img/material/white/image.svg new file mode 100644 index 0000000..2ad6b8c --- /dev/null +++ b/data/img/material/white/image.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/img/material/white/invert.svg b/data/img/material/white/invert.svg new file mode 100644 index 0000000..bb2b959 --- /dev/null +++ b/data/img/material/white/invert.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/leftalign.svg b/data/img/material/white/leftalign.svg new file mode 100644 index 0000000..7c25886 --- /dev/null +++ b/data/img/material/white/leftalign.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/line.svg b/data/img/material/white/line.svg new file mode 100644 index 0000000..8d26f40 --- /dev/null +++ b/data/img/material/white/line.svg @@ -0,0 +1,3 @@ + + + diff --git a/data/img/material/white/marker.svg b/data/img/material/white/marker.svg new file mode 100644 index 0000000..1f6117e --- /dev/null +++ b/data/img/material/white/marker.svg @@ -0,0 +1,3 @@ + + + diff --git a/data/img/material/white/minus.svg b/data/img/material/white/minus.svg new file mode 100644 index 0000000..3a66e41 --- /dev/null +++ b/data/img/material/white/minus.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/mouse-off.svg b/data/img/material/white/mouse-off.svg new file mode 100644 index 0000000..31793d2 --- /dev/null +++ b/data/img/material/white/mouse-off.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/mouse.svg b/data/img/material/white/mouse.svg new file mode 100644 index 0000000..f559d1e --- /dev/null +++ b/data/img/material/white/mouse.svg @@ -0,0 +1,3 @@ + + + diff --git a/data/img/material/white/move_down.svg b/data/img/material/white/move_down.svg new file mode 100644 index 0000000..4ff1594 --- /dev/null +++ b/data/img/material/white/move_down.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/move_up.svg b/data/img/material/white/move_up.svg new file mode 100644 index 0000000..67fa697 --- /dev/null +++ b/data/img/material/white/move_up.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/name_edition.svg b/data/img/material/white/name_edition.svg new file mode 100644 index 0000000..f1573ed --- /dev/null +++ b/data/img/material/white/name_edition.svg @@ -0,0 +1,3 @@ + + + diff --git a/data/img/material/white/open_with.svg b/data/img/material/white/open_with.svg new file mode 100644 index 0000000..3750d13 --- /dev/null +++ b/data/img/material/white/open_with.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/pencil.svg b/data/img/material/white/pencil.svg new file mode 100644 index 0000000..e53d8e6 --- /dev/null +++ b/data/img/material/white/pencil.svg @@ -0,0 +1,3 @@ + + + diff --git a/data/img/material/white/pin.svg b/data/img/material/white/pin.svg new file mode 100644 index 0000000..3c9d5d0 --- /dev/null +++ b/data/img/material/white/pin.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/pixelate.svg b/data/img/material/white/pixelate.svg new file mode 100644 index 0000000..548e3e3 --- /dev/null +++ b/data/img/material/white/pixelate.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/plus.svg b/data/img/material/white/plus.svg new file mode 100644 index 0000000..f05774f --- /dev/null +++ b/data/img/material/white/plus.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/redo-variant.svg b/data/img/material/white/redo-variant.svg new file mode 100644 index 0000000..33d642d --- /dev/null +++ b/data/img/material/white/redo-variant.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/rightalign.svg b/data/img/material/white/rightalign.svg new file mode 100644 index 0000000..f5e96eb --- /dev/null +++ b/data/img/material/white/rightalign.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/img/material/white/shortcut.svg b/data/img/material/white/shortcut.svg new file mode 100644 index 0000000..d17f75d --- /dev/null +++ b/data/img/material/white/shortcut.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/data/img/material/white/size_indicator.svg b/data/img/material/white/size_indicator.svg new file mode 100644 index 0000000..b526f99 --- /dev/null +++ b/data/img/material/white/size_indicator.svg @@ -0,0 +1,4 @@ + + + + diff --git a/data/img/material/white/square-outline.svg b/data/img/material/white/square-outline.svg new file mode 100644 index 0000000..2c2f34b --- /dev/null +++ b/data/img/material/white/square-outline.svg @@ -0,0 +1,3 @@ + + + diff --git a/data/img/material/white/square.svg b/data/img/material/white/square.svg new file mode 100644 index 0000000..a54a7d3 --- /dev/null +++ b/data/img/material/white/square.svg @@ -0,0 +1,3 @@ + + + diff --git a/data/img/material/white/text.svg b/data/img/material/white/text.svg new file mode 100644 index 0000000..588ac51 --- /dev/null +++ b/data/img/material/white/text.svg @@ -0,0 +1,3 @@ + + + diff --git a/data/img/material/white/undo-variant.svg b/data/img/material/white/undo-variant.svg new file mode 100644 index 0000000..425bb84 --- /dev/null +++ b/data/img/material/white/undo-variant.svg @@ -0,0 +1,3 @@ + + + diff --git a/data/img/preview/animatedUsage.gif b/data/img/preview/animatedUsage.gif new file mode 100644 index 0000000..16db974 Binary files /dev/null and b/data/img/preview/animatedUsage.gif differ diff --git a/data/img/preview/usageStatic.png b/data/img/preview/usageStatic.png new file mode 100644 index 0000000..5639da0 Binary files /dev/null and b/data/img/preview/usageStatic.png differ diff --git a/data/man/man1/flameshot.1 b/data/man/man1/flameshot.1 new file mode 100644 index 0000000..9512727 --- /dev/null +++ b/data/man/man1/flameshot.1 @@ -0,0 +1,352 @@ +.\" Hey, EMACS: -*- nroff -*- +.\" (C) Copyright 2018 Boyuan Yang <073plan@gmail.com>, +.\" This file is released under CC0 1.0 Universal (CC0-1.0) license. +.\" +.TH "FLAMESHOT" "1" "2021-11-11" +.\" Please adjust this date whenever revising the manpage. +.\" +.\" Some roff macros, for reference: +.\" .nh disable hyphenation +.\" .hy enable hyphenation +.\" .ad l left justify +.\" .ad b justify to both left and right margins +.\" .nf disable filling +.\" .fi enable filling +.\" .br insert line break +.\" .sp insert n+1 empty lines +.\" for manpage-specific macros, see man(7) +.SH NAME +Flameshot \- Powerful yet simple-to-use screenshot software +.SH SYNOPSIS +.B flameshot +[subcommands] [arguments] +.br +.B flameshot gui +[gui arguments] +.br +.B flameshot screen +[screen arguments] +.br +.B flameshot full +[fullscreen arguments] +.br +.B flameshot config +[config arguments] +.br +.B flameshot launcher +.br +. +.\"---------------------------------------------------------------------------- +.SH DESCRIPTION +This manual page documents briefly the +.B flameshot +command as provided by +.B flameshot +package. +.PP +\fBflameshot\fP is a screenshot tool that aims to be powerful yet simple-to-use. +Its notable features include customizable appearance, in-app screenshot editing, +D-Bus interface, tray icon support, experimental GNOME/KDE Wayland support, +integration with Imgur and support for both GUI and CLI interface. +.PP +Besides the usage information about \fBflameshot\fR in this manpage, you can find similar information using \fBflameshot --help\fR. Same \fB--help\fR can be used for each subcommand as well to get the valid arguments for them. The detailed usage of \fBflameshot\fP is documented in the \fIREADME.md\fR file on the project's Git repository page: +https://github.com/flameshot-org/flameshot +. +.\"---------------------------------------------------------------------------- +.SH "SUBCOMMANDS" +.PP +Per default without subcommands, \fBflameshot\fR runs the Flameshot in the background and adds a tray icon for configuration. Note that it will not take a screenshot unless you define one of the modes though the subcommands. There are various subcommands that can be used to use flameshot in different modes: +. +.TP +.B gui +Running Flameshot in \fBgui\fR mode would let the user to select the region from which the screenshot should be taken and then allow them to annotate the screenshot. +. +.TP +.B full +Takes screenshot of all monitors at the same time +. +.TP +.B screen +Takes screenshot of the specified monitor. +. +.TP +.SH launcher +Does not accept any arguments, it will just opens the launcher window +. +.TP +.SH config +If no argument is provided, it will open the config window, otherwise it can change the configurations based on the provided arguments. +. +.\"---------------------------------------------------------------------------- +.SH "ARGUMENTS" +.PP +Here we list all the arguments available for all subcommands. The subcommands that accept each argument are listed after each argument. Alternatively, you can use the \fBflameshot [subcommand] --help\fR to know the list of available arguments for each subcommand. +. +.PP +\-s, \-\-accept-on-select +.RS 4 +Accept capture as soon as a selection is made +.br +Valid for subcommands: gui +.RE +. +.PP +\-a, \-\-autostart +.RS 4 +Enable or disable run at startup +.br +Valid for subcommands: config +.RE +. +.PP +\-\-check +.RS 4 +Check the configuration for errors. This is useful if you manually change the config file and want to make sure it does not contain errors. +.br +Valid for subcommands: config +.RE +. +.PP +\-c, \-\-clipboard +.RS 4 +Save the capture to the clipboard +.br +Valid for subcommands: full, gui, screen +.RE +. +.PP +\-k, \-\-contrastcolor +.RS 4 +Define the contrast UI color +.br +Valid for subcommands: config +.RE +. +.PP +\-d, \-\-delay +.RS 4 +How many milliseconds should Flameshot wait before taking the screenshot +.br +Valid for subcommands: full, gui, screen +.RE +. +.PP +\-f, \-\-filename +.RS 4 +Set the filename pattern +.br +Valid for subcommands: config +.RE +. +.PP +\-h, \-\-help +.RS 4 +Show a brief help message and list the arguments the valid arguments for that subcommand +.br +Valid for subcommands: config, full, gui, launcher, screen +.RE +. +.PP +\-\-last-region +.RS 4 +Repeat screenshot with previously selected region +.br +Valid for subcommands: gui +.RE +. +.PP +\-m, \-\-maincolor +.RS 4 +Define the main UI color +.br +Valid for subcommands: config +.RE +. +.PP +\-n, \-\-notifications +.RS 4 +Enable or disable the notifications +.br +Valid for subcommands: config +.RE +. +.PP +\-n, \-\-number +.RS 4 +Define the screen to capture (starting from 0), default: screen containing the cursor +.br +Valid for subcommands: screen +.RE +. +.PP +\-p, \-\-path +.RS 4 +Existing directory or new file to save to +.br +Valid for subcommands: full, gui, screen +.RE +. +.PP +\-\-pin +.RS 4 +Pin the capture to the screen +.br +Valid for subcommands: gui, screen +.RE +. +.PP +\-g, \-\-print-geometry +.RS 4 +Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified +.br +Valid for subcommands: gui +.RE +. +.PP +\-r, \-\-raw +.RS 4 +Send raw PNG to stdout +.br +Valid for subcommands: full, gui, screen +.RE +. +.PP +\-\-region +.RS 4 +Screenshot region to select +.br +Valid for subcommands: full, gui, screen +.RE +. +.PP +\-s, \-\-showhelp +.RS 4 +Show the help message in the capture mode +.br +Valid for subcommands: config +.RE +. +.PP +\-t, \-\-trayicon +.RS 4 +Enable or disable the trayicon +.br +Valid for subcommands: config +.RE +. +.PP +\-u, \-\-upload +.RS 4 +Upload screenshot +.br +Valid for subcommands: full, gui, screen +.RE +. +.\"---------------------------------------------------------------------------- +.SH "EXAMPLE USAGE" +.PP +This section lists some of the most common usage of \fBflameshot\fR via +command line. +. +.TP +.B flameshot +Start flameshot and have it running in background. If enabled, +an icon will appear in the tray area of current desktop environment. +. +.TP +.B flameshot gui +Capture with GUI. +. +.TP +\fBflameshot gui\fR \-p /path/to/captures +Capture with GUI and custom save path. +. +.TP +\fBflameshot gui\fR \-d 2000 +Open GUI with a delay of 2 seconds. +. +.TP +.B flameshot launcher +Open a launcher dialog for advanced screenshot, such as custom +time delay, etc. +. +.TP +.B flameshot full \-\-help +Shows help for \fBflameshot full\fR subcommand. +. +.TP +\fBflameshot full\fR -p /path/to/captures -d 5000 +Fullscreen capture with custom save path (no GUI) and time delay. +. +.TP +\fBflameshot full\fR -c -p /path/to/captures +Fullscreen capture with custom savepath copying to clipboard. +. +.TP +\fBflameshot screen\fR \-\-number +Define the screen to capture. Will capture the screen containing the +cursor by default. +. +.TP +\fBflameshot screen\fR \-\-help +Shows help for \fBflameshot screen\fR subcommand. +. +.\"---------------------------------------------------------------------------- +.SH RETURN VALUE +Returns 0 on normal exit, 2 on screenshot aborted, 3 on dbus connection lost, 130 on SIGINT received, 143 on SIGTERM received. +. +.\"---------------------------------------------------------------------------- +.SH SEE ALSO +.PP +You may also find more detailed online documentation on upstream project homepage. +. +.HP +Upstream project homepage: +.br +• \m[blue]\fBhttps://flameshot.org\fR\m[] +.br +• \m[blue]\fBhttps://github.com/flameshot-org/flameshot\fR\m[] +. +.\"---------------------------------------------------------------------------- +.SH "AUTHOR" +.PP +.ad l +.B Flameshot +was initially written by +.MT izhe@\:hotmail.es +lupoDharkael +.ME +and is currently maintained by +Jeremy Borgman, +.MT byang@\:debian.org +Boyuan Yang +.ME , +Haris Gušić, +Ahmed Zetao Yang, +Mehrad Mahmoudian, +and +Martin Eckleben +(ordered based on number of contributions on the date of writing this manpage). +.br +The following URL gives you a more complete list of contributors: +.RS +\m[blue]\fBhttps://github.com/flameshot-org/flameshot/graphs/contributors\fR\m[]\&. +.RE +. +.\"---------------------------------------------------------------------------- +.SH "LICENSE" +.nh +.PP +• The main code is licensed under GPLv3 +.br +• The logo of Flameshot is licensed under Free Art License v1.3 +.br +• The button icons are licensed under Apache License 2.0. See: \m[blue]\fBhttps://github.com/google/material-design-icons\fR\m[] +.br +• The code at capture/capturewidget.cpp is based on \m[blue]\fBhttps://github.com/ckaiser/Lightscreen/blob/master/dialogs/areadialog.cpp\fR\m[] (GPLv2) +.br +• The code at capture/capturewidget.h is based on \m[blue]\fBhttps://github.com/ckaiser/Lightscreen/blob/master/dialogs/areadialog.h\fR\m[] (GPLv2) +.br +• Few lines of code from KSnapshot regiongrabber.cpp SVN revision 796531 (LGPL) +.br +• Qt-Color-Widgets taken and modified from \m[blue]\fBhttps://github.com/mbasaglia/Qt-Color-Widgets\fR\m[] (see their license and exceptions in the project) (LGPL/GPL) diff --git a/data/shell-completion/flameshot.bash b/data/shell-completion/flameshot.bash new file mode 100644 index 0000000..7b93433 --- /dev/null +++ b/data/shell-completion/flameshot.bash @@ -0,0 +1,78 @@ +#compdef flameshot + +# Shell completion for flameshot command +# To be installed in "/usr/share/bash-completion/completions/flameshot" +# and "/usr/share/zsh/site-functions/" + + +_flameshot() { + local prev cur cmd gui_opts full_opts config_opts + COMPREPLY=() + + prev="${COMP_WORDS[COMP_CWORD-1]}" + cur="${COMP_WORDS[COMP_CWORD]}" + cmd="gui full config launcher screen" + screen_opts="--number -n --path -p --clipboard -c --delay -d --region --raw -r --upload -u --pin --help" + gui_opts="--path -p --clipboard -c --delay -d --region --last-region --raw -r --print-geometry -g --upload -u --pin --accept-on-select -s --help" + full_opts="--path -p --clipboard -c --delay -d --region --raw -r --upload -u --help" + config_opts="--autostart -a --filename -f --notifications -n --trayicon -t --showhelp -s --maincolor -m --contrastcolor -k --check" + + case "${prev}" in + launcher) + return 0 + ;; + screen) + COMPREPLY=( $(compgen -W "$screen_opts --help -h" -- "${cur}") ) + return 0 + ;; + gui) + COMPREPLY=( $(compgen -W "$gui_opts --help -h" -- "${cur}") ) + return 0 + ;; + full) + COMPREPLY=( $(compgen -W "$full_opts --help -h" -- "${cur}") ) + return 0 + ;; + config) + COMPREPLY=( $(compgen -W "$config_opts --help -h" -- "${cur}") ) + return 0 + ;; + -f|--filename|-p|--path) + _filedir -d + return 0 + ;; + # TODO: We should see how we can add the -n (for `config --notifications`) here that does not conflict with -n (for `screen --number`) + -a|--autostart|-s|--showhelp|-t|--trayicon|--notifications) + COMPREPLY=( $(compgen -W "true false" -- "${cur}") ) + return 0 + ;; + -d|--delay|-h|--help|-c|--clipboard|--version|-v|--number|-n) + return 0 + ;; + *) + ;; + esac + + # Options + case "${cur}" in + -*) + COMPREPLY=( $( compgen -W "--version --help -v -h" -- "${cur}") ) + return 0 + ;; + --*) + COMPREPLY=( $( compgen -W "--version --help" -- "${cur}") ) + return 0 + ;; + *) + COMPREPLY=( $( compgen -W "${cmd}" -- "${cur}") ) + return 0 + ;; + esac +} + +if [[ -n ${ZSH_VERSION} ]]; then + autoload -U bashcompinit + bashcompinit +fi + +complete -F _flameshot flameshot diff --git a/data/shell-completion/flameshot.fish b/data/shell-completion/flameshot.fish new file mode 100644 index 0000000..5a4605a --- /dev/null +++ b/data/shell-completion/flameshot.fish @@ -0,0 +1,126 @@ + +#################### +# HELPER FUNCTIONS # +#################### + +# Complete the subcommand provided as the first argument. +# The rest of the arguments are the same as fish's `complete`. The option +# '-c flameshot' is implicit. +function __flameshot_complete --argument-names cmd + set -l conditions "__fish_seen_subcommand_from $cmd" + argparse -i "n/condition=" -- $argv[2..] + [ -n "$_flag_n" ] && set -l conditions "$conditions && $_flag_n" + complete -c flameshot $argv -n "$conditions" +end + +# Return success if the command line contains no positional arguments +function __flameshot_no_positional_args + set -l -- args (commandline -po) # cmdline broken up into list + set -l -- cmdline (commandline -p) # single string + set -l -- n (count $args) # number of cmdline tokens + for i in (seq 2 $n) + set -l arg $args[$i] + [ -z "$arg" ] && continue # can be caused by '--' argument + + # If the the last token is a positional argument and there is no + # trailing space, we ignore it + [ "$i" = "$n" ] && [ (string sub -s -1 "$cmdline") != ' ' ] && break + + if string match -rvq '^-' -- "$arg" # doesn't start with - + return 1 + end + end + # contains a '--' argument + string match -r -- '\s--\s' "$cmdline" && return 1 + return 0 +end + +# Complete paths matching $argv +function __flameshot_complete_paths + complete -C"nOnExIsTeNtCoMmAndZIOAGA2329jdbfaFkahDf21234h8z43 $argv" +end + +# Complete the region option +function __flameshot_complete_region --argument subcommand + if [ "$subcommand" = "screen" ] + echo all\tCapture entire screen + else + echo all\tCapture all screens + echo screen0\tCapture screen 0 + echo screen1\tCapture screen 1 + echo screen2\tCapture screen 2 + echo screen3\tCapture screen 3 + end + echo WxH+X+Y\tCustom region in pixels +end + +# Complete screen numbers +function __flameshot_complete_screen_number + echo 0\tScreen 0 + echo 1\tScreen 1 + echo 2\tScreen 2 + echo 3\tScreen 3 +end + +############### +# COMPLETIONS # +############### + +# define the subcommands +set -l SUBCOMMANDS gui screen full launcher config + +# No subcommand +complete -c flameshot --no-files --arguments "$SUBCOMMANDS" --condition __flameshot_no_positional_args +complete -c flameshot --long-option "help" --short-option "h" --description "Display help message" --no-files +complete -c flameshot --long-option "version" --short-option "v" --description "Display version information" --no-files --condition __flameshot_no_positional_args + +# GUI subcommand +__flameshot_complete gui --no-files +__flameshot_complete gui --long-option "path" --short-option "p" --description "Output file or directory" --require-parameter +__flameshot_complete gui --long-option "clipboard" --short-option "c" --description "Copy screenshot to the clipboard" --no-files +__flameshot_complete gui --long-option "delay" --short-option "d" --description "Delay time in milliseconds" --require-parameter --no-files +__flameshot_complete gui --long-option "region" --description "Screenshot region to select (WxH+X+Y)" --require-parameter --arguments "(__flameshot_complete_region gui)" +__flameshot_complete gui --long-option "last-region" --description "Repeat screenshot with previously selected region" --no-files +__flameshot_complete gui --long-option "raw" --short-option "r" --description "Print raw PNG capture" --no-files +__flameshot_complete gui --long-option "print-geometry" --short-option "g" --description "Print geometry of the selection" --no-files +__flameshot_complete gui --long-option "upload" --short-option "u" --description "Upload the screenshot" --no-files +__flameshot_complete gui --long-option "pin" --description "Pin the screenshot to the screen" --no-files +__flameshot_complete gui --long-option "accept-on-select" --short-option "s" --description "Accept capture as soon as a selection is made" --no-files +__flameshot_complete gui --long-option "help" --short-option "h" --description "Show the available arguments" --no-files + +# SCREEN subcommand +__flameshot_complete screen --no-files +__flameshot_complete screen --long-option "number" --short-option "n" --description "Screen number (starting from 0)" --require-parameter --no-files --arguments "(__flameshot_complete_screen_number)" +__flameshot_complete screen --long-option "path" --short-option "p" --description "Output file or directory" --require-parameter +__flameshot_complete screen --long-option "clipboard" --short-option "c" --description "Copy screenshot to the clipboard" --no-files +__flameshot_complete screen --long-option "delay" --short-option "d" --description "Delay time in milliseconds" --require-parameter --no-files +__flameshot_complete screen --long-option "region" --description "Screenshot region to select (WxH+X+Y)" --require-parameter --no-files --arguments "(__flameshot_complete_region screen)" +__flameshot_complete screen --long-option "raw" --short-option "r" --description "Print raw PNG capture" --no-files +__flameshot_complete screen --long-option "upload" --short-option "u" --description "Upload the screenshot" --no-files +__flameshot_complete screen --long-option "pin" --description "Pin the screenshot to the screen" --no-files +__flameshot_complete screen --long-option "help" --short-option "h" --description "Show the available arguments" --no-files + +# FULL command +__flameshot_complete full --no-files +__flameshot_complete full --long-option "path" --short-option "p" --description "Output file or directory" --require-parameter +__flameshot_complete full --long-option "clipboard" --short-option "c" --description "Copy screenshot to the clipboard" --no-files +__flameshot_complete full --long-option "delay" --short-option "d" --description "Delay time in milliseconds" --require-parameter --no-files +__flameshot_complete full --long-option "region" --description "Screenshot region to select (WxH+X+Y)" --require-parameter --no-files --arguments "(__flameshot_complete_region full)" --keep-order +__flameshot_complete full --long-option "raw" --short-option "r" --description "Print raw PNG capture" --no-files +__flameshot_complete full --long-option "upload" --short-option "u" --description "Upload the screenshot" --no-files +__flameshot_complete full --long-option "help" --short-option "h" --description "Show the available arguments" --no-files + +# LAUNCHER command +__flameshot_complete launcher --no-files + +# CONFIG command +__flameshot_complete config --no-files +__flameshot_complete config --long-option "autostart" --short-option "a" --description "Enable or disable run at startup" --require-parameter --no-files --arguments "true false" +__flameshot_complete config --long-option "filename" --short-option "f" --description "Set the filename pattern" --require-parameter --no-files +__flameshot_complete config --long-option "notification" --short-option "n" --description "Enable or disable the notification" --require-parameter --no-files --arguments "true false" +__flameshot_complete config --long-option "trayicon" --short-option "t" --description "Enable or disable the tray icon" --require-parameter --no-files --arguments "true false" +__flameshot_complete config --long-option "showhelp" --short-option "s" --description "Show the help message in the capture mode" --require-parameter --no-files --arguments "true false" +__flameshot_complete config --long-option "maincolor" --short-option "m" --description "Define the main UI color (hexadecimal)" --require-parameter --no-files +__flameshot_complete config --long-option "contrastcolor" --short-option "k" --description "Define the contrast UI color (hexadecimal)" --require-parameter --no-files +__flameshot_complete config --long-option "check" --description "Check the configuration for errors" --no-files +__flameshot_complete config --long-option "help" --short-option "h" --description "Show the available arguments" --no-files diff --git a/data/shell-completion/flameshot.zsh b/data/shell-completion/flameshot.zsh new file mode 100644 index 0000000..c65f4b5 --- /dev/null +++ b/data/shell-completion/flameshot.zsh @@ -0,0 +1,162 @@ +#compdef flameshot +# ------------------------------------------------------------------------------ +# Description +# ----------- +# +# Completion script for the flameshot command line interface +# (https://github.com/flameshot-org/flameshot). +# +# ------------------------------------------------------------------------------ +# How to use +# ------- +# +# Copy this file to /usr/share/zsh/site-functions/_flameshot +# + + +# gui + +_flameshot_gui_opts=( + {-p,--path}'[Existing directory or new file to save to]':dir:_files + {-c,--clipboard}'[Save the capture to the clipboard]' + {-d,--delay}'[Delay time in milliseconds]' + "--region[Screenshot region to select ]" + "--last-region[Repeat screenshot with previously selected region]" + {-r,--raw}'[Print raw PNG capture]' + {-g,--print-geometry}'[Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified]' + {-u,--upload}'[Upload screenshot]' + "--pin[Pin the capture to the screen]" + {-s,--accept-on-select}'[Accept capture as soon as a selection is made]' + {-h,--help}'[Show the available arguments]' +) + +_flameshot_gui() { + _arguments -s : \ + "$_flameshot_gui_opts[@]" +} + + +# screen + +_flameshot_screen_opts=( + {-n,--number}'[Define the screen to capture (starting from 0). Default: screen containing the cursor]' + {-p,--path}'[Existing directory or new file to save to]':dir:_files + {-c,--clipboard}'[Save the capture to the clipboard]' + {-d,--delay}'[Delay time in milliseconds]' + "--region[Screenshot region to select ]" + {-r,--raw}'[Print raw PNG capture]' + {-u,--upload}'[Upload screenshot]' + "--pin[Pin the capture to the screen]" + {-h,--help}'[Show the available arguments]' +) + +_flameshot_screen() { + _arguments -s : \ + "$_flameshot_screen_opts[@]" +} + + +# full + +_flameshot_full_opts=( + {-p,--path}'[Existing directory or new file to save to]':dir:_files + {-c,--clipboard}'[Save the capture to the clipboard]' + {-d,--delay}'[Delay time in milliseconds]' + "--region[Screenshot region to select ]" + {-r,--raw}'[Print raw PNG capture]' + {-u,--upload}'[Upload screenshot]' + {-h,--help}'[Show the available arguments]' +) + +_flameshot_full() { + _arguments -s : \ + "$_flameshot_full_opts[@]" +} + + +# config + +_flameshot_config_opts=( + {-a,--autostart}'[Enable or disable run at startup (true/false)]' + {-f,--filename}'[Set the filename pattern]' + {-n,--notification}'[Enable or disable the notification (true/false)]' + {-t,--trayicon}'[Enable or disable the tray icon (true/false)]' + {-s,--showhelp}'[Show the help message in the capture mode (true/false)]' + {-m,--maincolor}'[Define the main UI color (hexadecimal)]' + {-k,--contrastcolor}'[Define the contrast UI color (hexadecimal)]' + "--check[Check the configuration for errors]" + {-h,--help}'[Show the available arguments]' +) + +_flameshot_config() { + _arguments -s : \ + "$_flameshot_config_opts[@]" +} + + +# Main handle +_flameshot() { + local curcontext="$curcontext" ret=1 + local -a state line commands + + commands=( + "gui:Start the manual capture in GUI mode" + "screen:Capture a single screen (one monitor)" + "full:Capture the entire desktop (all monitors)" + "launcher:Open the capture launcher" + "config:Configure Flameshot" + ) + + _arguments -C -s -S -n \ + '(- 1 *)'{-v,--version}"[display version information]: :->full" \ + '(- 1 *)'{-h,--help}'[[display usage information]: :->full' \ + '1:cmd:->cmds' \ + '*:: :->args' && ret=0 + + case "$state" in + (cmds) + _describe -t commands 'commands' commands + ;; + (args) + local cmd + cmd=$words[1] + case "$cmd" in + (gui) + _flameshot_gui && ret=0 + ;; + (screen) + _flameshot_screen && ret=0 + ;; + (full) + _flameshot_full && ret=0 + ;; + (config) + _flameshot_config && ret=0 + ;; + (*) + _default && ret=0 + ;; + esac + ;; + (*) + ;; + esac + + return ret +} + +_flameshot + +# +# Editor modelines - https://www.wireshark.org/tools/modelines.html +# +# Local variables: +# mode: sh +# c-basic-offset: 4 +# tab-width: 4 +# indent-tabs-mode: nil +# End: +# +# vi: set filetype=zsh shiftwidth=4 tabstop=4 expandtab: +# :indentSize=4:tabSize=4:noTabs=true: +# diff --git a/data/snap/snapcraft.yaml b/data/snap/snapcraft.yaml new file mode 100644 index 0000000..9bed088 --- /dev/null +++ b/data/snap/snapcraft.yaml @@ -0,0 +1,108 @@ +--- + +name: flameshot +adopt-info: flameshot +base: core18 +summary: Powerful yet simple to use screenshot software +description: | + A powerful open source screenshot and annotation tool for Linux, Flameshot + has a varied set of markup tools available, which include Freehand drawing, + Lines, Arrows, Boxes, Circles, Highlighting, Blur. Additionally, you can + customise the color, size and/or thickness of many of these image annotation + tools. +grade: stable # must be 'stable' to release into candidate/stable channels +confinement: strict # use 'strict' once you have the right plugs and slots +#confinement: devmode # use 'strict' once you have the right plugs and slots +architectures: + - build-on: amd64 + - build-on: i386 + + +apps: + flameshot: + command: flameshot + desktop: usr/share/applications/org.flameshot.Flameshot.desktop + extensions: + - kde-neon + environment: + DISABLE_WAYLAND: 1 + XDG_DATA_DIRS: $SNAP/share:$XDG_DATA_DIRS + QT_QPA_PLATFORMTHEME: gtk3 + slots: [dbus-flameshot] + plugs: + - kde-frameworks-5-plug + - home + - removable-media + - network + - network-bind + - opengl + - pulseaudio + - wayland + - unity7 + - x11 + +parts: + flameshot: + build-snaps: + - kde-frameworks-5-core18-sdk + - kde-frameworks-5-core18 + - cmake #core18 does not have new enough cmake so install from snap + plugin: cmake + configflags: + - '-DCMAKE_BUILD_TYPE=RelWithDebInfo' + - '-DCMAKE_INSTALL_PREFIX=/usr' + - '-DUSE_LAUNCHER_ABSOLUTE_PATH:BOOL=OFF' + source: https://github.com/flameshot-org/flameshot.git + source-type: git + override-pull: | + snapcraftctl pull + last_committed_tag="$(git tag -l --sort=-v:refname | head -1)" + git_revno="$(git rev-list $(git describe --tags --abbrev=0)..HEAD --count)" + git_hash="$(git rev-parse --short HEAD)" + snapcraftctl set-version "${last_committed_tag}+git${git_revno}.${git_hash}" + override-build: | + snapcraftctl build + # Correct the Icon path + sed -i 's|^Exec=flameshot|Exec=/snap/bin/org.flameshot.Flameshot|' ${SNAPCRAFT_PART_INSTALL}/usr/share/applications/org.flameshot.Flameshot.desktop + sed -i 's|^Icon=.*|Icon=${SNAP}/usr/share/icons/hicolor/scalable/apps/org.flameshot.Flameshot.svg|' ${SNAPCRAFT_PART_INSTALL}/usr/share/applications/org.flameshot.Flameshot.desktop + sed -i 's/^\(Name\(\[.\+\]\)\?=.*\)$/\1 (Snappy Edition)/g' ${SNAPCRAFT_PART_INSTALL}/usr/share/applications/org.flameshot.Flameshot.desktop + build-packages: + - g++ + - make + - qt5-default + - qttools5-dev-tools + - libqt5svg5-dev + stage-packages: + - dbus-x11 + - libgtk2.0-0 + - openssl + - ca-certificates + - qtwayland5 + - libqt5dbus5 + - libqt5network5 + - libqt5core5a + - libqt5widgets5 + - libqt5gui5 + - libqt5svg5 + - libxkbcommon0 + - ttf-ubuntu-font-family + - dmz-cursor-theme + - light-themes + - adwaita-icon-theme + - gnome-themes-standard + - shared-mime-info + - libgdk-pixbuf2.0-0 + prime: + # libquazip5-1 pulls in Qt5 from bionic as a dependency. We don't + # want it in our snap, however, because we get a newer Qt5 from the + # kde-kf5 platform snap. + - "-usr/lib/x86_64-linux-gnu/libQt5*" + - "-usr/lib/x86_64-linux-gnu/libqt5*" +slots: + # Depending on in which environment we're running we either need + # to use the system or session DBus so we also need to have one + # slot for each. + dbus-flameshot: + interface: dbus + bus: session + name: org.flameshot.Flameshot diff --git a/data/translations/Internationalization_ar.ts b/data/translations/Internationalization_ar.ts new file mode 100644 index 0000000..c4d6ed3 --- /dev/null +++ b/data/translations/Internationalization_ar.ts @@ -0,0 +1,3156 @@ + + + + + AbstractWidgetList + + + Add New + + + + + Move Up + + + + + Move Down + + + + + Remove + + + + + AcceptTool + + + Accept + + + + + Accept the capture + + + + + AppLauncher + + + App Launcher + + + + + Choose an app to open the capture + + + + + AppLauncherWidget + + + Open With + + + + + Launch in terminal + + + + + Keep open after selection + + + + + + Error + + + + + Unable to launch in terminal. + + + + + Unable to write in + + + + + ArrowTool + + + Arrow + + + + + Set the Arrow as the paint tool + + + + + BlurTool + + Blur + Desenfocament + + + Set Blur as the paint tool + Estableix el desenfocament com a eina de dibuix + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Mode de captura</b> + + + + Rectangular Region + + + + + Full Screen (Current Display) + + + + + Full Screen (All Monitors) + + + + + No Delay + + + + + second + + + + + + + seconds + + + + + + Take new screenshot + + + + + + Area: + + + + + + Capture Launcher + + + + + + TextLabel + + + + + + Capture Mode + + + + + + Delay: + + + + + + WxH+x+y + + + + + CaptureWidget + + + Unable to capture screen + Impossible capturar la pantalla + + + + + Mouse + + + + + Select screenshot area + + + + + Mouse Wheel + Roda del ratolí + + + + Change tool size + + + + + Right Click + Clic dret + + + + Show color picker + Mostra el selector de color + + + + Open side panel + + + + + Esc + + + + + Exit + Surt + + + + Quit Capture + + + + + Are you sure you want to quit capture? + + + + + Do not show this again + + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Escolliu una àrea amb el ratolí, o premeu Esc per sortir. +Premeu Entrar per capturar la pantalla. +Premeu clic dret per mostrar l'eina de selecció de color. +Gireu la rodeta del ratolí per canviar el gruix de l'eina de dibuix. +Premeu Espai per obrir el calaix lateral. + + + + Tool Settings + + + + + CircleCountTool + + + Circle Counter + + + + + Add an autoincrementing counter bubble + + + + + CircleTool + + + Circle + + + + + Set the Circle as the paint tool + + + + + ColorDialog + + + + Select Color + + + + + + Saturation + + + + + + Hue + + + + + + Hex + + + + + + Blue + + + + + + Value + + + + + + Green + + + + + + Alpha + + + + + + Red + + + + + ColorGrabWidget + + + Accept color + + + + + Enter or Left Click + + + + + Precisely select color + + + + + Hold Left Click + + + + + Toggle magnifier + + + + + Space or Right Click + + + + + Cancel + + + + + Esc + Esc + + + + ColorPickerEditor + + + Edit Preset: + + + + + Enter color to update preset + + + + + Update + Update + + + + Press button to update the selected preset + + + + + Delete + + + + + Press button to delete the selected preset + + + + + Add Preset: + + + + + Enter color manually or select it using the color-wheel + + + + + Add + + + + + Press button to add preset + + + + + + Error + Error + + + + Unable to add preset. Maximum limit reached. + + + + + Unable to remove preset. Minimum limit reached. + + + + + ConfigErrorDetails + + + Configuration errors + + + + + ConfigHandler + + + Unrecognized setting: '%1' + + + + + + Unrecognized shortcut name: '%1'. + + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + + + + + Bad value in '%1'. Expected: %2 + + + + + + You have successfully resolved the configuration error. + + + + + The configuration contains an error. Open configuration to resolve. + + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + + + + + ConfigResolver + + + Resolve configuration errors + + + + + <b>You must resolve all errors before continuing:</b> + + + + + Reset + + + + + Reset to the default value. + + + + + Remove + + + + + Remove this setting. + + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + + + + + Resolve all + + + + + Resolve all listed errors. + + + + + Details + + + + + ConfigWindow + + + Configuration + + + + + Interface + + + + + Filename Editor + + + + + General + + + + + Shortcuts + + + + + Resolve + + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + + + + + Controller + + New version %1 is available + La nova versió %1 ja és disponible + + + You have the latest version + Teniu la versió més recent + + + Failed to get information about the latest version. + Error a l'intentar obtenir informació sobre actualitzacions. + + + Error + Error + + + Unable to close active modal widgets + No s'han pogut tancar els widgets modals actius + + + &Open Launcher + &Obre el llançador d'aplicacions + + + &Configuration + &Ajustaments + + + &About + &Quant a + + + Check for updates + Comprova si hi ha actualitzacions disponibles + + + &Latest Uploads + &Últimes càrregues + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + &Information + &Informació + + + &Quit + &Surt + + + &Take Screenshot + &Captura + + + + CopyTool + + + Copy + + + + + Copy selection to clipboard + + + + Copy the selection into the clipboard + Copia la selecció al porta-retalls + + + + DBusUtils + + Unable to connect via DBus + No s'ha pogut connectar mitjançant DBus + + + + ExitTool + + + Exit + + + + + Leave the capture screen + + + + + FileNameEditor + + + Edit the name of your captures: + + + + + Edit: + + + + + Preview: + + + + + Save + + + + + Saves the pattern + + + + + Restore + + + + Reset + Reinicialitza + + + + Restores the saved pattern + + + + + Clear + + + + + Deletes the name + + + + + Flameshot + + + Error + Error + + + + Unable to close active modal widgets + No s'han pogut tancar els widgets modals actius + + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + + FlameshotDaemon + + + New version %1 is available + La nova versió %1 ja és disponible + + + + You have the latest version + Teniu la versió més recent + + + + Failed to get information about the latest version. + Error a l'intentar obtenir informació sobre actualitzacions. + + + + Unable to connect via DBus + + + + + GeneneralConf + + Show help message + Mostra el missatge d'ajuda + + + Show the help message at the beginning in the capture mode. + Mostra el missatge d'ajuda en iniciar el mode de captura. + + + Show desktop notifications + Mostra les notificacions d'escriptori + + + Show tray icon + Mostra la icona en la barra de tasques + + + Show the systemtray icon + Mostra la icona en la barra de tasques + + + Import + Importar + + + Error + Error + + + Unable to read file. + Impossible llegir el fitxer. + + + Unable to write file. + Impossible escriure al fitxer. + + + Save File + Guardar Arxiu + + + Confirm Reset + Confirmar Reset + + + Are you sure you want to reset the configuration? + Esteu segur que voleu reiniciar la configuració? + + + Configuration File + Fitxer de Configuració + + + Export + Exportar + + + Reset + Reset + + + Launch at startup + Llançament a l'inici + + + + GeneralConf + + + + Import + + + + + + + + Error + Error + + + + Unable to read file. + + + + + + Unable to write file. + + + + + Save File + + + + + Confirm Reset + + + + + Are you sure you want to reset the configuration? + + + + + Show help message + Mostra el missatge d'ajuda + + + Show the help message at the beginning in the capture mode. + Mostra el missatge d'ajuda en iniciar el mode de captura. + + + + Show the side panel button + + + + Show the side panel toggle button in the capture mode. + Mostra el botó del calaix lateral en el mode de captura. + + + + Show desktop notifications + Mostra les notificacions d'escriptori + + + + Show tray icon + + + + Show the systemtray icon + Mostra la icona a la barra de tasques del sistema + + + + Confirmation required to delete screenshot from the latest uploads + + + + + Configuration File + + + + + Export + + + + + Reset + + + + + Automatic check for updates + + + + + Allow multiple flameshot GUI instances simultaneously + + + + This allows you to take screenshots of flameshot itself for example. + This allows you to take screenshots of flameshot itself for example. + + + Automatically close daemon when it is not needed + Automatically close daemon when it is not needed + + + Launch at startup + Llança a l'inici + + + Launch Flameshot + Inicia el Flameshot + + + + Show welcome message on launch + + + + + Use large predefined color palette + + + + + Copy URL after upload + + + + Copy URL and close window after upload + Copia la URL i tanca la finestra després de la càrrega + + + + Save image after copy + + + + Save image file after copying it + Desa el fitxer d'imatge després d'haver-lo copiat + + + + Show the help message at the beginning in the capture mode + + + + + Use last region for GUI mode + Use last region for GUI mode + + + + Use the last region as the default selection for the next screenshot in GUI mode + Use the last region as the default selection for the next screenshot in GUI mode + + + + Show the side panel toggle button in the capture mode + + + + + Enable desktop notifications + + + + + Show abort notifications + + + + + Enable abort notifications + + + + + Show icon in the system tray + + + + + Use grim to capture screenshots + + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + + + + + Ask for confirmation to delete screenshot from the latest uploads + + + + + Check for updates automatically + + + + + This allows you to take screenshots of Flameshot itself for example + + + + Launch Flameshot daemon when computer is booted + Launch Flameshot daemon when computer is booted + + + + Show the welcome message box in the middle of the screen while taking a screenshot + + + + + Use a large predefined color palette + + + + + Copy on double click + + + + Enable Copy on Double Click + Enable Copy on Double Click + + + Copy URL and close window after uploading was successful + Copy URL and close window after uploading was successful + + + + Automatically unload from memory when it is not needed + + + + + Automatically close daemon (background process) when it is not needed + + + + + Launch in background at startup + + + + + Launch Flameshot daemon (background process) when computer is booted + + + + + Ask before quit capture + + + + + Show the confirmation prompt before ESC quit + + + + + Enable Copy to clipboard on Double Click + + + + + Copy URL after uploading was successful + + + + + After copying the screenshot, save it to a file as well + + + + + Save Path + + + + + Change... + + + + + Use fixed path for screenshots to save + + + + + Preferred save file extension: + + + + + Latest Uploads Max Size + + + + + Imgur Application Client ID + + + + + Undo limit + + + + + Use JPG format for clipboard (PNG default) + + + + + Use lossy JPG format for clipboard (lossless PNG default) + + + + + Copy file path after save + + + + + Copy the file path to clipboard after the file is saved + + + + + Anti-aliasing image when zoom the pinned image + + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + + + + + + Upload image without confirmation + + + + + Choose a Folder + + + + + Unable to write to directory. + + + + + Show magnifier + + + + + Enable a magnifier while selecting the screenshot area + + + + + Square shaped magnifier + + + + + Make the magnifier to be square-shaped + + + + + Milliseconds before geometry display hides; 0 means do not hide + + + + + Set geometry display timeout (ms) + + + + + Selection Geometry Display + + + + + Display Location + + + + + None + + + + + Top Left + + + + + Top Right + + + + + Bottom Left + + + + + Bottom Right + + + + + Center + + + + + Quality range of 0-100; Higher number is better quality and larger file size + + + + + JPEG Quality + + + + + Reverse arrow + + + + + Draw the arrow head first + + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + Últimes càrregues + + + Screenshots history is empty + L'historial de captures de pantalla és buit + + + Copy URL + Copia l'URL + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Open in browser + Obre al navegador + + + Confirm to delete + Confirmeu per esborrar + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Esteu segur de voler esborrar la captura de les últimes càrregues i del servidor? + + + + ImgS3Uploader + + Uploading Image + S'està pujant la imatge + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Error + Error + + + + ImgUploadDialog + + + Upload Confirmation + + + + + Do you want to upload this capture? + + + + + + Upload without confirmation + + + + + ImgUploader + + Uploading Image + S'està pujant la imatge + + + Delete image + Esborra la imatge + + + Unable to open the URL. + No es pot obrir l'URL. + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + Copy URL + Copia l'URL + + + Open URL + Obri l'URL + + + Image to Clipboard. + Imatge al porta-retalls. + + + + ImgUploaderBase + + + Upload image + + + + + Uploading Image + S'està pujant la imatge + + + + Copy URL + Copia l'URL + + + + Open URL + + + + + Delete image + Esborra la imatge + + + + Image to Clipboard. + Imatge al porta-retalls. + + + + Save image + + + + + Unable to open the URL. + + + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + + Unable to save the screenshot to disk. + + + + + Screenshot saved. + + + + + ImgUploaderTool + + + Image Uploader + Puja la imatge + + + + Upload the selection + + + + + ImgurUploader + + Upload to Imgur + Puja a Imgur + + + Uploading Image + S'està pujant la imatge + + + Copy URL + Copia l'URL + + + Open URL + Obre l'URL + + + Delete image + Esborra la imatge + + + Image to Clipboard. + Imatge al porta-retalls. + + + + Unable to open the URL. + + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + + ImgurUploaderTool + + Image Uploader + Puja la imatge + + + Upload the selection to Imgur + Puja la selecció a Imgur + + + + InfoWindow + + + + About + + + + + + Icon + + + + + + License + + + + + + GPLv3+ + + + + + + Version + + + + + + Flameshot v + + + + + + OS Info + + + + + + Copy Info + + + + Right Click + Clic dret + + + Mouse Wheel + Roda del ratolí + + + Move selection 1px + Mou la selecció 1 px + + + Resize selection 1px + Redimensiona la selecció 1 px + + + Quit capture + Ix de la captura + + + Copy to clipboard + Copia al porta-retalls + + + Save selection as a file + Guarda la selecció com a fitxer + + + Undo the last modification + Desfés l'última modificació + + + Show color picker + Mostra el selector de color + + + Change the tool's thickness + Canvia el gruix de l'eina + + + Key + Tecla + + + Description + Descripció + + + <u><b>License</b></u> + <u><b>Llicència</b></u> + + + <u><b>Version</b></u> + <u><b>Versió</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Dreceres</b></u> + + + Available shortcuts in the screen capture mode. + Dreceres disponibles en el mode de captura de pantalla. + + + + InvertTool + + + Invert + + + + + Set Inverter as the paint tool + + + + + LineTool + + + Line + + + + + Set the Line as the paint tool + + + + + MarkerTool + + + Marker + + + + + Set the Marker as the paint tool + + + + + MoveTool + + + Move + + + + + Move the selection area + + + + + PencilTool + + + Pencil + + + + + Set the Pencil as the paint tool + + + + + PinTool + + + Pin Tool + + + + + Pin image on the desktop + + + + + PinWidget + + + Context menu + + + + + Copy to clipboard + Copia al porta-retalls + + + + Save to file + + + + + Rotate Right + + + + + Rotate Left + + + + + Increase Opacity + + + + + Decrease Opacity + + + + + Close + Close + + + + PixelateTool + + + Pixelate + + + + + Set Pixelate as the paint tool. + + + + Set Pixelate as the paint tool + Estableix l'eina de pixel·lament com a eina de dibuix + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QHotkey + + Failed to register %1. Error: %2 + No s'ha pogut registrar %1. Error: %2 + + + Failed to unregister %1. Error: %2 + No s'ha pogut desregistrar %1. Error: %2 + + + + QObject + + + + Capture saved to clipboard. + + + + + Error while saving to clipboard + + + + + Save screenshot + + + + + Path copied to clipboard as + + + + Saving canceled + Saving canceled + + + Save canceled + Save canceled + + + Capture is saved and copied to the clipboard as + La captura serà desada i copiada al porta-retalls com a + + + + Save Error + + + + + + Capture saved as + + + + + + Error trying to save as + + + + + Unable to connect via DBus + + + + + Powerful yet simple to use screenshot software. + + + + + See + + + + Capture the entire desktop. + Captureu l'escriptori sencer. + + + + Open the capture launcher. + + + + + Start a manual capture in GUI mode. + + + + + Configure + + + + Capture a single screen. + Captura una sola pantalla. + + + Path where the capture will be saved + Camí on es desarà la captura + + + + Capture screenshot of all monitors at the same time. + + + + + Capture a screenshot of the specified monitor. + + + + + Existing directory or new file to save to + + + + + Save the capture to the clipboard + + + + + Pin the capture to the screen + + + + + Upload screenshot + + + + + Delay time in milliseconds + + + + + Repeat screenshot with previously selected region + + + + + Screenshot region to select + + + + + Set the filename pattern + + + + + Accept capture as soon as a selection is made + + + + + Enable or disable the trayicon + + + + + Enable or disable run at startup + + + + + Enable or disable the notifications + + + + + Check the configuration for errors + + + + + Show the help message in the capture mode + + + + + Define the main UI color + + + + + Define the contrast UI color + + + + + Print raw PNG capture + + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + + + + + Define the screen to capture (starting from 0) + + + + + Invalid delay, it must be a number greater than 0 + + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + + + + + Invalid path, must be an existing directory or a new file in an existing directory + + + + Define the screen to capture + Define the screen to capture + + + + default: screen containing the cursor + + + + + Screen number + + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + + + + Invalid delay, it must be higher than 0 + Invalid delay, it must be higher than 0 + + + + Invalid screen number, it must be non negative + + + + Invalid path, it must be a real path in the system + Invalid path, it must be a real path in the system + + + + Invalid value, it must be defined as 'true' or 'false' + + + + + Error + Error + + + + Unable to write in + No es pot escriure a + + + + Requested screen exceeds screen count + + + + + Full screen screenshot pinned to screen + + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + + Options + + + + Arguments + Arguments + + + arguments + arguments + + + + Subcommands + + + + + subcommands + + + + + Usage + + + + + options + + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + + + + Toggle side panel + Toggle side panel + + + Resize selection left 1px + Resize selection left 1px + + + Resize selection right 1px + Resize selection right 1px + + + Resize selection up 1px + Resize selection up 1px + + + Resize selection down 1px + Resize selection down 1px + + + Select entire screen + Select entire screen + + + Move selection left 1px + Move selection left 1px + + + Move selection right 1px + Move selection right 1px + + + Move selection up 1px + Move selection up 1px + + + Move selection down 1px + Move selection down 1px + + + Commit text in text area + Commit text in text area + + + Delete current tool + Delete current tool + + + + Quit capture + Ix de la captura + + + + Screenshot history + + + + + Capture screen + + + + + Show color picker + Mostra el selector de color + + + + Change the tool's size + + + + Change the tool's thickness + Canvia el gruix de l'eina + + + + RectangleTool + + + Rectangle + + + + + Set the Rectangle as the paint tool + + + + + RedoTool + + + Redo + + + + + Redo the next modification + + + + + SaveTool + + + Save + + + + + Save screenshot to a file + + + + Save the capture + Guarda la captura + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + + + + + Unable to capture screen + Imposible capturar la pantalla + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + + + + + Set Selection as the paint tool + + + + + SetShortcutDialog + + + Set Shortcut + + + + + Enter new shortcut to change + + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + + + + + + Flameshot must be restarted for changes to take effect. + + + + + ShortcutsWidget + + + Hot Keys + + + + + Available shortcuts in the screen capture mode. + Dreceres disponibles en el mode de captura de pantalla. + + + + Description + Descripció + + + + Key + Tecla + + + + Left Double-click + + + + + Toggle side panel + Toggle side panel + + + + Grab a color from the screen + + + + + Resize selection left 1px + Resize selection left 1px + + + + Resize selection right 1px + Resize selection right 1px + + + + Resize selection up 1px + Resize selection up 1px + + + + Resize selection down 1px + Resize selection down 1px + + + + Symmetrically decrease width by 2px + + + + + Symmetrically increase width by 2px + + + + + Symmetrically increase height by 2px + + + + + Symmetrically decrease height by 2px + + + + + Select entire screen + Select entire screen + + + + Move selection left 1px + Move selection left 1px + + + + Move selection right 1px + Move selection right 1px + + + + Move selection up 1px + Move selection up 1px + + + + Move selection down 1px + Move selection down 1px + + + + Commit text in text area + Commit text in text area + + + + Delete selected drawn object + + + + + Cancel current selection + + + + Delete current tool + Delete current tool + + + + Capture screen + Capture screen + + + + Screenshot history + Screenshot history + + + + SidePanelWidget + + Active thickness: + Active thickness: + + + Active color: + Active color: + + + Press ESC to cancel + Press ESC to cancel + + + + Active tool size: + + + + + Active Color: + + + + + Grab Color + + + + + Display grid + + + + + SizeDecreaseTool + + + Decrease Tool Size + + + + + Decrease the size of the other tools + + + + + SizeIncreaseTool + + + Increase Tool Size + + + + + Increase the size of the other tools + + + + + SizeIndicatorTool + + Selection Size Indicator + Indicador de mida de selecció + + + Show X and Y dimensions of the selection + Show X and Y dimensions of the selection + + + Show the dimensions of the selection (X Y) + Mostra les mides de la selecció (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + + + + + Year (00-99) + + + + + Year (2000) + + + + + Month Name (jan) + + + + + Month Name (january) + + + + + Month (01-12) + + + + + Week Day (1-7) + + + + + Week (01-53) + + + + + Day Name (mon) + + + + + Day Name (monday) + + + + + Day (01-31) + + + + + Day of Month (1-31) + + + + + Day (001-366) + + + + + Hour (00-23) + + + + + Hour (01-12) + + + + + Minute (00-59) + + + + + Second (00-59) + + + + + Full Date (%m/%d/%y) + + + + + Full Date (%Y-%m-%d) + + + + + Full Date (%d-%m-%Y) + + + + + Time (%H-%M-%S) + + + + + Time (%H-%M) + + + + + SystemNotification + + + Flameshot Info + + + + + TextConfig + + + StrikeOut + + + + + Underline + + + + + Bold + + + + + Italic + + + + + Left Align + + + + + Center Align + + + + + Right Align + + + + + TextTool + + + Text + + + + + Add text to your capture + + + + + TrayIcon + + + &Take Screenshot + &Captura + + + + &Open Launcher + &Obre el llançador d'aplicacions + + + + &Configuration + &Ajustaments + + + + &About + &Quant a + + + + Check for updates + Comprova si hi ha actualitzacions disponibles + + + + New version %1 is available + La nova versió %1 ja és disponible + + + + &Quit + &Surt + + + + &Latest Uploads + &Últimes càrregues + + + + &Open Save Path + + + + + UIcolorEditor + + UI Color Editor + Editor de color de la interfície + + + + Change the color moving the selectors and see the changes in the preview buttons. + + + + + Select a Button to modify it + + + + + Main Color + + + + + Click on this button to set the edition mode of the main color. + + + + + Contrast Color + + + + + Click on this button to set the edition mode of the contrast color. + + + + + UndoTool + + + Undo + + + + + Undo the last modification + + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + + + + + Ignore + + + + + Later + + + + + Update + + + + + UploadHistory + + + Upload History + + + + + Screenshots history is empty + L'historial de captures de pantalla és buit + + + + UploadLineItem + + + Form + + + + + TextLabel + + + + + Copy URL + Copia l'URL + + + + Open In Browser + + + + + Confirm to delete + Confirmeu per esborrar + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Esteu segur de voler esborrar la captura de les últimes càrregues i del servidor? + + + + UtilityPanel + + + Close + + + + + <Empty> + + + + + VisualsEditor + + + Opacity of area outside selection: + + + + + UI Color Editor + Editor de color de la interfície + + + + Colorpicker Editor + + + + + Button Selection + + + + + Select All + + + + + color_widgets::ColorDialog + + + Pick + + + + + color_widgets::ColorPalette + + + Unnamed + + + + + color_widgets::ColorPaletteModel + + + Unnamed + + + + + %1 (%2 colors) + + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + + + + + + Create a new palette + + + + + + Duplicate the current palette + + + + + + Delete the current palette + + + + + + Revert changes to the current palette + + + + + + Save changes to the current palette + + + + + + Add a color to the palette + + + + + + Remove the selected color from the palette + + + + + + New Palette + + + + + + Name + + + + + GIMP Palettes (*.gpl) + + + + + Palette Image (%1) + + + + + All Files (*) + + + + + + Open Palette + + + + + Failed to load the palette file +%1 + + + + + color_widgets::GradientEditor + + + Add Color + + + + + Remove Color + + + + + Edit Color... + + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + + + + + color_widgets::Swatch + + + Clear Color + + + + + %1 (%2) + + + + diff --git a/data/translations/Internationalization_bg.ts b/data/translations/Internationalization_bg.ts new file mode 100644 index 0000000..ddb56a5 --- /dev/null +++ b/data/translations/Internationalization_bg.ts @@ -0,0 +1,3161 @@ + + + + + AbstractWidgetList + + + Add New + Добавяне + + + + Move Up + Нагоре + + + + Move Down + Надолу + + + + Remove + Премахване + + + + AcceptTool + + + Accept + Приемане + + + + Accept the capture + Приемане на заснетото + + + + AppLauncher + + + App Launcher + Стартиране на приложения + + + + Choose an app to open the capture + За да отворите снимката, изберете приложение + + + + AppLauncherWidget + + + Open With + Отваряне с + + + + Launch in terminal + Отваряне в терминал + + + + Keep open after selection + Оставяне работещо след избиране + + + + + Error + Грешка + + + + Unable to launch in terminal. + Грешка при отваряне на терминал. + + + + Unable to write in + Грешка при записване + + + + ArrowTool + + + Arrow + Стрелка + + + + Set the Arrow as the paint tool + Избиране на инструмент „Стрелка“ + + + + BlurTool + + Blur + Desenfocament + + + Set Blur as the paint tool + Estableix el desenfocament com a eina de dibuix + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Capture Mode</b> + + + + Rectangular Region + Правоъгълна област + + + + Full Screen (Current Display) + Целия екран (текущия монитор) + + + + Full Screen (All Monitors) + Целия екран (всички монитори) + + + + No Delay + Без изчакване + + + + second + секунда + + + + + + seconds + секунди + + + + + Take new screenshot + Ново заснемане + + + + + Area: + Област: + + + + + Capture Launcher + Започване на заснемане + + + + + TextLabel + TextLabel + + + + + Capture Mode + Режим на заснемане + + + + + Delay: + Изчакване: + + + + + WxH+x+y + Ш×В+x+y + + + + CaptureWidget + + + Unable to capture screen + Impossible capturar la pantalla + Грешка при заснемане на екрана + + + + Mouse + Мишка + + + + Select screenshot area + Избиране на заснеманата област + + + + Mouse Wheel + Колелце на мишката + + + + Change tool size + Промяна на размера на инструмента + + + + Right Click + Щракване с десен бутон + + + + Show color picker + Показване на палитра + + + + Open side panel + Отваряне на страничен панел + + + + Esc + Esc + + + + Exit + Изход + + + + Quit Capture + Изход от заснемане + + + + Are you sure you want to quit capture? + Желаете ли да напуснете заснемането? + + + + Do not show this again + Без повторно показване + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot загуби фокус. Клавишните комбинации няма да работят докато не щракнете с мишката някъде. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + Грешката в настройките е отстранена. Стартирайте отново `flameshot gui`, за да бъдат приети. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + + + + Tool Settings + Настройки на инструмента + + + + CircleCountTool + + + Circle Counter + Номериране + + + + Add an autoincrementing counter bubble + Добавяне на последователни числа в балонче + + + + CircleTool + + + Circle + Окръжност + + + + Set the Circle as the paint tool + Избиране на инструмент „Окръжност“ + + + + ColorDialog + + + + Select Color + Избиране на цвят + + + + + Saturation + Наситеност + + + + + Hue + Оттенък + + + + + Hex + Шестнадесетичен + + + + + Blue + Синьо + + + + + Value + Стойност + + + + + Green + Зелено + + + + + Alpha + Прозрачност + + + + + Red + Червено + + + + ColorGrabWidget + + + Accept color + Приемане на цвета + + + + Enter or Left Click + Enter или щракване с ляв бутон + + + + Precisely select color + Избиране на точен цвят + + + + Hold Left Click + Задържане на левия бутон + + + + Toggle magnifier + Превключване на лупата + + + + Space or Right Click + Интервал или щракване с десен бутон + + + + Cancel + Отказ + + + + Esc + Esc + + + + ColorPickerEditor + + + Edit Preset: + Променяне на елемента: + + + + Enter color to update preset + Въведете цвят, за да промените елемента + + + + Update + Обновяване + + + + Press button to update the selected preset + Натиснете бутона, за да обновите избрания елемент + + + + Delete + Премахване + + + + Press button to delete the selected preset + Натиснете бутона, за да премахнете избрания елемент + + + + Add Preset: + Добавяне на елемент: + + + + Enter color manually or select it using the color-wheel + Въведете цвят на ръка или изберете от цветния кръг + + + + Add + Добавяне + + + + Press button to add preset + Натиснете бутона, за да добавите елемент + + + + + Error + Грешка + + + + Unable to add preset. Maximum limit reached. + Грешка при добавяне на елемент. Достигнато е ограничението. + + + + Unable to remove preset. Minimum limit reached. + Грешка при премахване на елемент. Достигнато е ограничението. + + + + ConfigErrorDetails + + + Configuration errors + Грешки в настройките + + + + ConfigHandler + + + Unrecognized setting: '%1' + + Неизвестна настройки: „%1“ + + + + + Unrecognized shortcut name: '%1'. + + Непознато име клавишна комбинация: „%1“. + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + Клавишните комбинации на „%1“ и „%2“ съвпадат: %3 + + + + + Bad value in '%1'. Expected: %2 + + Невярна стойност „%1“. Очаквана: %2 + + + + + You have successfully resolved the configuration error. + Успешно сте отстранили грешка в настройките. + + + + The configuration contains an error. Open configuration to resolve. + Грешка в настройките. Отворете прозореца с настройки, за да я отстраните. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + Неверен ключ на настройка „%1“ в ConfigHandler. Съобщете за дефект. + + + + ConfigResolver + + + Resolve configuration errors + Отстраняване на грешки в настройките + + + + <b>You must resolve all errors before continuing:</b> + <b>Трябва да отстраните всички грешки преди да продължите:</b> + + + + Reset + Нулиране + + + + Reset to the default value. + Нулиране до подразбираната стойност. + + + + Remove + Премахване + + + + Remove this setting. + Премахва настройката. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + Няколко клавишни комбинации са в конфликт. +Това НЯМА да попречи да стартирате Flameshot. +Отстранете ръчно от файла с настройките. + + + + Resolve all + Отстраняване всички + + + + Resolve all listed errors. + Отстраняване на всички изброени грешки. + + + + Details + Подробности + + + + ConfigWindow + + + Configuration + Настройки + + + + Interface + Интерфейс + + + + Filename Editor + Име на файла + + + + General + Общи + + + + Shortcuts + Клавишни комбинации + + + + Resolve + Отстраняване + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>Файлът с настройките съдържа грешки. Отстранете ги преди да продължите.</b> + + + + Controller + + New version %1 is available + New version %1 is available + + + You have the latest version + You have the latest version + + + Failed to get information about the latest version. + Failed to get information about the latest version. + + + Error + Error + + + Unable to close active modal widgets + Unable to close active modal widgets + + + &Open Launcher + &Open Launcher + + + &Configuration + &Configuration + + + &About + &Относно + + + Check for updates + Check for updates + + + &Latest Uploads + &Latest Uploads + + + &Information + &Informació + + + &Quit + &Quit + + + &Take Screenshot + &Take Screenshot + + + + CopyTool + + + Copy + Копиране + + + + Copy selection to clipboard + Копиране на избраното + + + Copy the selection into the clipboard + Copy the selection into the clipboard + + + + DBusUtils + + Unable to connect via DBus + Unable to connect via DBus + + + + ExitTool + + + Exit + Изход + + + + Leave the capture screen + Излиза от екрана за заснемане + + + + FileNameEditor + + + Edit the name of your captures: + Задайте шаблон за името на заснетите изображения: + + + + Edit: + Шаблон: + + + + Preview: + Преглед: + + + + Save + Запазване + + + + Saves the pattern + Запазва шаблона + + + + Restore + Възстановяване + + + Reset + Reinicialitza + + + + Restores the saved pattern + Възстановява запазения шаблон + + + + Clear + Изчистване + + + + Deletes the name + Премахва името + + + + Flameshot + + + Error + Грешка + + + + Unable to close active modal widgets + Работещите приспособления не могат да бъдат затворени + + + + URL copied to clipboard. + Адресът е копиран. + + + + FlameshotDaemon + + + New version %1 is available + Налично е ново издание %1 + + + + You have the latest version + Използвате последното издание + + + + Failed to get information about the latest version. + Грешка при получаване на информация за последното издание. + + + + Unable to connect via DBus + Грешка при свързване чрез DBus + + + + GeneneralConf + + Show help message + Mostra el missatge d'ajuda + + + Show the help message at the beginning in the capture mode. + Mostra el missatge d'ajuda en iniciar el mode de captura. + + + Show desktop notifications + Mostra les notificacions d'escriptori + + + Show tray icon + Mostra la icona en la barra de tasques + + + Show the systemtray icon + Mostra la icona en la barra de tasques + + + Import + Importar + + + Error + Error + + + Unable to read file. + Impossible llegir el fitxer. + + + Unable to write file. + Impossible escriure al fitxer. + + + Save File + Guardar Arxiu + + + Confirm Reset + Confirmar Reset + + + Are you sure you want to reset the configuration? + Esteu segur que voleu reiniciar la configuració? + + + Configuration File + Fitxer de Configuració + + + Export + Exportar + + + Reset + Reset + + + Launch at startup + Llançament a l'inici + + + + GeneralConf + + + + Import + Внасяне + + + + + + + Error + Грешка + + + + Unable to read file. + Грешка при прочитане на файла. + + + + + Unable to write file. + Грешка при запис на файла. + + + + Save File + Запазване на файл + + + + Confirm Reset + Потвърждаване на нулиране + + + + Are you sure you want to reset the configuration? + Желаете ли настройките да бъдат нулирани? + + + + Show help message + Показване на помощно съобщение + + + Show the help message at the beginning in the capture mode. + Show the help message at the beginning in the capture mode. + + + + Show the side panel button + Показване на бутон за страничния панел + + + Show the side panel toggle button in the capture mode. + Show the side panel toggle button in the capture mode. + + + + Show desktop notifications + Показване на известия + + + + Show tray icon + Показване в лентата за известия + + + Show the systemtray icon + Show the systemtray icon + + + + Confirmation required to delete screenshot from the latest uploads + Потвърждаване при премахване на елемент от последно качените + + + + Configuration File + Файл с настройките + + + + Export + Изнасяне + + + + Reset + Нулиране + + + + Automatic check for updates + Проверка за обновяване + + + + Allow multiple flameshot GUI instances simultaneously + Разрешаване на няколко графични екземпляра на Flameshot + + + Automatically close daemon when it is not needed + Automatically close daemon when it is not needed + + + Launch at startup + Launch at startup + + + Launch Flameshot + Launch Flameshot + + + + Show welcome message on launch + Показване на приветствие при пускане + + + + Use large predefined color palette + Използване на голяма предварително зададена палитра + + + + Copy URL after upload + Копиране на адреса след качване + + + Copy URL and close window after upload + Copy URL and close window after upload + + + + Save image after copy + Запазване на изображението след копиране + + + Save image file after copying it + Save image file after copying it + + + + Show the help message at the beginning in the capture mode + Show the help message at the beginning in the capture mode + + + + Use last region for GUI mode + Използване на последната област в графичен режим + + + + Use the last region as the default selection for the next screenshot in GUI mode + Използване на последната избрана област като начална за следващата снимка в графичен режим + + + + Show the side panel toggle button in the capture mode + Show the side panel toggle button in the capture mode + + + + Enable desktop notifications + Enable desktop notifications + + + + Show abort notifications + Известия при прекратяване + + + + Enable abort notifications + Включване на известия при прекратяване + + + + Show icon in the system tray + Show icon in the system tray + + + + Use grim to capture screenshots + + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + + + + + Ask for confirmation to delete screenshot from the latest uploads + Ask for confirmation to delete screenshot from the latest uploads + + + + Check for updates automatically + Check for updates automatically + + + + This allows you to take screenshots of Flameshot itself for example + This allows you to take screenshots of Flameshot itself for example + + + Launch Flameshot daemon when computer is booted + Launch Flameshot daemon when computer is booted + + + + Show the welcome message box in the middle of the screen while taking a screenshot + Show the welcome message box in the middle of the screen while taking a screenshot + + + + Use a large predefined color palette + Use a large predefined color palette + + + + Copy on double click + Copy on double click + + + Enable Copy on Double Click + Enable Copy on Double Click + + + Copy URL and close window after uploading was successful + Copy URL and close window after uploading was successful + + + + Automatically unload from memory when it is not needed + + + + + Automatically close daemon (background process) when it is not needed + + + + + Launch in background at startup + + + + + Launch Flameshot daemon (background process) when computer is booted + + + + + Ask before quit capture + + + + + Show the confirmation prompt before ESC quit + + + + + Enable Copy to clipboard on Double Click + + + + + Copy URL after uploading was successful + + + + + After copying the screenshot, save it to a file as well + After copying the screenshot, save it to a file as well + + + + Save Path + Save Path + + + + Change... + Change... + + + + Use fixed path for screenshots to save + Use fixed path for screenshots to save + + + + Preferred save file extension: + Preferred save file extension: + + + + Latest Uploads Max Size + Latest Uploads Max Size + + + + Imgur Application Client ID + Imgur Application Client ID + + + + Undo limit + Undo limit + + + + Use JPG format for clipboard (PNG default) + Use JPG format for clipboard (PNG default) + + + + Use lossy JPG format for clipboard (lossless PNG default) + + + + + Copy file path after save + Copy file path after save + + + + Copy the file path to clipboard after the file is saved + Copy the file path to clipboard after the file is saved + + + + Anti-aliasing image when zoom the pinned image + Anti-aliasing image when zoom the pinned image + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + After zooming the pinned image, should the image get smoothened or stay pixelated + + + + + Upload image without confirmation + Upload image without confirmation + + + + Choose a Folder + Choose a Folder + + + + Unable to write to directory. + Unable to write to directory. + + + + Show magnifier + Show magnifier + + + + Enable a magnifier while selecting the screenshot area + Enable a magnifier while selecting the screenshot area + + + + Square shaped magnifier + Square shaped magnifier + + + + Make the magnifier to be square-shaped + Make the magnifier to be square-shaped + + + + Milliseconds before geometry display hides; 0 means do not hide + + + + + Set geometry display timeout (ms) + + + + + Selection Geometry Display + + + + + Display Location + + + + + None + + + + + Top Left + + + + + Top Right + + + + + Bottom Left + + + + + Bottom Right + + + + + Center + + + + + Quality range of 0-100; Higher number is better quality and larger file size + + + + + JPEG Quality + + + + + Reverse arrow + + + + + Draw the arrow head first + + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + Latest Uploads + + + Screenshots history is empty + Screenshots history is empty + + + Copy URL + Copy URL + + + URL copied to clipboard. + URL copied to clipboard. + + + Open in browser + Open in browser + + + Confirm to delete + Confirm to delete + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Are you sure you want to delete a screenshot from the latest uploads and server? + + + + ImgS3Uploader + + Uploading Image + S'està pujant la imatge + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Error + Error + + + + ImgUploadDialog + + + Upload Confirmation + Upload Confirmation + + + + Do you want to upload this capture? + Do you want to upload this capture? + + + + + Upload without confirmation + Upload without confirmation + + + + ImgUploader + + Uploading Image + S'està pujant la imatge + + + Delete image + Esborra la imatge + + + Unable to open the URL. + No es pot obrir l'URL. + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + Copy URL + Copia l'URL + + + Open URL + Obri l'URL + + + Image to Clipboard. + Imatge al porta-retalls. + + + + ImgUploaderBase + + + Upload image + Upload image + + + + Uploading Image + Uploading Image + + + + Copy URL + Copy URL + + + + Open URL + Open URL + + + + Delete image + Delete image + + + + Image to Clipboard. + Image to Clipboard. + + + + Save image + Save image + + + + Unable to open the URL. + Unable to open the URL. + + + + URL copied to clipboard. + Адресът е копиран. + + + + Screenshot copied to clipboard. + Screenshot copied to clipboard. + + + + Unable to save the screenshot to disk. + Unable to save the screenshot to disk. + + + + Screenshot saved. + Screenshot saved. + + + + ImgUploaderTool + + + Image Uploader + Качване на изображения + + + + Upload the selection + Upload the selection + + + + ImgurUploader + + Upload to Imgur + Upload to Imgur + + + Uploading Image + Uploading Image + + + Copy URL + Copy URL + + + Open URL + Open URL + + + Delete image + Delete image + + + Image to Clipboard. + Image to Clipboard. + + + + Unable to open the URL. + Unable to open the URL. + + + URL copied to clipboard. + URL copied to clipboard. + + + Screenshot copied to clipboard. + Screenshot copied to clipboard. + + + + ImgurUploaderTool + + Image Uploader + Image Uploader + + + Upload the selection to Imgur + Upload the selection to Imgur + + + + InfoWindow + + + + About + Относно + + + + + Icon + Icon + + + + + License + License + + + + + GPLv3+ + GPLv3+ + + + + + Version + Version + + + + + Flameshot v + Flameshot v + + + + + OS Info + OS Info + + + + + Copy Info + Copy Info + + + Right Click + Clic dret + + + Mouse Wheel + Roda del ratolí + + + Move selection 1px + Mou la selecció 1 px + + + Resize selection 1px + Redimensiona la selecció 1 px + + + Quit capture + Ix de la captura + + + Copy to clipboard + Copia al porta-retalls + + + Save selection as a file + Guarda la selecció com a fitxer + + + Undo the last modification + Desfés l'última modificació + + + Show color picker + Mostra el selector de color + + + Change the tool's thickness + Canvia el gruix de l'eina + + + Key + Tecla + + + Description + Descripció + + + <u><b>License</b></u> + <u><b>License</b></u> + + + <u><b>Version</b></u> + <u><b>Version</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Dreceres</b></u> + + + Available shortcuts in the screen capture mode. + Dreceres disponibles en el mode de captura de pantalla. + + + + InvertTool + + + Invert + Invert + + + + Set Inverter as the paint tool + Избиране на инструмент „Негатив“ + + + + LineTool + + + Line + Line + + + + Set the Line as the paint tool + Избиране на инструмент „Линия“ + + + + MarkerTool + + + Marker + Marker + + + + Set the Marker as the paint tool + Избиране на инструмент „Маркер“ + + + + MoveTool + + + Move + Move + + + + Move the selection area + Move the selection area + + + + PencilTool + + + Pencil + Pencil + + + + Set the Pencil as the paint tool + Избиране на инструмент „Молив“ + + + + PinTool + + + Pin Tool + Pin Tool + + + + Pin image on the desktop + Pin image on the desktop + + + + PinWidget + + + Context menu + Context menu + + + + Copy to clipboard + Копиране в междинната памет + + + + Save to file + Save to file + + + + Rotate Right + + + + + Rotate Left + + + + + Increase Opacity + + + + + Decrease Opacity + + + + + Close + Затваряне + + + + PixelateTool + + + Pixelate + Pixelate + + + + Set Pixelate as the paint tool. + Избиране на инструмент „Размиване“ + + + Set Pixelate as the paint tool + Set Pixelate as the paint tool + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QHotkey + + Failed to register %1. Error: %2 + Failed to register %1. Error: %2 + + + Failed to unregister %1. Error: %2 + Failed to unregister %1. Error: %2 + + + + QObject + + + + Capture saved to clipboard. + Capture saved to clipboard. + + + + Error while saving to clipboard + Error while saving to clipboard + + + + Save screenshot + Save screenshot + + + + Path copied to clipboard as + Path copied to clipboard as + + + Saving canceled + Saving canceled + + + Save canceled + Save canceled + + + Capture is saved and copied to the clipboard as + Capture is saved and copied to the clipboard as + + + + Save Error + Save Error + + + + + Capture saved as + Capture saved as + + + + + Error trying to save as + Error trying to save as + + + + Unable to connect via DBus + Грешка при свързване чрез DBus + + + + Powerful yet simple to use screenshot software. + Powerful yet simple to use screenshot software. + + + + See + See + + + Capture the entire desktop. + Capture the entire desktop. + + + + Open the capture launcher. + Open the capture launcher. + + + + Start a manual capture in GUI mode. + Start a manual capture in GUI mode. + + + + Configure + Configure + + + Capture a single screen. + Capture a single screen. + + + Path where the capture will be saved + Path where the capture will be saved + + + + Capture screenshot of all monitors at the same time. + + + + + Capture a screenshot of the specified monitor. + + + + + Existing directory or new file to save to + Existing directory or new file to save to + + + + Save the capture to the clipboard + Save the capture to the clipboard + + + + Pin the capture to the screen + Pin the capture to the screen + + + + Upload screenshot + Upload screenshot + + + + Delay time in milliseconds + Delay time in milliseconds + + + + Repeat screenshot with previously selected region + Repeat screenshot with previously selected region + + + + Screenshot region to select + Screenshot region to select + + + + Set the filename pattern + Избиране на шаблон за име на файла + + + + Accept capture as soon as a selection is made + Accept capture as soon as a selection is made + + + + Enable or disable the trayicon + Enable or disable the trayicon + + + + Enable or disable run at startup + Enable or disable run at startup + + + + Enable or disable the notifications + + + + + Check the configuration for errors + Check the configuration for errors + + + + Show the help message in the capture mode + Show the help message in the capture mode + + + + Define the main UI color + Define the main UI color + + + + Define the contrast UI color + Define the contrast UI color + + + + Print raw PNG capture + Print raw PNG capture + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + + + + Define the screen to capture (starting from 0) + Define the screen to capture (starting from 0) + + + + Invalid delay, it must be a number greater than 0 + Invalid delay, it must be a number greater than 0 + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + + + + Invalid path, must be an existing directory or a new file in an existing directory + Invalid path, must be an existing directory or a new file in an existing directory + + + Define the screen to capture + Define the screen to capture + + + + default: screen containing the cursor + default: screen containing the cursor + + + + Screen number + Screen number + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + + + Invalid delay, it must be higher than 0 + Invalid delay, it must be higher than 0 + + + + Invalid screen number, it must be non negative + Invalid screen number, it must be non negative + + + Invalid path, it must be a real path in the system + Invalid path, it must be a real path in the system + + + + Invalid value, it must be defined as 'true' or 'false' + Invalid value, it must be defined as 'true' or 'false' + + + + Error + Грешка + + + + Unable to write in + Unable to write in + + + URL copied to clipboard. + URL copied to clipboard. + + + + Options + Options + + + Arguments + Arguments + + + arguments + arguments + + + + Subcommands + + + + + subcommands + + + + + Usage + Usage + + + + options + options + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Per default runs Flameshot in the background and adds a tray icon for configuration. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + + + + Requested screen exceeds screen count + Requested screen exceeds screen count + + + + Full screen screenshot pinned to screen + Full screen screenshot pinned to screen + + + Toggle side panel + Toggle side panel + + + Resize selection left 1px + Resize selection left 1px + + + Resize selection right 1px + Resize selection right 1px + + + Resize selection up 1px + Resize selection up 1px + + + Resize selection down 1px + Resize selection down 1px + + + Select entire screen + Select entire screen + + + Move selection left 1px + Move selection left 1px + + + Move selection right 1px + Move selection right 1px + + + Move selection up 1px + Move selection up 1px + + + Move selection down 1px + Move selection down 1px + + + Commit text in text area + Commit text in text area + + + Delete current tool + Delete current tool + + + + Quit capture + Quit capture + + + + Screenshot history + История на снимките + + + + Capture screen + Заснемане на екрана + + + + Show color picker + Избиране на цвят + + + + Change the tool's size + Change the tool's size + + + Change the tool's thickness + Change the tool's thickness + + + + RectangleTool + + + Rectangle + Правоъгълник + + + + Set the Rectangle as the paint tool + Избиране на инструмент „Правоъгълник“ + + + + RedoTool + + + Redo + Redo + + + + Redo the next modification + Redo the next modification + + + + SaveTool + + + Save + Запазване + + + + Save screenshot to a file + Save screenshot to a file + + + Save the capture + Save the capture + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + Подсказка: пробвайте да зададете променлирата на средата XDG_CURRENT_DESKTOP. + + + + Unable to capture screen + Unable to capture screen + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + Rectangular Selection + + + + Set Selection as the paint tool + Избиране на инструмент „Правоъгълна рамка“ + + + + SetShortcutDialog + + + Set Shortcut + Set Shortcut + + + + Enter new shortcut to change + Enter new shortcut to change + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Натиснете Esc за отказ или ⌘+Backspace за отмяна на клавишната комбинация. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Натиснете Esc за отказ или Backspace за отмяна на клавишната комбинация. + + + + + Flameshot must be restarted for changes to take effect. + Flameshot must be restarted for changes to take effect. + + + + ShortcutsWidget + + + Hot Keys + Hot Keys + + + + Available shortcuts in the screen capture mode. + Available shortcuts in the screen capture mode. + + + + Description + Description + + + + Key + Key + + + + Left Double-click + Двойно щракване с ляв бутон + + + + Toggle side panel + Превключване на страничната лента + + + + Grab a color from the screen + + + + + Resize selection left 1px + Преоразмеряване на избраното с 1 пиксел наляво + + + + Resize selection right 1px + Преоразмеряване на избраното с 1 пиксел надясно + + + + Resize selection up 1px + Преоразмеряване на избраното с 1 пиксел нагоре + + + + Resize selection down 1px + Преоразмеряване на избраното с 1 пиксел надолу + + + + Symmetrically decrease width by 2px + + + + + Symmetrically increase width by 2px + + + + + Symmetrically increase height by 2px + + + + + Symmetrically decrease height by 2px + + + + + Select entire screen + Избиране на целия екран + + + + Move selection left 1px + Преместване на избраното с 1 пиксел наляво + + + + Move selection right 1px + Преместване на избраното с 1 пиксел надясно + + + + Move selection up 1px + Преместване на избраното с 1 пиксел нагоре + + + + Move selection down 1px + Преместване на избраното с 1 пиксел надолу + + + + Commit text in text area + Потвърждаване на текста в текстовото поле + + + + Delete selected drawn object + + + + + Cancel current selection + + + + Delete current tool + Премахване на текущия инструмент + + + + Capture screen + Заснемане на екрана + + + + Screenshot history + История на снимките + + + + SidePanelWidget + + Active thickness: + Active thickness: + + + Active color: + Active color: + + + Press ESC to cancel + Press ESC to cancel + + + + Active tool size: + Active tool size: + + + + Active Color: + Active Color: + + + + Grab Color + Grab Color + + + + Display grid + + + + + SizeDecreaseTool + + + Decrease Tool Size + Decrease Tool Size + + + + Decrease the size of the other tools + Decrease the size of the other tools + + + + SizeIncreaseTool + + + Increase Tool Size + Increase Tool Size + + + + Increase the size of the other tools + Increase the size of the other tools + + + + SizeIndicatorTool + + Selection Size Indicator + Selection Size Indicator + + + Show X and Y dimensions of the selection + Show X and Y dimensions of the selection + + + Show the dimensions of the selection (X Y) + Show the dimensions of the selection (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + Century (00-99) + + + + Year (00-99) + Year (00-99) + + + + Year (2000) + Year (2000) + + + + Month Name (jan) + Month Name (jan) + + + + Month Name (january) + Month Name (january) + + + + Month (01-12) + Month (01-12) + + + + Week Day (1-7) + Week Day (1-7) + + + + Week (01-53) + Week (01-53) + + + + Day Name (mon) + Day Name (mon) + + + + Day Name (monday) + Day Name (monday) + + + + Day (01-31) + Day (01-31) + + + + Day of Month (1-31) + Day of Month (1-31) + + + + Day (001-366) + Day (001-366) + + + + Hour (00-23) + Hour (00-23) + + + + Hour (01-12) + Hour (01-12) + + + + Minute (00-59) + Minute (00-59) + + + + Second (00-59) + Second (00-59) + + + + Full Date (%m/%d/%y) + Full Date (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + Full Date (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + + + + + Time (%H-%M-%S) + Time (%H-%M-%S) + + + + Time (%H-%M) + Time (%H-%M) + + + + SystemNotification + + + Flameshot Info + Flameshot Info + + + + TextConfig + + + StrikeOut + Зачертан + + + + Underline + Подчертан + + + + Bold + Получер + + + + Italic + Наклонен + + + + Left Align + Ляво подравнен + + + + Center Align + Центриран + + + + Right Align + Дясно подравнен + + + + TextTool + + + Text + Текст + + + + Add text to your capture + Добавя текст към снимката + + + + TrayIcon + + + &Take Screenshot + &Снимка на екрана + + + + &Open Launcher + &Начален екран + + + + &Configuration + Н&астройки + + + + &About + &Относно + + + + Check for updates + Проверка за обновяване + + + + New version %1 is available + Налично е ново издание %1 + + + + &Quit + &Изход + + + + &Latest Uploads + &Последно качени + + + + &Open Save Path + &Отваряне пътя за запис + + + + UIcolorEditor + + UI Color Editor + UI Color Editor + + + + Change the color moving the selectors and see the changes in the preview buttons. + Променяйте цвета с помощта на манипулаторите и вижте промяната в цвета на бутоните. + + + + Select a Button to modify it + За да промените цвета на бутон, го изберете + + + + Main Color + Основен цвят + + + + Click on this button to set the edition mode of the main color. + За промяна на основния цвят, изберете този бутон. + + + + Contrast Color + Контрастен цвят + + + + Click on this button to set the edition mode of the contrast color. + За промяна на контрастния цвят, изберете този бутон. + + + + UndoTool + + + Undo + Отменяне + + + + Undo the last modification + Отменя последната промяна + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + Налично е издание %1 на Flameshot + + + + Ignore + Пренебрегване + + + + Later + После + + + + Update + Обновяване + + + + UploadHistory + + + Upload History + Upload History + + + + Screenshots history is empty + Историята на екранни снимки е празна + + + + UploadLineItem + + + Form + Form + + + + TextLabel + TextLabel + + + + Copy URL + Copy URL + + + + Open In Browser + Open In Browser + + + + Confirm to delete + Потвърждаване на изтриване + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Are you sure you want to delete a screenshot from the latest uploads and server? + + + + UtilityPanel + + + Close + Затваряне + + + + <Empty> + <празно> + + + + VisualsEditor + + + Opacity of area outside selection: + Прозрачност на областта извън избраното: + + + + UI Color Editor + Цвят на интерфейса + + + + Colorpicker Editor + Редактор на палитрата + + + + Button Selection + Избрани бутони + + + + Select All + Избиране на всички + + + + color_widgets::ColorDialog + + + Pick + Избиране + + + + color_widgets::ColorPalette + + + Unnamed + Без име + + + + color_widgets::ColorPaletteModel + + + Unnamed + Без име + + + + %1 (%2 colors) + %1 (%2 цвята) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + Нова палитра от файл + + + + + Create a new palette + Нова палитра + + + + + Duplicate the current palette + Дублиране + + + + + Delete the current palette + Премахване на палитрата + + + + + Revert changes to the current palette + Възстановяване + + + + + Save changes to the current palette + Запазване на промените в текущата палитра + + + + + Add a color to the palette + Добавяне на цвят в палитрата + + + + + Remove the selected color from the palette + Премахване на избрания цвят от палитрата + + + + + New Palette + Нова палитра + + + + + Name + Наименование + + + + GIMP Palettes (*.gpl) + Палитри на GIMP (*.gpl) + + + + Palette Image (%1) + Изображение на палитра (%1) + + + + All Files (*) + Всички файлове (*) + + + + + Open Palette + Отваряне на палитра + + + + Failed to load the palette file +%1 + Файлът с палитрата не е зареден +%1 + + + + color_widgets::GradientEditor + + + Add Color + Добавяне на цвят + + + + Remove Color + Премахване на цвят + + + + Edit Color... + Промяна на цвят… + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 цвята) + + + + color_widgets::Swatch + + + Clear Color + Изчистване на цвета + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_ca.ts b/data/translations/Internationalization_ca.ts new file mode 100644 index 0000000..2fa8f58 --- /dev/null +++ b/data/translations/Internationalization_ca.ts @@ -0,0 +1,3169 @@ + + + + + AbstractWidgetList + + + Add New + Afegir nou + + + + Move Up + Mou a Dalt + + + + Move Down + Mou Avall + + + + Remove + Elimina + + + + AcceptTool + + + Accept + Accepta + + + + Accept the capture + Accepta la captura + + + + AppLauncher + + + App Launcher + Llançador d'aplicacions + + + + Choose an app to open the capture + Trieu una aplicació per obrir la captura + + + + AppLauncherWidget + + + Open With + Obrir Amb + + + + Launch in terminal + Llança a la terminal + + + + Keep open after selection + Mantén obert després d'una selecció + + + + + Error + Error + + + + Unable to launch in terminal. + No s'ha pogut iniciar a la terminal. + + + + Unable to write in + No es pot escriure a + + + + ArrowTool + + + Arrow + Fletxa + + + + Set the Arrow as the paint tool + Estableix la fletxa com a eina de dibuix + + + + BlurTool + + Blur + Desenfocament + + + Set Blur as the paint tool + Estableix el desenfocament com a eina de dibuix + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Mode de captura</b> + + + + Rectangular Region + Regió rectangular + + + + Full Screen (Current Display) + Pantalla completa (monitor actual) + + + + Full Screen (All Monitors) + Pantalla completa (tots els monitors) + + + + No Delay + Sense demora + + + + second + segon + + + + + + seconds + segons + + + + + Take new screenshot + Fes una nova captura de pantalla + + + + + Area: + Àrea: + + + + + Capture Launcher + Llançador de Captures + + + + + TextLabel + EtiquetaDeText + + + + + Capture Mode + Mode de Captura + + + + + Delay: + Demora: + + + + + WxH+x+y + WxH+x+y + + + + CaptureWidget + + + Unable to capture screen + Impossible capturar la pantalla + Impossible capturar la pantalla + + + + Mouse + Ratolí + + + + Select screenshot area + Selecciona l'àrea de captura de pantalla + + + + Mouse Wheel + Roda del Ratolí + + + + Change tool size + Canvia mida de l'eina + + + + Right Click + Clic Dret + + + + Show color picker + Mostra el selector de color + + + + Open side panel + Obre el panell lateral + + + + Esc + Esc + + + + Exit + Surt + + + + Quit Capture + Surt de la Captura + + + + Are you sure you want to quit capture? + Esteu segur que voleu sortir de la captura? + + + + Do not show this again + No ho tornis a mostrar + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot ha perdut el focus. Les dreceres de teclat no funcionaran fins que no facis clic en algun lloc. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + Error de configuració resolt. Torneu a iniciar `flameshot gui` per aplicar-lo. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Escolliu una àrea amb el ratolí, o premeu Esc per sortir. +Premeu Entrar per capturar la pantalla. +Premeu clic dret per mostrar l'eina de selecció de color. +Gireu la rodeta del ratolí per canviar el gruix de l'eina de dibuix. +Premeu Espai per obrir el calaix lateral. + + + + Tool Settings + Ajustaments de l'eina + + + + CircleCountTool + + + Circle Counter + Comptador circular + + + + Add an autoincrementing counter bubble + Afegeix-hi un comptador automàtic + + + + CircleTool + + + Circle + Cercle + + + + Set the Circle as the paint tool + Estableix el cercle com a eina de dibuix + + + + ColorDialog + + + + Select Color + Selecciona el Color + + + + + Saturation + Saturació + + + + + Hue + To + + + + + Hex + Hex + + + + + Blue + Blau + + + + + Value + Valor + + + + + Green + Verd + + + + + Alpha + Alfa + + + + + Red + Vermell + + + + ColorGrabWidget + + + Accept color + Accepta el color + + + + Enter or Left Click + Enter o Clic amb el Botó Esquerre + + + + Precisely select color + Selecciona el color amb precisió + + + + Hold Left Click + Mantingueu premut el Botó Esquerre + + + + Toggle magnifier + Activa/desactiva la lupa + + + + Space or Right Click + Espai o Clic amb el Botó Dret + + + + Cancel + Cancel·la + + + + Esc + Esc + + + + ColorPickerEditor + + + Edit Preset: + Edita la Preconfiguració: + + + + Enter color to update preset + Introduïu el color per actualitzar la configuració predefinida + + + + Update + Actualitza + + + + Press button to update the selected preset + Premeu el botó per actualitzar la configuració predefinida seleccionada + + + + Delete + Suprimeix + + + + Press button to delete the selected preset + Premeu el botó per suprimir la configuració predefinida seleccionada + + + + Add Preset: + Afegeix un valor predefinit: + + + + Enter color manually or select it using the color-wheel + Introduïu el color manualment o seleccioneu-lo utilitzant la roda de colors + + + + Add + Afegir + + + + Press button to add preset + Premeu el botó per a afegir un predefinit + + + + + Error + Error + + + + Unable to add preset. Maximum limit reached. + No s'ha pogut afegir el predefinit. S'ha arribat al límit màxim. + + + + Unable to remove preset. Minimum limit reached. + No s'ha pogut eliminar el predefinit. S'ha arribat al límit mínim. + + + + ConfigErrorDetails + + + Configuration errors + Errors de configuració + + + + ConfigHandler + + + Unrecognized setting: '%1' + + Configuració no reconeguda: '%1' + + + + + Unrecognized shortcut name: '%1'. + + Nom de drecera no reconegut: '%1'. + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + Conflicte de drecera: '%1' i '%2' tenen la mateixa drecera: %3 + + + + + Bad value in '%1'. Expected: %2 + + Valor incorrecte a '%1'. S'esperava: %2 + + + + + You have successfully resolved the configuration error. + Heu resolt correctament l'error de configuració. + + + + The configuration contains an error. Open configuration to resolve. + La configuració conté un error. Obre la configuració per resoldre-ho. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + La clau de configuració '%1' és incorrecta a ConfigHandler. Si us plau, informeu-nos d'aquest error. + + + + ConfigResolver + + + Resolve configuration errors + Resol els errors de configuració + + + + <b>You must resolve all errors before continuing:</b> + <b>Heu de resoldre tots els errors abans de continuar:</b> + + + + Reset + Reinicia + + + + Reset to the default value. + Restableix al valor per defecte. + + + + Remove + Elimina + + + + Remove this setting. + Elimina aquest paràmetre. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + Algunes dreceres de teclat tenen conflictes. +Això NO impedirà que flameshot s'iniciï. +Solucioneu-les manualment al fitxer de configuració. + + + + Resolve all + Resol-ho tot + + + + Resolve all listed errors. + Resol tots els errors llistats. + + + + Details + Detalls + + + + ConfigWindow + + + Configuration + Ajustaments + + + + Interface + Interfície + + + + Filename Editor + Editor de noms de fitxer + + + + General + General + + + + Shortcuts + Dreceres + + + + Resolve + Resol + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>El fitxer de configuració té errors. Soluciona'ls abans de continuar.</b> + + + + Controller + + New version %1 is available + La nova versió %1 ja és disponible + + + You have the latest version + Teniu la versió més recent + + + Failed to get information about the latest version. + Error a l'intentar obtenir informació sobre actualitzacions. + + + Error + Error + + + Unable to close active modal widgets + No s'han pogut tancar els widgets modals actius + + + &Open Launcher + &Obre el llançador d'aplicacions + + + &Configuration + &Ajustaments + + + &About + &Quant a + + + Check for updates + Comprova si hi ha actualitzacions disponibles + + + &Latest Uploads + &Últimes càrregues + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + &Information + &Informació + + + &Quit + &Surt + + + &Take Screenshot + &Captura + + + + CopyTool + + + Copy + Copia + + + + Copy selection to clipboard + Copia la selecció al porta-retalls + + + Copy the selection into the clipboard + Copia la selecció al porta-retalls + + + + DBusUtils + + Unable to connect via DBus + No s'ha pogut connectar mitjançant DBus + + + + ExitTool + + + Exit + Surt + + + + Leave the capture screen + Surt de la pantalla de captura + + + + FileNameEditor + + + Edit the name of your captures: + Editeu el nom de les vostres captures: + + + + Edit: + Edita: + + + + Preview: + Previsualització: + + + + Save + Desa + + + + Saves the pattern + Desa el patró + + + + Restore + Restaura + + + Reset + Reinicialitza + + + + Restores the saved pattern + Restaura el patró desat + + + + Clear + Neteja + + + + Deletes the name + Elimina el nom + + + + Flameshot + + + Error + Error + + + + Unable to close active modal widgets + No s'han pogut tancar els widgets modals actius + + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + + FlameshotDaemon + + + New version %1 is available + Nova versió %1 disponible + + + + You have the latest version + Teniu la versió més recent + + + + Failed to get information about the latest version. + Error a l'intentar obtenir informació sobre actualitzacions. + + + + Unable to connect via DBus + No s'ha pogut connectar a través del DBus + + + + GeneneralConf + + Show help message + Mostra el missatge d'ajuda + + + Show the help message at the beginning in the capture mode. + Mostra el missatge d'ajuda en iniciar el mode de captura. + + + Show desktop notifications + Mostra les notificacions d'escriptori + + + Show tray icon + Mostra la icona en la barra de tasques + + + Show the systemtray icon + Mostra la icona en la barra de tasques + + + Import + Importar + + + Error + Error + + + Unable to read file. + Impossible llegir el fitxer. + + + Unable to write file. + Impossible escriure al fitxer. + + + Save File + Guardar Arxiu + + + Confirm Reset + Confirmar Reset + + + Are you sure you want to reset the configuration? + Esteu segur que voleu reiniciar la configuració? + + + Configuration File + Fitxer de Configuració + + + Export + Exportar + + + Reset + Reset + + + Launch at startup + Llançament a l'inici + + + + GeneralConf + + + + Import + Importa + + + + + + + Error + Error + + + + Unable to read file. + No s'ha pogut llegir el fitxer. + + + + + Unable to write file. + No s'ha pogut escriure al fitxer. + + + + Save File + Desa l'arxiu + + + + Confirm Reset + Confirma la reinicialització + + + + Are you sure you want to reset the configuration? + Esteu segur de voler reinicialitzar els ajustaments? + + + + Show help message + Mostra el missatge d'ajuda + + + Show the help message at the beginning in the capture mode. + Mostra el missatge d'ajuda en iniciar el mode de captura. + + + + Show the side panel button + Mostra el botó del calaix lateral + + + Show the side panel toggle button in the capture mode. + Mostra el botó del calaix lateral en el mode de captura. + + + + Show desktop notifications + Mostra les notificacions d'escriptori + + + + Show tray icon + Mostra la icona de la safata + + + Show the systemtray icon + Mostra la icona a la barra de tasques del sistema + + + + Confirmation required to delete screenshot from the latest uploads + Es requereix confirmació per esborrar la captura de pantalla de les darreres càrregues + + + + Configuration File + Fitxer d'Ajustaments + + + + Export + Exporta + + + + Reset + Reinicialitza + + + + Automatic check for updates + Comprova les actualitzacions de forma automàtica + + + + Allow multiple flameshot GUI instances simultaneously + Permet múltiples instàncies de la interfície gràfica de flameshot simultàniament + + + This allows you to take screenshots of flameshot itself for example. + This allows you to take screenshots of flameshot itself for example. + + + Automatically close daemon when it is not needed + Automatically close daemon when it is not needed + + + Launch at startup + Llança a l'inici + + + Launch Flameshot + Inicia el Flameshot + + + + Show welcome message on launch + Mostra el missatge de benvinguda a l'inici + + + + Use large predefined color palette + Usa paleta de colors gran predefinida + + + + Copy URL after upload + Copia l'URL després de la càrrega + + + Copy URL and close window after upload + Copia la URL i tanca la finestra després de la càrrega + + + + Save image after copy + Desa la imatge després d'haver-la copiat + + + Save image file after copying it + Desa el fitxer d'imatge després d'haver-lo copiat + + + + Show the help message at the beginning in the capture mode + Mostra el missatge d'ajuda al començament en el mode de captura + + + + Use last region for GUI mode + Utilitza l'última regió per al mode GUI + + + + Use the last region as the default selection for the next screenshot in GUI mode + Utilitza l'última regió com a selecció predeterminada per a la següent captura de pantalla en mode GUI + + + + Show the side panel toggle button in the capture mode + Mostra el botó de commutació del plafó lateral en el mode de captura + + + + Enable desktop notifications + Habilita les notificacions de l'escriptori + + + + Show abort notifications + Mostra les notificacions d'avortament + + + + Enable abort notifications + Habilita les notificacions d'avortament + + + + Show icon in the system tray + Mostra la icona a la safata del sistema + + + + Use grim to capture screenshots + Usa grim per a fer les captures de pantalla + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + Grim és una utilitat només de wayland per capturar pantalles basades en el protocol de còpia de pantalla. En general, només s'habilita en gestors de finestres minimalistes de wayland com sway, hyprland, etc. + + + + Ask for confirmation to delete screenshot from the latest uploads + Demana confirmació per suprimir la captura de pantalla de les darreres pujades + + + + Check for updates automatically + Comprova automàticament si hi ha actualitzacions + + + + This allows you to take screenshots of Flameshot itself for example + Això permet prendre captures de pantalla del mateix Flameshot per exemple + + + Launch Flameshot daemon when computer is booted + Launch Flameshot daemon when computer is booted + + + + Show the welcome message box in the middle of the screen while taking a screenshot + Mostra el quadre de missatge de benvinguda al mig de la pantalla mentre es pren una captura de pantalla + + + + Use a large predefined color palette + Usa una paleta de colors gran predefinida + + + + Copy on double click + Copia en fer doble clic + + + Enable Copy on Double Click + Enable Copy on Double Click + + + Copy URL and close window after uploading was successful + Copy URL and close window after uploading was successful + + + + Automatically unload from memory when it is not needed + Descarrega automàticament de la memòria quan no sigui necessari + + + + Automatically close daemon (background process) when it is not needed + Tanca automàticament el dimoni (procés de fons) quan no sigui necessari + + + + Launch in background at startup + Llança en segon pla a l'inici + + + + Launch Flameshot daemon (background process) when computer is booted + Llança el dimoni Flameshot (procés de fons) quan s'arrenqui l'ordinador + + + + Ask before quit capture + Pregunta abans de sortir de la captura + + + + Show the confirmation prompt before ESC quit + Mostra el missatge de confirmació abans de sortir amb ESC + + + + Enable Copy to clipboard on Double Click + Habilita la Còpia al porta-retalls en fer Doble Clic + + + + Copy URL after uploading was successful + Copia l'URL després que la càrrega sigui correcta + + + + After copying the screenshot, save it to a file as well + Després de copiar la captura de pantalla, desa-la també en un fitxer + + + + Save Path + Desa la Ruta + + + + Change... + Canvia... + + + + Use fixed path for screenshots to save + Fes servir una ruta fixada per desar-hi les captures de pantalla + + + + Preferred save file extension: + Extensió de fitxer preferida al desar: + + + + Latest Uploads Max Size + Mida Màxima de les Últimes Càrregues + + + + Imgur Application Client ID + Client ID de l'Aplicació Imgur + + + + Undo limit + Desfes el límit + + + + Use JPG format for clipboard (PNG default) + Fes servir el format JPG per les imatges del porta-retalls (per defecte és PNG) + + + + Use lossy JPG format for clipboard (lossless PNG default) + Usa el format JPG amb pèrdua per al porta-retalls (per defecte PNG sense pèrdua) + + + + Copy file path after save + Copia la ruta a l'arxiu després d'haver-lo desat + + + + Copy the file path to clipboard after the file is saved + Copia la ruta del fitxer al porta-retalls després que el fitxer sigui desat + + + + Anti-aliasing image when zoom the pinned image + Antialiasing de la imatge quan es fa zoom a la imatge fixada + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + Després de fer zoom a la imatge fixada, s'hauria de suavitzar la imatge o quedar pixelada + + + + + Upload image without confirmation + Puja la imatge sense confirmació + + + + Choose a Folder + Escull una carpeta + + + + Unable to write to directory. + No s'ha pogut escriure al directori. + + + + Show magnifier + Mostra la lupa + + + + Enable a magnifier while selecting the screenshot area + Habilita la lupa mentre se selecciona l'àrea de captura de pantalla + + + + Square shaped magnifier + Lupa en forma de quadrat + + + + Make the magnifier to be square-shaped + Fes que la lupa sigui de forma quadrada + + + + Milliseconds before geometry display hides; 0 means do not hide + Mil·lisegons abans que s'oculti la visualització de la geometria; 0 significa que no s'oculta + + + + Set geometry display timeout (ms) + Estableix el temps d'espera de la visualització de la geometria (ms) + + + + Selection Geometry Display + Visualització de la Geometria de la Selecció + + + + Display Location + Mostra la Ubicació + + + + None + Cap + + + + Top Left + A Dalt a l'Esquerra + + + + Top Right + A Dalt a la Dreta + + + + Bottom Left + A Baix a l'Esquerra + + + + Bottom Right + A Baix a la Dreta + + + + Center + Centre + + + + Quality range of 0-100; Higher number is better quality and larger file size + Interval de qualitat de 0-100; un valor més alt és una millor qualitat i una mida de fitxer més gran + + + + JPEG Quality + Qualitat JPEG + + + + Reverse arrow + Fletxa inversa + + + + Draw the arrow head first + Dibuixa primer la punta de la fletxa + + + + Insecure Pixelate + Pixelat Insegur + + + + Draw the pixelation effect in an insecure but more asethetic way. + Dibuixa l'efecte de pixelació d'una manera insegura però més asètica. + + + + HistoryWidget + + Latest Uploads + Últimes càrregues + + + Screenshots history is empty + L'historial de captures de pantalla és buit + + + Copy URL + Copia l'URL + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Open in browser + Obre al navegador + + + Confirm to delete + Confirmeu per esborrar + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Esteu segur de voler esborrar la captura de les últimes càrregues i del servidor? + + + + ImgS3Uploader + + Uploading Image + S'està pujant la imatge + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Error + Error + + + + ImgUploadDialog + + + Upload Confirmation + Confirmació de Càrrega + + + + Do you want to upload this capture? + Vols pujar aquesta captura? + + + + + Upload without confirmation + Carrega sense confirmació + + + + ImgUploader + + Uploading Image + S'està pujant la imatge + + + Delete image + Esborra la imatge + + + Unable to open the URL. + No es pot obrir l'URL. + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + Copy URL + Copia l'URL + + + Open URL + Obri l'URL + + + Image to Clipboard. + Imatge al porta-retalls. + + + + ImgUploaderBase + + + Upload image + Puja una Imatge + + + + Uploading Image + S'està pujant la imatge + + + + Copy URL + Copia l'URL + + + + Open URL + Obre l'URL + + + + Delete image + Esborra la imatge + + + + Image to Clipboard. + Imatge al Porta-retalls. + + + + Save image + Desa la imatge + + + + Unable to open the URL. + No s'ha pogut obrir l'URL. + + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + + Unable to save the screenshot to disk. + No s'ha pogut desar la captura de pantalla al disc. + + + + Screenshot saved. + Captura de pantalla desada. + + + + ImgUploaderTool + + + Image Uploader + Carregador d'Imatges + + + + Upload the selection + Puja la selecció + + + + ImgurUploader + + Upload to Imgur + Puja a Imgur + + + Uploading Image + S'està pujant la imatge + + + Copy URL + Copia l'URL + + + Open URL + Obre l'URL + + + Delete image + Esborra la imatge + + + Image to Clipboard. + Imatge al porta-retalls. + + + + Unable to open the URL. + No s'ha pogut obrir l'URL. + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + + ImgurUploaderTool + + Image Uploader + Puja la imatge + + + Upload the selection to Imgur + Puja la selecció a Imgur + + + + InfoWindow + + + + About + Quant a + + + + + Icon + Icona + + + + + License + Llicència + + + + + GPLv3+ + GPLv3+ + + + + + Version + Versió + + + + + Flameshot v + Flameshot v + + + + + OS Info + Informació del Sistema Operatiu + + + + + Copy Info + Copia la informació + + + Right Click + Clic dret + + + Mouse Wheel + Roda del ratolí + + + Move selection 1px + Mou la selecció 1 px + + + Resize selection 1px + Redimensiona la selecció 1 px + + + Quit capture + Ix de la captura + + + Copy to clipboard + Copia al porta-retalls + + + Save selection as a file + Guarda la selecció com a fitxer + + + Undo the last modification + Desfés l'última modificació + + + Show color picker + Mostra el selector de color + + + Change the tool's thickness + Canvia el gruix de l'eina + + + Key + Tecla + + + Description + Descripció + + + <u><b>License</b></u> + <u><b>Llicència</b></u> + + + <u><b>Version</b></u> + <u><b>Versió</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Dreceres</b></u> + + + Available shortcuts in the screen capture mode. + Dreceres disponibles en el mode de captura de pantalla. + + + + InvertTool + + + Invert + Inverteix + + + + Set Inverter as the paint tool + Estableix l'Inversor com a eina de pintura + + + + LineTool + + + Line + Línia + + + + Set the Line as the paint tool + Estableix la Línia com a eina de dibuix + + + + MarkerTool + + + Marker + Marcador + + + + Set the Marker as the paint tool + Estableix el marcador com a eina de dibuix + + + + MoveTool + + + Move + Mou + + + + Move the selection area + Mou la selecció + + + + PencilTool + + + Pencil + Llapis + + + + Set the Pencil as the paint tool + Estableix el Llapis com a eina de dibuix + + + + PinTool + + + Pin Tool + Ancora l'eina + + + + Pin image on the desktop + Ancora l'imatge a l'escriptori + + + + PinWidget + + + Context menu + Menú contextual + + + + Copy to clipboard + Copia al porta-retalls + + + + Save to file + Desa a un fitxer + + + + Rotate Right + Gira cap a la Dreta + + + + Rotate Left + Gira cap a l'Esquerra + + + + Increase Opacity + Augmenta l'Opacitat + + + + Decrease Opacity + Disminueix l'Opacitat + + + + Close + Tanca + + + + PixelateTool + + + Pixelate + Pixel·la + + + + Set Pixelate as the paint tool. + Estableix el Pixelat com a eina de pintura. + + + Set Pixelate as the paint tool + Estableix l'eina de pixel·lament com a eina de dibuix + + + + PrimaryInstanceWidget + + + Primary instance + Instància primària + + + + <b>Primary instance.</b> Messages received from secondaries: + <b>Instància primària.</b> Missatges rebuts de les secundàries: + + + + QHotkey + + Failed to register %1. Error: %2 + No s'ha pogut registrar %1. Error: %2 + + + Failed to unregister %1. Error: %2 + No s'ha pogut desregistrar %1. Error: %2 + + + + QObject + + + + Capture saved to clipboard. + Captura copiada al porta-retalls. + + + + Error while saving to clipboard + S'ha produït un error mentre es copiava al porta-retalls + + + + Save screenshot + Desa la captura + + + + Path copied to clipboard as + Ruta copiada al porta-retalls com a + + + Saving canceled + Saving canceled + + + Save canceled + Save canceled + + + Capture is saved and copied to the clipboard as + La captura serà desada i copiada al porta-retalls com a + + + + Save Error + S'ha produït un error en guardar + + + + + Capture saved as + Anomena i guarda la captura + + + + + Error trying to save as + S'ha produït un error en anomenar i guardar + + + + Unable to connect via DBus + No es pot connectar mitjançant DBus + + + + Powerful yet simple to use screenshot software. + Un programa de captures complert i versàtil. + + + + See + Vegeu + + + Capture the entire desktop. + Captureu l'escriptori sencer. + + + + Open the capture launcher. + Obriu el llançador de captures. + + + + Start a manual capture in GUI mode. + Comença una captura manual en mode d'interfície. + + + + Configure + Configura + + + Capture a single screen. + Captura una sola pantalla. + + + Path where the capture will be saved + Camí on es desarà la captura + + + + Capture screenshot of all monitors at the same time. + Captura la pantalla de tots els monitors al mateix temps. + + + + Capture a screenshot of the specified monitor. + Captura la pantalla del monitor especificat. + + + + Existing directory or new file to save to + Directori existent o nou fitxer per desar + + + + Save the capture to the clipboard + Desa la captura al porta-retalls + + + + Pin the capture to the screen + Fixa la captura a la pantalla + + + + Upload screenshot + Puja la captura de pantalla + + + + Delay time in milliseconds + Temps de demora en mil·lisegons + + + + Repeat screenshot with previously selected region + Repeteix la captura de pantalla amb la regió seleccionada prèviament + + + + Screenshot region to select + Regió de captura de pantalla a seleccionar + + + + Set the filename pattern + Estableix el patró del nom de fitxer + + + + Accept capture as soon as a selection is made + Accepta la captura tan aviat com es faci una selecció + + + + Enable or disable the trayicon + Activa o desactiva l'icona a la safata + + + + Enable or disable run at startup + Activa o desactiva l'execució a l'inici + + + + Enable or disable the notifications + Activa o desactiva les notificacions + + + + Check the configuration for errors + Comprova si hi ha errors a la configuració + + + + Show the help message in the capture mode + Mostra el missatge d'ajuda en el mode de captura + + + + Define the main UI color + Defineix el color principal de la IU + + + + Define the contrast UI color + Defineix el color de contrast de la interfície d'usuari + + + + Print raw PNG capture + Imprimeix la captura PNG en brut + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + Imprimeix la geometria de la selecció en el format WxH+X+Y. No fa res si s'especifica 'raw' + + + + Define the screen to capture (starting from 0) + Defineix la pantalla a capturar (començant des de 0) + + + + Invalid delay, it must be a number greater than 0 + Retard no vàlid, ha de ser un nombre més gran que 0 + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + Regió no vàlida, utilitzeu 'WxH+X+Y' o 'all' o 'screen0/screen1/...'. + + + + Invalid path, must be an existing directory or a new file in an existing directory + Ruta no vàlida, ha de ser un directori existent o un fitxer nou en un directori existent + + + Define the screen to capture + Define the screen to capture + + + + default: screen containing the cursor + per defecte: pantalla que conté el cursor + + + + Screen number + Screen number + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Color no vàlid, aquest indicador admet els següents formats: +- #RGB (cadascun de R, G, i B és un sol dígit hexadecimal) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Colors amb nom com 'blue' o 'red' +És possible que hàgiu d'escapar del signe '#' com a '\#FFF' + + + Invalid delay, it must be higher than 0 + Invalid delay, it must be higher than 0 + + + + Invalid screen number, it must be non negative + Número de pantalla no vàlid, ha de ser no negatiu + + + Invalid path, it must be a real path in the system + Invalid path, it must be a real path in the system + + + + Invalid value, it must be defined as 'true' or 'false' + Valor no vàlid, s'ha de definir com a 'true' o 'false' + + + + Error + Error + + + + Unable to write in + No es pot escriure a + + + + Requested screen exceeds screen count + La pantalla sol·licitada supera el nombre de pantalles + + + + Full screen screenshot pinned to screen + Captura de pantalla de la pantalla completa fixada a la pantalla + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + + Options + Opcions + + + Arguments + Arguments + + + arguments + arguments + + + + Subcommands + Subcomandes + + + + subcommands + subcomandes + + + + Usage + Ús + + + + options + opcions + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Per defecte, Flameshot s'executa en segon pla i afegeix una icona a la safata per a la configuració. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Hola, sóc aquí! Fes clic a la icona de la safata per fer una captura de pantalla o fes clic amb el botó dret per veure més opcions. + + + Toggle side panel + Toggle side panel + + + Resize selection left 1px + Resize selection left 1px + + + Resize selection right 1px + Resize selection right 1px + + + Resize selection up 1px + Resize selection up 1px + + + Resize selection down 1px + Resize selection down 1px + + + Select entire screen + Select entire screen + + + Move selection left 1px + Move selection left 1px + + + Move selection right 1px + Move selection right 1px + + + Move selection up 1px + Move selection up 1px + + + Move selection down 1px + Move selection down 1px + + + Commit text in text area + Commit text in text area + + + Delete current tool + Delete current tool + + + + Quit capture + Ix de la captura + + + + Screenshot history + Historial de captures de pantalla + + + + Capture screen + Captura de pantalla + + + + Show color picker + Mostra el selector de color + + + + Change the tool's size + Canvia la mida de l'eina + + + Change the tool's thickness + Canvia el gruix de l'eina + + + + RectangleTool + + + Rectangle + Rectangle + + + + Set the Rectangle as the paint tool + Estableix el rectangle com a eina de dibuix + + + + RedoTool + + + Redo + Refés + + + + Redo the next modification + Refés la següent modificació + + + + SaveTool + + + Save + Guarda + + + + Save screenshot to a file + Desa la captura de pantalla a un fitxer + + + Save the capture + Guarda la captura + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + L'adaptador universal de captura de pantalla de wayland requereix Grim com a component de captura de pantalla del wayland. Si falta el component de captura de pantalla, instal·leu-lo! + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + Si la configuració useGrimAdapter no està activada, s'utilitzarà el protocol dbus. Cal tenir en compte que no es recomana l'ús del protocol de dbus en el wayland. Es recomana habilitar l'opció useGrimAdapter a flameshot.ini per activar l'adaptador general de captura de pantalla Wayland basat en grim + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + El component de captura de pantalla de grim s'implementa en base a wlroots, no es pot utilitzar en el GNOME o en entorns d'escriptori similars + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + No s'ha pogut detectar l'entorn d'escriptori (GNOME? KDE? Qile? Sway? ...) + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + Pista: prova de configurar la variable d'entorn XDG_CURRENT_DESKTOP. + + + + Unable to capture screen + Imposible capturar la pantalla + + + + SecondaryInstanceWidget + + + Secondary instance + Instància secundària + + + + <b>Secondary instance.</b> Send message to primary: + <b>Instància secundària.</b> Envia un missatge al primari: + + + + Type something here... + Escriviu alguna cosa aquí... + + + + &Send + &Envia + + + + Error sending message + S'ha produït un error en enviar el missatge + + + + The message '%1' could not be sent to the primary. + No s'ha pogut enviar el missatge '%1' al primari. + + + + SelectionTool + + + Rectangular Selection + Selecció rectangular + + + + Set Selection as the paint tool + Estableix la selecció com a eina de dibuix + + + + SetShortcutDialog + + + Set Shortcut + Estableix Drecera + + + + Enter new shortcut to change + Introdueix una nova drecera per canviar + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Prem Esc per cancel·lar o ⌘+Backspace per desactivar la drecera de teclat. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Prem Esc per cancel·lar o Backspace per desactivar la drecera de teclat. + + + + + Flameshot must be restarted for changes to take effect. + Flameshot s'ha de reiniciar perquè els canvis tinguin efecte. + + + + ShortcutsWidget + + + Hot Keys + Tecles d'Accés Ràpid + + + + Available shortcuts in the screen capture mode. + Dreceres disponibles en el mode de captura de pantalla. + + + + Description + Descripció + + + + Key + Tecla + + + + Left Double-click + Doble Clic Esquerre + + + + Toggle side panel + Activa/desactiva el panell lateral + + + + Grab a color from the screen + Agafa un color de la pantalla + + + + Resize selection left 1px + Redimensiona la selecció cap a l'esquerra 1px + + + + Resize selection right 1px + Redimensiona la selecció cap a la dreta 1px + + + + Resize selection up 1px + Redimensiona la selecció cap a dalt 1px + + + + Resize selection down 1px + Redimensiona la selecció cap avall 1px + + + + Symmetrically decrease width by 2px + Redueix l'amplada simètricament en 2px + + + + Symmetrically increase width by 2px + Augmenta l'amplada simètricament en 2px + + + + Symmetrically increase height by 2px + Augmenta l'alçada simètricament en 2px + + + + Symmetrically decrease height by 2px + Redueix l'alçada simètricament en 2px + + + + Select entire screen + Selecciona tota la pantalla + + + + Move selection left 1px + Mou la selecció cap a l'esquerra 1 px + + + + Move selection right 1px + Mou la selecció cap a la dreta 1 px + + + + Move selection up 1px + Mou la selecció cap a dalt 1 px + + + + Move selection down 1px + Mou la selecció cap avall 1 px + + + + Commit text in text area + Confirma el text a l'àrea de text + + + + Delete selected drawn object + Suprimeix l'objecte dibuixat seleccionat + + + + Cancel current selection + Cancel·la la selecció actual + + + Delete current tool + Delete current tool + + + + Capture screen + Captura la pantalla + + + + Screenshot history + Historial de captures de pantalla + + + + SidePanelWidget + + Active thickness: + Active thickness: + + + Active color: + Active color: + + + Press ESC to cancel + Press ESC to cancel + + + + Active tool size: + Mida de l'eina activa: + + + + Active Color: + Color Actiu: + + + + Grab Color + Agafa Color + + + + Display grid + Mostra la quadrícula + + + + SizeDecreaseTool + + + Decrease Tool Size + Disminueix la Mida de l'Eina + + + + Decrease the size of the other tools + Disminueix la mida de les altres eines + + + + SizeIncreaseTool + + + Increase Tool Size + Augmenta la Mida de l'Eina + + + + Increase the size of the other tools + Augmenta la mida de les altres eines + + + + SizeIndicatorTool + + Selection Size Indicator + Indicador de mida de selecció + + + Show X and Y dimensions of the selection + Show X and Y dimensions of the selection + + + Show the dimensions of the selection (X Y) + Mostra les mides de la selecció (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + Segle (00-99) + + + + Year (00-99) + Any (00-99) + + + + Year (2000) + Any (2000) + + + + Month Name (jan) + Nom del mes (jul) + + + + Month Name (january) + Nom del mes (juliol) + + + + Month (01-12) + Mes (01-12) + + + + Week Day (1-7) + Dia de la setmana (1-7) + + + + Week (01-53) + Setmana (01-53) + + + + Day Name (mon) + Nom del dia (dg) + + + + Day Name (monday) + Nom del dia (diumenge) + + + + Day (01-31) + Dia (01-31) + + + + Day of Month (1-31) + Dia del mes (1-31) + + + + Day (001-366) + Dia (001-366) + + + + Hour (00-23) + Hora (00-23) + + + + Hour (01-12) + Hora (01-12) + + + + Minute (00-59) + Minut (00-59) + + + + Second (00-59) + Segon (00-59) + + + + Full Date (%m/%d/%y) + Data Completa (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + Data Completa (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + Data Completa (%d-%m-%Y) + + + + Time (%H-%M-%S) + Hora (%H-%M-%S) + + + + Time (%H-%M) + Hora (%H-%M) + + + + SystemNotification + + + Flameshot Info + Informació de Flameshot + + + + TextConfig + + + StrikeOut + Ratlla + + + + Underline + Subratlla + + + + Bold + Negreta + + + + Italic + Cursiva + + + + Left Align + Alinea a l'Esquerra + + + + Center Align + Alinea al Centre + + + + Right Align + Alinea a la Dreta + + + + TextTool + + + Text + Text + + + + Add text to your capture + Afegeix text a la teva captura + + + + TrayIcon + + + &Take Screenshot + &Fes Captura + + + + &Open Launcher + &Obre el Llançador d'aplicacions + + + + &Configuration + &Configuració + + + + &About + &Quant a + + + + Check for updates + Comprova si hi ha actualitzacions disponibles + + + + New version %1 is available + Nova versió %1 disponible + + + + &Quit + &Surt + + + + &Latest Uploads + &Últimes Càrregues + + + + &Open Save Path + &Obre la Ruta on Desar + + + + UIcolorEditor + + UI Color Editor + Editor de color de la interfície + + + + Change the color moving the selectors and see the changes in the preview buttons. + Canvieu el color movent els selectors i observeu els canvis en els botons de previsualització. + + + + Select a Button to modify it + Seleccioneu un botó per a modificar-lo + + + + Main Color + Color principal + + + + Click on this button to set the edition mode of the main color. + Feu clic en aquest botó per a aplicar el mode d'edició per al color principal. + + + + Contrast Color + Color de contrast + + + + Click on this button to set the edition mode of the contrast color. + Feu clic en aquest botó per a aplicar el mode d'edició per al color de contrast. + + + + UndoTool + + + Undo + Desfés + + + + Undo the last modification + Desfés l'última modificació + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + Nova versió %1 de Flameshot està disponible + + + + Ignore + Ignora + + + + Later + Després + + + + Update + Actualitza + + + + UploadHistory + + + Upload History + Historial de Càrregues + + + + Screenshots history is empty + L'historial de captures de pantalla és buit + + + + UploadLineItem + + + Form + Form + + + + TextLabel + EtiquetaText + + + + Copy URL + Copia l'URL + + + + Open In Browser + Obre Al Navegador + + + + Confirm to delete + Confirmeu per esborrar + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Esteu segur de voler esborrar una captura de pantalla de les darreres pujades i del servidor? + + + + UtilityPanel + + + Close + Tanca + + + + <Empty> + <Buit> + + + + VisualsEditor + + + Opacity of area outside selection: + Opacitat de la zona fora de la selecció: + + + + UI Color Editor + Editor de color de la interfície d'usuari + + + + Colorpicker Editor + Editor de Selector de colors + + + + Button Selection + Selecció de botó + + + + Select All + Selecciona-ho tot + + + + color_widgets::ColorDialog + + + Pick + Selecciona + + + + color_widgets::ColorPalette + + + Unnamed + Sense nom + + + + color_widgets::ColorPaletteModel + + + Unnamed + Sense nom + + + + %1 (%2 colors) + %1 (%2 colors) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + Obre una nova paleta des de fitxer + + + + + Create a new palette + Crea una nova paleta + + + + + Duplicate the current palette + Duplica la paleta actual + + + + + Delete the current palette + Elimina la paleta actual + + + + + Revert changes to the current palette + Reverteix els canvis a la paleta actual + + + + + Save changes to the current palette + Desa els canvis a la paleta actual + + + + + Add a color to the palette + Afegeix un color a la paleta + + + + + Remove the selected color from the palette + Elimina el color seleccionat de la paleta + + + + + New Palette + Nova Paleta + + + + + Name + Nom + + + + GIMP Palettes (*.gpl) + Paletes GIMP (*.gpl) + + + + Palette Image (%1) + Imatge de la Paleta (%1) + + + + All Files (*) + Tots els Fitxers (*) + + + + + Open Palette + Obre Paleta + + + + Failed to load the palette file +%1 + No s'ha pogut carregar el fitxer de la paleta +%1 + + + + color_widgets::GradientEditor + + + Add Color + Afegeix Color + + + + Remove Color + Elimina Color + + + + Edit Color... + Edita Color... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 colors) + + + + color_widgets::Swatch + + + Clear Color + Neteja Color + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_cs.ts b/data/translations/Internationalization_cs.ts new file mode 100644 index 0000000..00028b7 --- /dev/null +++ b/data/translations/Internationalization_cs.ts @@ -0,0 +1,3244 @@ + + + + + AbstractWidgetList + + + Add New + Přidat nový + + + + Move Up + Posunout nahoru + + + + Move Down + Posunout dolů + + + + Remove + Odstranit + + + + AcceptTool + + + Accept + Přijmout + + + + Accept the capture + Přijmout zachycenou obrazovku + + + + AppLauncher + + + App Launcher + Spouštěč programů + + + + Choose an app to open the capture + Vyberte program pro otevření zachycené obrazovky + + + + AppLauncherWidget + + + Open With + Otevřít s + + + + Launch in terminal + Spustit v terminálu + + + + Keep open after selection + Ponechat otevřené po výběru + + + + + Error + Chyba + + + + Unable to write in + Nelze zapsat + + + + Unable to launch in terminal. + Nelze spustit v terminálu. + + + + ArrowTool + + + Arrow + Šipka + + + + Set the Arrow as the paint tool + Nastavit šipku jako malovací nástroj + + + + BlurTool + + Blur + Rozmazání + + + Set Blur as the paint tool + Nastavit rozmazání jako malovací nástroj + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Režim zachytávání</b> + + + + Rectangular Region + Pravouhlá oblast + + + + Full Screen (Current Display) + Celá obrazovka (nynější obrazovka) + + + + Full Screen (All Monitors) + Celá obrazovka (všechny monitory) + + + + No Delay + Bez zpoždění + + + + second + sekunda + + + + + + seconds + sekund + + + + + Take new screenshot + Zachytit nový snímek + + + + + Area: + Oblast: + + + + + Capture Launcher + Spouštěč zachytávání obrazovky + + + + + TextLabel + Textový štítek + + + + + Capture Mode + Režim zachytávání obrazovky + + + + + Delay: + Zpoždění: + + + + + WxH+x+y + WxH+x+y + + + + CaptureWidget + + + Unable to capture screen + Nelze zachytit obrazovku + + + + Mouse + Myš + + + + Select screenshot area + Vybrat oblast snímku obrazovky + + + + Mouse Wheel + Kolečko myši + + + + Change tool size + Změnit velikost nástroje + + + + Right Click + Klepnutí pravým tlačítkem myši + + + + Show color picker + Ukázat volič barev + + + + Open side panel + Otevřít postranní panel + + + + Esc + Esc + + + + Exit + Ukončit + + + + Quit Capture + Opustit zachycování + + + + Are you sure you want to quit capture? + Opravdu chcete opustit zachycování? + + + + Do not show this again + + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot ztratil zaměření. Klávesové zkratky nebudou pracovat, dokud někam neklepnete. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + Chyba v nastavení vyřešena. Spusťte znovu `flameshot gui` pro jeho použití. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Vyberte oblast myší nebo stiskněte Esc pro opuštění. +Stiskněte Enter pro zachycení obrazovky +Stiskněte pravé tlačítko myši pro zobrazení voliče barev. +Použijte kolečko myši pro změnu tloušťky nástroje. +Stiskněte mezerník pro otevření postranního panelu. + + + + Tool Settings + Nastavení nástrojů + + + + CircleCountTool + + + Circle Counter + Kruhové počítadlo + + + + Add an autoincrementing counter bubble + Přidat bublinu s počítadlem (s číslem automaticky vždy zvýšeným o jednotku) + + + + CircleTool + + + Circle + Kruh + + + + Set the Circle as the paint tool + Nastavit kruh jako malovací nástroj + + + + ColorDialog + + + + Select Color + Vybrat barvu + + + + + Saturation + Sytost + + + + + Hue + Odstín + + + + + Hex + Hex + + + + + Blue + Modrá + + + + + Value + Hodnota + + + + + Green + Zelená + + + + + Alpha + Alfa + + + + + Red + Červená + + + + ColorGrabWidget + + + Accept color + Přijmout barvu + + + + Enter or Left Click + Enter or Left Click + + + + Precisely select color + Přesně vybrat barvu + + + + Hold Left Click + Hold Left Click + + + + Toggle magnifier + Přepnout lupu + + + + Space or Right Click + Space or Right Click + + + + Cancel + Zrušit + + + + Esc + Esc + + + + ColorPickerEditor + + Select Preset: + Vybrat přednastavení: + + + Select preset using the spinbox + Vyberte přednastavení pomocí číselníku + + + + Edit Preset: + Edit Preset: + + + + Enter color to update preset + Enter color to update preset + + + + Update + Aktualizovat + + + + Press button to update the selected preset + Press button to update the selected preset + + + + Delete + Smazat + + + + Press button to delete the selected preset + Stisknutím tlačítka odstraníte vybrané přednastavení + + + + Add Preset: + Přidat přednastavení: + + + + Enter color manually or select it using the color-wheel + Zadejte barvu ručně nebo ji vyberte pomocí barevného kolečka + + + + Add + Přidat + + + + Press button to add preset + Stiskněte tlačítko pro přidání přednastavení + + + + + Error + Chyba + + + + Unable to add preset. Maximum limit reached. + Přednastavení nelze přidat. Bylo dosaženo největší meze. + + + + Unable to remove preset. Minimum limit reached. + Přednastavení nelze odstranit. Bylo dosaženo nejmenší meze. + + + + ConfigErrorDetails + + + Configuration errors + Chyby v nastavení + + + + ConfigHandler + + + Unrecognized setting: '%1' + + Nerozpoznané nastavení: '%1' + + + + + Unrecognized shortcut name: '%1'. + + Nerozpoznaný název klávesové zkratky: '%1'. + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + Střet klávesových zkratek: '%1' a '%2' mají stejnou klávesovou zkratku: %3 + + + + + Bad value in '%1'. Expected: %2 + + Špatná hodnota v '%1'. Očekáváno: %2 + + + + + You have successfully resolved the configuration error. + Úspěšně jste vyřešili chybu v nastavení. + + + + The configuration contains an error. Open configuration to resolve. + Nastavení obsahuje chybu. Otevřete nastavení pro její vyřešení. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + Chybný klíč nastavení '%1' v ConfigHandler. Nahlaste to prosím jako chybu. + + + + ConfigResolver + + + Resolve configuration errors + Vyřešit chyby v nastavení + + + + <b>You must resolve all errors before continuing:</b> + <b>Před pokračováním musíte vyřešit všechny chyby:</b> + + + + Reset + Obnovit výchozí + + + + Reset to the default value. + Obnovit výchozí hodnotu. + + + + Remove + Odstranit + + + + Remove this setting. + Odstranit toto nastavení. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + Některé klávesové zkratky jsou ve střetu. +To NEZABRÁNÍ spuštění Flameshotu. +Vyřešte je, prosím, ručně v souboru s nastavením. + + + + Resolve all + Vyřešit vše + + + + Resolve all listed errors. + Resolve all listed errors. + + + + Details + Details + + + + ConfigWindow + + + Configuration + Nastavení + + + + Interface + Rozhraní + + + + Filename Editor + Editor názvů souborů + + + + General + Obecné + + + + Shortcuts + Klávesové zkratky + + + + Resolve + Vyřešit + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>Soubor s nastavení obsahuje chyby. Před pokračováním je vyřešte.</b> + + + + Controller + + New version %1 is available + Je dostupná nová verze %1 + + + You have the latest version + Máte nejnovější verzi + + + Failed to get information about the latest version. + Nepodařilo se získat informace o nejnovější verzi. + + + Error + Chyba + + + Unable to close active modal widgets + Činné modální prvky nelze zavřít + + + &Take Screenshot + &Zachytit obrazovku + + + &Open Launcher + &Otevřít spouštěč + + + &Configuration + &Nastavení + + + &About + O &programu + + + Check for updates + Kontrola aktualizací + + + &Latest Uploads + &Nejnovější nahrané položky + + + URL copied to clipboard. + Adresa (URL) zkopírována do schránky. + + + &Information + &Informace + + + &Quit + &Ukončit + + + + CopyTool + + + Copy + Kopírovat + + + + Copy selection to clipboard + Kopírovat výběr do schránky + + + Copy the selection into the clipboard + Kopírovat výběr do schránky + + + + DBusUtils + + Unable to connect via DBus + Nelze se spojit přes DBus + + + + ExitTool + + + Exit + Ukončit + + + + Leave the capture screen + Opustit zachytávací obrazovku + + + + FileNameEditor + + + Edit the name of your captures: + Upravit názvy zachycených obrazovek: + + + + Edit: + Upravit: + + + + Preview: + Náhled: + + + + Save + Uložit + + + + Saves the pattern + Uloží vzor + + + + Restore + Obnovit + + + Reset + Nastavit znovu + + + + Restores the saved pattern + Obnoví uložený vzor + + + + Clear + Smazat + + + + Deletes the name + Smaže název + + + + Flameshot + + + Error + Chyba + + + + Unable to close active modal widgets + Činné modální prvky nelze zavřít + + + + URL copied to clipboard. + Adresa (URL) zkopírována do schránky. + + + + FlameshotDaemon + + + New version %1 is available + Je dostupná nová verze %1 + + + + You have the latest version + Máte nejnovější verzi + + + + Failed to get information about the latest version. + Nepodařilo se získat informace o nejnovější verzi. + + + + Unable to connect via DBus + Nelze se spojit přes DBus + + + + GeneneralConf + + Import + Zavést + + + Error + Chyba + + + Unable to read file. + Nelze přečíst soubor. + + + Unable to write file. + Nelze zapsat soubor. + + + Save File + Uložit soubor + + + Confirm Reset + Potvrdit vrácení na výchozí + + + Are you sure you want to reset the configuration? + Opravdu chcete nastavení vrátit do výchozího stavu? + + + Show help message + Ukázat zprávu s nápovědou + + + Show the help message at the beginning in the capture mode. + Ukázat zprávu s nápovědou na začátku v režimu zachytávání. + + + Show the side panel button + Ukázat tlačítko na postranním panelu + + + Show the side panel toggle button in the capture mode. + V režimu zachytávání ukazovat tlačítko na postranním panelu. + + + Show desktop notifications + Ukázat oznámení + + + Show tray icon + Ukázat ikonu v oznamovací oblasti panelu + + + Show the systemtray icon + Ukázat ikonu v oznamovací oblasti panelu + + + Configuration File + Soubor s nastavením + + + Export + Vyvést + + + Reset + Nastavit znovu + + + Launch at startup + Spustit při spuštění + + + Launch Flameshot + Spustit Flameshot + + + Close after capture + Zavřít po vytvoření snímku + + + Close after taking a screenshot + Zavřít po vytvoření snímku obrazovky + + + Copy URL after upload + Kopírovat adresu (URL) po nahrání + + + Copy URL and close window after upload + Po nahrání zkopírovat URL a zavřít okno + + + Save image after copy + Uložit obrázek po kopírování + + + Save image file after copying it + Uložit obrázek se souborem po jeho zkopírování + + + Save Path + Cesta pro ukládání + + + Change... + Změnit... + + + Choose a Folder + Vyberte složku + + + Unable to write to directory. + Nelze zapsat do adresáře. + + + + GeneralConf + + + + Import + Zavést + + + + + + + Error + Chyba + + + + Unable to read file. + Nelze přečíst soubor. + + + + + Unable to write file. + Nelze zapsat soubor. + + + + Save File + Uložit soubor + + + + Confirm Reset + Potvrdit obnovení výchozí hodnoty + + + + Are you sure you want to reset the configuration? + Opravdu chcete nastavení vrátit do výchozího stavu? + + + + Show help message + Ukázat zprávu s nápovědou + + + Show the help message at the beginning in the capture mode. + Ukázat zprávu s nápovědou na začátku v režimu zachytávání. + + + + Show the side panel button + Ukázat tlačítko na postranním panelu + + + Show the side panel toggle button in the capture mode. + V režimu zachytávání ukazovat tlačítko na postranním panelu. + + + + Show desktop notifications + Ukázat oznámení na ploše + + + + Show tray icon + Ukázat ikonu v oznamovací oblasti panelu + + + Show the systemtray icon + Ukázat ikonu v oznamovací oblasti panelu + + + + Confirmation required to delete screenshot from the latest uploads + Pro smazání snímku obrazovky v nejnověji nahraných souborech je vyžadováno potvrzení + + + + Configuration File + Soubor s nastavením + + + + Export + Vyvést + + + + Reset + Obnovit výchozí + + + + Automatic check for updates + Automaticky se dívat po aktualizacích + + + + Allow multiple flameshot GUI instances simultaneously + Povolit více instancí grafického uživatelského rozhraní Flameshotu současně + + + This allows you to take screenshots of flameshot itself for example. + This allows you to take screenshots of flameshot itself for example. + + + Automatically close daemon when it is not needed + Automaticky zavřít démona, když není potřeba + + + Launch at startup + Spustit při spuštění + + + Launch Flameshot + Spustit Flameshot + + + + Show welcome message on launch + Zobrazit uvítací zprávu při spuštění + + + + Use large predefined color palette + Použít velkou předem stanovenou paletu barev + + + + Copy URL after upload + Kopírovat adresu (URL) po nahrání + + + Copy URL and close window after upload + Po nahrání zkopírovat URL a zavřít okno + + + + Save image after copy + Uložit obrázek po kopírování + + + Save image file after copying it + Uložit obrázek se souborem po jeho zkopírování + + + + Show the help message at the beginning in the capture mode + Ukázat zprávu s nápovědou na začátku v režimu zachytávání + + + + Use last region for GUI mode + Use last region for GUI mode + + + + Use the last region as the default selection for the next screenshot in GUI mode + Use the last region as the default selection for the next screenshot in GUI mode + + + + Show the side panel toggle button in the capture mode + V režimu zachytávání ukazovat tlačítko na postranním panelu + + + + Enable desktop notifications + Povolit oznámení na ploše + + + + Show abort notifications + + + + + Enable abort notifications + + + + + Show icon in the system tray + Ukázat ikonu v oznamovací oblasti panelu + + + + Use grim to capture screenshots + + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + + + + + Ask for confirmation to delete screenshot from the latest uploads + PožádT o potvrzení pro odstranĚNÍ snímKU obrazovky z nejnověji nahraných videí + + + + Check for updates automatically + Automaticky se dívat po aktualizacích + + + + This allows you to take screenshots of Flameshot itself for example + To vám například umožňuje pořizovat snímky obrazovky se samotným Flameshotem + + + Launch Flameshot daemon when computer is booted + Spustit démona Flameshotu při spuštění počítače + + + + Show the welcome message box in the middle of the screen while taking a screenshot + Při pořizování snímku obrazovky zobrazit okno s uvítací zprávou uprostřed obrazovky + + + + Use a large predefined color palette + Použít velkou předem stanovenou paletu barev + + + + Copy on double click + Copy on double click + + + Enable Copy on Double Click + Enable Copy on Double Click + + + Copy URL and close window after uploading was successful + Po úspěšném nahrání zkopírovat adresu (URL) a zavřít okno + + + + Automatically unload from memory when it is not needed + + + + + Automatically close daemon (background process) when it is not needed + + + + + Launch in background at startup + + + + + Launch Flameshot daemon (background process) when computer is booted + + + + + Ask before quit capture + + + + + Show the confirmation prompt before ESC quit + + + + + Enable Copy to clipboard on Double Click + + + + + Copy URL after uploading was successful + + + + + After copying the screenshot, save it to a file as well + Po zkopírování snímku obrazovky jej uložit do souboru + + + + Save Path + Cesta pro ukládání + + + + Change... + Změnit... + + + + Use fixed path for screenshots to save + Pro uložení snímků obrazovky použít pevnou cestu + + + + Preferred save file extension: + Upřednostňovaná přípona souboru při uložení: + + + + Latest Uploads Max Size + Největší velikost nejnověji nahraných souborů + + + + Imgur Application Client ID + Imgur Application Client ID + + + + Undo limit + Omezení pro počet kroků zpět + + + + Use JPG format for clipboard (PNG default) + Použít pro schránku formát JPG (výchozí PNG) + + + + Use lossy JPG format for clipboard (lossless PNG default) + + + + + Copy file path after save + Po uložení zkopírovat cestu k souboru + + + + Copy the file path to clipboard after the file is saved + Po uložení souboru zkopírovat cestu k souboru do schránky + + + + Anti-aliasing image when zoom the pinned image + Vyhlazení obrazu při přiblížení připnutého obrázku + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + Po přiblížení připnutého obrázku se má obrázek vyhladit nebo má zůstat rozčtverečkovaný + + + + + Upload image without confirmation + Nahrát obrázek bez potvrzení + + + + Choose a Folder + Vyberte složku + + + + Unable to write to directory. + Nelze zapsat do adresáře. + + + + Show magnifier + Ukázat lupu + + + + Enable a magnifier while selecting the screenshot area + Při výběru oblasti snímku obrazovky povolit lupu + + + + Square shaped magnifier + Lupa čtvercového tvaru + + + + Make the magnifier to be square-shaped + Zobrazit lupu tak, aby měla čtvercový tvar + + + + Milliseconds before geometry display hides; 0 means do not hide + + + + + Set geometry display timeout (ms) + + + + + Selection Geometry Display + + + + + Display Location + + + + + None + + + + + Top Left + + + + + Top Right + + + + + Bottom Left + + + + + Bottom Right + + + + + Center + + + + + Quality range of 0-100; Higher number is better quality and larger file size + + + + + JPEG Quality + + + + + Reverse arrow + + + + + Draw the arrow head first + + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + Latest Uploads + + + Screenshots history is empty + Screenshots history is empty + + + Copy URL + Kopírovat adresu (URL) + + + URL copied to clipboard. + Adresa (URL) zkopírována do schránky. + + + Open in browser + Open in browser + + + Confirm to delete + Confirm to delete + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Are you sure you want to delete a screenshot from the latest uploads and server? + + + + ImgS3Uploader + + Uploading Image + Nahrává se obrázek + + + URL copied to clipboard. + Adresa (URL) zkopírována do schránky. + + + Error + Chyba + + + + ImgUploadDialog + + + Upload Confirmation + Potvrzení nahrání + + + + Do you want to upload this capture? + Chcete nahrát tento záběr zachycené obrazovky? + + + + + Upload without confirmation + Nahrát bez potvrzení + + + + ImgUploader + + Uploading Image + Nahrává se obrázek + + + Unable to open the URL. + Nelze otevřít adresu (URL). + + + URL copied to clipboard. + Adresa (URL) zkopírována do schránky. + + + Screenshot copied to clipboard. + Snímek obrazovky zkopírován do schránky. + + + Copy URL + Kopírovat adresu (URL) + + + Open URL + Otevřít adresu (URL) + + + Delete image + Smazat obrázek + + + Image to Clipboard. + Obrázek do schránky. + + + + ImgUploaderBase + + + Upload image + Nahrát obrázek + + + + Uploading Image + Nahrává se obrázek + + + + Copy URL + Kopírovat adresu (URL) + + + + Open URL + Otevřít adresu (URL) + + + + Delete image + Smazat obrázek + + + + Image to Clipboard. + Obrázek do schránky. + + + + Save image + Uložit obrázek + + + + Unable to open the URL. + Nelze otevřít adresu (URL). + + + + URL copied to clipboard. + Adresa (URL) zkopírována do schránky. + + + + Screenshot copied to clipboard. + Snímek obrazovky zkopírován do schránky. + + + + Unable to save the screenshot to disk. + Snímek obrazovky nelze uložit na disk. + + + + Screenshot saved. + Snímek obrazovky uložen. + + + + ImgUploaderTool + + + Image Uploader + Nahrávač obrázků + + + + Upload the selection + Nahrát výběr + + + + ImgurUploader + + Upload to Imgur + Nahrát do Imgur + + + Uploading Image + Nahrává se obrázek + + + Copy URL + Kopírovat adresu (URL) + + + Open URL + Otevřít adresu (URL) + + + Delete image + Smazat obrázek + + + Image to Clipboard. + Obrázek do schránky. + + + + Unable to open the URL. + Nelze otevřít adresu (URL). + + + URL copied to clipboard. + Adresa (URL) zkopírována do schránky. + + + Screenshot copied to clipboard. + Snímek obrazovky zkopírován do schránky. + + + + ImgurUploaderTool + + Image Uploader + Nahrávač obrázků + + + Upload the selection to Imgur + Nahrát výběr do Imgur + + + + InfoWindow + + + + About + O programu + + + + + Icon + Ikona + + + + + License + Povolení + + + + + GPLv3+ + GPLv3+ + + + + + Version + Verze + + + + + Flameshot v + Flameshot v + + + + + OS Info + Informace o operačním systému + + + + + Copy Info + Informace o kopírování + + + SPACEBAR + MEZERNÍK + + + Right Click + Klepnutí pravým tlačítkem myši + + + Mouse Wheel + Kolečko myši + + + Move selection 1px + Posunout výběr o 1 px + + + Resize selection 1px + Změnit velikost výběru o 1 px + + + Quit capture + Ukončit zachytávání obrazovky + + + Copy to clipboard + Kopírovat do schránky + + + Save selection as a file + Uložit výběr jako soubor + + + Undo the last modification + Zrušit poslední změnu + + + Toggle visibility of sidebar with options of the selected tool + Přepnout viditelnost postranního panelu s volbali pro vybraný nástroj + + + Show color picker + Ukázat volič barev + + + Change the tool's thickness + Změnit tloušťku nástroje + + + Available shortcuts in the screen capture mode. + Dostupné zkratky v režimu zachytávání obrazovky. + + + Key + Klávesa + + + Description + Popis + + + <u><b>License</b></u> + <u><b>Licence</b></u> + + + <u><b>Version</b></u> + <u><b>Verze</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Zkratky</b></u> + + + + InvertTool + + + Invert + Obrátit + + + + Set Inverter as the paint tool + Nastavit obraceč jako nástroj malování + + + + LineTool + + + Line + Čára + + + + Set the Line as the paint tool + Nastavit čáru jako malovací nástroj + + + + MarkerTool + + + Marker + Zvýrazňovač + + + + Set the Marker as the paint tool + Nastavit zvýrazňovač jako malovací nástroj + + + + MoveTool + + + Move + Posunutí + + + + Move the selection area + Posunout oblast výběru + + + + PencilTool + + + Pencil + Tužka + + + + Set the Pencil as the paint tool + Nastavit tužku jako malovací nástroj + + + + PinTool + + + Pin Tool + Přišpendlení + + + + Pin image on the desktop + Přišpendlit obrázek na plochu + + + + PinWidget + + + Context menu + Context menu + + + + Copy to clipboard + Kopírovat do schránky + + + + Save to file + Save to file + + + + Rotate Right + + + + + Rotate Left + + + + + Increase Opacity + + + + + Decrease Opacity + + + + + Close + Zavřít + + + + PixelateTool + + + Pixelate + Rozčtverečkování + + + + Set Pixelate as the paint tool. + + + + Set Pixelate as the paint tool + Nastaviť rozčtverečkování jako nástroj pro úpravy + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QHotkey + + Failed to register %1. Error: %2 + Nepodařilo se zaregistrovat %1. Chyba: %2 + + + Failed to unregister %1. Error: %2 + Nepodařilo se zrušit registraci %1. Chyba: %2 + + + + QObject + + + Save Error + Chyba při ukládání + + + + + Capture saved as + Zachycená obrazovka uložena jako + + + + + Capture saved to clipboard. + Zachycená obrazovka uložena do schránky. + + + Capture saved to clipboard + Zachycená obrazovka uložena do schránky + + + + Error while saving to clipboard + Chyba při ukládání do schránky + + + + + Error trying to save as + Chyba při ukládání jako + + + + Save screenshot + Uložit snímek obrazovky + + + + Path copied to clipboard as + Cesta zkopírována do schránky jako + + + Saving canceled + Saving canceled + + + Save canceled + Save canceled + + + Capture is saved and copied to the clipboard as + Capture is saved and copied to the clipboard as + + + + Unable to connect via DBus + Nelze se spojit přes DBus + + + + Powerful yet simple to use screenshot software. + Silný, ale zároveň též jednoduchý program na zachytávání obrazovky. + + + + See + Podívejte se + + + Capture the entire desktop. + Zachytit celou plochu. + + + + Open the capture launcher. + Otevřít spouštěč zachytávání. + + + + Start a manual capture in GUI mode. + Spustit ruční zachytávání v režimu uživatelského rozhraní. + + + + Configure + Nastavit + + + Capture a single screen. + Zachytit jednu obrazovku. + + + Path where the capture will be saved + Cesta, kam bude snímek uložen + + + + Capture screenshot of all monitors at the same time. + + + + + Capture a screenshot of the specified monitor. + + + + + Existing directory or new file to save to + Stávající adresář nebo nový soubor k uložení + + + + Save the capture to the clipboard + Uložit snímek do schránky + + + + Pin the capture to the screen + Připnout záběr se zachycenou obrazovkou k obrazovce + + + + Upload screenshot + Nahrát snímek obrazovky + + + + Delay time in milliseconds + Čas zpoždění v milisekundách + + + + Repeat screenshot with previously selected region + Repeat screenshot with previously selected region + + + + Screenshot region to select + Oblast snímku obrazovky k vybrání + + + + Set the filename pattern + Nastavit vzor pro pojmenování souborů + + + + Accept capture as soon as a selection is made + Přijmout zachycení obrazovky, jakmile se provede výběr + + + + Enable or disable the trayicon + Povolit nebo zakázat ikonu v oznamovací oblasti panelu + + + + Enable or disable run at startup + Povolit nebo zakázat spuštění při spuštění systému + + + + Enable or disable the notifications + + + + + Check the configuration for errors + Zkontrolovat nastavení, zda neobsahuje chyby + + + + Show the help message in the capture mode + Ukazovat nápovědu v režimu zachytávání + + + + Define the main UI color + Nastavit barvu hlavního uživatelského rozhraní + + + + Define the contrast UI color + Nastavit kontrastní barvu uživatelského rozhraní + + + + Print raw PNG capture + Zobrazit nezpracovaný PNG snímek + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + Zobrazit natočení výběru ve formátu Š V X Y. Nedělá nic, pokud je zadáno nezpracovaný + + + + Define the screen to capture (starting from 0) + Stanovit obrazovku, která bude zachytávána (od 0) + + + + Invalid delay, it must be a number greater than 0 + Neplatné zpoždění, musí to být číslo větší než 0 + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + Neplatná oblast, použijte „ŠxV+X+Y“ nebo „vše“ nebo „screen0/screen1/...“. + + + + Invalid path, must be an existing directory or a new file in an existing directory + Neplatná cesta, musí se jednat o stávající adresář nebo nový soubor v existujícím adresáři + + + Define the screen to capture + Nastavit monitor, který bude zachytáván + + + + default: screen containing the cursor + výchozí: obrazovka, na které je ukazovátko myši + + + + Screen number + Číslo obrazovky + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Neplatná barva, tento přepínač podporuje následující formáty: +- #RGB (každá ze složek R, G a B je samostatným hexadecimálním číslem) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- anglické názvy barev jako 'blue' nebo 'red' +Možná budete muset napsat před '#' opačné (obrácené) lomítko, tedy '\#FFF' + + + Invalid delay, it must be higher than 0 + Neplatné zpoždění, musí být vyšší než 0 + + + + Invalid screen number, it must be non negative + Neplatné číslo obrazovky, může být jen kladné + + + Invalid path, it must be a real path in the system + Neplatná cesta, musí se jednat o skutečnou cestu v systému + + + + Invalid value, it must be defined as 'true' or 'false' + Neplatná hodnota, musí být vymezenná jako 'pravda' nebo 'nepravda' + + + + Error + Chyba + + + + Unable to write in + Nelze zapsat + + + + Options + Volby + + + Arguments + Argumenty + + + arguments + argumenty + + + + Subcommands + + + + + subcommands + + + + + Usage + Použití + + + + options + volby + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Ve výchozím nastavení spustí Flameshot na pozadí a v oznamovacím panelu přidá ikonu pro nastavení. + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Obvykle se Flameshot spouští na pozadí a přidává do oznamovací oblasti panelu ikonu, kterou je ho možné ovládat. + + + + Requested screen exceeds screen count + Requested screen exceeds screen count + + + + Full screen screenshot pinned to screen + Snímek celé obrazovky připnutý na obrazovku + + + URL copied to clipboard. + Adresa (URL) zkopírována do schránky. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Ahoj, jsem tady! Klepnutím na ikonu v oznamovacím panelu pořídíte snímek obrazovky nebo klepnutím pravým tlačítkem zobrazíte další možnosti. + + + Toggle side panel + Toggle side panel + + + Resize selection left 1px + Resize selection left 1px + + + Resize selection right 1px + Resize selection right 1px + + + Resize selection up 1px + Resize selection up 1px + + + Resize selection down 1px + Resize selection down 1px + + + Select entire screen + Select entire screen + + + Move selection left 1px + Move selection left 1px + + + Move selection right 1px + Move selection right 1px + + + Move selection up 1px + Move selection up 1px + + + Move selection down 1px + Move selection down 1px + + + Commit text in text area + Commit text in text area + + + Delete current tool + Delete current tool + + + + Quit capture + Ukončit zachytávání obrazovky + + + + Screenshot history + Historie snímků obrazovky + + + + Capture screen + Zachytit obrazovku + + + + Show color picker + Ukázat volič barev + + + + Change the tool's size + Změnit velikost nástroje + + + Change the tool's thickness + Změnit tloušťku nástroje + + + + RectangleTool + + + Rectangle + Obdélník + + + + Set the Rectangle as the paint tool + Nastavit obdélník jako malovací nástroj + + + + RedoTool + + + Redo + Znovu + + + + Redo the next modification + Znovu udělat další změnu + + + + SaveTool + + + Save + Uložit + + + + Save screenshot to a file + Uložit snímek obrazovky do souboru + + + Save the capture + Uložit zachycenou obrazovku + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + + + + Unable to capture screen + Nelze zachytit obrazovku + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + Obdélníkový výběr + + + + Set Selection as the paint tool + Nastavit výběr jako malovací nástroj + + + + SetShortcutDialog + + + Set Shortcut + Nastavit klávesovou zkratku + + + + Enter new shortcut to change + Zadejte novou zkratku, kterou chcete změnit + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Stiskněte Esc pro zrušení nebo ⌘+Backspace pro vypnutí klávesové zkratky. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Stiskněte Esc pro zrušení nebo Backspace pro vypnutí klávesové zkratky. + + + + + Flameshot must be restarted for changes to take effect. + Aby se změny projevily, musí být Flameshot restartován. + + + + ShortcutsWidget + + + Hot Keys + Klávesové zkratky + + + + Available shortcuts in the screen capture mode. + Dostupné zkratky v režimu zachytávání obrazovky. + + + + Description + Popis + + + + Key + Klávesa + + + + Left Double-click + Left Double-click + + + + Toggle side panel + Toggle side panel + + + + Grab a color from the screen + + + + + Resize selection left 1px + Resize selection left 1px + + + + Resize selection right 1px + Resize selection right 1px + + + + Resize selection up 1px + Resize selection up 1px + + + + Resize selection down 1px + Resize selection down 1px + + + + Symmetrically decrease width by 2px + + + + + Symmetrically increase width by 2px + + + + + Symmetrically increase height by 2px + + + + + Symmetrically decrease height by 2px + + + + + Select entire screen + Select entire screen + + + + Move selection left 1px + Move selection left 1px + + + + Move selection right 1px + Move selection right 1px + + + + Move selection up 1px + Move selection up 1px + + + + Move selection down 1px + Move selection down 1px + + + + Commit text in text area + Commit text in text area + + + + Delete selected drawn object + + + + + Cancel current selection + + + + Delete current tool + Delete current tool + + + + Capture screen + Zachytit obrazovku + + + + Screenshot history + Historie snímků obrazovky + + + + SidePanelWidget + + Active color: + Nynější barva: + + + Press ESC to cancel + Stiskněte Esc pro zrušení + + + + Active tool size: + Velikost činného nástroje: + + + + Active Color: + Nynější barva: + + + + Grab Color + Chytit barvu + + + + Display grid + + + + Active thickness: + Nynější tloušťka: + + + + SizeDecreaseTool + + + Decrease Tool Size + Zmenšit velikost nástroje + + + + Decrease the size of the other tools + Zmenšit velikost ostatních nástrojů + + + + SizeIncreaseTool + + + Increase Tool Size + Zvětšit velikost nástroje + + + + Increase the size of the other tools + Zvětšit velikost ostatních nástrojů + + + + SizeIndicatorTool + + Selection Size Indicator + Ukazatel velikosti výběru + + + Show X and Y dimensions of the selection + Zobrazit rozměry X a Y výběru + + + Show the dimensions of the selection (X Y) + Ukázat rozměry výběru (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + Století (00-99) + + + + Year (00-99) + Rok (00-99) + + + + Year (2000) + Rok (2000) + + + + Month Name (jan) + Název měsíce (led) + + + + Month Name (january) + Název měsíce (leden) + + + + Month (01-12) + Měsíc (01-12) + + + + Week Day (1-7) + Den v týdnu (1-7) + + + + Week (01-53) + Týden (01-53) + + + + Day Name (mon) + Název dne (pon) + + + + Day Name (monday) + Název dne (pondělí) + + + + Day (01-31) + Den (01-31) + + + + Day of Month (1-31) + Den v měsíci (1-31) + + + + Day (001-366) + Den v roce (001-366) + + + + Time (%H-%M-%S) + Čas (%H-%M-%S) + + + + Time (%H-%M) + Čas (%H-%M) + + + + Hour (00-23) + Hodina (00-23) + + + + Hour (01-12) + Hodina (01-12) + + + + Minute (00-59) + Minuta (00-59) + + + + Second (00-59) + Sekunda (00-59) + + + + Full Date (%m/%d/%y) + Celé datum (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + Celé datum (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + + + + + SystemNotification + + + Flameshot Info + Informace Flameshotu + + + + TextConfig + + + StrikeOut + Přeškrtnutí + + + + Underline + Podtržení + + + + Bold + Tučné + + + + Italic + Kurzíva + + + + Left Align + Zarovnání vlevo + + + + Center Align + Zarovnání na střed + + + + Right Align + Zarovnání vpravo + + + + TextTool + + + Text + Text + + + + Add text to your capture + Přidat text do zachyceného záběru + + + + TrayIcon + + + &Take Screenshot + &Zachytit obrazovku + + + + &Open Launcher + &Otevřít spouštěč + + + + &Configuration + &Nastavení + + + + &About + O &programu + + + + Check for updates + Kontrola aktualizací + + + + New version %1 is available + Je dostupná nová verze %1 + + + + &Quit + &Ukončit + + + + &Latest Uploads + &Nejnovější nahrané položky + + + + &Open Save Path + + + + + UIcolorEditor + + UI Color Editor + Editor barvy rozhraní + + + + Change the color moving the selectors and see the changes in the preview buttons. + Měňte barvu pohybováním voličů a dívejte se na změny v náhledových tlačítcích. + + + + Select a Button to modify it + Vybrat tlačítko pro jeho změnění + + + + Main Color + Hlavní barva + + + + Click on this button to set the edition mode of the main color. + Klepněte na toto tlačítko pro stanovení režimu upravení hlavní barvy. + + + + Contrast Color + Kontrastní barva + + + + Click on this button to set the edition mode of the contrast color. + Klepněte na toto tlačítko pro stanovení režimu upravení kontrastní barvy. + + + + UndoTool + + + Undo + Zpět + + + + Undo the last modification + Zrušit poslední změnu + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + Je dostupná nová verze Flameshotu %1 + + + + Ignore + Přehlížet + + + + Later + Později + + + + Update + Aktualizovat + + + + UploadHistory + + + Upload History + Historie nahrávání + + + + Screenshots history is empty + Historie snímků obrazovky je prázdná + + + + UploadLineItem + + + Form + Formulář + + + + TextLabel + Textový štítek + + + + Copy URL + Kopírovat adresu (URL) + + + + Open In Browser + Otevřít v prohlížeči + + + + Confirm to delete + Pro smazání potvrďte + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Opravdu chcete smazat snímek obrazovky z nejnověji nahraných souborů a serveru? + + + + UtilityPanel + + + Close + Zavřít + + + + <Empty> + <Prázdný> + + + + VisualsEditor + + + Opacity of area outside selection: + Neprůhlednost oblasti vně výběru: + + + + UI Color Editor + Editor barvy rozhraní + + + + Colorpicker Editor + Editor voliče barev + + + + Button Selection + Tlačítko výběru + + + + Select All + Vybrat vše + + + + color_widgets::ColorDialog + + + Pick + Zvolit + + + + color_widgets::ColorPalette + + + Unnamed + Nepojmenovaná + + + + color_widgets::ColorPaletteModel + + + Unnamed + Nepojmenovaná + + + + %1 (%2 colors) + %1 (%2 barev) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + Otevřít novou paletu ze souboru + + + + + Create a new palette + Vytvořit novou paletu + + + + + Duplicate the current palette + Zdvojit nynější paletu + + + + + Delete the current palette + Smazat nynější paletu + + + + + Revert changes to the current palette + Vrátit změny v nynější paletě + + + + + Save changes to the current palette + Uložit změny v nynější paletě + + + + + Add a color to the palette + Přidat barvu do palety + + + + + Remove the selected color from the palette + Odstranit vybranou barvu z palety + + + + + New Palette + Nová paleta + + + + + Name + Název + + + + GIMP Palettes (*.gpl) + Palety GIMP (*.gpl) + + + + Palette Image (%1) + Obrázek palety (%1) + + + + All Files (*) + Všechny soubory (*) + + + + + Open Palette + Otevřít paletu + + + + Failed to load the palette file +%1 + Nepodařilo se nahrát soubor palety +%1 + + + + color_widgets::GradientEditor + + + Add Color + Přidat barvu + + + + Remove Color + Odstranit barvu + + + + Edit Color... + Upravit barvu... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 barev) + + + + color_widgets::Swatch + + + Clear Color + Smazat barvu + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_da.ts b/data/translations/Internationalization_da.ts new file mode 100644 index 0000000..e48febd --- /dev/null +++ b/data/translations/Internationalization_da.ts @@ -0,0 +1,3149 @@ + + + + + AbstractWidgetList + + + Add New + Tilføj ny + + + + Move Up + Flyt op + + + + Move Down + Flyt ned + + + + Remove + Fjern + + + + AcceptTool + + + Accept + Accepter + + + + Accept the capture + Accepter skærmklippet + + + + AppLauncher + + + App Launcher + App Starter + + + + Choose an app to open the capture + Vælg en app for at åbne skærmklippet + + + + AppLauncherWidget + + + Open With + Åben med + + + + Launch in terminal + Start i terminal + + + + Keep open after selection + Hold åben efter selektion + + + + + Error + Fejl + + + + Unable to launch in terminal. + Kan ikke starte i terminalen. + + + + Unable to write in + Kan ikke skrive i + + + + ArrowTool + + + Arrow + Pil + + + + Set the Arrow as the paint tool + Indstil pilen som malingsværktøj + + + + BlurTool + + Blur + Desenfocament + + + Set Blur as the paint tool + Estableix el desenfocament com a eina de dibuix + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Skærmklipstilstand</b> + + + + Rectangular Region + Rektangulær Område + + + + Full Screen (Current Display) + Fuld Skærm (Nuværende Skærm) + + + + Full Screen (All Monitors) + Fuld Skærm (Alle Skærme) + + + + No Delay + Ingen ventetid + + + + second + anden + + + + + + seconds + sekunder + + + + + Take new screenshot + Tag nyt skærmbillede + + + + + Area: + Område: + + + + + Capture Launcher + + + + + + TextLabel + + + + + + Capture Mode + + + + + + Delay: + Ventetid: + + + + + WxH+x+y + + + + + CaptureWidget + + + Unable to capture screen + Impossible capturar la pantalla + Kan ikke indfange skærmen + + + + Mouse + Mus + + + + Select screenshot area + Vælg skærmbillede område + + + + Mouse Wheel + Musehjul + + + + Change tool size + Ændre værktøjs størrelse + + + + Right Click + Right Click + + + + Show color picker + Show color picker + + + + Open side panel + Open side panel + + + + Esc + Esc + + + + Exit + Exit + + + + Quit Capture + + + + + Are you sure you want to quit capture? + + + + + Do not show this again + + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + Configuration error resolved. Launch `flameshot gui` again to apply it. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Escolliu una àrea amb el ratolí, o premeu Esc per sortir. +Premeu Entrar per capturar la pantalla. +Premeu clic dret per mostrar l'eina de selecció de color. +Gireu la rodeta del ratolí per canviar el gruix de l'eina de dibuix. +Premeu Espai per obrir el calaix lateral. + + + + Tool Settings + Tool Settings + + + + CircleCountTool + + + Circle Counter + Circle Counter + + + + Add an autoincrementing counter bubble + Add an autoincrementing counter bubble + + + + CircleTool + + + Circle + Circle + + + + Set the Circle as the paint tool + Set the Circle as the paint tool + + + + ColorDialog + + + + Select Color + Select Color + + + + + Saturation + Saturation + + + + + Hue + Hue + + + + + Hex + Hex + + + + + Blue + Blue + + + + + Value + Value + + + + + Green + Green + + + + + Alpha + Alpha + + + + + Red + Red + + + + ColorGrabWidget + + + Accept color + Accept color + + + + Enter or Left Click + + + + + Precisely select color + Precisely select color + + + + Hold Left Click + + + + + Toggle magnifier + Toggle magnifier + + + + Space or Right Click + + + + + Cancel + Cancel + + + + Esc + Esc + + + + ColorPickerEditor + + + Edit Preset: + + + + + Enter color to update preset + + + + + Update + Update + + + + Press button to update the selected preset + + + + + Delete + + + + + Press button to delete the selected preset + + + + + Add Preset: + + + + + Enter color manually or select it using the color-wheel + + + + + Add + + + + + Press button to add preset + + + + + + Error + + + + + Unable to add preset. Maximum limit reached. + + + + + Unable to remove preset. Minimum limit reached. + + + + + ConfigErrorDetails + + + Configuration errors + Configuration errors + + + + ConfigHandler + + + Unrecognized setting: '%1' + + Unrecognized setting: '%1' + + + + + Unrecognized shortcut name: '%1'. + + Unrecognized shortcut name: '%1'. + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + + + + Bad value in '%1'. Expected: %2 + + Bad value in '%1'. Expected: %2 + + + + + You have successfully resolved the configuration error. + You have successfully resolved the configuration error. + + + + The configuration contains an error. Open configuration to resolve. + The configuration contains an error. Open configuration to resolve. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + Bad config key '%1' in ConfigHandler. Please report this as a bug. + + + + ConfigResolver + + + Resolve configuration errors + Resolve configuration errors + + + + <b>You must resolve all errors before continuing:</b> + <b>You must resolve all errors before continuing:</b> + + + + Reset + Reset + + + + Reset to the default value. + Reset to the default value. + + + + Remove + Remove + + + + Remove this setting. + Remove this setting. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + + + + Resolve all + Resolve all + + + + Resolve all listed errors. + Resolve all listed errors. + + + + Details + Details + + + + ConfigWindow + + + Configuration + Configuration + + + + Interface + Interface + + + + Filename Editor + Filename Editor + + + + General + General + + + + Shortcuts + Shortcuts + + + + Resolve + Resolve + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>Configuration file has errors. Resolve them before continuing.</b> + + + + Controller + + New version %1 is available + New version %1 is available + + + You have the latest version + You have the latest version + + + Failed to get information about the latest version. + Failed to get information about the latest version. + + + Error + Error + + + Unable to close active modal widgets + Unable to close active modal widgets + + + &Open Launcher + &Open Launcher + + + &Configuration + &Configuration + + + &About + &About + + + Check for updates + Check for updates + + + &Latest Uploads + &Latest Uploads + + + URL copied to clipboard. + URL copied to clipboard. + + + &Information + &Informació + + + &Quit + &Quit + + + &Take Screenshot + &Take Screenshot + + + + CopyTool + + + Copy + Copy + + + + Copy selection to clipboard + Copy selection to clipboard + + + Copy the selection into the clipboard + Copia la selecció al porta-retalls + + + + DBusUtils + + Unable to connect via DBus + No s'ha pogut connectar mitjançant DBus + + + + ExitTool + + + Exit + Exit + + + + Leave the capture screen + Leave the capture screen + + + + FileNameEditor + + + Edit the name of your captures: + Edit the name of your captures: + + + + Edit: + Edit: + + + + Preview: + Preview: + + + + Save + Save + + + + Saves the pattern + Saves the pattern + + + + Restore + Restore + + + Reset + Reinicialitza + + + + Restores the saved pattern + Restores the saved pattern + + + + Clear + Clear + + + + Deletes the name + Deletes the name + + + + Flameshot + + + Error + + + + + Unable to close active modal widgets + Unable to close active modal widgets + + + + URL copied to clipboard. + + + + + FlameshotDaemon + + + New version %1 is available + New version %1 is available + + + + You have the latest version + You have the latest version + + + + Failed to get information about the latest version. + Failed to get information about the latest version. + + + + Unable to connect via DBus + Unable to connect via DBus + + + + GeneneralConf + + Show help message + Mostra el missatge d'ajuda + + + Show the help message at the beginning in the capture mode. + Mostra el missatge d'ajuda en iniciar el mode de captura. + + + Show desktop notifications + Mostra les notificacions d'escriptori + + + Show tray icon + Mostra la icona en la barra de tasques + + + Show the systemtray icon + Mostra la icona en la barra de tasques + + + Import + Importar + + + Error + Error + + + Unable to read file. + Impossible llegir el fitxer. + + + Unable to write file. + Impossible escriure al fitxer. + + + Save File + Guardar Arxiu + + + Confirm Reset + Confirmar Reset + + + Are you sure you want to reset the configuration? + Esteu segur que voleu reiniciar la configuració? + + + Configuration File + Fitxer de Configuració + + + Export + Exportar + + + Reset + Reset + + + Launch at startup + Llançament a l'inici + + + + GeneralConf + + + + Import + Import + + + + + + + Error + Error + + + + Unable to read file. + Unable to read file. + + + + + Unable to write file. + Unable to write file. + + + + Save File + Save File + + + + Confirm Reset + Confirm Reset + + + + Are you sure you want to reset the configuration? + Are you sure you want to reset the configuration? + + + + Show help message + Show help message + + + Show the help message at the beginning in the capture mode. + Show the help message at the beginning in the capture mode. + + + + Show the side panel button + Show the side panel button + + + Show the side panel toggle button in the capture mode. + Show the side panel toggle button in the capture mode. + + + + Show desktop notifications + Show desktop notifications + + + + Show tray icon + Show tray icon + + + Show the systemtray icon + Show the systemtray icon + + + + Confirmation required to delete screenshot from the latest uploads + Confirmation required to delete screenshot from the latest uploads + + + + Configuration File + Configuration File + + + + Export + Export + + + + Reset + Reset + + + + Automatic check for updates + Automatic check for updates + + + + Allow multiple flameshot GUI instances simultaneously + Allow multiple flameshot GUI instances simultaneously + + + This allows you to take screenshots of flameshot itself for example. + This allows you to take screenshots of flameshot itself for example. + + + Automatically close daemon when it is not needed + Automatically close daemon when it is not needed + + + Launch at startup + Launch at startup + + + Launch Flameshot + Launch Flameshot + + + + Show welcome message on launch + Show welcome message on launch + + + + Use large predefined color palette + Use large predefined color palette + + + + Copy URL after upload + Copy URL after upload + + + Copy URL and close window after upload + Copy URL and close window after upload + + + + Save image after copy + Save image after copy + + + Save image file after copying it + Save image file after copying it + + + + Show the help message at the beginning in the capture mode + + + + + Use last region for GUI mode + + + + + Use the last region as the default selection for the next screenshot in GUI mode + + + + + Show the side panel toggle button in the capture mode + + + + + Enable desktop notifications + + + + + Show abort notifications + + + + + Enable abort notifications + + + + + Show icon in the system tray + + + + + Use grim to capture screenshots + + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + + + + + Ask for confirmation to delete screenshot from the latest uploads + + + + + Check for updates automatically + + + + + This allows you to take screenshots of Flameshot itself for example + + + + + Automatically unload from memory when it is not needed + + + + + Automatically close daemon (background process) when it is not needed + + + + + Launch in background at startup + + + + + Launch Flameshot daemon (background process) when computer is booted + + + + + Show the welcome message box in the middle of the screen while taking a screenshot + + + + + Ask before quit capture + + + + + Show the confirmation prompt before ESC quit + + + + + Use a large predefined color palette + + + + + Copy on double click + + + + + Enable Copy to clipboard on Double Click + + + + + Copy URL after uploading was successful + + + + + After copying the screenshot, save it to a file as well + + + + + Save Path + Save Path + + + + Change... + Change... + + + + Use fixed path for screenshots to save + Use fixed path for screenshots to save + + + + Preferred save file extension: + Preferred save file extension: + + + + Latest Uploads Max Size + Latest Uploads Max Size + + + + Imgur Application Client ID + + + + + Undo limit + Undo limit + + + + Use JPG format for clipboard (PNG default) + Use JPG format for clipboard (PNG default) + + + + Use lossy JPG format for clipboard (lossless PNG default) + + + + + Copy file path after save + Copy file path after save + + + + Copy the file path to clipboard after the file is saved + + + + + Anti-aliasing image when zoom the pinned image + Anti-aliasing image when zoom the pinned image + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + After zooming the pinned image, should the image get smoothened or stay pixelated + + + + + Upload image without confirmation + Upload image without confirmation + + + + Choose a Folder + Choose a Folder + + + + Unable to write to directory. + Unable to write to directory. + + + + Show magnifier + + + + + Enable a magnifier while selecting the screenshot area + + + + + Square shaped magnifier + + + + + Make the magnifier to be square-shaped + + + + + Milliseconds before geometry display hides; 0 means do not hide + + + + + Set geometry display timeout (ms) + + + + + Selection Geometry Display + + + + + Display Location + + + + + None + + + + + Top Left + + + + + Top Right + + + + + Bottom Left + + + + + Bottom Right + + + + + Center + + + + + Quality range of 0-100; Higher number is better quality and larger file size + + + + + JPEG Quality + + + + + Reverse arrow + + + + + Draw the arrow head first + + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + Latest Uploads + + + Screenshots history is empty + Screenshots history is empty + + + Copy URL + Copy URL + + + URL copied to clipboard. + URL copied to clipboard. + + + Open in browser + Open in browser + + + Confirm to delete + Confirm to delete + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Are you sure you want to delete a screenshot from the latest uploads and server? + + + + ImgS3Uploader + + Uploading Image + S'està pujant la imatge + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Error + Error + + + + ImgUploadDialog + + + Upload Confirmation + Upload Confirmation + + + + Do you want to upload this capture? + Do you want to upload this capture? + + + + + Upload without confirmation + Upload without confirmation + + + + ImgUploader + + Uploading Image + S'està pujant la imatge + + + Delete image + Esborra la imatge + + + Unable to open the URL. + No es pot obrir l'URL. + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + Copy URL + Copia l'URL + + + Open URL + Obri l'URL + + + Image to Clipboard. + Imatge al porta-retalls. + + + + ImgUploaderBase + + + Upload image + Upload image + + + + Uploading Image + Uploading Image + + + + Copy URL + Copy URL + + + + Open URL + Open URL + + + + Delete image + Delete image + + + + Image to Clipboard. + Image to Clipboard. + + + + Save image + + + + + Unable to open the URL. + Unable to open the URL. + + + + URL copied to clipboard. + URL copied to clipboard. + + + + Screenshot copied to clipboard. + Screenshot copied to clipboard. + + + + Unable to save the screenshot to disk. + + + + + Screenshot saved. + + + + + ImgUploaderTool + + + Image Uploader + Image Uploader + + + + Upload the selection + Upload the selection + + + + ImgurUploader + + Upload to Imgur + Puja a Imgur + + + Uploading Image + S'està pujant la imatge + + + Copy URL + Copia l'URL + + + Open URL + Obre l'URL + + + Delete image + Esborra la imatge + + + Image to Clipboard. + Imatge al porta-retalls. + + + + Unable to open the URL. + Unable to open the URL. + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + + ImgurUploaderTool + + Image Uploader + Puja la imatge + + + Upload the selection to Imgur + Puja la selecció a Imgur + + + + InfoWindow + + + + About + About + + + + + Icon + + + + + + License + + + + + + GPLv3+ + + + + + + Version + + + + + + Flameshot v + + + + + + OS Info + + + + + + Copy Info + + + + Right Click + Clic dret + + + Mouse Wheel + Roda del ratolí + + + Move selection 1px + Mou la selecció 1 px + + + Resize selection 1px + Redimensiona la selecció 1 px + + + Quit capture + Ix de la captura + + + Copy to clipboard + Copia al porta-retalls + + + Save selection as a file + Guarda la selecció com a fitxer + + + Undo the last modification + Desfés l'última modificació + + + Show color picker + Mostra el selector de color + + + Change the tool's thickness + Canvia el gruix de l'eina + + + Key + Tecla + + + Description + Descripció + + + <u><b>License</b></u> + <u><b>License</b></u> + + + <u><b>Version</b></u> + <u><b>Version</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Dreceres</b></u> + + + Available shortcuts in the screen capture mode. + Dreceres disponibles en el mode de captura de pantalla. + + + + InvertTool + + + Invert + Invert + + + + Set Inverter as the paint tool + Set Inverter as the paint tool + + + + LineTool + + + Line + Line + + + + Set the Line as the paint tool + Set the Line as the paint tool + + + + MarkerTool + + + Marker + Marker + + + + Set the Marker as the paint tool + Set the Marker as the paint tool + + + + MoveTool + + + Move + Move + + + + Move the selection area + Move the selection area + + + + PencilTool + + + Pencil + Pencil + + + + Set the Pencil as the paint tool + Set the Pencil as the paint tool + + + + PinTool + + + Pin Tool + Pin Tool + + + + Pin image on the desktop + Pin image on the desktop + + + + PinWidget + + + Context menu + + + + + Copy to clipboard + Copia al porta-retalls + + + + Save to file + + + + + Rotate Right + + + + + Rotate Left + + + + + Increase Opacity + + + + + Decrease Opacity + + + + + Close + Close + + + + PixelateTool + + + Pixelate + Pixelate + + + + Set Pixelate as the paint tool. + + + + Set Pixelate as the paint tool + Set Pixelate as the paint tool + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QHotkey + + Failed to register %1. Error: %2 + Failed to register %1. Error: %2 + + + Failed to unregister %1. Error: %2 + Failed to unregister %1. Error: %2 + + + + QObject + + + + Capture saved to clipboard. + Capture saved to clipboard. + + + + Error while saving to clipboard + Error while saving to clipboard + + + + Save screenshot + Save screenshot + + + + Path copied to clipboard as + Path copied to clipboard as + + + Saving canceled + Saving canceled + + + Save canceled + Save canceled + + + Capture is saved and copied to the clipboard as + La captura serà desada i copiada al porta-retalls com a + + + + Save Error + Save Error + + + + + Capture saved as + Capture saved as + + + + + Error trying to save as + Error trying to save as + + + + Unable to connect via DBus + Unable to connect via DBus + + + + Powerful yet simple to use screenshot software. + Powerful yet simple to use screenshot software. + + + + See + See + + + Capture the entire desktop. + Capture the entire desktop. + + + + Open the capture launcher. + Open the capture launcher. + + + + Start a manual capture in GUI mode. + Start a manual capture in GUI mode. + + + + Configure + Configure + + + Capture a single screen. + Capture a single screen. + + + Path where the capture will be saved + Camí on es desarà la captura + + + + Capture screenshot of all monitors at the same time. + + + + + Capture a screenshot of the specified monitor. + + + + + Existing directory or new file to save to + Existing directory or new file to save to + + + + Save the capture to the clipboard + Save the capture to the clipboard + + + + Pin the capture to the screen + Pin the capture to the screen + + + + Upload screenshot + Upload screenshot + + + + Delay time in milliseconds + Delay time in milliseconds + + + + Repeat screenshot with previously selected region + + + + + Screenshot region to select + Screenshot region to select + + + + Set the filename pattern + Set the filename pattern + + + + Accept capture as soon as a selection is made + Accept capture as soon as a selection is made + + + + Enable or disable the trayicon + Enable or disable the trayicon + + + + Enable or disable run at startup + Enable or disable run at startup + + + + Enable or disable the notifications + + + + + Check the configuration for errors + Check the configuration for errors + + + + Show the help message in the capture mode + Show the help message in the capture mode + + + + Define the main UI color + Define the main UI color + + + + Define the contrast UI color + Define the contrast UI color + + + + Print raw PNG capture + Print raw PNG capture + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + + + + Define the screen to capture (starting from 0) + Define the screen to capture (starting from 0) + + + + Invalid delay, it must be a number greater than 0 + Invalid delay, it must be a number greater than 0 + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + + + + Invalid path, must be an existing directory or a new file in an existing directory + Invalid path, must be an existing directory or a new file in an existing directory + + + Define the screen to capture + Define the screen to capture + + + + default: screen containing the cursor + default: screen containing the cursor + + + + Screen number + Screen number + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + + + Invalid delay, it must be higher than 0 + Invalid delay, it must be higher than 0 + + + + Invalid screen number, it must be non negative + Invalid screen number, it must be non negative + + + Invalid path, it must be a real path in the system + Invalid path, it must be a real path in the system + + + + Invalid value, it must be defined as 'true' or 'false' + Invalid value, it must be defined as 'true' or 'false' + + + + Error + Error + + + + Unable to write in + Unable to write in + + + + Requested screen exceeds screen count + + + + + Full screen screenshot pinned to screen + Full screen screenshot pinned to screen + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + + Options + Options + + + Arguments + Arguments + + + arguments + arguments + + + + Subcommands + + + + + subcommands + + + + + Usage + Usage + + + + options + options + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Per default runs Flameshot in the background and adds a tray icon for configuration. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + + + Toggle side panel + Toggle side panel + + + Resize selection left 1px + Resize selection left 1px + + + Resize selection right 1px + Resize selection right 1px + + + Resize selection up 1px + Resize selection up 1px + + + Resize selection down 1px + Resize selection down 1px + + + Select entire screen + Select entire screen + + + Move selection left 1px + Move selection left 1px + + + Move selection right 1px + Move selection right 1px + + + Move selection up 1px + Move selection up 1px + + + Move selection down 1px + Move selection down 1px + + + Commit text in text area + Commit text in text area + + + Delete current tool + Delete current tool + + + + Quit capture + Quit capture + + + + Screenshot history + Screenshot history + + + + Capture screen + Capture screen + + + + Show color picker + Show color picker + + + + Change the tool's size + Change the tool's size + + + Change the tool's thickness + Canvia el gruix de l'eina + + + + RectangleTool + + + Rectangle + Rectangle + + + + Set the Rectangle as the paint tool + Set the Rectangle as the paint tool + + + + RedoTool + + + Redo + Redo + + + + Redo the next modification + Redo the next modification + + + + SaveTool + + + Save + Save + + + + Save screenshot to a file + Save screenshot to a file + + + Save the capture + Guarda la captura + + + + ScreenGrabber + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + + + + + Unable to capture screen + Unable to capture screen + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + Rectangular Selection + + + + Set Selection as the paint tool + Set Selection as the paint tool + + + + SetShortcutDialog + + + Set Shortcut + Set Shortcut + + + + Enter new shortcut to change + Enter new shortcut to change + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Press Esc to cancel or Backspace to disable the keyboard shortcut. + + + + + Flameshot must be restarted for changes to take effect. + Flameshot must be restarted for changes to take effect. + + + + ShortcutsWidget + + + Hot Keys + Hot Keys + + + + Available shortcuts in the screen capture mode. + Available shortcuts in the screen capture mode. + + + + Description + Description + + + + Key + Key + + + + Left Double-click + + + + + Toggle side panel + Toggle side panel + + + + Grab a color from the screen + + + + + Resize selection left 1px + Resize selection left 1px + + + + Resize selection right 1px + Resize selection right 1px + + + + Resize selection up 1px + Resize selection up 1px + + + + Resize selection down 1px + Resize selection down 1px + + + + Symmetrically decrease width by 2px + + + + + Symmetrically increase width by 2px + + + + + Symmetrically increase height by 2px + + + + + Symmetrically decrease height by 2px + + + + + Select entire screen + Select entire screen + + + + Move selection left 1px + Move selection left 1px + + + + Move selection right 1px + Move selection right 1px + + + + Move selection up 1px + Move selection up 1px + + + + Move selection down 1px + Move selection down 1px + + + + Commit text in text area + Commit text in text area + + + + Delete selected drawn object + + + + + Cancel current selection + + + + + Capture screen + Capture screen + + + + Screenshot history + Screenshot history + + + + SidePanelWidget + + Active thickness: + Active thickness: + + + Active color: + Active color: + + + Press ESC to cancel + Press ESC to cancel + + + + Active tool size: + Active tool size: + + + + Active Color: + Active Color: + + + + Grab Color + Grab Color + + + + Display grid + + + + + SizeDecreaseTool + + + Decrease Tool Size + Decrease Tool Size + + + + Decrease the size of the other tools + Decrease the size of the other tools + + + + SizeIncreaseTool + + + Increase Tool Size + Increase Tool Size + + + + Increase the size of the other tools + Increase the size of the other tools + + + + SizeIndicatorTool + + Selection Size Indicator + Selection Size Indicator + + + Show X and Y dimensions of the selection + Show X and Y dimensions of the selection + + + Show the dimensions of the selection (X Y) + Mostra les mides de la selecció (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + Century (00-99) + + + + Year (00-99) + Year (00-99) + + + + Year (2000) + Year (2000) + + + + Month Name (jan) + Month Name (jan) + + + + Month Name (january) + Month Name (january) + + + + Month (01-12) + Month (01-12) + + + + Week Day (1-7) + Week Day (1-7) + + + + Week (01-53) + Week (01-53) + + + + Day Name (mon) + Day Name (mon) + + + + Day Name (monday) + Day Name (monday) + + + + Day (01-31) + Day (01-31) + + + + Day of Month (1-31) + Day of Month (1-31) + + + + Day (001-366) + Day (001-366) + + + + Hour (00-23) + Hour (00-23) + + + + Hour (01-12) + Hour (01-12) + + + + Minute (00-59) + Minute (00-59) + + + + Second (00-59) + Second (00-59) + + + + Full Date (%m/%d/%y) + Full Date (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + Full Date (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + + + + + Time (%H-%M-%S) + Time (%H-%M-%S) + + + + Time (%H-%M) + Time (%H-%M) + + + + SystemNotification + + + Flameshot Info + Flameshot Info + + + + TextConfig + + + StrikeOut + StrikeOut + + + + Underline + Underline + + + + Bold + Bold + + + + Italic + Italic + + + + Left Align + Left Align + + + + Center Align + Center Align + + + + Right Align + Right Align + + + + TextTool + + + Text + Text + + + + Add text to your capture + Add text to your capture + + + + TrayIcon + + + &Take Screenshot + &Take Screenshot + + + + &Open Launcher + &Open Launcher + + + + &Configuration + &Configuration + + + + &About + &About + + + + Check for updates + Check for updates + + + + New version %1 is available + New version %1 is available + + + + &Quit + &Quit + + + + &Latest Uploads + &Latest Uploads + + + + &Open Save Path + + + + + UIcolorEditor + + UI Color Editor + UI Color Editor + + + + Change the color moving the selectors and see the changes in the preview buttons. + Change the color moving the selectors and see the changes in the preview buttons. + + + + Select a Button to modify it + Select a Button to modify it + + + + Main Color + Main Color + + + + Click on this button to set the edition mode of the main color. + Click on this button to set the edition mode of the main color. + + + + Contrast Color + Contrast Color + + + + Click on this button to set the edition mode of the contrast color. + Click on this button to set the edition mode of the contrast color. + + + + UndoTool + + + Undo + Undo + + + + Undo the last modification + Undo the last modification + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + New Flameshot version %1 is available + + + + Ignore + Ignore + + + + Later + Later + + + + Update + Update + + + + UploadHistory + + + Upload History + + + + + Screenshots history is empty + Screenshots history is empty + + + + UploadLineItem + + + Form + + + + + TextLabel + + + + + Copy URL + + + + + Open In Browser + + + + + Confirm to delete + Confirm to delete + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Are you sure you want to delete a screenshot from the latest uploads and server? + + + + UtilityPanel + + + Close + Close + + + + <Empty> + <Empty> + + + + VisualsEditor + + + Opacity of area outside selection: + Opacity of area outside selection: + + + + UI Color Editor + UI Color Editor + + + + Colorpicker Editor + + + + + Button Selection + Button Selection + + + + Select All + Select All + + + + color_widgets::ColorDialog + + + Pick + Pick + + + + color_widgets::ColorPalette + + + Unnamed + Unnamed + + + + color_widgets::ColorPaletteModel + + + Unnamed + Unnamed + + + + %1 (%2 colors) + %1 (%2 colors) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + Open a new palette from file + + + + + Create a new palette + Create a new palette + + + + + Duplicate the current palette + Duplicate the current palette + + + + + Delete the current palette + Delete the current palette + + + + + Revert changes to the current palette + Revert changes to the current palette + + + + + Save changes to the current palette + Save changes to the current palette + + + + + Add a color to the palette + Add a color to the palette + + + + + Remove the selected color from the palette + Remove the selected color from the palette + + + + + New Palette + New Palette + + + + + Name + Name + + + + GIMP Palettes (*.gpl) + GIMP Palettes (*.gpl) + + + + Palette Image (%1) + Palette Image (%1) + + + + All Files (*) + All Files (*) + + + + + Open Palette + Open Palette + + + + Failed to load the palette file +%1 + Failed to load the palette file +%1 + + + + color_widgets::GradientEditor + + + Add Color + Add Color + + + + Remove Color + Remove Color + + + + Edit Color... + Edit Color... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 colors) + + + + color_widgets::Swatch + + + Clear Color + Clear Color + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_de_DE.ts b/data/translations/Internationalization_de_DE.ts new file mode 100644 index 0000000..1d9c68d --- /dev/null +++ b/data/translations/Internationalization_de_DE.ts @@ -0,0 +1,3193 @@ + + + + + AbstractWidgetList + + + Add New + Neu + + + + Move Up + Nach oben verschieben + + + + Move Down + Nach unten verschieben + + + + Remove + Entfernen + + + + AcceptTool + + + Accept + Akzeptieren + + + + Accept the capture + Aufnahme akzeptieren + + + + AppLauncher + + + App Launcher + Anwendungs-Launcher + + + + Choose an app to open the capture + Anwendung wählen, um die Aufnahme zu öffnen + + + + AppLauncherWidget + + + Open With + Öffne mit + + + + Launch in terminal + Im Terminal starten + + + + Keep open after selection + Nach Auswahl geöffnet lassen + + + + + Error + Fehler + + + + Unable to write in + Kein Schreibzugriff auf + + + + Unable to launch in terminal. + Kann nicht im Terminal geöffnet werden. + + + + ArrowTool + + + Arrow + Pfeil + + + + Set the Arrow as the paint tool + Pfeil als Malwerkzeug festlegen + + + + BlurTool + + Blur + Verwischen + + + Set Blur as the paint tool + Wähle Verwischen als Werkzeug + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Aufnahmemodus</b> + + + + Rectangular Region + Rechteckiger Bereich + + + + Full Screen (Current Display) + Gesamter Bildschirm (aktueller Monitor) + + + + Full Screen (All Monitors) + Gesamter Bildschirm (alle Monitore) + + + + No Delay + Keine Verzögerung + + + + second + Sekunde + + + + + + seconds + Sekunden + + + + + Take new screenshot + Neuen Screenshot aufnehmen + + + + + Area: + Bereich: + + + + + Capture Launcher + Aufnahme-Launcher + + + + + TextLabel + TextEtikett + + + + + Capture Mode + Aufnahme-Modus + + + + + Delay: + Verzögerung: + + + + + WxH+x+y + BxH+x+y + + + + CaptureWidget + + + Unable to capture screen + Bildschirm kann nicht erfasst werden + + + + Mouse + Maus + + + + Select screenshot area + Screenshot-Bereich wählen + + + + Mouse Wheel + Mausrad + + + + Change tool size + Werkzeuggröße ändern + + + + Right Click + Rechtsklick + + + + Show color picker + Farbwähler anzeigen + + + + Open side panel + Seitenleiste öffnen + + + + Esc + Esc + + + + Exit + Beenden + + + + Quit Capture + Aufnahme beenden + + + + Are you sure you want to quit capture? + Soll die Aufnahme wirklich beendet werden? + + + + Do not show this again + Nicht erneut zeigen + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot hat den Fokus verloren. Tastenkombinationen funktionieren nicht, bis du irgendwo klickst. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + Konfigurationsfehler behoben. Starte `flameshot gui` erneut, um sie anzuwenden. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Wähle einen Bereich mit der Maus oder drücke ESC um zu beenden. +Drücke Eingabe um den Bereich aufzunehmen. +Drücke die rechte Maustaste um die Farbe auszuwählen. +Benutze das Mausrad um die Dicke des Werkzeugs auszuwählen. +Drücke die Leertaste um das Seitenmenü zu öffnen. + + + + Tool Settings + Werkzeugeinstellungen + + + + CircleCountTool + + + Circle Counter + I know it's not ideal, but don't have a better idea how to say it :/ + kreisförmiger Zähler + + + + Add an autoincrementing counter bubble + Eine automatisch hochzählende Zählerblase hinzufügen + + + + CircleTool + + + Circle + Kreis + + + + Set the Circle as the paint tool + Kreis als Malwerkzeug festlegen + + + + ColorDialog + + + + Select Color + Farbe wählen + + + + + Saturation + Sättigung + + + + + Hue + Farbton + + + + + Hex + Hex + + + + + Blue + Blau + + + + + Value + Wert + + + + + Green + Grün + + + + + Alpha + Alpha + + + + + Red + Rot + + + + ColorGrabWidget + + + Accept color + Farbe übernehmen + + + + Enter or Left Click + Enter oder Linke Maustaste + + + + Precisely select color + Farbe präzise auswählen + + + + Hold Left Click + Linke Maustaste halten + + + + Toggle magnifier + Lupe umschalten + + + + Space or Right Click + Leertaste oder Rechte Maustaste + + + + Cancel + Abbrechen + + + + Esc + Esc + + + + ColorPickerEditor + + Select Preset: + Vorgabe wählen: + + + Select preset using the spinbox + Vorgabe mit der Spinbox auswählen + + + + Edit Preset: + Voreinstellung bearbeiten: + + + + Enter color to update preset + Farbe eingeben, um Voreinstellung zu aktualisieren + + + + Update + Aktualisieren + + + + Press button to update the selected preset + Knopf drücken, um die ausgewählte Voreinstellung zu aktualisieren + + + + Delete + Löschen + + + + Press button to delete the selected preset + Knopf drücken, um die ausgewählte Voreinstellung zu löschen + + + + Add Preset: + Voreinstellung hinzufügen: + + + + Enter color manually or select it using the color-wheel + Farbe manuell eingeben oder mit Hilfe des Farbrads auswählen + + + + Add + Hinzufügen + + + + Press button to add preset + Knopf drücken, um eine Voreinstellung hinzuzufügen + + + + + Error + Fehler + + + + Unable to add preset. Maximum limit reached. + Voreinstellung kann nicht hinzugefügt werden. Maximale Grenze erreicht. + + + + Unable to remove preset. Minimum limit reached. + Voreinstellung kann nicht entfernt werden. Mindestgrenze erreicht. + + + + ConfigErrorDetails + + + Configuration errors + Konfigurationsfehler + + + + ConfigHandler + + + Unrecognized setting: '%1' + + Nicht erkannte Einstellung: '%1' + + + + + Unrecognized shortcut name: '%1'. + + Nicht erkannter Tastenkürzelname: '%1'. + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + Tastenkürzelkonflikt: '%1' und '%2' haben das gleiche Tastenkürzel: %3 + + + + + Bad value in '%1'. Expected: %2 + + Falscher Wert in '%1'. Erwartet: %2 + + + + + You have successfully resolved the configuration error. + Du hast den Konfigurationsfehler erfolgreich behoben. + + + + The configuration contains an error. Open configuration to resolve. + Die Konfiguration enthält einen Fehler. Öffne die Konfiguration, um den Fehler zu beheben. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + Fehlerhafter Konfigurationsschlüssel '%1' im ConfigHandler. Bitte melde dies als Fehler. + + + + ConfigResolver + + + Resolve configuration errors + Konfigurationsfehler beheben + + + + <b>You must resolve all errors before continuing:</b> + <b>Bevor du fortfährst, musst du alle Fehler beheben:</b> + + + + Reset + Zurücksetzen + + + + Reset to the default value. + Auf Standardwert zurücksetzen. + + + + Remove + Entfernen + + + + Remove this setting. + Diese Einstellung entfernen. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + Bei einigen Tastenkürzeln gibt es Konflikte. +Diese verhindern NICHT den Start von flameshot. +Bitte beseitige sie manuell in der Konfigurationsdatei. + + + + Resolve all + Alle beheben + + + + Resolve all listed errors. + Alle aufgeführten Fehler beheben. + + + + Details + Details + + + + ConfigWindow + + + Configuration + Einstellungen + + + + Interface + Benutzeroberfläche + + + + Filename Editor + Dateinamen Editor + + + + General + Allgemein + + + + Shortcuts + Tastenkürzel + + + + Resolve + Beheben + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>Die Konfigurationsdatei enthält Fehler. Behebe diese, bevor Du fortfährst.</b> + + + + Controller + + New version %1 is available + Neue version %1 ist verfügbar + + + You have the latest version + Die neueste Version ist installiert + + + Failed to get information about the latest version. + Das Laden der Versionsinformationen ist fehlgeschlagen. + + + Error + Fehler + + + Unable to close active modal widgets + Kann aktive Widgets nicht schließen + + + &Take Screenshot + &Bildschirmaufnahme anfertigen + + + &Open Launcher + Anwendung öffnen + + + &Configuration + &Einstellungen + + + &About + Über Fl&ameshot + + + Check for updates + Auf Aktualisierungen überprüfen + + + &Latest Uploads + &Letzte Uploads + + + URL copied to clipboard. + URL in Zwischenablage kopiert. + + + &Information + &Informationen + + + &Quit + &Beenden + + + + CopyTool + + + Copy + Kopieren + + + + Copy selection to clipboard + Auswahl in die Zwischenablage kopieren + + + Copy the selection into the clipboard + Auswahl in die Zwischenablage kopieren + + + + DBusUtils + + Unable to connect via DBus + Kann nicht via DBus verbinden + + + + ExitTool + + + Exit + Beenden + + + + Leave the capture screen + Aufnahmebildschirm verlassen + + + + FileNameEditor + + + Edit the name of your captures: + Name deiner Aufnahmen bearbeiten: + + + + Edit: + Bearbeiten: + + + + Preview: + Vorschau: + + + + Save + Speichern + + + + Saves the pattern + Muster speichern + + + + Restore + Zurücksetzen + + + Reset + Zurücksetzen + + + + Restores the saved pattern + Gespeichertes Muster zurücksetzen + + + + Clear + Löschen + + + + Deletes the name + Löscht den Namen + + + + Flameshot + + + Error + Fehler + + + + Unable to close active modal widgets + Aktive Widgets können nicht geschlossen werden + + + + URL copied to clipboard. + URL wurde in die Zwischenablage kopiert. + + + + FlameshotDaemon + + + New version %1 is available + Neue Version %1 ist verfügbar + + + + You have the latest version + Die neueste Version ist installiert + + + + Failed to get information about the latest version. + Es konnten keine Informationen über die neueste Version abgerufen werden. + + + + Unable to connect via DBus + Verbindung über DBus fehlgeschlagen + + + + GeneneralConf + + Import + Importieren + + + Error + Fehler + + + Unable to read file. + Datei kann nicht gelesen werden. + + + Unable to write file. + Datei kann nicht geschrieben werden. + + + Save File + Datei speichern + + + Confirm Reset + Zurücksetzen bestätigen + + + Are you sure you want to reset the configuration? + Sind Sie sicher, dass sie die Konfiguration zurücksetzen wollen? + + + Show help message + Hilfetext anzeigen + + + Show the help message at the beginning in the capture mode. + Hilfetext am Start der Auswahl anzeigen. + + + Show desktop notifications + Zeige Desktopbenachrichtigungen + + + Show tray icon + Zeige Taskleistensymbol + + + Show the systemtray icon + Zeigt das Taskleistensymbol + + + Configuration File + Konfigurationsdatei + + + Export + Exportieren + + + Reset + Zurücksetzen + + + Launch at startup + Automatisch starten + + + Launch Flameshot + Starte Flameshot + + + + GeneralConf + + + + Import + Importieren + + + + + + + Error + Fehler + + + + Unable to read file. + Datei konnte nicht gelesen werden. + + + + + Unable to write file. + Datei konnte nicht geschrieben werden. + + + + Save File + Datei speichern + + + + Confirm Reset + Zurücksetzen bestätigen + + + + Are you sure you want to reset the configuration? + Bist du sicher, dass du die Konfiguration zurücksetzen willst? + + + + Show help message + Hilfetext anzeigen + + + Show the help message at the beginning in the capture mode. + Hilfetext zu Beginn der Aufnahme anzeigen. + + + + Show the side panel button + Schaltfläche für Seitenleiste anzeigen + + + Show the side panel toggle button in the capture mode. + Den Knopf zum Umschalten des Seitenpanels im Aufnahmemodus anzeigen. + + + + Show desktop notifications + Desktopbenachrichtigungen anzeigen + + + + Show tray icon + Taskleistensymbol zeigen + + + Show the systemtray icon + Zeigt das Taskleistensymbol + + + + Confirmation required to delete screenshot from the latest uploads + Bestätigung nötig zum Entfernen von Screenshots aus den letzten Uploads + + + + Configuration File + Konfigurationsdatei + + + + Export + Exportieren + + + + Reset + Zurücksetzen + + + + Automatic check for updates + Automatisch auf Updates prüfen + + + + Allow multiple flameshot GUI instances simultaneously + Mehrere Flameshot-GUI-Instanzen gleichzeitig zulassen + + + This allows you to take screenshots of flameshot itself for example. + So kannst du zum Beispiel Screenshots von Flameshot selbst machen. + + + Automatically close daemon when it is not needed + Automatisches Schließen des Daemons, wenn er nicht benötigt wird + + + Launch at startup + Automatisch starten + + + Launch Flameshot + Starte Flameshot + + + + Show welcome message on launch + Willkommensnachricht beim Start zeigen + + + + Use large predefined color palette + Große vordefinierte Farbpalette verwenden + + + + Copy URL after upload + URL nach Upload in Zwischenablage kopieren + + + Copy URL and close window after upload + URL nach Upload in Zwischenablage kopieren und Fenster schließen + + + + Save image after copy + Bild nach dem Kopieren speichern + + + Save image file after copying it + Bild nach dem Kopieren in Datei abspeichern + + + + Show the help message at the beginning in the capture mode + Anzeige der Hilfemeldung am Anfang des Aufnahmemodus + + + + Use last region for GUI mode + Letzten Bereich für GUI-Modus verwenden + + + + Use the last region as the default selection for the next screenshot in GUI mode + Letzten Bereich als Standardauswahl für den nächsten Screenshot im GUI-Modus verwenden + + + + Show the side panel toggle button in the capture mode + Umschalttaste auf der Seitenleiste im Aufnahmemodus anzeigen + + + + Enable desktop notifications + Desktop-Benachrichtigungen aktivieren + + + + Show abort notifications + Abbruchbenachrichtigungen anzeigen + + + + Enable abort notifications + Abbruchbenachrichtigungen aktivieren + + + + Show icon in the system tray + Symbol in der Taskleiste anzeigen + + + + Use grim to capture screenshots + Grim zum Aufnehmen von Screenshots verwenden + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + Grim ist ein ausschließlich in Wayland verfügbares Dienstprogramm zur Aufnahme von Screenshots basierend auf dem Screencopy-Protokoll. Es ist im Allgemeinen nur auf minimalen Wayland-Fenstermanagern wie Sway, Hyprland usw. vorhanden. + + + + Ask for confirmation to delete screenshot from the latest uploads + Nach einer Bestätigung fragen, um einen Screenshot aus den letzten Uploads zu löschen + + + + Check for updates automatically + Automatisch nach Updates suchen + + + + This allows you to take screenshots of Flameshot itself for example + Damit kannst du zum Beispiel Screenshots von Flameshot selbst machen + + + Launch Flameshot daemon when computer is booted + Flameshot-Daemon beim Hochfahren des Computers starten + + + + Show the welcome message box in the middle of the screen while taking a screenshot + Anzeige der Willkommensnachricht in der Mitte des Bildschirms, während ein Screenshot gemacht wird + + + + Use a large predefined color palette + Eine große vordefinierte Farbpalette verwenden + + + + Copy on double click + Mit Doppelklick kopieren + + + Enable Copy on Double Click + Kopieren bei Doppelklick aktivieren + + + Copy URL and close window after uploading was successful + URL kopieren und Fenster schließen, nachdem der Upload erfolgreich war + + + + Automatically unload from memory when it is not needed + Automatisch aus dem Speicher entladen, wenn es nicht benötigt wird + + + + Automatically close daemon (background process) when it is not needed + Daemon (Hintergrundprozess) automatisch beenden, wenn er nicht benötigt wird + + + + Launch in background at startup + Beim Systemstart im Hintergrund starten + + + + Launch Flameshot daemon (background process) when computer is booted + Den Flameshot-Daemon (Hintergrundprozess) starten, wenn der Computer hochgefahren wird + + + + Ask before quit capture + Vor dem Beenden der Aufnahme fragen + + + + Show the confirmation prompt before ESC quit + Bestätigungsdialog vor dem Beenden mit ESC anzeigen + + + + Enable Copy to clipboard on Double Click + Kopieren bei Doppelklick aktivieren + + + + Copy URL after uploading was successful + URL nach erfolgreichem Upload kopieren + + + + After copying the screenshot, save it to a file as well + Nach dem Kopieren des Screenshots diesen ebenfalls in einer Datei speichern + + + + Save Path + Speicherpfad + + + + Change... + Ändern... + + + + Use fixed path for screenshots to save + Festen Pfad für das Speichern von Aufnahmen verwenden + + + + Preferred save file extension: + Bevorzugte Dateierweiterung zum Speichern: + + + + Latest Uploads Max Size + Maximale Größe der letzten Uploads + + + + Imgur Application Client ID + Imgur Applikations-Client-ID + + + + Undo limit + Wiederherstellbare Schritte + + + + Use JPG format for clipboard (PNG default) + JPG-Format für die Zwischenablage verwenden (PNG standardmäßig) + + + + Use lossy JPG format for clipboard (lossless PNG default) + Verlustebehaftetes JPG-Format für die Zwischenablage verwenden (standardmäßig verlustfreies PNG) + + + + Copy file path after save + Dateipfad nach dem Speichern kopieren + + + + Copy the file path to clipboard after the file is saved + Dateipfad nach dem Speichern der Datei in die Zwischenablage kopieren + + + + Anti-aliasing image when zoom the pinned image + Anti-Aliasing-Bild beim Zoomen des angehefteten Bildes + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + Soll das Bild nach dem Zoomen des angehefteten Bildes geglättet werden oder pixelig bleiben + + + + + Upload image without confirmation + Bild ohne Bestätigung hochladen + + + + Choose a Folder + Ordner wählen + + + + Unable to write to directory. + Kann nicht in Ordner schreiben. + + + + Show magnifier + Lupe anzeigen + + + + Enable a magnifier while selecting the screenshot area + Lupe während der Auswahl des Screenshot-Bereichs aktivieren + + + + Square shaped magnifier + Quadratische Lupe + + + + Make the magnifier to be square-shaped + Die Lupe in quadratischer Form einstellen + + + + Milliseconds before geometry display hides; 0 means do not hide + Millisekunden, bevor die Geometrieanzeige ausgeblendet wird; 0 bedeutet nie ausblenden + + + + Set geometry display timeout (ms) + Geometrieanzeige ausblenden (ms) + + + + Selection Geometry Display + Geometrieanzeige + + + + Display Location + Anzeigeposition + + + + None + Nicht anzeigen + + + + Top Left + Oben links + + + + Top Right + Oben rechts + + + + Bottom Left + Unten links + + + + Bottom Right + Unten rechts + + + + Center + Mitte + + + + Quality range of 0-100; Higher number is better quality and larger file size + Qualitätsskala von 0-100; Höhere Zahl bedeutet bessere Qualität und größere Dateigröße + + + + JPEG Quality + JPEG Qualität + + + + Reverse arrow + Pfeil umkehren + + + + Draw the arrow head first + Zuerst die Pfeilspitze zeichnen + + + + Insecure Pixelate + Unsicheres Verpixeln + + + + Draw the pixelation effect in an insecure but more asethetic way. + Zeichne den Pixelierungseffekt auf unsichere, aber ästhetischere Weise. + + + + HistoryWidget + + Latest Uploads + Letzte Uploads + + + Screenshots history is empty + Letzte Aufnamen ist leer + + + Copy URL + URL kopieren + + + URL copied to clipboard. + URL in Zwischenablage kopiert. + + + Open in browser + Im Browser öffnen + + + Confirm to delete + Löschen bestätigen + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Sind Sie sicher, dass Sie die Aufnahme aus den Letzten Aufnahmen und vom Server löschen möchten? + + + + ImgS3Uploader + + Uploading Image + Bild hochladen + + + URL copied to clipboard. + URL kopiert. + + + Error + Fehler + + + + ImgUploadDialog + + + Upload Confirmation + Hochladebestätigung + + + + Do you want to upload this capture? + Möchtest du diese Aufnahme hochladen? + + + + + Upload without confirmation + Hochladen ohne Bestätigung + + + + ImgUploader + + Uploading Image + Bild hochladen + + + Unable to open the URL. + Kann URL nicht öffnen. + + + URL copied to clipboard. + URL kopiert. + + + Screenshot copied to clipboard. + Bildschirmaufnahme in Zwischenablage kopiert. + + + Copy URL + URL kopieren + + + Open URL + URL öffnen + + + Delete image + Bild löschen + + + Image to Clipboard. + Bild in Zwischenablage. + + + + ImgUploaderBase + + + Upload image + Bild hochladen + + + + Uploading Image + Bild hochladen + + + + Copy URL + URL kopieren + + + + Open URL + URL öffnen + + + + Delete image + Bild löschen + + + + Image to Clipboard. + Bild in Zwischenablage. + + + + Save image + Bild speichern + + + + Unable to open the URL. + Kann URL nicht öffnen. + + + + URL copied to clipboard. + URL in Zwischenablage kopiert. + + + + Screenshot copied to clipboard. + Bildschirmaufnahme in Zwischenablage kopiert. + + + + Unable to save the screenshot to disk. + Der Screenshot kann nicht auf der Festplatte gespeichert werden. + + + + Screenshot saved. + Screenshot gespeichert. + + + + ImgUploaderTool + + + Image Uploader + Bild-Uploader + + + + Upload the selection + Auswahl hochladen + + + + ImgurUploader + + Upload to Imgur + Zu Imgur hochladen + + + Uploading Image + Bild hochladen + + + Copy URL + URL kopieren + + + Open URL + URL öffnen + + + Delete image + Bild löschen + + + Image to Clipboard. + Bild in Zwischenablage. + + + + Unable to open the URL. + Kann URL nicht öffnen. + + + URL copied to clipboard. + URL kopiert. + + + Screenshot copied to clipboard. + Bildschirmaufnahme in Zwischenablage kopiert. + + + + ImgurUploaderTool + + Image Uploader + Bild hochladen + + + Upload the selection to Imgur + Auswahl zu Imgur hochladen + + + + InfoWindow + + + + About + Über + + + + + Icon + Symbol + + + + + License + Lizenz + + + + + GPLv3+ + GPL v 3+ + + + + + Version + Version + + + + + Flameshot v + Flameshot v + + + + + OS Info + OS-Info + + + + + Copy Info + Info kopieren + + + SPACEBAR + Leertaste + + + Right Click + Rechtsklick + + + Mouse Wheel + Mausrad + + + Move selection 1px + Verschiebe Auswahl um 1px + + + Resize selection 1px + Größenänderung um 1px + + + Quit capture + Auswahl verlassen + + + Copy to clipboard + In Zwischenablage kopieren + + + Save selection as a file + Speichere Auswahl als Datei + + + Undo the last modification + Letze Änderungen zurücksetzen + + + Toggle visibility of sidebar with options of the selected tool + Öffne/Schließe Seitenauswahlmenü des gewählten Werkzeugs + + + Show color picker + Zeige Farbauswahl + + + Change the tool's thickness + Ändere die Dicke des Werkzeugs + + + Available shortcuts in the screen capture mode. + Verfügbare Tastenkürzel im Aufnahmemodus. + + + Key + Taste + + + Description + Beschreibung + + + <u><b>License</b></u> + <u><b>Lizenz</b></u> + + + <u><b>Version</b></u> + <u><b>Version</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Tastenkürzel</b></u> + + + + InvertTool + + + Invert + Invertieren + + + + Set Inverter as the paint tool + Inverter als Malwerkzeug festlegen + + + + LineTool + + + Line + Linie + + + + Set the Line as the paint tool + Linie als Malwerkzeug festlegen + + + + MarkerTool + + + Marker + Markierer + + + + Set the Marker as the paint tool + Markierer als Malwerkzeug festlegen + + + + MoveTool + + + Move + Bewegen + + + + Move the selection area + Auswahlbereich verschieben + + + + PencilTool + + + Pencil + Stift + + + + Set the Pencil as the paint tool + Stift als Malwerkzeug festlegen + + + + PinTool + + + Pin Tool + Pin-Werkzeug + + + + Pin image on the desktop + Bild auf den Desktop pinnen + + + + PinWidget + + + Context menu + Kontextmenü + + + + Copy to clipboard + In Zwischenablage kopieren + + + + Save to file + In Datei speichern + + + + Rotate Right + Nach rechts drehen + + + + Rotate Left + Nach links drehen + + + + Increase Opacity + Deckkraft erhöhen + + + + Decrease Opacity + Deckkraft verringern + + + + Close + Schließen + + + + PixelateTool + + + Pixelate + Verpixeln + + + + Set Pixelate as the paint tool. + Verpixeln als Malwerkzeug festlegen. + + + Set Pixelate as the paint tool + Verpixeln als Werkzeug wählen + + + + PrimaryInstanceWidget + + + Primary instance + Primärinstanz + + + + <b>Primary instance.</b> Messages received from secondaries: + <b>Primärinstanz.</b> Von Sekundärinstanzen empfangene Nachrichten: + + + + QHotkey + + Failed to register %1. Error: %2 + Die Registrierung von %1 ist fehlgeschlagen. Fehler: %2 + + + Failed to unregister %1. Error: %2 + Die Registrierung von %1 konnte nicht aufgehoben werden. Fehler: %2 + + + + QObject + + + Save Error + Speicherfehler + + + + + Capture saved as + Aufnahme gespeichert als + + + + + Capture saved to clipboard. + Aufnahme in die Zwischenablage gespeichert. + + + Capture saved to clipboard + Aufnahme in Zwischenablage gespeichert + + + + Error while saving to clipboard + Fehler beim Speichern in die Zwischenablage + + + + + Error trying to save as + Fehler beim Speichern unter + + + + Save screenshot + Screenshot speichern + + + + Path copied to clipboard as + Pfad in die Zwischenablage kopiert als + + + Saving canceled + Speichern abbrechen + + + Save canceled + Speichern abgebrochen + + + Capture is saved and copied to the clipboard as + Aufnahme in Zwischenablage kopiert und gespeichert unter + + + + Unable to connect via DBus + Kann nicht via DBus verbinden + + + + Powerful yet simple to use screenshot software. + Mächtiges und trotzdem einfach zu bedienendes Bildschirmaufnahme Tool. + + + + See + Siehe + + + Capture the entire desktop. + Gesamten Bildschirm aufnehmen. + + + + Open the capture launcher. + Aufnahme-Launcher starten. + + + + Start a manual capture in GUI mode. + Eine manuelle Aufnahme im GUI-Modus starten. + + + + Configure + Konfigurieren + + + Capture a single screen. + Einen einzelnen Monitor aufnehmen. + + + Path where the capture will be saved + Verzeichnis wo die Aufnahme gespeichert werden wird + + + + Capture screenshot of all monitors at the same time. + Screenshot aller Monitore gleichzeitig aufnehmen. + + + + Capture a screenshot of the specified monitor. + Einen Screenshot des angegebenen Monitors erstellen. + + + + Existing directory or new file to save to + Vorhandenes Verzeichnis oder neue Datei zum Speichern + + + + Save the capture to the clipboard + Aufnahme in die Zwischenablage speichern + + + + Pin the capture to the screen + Aufnahme an den Bildschirm anheften + + + + Upload screenshot + Screenshot hochladen + + + + Delay time in milliseconds + Verzögerung in Millisekunden + + + + Repeat screenshot with previously selected region + Screenshot mit zuvor ausgewähltem Bereich wiederholen + + + + Screenshot region to select + Zu wählender Screenshot-Bereich + + + + Set the filename pattern + Dateinamenschema festlegen + + + + Accept capture as soon as a selection is made + Erfassung akzeptieren, sobald eine Auswahl getroffen wurde + + + + Enable or disable the trayicon + Taskleistensymbol aktivieren oder deaktivieren + + + + Enable or disable run at startup + "beim Start ausführen" aktivieren oder deaktivieren + + + + Enable or disable the notifications + Benachrichtigungen aktivieren oder deaktivieren + + + + Check the configuration for errors + Konfiguration auf Fehler überprüfen + + + + Show the help message in the capture mode + Hilfetext im Aufnahmemodus anzeigen + + + + Define the main UI color + Haupt-Interfacefarbe festlegen + + + + Define the contrast UI color + Kontrast-Interfacefarbe festlegen + + + + Print raw PNG capture + PNG-Rohdaten ausgeben + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + Geometrie der Auswahl im Format B H X Y ausgeben. Ignoriert, falls raw ausgewählt ist + + + + Define the screen to capture (starting from 0) + Den zu erfassenden Bildschirm definieren (beginnend bei 0) + + + + Invalid delay, it must be a number greater than 0 + Ungültige Verzögerung, muss eine Zahl größer als 0 sein + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + Ungültiger Bereich, verwende 'WxH+X+Y' oder 'all' oder 'screen0/screen1/...'. + + + + Invalid path, must be an existing directory or a new file in an existing directory + Ungültiger Pfad, muss ein bestehendes Verzeichnis oder eine neue Datei in einem bestehenden Verzeichnis sein + + + Define the screen to capture + Definiere Monitor für die Aufnahme + + + + default: screen containing the cursor + Standard: Bildschirm auf dem sich der Mauszeiger befindet + + + + Screen number + Bildschirmnummer + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Ungültige Farbe, dieser Parameter unterstützt die folgenden Formate: +- #RGB (wobei R, G, und B jeweils ein einzelner HEX-Wert sind) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Benannte Farben wie 'blue' oder 'red' +Eventuell muss das '#' Zeichen als '\#FFF' maskiert werden + + + Invalid delay, it must be higher than 0 + Ungültige Verzögerung, sie muss größer als 0 sein + + + + Invalid screen number, it must be non negative + Ungültige Bildschirmnummer, sie darf nicht negativ sein + + + Invalid path, it must be a real path in the system + Ungültiges Verzeichnis, es mus sein existierendes Verzeichnis im System angegeben werden + + + + Invalid value, it must be defined as 'true' or 'false' + Ungültiger Wert, muss als 'true' (wahr) oder 'false' (falsch) angegeben werden + + + + Error + Fehler + + + + Unable to write in + Kein Schreibzugriff auf + + + + Options + Optionen + + + Arguments + Parameter + + + arguments + Parameter + + + + Subcommands + Unterbefehle + + + + subcommands + Unterbefehle + + + + Usage + Verwendung + + + + options + Parameter + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Standardmäßig wird Flameshot im Hintergrund ausgeführt und ein Taskleistensymbol zur Konfiguration angezeigt. + + + + Requested screen exceeds screen count + Angeforderter Bildschirm überschreitet die Anzahl der Bildschirme + + + + Full screen screenshot pinned to screen + Vollbild-Screenshot an den Bildschirm geheftet + + + URL copied to clipboard. + URL in Zwischenablage kopiert. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Hallo, hier bin ich! Auf das Symbol in der Taskleiste linksklicken, um eine Aufnahme zu starten, oder rechtsklicken für mehr Optionen. + + + Toggle side panel + Seitenpanel umschalten + + + Resize selection left 1px + Auswahl links um 1 Pixel verändern + + + Resize selection right 1px + Auswahl rechts um 1 Pixel verändern + + + Resize selection up 1px + Auswahl oben um 1 Pixel verändern + + + Resize selection down 1px + Auswahl unten um 1 Pixel verändern + + + Select entire screen + Gesamten Bildschirm auswählen + + + Move selection left 1px + Auswahl um 1 Pixel nach Links verschieben + + + Move selection right 1px + Auswahl um 1 Pixel nach Rechts verschieben + + + Move selection up 1px + Auswahl um 1 Pixel nach Oben verschieben + + + Move selection down 1px + Auswahl um 1 Pixel nach Unten verschieben + + + Commit text in text area + Text in Textbereich übernehmen + + + Delete current tool + Aktuelles Werkzeug löschen + + + + Quit capture + Aufnahme verlassen + + + + Screenshot history + Letzte Screenshots + + + + Capture screen + Bildschirm aufnehmen + + + + Show color picker + Farbwähler anzeigen + + + + Change the tool's size + Werkzeuggröße ändern + + + Change the tool's thickness + Ändere die Dicke des Werkzeugs + + + + RectangleTool + + + Rectangle + Rechteck + + + + Set the Rectangle as the paint tool + Rechteck als Malwerkzeug festlegen + + + + RedoTool + + + Redo + Wiederholen + + + + Redo the next modification + Nächste Veränderung wiederholen + + + + SaveTool + + + Save + Speichern + + + + Save screenshot to a file + Screenshot in Datei speichern + + + Save the capture + Speichere die Aufnahme + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Desktopumgebung wurde nicht erkannt (GNOME? KDE? Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + Der universelle Wayland-Bildschirmaufnahmeadapter benötigt Grim als Bildschirmaufnahmekomponente von Wayland. Wenn die Bildschirmaufnahmekomponente fehlt, installiere sie bitte! + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + Wenn die useGrimAdapter-Einstellung nicht aktiviert ist, wird das dbus-Protokoll verwendet. Es ist zu beachten, dass die Verwendung des dbus-Protokolls unter Wayland nicht empfohlen wird. Es wird empfohlen, die useGrimAdapter-Einstellung in flameshot.ini zu aktivieren, um den auf Grim basierenden allgemeinen Wayland-Screenshot-Adapter zu aktivieren + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + Die Screenshot-Komponente von grim basiert auf wlroots und wird möglicherweise nicht in GNOME oder ähnlichen Desktop-Umgebungen verwendet + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + Kann Desktop-Umgebung nicht erkennen (GNOME? KDE? Qile? Sway? ...) + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + Hinweis: Versuche, die Umgebungsvariable XDG_CURRENT_DESKTOP festzulegen. + + + + Unable to capture screen + Bildschirm kann nicht erfasst werden + + + + SecondaryInstanceWidget + + + Secondary instance + Sekundärinstanz + + + + <b>Secondary instance.</b> Send message to primary: + <b>Sekundärinstanz.</b> Nachricht an Primärinstanz senden: + + + + Type something here... + Schreib hier irgendwas... + + + + &Send + &Senden + + + + Error sending message + Fehler beim Senden der Nachricht + + + + The message '%1' could not be sent to the primary. + Die Nachricht '%1' konnte nicht an die Primärinstanz gesendet werden. + + + + SelectionTool + + + Rectangular Selection + Rechteckige Auswahl + + + + Set Selection as the paint tool + Rechteck als Malwerkzeig festlegen + + + + SetShortcutDialog + + + Set Shortcut + Tastenkürzel setzen + + + + Enter new shortcut to change + Zum Ändern neues Tastenkürzel eingeben + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Abbrechen mit Esc oder ⌘+Rücktaste zum Deaktivieren des Tastenkürzels. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Abbrechen mit Esc oder die Rücktaste zum Deaktivieren des Tastenkürzels. + + + + + Flameshot must be restarted for changes to take effect. + Flameshot muss neu gestartet werden, damit die Änderungen wirksam werden. + + + + ShortcutsWidget + + + Hot Keys + Tastenkürzel + + + + Available shortcuts in the screen capture mode. + Verfügbare Tastenkürzel im Aufnahmemodus. + + + + Description + Beschreibung + + + + Key + Taste + + + + Left Double-click + Linker Doppelklick + + + + Toggle side panel + Seitenleiste umschalten + + + + Grab a color from the screen + Nimm eine Farbe vom Bildschirm + + + + Resize selection left 1px + Auswahl links um 1 Pixel verändern + + + + Resize selection right 1px + Auswahl rechts um 1 Pixel verändern + + + + Resize selection up 1px + Auswahl oben um 1 Pixel verändern + + + + Resize selection down 1px + Auswahl unten um 1 Pixel verändern + + + + Symmetrically decrease width by 2px + Breite symmetrisch um 2px verringern + + + + Symmetrically increase width by 2px + Breite symmetrisch um 2px erhöhen + + + + Symmetrically increase height by 2px + Höhe symmetrisch um 2px erhöhen + + + + Symmetrically decrease height by 2px + Höhe symmetrisch um 2px verringern + + + + Select entire screen + Gesamten Bildschirm auswählen + + + + Move selection left 1px + Auswahl um 1 Pixel nach Links verschieben + + + + Move selection right 1px + Auswahl um 1 Pixel nach Rechts verschieben + + + + Move selection up 1px + Auswahl um 1 Pixel nach Oben verschieben + + + + Move selection down 1px + Auswahl um 1 Pixel nach Unten verschieben + + + + Commit text in text area + Text in Textbereich übernehmen + + + + Delete selected drawn object + Ausgewähltes Objekt löschen + + + + Cancel current selection + Aktuelle Auswahl aufheben + + + Delete current tool + Aktuelles Werkzeug löschen + + + + Capture screen + Bildschirm aufnehmen + + + + Screenshot history + Screenshot-Verlauf + + + + SidePanelWidget + + Active thickness: + Aktuelle Dicke: + + + Active color: + Aktuelle Farbe: + + + Press ESC to cancel + Drücke ESC für Abbruch + + + + Active tool size: + Aktive Werkzeuggröße: + + + + Active Color: + Aktive Farbe: + + + + Grab Color + Farbe erfassen + + + + Display grid + Raster anzeigen + + + + SizeDecreaseTool + + + Decrease Tool Size + Werkzeuggröße verkleinern + + + + Decrease the size of the other tools + Größe der anderen Werkzeuge verringern + + + + SizeIncreaseTool + + + Increase Tool Size + Werkzeuggröße erhöhen + + + + Increase the size of the other tools + Größe der anderen Werkzeuge erhöhen + + + + SizeIndicatorTool + + Selection Size Indicator + Größe der Auswahl + + + Show X and Y dimensions of the selection + X- und Y-Abmessungen der Auswahl anzeigen + + + Show the dimensions of the selection (X Y) + Zeige die Dimensionen der Auswahl (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + Jahrhundert (00-99) + + + + Year (00-99) + Jahr (00-99) + + + + Year (2000) + Jahr (2000) + + + + Month Name (jan) + Monatsname (Jan) + + + + Month Name (january) + Monatsname (Januar) + + + + Month (01-12) + Monat (01-12) + + + + Week Day (1-7) + Wochentag (1-7) + + + + Week (01-53) + Woche (01-53) + + + + Day Name (mon) + Wochentag (Mon) + + + + Day Name (monday) + Wochentag (Montag) + + + + Day (01-31) + Tag (01-31) + + + + Day of Month (1-31) + Tag des Monats (1-31) + + + + Day (001-366) + Tag (001-366) + + + + Time (%H-%M-%S) + Zeit (%H-%M-%S) + + + + Time (%H-%M) + Zeit (%H-%M) + + + + Hour (00-23) + Stunde (00-23) + + + + Hour (01-12) + Stunde (01-12) + + + + Minute (00-59) + Minute (00-59) + + + + Second (00-59) + Sekunde (00-59) + + + + Full Date (%m/%d/%y) + Komplettes Datum (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + Komplettes Datum (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + Volles Datum (%d-%m-%Y) + + + + SystemNotification + + + Flameshot Info + Flameshot Info + + + + TextConfig + + + StrikeOut + Durchstreichen + + + + Underline + Unterstrichen + + + + Bold + Fettdruck + + + + Italic + Kursiv + + + + Left Align + Links ausrichten + + + + Center Align + Mittig ausrichten + + + + Right Align + Rechts ausrichten + + + + TextTool + + + Text + Text + + + + Add text to your capture + Füge Text zur Auswahl hinzu + + + + TrayIcon + + + &Take Screenshot + &Screenshot anfertigen + + + + &Open Launcher + &Launcher öffnen + + + + &Configuration + &Konfiguration + + + + &About + &Über Flameshot + + + + Check for updates + Auf Aktualisierungen überprüfen + + + + New version %1 is available + Neue Version %1 ist verfügbar + + + + &Quit + &Beenden + + + + &Latest Uploads + &Letzte Uploads + + + + &Open Save Path + Speicherpfad &öffnen + + + + UIcolorEditor + + UI Color Editor + Grafischer Farbeditor + + + + Change the color moving the selectors and see the changes in the preview buttons. + Ändere die Farbe, indem due die Selektoren bewegst, und sieh dir die Änderungen in den Vorschauschaltflächen an. + + + + Select a Button to modify it + Wähle einen Knopf, um ihn zu verändern + + + + Main Color + Hauptfarbe + + + + Click on this button to set the edition mode of the main color. + Wähle diesen Knopf, um den Bearbeitungsmodus der Hauptfarbe zu wählen. + + + + Contrast Color + Kontrastfarbe + + + + Click on this button to set the edition mode of the contrast color. + Wähle diesen Knopf, um den Bearbeitungsmodus der Kontrastfarbe zu wählen. + + + + UndoTool + + + Undo + Verwerfen + + + + Undo the last modification + Letzte Änderung verwerfen + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + Neue Flameshot Version %1 ist verfügbar + + + + Ignore + Ignorieren + + + + Later + Später + + + + Update + Aktualisieren + + + + UploadHistory + + + Upload History + Upload-Verlauf + + + + Screenshots history is empty + Screenshot Verlauf ist leer + + + + UploadLineItem + + + Form + Formular + + + + TextLabel + TextEtikett + + + + Copy URL + URL kopieren + + + + Open In Browser + Im Browser öffnen + + + + Confirm to delete + Löschen bestätigen + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Bist du sicher, dass du die Aufnahme aus den Letzten Uploads und vom Server löschen möchtest? + + + + UtilityPanel + + + Close + Schließen + + + + <Empty> + <Leer> + + + + VisualsEditor + + + Opacity of area outside selection: + Deckkraft des Bereichs außerhalb der Auswahl: + + + + UI Color Editor + Grafischer Farbeditor + + + + Colorpicker Editor + Farbwähler-Editor + + + + Button Selection + Knopfauswahl + + + + Select All + Alle wählen + + + + color_widgets::ColorDialog + + + Pick + Wählen + + + + color_widgets::ColorPalette + + + Unnamed + Unbenannt + + + + color_widgets::ColorPaletteModel + + + Unnamed + Unbenannt + + + + %1 (%2 colors) + %1 (%2 Farben) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + Neue Palette aus einer Datei öffnen + + + + + Create a new palette + Neue Palette anlegen + + + + + Duplicate the current palette + Aktuelle Palette duplizieren + + + + + Delete the current palette + Aktuelle Palette löschen + + + + + Revert changes to the current palette + Änderungen an der aktuellen Palette rückgängig machen + + + + + Save changes to the current palette + Änderungen an der aktuellen Palette speichern + + + + + Add a color to the palette + Farbe zur Palette hinzufügen + + + + + Remove the selected color from the palette + Ausgewählte Farbe aus der Palette entfernen + + + + + New Palette + Neue Palette + + + + + Name + Name + + + + GIMP Palettes (*.gpl) + GIMP-Paletten (*.gpl) + + + + Palette Image (%1) + Palette Bild (%1) + + + + All Files (*) + Alle Dateien (*) + + + + + Open Palette + Palette öffnen + + + + Failed to load the palette file +%1 + Die Palettendatei konnte nicht geladen werden +%1 + + + + color_widgets::GradientEditor + + + Add Color + Farbe hinzufügen + + + + Remove Color + Farbe entfernen + + + + Edit Color... + Farbe bearbeiten ... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 Farben) + + + + color_widgets::Swatch + + + Clear Color + Farbe löschen + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_el.ts b/data/translations/Internationalization_el.ts new file mode 100644 index 0000000..e96a492 --- /dev/null +++ b/data/translations/Internationalization_el.ts @@ -0,0 +1,3169 @@ + + + + + AbstractWidgetList + + + Add New + Προσθήκη Νέου + + + + Move Up + Μετακίνηση Επάνω + + + + Move Down + Μετακίνηση Κάτω + + + + Remove + Κατάργηση + + + + AcceptTool + + + Accept + Αποδοχή + + + + Accept the capture + Αποδοχή της λήψης + + + + AppLauncher + + + App Launcher + Εκκινητής Εφαρμογής + + + + Choose an app to open the capture + Επιλέξτε μια εφαρμογή για να ανοίξετε την λήψη + + + + AppLauncherWidget + + + Open With + Άνοιγμα Με + + + + Launch in terminal + Άνοιγμα στο τερματικό + + + + Keep open after selection + Να παραμείνει ανοικτό μετά την επιλογή + + + + + Error + Σφάλμα + + + + Unable to launch in terminal. + Δεν είναι δυνατή η εκκίνηση στο τερματικό. + + + + Unable to write in + Δεν είναι δυνατή η εγγραφή στο + + + + ArrowTool + + + Arrow + Βέλος + + + + Set the Arrow as the paint tool + Ορίστε το Βέλος ως εργαλείο ζωγραφικής + + + + BlurTool + + Blur + Desenfocament + + + Set Blur as the paint tool + Estableix el desenfocament com a eina de dibuix + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Λειτουργία Λήψης</b> + + + + Rectangular Region + Ορθογώνια Περιοχή + + + + Full Screen (Current Display) + Πλήρη Οθόνη (Τρέχουσα Οθόνη) + + + + Full Screen (All Monitors) + Πλήρη Οθόνη (Όλες οι Οθόνες) + + + + No Delay + Χωρίς Καθυστέρηση + + + + second + δευτερόλεπτο + + + + + + seconds + δευτερόλεπτα + + + + + Take new screenshot + Λήψη νέου στιγμιότυπου οθόνης + + + + + Area: + Περιοχή: + + + + + Capture Launcher + Εκκινητής Λήψης + + + + + TextLabel + Ετικέτα Κειμένου + + + + + Capture Mode + Λειτουργία Λήψης + + + + + Delay: + Καθυστέρηση: + + + + + WxH+x+y + WxH+x+y + + + + CaptureWidget + + + Unable to capture screen + Impossible capturar la pantalla + Δεν είναι δυνατή η λήψη της οθόνης + + + + Mouse + Ποντίκι + + + + Select screenshot area + Επιλέξτε περιοχή στιγμιότυπου οθόνης + + + + Mouse Wheel + Τροχός Ποντικιού + + + + Change tool size + Αλλαγή μεγέθους εργαλείου + + + + Right Click + Δεξί Κλίκ + + + + Show color picker + Εμφάνιση επιλογέα χρώματος + + + + Open side panel + Ανοίξτε το πλαϊνό πλαίσιο + + + + Esc + Esc + + + + Exit + Έξοδος + + + + Quit Capture + + + + + Are you sure you want to quit capture? + + + + + Do not show this again + + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Το Flameshot έχει χάσει την εστίαση. Οι συντομεύσεις πληκτρολογίου δεν θα λειτουργήσουν μέχρι να κάνετε κλικ κάπου. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + Επιλύθηκε το σφάλμα διαμόρφωσης. Εκκινήστε ξανά το «flameshot gui» για να το εφαρμόσετε. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Επιλέξτε μια περιοχή με το ποντίκι, ή πατήστε Esc για έξοδο. +Πατήστε Enter για να κάνετε λήψη της οθόνης. +Πατήστε δεξί κλικ για να εμφανιστεί ο επιλογέας χρωμάτων. +Χρησιμοποιήστε την ροδέλα του ποντικιού για να αλλάξετε το πάχος του επιλεγμένου εργαλείου. +Πατήστε καινό για να ανοίξετε τον πλευρικό πίνακα. + + + + Tool Settings + Ρυθμίσεις Εργαλείου + + + + CircleCountTool + + + Circle Counter + Κυκλικός Μετρητής + + + + Add an autoincrementing counter bubble + Προσθέτει ένα αυτόματα αυξανόμενο μετρητή φυσαλίδων + + + + CircleTool + + + Circle + Κύκλος + + + + Set the Circle as the paint tool + Ορίστε τον Κύκλο ως εργαλείο ζωφραφικής + + + + ColorDialog + + + + Select Color + Επιλέξτε Χρώμα + + + + + Saturation + Κορεσμός + + + + + Hue + Απόχρωση + + + + + Hex + Hex + + + + + Blue + Μπλε + + + + + Value + Τιμή + + + + + Green + Πράσινο + + + + + Alpha + Alpha + + + + + Red + Κόκκινο + + + + ColorGrabWidget + + + Accept color + Αποδοχή χρώματος + + + + Enter or Left Click + Enter ή Αριστερό Κλικ + + + + Precisely select color + Επιλέξτε με ακρίβεια χρώμα + + + + Hold Left Click + Κρατήστε Πατημένο το Αριστερό Κλικ + + + + Toggle magnifier + Εναλλαγή μεγεθυντικού φακού + + + + Space or Right Click + Space ή Δεξί Κλικ + + + + Cancel + Ακύρωση + + + + Esc + Esc + + + + ColorPickerEditor + + Select Preset: + Επιλέξτε Προεπιλογή: + + + Select preset using the spinbox + Επιλέξτε προεπιλογή χρησιμοποιώντας το spinbox + + + + Edit Preset: + Επεξεργασία Προεπιλογής: + + + + Enter color to update preset + Εισαγάγετε χρώμα για ενημέρωση προεπιλογής + + + + Update + Ενημέρωση + + + + Press button to update the selected preset + Πατήστε το κουμπί για να ενημερώσετε την επιλεγμένη προεπιλογή + + + + Delete + Διαγραφή + + + + Press button to delete the selected preset + Πατήστε το κουμπί για να διαγράψετε την επιλεγμένη προεπιλογή + + + + Add Preset: + Προσθήκη Προεπιλογής: + + + + Enter color manually or select it using the color-wheel + Εισαγάγετε το χρώμα χειροκίνητα ή επιλέξτε το χρησιμοποιώντας τον τροχό χρώματος + + + + Add + Προσθήκη + + + + Press button to add preset + Πατήστε το κουμπί για να προσθέσετε προεπιλογή + + + + + Error + Σφάλμα + + + + Unable to add preset. Maximum limit reached. + Δεν είναι δυνατή η προσθήκη προκαθορισμένης ρύθμισης. Συμπληρώθηκε το μέγιστο όριο. + + + + Unable to remove preset. Minimum limit reached. + Δεν είναι δυνατή η κατάργηση της προεπιλογής. Συμπληρώθηκε το ελάχιστο όριο. + + + + ConfigErrorDetails + + + Configuration errors + Σφάλματα διαμόρφωσης + + + + ConfigHandler + + + Unrecognized setting: '%1' + + Μη αναγνωρισμένη ρύθμιση: '% 1' + + + + + Unrecognized shortcut name: '%1'. + + Μη αναγνωρισμένο όνομα συντόμευσης: '%1'. + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + Διένεξη συντομεύσεων: "% 1" και "% 2" έχουν την ίδια συντόμευση: %3 + + + + + Bad value in '%1'. Expected: %2 + + Λάθος τιμή στο '% 1'. Αναμενόμενο: %2 + + + + + You have successfully resolved the configuration error. + Επιλύσατε με επιτυχία το σφάλμα διαμόρφωσης. + + + + The configuration contains an error. Open configuration to resolve. + Η διαμόρφωση περιέχει ένα σφάλμα. Ανοίξτε τη διαμόρφωση για επίλυση. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + Εσφαλμένο κλειδί διαμόρφωσης '%1' στο ConfigHandler. Αναφέρετε αυτό ως σφάλμα. + + + + ConfigResolver + + + Resolve configuration errors + Επίλυση σφαλμάτων διαμόρφωσης + + + + <b>You must resolve all errors before continuing:</b> + <b>Πρέπει να επιλύσετε όλα τα σφάλματα πριν συνεχίσετε:</b> + + + + Reset + Επαναφορά + + + + Reset to the default value. + Επαναφορά στην προεπιλεγμένη τιμή. + + + + Remove + Κατάργηση + + + + Remove this setting. + Καταργήστε αυτήν τη ρύθμιση. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + Ορισμένες συντομεύσεις πληκτρολογίου έχουν διενέξεις. +Αυτό ΔΕΝ θα εμποδίσει την εκκίνηση του flameshot. +Επιλύστε τα με μη αυτόματο τρόπο στο αρχείο ρυθμίσεων. + + + + Resolve all + Επίλυση όλων + + + + Resolve all listed errors. + Επιλύστε όλα τα σφάλματα που αναφέρονται. + + + + Details + Λεπτομέριες + + + + ConfigWindow + + + Configuration + Διαμόρφωση + + + + Interface + Διεπαφή + + + + Filename Editor + Επεξεργαστής Ονόματος αρχείου + + + + General + Γενικά + + + + Shortcuts + Συντομεύσεις + + + + Resolve + Επίλυση + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>Το αρχείο διαμόρφωσης έχει σφάλματα. Επιλύστε τα πριν συνεχίσετε.</b> + + + + Controller + + New version %1 is available + Η νέα έκδοση % 1 είναι διαθέσιμη + + + You have the latest version + Έχετε την πιο πρόσφατη έκδοση + + + Failed to get information about the latest version. + Αποτυχία λήψης πληροφοριών για την πιο πρόσφατη έκδοση. + + + Error + Σφάλμα + + + Unable to close active modal widgets + Δεν είναι δυνατό το κλείσιμο των ενεργών γραφικών στοιχείων + + + &Open Launcher + &Άνοιγμα Εκκινητή + + + &Configuration + &Διαμόρφωση + + + &About + &Σχετικά με + + + Check for updates + Έλεγχος για ενημερώσεις + + + &Latest Uploads + &Τελευταίες Μεταφορτώσεις + + + URL copied to clipboard. + Η διεύθυνση URL αντιγράφηκε στο πρόχειρο. + + + &Information + &Informació + + + &Quit + %Κλείσιμο + + + &Take Screenshot + &Λήψη Στιγμιότυπου οθόνης + + + + CopyTool + + + Copy + Αντιγραφή + + + + Copy selection to clipboard + Αντιγραφή επιλογής στο πρόχειρο + + + Copy the selection into the clipboard + Copy the selection into the clipboard + + + + DBusUtils + + Unable to connect via DBus + Unable to connect via DBus + + + + ExitTool + + + Exit + Έξοδος + + + + Leave the capture screen + Αφήστε την οθόνη λήψης + + + + FileNameEditor + + + Edit the name of your captures: + Επεξεργαστείτε το όνομα των λήψεών σας: + + + + Edit: + Επεξεργασία: + + + + Preview: + Προεπισκόπηση: + + + + Save + Αποθήκευση + + + + Saves the pattern + Αποθηκεύει το μοτίβο + + + + Restore + Επαναφορά + + + + Restores the saved pattern + Επαναφέρει το αποθηκευμένο μοτίβο + + + + Clear + Καθαρισμός + + + + Deletes the name + Διαγράφει το όνομα + + + + Flameshot + + + Error + Σφάλμα + + + + Unable to close active modal widgets + Δεν είναι δυνατό το κλείσιμο των ενεργών γραφικών στοιχείων + + + + URL copied to clipboard. + Η διεύθυνση URL αντιγράφηκε στο πρόχειρο. + + + + FlameshotDaemon + + + New version %1 is available + Η νέα έκδοση % 1 είναι διαθέσιμη + + + + You have the latest version + Έχετε την πιο πρόσφατη έκδοση + + + + Failed to get information about the latest version. + Αποτυχία λήψης πληροφοριών για την πιο πρόσφατη έκδοση. + + + + Unable to connect via DBus + Δεν είναι δυνατή η σύνδεση μέσω DBus + + + + GeneneralConf + + Show help message + Mostra el missatge d'ajuda + + + Show the help message at the beginning in the capture mode. + Mostra el missatge d'ajuda en iniciar el mode de captura. + + + Show desktop notifications + Mostra les notificacions d'escriptori + + + Show tray icon + Mostra la icona en la barra de tasques + + + Show the systemtray icon + Mostra la icona en la barra de tasques + + + Import + Importar + + + Error + Error + + + Unable to read file. + Impossible llegir el fitxer. + + + Unable to write file. + Impossible escriure al fitxer. + + + Save File + Guardar Arxiu + + + Confirm Reset + Confirmar Reset + + + Are you sure you want to reset the configuration? + Esteu segur que voleu reiniciar la configuració? + + + Configuration File + Fitxer de Configuració + + + Export + Exportar + + + Reset + Reset + + + Launch at startup + Llançament a l'inici + + + + GeneralConf + + + + Import + Εισαγωγή + + + + + + + Error + Σφάλμα + + + + Unable to read file. + Δεν είναι δυνατή η ανάγνωση του αρχείου. + + + + + Unable to write file. + Δεν είναι δυνατή η εγγραφή του αρχείου. + + + + Save File + Αποθήκευση Αρχείου + + + + Confirm Reset + Επιβεβαίωση Επαναφοράς + + + + Are you sure you want to reset the configuration? + Είστε βέβαιοι ότι θέλετε να επαναφέρετε τη διαμόρφωση; + + + + Show help message + Εμφάνιση μηνύματος βοήθειας + + + Show the help message at the beginning in the capture mode. + Εμφάνιση του μηνύματος βοήθειας στην αρχή της λειτουργίας λήψης. + + + + Show the side panel button + Εμφάνιση του κουμπιού του πλαϊνού πίνακα + + + Show the side panel toggle button in the capture mode. + Εμφάνιση του κουμπιού εναλλαγής του πλαϊνού πίνακα στη λειτουργία λήψης. + + + + Show desktop notifications + Εμφάνιση ειδοποιήσεων στην επιφάνειας εργασίας + + + + Show tray icon + Εμφάνιση εικονιδίου tray + + + Show the systemtray icon + Εμφάνιση του εικονιδίου συστήματοςtray + + + + Confirmation required to delete screenshot from the latest uploads + Απαιτείται επιβεβαίωση για τη διαγραφή στιγμιότυπου οθόνης από τις πιο πρόσφατες μεταφορτώσεις + + + + Configuration File + Αρχείο Διαμόρφωσης + + + + Export + Εξαγωγή + + + + Reset + Επαναφορά + + + + Automatic check for updates + Αυτόματος έλεγχος για ενημερώσεις + + + + Allow multiple flameshot GUI instances simultaneously + Επιτρέψτε πολλαπλές παρουσίες GUI flameshot ταυτόχρονα + + + This allows you to take screenshots of flameshot itself for example. + Αυτό σας επιτρέπει να τραβάτε στιγμιότυπα οθόνης του ίδιου του flameshot, για παράδειγμα. + + + Automatically close daemon when it is not needed + Κλείστε αυτόματα το daemon όταν δεν χρειάζεται + + + Launch at startup + Έναρξη κατά την εκκίνηση + + + Launch Flameshot + Εκκίνηση Flameshot + + + + Show welcome message on launch + Εμφάνιση μηνύματος καλωσορίσματος κατά την εκκίνηση + + + + Use large predefined color palette + Χρησιμοποιήστε μεγάλη προκαθορισμένη παλέτα χρωμάτων + + + + Copy URL after upload + Αντιγράψτε τη διεύθυνση URL μετά τη μεταφόρτωση + + + Copy URL and close window after upload + Αντιγράψτε τη διεύθυνση URL και κλείστε το παράθυρο μετά τη μεταφόρτωση + + + + Save image after copy + Αποθήκευση εικόνας μετά την αντιγραφή + + + Save image file after copying it + Αποθηκεύστε το αρχείο εικόνας αφού το αντιγράψετε + + + + Show the help message at the beginning in the capture mode + Εμφανίστε το μήνυμα βοήθειας στην αρχή στη λειτουργία λήψης + + + + Use last region for GUI mode + Χρησιμοποιήστε την τελευταία περιοχή + + + + Use the last region as the default selection for the next screenshot in GUI mode + Χρησιμοποιεί την τελευταία περιοχή ως προεπιλεγμένη επιλογή για το επόμενο στιγμιότυπο οθόνης + + + + Show the side panel toggle button in the capture mode + Εμφάνιση του κουμπιού εναλλαγής του πλαϊνού πίνακα στη λειτουργία λήψης + + + + Enable desktop notifications + Ενεργοποίηση ειδοποιήσεων επιφάνειας εργασίας + + + + Show abort notifications + + + + + Enable abort notifications + + + + + Show icon in the system tray + Εμφάνιση εικονιδίου στο tray συστήματος + + + + Use grim to capture screenshots + + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + + + + + Ask for confirmation to delete screenshot from the latest uploads + Ζητήστε επιβεβαίωση για τη διαγραφή στιγμιότυπου οθόνης από τις πιο πρόσφατες μεταφορτώσεις + + + + Check for updates automatically + Έλεγχος ενημερώσεων αυτόματα + + + + This allows you to take screenshots of Flameshot itself for example + Αυτό σας επιτρέπει να τραβάτε στιγμιότυπα οθόνης του ίδιου του Flameshot, για παράδειγμα + + + Launch Flameshot daemon when computer is booted + Εκκίνηση του Flameshot daemon κατά την έναρξη του υπολογιστή + + + + Show the welcome message box in the middle of the screen while taking a screenshot + Εμφάνιση του πλαισίου μηνύματος καλωσορίσματος στη μέση της οθόνης κατά τη λήψη ενός στιγμιότυπου οθόνης + + + + Use a large predefined color palette + Χρήση μιας μεγάλης προκαθορισμένης παλέτα χρωμάτων + + + + Copy on double click + Αντιγραφή με διπλό κλικ + + + Enable Copy on Double Click + Ενεργοποιήστε την Αντιγραφή με Διπλό Κλικ + + + Copy URL and close window after uploading was successful + Αντιγραφή της διεύθυνσης URL και κλείσιμο του παραθύρου μετά την επιτυχή μεταφόρτωση + + + + Automatically unload from memory when it is not needed + + + + + Automatically close daemon (background process) when it is not needed + + + + + Launch in background at startup + + + + + Launch Flameshot daemon (background process) when computer is booted + + + + + Ask before quit capture + + + + + Show the confirmation prompt before ESC quit + + + + + Enable Copy to clipboard on Double Click + + + + + Copy URL after uploading was successful + + + + + After copying the screenshot, save it to a file as well + Αφού αντιγράψετε το στιγμιότυπο οθόνης, αποθηκεύστε το και σε αρχείο + + + + Save Path + Αποθήκευση Διαδρομής + + + + Change... + Αλλαγή... + + + + Use fixed path for screenshots to save + Χρησιμοποιήστε σταθερή διαδρομή για στιγμιότυπα οθόνης για αποθήκευση + + + + Preferred save file extension: + Προτιμώμενη επέκταση αρχείου αποθήκευσης: + + + + Latest Uploads Max Size + Τελευταίες Μεταφορτώσεις Μέγιστο Μέγεθος + + + + Imgur Application Client ID + Κλειδί API Imgur + + + + Undo limit + Αναίρεση Ορίου + + + + Use JPG format for clipboard (PNG default) + Χρήση μορφής JPG για το πρόχειρο (προεπιλογή PNG) + + + + Use lossy JPG format for clipboard (lossless PNG default) + + + + + Copy file path after save + Αντιγραφή διαδρομής αρχείου μετά την αποθήκευση + + + + Copy the file path to clipboard after the file is saved + Αντιγραφή της διαδρομής του αρχείου στο πρόχειρο μετά την αποθήκευση του αρχείου + + + + Anti-aliasing image when zoom the pinned image + Anti-aliasing της εικόνας κατά τη μεγέθυνση της καρφιτσωμένης εικόνας + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + Μετά τη μεγέθυνση της καρφιτσωμένης εικόνας, θέλετε η εικόνα να εξομαλυνθεί ή να παραμείνει pixelated + + + + + Upload image without confirmation + Μεταφόρτωση εικόνας χωρίς επιβεβαίωση + + + + Choose a Folder + Επιλέξτε ένα Φάκελο + + + + Unable to write to directory. + Δεν είναι δυνατή η εγγραφή στον κατάλογο. + + + + Show magnifier + Εμφάνιση μεγεθυντικού φακού + + + + Enable a magnifier while selecting the screenshot area + Ενεργοποιήστε έναν μεγεθυντικό φακό ενώ επιλέγετε την περιοχή στιγμιότυπου οθόνης + + + + Square shaped magnifier + Μεγεθυντικός φακός τετράγωνου σχήματος + + + + Make the magnifier to be square-shaped + Κάντε τον μεγεθυντικό φακό να έχει τετράγωνο σχήμα + + + + Milliseconds before geometry display hides; 0 means do not hide + + + + + Set geometry display timeout (ms) + + + + + Selection Geometry Display + + + + + Display Location + + + + + None + + + + + Top Left + + + + + Top Right + + + + + Bottom Left + + + + + Bottom Right + + + + + Center + + + + + Quality range of 0-100; Higher number is better quality and larger file size + + + + + JPEG Quality + + + + + Reverse arrow + + + + + Draw the arrow head first + + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + Τελευταίες Μεταφορτώσεις + + + Screenshots history is empty + Το ιστορικό στιγμιότυπων οθόνης είναι κενό + + + Copy URL + Αντιγραφή διεύθυνσης URL + + + URL copied to clipboard. + Η διεύθυνση URL αντιγράφηκε στο πρόχειρο. + + + Open in browser + Ανοιγμα σε πρόγραμμα περιήγησης + + + Confirm to delete + Επιβεβαίωση για διαγραφή + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Είστε βέβαιοι ότι θέλετε να διαγράψετε ένα στιγμιότυπο οθόνης από τις πιο πρόσφατες μεταφορτώσεις και διακομιστή; + + + + ImgS3Uploader + + Uploading Image + S'està pujant la imatge + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Error + Error + + + + ImgUploadDialog + + + Upload Confirmation + Επιβεβαίωση Μεταφόρτωσης + + + + Do you want to upload this capture? + Θέλετε να ανεβάσετε αυτήν τη λήψη; + + + + + Upload without confirmation + Μεταφόρτωση χωρίς επιβεβαίωση + + + + ImgUploader + + Uploading Image + S'està pujant la imatge + + + Unable to open the URL. + No es pot obrir l'URL. + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + Copy URL + Copia l'URL + + + Open URL + Obri l'URL + + + Image to Clipboard. + Imatge al porta-retalls. + + + + ImgUploaderBase + + + Upload image + Μεταφόρτωση εικόνας + + + + Uploading Image + Μεταφόρτωση Εικόνας + + + + Copy URL + Αντιγραφή διεύθυνσης URL + + + + Open URL + Άνοιγμα διεύθυνσης URL + + + + Delete image + Διαγραφή εικόνας + + + + Image to Clipboard. + Εικόνα στο Πρόχειρο. + + + + Save image + Αποθήκευση εικόνας + + + + Unable to open the URL. + Δεν είναι δυνατό το άνοιγμα της διεύθυνσης URL. + + + + URL copied to clipboard. + Η διεύθυνση URL αντιγράφηκε στο πρόχειρο. + + + + Screenshot copied to clipboard. + Το στιγμιότυπο οθόνης αντιγράφηκε στο πρόχειρο. + + + + Unable to save the screenshot to disk. + Δεν είναι δυνατή η αποθήκευση του στιγμιότυπου οθόνης στο δίσκο. + + + + Screenshot saved. + Το στιγμιότυπο οθόνης αποθηκεύτηκε. + + + + ImgUploaderTool + + + Image Uploader + Πρόγραμμα Μεταφόρτωσης Εικόνων + + + + Upload the selection + Ανεβάστε την επιλογή + + + + ImgurUploader + + Upload to Imgur + Upload to Imgur + + + Uploading Image + Μεταφόρτωση εικόνας + + + Copy URL + Αντιγραφή διεύθυνσης URL + + + Open URL + Άνοιγμα URL + + + Delete image + Delete image + + + Image to Clipboard. + Εικόνα στο Πρόχειρο. + + + + Unable to open the URL. + Δεν είναι δυνατό το άνοιγμα της διεύθυνσης URL. + + + URL copied to clipboard. + Η διεύθυνση URL αντιγράφηκε στο πρόχειρο. + + + Screenshot copied to clipboard. + Το στιγμιότυπο οθόνης αντιγράφηκε στο πρόχειρο. + + + + ImgurUploaderTool + + Image Uploader + Image Uploader + + + Upload the selection to Imgur + Upload the selection to Imgur + + + + InfoWindow + + + + About + Σχετικά με + + + + + Icon + Εικονίδιο + + + + + License + Άδεια + + + + + GPLv3+ + GPLv3+ + + + + + Version + Έκδοση + + + + + Flameshot v + Flameshot v + + + + + OS Info + Πληροφορίες Λειτουργικού Συστήματος + + + + + Copy Info + Αντιγραφή πληροφοριών + + + Right Click + Clic dret + + + Mouse Wheel + Roda del ratolí + + + Move selection 1px + Mou la selecció 1 px + + + Resize selection 1px + Redimensiona la selecció 1 px + + + Quit capture + Ix de la captura + + + Copy to clipboard + Copia al porta-retalls + + + Save selection as a file + Guarda la selecció com a fitxer + + + Undo the last modification + Desfés l'última modificació + + + Show color picker + Mostra el selector de color + + + Change the tool's thickness + Canvia el gruix de l'eina + + + Key + Tecla + + + Description + Descripció + + + <u><b>License</b></u> + <u><b>Άδεια</b></u> + + + <u><b>Version</b></u> + <u><b>Έκδοση</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Dreceres</b></u> + + + Available shortcuts in the screen capture mode. + Dreceres disponibles en el mode de captura de pantalla. + + + + InvertTool + + + Invert + Αντιστροφή + + + + Set Inverter as the paint tool + Ρυθμίστε την Αντιστροφή ως εργαλείο ζωγραφικής + + + + LineTool + + + Line + Γραμμή + + + + Set the Line as the paint tool + Ορίστε τη Γραμμή ως εργαλείο ζωγραφικής + + + + MarkerTool + + + Marker + Marker + + + + Set the Marker as the paint tool + Ορίστε το Marker ως εργαλείο ζωγραφικής + + + + MoveTool + + + Move + Μετακίνηση + + + + Move the selection area + Μετακίνηση της επιλεγμένης περιοχής + + + + PencilTool + + + Pencil + Μολύβι + + + + Set the Pencil as the paint tool + Ορίστε το Μολύβι ως εργαλείο ζωγραφικής + + + + PinTool + + + Pin Tool + Εργαλείο Καρφίτσας + + + + Pin image on the desktop + Καρφιτσώστε την εικόνα στην επιφάνεια εργασίας + + + + PinWidget + + + Context menu + Γενικό πλαίσιο μενού + + + + Copy to clipboard + Αντιγραφή στο πρόχειρο + + + + Save to file + Αποθήκευση στο αρχείο + + + + Rotate Right + + + + + Rotate Left + + + + + Increase Opacity + + + + + Decrease Opacity + + + + + Close + Κλείσιμο + + + + PixelateTool + + + Pixelate + Pixelate + + + + Set Pixelate as the paint tool. + + + + Set Pixelate as the paint tool + Ορίστε το Pixelate ως εργαλείο ζωγραφικής + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QHotkey + + Failed to register %1. Error: %2 + Απέτυχε η εγγραφή του %1. Σφάλμα: %2 + + + Failed to unregister %1. Error: %2 + Απέτυχε η κατάργηση της εγγραφής του %1. Σφάλμα: %2 + + + + QObject + + + + Capture saved to clipboard. + Η λήψη αποθηκεύτηκε στο πρόχειρο. + + + + Error while saving to clipboard + Σφάλμα κατά την αποθήκευση στο πρόχειρο + + + + Save screenshot + Αποθήκευση στιγμιότυπου οθόνης + + + + Path copied to clipboard as + Η διαδρομή αντιγράφηκε στο πρόχειρο ως + + + Saving canceled + Saving canceled + + + Save canceled + Save canceled + + + Capture is saved and copied to the clipboard as + Capture is saved and copied to the clipboard as + + + + Save Error + Αποθήκευση Σφάλματος + + + + + Capture saved as + Η λήψη αποθηκεύτηκε ως + + + + + Error trying to save as + Σφάλμα κατά την προσπάθεια αποθήκευσης ως + + + + Unable to connect via DBus + Δεν είναι δυνατή η σύνδεση μέσω DBus + + + + Powerful yet simple to use screenshot software. + Ισχυρό αλλά απλό στη χρήση λογισμικό στιγμιότυπων οθόνης. + + + + See + Δες + + + Capture the entire desktop. + Καταγράψτε ολόκληρη την επιφάνεια εργασίας. + + + + Open the capture launcher. + Ανοίξτε τον εκκινητή καταγραφής. + + + + Start a manual capture in GUI mode. + Ξεκινήστε μια χειροκίνητη λήψη σε λειτουργία GUI. + + + + Configure + Διαμορφώστε + + + Capture a single screen. + Λήψη μίας οθόνης. + + + Path where the capture will be saved + Path where the capture will be saved + + + + Capture screenshot of all monitors at the same time. + + + + + Capture a screenshot of the specified monitor. + + + + + Existing directory or new file to save to + Υπάρχων κατάλογος ή νέο αρχείο για αποθήκευση + + + + Save the capture to the clipboard + Αποθηκεύστε τη λήψη στο πρόχειρο + + + + Pin the capture to the screen + Καρφιτσώστε τη λήψη στην οθόνη + + + + Upload screenshot + Μεταφόρτωση στιγμιότυπου οθόνης + + + + Delay time in milliseconds + Χρόνος καθυστέρησης σε χιλιοστά του δευτερολέπτου + + + + Repeat screenshot with previously selected region + Επαναλάβετε το στιγμιότυπο οθόνης με την προηγουμένως επιλεγμένη περιοχή + + + + Screenshot region to select + Περιοχή στιγμιότυπου οθόνης για επιλογή + + + + Set the filename pattern + Ορίστε το μοτίβο ονόματος αρχείου + + + + Accept capture as soon as a selection is made + Αποδεχτείτε τη λήψη μόλις γίνει μια επιλογή + + + + Enable or disable the trayicon + Ενεργοποιήστε ή απενεργοποιήστε το εικονίδιο tray + + + + Enable or disable run at startup + Ενεργοποίηση ή απενεργοποίηση της εκτέλεσης κατά την εκκίνηση + + + + Enable or disable the notifications + + + + + Check the configuration for errors + Ελέγξτε τη διαμόρφωση για σφάλματα + + + + Show the help message in the capture mode + Εμφάνιση του μηνύματος βοήθειας στη λειτουργία λήψης + + + + Define the main UI color + Καθορίστε το κύριο χρώμα διεπαφής χρήστη + + + + Define the contrast UI color + Καθορίστε το χρώμα του αντίθεσης διεπαφής χρήστη + + + + Print raw PNG capture + Εκτυπώστε λήψη raw PNG + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + Εκτύπωση γεωμετρίας της επιλογής στη μορφή WxH+X+Y. Δεν κάνει τίποτα εάν έχει καθοριστεί raw + + + + Define the screen to capture (starting from 0) + Καθορίστε την οθόνη για λήψη (ξεκινώντας από το 0) + + + + Invalid delay, it must be a number greater than 0 + Μη έγκυρη καθυστέρηση, πρέπει να είναι αριθμός μεγαλύτερος από 0 + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + Μη έγκυρη περιοχή, χρησιμοποιήστε 'WxH+X+Y' ή 'όλες' ή 'οθόνη0/οθόνη1/...'. + + + + Invalid path, must be an existing directory or a new file in an existing directory + Μη έγκυρη διαδρομή, πρέπει να είναι ένας υπάρχων κατάλογος ή ένα νέο αρχείο σε έναν υπάρχοντα κατάλογο + + + Define the screen to capture + Define the screen to capture + + + + default: screen containing the cursor + προεπιλογή: οθόνη που περιέχει τον κέρσορα + + + + Screen number + Αριθμός οθόνης + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Μη έγκυρο χρώμα, αυτή η σημαία υποστηρίζει τις ακόλουθες μορφές: +- #RGB (καθένα από τα R, G και B είναι ένα μόνο εξαψήφιο) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Ονομασμένα χρώματα όπως "μπλε" ή "κόκκινο" +Ίσως χρειαστεί να ξεφύγετε από το σύμβολο "#" όπως στο "\#FFF" + + + Invalid delay, it must be higher than 0 + Invalid delay, it must be higher than 0 + + + + Invalid screen number, it must be non negative + Μη έγκυρος αριθμός οθόνης, δεν πρέπει να είναι αρνητικός + + + Invalid path, it must be a real path in the system + Invalid path, it must be a real path in the system + + + + Invalid value, it must be defined as 'true' or 'false' + Μη έγκυρη τιμή, πρέπει να οριστεί ως "true" ή "false" + + + + Error + Σφάλμα + + + + Unable to write in + Δεν είναι δυνατή η εγγραφή στο + + + + Requested screen exceeds screen count + Η ζητούμενη οθόνη υπερβαίνει τον αριθμό οθονών + + + + Full screen screenshot pinned to screen + Στιγμιότυπο πλήρης οθόνης καρφιτσώθηκε στην οθόνη + + + URL copied to clipboard. + Η διεύθυνση URL αντιγράφηκε στο πρόχειρο. + + + + Options + Επιλογές + + + Arguments + Ορίσματα + + + arguments + ορίσματα + + + + Subcommands + + + + + subcommands + + + + + Usage + Χρήση + + + + options + επιλογές + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Από προεπιλογή εκτελείται το Flameshot στο παρασκήνιο και προσθέτει ένα εικονίδιο tray για διαμόρφωση. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Γεια σας, είμαι εδώ! Κάντε κλικ στο εικονίδιο tray για να τραβήξετε ένα στιγμιότυπο οθόνης ή κάντε κλικ με το δεξί κουμπί για να δείτε περισσότερες επιλογές. + + + Toggle side panel + Toggle side panel + + + Resize selection left 1px + Resize selection left 1px + + + Resize selection right 1px + Resize selection right 1px + + + Resize selection up 1px + Resize selection up 1px + + + Resize selection down 1px + Resize selection down 1px + + + Select entire screen + Select entire screen + + + Move selection left 1px + Move selection left 1px + + + Move selection right 1px + Move selection right 1px + + + Move selection up 1px + Move selection up 1px + + + Move selection down 1px + Move selection down 1px + + + Commit text in text area + Commit text in text area + + + Delete current tool + Delete current tool + + + + Quit capture + Κλείστε την λήψη + + + + Screenshot history + Ιστορικό στιγμιότυπων οθόνης + + + + Capture screen + Καταγραφή οθόνης + + + + Show color picker + Εμφάνιση επιλογέα χρώματος + + + + Change the tool's size + Αλλάξτε το μέγεθος των εργαλείων + + + Change the tool's thickness + Αλλάξτε το πάχος του εργαλείου + + + + RectangleTool + + + Rectangle + Ορθογώνιο παραλληλόγραμμο + + + + Set the Rectangle as the paint tool + Ορίστε το Ορθογώνιο ως εργαλείο ζωγραφικής + + + + RedoTool + + + Redo + Επανάληψη + + + + Redo the next modification + Επαναλάβετε την επόμενη τροποποίηση + + + + SaveTool + + + Save + Αποθήκευση + + + + Save screenshot to a file + Αποθήκευση στιγμιότυπου οθόνης σε αρχείο + + + Save the capture + Save the capture + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Δεν είναι δυνατός ο εντοπισμός του περιβάλλοντος επιφάνειας εργασίας (GNOME; KDE; Sway; ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + Συμβουλή: δοκιμάστε να ρυθμίσετε τη μεταβλητή περιβάλλοντος XDG_CURRENT_DESKTOP. + + + + Unable to capture screen + Δεν είναι δυνατή η λήψη της οθόνης + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + Ορθογώνια Επιλογή + + + + Set Selection as the paint tool + Ορίστε την Επιλογή ως το εργαλείο ζωγραφικής + + + + SetShortcutDialog + + + Set Shortcut + Ορισμός Συντόμευσης + + + + Enter new shortcut to change + Εισαγάγετε νέα συντόμευση για αλλαγή + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Πατήστε Esc για ακύρωση ή ⌘+Backspace για να απενεργοποιήσετε τη συντόμευση πληκτρολογίου. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Πατήστε Esc για ακύρωση ή Backspace για να απενεργοποιήσετε τη συντόμευση πληκτρολογίου. + + + + + Flameshot must be restarted for changes to take effect. + Πρέπει να γίνει επανεκκίνηση του Flameshot για να τεθούν σε ισχύ οι αλλαγές. + + + + ShortcutsWidget + + + Hot Keys + Hot Keys + + + + Available shortcuts in the screen capture mode. + Διαθέσιμες συντομεύσεις στη λειτουργία λήψης οθόνης. + + + + Description + Περιγραφή + + + + Key + Πλήκτρο + + + + Left Double-click + Αριστερό Διπλό Κλικ + + + + Toggle side panel + Εναλλαγή πλαϊνού πάνελ + + + + Grab a color from the screen + + + + + Resize selection left 1px + Αλλαγή μεγέθους επιλογής αριστερά 1px + + + + Resize selection right 1px + Αλλαγή μεγέθους επιλογής δεξιά 1px + + + + Resize selection up 1px + Αλλαγή μεγέθους επιλογής έως 1px + + + + Resize selection down 1px + Αλλαγή μεγέθους επιλογής κατά 1px + + + + Symmetrically decrease width by 2px + + + + + Symmetrically increase width by 2px + + + + + Symmetrically increase height by 2px + + + + + Symmetrically decrease height by 2px + + + + + Select entire screen + Επιλέξτε ολόκληρη την οθόνη + + + + Move selection left 1px + Μετακίνηση επιλογής αριστερά 1px + + + + Move selection right 1px + Μετακίνηση επιλογής δεξιά 1px + + + + Move selection up 1px + Μετακίνηση επιλογής επάνω 1px + + + + Move selection down 1px + Μετακίνηση επιλογής κάτω 1px + + + + Commit text in text area + Δέσμευση κειμένου στην περιοχή κειμένου + + + + Delete selected drawn object + + + + + Cancel current selection + + + + Delete current tool + Διαγραφή τρέχοντος εργαλείου + + + + Capture screen + Καταγραφή οθόνης + + + + Screenshot history + Ιστορικό στιγμιότυπων οθόνης + + + + SidePanelWidget + + Active thickness: + Active thickness: + + + Active color: + Active color: + + + Press ESC to cancel + Press ESC to cancel + + + + Active tool size: + Ενεργό μέγεθος εργαλείου: + + + + Active Color: + Ενεργό Χρώμα: + + + + Grab Color + Πιάσε το Χρώμα + + + + Display grid + + + + + SizeDecreaseTool + + + Decrease Tool Size + Μείωση Μεγέθους Εργαλείου + + + + Decrease the size of the other tools + Μειώστε το μέγεθος των άλλων εργαλείων + + + + SizeIncreaseTool + + + Increase Tool Size + Αύξηση Μεγέθους Εργαλείου + + + + Increase the size of the other tools + Αυξήστε το μέγεθος των άλλων εργαλείων + + + + SizeIndicatorTool + + Selection Size Indicator + Δείκτης Μεγέθους Επιλογής + + + Show X and Y dimensions of the selection + Εμφάνιση των διαστάσεων X και Y της επιλογής + + + Show the dimensions of the selection (X Y) + Show the dimensions of the selection (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + Αιώνας (00-99) + + + + Year (00-99) + Έτος (00-99) + + + + Year (2000) + Έτος (2000) + + + + Month Name (jan) + Όνομα Μήνα (Ιαν) + + + + Month Name (january) + Όνομα Μήνα (Ιανουάριος) + + + + Month (01-12) + Μήνας (01-12) + + + + Week Day (1-7) + Ημέρα Eβδομάδας (1-7) + + + + Week (01-53) + Εβδομάδα (01-53) + + + + Day Name (mon) + Όνομα Hμέρας (Δευτ) + + + + Day Name (monday) + Όνομα Ημέρας (Δευτέρα) + + + + Day (01-31) + Ημέρα (01-31) + + + + Day of Month (1-31) + Ημέρα του Μήνα (1-31) + + + + Day (001-366) + Ημέρα (001-366) + + + + Hour (00-23) + Ώρα (00-23) + + + + Hour (01-12) + Ώρα (01-12) + + + + Minute (00-59) + Λεπτό (00-59) + + + + Second (00-59) + Δευτερόλεπτο (00-59) + + + + Full Date (%m/%d/%y) + Πλήρης Ημερομηνία (%μήνας/%μέρα/%έτος) + + + + Full Date (%Y-%m-%d) + Πλήρης Ημερομηνία (%έτος-%μήνας-%μέρα) + + + + Full Date (%d-%m-%Y) + + + + + Time (%H-%M-%S) + Ώρα (%Ω-%Λ-%Δ) + + + + Time (%H-%M) + Ώρα (%Ω-%Λ) + + + + SystemNotification + + + Flameshot Info + Πληροφορίες Flameshot + + + + TextConfig + + + StrikeOut + StrikeOut + + + + Underline + Υπογραμμίζω + + + + Bold + Έντονο + + + + Italic + Italic + + + + Left Align + Αριστερή Στοίχιση + + + + Center Align + Στοίχιση στο Κέντρο + + + + Right Align + Δεξιά Στοίχιση + + + + TextTool + + + Text + Κείμενο + + + + Add text to your capture + Προσθέστε κείμενο στη λήψη σας + + + + TrayIcon + + + &Take Screenshot + &Λήψη Στιγμιότυπου οθόνης + + + + &Open Launcher + &Άνοιγμα Εκκινητή + + + + &Configuration + &Διαμόρφωση + + + + &About + &Σχετικά με + + + + Check for updates + Έλεγχος για ενημερώσεις + + + + New version %1 is available + Η νέα έκδοση % 1 είναι διαθέσιμη + + + + &Quit + %Κλείσιμο + + + + &Latest Uploads + &Τελευταίες Μεταφορτώσεις + + + + &Open Save Path + + + + + UIcolorEditor + + UI Color Editor + Επεξεργαστής Χρωμάτων Διεπαφής χρήστη + + + + Change the color moving the selectors and see the changes in the preview buttons. + Αλλάξτε το χρώμα μετακινώντας τους επιλογείς και δείτε τις αλλαγές στα κουμπιά προεπισκόπησης. + + + + Select a Button to modify it + Επιλέξτε ένα κουμπί για να το τροποποιήσετε + + + + Main Color + Κύριο Χρώμα + + + + Click on this button to set the edition mode of the main color. + Κάντε κλικ σε αυτό το κουμπί για να ορίσετε τη λειτουργία έκδοσης του κύριου χρώματος. + + + + Contrast Color + Χρώμα Αντίθεσης + + + + Click on this button to set the edition mode of the contrast color. + Κάντε κλικ σε αυτό το κουμπί για να ορίσετε τη λειτουργία έκδοσης του χρώματος αντίθεσης. + + + + UndoTool + + + Undo + Αναίρεση + + + + Undo the last modification + Αναίρεση της τελευταίας τροποποίησης + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + Η νέα έκδοση Flameshot % 1 είναι διαθέσιμη + + + + Ignore + Αγνόησή + + + + Later + Αργότερα + + + + Update + Ενημέρωση + + + + UploadHistory + + + Upload History + Ιστορικό Mεταφόρτωσης + + + + Screenshots history is empty + Το ιστορικό στιγμιότυπων οθόνης είναι κενό + + + + UploadLineItem + + + Form + Φόρμα + + + + TextLabel + Ετικέτα Κειμένου + + + + Copy URL + Αντιγραφή διεύθυνσης URL + + + + Open In Browser + Άνοιγμα σε Πρόγραμμα περιήγησης + + + + Confirm to delete + Επιβεβαίωση για διαγραφή + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Είστε βέβαιοι ότι θέλετε να διαγράψετε ένα στιγμιότυπο οθόνης από τις πιο πρόσφατες μεταφορτώσεις και διακομιστή; + + + + UtilityPanel + + + Close + Κλείσιμο + + + + <Empty> + <Άδειο> + + + + VisualsEditor + + + Opacity of area outside selection: + Αδιαφάνεια περιοχής εκτός επιλογής: + + + + UI Color Editor + Επεξεργαστής Χρωμάτων Διεπαφής χρήστη + + + + Colorpicker Editor + Επεξεργαστής Επιλογέα Χρώματος + + + + Button Selection + Επιλογή Κουμπιού + + + + Select All + Επιλογή Όλων + + + + color_widgets::ColorDialog + + + Pick + Επιλογή + + + + color_widgets::ColorPalette + + + Unnamed + Ανώνυμο + + + + color_widgets::ColorPaletteModel + + + Unnamed + Ανώνυμο + + + + %1 (%2 colors) + % 1 (% 2 χρώματα) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + Ανοίξτε μια νέα παλέτα από το αρχείο + + + + + Create a new palette + Δημιουργήστε μια νέα παλέτα + + + + + Duplicate the current palette + Αντιγράψτε την τρέχουσα παλέτα + + + + + Delete the current palette + Διαγράψτε την τρέχουσα παλέτα + + + + + Revert changes to the current palette + Επαναφέρετε τις αλλαγές στην τρέχουσα παλέτα + + + + + Save changes to the current palette + Αποθηκεύστε τις αλλαγές στην τρέχουσα παλέτα + + + + + Add a color to the palette + Προσθέστε ένα χρώμα στην παλέτα + + + + + Remove the selected color from the palette + Αφαιρέστε το επιλεγμένο χρώμα από την παλέτα + + + + + New Palette + Νέα Παλέτα + + + + + Name + Όνομα + + + + GIMP Palettes (*.gpl) + Παλέτες GIMP (* .gpl) + + + + Palette Image (%1) + Παλέτα Εικόνας (% 1) + + + + All Files (*) + Όλα τα Αρχεία (*) + + + + + Open Palette + Ανοίξτε την Παλέτα + + + + Failed to load the palette file +%1 + Αποτυχία φόρτωσης του αρχείου παλέτας +%1 + + + + color_widgets::GradientEditor + + + Add Color + Προσθήκη Χρώματος + + + + Remove Color + Αφαιρέστε το Χρώμα + + + + Edit Color... + Επεξεργασία Χρώματος... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + % 1 (% 2 χρώματα) + + + + color_widgets::Swatch + + + Clear Color + Καθαρισμός Χρώματος + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_en.ts b/data/translations/Internationalization_en.ts new file mode 100644 index 0000000..ba0940b --- /dev/null +++ b/data/translations/Internationalization_en.ts @@ -0,0 +1,2593 @@ + + + + + AbstractWidgetList + + + Add New + + + + + Move Up + + + + + Move Down + + + + + Remove + + + + + AcceptTool + + + Accept + + + + + Accept the capture + + + + + AppLauncher + + + App Launcher + + + + + Choose an app to open the capture + + + + + AppLauncherWidget + + + Open With + + + + + Launch in terminal + + + + + Keep open after selection + + + + + + Error + + + + + Unable to write in + + + + + Unable to launch in terminal. + + + + + ArrowTool + + + Arrow + + + + + Set the Arrow as the paint tool + + + + + CaptureLauncher + + + + Capture Launcher + + + + + + TextLabel + + + + + + Capture Mode + + + + + + Area: + + + + + + Delay: + + + + + + WxH+x+y + + + + + + + seconds + + + + + + Take new screenshot + + + + + Rectangular Region + + + + + Full Screen (Current Display) + + + + + Full Screen (All Monitors) + + + + + No Delay + + + + + second + + + + + CaptureWidget + + + Unable to capture screen + + + + + Mouse + + + + + Select screenshot area + + + + + Mouse Wheel + + + + + Change tool size + + + + + Right Click + + + + + Show color picker + + + + + Open side panel + + + + + Esc + + + + + Exit + + + + + Quit Capture + + + + + Are you sure you want to quit capture? + + + + + Do not show this again + + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + + + + + Tool Settings + + + + + CircleCountTool + + + Circle Counter + + + + + Add an autoincrementing counter bubble + + + + + CircleTool + + + Circle + + + + + Set the Circle as the paint tool + + + + + ColorDialog + + + + Select Color + + + + + + Saturation + + + + + + Hue + + + + + + Hex + + + + + + Blue + + + + + + Value + + + + + + Green + + + + + + Alpha + + + + + + Red + + + + + ColorGrabWidget + + + Enter or Left Click + + + + + Accept color + + + + + Hold Left Click + + + + + Precisely select color + + + + + Space or Right Click + + + + + Toggle magnifier + + + + + Esc + + + + + Cancel + + + + + ColorPickerEditor + + + Edit Preset: + + + + + Enter color to update preset + + + + + Update + + + + + Press button to update the selected preset + + + + + Delete + + + + + Press button to delete the selected preset + + + + + Add Preset: + + + + + Enter color manually or select it using the color-wheel + + + + + Add + + + + + Press button to add preset + + + + + + Error + + + + + Unable to add preset. Maximum limit reached. + + + + + Unable to remove preset. Minimum limit reached. + + + + + ConfigErrorDetails + + + Configuration errors + + + + + ConfigHandler + + + Unrecognized setting: '%1' + + + + + + Unrecognized shortcut name: '%1'. + + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + + + + + Bad value in '%1'. Expected: %2 + + + + + + You have successfully resolved the configuration error. + + + + + The configuration contains an error. Open configuration to resolve. + + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + + + + + ConfigResolver + + + Resolve configuration errors + + + + + <b>You must resolve all errors before continuing:</b> + + + + + Reset + + + + + Reset to the default value. + + + + + Remove + + + + + Remove this setting. + + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + + + + + Resolve all + + + + + Resolve all listed errors. + + + + + Details + + + + + ConfigWindow + + + Configuration + + + + + General + + + + + Interface + + + + + Filename Editor + + + + + Shortcuts + + + + + Resolve + + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + + + + + CopyTool + + + Copy + + + + + Copy selection to clipboard + + + + + ExitTool + + + Exit + + + + + Leave the capture screen + + + + + FileNameEditor + + + Edit the name of your captures: + + + + + Edit: + + + + + Preview: + + + + + Save + + + + + Saves the pattern + + + + + Restore + + + + + Restores the saved pattern + + + + + Clear + + + + + Deletes the name + + + + + Flameshot + + + Error + + + + + Unable to close active modal widgets + + + + + URL copied to clipboard. + + + + + FlameshotDaemon + + + New version %1 is available + + + + + You have the latest version + + + + + Failed to get information about the latest version. + + + + + Unable to connect via DBus + + + + + GeneralConf + + + + Import + + + + + + + + Error + + + + + Unable to read file. + + + + + + Unable to write file. + + + + + Save File + + + + + Confirm Reset + + + + + Are you sure you want to reset the configuration? + + + + + Show help message + + + + + Show the help message at the beginning in the capture mode + + + + + Use last region for GUI mode + + + + + Use the last region as the default selection for the next screenshot in GUI mode + + + + + Show the side panel button + + + + + Show the side panel toggle button in the capture mode + + + + + Show desktop notifications + + + + + Enable desktop notifications + + + + + Show abort notifications + + + + + Enable abort notifications + + + + + Show tray icon + + + + + Show icon in the system tray + + + + + Use grim to capture screenshots + + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + + + + + Confirmation required to delete screenshot from the latest uploads + + + + + Ask for confirmation to delete screenshot from the latest uploads + + + + + Configuration File + + + + + Export + + + + + Reset + + + + + Automatic check for updates + + + + + Check for updates automatically + + + + + Allow multiple flameshot GUI instances simultaneously + + + + + This allows you to take screenshots of Flameshot itself for example + + + + + Automatically unload from memory when it is not needed + + + + + Automatically close daemon (background process) when it is not needed + + + + + Launch in background at startup + + + + + Launch Flameshot daemon (background process) when computer is booted + + + + + Show welcome message on launch + + + + + Show the welcome message box in the middle of the screen while taking a screenshot + + + + + Ask before quit capture + + + + + Show the confirmation prompt before ESC quit + + + + + Use large predefined color palette + + + + + Use a large predefined color palette + + + + + Copy on double click + + + + + Enable Copy to clipboard on Double Click + + + + + Copy URL after upload + + + + + Copy URL after uploading was successful + + + + + Save image after copy + + + + + After copying the screenshot, save it to a file as well + + + + + Save Path + + + + + Change... + + + + + Use fixed path for screenshots to save + + + + + Preferred save file extension: + + + + + Latest Uploads Max Size + + + + + Imgur Application Client ID + + + + + Undo limit + + + + + Use JPG format for clipboard (PNG default) + + + + + Use lossy JPG format for clipboard (lossless PNG default) + + + + + Copy file path after save + + + + + Copy the file path to clipboard after the file is saved + + + + + Anti-aliasing image when zoom the pinned image + + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + + + + + + Upload image without confirmation + + + + + Choose a Folder + + + + + Unable to write to directory. + + + + + Show magnifier + + + + + Enable a magnifier while selecting the screenshot area + + + + + Square shaped magnifier + + + + + Make the magnifier to be square-shaped + + + + + Milliseconds before geometry display hides; 0 means do not hide + + + + + Set geometry display timeout (ms) + + + + + Selection Geometry Display + + + + + Display Location + + + + + None + + + + + Top Left + + + + + Top Right + + + + + Bottom Left + + + + + Bottom Right + + + + + Center + + + + + Quality range of 0-100; Higher number is better quality and larger file size + + + + + JPEG Quality + + + + + Reverse arrow + + + + + Draw the arrow head first + + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + ImgUploadDialog + + + Upload Confirmation + + + + + Do you want to upload this capture? + + + + + + Upload without confirmation + + + + + ImgUploaderBase + + + Upload image + + + + + Uploading Image + + + + + Copy URL + + + + + Open URL + + + + + Delete image + + + + + Image to Clipboard. + + + + + Save image + + + + + Unable to open the URL. + + + + + URL copied to clipboard. + + + + + Screenshot copied to clipboard. + + + + + Unable to save the screenshot to disk. + + + + + Screenshot saved. + + + + + ImgUploaderTool + + + Image Uploader + + + + + Upload the selection + + + + + ImgurUploader + + + Unable to open the URL. + + + + + InfoWindow + + + + About + + + + + + Icon + + + + + + License + + + + + + GPLv3+ + + + + + + Version + + + + + + Flameshot v + + + + + + OS Info + + + + + + Copy Info + + + + + InvertTool + + + Invert + + + + + Set Inverter as the paint tool + + + + + LineTool + + + Line + + + + + Set the Line as the paint tool + + + + + MarkerTool + + + Marker + + + + + Set the Marker as the paint tool + + + + + MoveTool + + + Move + + + + + Move the selection area + + + + + PencilTool + + + Pencil + + + + + Set the Pencil as the paint tool + + + + + PinTool + + + Pin Tool + + + + + Pin image on the desktop + + + + + PinWidget + + + Context menu + + + + + Copy to clipboard + + + + + Save to file + + + + + Rotate Right + + + + + Rotate Left + + + + + Increase Opacity + + + + + Decrease Opacity + + + + + Close + + + + + PixelateTool + + + Pixelate + + + + + Set Pixelate as the paint tool. + + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QObject + + + Options + + + + + Subcommands + + + + + subcommands + + + + + Usage + + + + + options + + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + + + + + Quit capture + + + + + Screenshot history + + + + + Capture screen + + + + + Show color picker + + + + + Change the tool's size + + + + + Requested screen exceeds screen count + + + + + Full screen screenshot pinned to screen + + + + + Unable to connect via DBus + + + + + Powerful yet simple to use screenshot software. + + + + + See + + + + + Capture screenshot of all monitors at the same time. + + + + + Open the capture launcher. + + + + + Start a manual capture in GUI mode. + + + + + Configure + + + + + Capture a screenshot of the specified monitor. + + + + + Existing directory or new file to save to + + + + + Save the capture to the clipboard + + + + + Pin the capture to the screen + + + + + Upload screenshot + + + + + Delay time in milliseconds + + + + + Repeat screenshot with previously selected region + + + + + Screenshot region to select + + + + + Set the filename pattern + + + + + Accept capture as soon as a selection is made + + + + + Enable or disable the trayicon + + + + + Enable or disable run at startup + + + + + Enable or disable the notifications + + + + + Check the configuration for errors + + + + + Show the help message in the capture mode + + + + + Define the main UI color + + + + + Define the contrast UI color + + + + + Print raw PNG capture + + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + + + + + Define the screen to capture (starting from 0) + + + + + default: screen containing the cursor + + + + + Screen number + + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + + + + + Invalid delay, it must be a number greater than 0 + + + + + Invalid screen number, it must be non negative + + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + + + + + Invalid path, must be an existing directory or a new file in an existing directory + + + + + Invalid value, it must be defined as 'true' or 'false' + + + + + Error + + + + + Unable to write in + + + + + + Capture saved as + + + + + + Error trying to save as + + + + + Error while saving to clipboard + + + + + + Capture saved to clipboard. + + + + + Save screenshot + + + + + Path copied to clipboard as + + + + + Save Error + + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + + + + + RectangleTool + + + Rectangle + + + + + Set the Rectangle as the paint tool + + + + + RedoTool + + + Redo + + + + + Redo the next modification + + + + + SaveTool + + + Save + + + + + Save screenshot to a file + + + + + ScreenGrabber + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + + + + + Unable to capture screen + + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + + + + + Set Selection as the paint tool + + + + + SetShortcutDialog + + + Set Shortcut + + + + + Enter new shortcut to change + + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + + + + + + Flameshot must be restarted for changes to take effect. + + + + + ShortcutsWidget + + + Hot Keys + + + + + Available shortcuts in the screen capture mode. + + + + + Description + + + + + Key + + + + + Left Double-click + + + + + Toggle side panel + + + + + Grab a color from the screen + + + + + Resize selection left 1px + + + + + Resize selection right 1px + + + + + Resize selection up 1px + + + + + Resize selection down 1px + + + + + Symmetrically decrease width by 2px + + + + + Symmetrically increase width by 2px + + + + + Symmetrically increase height by 2px + + + + + Symmetrically decrease height by 2px + + + + + Select entire screen + + + + + Move selection left 1px + + + + + Move selection right 1px + + + + + Move selection up 1px + + + + + Move selection down 1px + + + + + Commit text in text area + + + + + Delete selected drawn object + + + + + Cancel current selection + + + + + Capture screen + + + + + Screenshot history + + + + + SidePanelWidget + + + Active tool size: + + + + + Active Color: + + + + + Grab Color + + + + + Display grid + + + + + SizeDecreaseTool + + + Decrease Tool Size + + + + + Decrease the size of the other tools + + + + + SizeIncreaseTool + + + Increase Tool Size + + + + + Increase the size of the other tools + + + + + StrftimeChooserWidget + + + Century (00-99) + + + + + Year (00-99) + + + + + Year (2000) + + + + + Month Name (jan) + + + + + Month Name (january) + + + + + Month (01-12) + + + + + Week Day (1-7) + + + + + Week (01-53) + + + + + Day Name (mon) + + + + + Day Name (monday) + + + + + Day (01-31) + + + + + Day of Month (1-31) + + + + + Day (001-366) + + + + + Time (%H-%M-%S) + + + + + Time (%H-%M) + + + + + Hour (00-23) + + + + + Hour (01-12) + + + + + Minute (00-59) + + + + + Second (00-59) + + + + + Full Date (%m/%d/%y) + + + + + Full Date (%Y-%m-%d) + + + + + Full Date (%d-%m-%Y) + + + + + SystemNotification + + + Flameshot Info + + + + + TextConfig + + + StrikeOut + + + + + Underline + + + + + Bold + + + + + Italic + + + + + Left Align + + + + + Center Align + + + + + Right Align + + + + + TextTool + + + Text + + + + + Add text to your capture + + + + + TrayIcon + + + &Take Screenshot + + + + + &Open Launcher + + + + + &Configuration + + + + + &About + + + + + Check for updates + + + + + New version %1 is available + + + + + &Quit + + + + + &Latest Uploads + + + + + &Open Save Path + + + + + UIcolorEditor + + + Change the color moving the selectors and see the changes in the preview buttons. + + + + + Select a Button to modify it + + + + + Main Color + + + + + Click on this button to set the edition mode of the main color. + + + + + Contrast Color + + + + + Click on this button to set the edition mode of the contrast color. + + + + + UndoTool + + + Undo + + + + + Undo the last modification + + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + + + + + Ignore + + + + + Later + + + + + Update + + + + + UploadHistory + + + Upload History + + + + + Screenshots history is empty + + + + + UploadLineItem + + + Form + + + + + TextLabel + + + + + Copy URL + + + + + Open In Browser + + + + + Confirm to delete + + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + + + + + UtilityPanel + + + Close + + + + + <Empty> + + + + + VisualsEditor + + + Opacity of area outside selection: + + + + + UI Color Editor + + + + + Colorpicker Editor + + + + + Button Selection + + + + + Select All + + + + + color_widgets::ColorDialog + + + Pick + + + + + color_widgets::ColorPalette + + + Unnamed + + + + + color_widgets::ColorPaletteModel + + + Unnamed + + + + + %1 (%2 colors) + + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + + + + + + Create a new palette + + + + + + Duplicate the current palette + + + + + + Delete the current palette + + + + + + Revert changes to the current palette + + + + + + Save changes to the current palette + + + + + + Add a color to the palette + + + + + + Remove the selected color from the palette + + + + + + New Palette + + + + + + Name + + + + + GIMP Palettes (*.gpl) + + + + + Palette Image (%1) + + + + + All Files (*) + + + + + + Open Palette + + + + + Failed to load the palette file +%1 + + + + + color_widgets::GradientEditor + + + Add Color + + + + + Remove Color + + + + + Edit Color... + + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + + + + + color_widgets::Swatch + + + Clear Color + + + + + %1 (%2) + + + + diff --git a/data/translations/Internationalization_es.ts b/data/translations/Internationalization_es.ts new file mode 100644 index 0000000..5d8ad4a --- /dev/null +++ b/data/translations/Internationalization_es.ts @@ -0,0 +1,3192 @@ + + + + + AbstractWidgetList + + + Add New + Añadir Nuevo + + + + Move Up + Subir + + + + Move Down + Bajar + + + + Remove + Eliminar + + + + AcceptTool + + + Accept + Aceptar + + + + Accept the capture + Aceptar la captura + + + + AppLauncher + + + App Launcher + Lanzador de Aplicaciones + + + + Choose an app to open the capture + Elige una aplicación con la que abrir la captura + + + + AppLauncherWidget + + + Open With + Abrir Con + + + + Launch in terminal + Lanzar en terminal + + + + Keep open after selection + Mantener abierto tras la selección + + + + + Error + Error + + + + Unable to write in + Imposible escribir en + + + + Unable to launch in terminal. + Imposible lanzar en terminal. + + + + ArrowTool + + + Arrow + Flecha + + + + Set the Arrow as the paint tool + Establecer la Flecha como la herramienta de dibujo + + + + BlurTool + + Blur + Desenfoque + + + Set Blur as the paint tool + Establece el Desenfoque como herramienta de dibujo + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Modo de captura</b> + + + + Rectangular Region + Región rectangular + + + + Full Screen (Current Display) + Pantalla Completa (Monitor Actual) + + + + Full Screen (All Monitors) + Pantalla Completa (Todos los monitores) + + + + No Delay + Sin demora + + + + second + segundo + + + + + + seconds + segundos + + + + + Take new screenshot + Tomar nueva captura de pantalla + + + + + Area: + Área: + + + + + Capture Launcher + Capturar Lanzador + + + + + TextLabel + Etiqueta de texto + + + + + Capture Mode + Modo de Captura + + + + + Delay: + Demora: + + + + + WxH+x+y + WxH+x+y + + + + CaptureWidget + + + Unable to capture screen + Imposible capturar la pantalla + + + + Mouse + Mouse + + + + Select screenshot area + Seleccionar área de captura de pantalla + + + + Mouse Wheel + Rueda del Ratón + + + + Change tool size + Cambiar tamaño de la herramienta + + + + Right Click + Clic Derecho + + + + Show color picker + Mostrar el selector de color + + + + Open side panel + Abrir panel lateral + + + + Esc + Esc + + + + Exit + Salir + + + + Quit Capture + + + + + Are you sure you want to quit capture? + + + + + Do not show this again + + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot ha perdido el foco. Los atajos de teclado no funcionarán a menos de que hagas clic en alguna parte. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + Error de configuración resuelto. Lanza `flameshot gui` de nuevo para aplicarlo. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Selecciona un área con el ratón, o presiona Esc para salir. +Presiona Enter para capturar la pantalla. +Presion Click Derecho para mostrar el selector de color. +Usa la rueda del ratón para cambiar el grosor de la herramienta. +Presiona Espacio para abrir el panel lateral. + + + + Tool Settings + Ajustes de herramienta + + + + CircleCountTool + + + Circle Counter + Contador Circular + + + + Add an autoincrementing counter bubble + Añadir una burbuja contadora de incremento automático + + + + CircleTool + + + Circle + Círculo + + + + Set the Circle as the paint tool + Establecer el Círculo como la herramienta de dibujo + + + + ColorDialog + + + + Select Color + Seleccionar Color + + + + + Saturation + Saturación + + + + + Hue + Tono + + + + + Hex + Hex + + + + + Blue + Azul + + + + + Value + Valor + + + + + Green + Verde + + + + + Alpha + Alfa + + + + + Red + Rojo + + + + ColorGrabWidget + + + Accept color + Aceptar color + + + + Enter or Left Click + Enter o click izquierdo + + + + Precisely select color + Seleccionar color precisamente + + + + Hold Left Click + Mantener pulsado el botón izquierdo + + + + Toggle magnifier + Alternar lupa + + + + Space or Right Click + Espacio o clic derecho + + + + Cancel + Cancelar + + + + Esc + Esc + + + + ColorPickerEditor + + Select Preset: + Seleccionar Preajuste: + + + Select preset using the spinbox + Seleccione preestablecido usando el cuadro de número + + + + Edit Preset: + Editar el preajuste: + + + + Enter color to update preset + Introduce el color para actualizar el preajuste + + + + Update + Actualizar + + + + Press button to update the selected preset + Pulsa el botón para actualizar la preselección seleccionada + + + + Delete + Borrar + + + + Press button to delete the selected preset + Presiona el botón para borrar el preajuste seleccionado + + + + Add Preset: + Añadir Preajuste: + + + + Enter color manually or select it using the color-wheel + Ingresa un color manualmente o selecciónalo utilizando la rueda de colores + + + + Add + Añadir + + + + Press button to add preset + Presiona el botón para añadir preajuste + + + + + Error + Error + + + + Unable to add preset. Maximum limit reached. + No se puede añadir el preajuste. Se ha alcanzado el límite máximo. + + + + Unable to remove preset. Minimum limit reached. + No se puede borrar el preajuste. Se ha alcanzado el límite mínimo. + + + + ConfigErrorDetails + + + Configuration errors + Errores de configuración + + + + ConfigHandler + + + Unrecognized setting: '%1' + + Ajuste no reconocido: "%1" + + + + + Unrecognized shortcut name: '%1'. + + Nombre de atajo no reconocido: "%1" + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + Conflicto de atajos: "%1" y "%2" tienen el mismo atajo: %3 + + + + + Bad value in '%1'. Expected: %2 + + Valor inadecuado en "%1". Se espera: %2 + + + + + You have successfully resolved the configuration error. + Has resuelto exitosamente el error de configuración. + + + + The configuration contains an error. Open configuration to resolve. + La configuración contiene un error. Abre la configuración para resolverlo. + + + The configuration contains an error. Falling back to default. + La configuración contiene un error. Revirtiendo a la predeterminada. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + Clave de configuración inadecuada "%1" en ConfigHandler. Por favor, reporta esto como un error. + + + + ConfigResolver + + + Resolve configuration errors + Resolver errores de configuración + + + + <b>You must resolve all errors before continuing:</b> + <b>Debes resolver todos los errores antes de continuar:</b> + + + + Reset + Reiniciar + + + + Reset to the default value. + Restablecer al valor por defecto. + + + + Remove + Eliminar + + + + Remove this setting. + Eliminar este ajuste. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + Algunos atajos de teclado tienen conflictos. +Esto NO impedirá que Flameshot inicie. +Por favor, resuélvelos manualmente en el archivo de configuración. + + + + Resolve all + Resolver todo + + + + Resolve all listed errors. + Resolver todos los errores listados. + + + + Details + Detalles + + + + ConfigWindow + + + Configuration + Configuración + + + + Interface + Interfaz + + + + Filename Editor + Editor de Nombre + + + + General + General + + + + Shortcuts + Atajos + + + + Resolve + Resolver + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>El archivo de configuración contiene errores. Resuélvelos antes de continuar.</b> + + + + Controller + + New version %1 is available + Nueva version %1 está disponible + + + You have the latest version + Tienes la última versión + + + Failed to get information about the latest version. + No se pudo obtener información sobre la última versión. + + + Error + Error + + + Unable to close active modal widgets + No se pueden cerrar los widgets modales activos + + + &Take Screenshot + &Tomar Captura de Pantalla + + + &Open Launcher + &Abrir Lanzador + + + &Configuration + &Configuración + + + &About + &Acerca de + + + Check for updates + Buscar actualizaciones + + + &Latest Uploads + &Últimas Subidas + + + URL copied to clipboard. + URL copiada al portapapeles. + + + &Information + &Información + + + &Quit + &Salir + + + + CopyTool + + + Copy + Copiar + + + + Copy selection to clipboard + Copiar selección al portapapeles + + + Copy the selection into the clipboard + Copia la selección al portapapeles + + + + DBusUtils + + Unable to connect via DBus + Imposible conectarse mediante DBus + + + + ExitTool + + + Exit + Salir + + + + Leave the capture screen + Salir de la pantalla de captura + + + + FileNameEditor + + + Edit the name of your captures: + Edita el nombre de tus capturas: + + + + Edit: + Editar: + + + + Preview: + Previsualización: + + + + Save + Guardar + + + + Saves the pattern + Guarda el patrón + + + + Restore + Restaurar + + + Reset + Reiniciar + + + + Restores the saved pattern + Restaura el patrón guardado + + + + Clear + Limpiar + + + + Deletes the name + Borra el nombre + + + + Flameshot + + + Error + Error + + + + Unable to close active modal widgets + No es posible cerrar los widgets modales activos + + + + URL copied to clipboard. + URL copiada al portapapeles. + + + + FlameshotDaemon + + + New version %1 is available + Nueva versión %1 está disponible + + + + You have the latest version + Tienes la última versión + + + + Failed to get information about the latest version. + No se pudo obtener información sobre la última versión. + + + + Unable to connect via DBus + No se puede conectar a través de DBus + + + + GeneneralConf + + Import + Importar + + + Error + Error + + + Unable to read file. + Imposible leer el archivo. + + + Unable to write file. + Imposible escribir el archivo. + + + Save File + Guardar Archivo + + + Confirm Reset + Confirmar Reset + + + Are you sure you want to reset the configuration? + ¿Estás seguro de que quieres reiniciar la configuración? + + + Show help message + Mostrar mensaje de ayuda + + + Show the help message at the beginning in the capture mode. + Muestra el mensaje de ayuda al iniciar el modo de captura. + + + Show desktop notifications + Mostrar notificaciones del escritorio + + + Show tray icon + Mostrar icono en la barra de tareas + + + Show the systemtray icon + Mostrar el icono en la barra de tareas + + + Configuration File + Archivo de Configuración + + + Export + Exportar + + + Reset + Reset + + + Launch at startup + Lanzar en el arranque + + + Launch Flameshot + Lanzar Flameshot + + + + GeneralConf + + + + Import + Importar + + + + + + + Error + Error + + + + Unable to read file. + Imposible leer el archivo. + + + + + Unable to write file. + Imposible escribir el archivo. + + + + Save File + Guardar Archivo + + + + Confirm Reset + Confirmar Reinicio + + + + Are you sure you want to reset the configuration? + ¿Estás seguro de que quieres reiniciar la configuración? + + + + Show help message + Mostrar mensaje de ayuda + + + Show the help message at the beginning in the capture mode. + Muestra el mensaje de ayuda al iniciar el modo de captura. + + + + Show the side panel button + Mostrar el botón del panel lateral + + + Show the side panel toggle button in the capture mode. + Muestra el botón de alternancia del panel lateral en el modo de captura. + + + + Show desktop notifications + Mostrar notificaciones del escritorio + + + + Show tray icon + Mostrar icono en la bandeja + + + Show the systemtray icon + Mostrar el icono en la bandeja del sistema + + + + Confirmation required to delete screenshot from the latest uploads + Se requiere confirmación para borrar la captura de pantalla de las últimas subidas + + + + Configuration File + Archivo de Configuración + + + + Export + Exportar + + + + Reset + Reiniciar + + + + Automatic check for updates + Comprobación automática de actualizaciones + + + + Allow multiple flameshot GUI instances simultaneously + Permitir múltiples instancias simultáneas del GUI de flameshot + + + This allows you to take screenshots of flameshot itself for example. + Esto te permite tomar capturas de pantalla de Flameshot mismo, por ejemplo. + + + Automatically close daemon when it is not needed + Cerrar el daemon automáticamente cuando no se lo necesita + + + Launch at startup + Lanzar en el arranque + + + Launch Flameshot + Lanzar Flameshot + + + + Show welcome message on launch + Mostrar mensaje de bienvenida en el lanzamiento + + + + Use large predefined color palette + Usar una gran paleta de colores predefinida + + + + Copy URL after upload + Copiar URL después de subir + + + Copy URL and close window after upload + Copie la URL y cierre la ventana después de la carga + + + + Save image after copy + Guardar imagen tras copia + + + Save image file after copying it + Guardar archivo de imagen luego de copiarlo + + + + Show the help message at the beginning in the capture mode + Mostrar el mensaje de ayuda al inicio en el modo de captura + + + + Use last region for GUI mode + Utilizar la última región para el modo GUI + + + + Use the last region as the default selection for the next screenshot in GUI mode + Utilizar la última región como selección por defecto para la siguiente captura de pantalla en modo GUI + + + + Show the side panel toggle button in the capture mode + Mostrar el botón de alternancia del panel lateral en el modo de captura + + + + Enable desktop notifications + Activar notificaciones de escritorio + + + + Show abort notifications + + + + + Enable abort notifications + + + + + Show icon in the system tray + Mostrar icono en la bandeja del sistema + + + + Use grim to capture screenshots + + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + + + + + Ask for confirmation to delete screenshot from the latest uploads + Pedir confirmación para eliminar las capturas de pantalla de las últimas subidas + + + + Check for updates automatically + Comprobar las actualizaciones automáticamente + + + + This allows you to take screenshots of Flameshot itself for example + Esto le permite tomar capturas de pantalla de Flameshot mismo, por ejemplo + + + Launch Flameshot daemon when computer is booted + Lanzar daemon de Flameshot al iniciar el equipo + + + + Show the welcome message box in the middle of the screen while taking a screenshot + Mostrar el cuadro de mensaje de bienvenida en el centro de la pantalla mientras se toma una captura de pantalla + + + + Use a large predefined color palette + Utilice una amplia paleta de colores predefinida + + + + Copy on double click + Copiar al hacer doble clic + + + Enable Copy on Double Click + Activar la copia con el doble clic + + + Copy URL and close window after uploading was successful + Copiar la URL y cerrar la ventana después de que la subida haya sido exitosa + + + + Automatically unload from memory when it is not needed + + + + + Automatically close daemon (background process) when it is not needed + + + + + Launch in background at startup + + + + + Launch Flameshot daemon (background process) when computer is booted + + + + + Ask before quit capture + + + + + Show the confirmation prompt before ESC quit + + + + + Enable Copy to clipboard on Double Click + + + + + Copy URL after uploading was successful + + + + + After copying the screenshot, save it to a file as well + Después de copiar la captura de pantalla, guardarla también en un archivo + + + + Save Path + Guardar Ubicación + + + + Change... + Cambiar... + + + + Use fixed path for screenshots to save + Usar ubicación fija para guardar las capturas + + + + Preferred save file extension: + Extensión de archivo preferida al guardar: + + + + Latest Uploads Max Size + Tamaño Máximo de Últimas Subidas + + + + Imgur Application Client ID + ID del cliente de la aplicación Imgur + + + + Undo limit + Límite de deshacer + + + + Use JPG format for clipboard (PNG default) + Utilizar el formato JPG para el portapapeles (PNG por defecto) + + + + Use lossy JPG format for clipboard (lossless PNG default) + + + + + Copy file path after save + Copiar ubicación del archivo después de guardar + + + + Copy the file path to clipboard after the file is saved + Copiar la ruta del archivo al portapapeles luego de guardar el archivo + + + + Anti-aliasing image when zoom the pinned image + Realizar antialiasing al hacer zoom en la imagen fijada + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + Después de ampliar la imagen fijada, debería la imagen ser suavizada o permanecer pixelada + + + + + Upload image without confirmation + Subir imagen sin confirmación + + + + Choose a Folder + Elegir una carpeta + + + + Unable to write to directory. + No se puede escribir en el directorio. + + + + Show magnifier + Mostrar lupa + + + + Enable a magnifier while selecting the screenshot area + Activar una lupa al seleccionar el área de captura de pantalla + + + + Square shaped magnifier + Lupa cuadrada + + + + Make the magnifier to be square-shaped + Hacer que la lupa tenga forma cuadrada + + + + Milliseconds before geometry display hides; 0 means do not hide + + + + + Set geometry display timeout (ms) + + + + + Selection Geometry Display + + + + + Display Location + + + + + None + + + + + Top Left + + + + + Top Right + + + + + Bottom Left + + + + + Bottom Right + + + + + Center + + + + + Quality range of 0-100; Higher number is better quality and larger file size + + + + + JPEG Quality + + + + + Reverse arrow + + + + + Draw the arrow head first + + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + Últimas Subidas + + + Screenshots history is empty + Historial de capturas vacío + + + Copy URL + Copiar URL + + + URL copied to clipboard. + URL copiada al portapapeles. + + + Open in browser + Abrir en navegador + + + Confirm to delete + Confirmar para borrar + + + Are you sure you want to delete a screenshot from the latest uploads and server? + ¿Estás seguro de que deseas borrar una captura de pantalla de las últimas subidas y el servidor? + + + + ImgS3Uploader + + Uploading Image + Subiendo Imagen + + + URL copied to clipboard. + URL copiada al portapapeles. + + + Error + Error + + + + ImgUploadDialog + + + Upload Confirmation + Confirmación de Subida + + + + Do you want to upload this capture? + ¿Deseas subir esta captura? + + + + + Upload without confirmation + Subir sin confirmación + + + + ImgUploader + + Uploading Image + Subiendo Imagen + + + Unable to open the URL. + No puede abrir la URL. + + + URL copied to clipboard. + URL copiada al portapapeles. + + + Screenshot copied to clipboard. + Captura copiada al portapapeles. + + + Copy URL + Copiar URL + + + Open URL + Abrir URL + + + Delete image + Borrar imagen + + + Image to Clipboard. + Imagen al Portapapeles. + + + + ImgUploaderBase + + + Upload image + Upload image + + + + Uploading Image + Subiendo Imagen + + + + Copy URL + Copiar URL + + + + Open URL + Abrir URL + + + + Delete image + Borrar imagen + + + + Image to Clipboard. + Imagen al Portapapeles. + + + + Save image + Guardar imagen + + + + Unable to open the URL. + No se puede abrir la URL. + + + + URL copied to clipboard. + URL copiada al portapapeles. + + + + Screenshot copied to clipboard. + Captura copiada al portapapeles. + + + + Unable to save the screenshot to disk. + No se puede guardar la captura de pantalla en el disco. + + + + Screenshot saved. + Captura de pantalla guardada. + + + + ImgUploaderTool + + + Image Uploader + Cargador de Imágenes + + + + Upload the selection + Subir la selección + + + + ImgurUploader + + Upload to Imgur + Subir a Imgur + + + Uploading Image + Subiendo Imagen + + + Copy URL + Copiar URL + + + Open URL + Abrir URL + + + Delete image + Borrar imagen + + + Image to Clipboard. + Imagen al Portapapeles. + + + + Unable to open the URL. + No se puede abrir la URL. + + + URL copied to clipboard. + URL copiada al portapapeles. + + + Screenshot copied to clipboard. + Captura copiada al portapapeles. + + + + ImgurUploaderTool + + Image Uploader + Subir Imagen + + + Upload the selection to Imgur + Sube la selección a Imgur + + + + InfoWindow + + + + About + Información + + + + + Icon + Ícono + + + + + License + Licencia + + + + + GPLv3+ + GPLv3+ + + + + + Version + Versión + + + + + Flameshot v + Flameshot v + + + + + OS Info + Información del sistema operativo + + + + + Copy Info + Copiar Información + + + Right Click + Click Derecho + + + Mouse Wheel + Rueda del Ratón + + + Move selection 1px + Mover la selección 1px + + + Resize selection 1px + Redimensionar la selección 1px + + + Quit capture + Salir de la captura + + + Copy to clipboard + Copiar al portapapeles + + + Save selection as a file + Guardar la selección como un archivo + + + Undo the last modification + Deshacer la última modificación + + + Toggle visibility of sidebar with options of the selected tool + Alternar la visualización de la barra lateral de opciones de la herramienta seleccionada + + + Show color picker + Mostrar el selector de color + + + Change the tool's thickness + Cambiar el grosor de la herramienta + + + Available shortcuts in the screen capture mode. + Atajos disponibles en el modo captura de pantalla. + + + Key + Tecla + + + Description + Descripción + + + <u><b>License</b></u> + <u><b>Licencia</b></u> + + + <u><b>Version</b></u> + <u><b>Versión</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Atajos</b></u> + + + + InvertTool + + + Invert + Invertir + + + + Set Inverter as the paint tool + Establecer el Inversor como la herramienta de dibujo + + + + LineTool + + + Line + Línea + + + + Set the Line as the paint tool + Establecer la Línea como la herramienta de dibujo + + + + MarkerTool + + + Marker + Marcador + + + + Set the Marker as the paint tool + Establecer el Marcador como la herramienta de dibujo + + + + MoveTool + + + Move + Mover + + + + Move the selection area + Mover el área seleccionada + + + + PencilTool + + + Pencil + Lápiz + + + + Set the Pencil as the paint tool + Establecer el Lápiz como la herramienta de dibujo + + + + PinTool + + + Pin Tool + Chincheta + + + + Pin image on the desktop + Fijar imagen en el escritorio + + + + PinWidget + + + Context menu + Context menu + + + + Copy to clipboard + Copiar al portapapeles + + + + Save to file + Guardar en un archivo + + + + Rotate Right + + + + + Rotate Left + + + + + Increase Opacity + + + + + Decrease Opacity + + + + + Close + Cerrar + + + + PixelateTool + + + Pixelate + Pixelar + + + + Set Pixelate as the paint tool. + + + + Set Pixelate as the paint tool + Establecer Pixelar como la herramienta de pintura + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QHotkey + + Failed to register %1. Error: %2 + Falla al registrar %1. Error: %2 + + + Failed to unregister %1. Error: %2 + Falla al desregistrar %1. Error: %2 + + + + QObject + + + Save Error + Error al Guardar + + + + + Capture saved as + Captura guardada como + + + + + Capture saved to clipboard. + Captura guardada en el portapapeles. + + + Capture saved to clipboard + Captura guardada en el portapapeles + + + + Error while saving to clipboard + Error al guardar en el portapapeles + + + + + Error trying to save as + Error intentando guardar como + + + + Save screenshot + Guardar captura de pantalla + + + + Path copied to clipboard as + Ruta copiada al portapapeles como + + + Saving canceled + Saving canceled + + + Save canceled + Save canceled + + + Capture is saved and copied to the clipboard as + Capture is saved and copied to the clipboard as + + + + Unable to connect via DBus + Imposible conectar mediante DBus + + + + Powerful yet simple to use screenshot software. + Software de captura de pantalla poderoso pero sencillo de usar. + + + + See + Ver + + + Capture the entire desktop. + Capturar el escritorio completo. + + + + Open the capture launcher. + Abrir el lanzador de capturas. + + + + Start a manual capture in GUI mode. + Iniciar una captura manual en el modo GUI. + + + + Configure + Configurar + + + Capture a single screen. + Capturar una sola pantalla. + + + Path where the capture will be saved + Path where the capture will be saved + + + + Capture screenshot of all monitors at the same time. + + + + + Capture a screenshot of the specified monitor. + + + + + Existing directory or new file to save to + Directorio existente o nuevo archivo en el que guardar + + + + Save the capture to the clipboard + Guarda la captura en el portapapeles + + + + Pin the capture to the screen + Fija la captura a la pantalla + + + + Upload screenshot + Upload screenshot + + + + Delay time in milliseconds + Duración de demora en milisegundos + + + + Repeat screenshot with previously selected region + Repetir la captura de pantalla con la región previamente seleccionada + + + + Screenshot region to select + Región de captura de pantalla a seleccionar + + + + Set the filename pattern + Establecer el patrón de nombre de archivo + + + + Accept capture as soon as a selection is made + Aceptar captura en cuanto se haga una selección + + + + Enable or disable the trayicon + Activar o desactivar el icono de la bandeja + + + + Enable or disable run at startup + Activar o desactivar la ejecución al inicio + + + + Enable or disable the notifications + + + + + Check the configuration for errors + Comprobar si hay errores en la configuración + + + + Show the help message in the capture mode + Mostrar el mensaje de ayuda en el modo de captura + + + + Define the main UI color + Definir el color principal de la interfaz de usuario + + + + Define the contrast UI color + Definir el color de contraste de la interfaz de usuario + + + + Print raw PNG capture + Imprimir la captura PNG sin procesar + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + Imprimir geometría de la selección en el formato WxH+X+Y. No hace nada si se especifica que no se procese + + + + Define the screen to capture (starting from 0) + Definir la pantalla a capturar (empezando por 0) + + + + Invalid delay, it must be a number greater than 0 + Demora inválida, debe ser un valor mayor a 0 + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + Región inválida, utiliza "WxH+X+Y" o "todo" o "pantalla0/pantalla1/...". + + + + Invalid path, must be an existing directory or a new file in an existing directory + Ruta inválida, debe ser un directorio existente o un nuevo archivo en un directorio existente + + + Define the screen to capture + Define the screen to capture + + + + default: screen containing the cursor + por defecto: pantalla que contiene el cursor + + + + Screen number + Screen number + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Color inválido, este flag soporta los siguientes formatos: +- #RGB (cada uno de R, G y B es un solo dígito hexadecimal) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Colores con nombre, como "azul" o "rojo" +Puede ser que necesites preceder el símbolo "#" con "\", como en "\#FFF" + + + Invalid delay, it must be higher than 0 + Invalid delay, it must be higher than 0 + + + + Invalid screen number, it must be non negative + Número de pantalla inválido, no debe ser negativo + + + Invalid path, it must be a real path in the system + Invalid path, it must be a real path in the system + + + + Invalid value, it must be defined as 'true' or 'false' + Valor inválido, debe ser definido como "verdadero" o "falso" + + + + Error + Error + + + + Unable to write in + Imposible escribir en + + + + Requested screen exceeds screen count + La pantalla solicitada supera el número de pantallas + + + + Full screen screenshot pinned to screen + Captura de pantalla completa fijada a la pantalla + + + URL copied to clipboard. + URL copiada al portapapeles. + + + + Options + Options + + + Arguments + Argumentos + + + arguments + argumentos + + + + Subcommands + + + + + subcommands + + + + + Usage + Uso + + + + options + options + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Por defecto, Flameshot se ejecuta en segundo plano y añade un icono en la bandeja para su configuración. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + ¡Hola, estoy aquí! Haz clic en el icono en la bandeja para tomar una captura de pantalla o clic derecho para ver más opciones. + + + Toggle side panel + Toggle side panel + + + Resize selection left 1px + Resize selection left 1px + + + Resize selection right 1px + Resize selection right 1px + + + Resize selection up 1px + Resize selection up 1px + + + Resize selection down 1px + Resize selection down 1px + + + Select entire screen + Select entire screen + + + Move selection left 1px + Move selection left 1px + + + Move selection right 1px + Move selection right 1px + + + Move selection up 1px + Move selection up 1px + + + Move selection down 1px + Move selection down 1px + + + Commit text in text area + Commit text in text area + + + Delete current tool + Delete current tool + + + + Quit capture + Salir de la captura + + + + Screenshot history + Historial de capturas de pantalla + + + + Capture screen + Capturar pantalla + + + + Show color picker + Mostrar el selector de color + + + + Change the tool's size + Cambiar el tamaño de la herramienta + + + Change the tool's thickness + Cambiar el grosor de la herramienta + + + + RectangleTool + + + Rectangle + Rectángulo + + + + Set the Rectangle as the paint tool + Establecer el Rectángulo como la herramienta de dibujo + + + + RedoTool + + + Redo + Rehacer + + + + Redo the next modification + Rehacer la siguiente modificación + + + + SaveTool + + + Save + Guardar + + + + Save screenshot to a file + Guardar captura de pantalla en un archivo + + + Save the capture + Guardar la captura + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + No se puede detectar el entorno de escritorio (¿GNOME? ¿KDE? ¿Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + Sugerencia: intenta configurar la variable del entorno XDG_CURRENT_DESKTOP. + + + + Unable to capture screen + Imposible capturar la pantalla + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + Selección Rectangular + + + + Set Selection as the paint tool + Establecer Selección como la herramienta de dibujo + + + + SetShortcutDialog + + + Set Shortcut + Establecer Atajo + + + + Enter new shortcut to change + Introduce un nuevo atajo para cambiar este + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Presiona Esc para cancelar o ⌘+Retroceso para desactivar el atajo de teclado. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Presiona Esc para cancelar o Retroceso para desactivar el atajo de teclado. + + + + + Flameshot must be restarted for changes to take effect. + Flameshot debe ser reiniciado para que los cambios tengan efecto. + + + + ShortcutsWidget + + + Hot Keys + Teclas de Acceso Rápido + + + + Available shortcuts in the screen capture mode. + Atajos disponibles en el modo captura de pantalla. + + + + Description + Descripción + + + + Key + Tecla + + + + Left Double-click + Doble clic izquierdo + + + + Toggle side panel + Alternar panel lateral + + + + Grab a color from the screen + + + + + Resize selection left 1px + Cambiar el tamaño de la selección a la izquierda 1px + + + + Resize selection right 1px + Redimensionar selección hacia la derecha 1px + + + + Resize selection up 1px + Redimensionar selección hacia arriba 1px + + + + Resize selection down 1px + Redimensionar selección hacia abajo 1px + + + + Symmetrically decrease width by 2px + + + + + Symmetrically increase width by 2px + + + + + Symmetrically increase height by 2px + + + + + Symmetrically decrease height by 2px + + + + + Select entire screen + Seleccionar toda la pantalla + + + + Move selection left 1px + Mover selección a la izquierda 1px + + + + Move selection right 1px + Mover selección a la derecha 1px + + + + Move selection up 1px + Mueve la selección 1px hacia arriba + + + + Move selection down 1px + Mover selección hacia abajo 1px + + + + Commit text in text area + Confirmar texto en el área de texto + + + + Delete selected drawn object + + + + + Cancel current selection + + + + Delete current tool + Eliminar herramienta actual + + + + Capture screen + Capturar pantalla + + + + Screenshot history + Historial de capturas de pantalla + + + + SidePanelWidget + + Active thickness: + Espesor activo: + + + Active color: + Color activo: + + + Press ESC to cancel + Presiona ESC para cancelar + + + + Active tool size: + Tamaño de la herramienta activa: + + + + Active Color: + Active Color: + + + + Grab Color + Tomar Color + + + + Display grid + + + + + SizeDecreaseTool + + + Decrease Tool Size + Disminuir el Tamaño de la Herramienta + + + + Decrease the size of the other tools + Disminuir el tamaño de las otras herramientas + + + + SizeIncreaseTool + + + Increase Tool Size + Aumentar el Tamaño de la Herramienta + + + + Increase the size of the other tools + Aumentar el tamaño de las otras herramientas + + + + SizeIndicatorTool + + Selection Size Indicator + Indicador de Tamaño de Selección + + + Show X and Y dimensions of the selection + Mostrar las dimensiones X e Y de la selección + + + Show the dimensions of the selection (X Y) + Muestra la dimensión de la selección (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + Siglo (00-99) + + + + Year (00-99) + Año (00-99) + + + + Year (2000) + Año (2000) + + + + Month Name (jan) + Nombre del Mes (jul) + + + + Month Name (january) + Nombre del Mes (julio) + + + + Month (01-12) + Mes (01-12) + + + + Week Day (1-7) + Día de la Semana (1-7) + + + + Week (01-53) + Semana (01-53) + + + + Day Name (mon) + Nombre del Día (dom) + + + + Day Name (monday) + Nombre del Día (domingo) + + + + Day (01-31) + Día (01-31) + + + + Day of Month (1-31) + Día del Mes (1-31) + + + + Day (001-366) + Día (001-366) + + + + Time (%H-%M-%S) + Tiempo (%H-%M-%S) + + + + Time (%H-%M) + Tiempo (%H-%M) + + + + Hour (00-23) + Hora (00-23) + + + + Hour (01-12) + Hora (01-12) + + + + Minute (00-59) + Minuto (00-59) + + + + Second (00-59) + Segundo (00-59) + + + + Full Date (%m/%d/%y) + Fecha (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + Fecha (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + + + + + SystemNotification + + + Flameshot Info + Información de Flameshot + + + + TextConfig + + + StrikeOut + Tachado + + + + Underline + Subrayado + + + + Bold + Negrita + + + + Italic + Cursiva + + + + Left Align + Alinear a la Izquierda + + + + Center Align + Alinear al Centro + + + + Right Align + Alinear a la Derecha + + + + TextTool + + + Text + Texto + + + + Add text to your capture + Agregar texto a la captura + + + + TrayIcon + + + &Take Screenshot + &Capturar Pantalla + + + + &Open Launcher + &Abrir Lanzador + + + + &Configuration + &Configuración + + + + &About + &Acerca de + + + + Check for updates + Buscar actualizaciones + + + + New version %1 is available + Nueva versión %1 está disponible + + + + &Quit + &Salir + + + + &Latest Uploads + &Últimas Cargas + + + + &Open Save Path + + + + + UIcolorEditor + + UI Color Editor + Editor de Color de Interfaz + + + + Change the color moving the selectors and see the changes in the preview buttons. + Cambia el color moviendo los selectores y observa los cambios en los botones de previsualización. + + + + Select a Button to modify it + Selecciona un Botón para modificarlo + + + + Main Color + Color Principal + + + + Click on this button to set the edition mode of the main color. + Clica en este botón para aplicar el modo edición para el color primario. + + + + Contrast Color + Color de Contraste + + + + Click on this button to set the edition mode of the contrast color. + Clica en este botón para aplicar el modo edición para el color de contraste. + + + + UndoTool + + + Undo + Deshacer + + + + Undo the last modification + Borra la última modificación + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + Nueva versión %1 de Flameshot está disponible + + + + Ignore + Ignorar + + + + Later + Luego + + + + Update + Actualizar + + + + UploadHistory + + + Upload History + Subir Historial + + + + Screenshots history is empty + El historial de capturas está vacío + + + + UploadLineItem + + + Form + Forma + + + + TextLabel + Etiqueta de texto + + + + Copy URL + Copiar URL + + + + Open In Browser + Abrir en Navegador + + + + Confirm to delete + Confirmar la eliminación + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + ¿Estás seguro de que deseas borrar una captura de pantalla de las últimas subidas y el servidor? + + + + UtilityPanel + + + Close + Cerrar + + + + <Empty> + <Empty> + + + + VisualsEditor + + + Opacity of area outside selection: + Opacidad del area fuera de la selección: + + + + UI Color Editor + Editor de Color de la Interfaz + + + + Colorpicker Editor + Editor del Selector de Color + + + + Button Selection + Selección de Botón + + + + Select All + Seleccionar Todos + + + + color_widgets::ColorDialog + + + Pick + Elegir + + + + color_widgets::ColorPalette + + + Unnamed + Sin Nombre + + + + color_widgets::ColorPaletteModel + + + Unnamed + Sin Nombre + + + + %1 (%2 colors) + %1 (%2 colores) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + Abrir una nueva paleta desde un archivo + + + + + Create a new palette + Crear una nueva paleta + + + + + Duplicate the current palette + Duplicar la paleta actual + + + + + Delete the current palette + Borrar la paleta actual + + + + + Revert changes to the current palette + Revertir cambios a la paleta actual + + + + + Save changes to the current palette + Guardar cambios a la paleta actual + + + + + Add a color to the palette + Añadir un color a la paleta + + + + + Remove the selected color from the palette + Eliminar el color seleccionado de la paleta + + + + + New Palette + Nueva Paleta + + + + + Name + Name + + + + GIMP Palettes (*.gpl) + Paletas de GIMP(*.gpl) + + + + Palette Image (%1) + Imagen de paleta (%1) + + + + All Files (*) + Todos los Archivos (*) + + + + + Open Palette + Abrir Paleta + + + + Failed to load the palette file +%1 + No se pudo cargar el archivo de paleta +%1 + + + + color_widgets::GradientEditor + + + Add Color + Add Color + + + + Remove Color + Eliminar color + + + + Edit Color... + Editar Color... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 colores) + + + + color_widgets::Swatch + + + Clear Color + Quitar Color + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_et.ts b/data/translations/Internationalization_et.ts new file mode 100644 index 0000000..dc01abf --- /dev/null +++ b/data/translations/Internationalization_et.ts @@ -0,0 +1,3156 @@ + + + + + AbstractWidgetList + + + Add New + Lisa uus + + + + Move Up + Liiguta ülespoole + + + + Move Down + Liiguta allapoole + + + + Remove + Eemalda + + + + AcceptTool + + + Accept + Nõustu + + + + Accept the capture + Nõustu ekraanitõmmisega + + + + AppLauncher + + + App Launcher + Rakenduse käivitaja + + + + Choose an app to open the capture + Vali rakendus, millega ekraanitõmmis avatakse + + + + AppLauncherWidget + + + Open With + Ava rakendusega + + + + Launch in terminal + Käivita terminalis + + + + Keep open after selection + Peale valimist jäta avatuks + + + + + Error + Viga + + + + Unable to launch in terminal. + Terminalis käivitamine ei õnnestu. + + + + Unable to write in + Faili kirjutamine ei õnnestu + + + + ArrowTool + + + Arrow + Nool + + + + Set the Arrow as the paint tool + + + + + BlurTool + + Blur + Desenfocament + + + Set Blur as the paint tool + Estableix el desenfocament com a eina de dibuix + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Mode de captura</b> + + + + Rectangular Region + Ristkülikukujuline ala + + + + Full Screen (Current Display) + Terve ekraan (hetkel aktiivne monitor) + + + + Full Screen (All Monitors) + Terve ekraan (kõik monitorid) + + + + No Delay + Ilma viivituseta + + + + second + sekund + + + + + + seconds + sekundit + + + + + Take new screenshot + Tee uus ekraanitõmmis + + + + + Area: + Ala: + + + + + Capture Launcher + Ekraanitõmmise käivitaja + + + + + TextLabel + Tekstisilt + + + + + Capture Mode + Ekraanitõmmise tegemise viis + + + + + Delay: + Viivitus: + + + + + WxH+x+y + LxK+x+y + + + + CaptureWidget + + + Unable to capture screen + Impossible capturar la pantalla + Ekraanitõmmise tegemine ei õnnestu + + + + Mouse + Hiir + + + + Select screenshot area + Vali ekraanitõmmise ala + + + + Mouse Wheel + Hiire ratas + + + + Change tool size + Muuda tarviku suurust + + + + Right Click + Parem hiireklõps + + + + Show color picker + Näita värvivalijat + + + + Open side panel + Ava külgriba + + + + Esc + Esc + + + + Exit + Välju + + + + Quit Capture + Lõpeta ekraanitõmmistamine + + + + Are you sure you want to quit capture? + Kas soovid lõpetada ekraanitõmmise tegemise? + + + + Do not show this again + Ära näita seda teadet uuesti + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot on kaotanud fookuse. Klaviatuuri kiirklahvid ei toimi enne, kui oled kuhugile klõpsinud. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Escolliu una àrea amb el ratolí, o premeu Esc per sortir. +Premeu Entrar per capturar la pantalla. +Premeu clic dret per mostrar l'eina de selecció de color. +Gireu la rodeta del ratolí per canviar el gruix de l'eina de dibuix. +Premeu Espai per obrir el calaix lateral. + + + + Tool Settings + Tarviku seadistused + + + + CircleCountTool + + + Circle Counter + + + + + Add an autoincrementing counter bubble + + + + + CircleTool + + + Circle + + + + + Set the Circle as the paint tool + + + + + ColorDialog + + + + Select Color + Vali värv + + + + + Saturation + Värviküllastus + + + + + Hue + Värvitoon + + + + + Hex + 16nd-süsteemis värvikood + + + + + Blue + Sinine + + + + + Value + Väärtus + + + + + Green + Roheline + + + + + Alpha + Alfa-läbipaistvus + + + + + Red + Punane + + + + ColorGrabWidget + + + Accept color + Nõustu värviga + + + + Enter or Left Click + Vajuta sisestusklahvi või klõpsa hiire vasakut nuppu + + + + Precisely select color + Vali täpne värv + + + + Hold Left Click + Hoia hiire vasakut klahvi all + + + + Toggle magnifier + Lülita luup sisse/välja + + + + Space or Right Click + + + + + Cancel + + + + + Esc + Esc + + + + ColorPickerEditor + + + Edit Preset: + Muuda eelseadistust: + + + + Enter color to update preset + Eelseadistuse muutmiseks sisesta sobilik värv + + + + Update + Uuenda + + + + Press button to update the selected preset + + + + + Delete + + + + + Press button to delete the selected preset + + + + + Add Preset: + Lisa eelseadistus: + + + + Enter color manually or select it using the color-wheel + Sisesta värvinumber käsitsi või vali ta värvirattast + + + + Add + Lisa + + + + Press button to add preset + Eelseadistuse lisamiseks klõpsi nuppu + + + + + Error + Viga + + + + Unable to add preset. Maximum limit reached. + Eelseadistuse lisamine ei õnnestu. Variantide arvu ülempiir on käes. + + + + Unable to remove preset. Minimum limit reached. + Eelseadistuse eemaldamine ei õnnestu. Variantide arvu alampiir on käes. + + + + ConfigErrorDetails + + + Configuration errors + Seadistusvead + + + + ConfigHandler + + + Unrecognized setting: '%1' + + + + + + Unrecognized shortcut name: '%1'. + + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + + + + + Bad value in '%1'. Expected: %2 + + + + + + You have successfully resolved the configuration error. + + + + + The configuration contains an error. Open configuration to resolve. + + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + + + + + ConfigResolver + + + Resolve configuration errors + + + + + <b>You must resolve all errors before continuing:</b> + + + + + Reset + + + + + Reset to the default value. + + + + + Remove + Eemalda + + + + Remove this setting. + + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + + + + + Resolve all + + + + + Resolve all listed errors. + + + + + Details + Üksikasjad + + + + ConfigWindow + + + Configuration + Seadistused + + + + Interface + Kasutajaliides + + + + Filename Editor + Failinimede muster + + + + General + Üldseadistused + + + + Shortcuts + Kiirklahvid + + + + Resolve + Lahenda + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>Seadistuste failis on vigu. Enne jätkamist palun lahenda nad.</b> + + + + Controller + + New version %1 is available + La nova versió %1 ja és disponible + + + You have the latest version + Teniu la versió més recent + + + Failed to get information about the latest version. + Error a l'intentar obtenir informació sobre actualitzacions. + + + Error + Error + + + Unable to close active modal widgets + No s'han pogut tancar els widgets modals actius + + + &Open Launcher + &Obre el llançador d'aplicacions + + + &Configuration + &Ajustaments + + + &About + &Quant a + + + Check for updates + Comprova si hi ha actualitzacions disponibles + + + &Latest Uploads + &Últimes càrregues + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + &Information + &Informació + + + &Quit + &Surt + + + &Take Screenshot + &Captura + + + + CopyTool + + + Copy + Kopeeri + + + + Copy selection to clipboard + Kopeeri valik lõikelauale + + + Copy the selection into the clipboard + Copia la selecció al porta-retalls + + + + DBusUtils + + Unable to connect via DBus + No s'ha pogut connectar mitjançant DBus + + + + ExitTool + + + Exit + Välju + + + + Leave the capture screen + Välju ekraanitõmmise tegemise vaatest + + + + FileNameEditor + + + Edit the name of your captures: + Määratle ekraanitõmmiste nimi: + + + + Edit: + Muuda: + + + + Preview: + Eelvaade: + + + + Save + Salvesta + + + + Saves the pattern + Salvestab valitud mustri + + + + Restore + Taasta + + + Reset + Reinicialitza + + + + Restores the saved pattern + Taastab valitud mustri + + + + Clear + Tühjenda + + + + Deletes the name + Kustutab antud nimemustri + + + + Flameshot + + + Error + Viga + + + + Unable to close active modal widgets + Aktiivseid modaalseid vidinaid ei õnnestu sulgeda + + + + URL copied to clipboard. + Võrguaadress on kopeeritud lõikelauale. + + + + FlameshotDaemon + + + New version %1 is available + Uus versioon %1 on saadaval + + + + You have the latest version + Sul on kasutusel viimane versioon + + + + Failed to get information about the latest version. + Viimase versiooni teabe laadimine ei õnnestunud. + + + + Unable to connect via DBus + No s'ha pogut connectar mitjançant DBus + + + + GeneneralConf + + Show help message + Mostra el missatge d'ajuda + + + Show the help message at the beginning in the capture mode. + Mostra el missatge d'ajuda en iniciar el mode de captura. + + + Show desktop notifications + Mostra les notificacions d'escriptori + + + Show tray icon + Mostra la icona en la barra de tasques + + + Show the systemtray icon + Mostra la icona en la barra de tasques + + + Import + Importar + + + Error + Error + + + Unable to read file. + Impossible llegir el fitxer. + + + Unable to write file. + Impossible escriure al fitxer. + + + Save File + Guardar Arxiu + + + Confirm Reset + Confirmar Reset + + + Are you sure you want to reset the configuration? + Esteu segur que voleu reiniciar la configuració? + + + Configuration File + Fitxer de Configuració + + + Export + Exportar + + + Reset + Reset + + + Launch at startup + Llançament a l'inici + + + + GeneralConf + + + + Import + Impordi + + + + + + + Error + Viga + + + + Unable to read file. + Faili lugemine ei õnnestu. + + + + + Unable to write file. + Faili salvestamine ei õnnestu. + + + + Save File + Salvesta fail + + + + Confirm Reset + Confirmar Reset + + + + Are you sure you want to reset the configuration? + Esteu segur que voleu reiniciar la configuració? + + + + Show help message + Näita abiteavet + + + Show the help message at the beginning in the capture mode. + Mostra el missatge d'ajuda en iniciar el mode de captura. + + + + Show the side panel button + Näita külgriba nuppu + + + Show the side panel toggle button in the capture mode. + Mostra el botó del calaix lateral en el mode de captura. + + + + Show desktop notifications + Näita töölaua teavitusi + + + + Show tray icon + Näita süsteemisalve ikooni + + + Show the systemtray icon + Mostra la icona a la barra de tasques del sistema + + + + Confirmation required to delete screenshot from the latest uploads + + + + + Configuration File + Fitxer de Configuració + + + + Export + Exportar + + + + Reset + + + + + Automatic check for updates + + + + + Allow multiple flameshot GUI instances simultaneously + + + + This allows you to take screenshots of flameshot itself for example. + This allows you to take screenshots of flameshot itself for example. + + + Automatically close daemon when it is not needed + Automatically close daemon when it is not needed + + + Launch at startup + Llança a l'inici + + + Launch Flameshot + Inicia el Flameshot + + + + Show welcome message on launch + + + + + Use large predefined color palette + + + + + Copy URL after upload + + + + Copy URL and close window after upload + Copia la URL i tanca la finestra després de la càrrega + + + + Save image after copy + Peale kopeerimist salvesta pilt + + + Save image file after copying it + Desa el fitxer d'imatge després d'haver-lo copiat + + + + Show the help message at the beginning in the capture mode + + + + + Use last region for GUI mode + Graafilise kasutajaliidese režiimis kasuta viimast valitud ala + + + + Use the last region as the default selection for the next screenshot in GUI mode + Graafilise kasutajaliidese režiimis kasuta järgmise ekraanitõmmise jaoks vaikimisi valikuna viimast valitud ala + + + + Show the side panel toggle button in the capture mode + + + + + Enable desktop notifications + + + + + Show abort notifications + + + + + Enable abort notifications + + + + + Show icon in the system tray + + + + + Use grim to capture screenshots + + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + + + + + Ask for confirmation to delete screenshot from the latest uploads + + + + + Check for updates automatically + + + + + This allows you to take screenshots of Flameshot itself for example + + + + Launch Flameshot daemon when computer is booted + Launch Flameshot daemon when computer is booted + + + + Show the welcome message box in the middle of the screen while taking a screenshot + + + + + Use a large predefined color palette + + + + + Copy on double click + + + + Enable Copy on Double Click + Enable Copy on Double Click + + + Copy URL and close window after uploading was successful + Copy URL and close window after uploading was successful + + + + Automatically unload from memory when it is not needed + + + + + Automatically close daemon (background process) when it is not needed + + + + + Launch in background at startup + + + + + Launch Flameshot daemon (background process) when computer is booted + + + + + Ask before quit capture + Enne ekraanitõmmistamise lõpetamist küsi kinnitust + + + + Show the confirmation prompt before ESC quit + Küsi kinnitust enne Escape-nupuga ekraanitõmmise tegemise lõpetamist + + + + Enable Copy to clipboard on Double Click + + + + + Copy URL after uploading was successful + + + + + After copying the screenshot, save it to a file as well + + + + + Save Path + Salvestuse asukoht + + + + Change... + Muuda... + + + + Use fixed path for screenshots to save + Kasuta ekraanitõmmiste salvestamiseks määratud asukohta + + + + Preferred save file extension: + Salvestatava faili eelistatud laiend: + + + + Latest Uploads Max Size + Viimaste üleslaadimiste loendi pikkuse ülempiir + + + + Imgur Application Client ID + Imgur'i rakenduse klienditunnus + + + + Undo limit + Tagasivõtmissammude ülempiir + + + + Use JPG format for clipboard (PNG default) + Kasuta lõikelaua jaoks JPG-vormingut (vaikimisi on kasutusel PNG-vorming) + + + + Use lossy JPG format for clipboard (lossless PNG default) + Kasuta lõikelaua jaoks kadudega JPG-vormingut (vaikimisi on kasutusel kadudeta PNG-vorming) + + + + Copy file path after save + Peale salvestamist kopeeri faili asukoht + + + + Copy the file path to clipboard after the file is saved + Peale faili salvestamist kopeeri tema asukoht lõikelauale + + + + Anti-aliasing image when zoom the pinned image + + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + + + + + + Upload image without confirmation + + + + + Choose a Folder + + + + + Unable to write to directory. + + + + + Show magnifier + + + + + Enable a magnifier while selecting the screenshot area + + + + + Square shaped magnifier + + + + + Make the magnifier to be square-shaped + + + + + Milliseconds before geometry display hides; 0 means do not hide + + + + + Set geometry display timeout (ms) + + + + + Selection Geometry Display + + + + + Display Location + + + + + None + + + + + Top Left + + + + + Top Right + + + + + Bottom Left + + + + + Bottom Right + + + + + Center + + + + + Quality range of 0-100; Higher number is better quality and larger file size + + + + + JPEG Quality + + + + + Reverse arrow + + + + + Draw the arrow head first + + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + Últimes càrregues + + + Screenshots history is empty + L'historial de captures de pantalla és buit + + + Copy URL + Copia l'URL + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Open in browser + Obre al navegador + + + Confirm to delete + Confirmeu per esborrar + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Esteu segur de voler esborrar la captura de les últimes càrregues i del servidor? + + + + ImgS3Uploader + + Uploading Image + S'està pujant la imatge + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Error + Error + + + + ImgUploadDialog + + + Upload Confirmation + Üleslaadimise kinnitus + + + + Do you want to upload this capture? + Kas sa soovid selle ekraanitõmmise üles laadida? + + + + + Upload without confirmation + Laadi üles ilma kinnitust küsimata + + + + ImgUploader + + Uploading Image + S'està pujant la imatge + + + Delete image + Esborra la imatge + + + Unable to open the URL. + No es pot obrir l'URL. + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + Copy URL + Copia l'URL + + + Open URL + Obri l'URL + + + Image to Clipboard. + Imatge al porta-retalls. + + + + ImgUploaderBase + + + Upload image + Laadi pilt üles + + + + Uploading Image + Pilt on üleslaadimisel + + + + Copy URL + Kopeeri võrguaadress + + + + Open URL + Ava võrguaadress + + + + Delete image + Kustuta pilt + + + + Image to Clipboard. + Pilt lõikelauale. + + + + Save image + Salvesta pilt + + + + Unable to open the URL. + Võrguaadressi avamine ei õnnestu. + + + + URL copied to clipboard. + Võrguaadress on kopeeritud lõikelauale. + + + + Screenshot copied to clipboard. + Ekraanitõmmis on kopeeritud lõikelauale. + + + + Unable to save the screenshot to disk. + Ekraanitõmmise salvestamine andmekandjale ei õnnestunud. + + + + Screenshot saved. + Ekraanitõmmis on salvestatud. + + + + ImgUploaderTool + + + Image Uploader + Piltide üleslaadija + + + + Upload the selection + Laadi valik imgur.com teenusesse + + + + ImgurUploader + + Upload to Imgur + Puja a Imgur + + + Uploading Image + S'està pujant la imatge + + + Copy URL + Copia l'URL + + + Open URL + Obre l'URL + + + Delete image + Esborra la imatge + + + Image to Clipboard. + Imatge al porta-retalls. + + + + Unable to open the URL. + Võrguaadressi avamine ei õnnestu. + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + + ImgurUploaderTool + + Image Uploader + Puja la imatge + + + Upload the selection to Imgur + Puja la selecció a Imgur + + + + InfoWindow + + + + About + Rakenduse teave + + + + + Icon + Ikoon + + + + + License + Litsents + + + + + GPLv3+ + GPL-i versioon 3 või suurem + + + + + Version + Versioon + + + + + Flameshot v + Flameshoti versioon + + + + + OS Info + Operatsioonisüsteemi teave + + + + + Copy Info + Kopeeri see teave + + + Right Click + Clic dret + + + Mouse Wheel + Roda del ratolí + + + Move selection 1px + Mou la selecció 1 px + + + Resize selection 1px + Redimensiona la selecció 1 px + + + Quit capture + Ix de la captura + + + Copy to clipboard + Copia al porta-retalls + + + Save selection as a file + Guarda la selecció com a fitxer + + + Undo the last modification + Desfés l'última modificació + + + Show color picker + Mostra el selector de color + + + Change the tool's thickness + Canvia el gruix de l'eina + + + Key + Tecla + + + Description + Descripció + + + <u><b>License</b></u> + <u><b>Llicència</b></u> + + + <u><b>Version</b></u> + <u><b>Versió</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Dreceres</b></u> + + + Available shortcuts in the screen capture mode. + Dreceres disponibles en el mode de captura de pantalla. + + + + InvertTool + + + Invert + + + + + Set Inverter as the paint tool + + + + + LineTool + + + Line + + + + + Set the Line as the paint tool + + + + + MarkerTool + + + Marker + + + + + Set the Marker as the paint tool + + + + + MoveTool + + + Move + + + + + Move the selection area + + + + + PencilTool + + + Pencil + + + + + Set the Pencil as the paint tool + + + + + PinTool + + + Pin Tool + + + + + Pin image on the desktop + + + + + PinWidget + + + Context menu + + + + + Copy to clipboard + Kopeeri lõikelauale + + + + Save to file + Salvesta faili + + + + Rotate Right + + + + + Rotate Left + + + + + Increase Opacity + + + + + Decrease Opacity + + + + + Close + Sulge + + + + PixelateTool + + + Pixelate + + + + + Set Pixelate as the paint tool. + + + + Set Pixelate as the paint tool + Estableix l'eina de pixel·lament com a eina de dibuix + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QHotkey + + Failed to register %1. Error: %2 + No s'ha pogut registrar %1. Error: %2 + + + Failed to unregister %1. Error: %2 + No s'ha pogut desregistrar %1. Error: %2 + + + + QObject + + + + Capture saved to clipboard. + Ekraanitõmmis on salvestatud lõikelauale. + + + + Error while saving to clipboard + Viga lõikelauale salvestamisel + + + + Save screenshot + Salvesta ekraanitõmmis + + + + Path copied to clipboard as + Asukoht on kopeeritud lõikelauale kui + + + Saving canceled + Saving canceled + + + Save canceled + Save canceled + + + Capture is saved and copied to the clipboard as + La captura serà desada i copiada al porta-retalls com a + + + + Save Error + Salvestusviga + + + + + Capture saved as + Ekraanitõmmis on salvestatud kui + + + + + Error trying to save as + + + + + Unable to connect via DBus + No s'ha pogut connectar mitjançant DBus + + + + Powerful yet simple to use screenshot software. + + + + + See + + + + Capture the entire desktop. + Captureu l'escriptori sencer. + + + + Open the capture launcher. + + + + + Start a manual capture in GUI mode. + + + + + Configure + + + + Capture a single screen. + Captura una sola pantalla. + + + Path where the capture will be saved + Camí on es desarà la captura + + + + Capture screenshot of all monitors at the same time. + + + + + Capture a screenshot of the specified monitor. + + + + + Existing directory or new file to save to + + + + + Save the capture to the clipboard + + + + + Pin the capture to the screen + + + + + Upload screenshot + + + + + Delay time in milliseconds + + + + + Repeat screenshot with previously selected region + + + + + Screenshot region to select + + + + + Set the filename pattern + + + + + Accept capture as soon as a selection is made + + + + + Enable or disable the trayicon + + + + + Enable or disable run at startup + + + + + Enable or disable the notifications + + + + + Check the configuration for errors + + + + + Show the help message in the capture mode + + + + + Define the main UI color + + + + + Define the contrast UI color + + + + + Print raw PNG capture + + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + + + + + Define the screen to capture (starting from 0) + + + + + Invalid delay, it must be a number greater than 0 + + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + + + + + Invalid path, must be an existing directory or a new file in an existing directory + + + + Define the screen to capture + Define the screen to capture + + + + default: screen containing the cursor + + + + + Screen number + + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + + + + Invalid delay, it must be higher than 0 + Invalid delay, it must be higher than 0 + + + + Invalid screen number, it must be non negative + + + + Invalid path, it must be a real path in the system + Invalid path, it must be a real path in the system + + + + Invalid value, it must be defined as 'true' or 'false' + + + + + Error + Viga + + + + Unable to write in + Faili kirjutamine ei õnnestu + + + + Requested screen exceeds screen count + + + + + Full screen screenshot pinned to screen + + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + + Options + + + + Arguments + Arguments + + + arguments + arguments + + + + Subcommands + + + + + subcommands + + + + + Usage + + + + + options + + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + + + + Toggle side panel + Toggle side panel + + + Resize selection left 1px + Resize selection left 1px + + + Resize selection right 1px + Resize selection right 1px + + + Resize selection up 1px + Resize selection up 1px + + + Resize selection down 1px + Resize selection down 1px + + + Select entire screen + Select entire screen + + + Move selection left 1px + Move selection left 1px + + + Move selection right 1px + Move selection right 1px + + + Move selection up 1px + Move selection up 1px + + + Move selection down 1px + Move selection down 1px + + + Commit text in text area + Commit text in text area + + + Delete current tool + Delete current tool + + + + Quit capture + Lõpeta ekraanitõmmistamine + + + + Screenshot history + Ekraanitõmmiste ajalugu + + + + Capture screen + Tee ekraanitõmmis + + + + Show color picker + Näita värvivalijat + + + + Change the tool's size + + + + Change the tool's thickness + Canvia el gruix de l'eina + + + + RectangleTool + + + Rectangle + + + + + Set the Rectangle as the paint tool + + + + + RedoTool + + + Redo + + + + + Redo the next modification + + + + + SaveTool + + + Save + Salvesta + + + + Save screenshot to a file + Salvesta ekraanitõmmis faili + + + Save the capture + Guarda la captura + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + + + + + Unable to capture screen + Ekraanitõmmise tegemine ei õnnestu + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + + + + + Set Selection as the paint tool + + + + + SetShortcutDialog + + + Set Shortcut + + + + + Enter new shortcut to change + + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + + + + + + Flameshot must be restarted for changes to take effect. + + + + + ShortcutsWidget + + + Hot Keys + Kiirklahvid + + + + Available shortcuts in the screen capture mode. + Ekraanitõmmise vaates kasutatavad kiirklahvid. + + + + Description + Kirjeldus + + + + Key + Klahv + + + + Left Double-click + Vasak topeltklõps + + + + Toggle side panel + Lülita külgriba sisse/välja + + + + Grab a color from the screen + + + + + Resize selection left 1px + Suurenda valikut vasakul 1 piksli võrra + + + + Resize selection right 1px + Suurenda valikut paremal 1 piksli võrra + + + + Resize selection up 1px + Suurenda valikut üleval 1 piksli võrra + + + + Resize selection down 1px + Suurenda valikut all 1 piksli võrra + + + + Symmetrically decrease width by 2px + Vähenda laiust sümmeetriliselt 2 piksli võrra + + + + Symmetrically increase width by 2px + Suurenda laiust sümmeetriliselt 2 piksli võrra + + + + Symmetrically increase height by 2px + Suurenda kõrgust sümmeetriliselt 2 piksli võrra + + + + Symmetrically decrease height by 2px + Vähenda kõrgust sümmeetriliselt 2 piksli võrra + + + + Select entire screen + Vali kogu ekraan + + + + Move selection left 1px + Liiguta valikut vasakule 1 piksli võrra + + + + Move selection right 1px + Liiguta valikut paremale 1 piksli võrra + + + + Move selection up 1px + Liiguta valikut üles 1 piksli võrra + + + + Move selection down 1px + Liiguta valikut alla 1 piksli võrra + + + + Commit text in text area + Lisa tekst tekstialale + + + + Delete selected drawn object + Kustuta valitud joonistatud objekt + + + + Cancel current selection + Tühista praegune valik + + + Delete current tool + Delete current tool + + + + Capture screen + Tee ekraanitõmmis + + + + Screenshot history + Ekraanitõmmiste ajalugu + + + + SidePanelWidget + + Active thickness: + Active thickness: + + + Active color: + Active color: + + + Press ESC to cancel + Press ESC to cancel + + + + Active tool size: + + + + + Active Color: + + + + + Grab Color + + + + + Display grid + + + + + SizeDecreaseTool + + + Decrease Tool Size + + + + + Decrease the size of the other tools + + + + + SizeIncreaseTool + + + Increase Tool Size + + + + + Increase the size of the other tools + + + + + SizeIndicatorTool + + Selection Size Indicator + Indicador de mida de selecció + + + Show X and Y dimensions of the selection + Show X and Y dimensions of the selection + + + Show the dimensions of the selection (X Y) + Mostra les mides de la selecció (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + Sajand (00-99) + + + + Year (00-99) + Aasta (00-99) + + + + Year (2000) + Aasta (2000) + + + + Month Name (jan) + Kuu nimi (jan) + + + + Month Name (january) + Kuu nimi (january) + + + + Month (01-12) + Kuu (01-12) + + + + Week Day (1-7) + Nädalapäev (1-7) + + + + Week (01-53) + Nädala number (01-53) + + + + Day Name (mon) + Päeva nimi (mon) + + + + Day Name (monday) + Päeva nimi (monday) + + + + Day (01-31) + Päev kuus (01-31) + + + + Day of Month (1-31) + Päev kuus (1-31) + + + + Day (001-366) + Päev aastas (001-366) + + + + Hour (00-23) + Tund (00-23) + + + + Hour (01-12) + Tund (01-12) + + + + Minute (00-59) + Minut (00-59) + + + + Second (00-59) + Sekund (00-59) + + + + Full Date (%m/%d/%y) + Täiskuupäev (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + Täiskuupäev (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + + + + + Time (%H-%M-%S) + Aeg (%H-%M-%S) + + + + Time (%H-%M) + Aeg (%H-%M) + + + + SystemNotification + + + Flameshot Info + Flameshoti teave + + + + TextConfig + + + StrikeOut + Läbikriipsutatud kiri + + + + Underline + Allajoonitud kiri + + + + Bold + Paks kiri + + + + Italic + Kaldkiri + + + + Left Align + Joonda vasakule + + + + Center Align + Joonda keskele + + + + Right Align + Joonda paremale + + + + TextTool + + + Text + Tekst + + + + Add text to your capture + Lisa ekraanitõmmisele kirjeldav tekst + + + + TrayIcon + + + &Take Screenshot + &Tee ekraanitõmmis + + + + &Open Launcher + &Ava käivitaja + + + + &Configuration + &Seadistused + + + + &About + &Rakenduse teave + + + + Check for updates + Kontrolli uuendusi + + + + New version %1 is available + Uus versioon %1 on saadaval + + + + &Quit + &Lõpeta + + + + &Latest Uploads + &Viimased üleslaadimised + + + + &Open Save Path + Ava salvestuse asu&koht + + + + UIcolorEditor + + UI Color Editor + Editor de color de la interfície + + + + Change the color moving the selectors and see the changes in the preview buttons. + + + + + Select a Button to modify it + + + + + Main Color + + + + + Click on this button to set the edition mode of the main color. + + + + + Contrast Color + + + + + Click on this button to set the edition mode of the contrast color. + + + + + UndoTool + + + Undo + + + + + Undo the last modification + Desfés l'última modificació + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + Flameshoti uus versioon %1 on saadaval + + + + Ignore + + + + + Later + + + + + Update + Uuenda + + + + UploadHistory + + + Upload History + + + + + Screenshots history is empty + Ekraanitõmmiste ajalugu on tühi + + + + UploadLineItem + + + Form + + + + + TextLabel + Tekstisilt + + + + Copy URL + Kopeeri võrguaadress + + + + Open In Browser + + + + + Confirm to delete + Kinnita kustutamine + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Kas oled kindel, et soovid kustutada ekraanitõmmise viimaste üleslaadimiste loendist ja serverist? + + + + UtilityPanel + + + Close + Sulge + + + + <Empty> + + + + + VisualsEditor + + + Opacity of area outside selection: + Väljaspool valikut asuva ala läbipaistvus: + + + + UI Color Editor + Kasutajaliidese värvihaldus + + + + Colorpicker Editor + Värvivalija + + + + Button Selection + Nuppude valik + + + + Select All + Vali kõik + + + + color_widgets::ColorDialog + + + Pick + + + + + color_widgets::ColorPalette + + + Unnamed + + + + + color_widgets::ColorPaletteModel + + + Unnamed + + + + + %1 (%2 colors) + + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + + + + + + Create a new palette + + + + + + Duplicate the current palette + + + + + + Delete the current palette + + + + + + Revert changes to the current palette + + + + + + Save changes to the current palette + + + + + + Add a color to the palette + + + + + + Remove the selected color from the palette + + + + + + New Palette + + + + + + Name + + + + + GIMP Palettes (*.gpl) + + + + + Palette Image (%1) + + + + + All Files (*) + + + + + + Open Palette + + + + + Failed to load the palette file +%1 + + + + + color_widgets::GradientEditor + + + Add Color + + + + + Remove Color + + + + + Edit Color... + + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + + + + + color_widgets::Swatch + + + Clear Color + + + + + %1 (%2) + + + + diff --git a/data/translations/Internationalization_eu.ts b/data/translations/Internationalization_eu.ts new file mode 100644 index 0000000..d4d98f5 --- /dev/null +++ b/data/translations/Internationalization_eu.ts @@ -0,0 +1,3232 @@ + + + + + AbstractWidgetList + + + Add New + Gehitu berria + + + + Move Up + Igo + + + + Move Down + Jaitsi + + + + Remove + Kendu + + + + AcceptTool + + + Accept + Onartu + + + + Accept the capture + Onartu argazkia + + + + AppLauncher + + + App Launcher + Aplikazioen abiarazlea + + + + Choose an app to open the capture + Hautatu pantaila-argazkia irekitzeko aplikazio bat + + + + AppLauncherWidget + + + Open With + Ireki honekin + + + + Launch in terminal + Abiarazi terminalean + + + + Keep open after selection + Mantendu irekita hautapenaren ostean + + + + + Error + Errorea + + + + Unable to write in + Ezin da hemen idatzi: + + + + Unable to launch in terminal. + Ezin da terminalean abiarazi. + + + + ArrowTool + + + Arrow + Gezia + + + + Set the Arrow as the paint tool + Ezarri Gezia margotzeko tresna gisa + + + + BlurTool + + Blur + Desenfoque + + + Set Blur as the paint tool + Establece el Desenfoque como herramienta de dibujo + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Argazki-modua</b> + + + + Rectangular Region + Eremu laukizuzena + + + + Full Screen (Current Display) + Pantaila osoa (uneko pantaila) + + + + Full Screen (All Monitors) + Pantaila osoa (pantaila guztiak) + + + + No Delay + Atzerapenik ez + + + + second + segundo + + + + + + seconds + segundo + + + + + Take new screenshot + Egin pantaila-argazki berria + + + + + Area: + Eremua: + + + + + Capture Launcher + Kapturatzailearen abiarazlea + + + + + TextLabel + Testu etiketa + + + + + Capture Mode + Hartzeko modua + + + + + Delay: + Atzerapena: + + + + + WxH+x+y + WxH+x+y + + + + CaptureWidget + + + Unable to capture screen + Ezin da pantailaren argazkia egin + + + + Mouse + Mouse + + + + Select screenshot area + Hautatu pantaila-argazkiaren eremua + + + + Mouse Wheel + Saguaren gurpila + + + + Change tool size + Aldatu tresnaren tamaina + + + + Right Click + Eskuin-klika + + + + Show color picker + Erakutsi kolore-hautatzailea + + + + Open side panel + Ireki alboko panela + + + + Esc + Esc + + + + Exit + Irten + + + + Quit Capture + Utzi argazkia + + + + Are you sure you want to quit capture? + Seguru zaude argazkia utzi nahi duzula? + + + + Do not show this again + Ez erakutsi hau berriro + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot-ek fokua galdu du. Teklatuko lasterbideek ez dute funtzionatuko nonbait klik egin arte. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + Konfigurazio-errorea konpondu da. Abiarazi `flameshot gui` berriro aplikatzeko. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Hautatu eremua saguarekin edo sakatu Ihes tekla irteteko. +Sakatu Sartu pantailaren argazkia egiteko. +Egin eskuin-klika kolore-hautagailua erakusteko. +Erabili saguaren gurpila hautatutako tresnaren lodiera aldatzeko. +Sakatu Zuriunea alboko panela irekitzeko. + + + + Tool Settings + Tresna-aukerak + + + + CircleCountTool + + + Circle Counter + Kontagailu biribildua + + + + Add an autoincrementing counter bubble + Gehitu bere kabuz hazten den kontagailu-burbuila + + + + CircleTool + + + Circle + Zirkulua + + + + Set the Circle as the paint tool + Ezarri Zirkulua margotzeko tresna gisa + + + + ColorDialog + + + + Select Color + Hautatu kolorea + + + + + Saturation + Saturazioa + + + + + Hue + Ñabardura + + + + + Hex + Hex + + + + + Blue + Blue + + + + + Value + Balioa + + + + + Green + Green + + + + + Alpha + Alpha + + + + + Red + Red + + + + ColorGrabWidget + + + Accept color + Onartu kolorea + + + + Enter or Left Click + Sartu edo egin klik ezkerreko botoian + + + + Precisely select color + Hautatu kolorea zehatz-mehatz + + + + Hold Left Click + Eduki sakatuta ezkerreko klik + + + + Toggle magnifier + Aldatu lupara + + + + Space or Right Click + Zuriunea edo eskuineko klik + + + + Cancel + Utzi + + + + Esc + Esc + + + + ColorPickerEditor + + + Edit Preset: + Editatu aurrezarpena: + + + + Enter color to update preset + Idatzi kolorea aurrez ezarritakoa eguneratzeko + + + + Update + Eguneratu + + + + Press button to update the selected preset + Sakatu botoia hautatutako aurrezarpena eguneratzeko + + + + Delete + Ezabatu + + + + Press button to delete the selected preset + Sakatu botoia hautatutako aurrezarpena ezabatzeko + + + + Add Preset: + Gehitu aurrezarpena: + + + + Enter color manually or select it using the color-wheel + Sartu kolorea eskuz edo hautatu kolore-gurpila erabiliz + + + + Add + Gehitu + + + + Press button to add preset + Sakatu botoia aurrez ezarritakoa gehitzeko + + + + + Error + Errorea + + + + Unable to add preset. Maximum limit reached. + Ezin da aurrez ezarri. Gehienezko mugara iritsi da. + + + + Unable to remove preset. Minimum limit reached. + Ezin izan da aurrez ezarrita kendu. Gutxieneko mugara iritsi da. + + + + ConfigErrorDetails + + + Configuration errors + Konfigurazio akatsak + + + + ConfigHandler + + + Unrecognized setting: '%1' + + Ezarpen ezezaguna: '%1' + + + + + Unrecognized shortcut name: '%1'. + + Ezagutzen ez den lasterbidearen izena: '%1'. + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + Lasterbideen gatazka: '%1' eta '%2' lasterbide bera dute: %3 + + + + + Bad value in '%1'. Expected: %2 + + Balio txarra '%1'-n. Espero zen: %2 + + + + + You have successfully resolved the configuration error. + Konfigurazio-errorea behar bezala konpondu duzu. + + + + The configuration contains an error. Open configuration to resolve. + Konfigurazioak errore bat dauka. Ireki konfigurazioa konpontzeko. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + '%1' konfigurazio-gako txarra ConfigHandler-en. Mesedez, jakinarazi hau akats gisa. + + + + ConfigResolver + + + Resolve configuration errors + Ebatzi konfigurazio akatsak + + + + <b>You must resolve all errors before continuing:</b> + <b>Jarraitu aurretik errore guztiak konpondu behar dituzu:</b> + + + + Reset + Berrezarri + + + + Reset to the default value. + Berrezarri lehenetsitako baliora. + + + + Remove + Kendu + + + + Remove this setting. + Kendu ezarpen hau. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + Teklatuko lasterbide batzuek gatazkak dituzte. +Honek EZ du eragotziko flameshot abiaraztea. +Mesedez, konpon itzazu eskuz konfigurazio fitxategian. + + + + Resolve all + Ebatzi dena + + + + Resolve all listed errors. + Ebatzi zerrendatutako akats guztiak. + + + + Details + Xehetasunak + + + + ConfigWindow + + + Configuration + Ezarpenak + + + + Interface + Interfazea + + + + Filename Editor + Fitxategi-izenaren editorea + + + + General + Orokorra + + + + Shortcuts + Laster teklak + + + + Resolve + Ebatzi + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>Konfigurazio fitxategiak erroreak ditu. Konpondu itzazu jarraitu aurretik.</b> + + + + Controller + + New version %1 is available + %1 bertsio berria eskuragarri dago + + + You have the latest version + Azken bertsioa duzu + + + Failed to get information about the latest version. + Ezin izan da azken bertsioari buruzko informazioa lortu. + + + Error + Errorea + + + Unable to close active modal widgets + Ezin dira itxi widget modal aktiboak + + + &Take Screenshot + &Pantaila-argazkia egin + + + &Open Launcher + &Abiarazlea ireki + + + &Configuration + &Ezarpenak + + + &About + &Honi buruz + + + Check for updates + Bilatu eguneraketak + + + &Latest Uploads + &Azken igoerak + + + URL copied to clipboard. + Arbelean kopiatu da URLa. + + + &Information + &Informazioa + + + &Quit + &Irten + + + + CopyTool + + + Copy + Kopiatu + + + + Copy selection to clipboard + Kopiatu hautapena arbelean + + + Copy the selection into the clipboard + Kopiatu hautapena arbelean + + + + DBusUtils + + Unable to connect via DBus + Ezin da DBus bidez konektatu + + + + ExitTool + + + Exit + Irten + + + + Leave the capture screen + Irten argazki-hartze pantailatik + + + + FileNameEditor + + + Edit the name of your captures: + Aldatu zure pantaila-argazkien izenak: + + + + Edit: + Editatu: + + + + Preview: + Aurreikuspena: + + + + Save + Gorde + + + + Saves the pattern + Gorde txantiloia + + + + Restore + Berreskuratu + + + Reset + Berrezarri + + + + Restores the saved pattern + Gordetako txantiloia berrezartzen du + + + + Clear + Garbitu + + + + Deletes the name + Izena ezabatzen du + + + + Flameshot + + + Error + Errorea + + + + Unable to close active modal widgets + Ezin dira itxi trepeta modal aktiboak + + + + URL copied to clipboard. + URLa arbelean kopiatu da. + + + + FlameshotDaemon + + + New version %1 is available + %1 bertsio berria eskuragarri dago + + + + You have the latest version + Azken bertsioa duzu + + + + Failed to get information about the latest version. + Ezin izan da azken bertsioari buruzko informazioa lortu. + + + + Unable to connect via DBus + Ezin da DBus bidez konektatu + + + + GeneneralConf + + Import + Inportatu + + + Error + Errorea + + + Unable to read file. + Ezin da fitxategia irakurri. + + + Unable to write file. + Ezin da fitxategian idatzi. + + + Save File + Gorde fitxategia + + + Confirm Reset + Baieztatu berrezartzea + + + Are you sure you want to reset the configuration? + Ziur ezarpenak berrezarri nahi dituzula? + + + Show help message + Erakutsi laguntza-mezua + + + Show the help message at the beginning in the capture mode. + Erakutsi laguntza-mezua argazki-hartze modua irekitzean. + + + Show the side panel button + Erakutsi aldeko paneleko botoia + + + Show the side panel toggle button in the capture mode. + Erakutsi aldeko panela erakusteko botoia argazki-hartze moduan. + + + Show desktop notifications + Erakutsi mahaigaineko jakinarazpenak + + + Show tray icon + Erakutsi ikonoa erretiluan + + + Show the systemtray icon + Erakutsi ikonoa sistemako erretiluan + + + Configuration File + Konfigurazio-fitxategia + + + Export + Esportatu + + + Reset + Berrezarri + + + Launch at startup + Abiarazi saio-hasieran + + + Launch Flameshot + Abiarazi Flamsehot + + + Close after capture + Itxi argazkia egin ostean + + + Close after taking a screenshot + Itxi pantaila-argazkia egin ostean + + + Copy URL after upload + Kopiatu URLa igo ostean + + + Copy URL and close window after upload + Kopiatu URLa eta itxi leihoa igo ostean + + + Save image after copy + Gorde irudia kopiatu ostean + + + Save image file after copying it + Gorde irudia fitxategian kopiatu ostean + + + Save Path + Gordetzeko bidea + + + Change... + Aldatu... + + + Choose a Folder + Aukeratu karpeta + + + Unable to write to directory. + Ezin da direktorioan idatzi. + + + + GeneralConf + + + + Import + Inportatu + + + + + + + Error + Errorea + + + + Unable to read file. + Ezin da fitxategia irakurri. + + + + + Unable to write file. + Ezin da fitxategian idatzi. + + + + Save File + Gorde fitxategia + + + + Confirm Reset + Berretsi berrezartzea + + + + Are you sure you want to reset the configuration? + Ziur ezarpenak berrezarri nahi dituzula? + + + + Show help message + Bistaratu laguntza-mezua + + + Show the help message at the beginning in the capture mode. + Bistaratu laguntza-mezua argazki-hartze modua irekitzean. + + + + Show the side panel button + Bistaratu aldeko paneleko botoia + + + Show the side panel toggle button in the capture mode. + Bistaratu aldeko panela erakusteko botoia argazki-hartze moduan. + + + + Show desktop notifications + Bistaratu mahaigaineko jakinarazpenak + + + + Show tray icon + Bistaratu ikonoa erretiluan + + + Show the systemtray icon + Bistaratu ikonoa sistemako erretiluan + + + + Confirmation required to delete screenshot from the latest uploads + Berrespena behar da pantaila-argazkia azken igoeretatik ezabatzeko + + + + Configuration File + Konfigurazio-fitxategia + + + + Export + Esportatu + + + + Reset + Berrezarri + + + + Automatic check for updates + Automatikoki bilatu eguneraketak + + + + Allow multiple flameshot GUI instances simultaneously + Baimendu flameshot GUI instantzia anitz aldi berean + + + Automatically close daemon when it is not needed + Itxi automatikoki daemon-a behar ez denean + + + Launch at startup + Abiarazi saio-hasieran + + + Launch Flameshot + Abiarazi Flameshot + + + + Show welcome message on launch + Bistaratu ongietorri-mezua abioan + + + + Use large predefined color palette + Erabili aurrez definitutako kolore-paleta handia + + + + Copy URL after upload + Kopiatu URLa argazkia igo ostean + + + Copy URL and close window after upload + Kopiatu URLa eta itxi leihoa argazkia igo ostean + + + + Save image after copy + Gorde argazkia berbera kopiatu ostean + + + Save image file after copying it + Gorde argazkia fitxategian berbera kopiatu ostean + + + + Show the help message at the beginning in the capture mode + Pantaila argazkia hartzeko moduaren hasieran erakutsi laguntza-mezua + + + + Use last region for GUI mode + Erabili azken eremua GUI moduan + + + + Use the last region as the default selection for the next screenshot in GUI mode + Azken eremua erabiltzen du hurrengo pantaila-argazkirako hautaketa-eremu lehenetsi gisa + + + + Show the side panel toggle button in the capture mode + Erakutsi alboko panelaren txandakatzeko botoia pantaila-argazkia hartzeko moduan + + + + Enable desktop notifications + Gaitu mahaigaineko jakinarazpenak + + + + Show abort notifications + Erakutsi uzteko jakinarazpenak + + + + Enable abort notifications + Gaitu uzteko jakinarazpenak + + + + Show icon in the system tray + Erakutsi ikonoa sistemaren erretiluan + + + + Use grim to capture screenshots + Erabili iluntasuna pantaila argazkietan + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + Grim Wayland soilik dabilen serigrafia protokoloan oinarritutako pantailak atzemateko utilitatea da. Orokorrean, gutxieneko Wayland leiho-kudeatzaileak soilik gaitu, hala nola, Sway, Hyprland, etab. + + + + Ask for confirmation to delete screenshot from the latest uploads + Eskatu berrespena azken kargen pantaila-argazkia ezabatzeko + + + + Check for updates automatically + Egiaztatu eguneratzeak automatikoki + + + + This allows you to take screenshots of Flameshot itself for example + Honi esker, adibidez, Flameshot-en pantaila-argazkiak atera ditzakezu + + + Launch Flameshot daemon when computer is booted + Abiarazi Flameshot daemon-a ordenagailua abiarazten denean + + + + Show the welcome message box in the middle of the screen while taking a screenshot + Erakutsi ongietorri-mezuaren koadroa pantailaren erdian pantaila-argazkia egiten duzun bitartean + + + + Use a large predefined color palette + Erabili aurrez zehaztutako kolore-paleta handi bat + + + + Copy on double click + Kopiatu klik bikoitzean + + + Enable Copy on Double Click + Gaitu Kopiatu klik bikoitzean + + + Copy URL and close window after uploading was successful + Kopiatu URLa eta itxi leihoa igo ondoren + + + + Automatically unload from memory when it is not needed + Deskargatu automatikoki memoriatik beharrezkoa ez denean + + + + Automatically close daemon (background process) when it is not needed + Automatikoki itxi daemon-a (atzeko planoko prozesua) beharrezkoa ez denean + + + + Launch in background at startup + Bigarren mailan abiarazi, abioan + + + + Launch Flameshot daemon (background process) when computer is booted + Abiarazi Flameshot daemon (atzeko planoko prozesua) ordenagailua abiarazten denean + + + + Ask before quit capture + Galdetu pantaila-argazkitik irten aurretik + + + + Show the confirmation prompt before ESC quit + Erakutsi berrespen-oharra ESC bidez irten aurretik + + + + Enable Copy to clipboard on Double Click + Gaitu arbelean kopiatzea klik bikoitzaren bidez + + + + Copy URL after uploading was successful + Kopiatu URLa kargatu ondoren + + + + After copying the screenshot, save it to a file as well + Pantaila-argazkia kopiatu ondoren, gorde fitxategi batean ere + + + + Save Path + Gordetzeko bidea + + + + Change... + Aldatu... + + + + Use fixed path for screenshots to save + Erabili bide finkoa pantaila-argazkiak gordetzeko + + + + Preferred save file extension: + Fitxategia gordetzeko luzapen hobetsia: + + + + Latest Uploads Max Size + Azken igoeren gehienezko tamaina + + + + Imgur Application Client ID + Imgur aplikazioaren bezeroaren IDa + + + + Undo limit + Desegiteen muga + + + + Use JPG format for clipboard (PNG default) + Erabili JPG formatua arbelean kopiatzeko (PNG lehenetsia) + + + + Use lossy JPG format for clipboard (lossless PNG default) + Erabili galeradun JPG formatua arbelerako (galerarik gabeko PNG lehenetsia) + + + + Copy file path after save + Kopiatu fitxategiaren bidea berbera gorde ostean + + + + Copy the file path to clipboard after the file is saved + Kopiatu fitxategiaren bidea arbelean fitxategia gorde ondoren + + + + Anti-aliasing image when zoom the pinned image + Anti-aliasing aplikatu irudiari ainguratutako irudia handitzean + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + Ainguratutako irudia handitu ondoren, irudia leunduta edo pixelizatuta egon beharko luke + + + + + Upload image without confirmation + Igo irudia berrespenik gabe + + + + Choose a Folder + Aukeratu karpeta + + + + Unable to write to directory. + Ezin da direktorioan idatzi. + + + + Show magnifier + Erakutsi lupa + + + + Enable a magnifier while selecting the screenshot area + Gaitu lupa pantaila-argazkiaren eremua hautatzen duzun bitartean + + + + Square shaped magnifier + Lupa karratua + + + + Make the magnifier to be square-shaped + Lupa karratu-forma izan dezan + + + + Milliseconds before geometry display hides; 0 means do not hide + Milisegundoak geometria bistaratzea ezkutatu aurretik; 0-k ez ezkutatzea esan nahi du + + + + Set geometry display timeout (ms) + Ezarri geometria bistaratzeko denbora-muga (ms) + + + + Selection Geometry Display + Hautapen-geometriako pantaila + + + + Display Location + Bistaratu kokalekua + + + + None + Bat ere ez + + + + Top Left + Goian ezkerrean + + + + Top Right + Goian eskuinean + + + + Bottom Left + Behean ezkerrean + + + + Bottom Right + Behean eskuinean + + + + Center + Erdian + + + + Quality range of 0-100; Higher number is better quality and larger file size + Kalitate tartea 0-100; Zenbaki handiagoa kalitate hobea eta fitxategi tamaina handiagoa da + + + + JPEG Quality + JPEG kalitatea + + + + Reverse arrow + Alderantzikatu gezia + + + + Draw the arrow head first + Marraztu geziaren burua lehenengo + + + + Insecure Pixelate + Segurtasunik gabe pixelatua + + + + Draw the pixelation effect in an insecure but more asethetic way. + Marraztu pixelazio-efektua modu ez-seguru baina estetikoagoan. + + + + HistoryWidget + + Latest Uploads + Azken igoerak + + + Screenshots history is empty + Pantaila-argazkien erregistroa hutsik dago + + + Copy URL + Kopiatu URLa + + + URL copied to clipboard. + Arbelean kopiatu da URLa. + + + Open in browser + Ireki nabigatzailean + + + Confirm to delete + Berretsi ezabatzeko + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Ziur pantaila-argazkia azken igoeretatik eta zerbitzaritik ezabatu nahi duzula? + + + + ImgS3Uploader + + Uploading Image + Irudia igotzen + + + URL copied to clipboard. + Arbelean kopiatu da URLa. + + + Error + Errorea + + + + ImgUploadDialog + + + Upload Confirmation + Igo berrespena + + + + Do you want to upload this capture? + Harrapaketa hau igo nahi duzu? + + + + + Upload without confirmation + Igo berrespenik gabe + + + + ImgUploader + + Uploading Image + Irudia igotzen + + + Unable to open the URL. + Ezin da ireki URLa. + + + URL copied to clipboard. + Arbelean kopiatu da URLa. + + + Screenshot copied to clipboard. + Arbelean kopiatu da pantaila-argazkia. + + + Copy URL + Kopiatu URLa + + + Open URL + Ireki URLa + + + Delete image + Ezabatu irudia + + + Image to Clipboard. + Irudia arbelera. + + + + ImgUploaderBase + + + Upload image + Igo irudia + + + + Uploading Image + Irudia igotzen + + + + Copy URL + Kopiatu URLa + + + + Open URL + Ireki URLa + + + + Delete image + Ezabatu irudia + + + + Image to Clipboard. + Irudia arbelera. + + + + Save image + Gorde irudia + + + + Unable to open the URL. + Ezin da ireki URLa. + + + + URL copied to clipboard. + URLa arbelean kopiatu da. + + + + Screenshot copied to clipboard. + Arbelean kopiatu da pantaila-argazkia. + + + + Unable to save the screenshot to disk. + Ezin da pantaila-argazkia diskoan gorde. + + + + Screenshot saved. + Pantaila-argazkia gorde da. + + + + ImgUploaderTool + + + Image Uploader + Irudi kargatzailea + + + + Upload the selection + Igo hautapena + + + + ImgurUploader + + Upload to Imgur + Igo Imgur-era + + + Uploading Image + Irudia igotzen + + + Copy URL + Kopiatu URLa + + + Open URL + Ireki URLa + + + Delete image + Ezabatu irudia + + + Image to Clipboard. + Irudia arbelera. + + + + Unable to open the URL. + Ezin da ireki URLa. + + + URL copied to clipboard. + Arbelean kopiatu da URLa. + + + Screenshot copied to clipboard. + Arbelean kopiatu da pantaila-argazkia. + + + + ImgurUploaderTool + + Image Uploader + Irudi igotzailea + + + Upload the selection to Imgur + Igo hautapena Imgur-era + + + + InfoWindow + + + + About + Honi buruz + + + + + Icon + Ikonoa + + + + + License + Lizentzia + + + + + GPLv3+ + GPLv3+ + + + + + Version + Bertsioa + + + + + Flameshot v + Flameshot v + + + + + OS Info + Sistema eragilearen informazioa + + + + + Copy Info + Kopiatu informazioa + + + SPACEBAR + ZURIUNEA + + + Right Click + Eskuin-klika + + + Mouse Wheel + Saguaren gurpila + + + Move selection 1px + Mugitu azalera 1px + + + Resize selection 1px + Aldatu hautapenaren tamaina 1px + + + Quit capture + Irten argazki-hartzetik + + + Copy to clipboard + Kopiatu arbelean + + + Save selection as a file + Gorde hautapena fitxategi gisa + + + Undo the last modification + Desegin azken aldaketa + + + Toggle visibility of sidebar with options of the selected tool + Erakutsi/Ezkutatu alboko barra, hautatutako tresnaren aukerak erakusten dituena + + + Show color picker + Erakutsi kolore hautagailua + + + Change the tool's thickness + Aldatu tresnaren lodiera + + + Available shortcuts in the screen capture mode. + Argazki-hartze moduan erabili daitezken laster-teklak. + + + Key + Tekla + + + Description + Deskribapena + + + <u><b>License</b></u> + <u><b>Lizentzia</b></u> + + + <u><b>Version</b></u> + <u><b>Bertsioa</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Laster-teklak</b></u> + + + + InvertTool + + + Invert + Alderantzikatu + + + + Set Inverter as the paint tool + Ezarri alderantzikatzailea margotzeko tresna gisa + + + + LineTool + + + Line + Lerroa + + + + Set the Line as the paint tool + Ezarri Lerroa margotzeko tresna gisa + + + + MarkerTool + + + Marker + Errotuladorea + + + + Set the Marker as the paint tool + Ezarri Errotuladorea margotzeko tresna gisa + + + + MoveTool + + + Move + Mugitu + + + + Move the selection area + Mugitu hautapena + + + + PencilTool + + + Pencil + Arkatza + + + + Set the Pencil as the paint tool + Ezarri arkatza margotzeko tresna gisa + + + + PinTool + + + Pin Tool + Txintxeta + + + + Pin image on the desktop + Finkatu irudia mahaigainan + + + + PinWidget + + + Context menu + Testuinguruko menua + + + + Copy to clipboard + Kopiatu arbelean + + + + Save to file + Gorde fitxategian + + + + Rotate Right + Biratu eskuinera + + + + Rotate Left + Biratu ezkerrera + + + + Increase Opacity + Handiagotu opakutasuna + + + + Decrease Opacity + Txikiagotu opakutasuna + + + + Close + Itxi + + + + PixelateTool + + + Pixelate + Pixelatu + + + + Set Pixelate as the paint tool. + Ezarri pixelatzea marrazketa tresna gisa. + + + Set Pixelate as the paint tool + Ezarri Pixelatu margotzeko tresna gisa + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QHotkey + + Failed to register %1. Error: %2 + Ezin izan da %1 erregistratu. Errorea: %2 + + + Failed to unregister %1. Error: %2 + Ezin izan da %1 erregistrotik kendu. Errorea: %2 + + + + QObject + + + Save Error + Errorea gordetzean + + + + + Capture saved as + Argazkia honela gorde da: + + + + + Capture saved to clipboard. + Argazkia arbelean gorde da. + + + Capture saved to clipboard + Argazkia arbelean gorde da + + + + Error while saving to clipboard + Errorea arbelean gordetzerakoan + + + + + Error trying to save as + Errorea honela gordetzean: + + + + Save screenshot + Gorde pantaila-argazkia + + + + Path copied to clipboard as + Arbelean kopiatu da bidea + + + Saving canceled + Saving canceled + + + Save canceled + Save canceled + + + Capture is saved and copied to the clipboard as + Pantaila-argazkia izen honekin gorde eta kopiatzen da arbelean: + + + + Unable to connect via DBus + Ezin da DBus bidez konektatu + + + + Powerful yet simple to use screenshot software. + Pantaila-argazki software ahaltsu baina sinplea. + + + + See + Ikusi + + + Capture the entire desktop. + Pantaila osoaren argazkia egin. + + + + Open the capture launcher. + Ireki argazki-hartze abiarazlea. + + + + Start a manual capture in GUI mode. + Hasi eskuzko argazki-hartzea interfaze moduan. + + + + Configure + Konfiguratu + + + Capture a single screen. + Leiho bakar baten argazkia egin. + + + Path where the capture will be saved + Argazkia gordeko den bidea + + + + Capture screenshot of all monitors at the same time. + Egin aldi berean monitore guztien pantaila-argazkia. + + + + Capture a screenshot of the specified monitor. + Egin monitore zehatz baten pantaila-argazkia. + + + + Existing directory or new file to save to + Lehendik dagoen direktorio edo fitxategi berria gordetzeko + + + + Save the capture to the clipboard + Gorde argazkia arbelean + + + + Pin the capture to the screen + Ainguratu argazkia pantailara + + + + Upload screenshot + Igo pantaila-argazkia + + + + Delay time in milliseconds + Atzerapen tartea milisegundotan + + + + Repeat screenshot with previously selected region + Errepikatu pantaila-argazkia aurrez hautatutako eremuan + + + + Screenshot region to select + Hautatzeko pantaila-argazkiaren eremua + + + + Set the filename pattern + Ezarri fitxategi-izenaren txantiloia + + + + Accept capture as soon as a selection is made + Onartu argazkia hautaketa egin bezain laster + + + + Enable or disable the trayicon + Gaitu/Desgaitu erretiluko ikonoa + + + + Enable or disable run at startup + Gaitu/Desgaitu saio hasieran abiaraztea + + + + Enable or disable the notifications + Gaitu edo ezgaitu jakinarazpenak + + + + Check the configuration for errors + Begiratu konfigurazioa akatsik dagoen + + + + Show the help message in the capture mode + Bistaratu laguntza mezua argazki-hartze moduan + + + + Define the main UI color + Zehaztu interfazearen kolore nagusia + + + + Define the contrast UI color + Zehaztu interfazearen kontraste kolorea + + + + Print raw PNG capture + Gorde argazkia PNG gordin gisa + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + Inprimatu hautapenaren geometria WxH+X+Y formatuan (Zabalera, Altuera, X ardatza, Y ardatza). Ez du ezer egiten jatorrizkoa zehazten bada + + + + Define the screen to capture (starting from 0) + Definitu harrapatzeko pantaila (0tik hasita) + + + + Invalid delay, it must be a number greater than 0 + Atzerapen baliogabea, 0 baino handiagoa den zenbaki bat izan behar du + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + Eremu baliogabea, erabili 'WxH+X+Y' edo 'guztia' edo 'screen0/screen1/...'. + + + + Invalid path, must be an existing directory or a new file in an existing directory + Bide baliogabea, lehendik dagoen direktorio bat edo lehendik dagoen direktorio bateko fitxategi berri bat izan behar du + + + Define the screen to capture + Zehaztu argazkia egingo zaion leihoa + + + + default: screen containing the cursor + lehenetsia: kurtsorea gainean duen leihoa + + + + Screen number + Leiho kopurua + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Kolore baliogabea, bandera honek formatu hauek ditu: +- #RGB (R, G eta B-ko bakoitza digitu hexagonal bakarra da) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- 'Urdina' edo 'gorria' deritzen koloreak +Baliteke '#' karakterea ihes egin behar izatea, '\#FFF'n bezala + + + Invalid delay, it must be higher than 0 + Atzerapen baliogabea, 0 baino handiagoa izan behar du + + + + Invalid screen number, it must be non negative + Leiho kopuru baliogabe, ezin du negatiboa izan + + + Invalid path, it must be a real path in the system + Bide baliogabe, sisteman existitzen den bide bat behar du izan + + + + Invalid value, it must be defined as 'true' or 'false' + Balio baliogabea, 'true' (egi) edo 'false' (faltsu) gisa definitu behar da + + + + Error + Errorea + + + + Unable to write in + Ezin da hemen idatzi: + + + + Requested screen exceeds screen count + Eskatutako pantailak pantaila kopurua gainditzen du + + + + Full screen screenshot pinned to screen + Pantaila osoko pantaila-argazkia pantailara ainguratuta + + + URL copied to clipboard. + Arbelean kopiatu da URLa. + + + + Options + Aukerak + + + Arguments + Argumentuak + + + arguments + argumentu + + + + Subcommands + Azpi-komandoak + + + + subcommands + azpi-komandoak + + + + Usage + Erabilera + + + + options + aukerak + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Lehenetsita, Flameshot atzealdean abiarazten du eta erretiluko ikono bat bistaratzen du, konfiguratzeko. + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Lehenetsita Flameshot atzealdean abiarazten du eta erretilu ikono bat gehitzen du ezarpenetarako. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Kaixo, hemen nago! Egin klik erretiluko ikonoan pantaila-argazkia hartzeko edo egin klik eskuineko botoiaz aukera gehiago ikusteko. + + + Toggle side panel + Bistaratu/Ezkutatu alboko panela + + + Resize selection left 1px + Aldatu hautapenaren tamaina pixel 1 ezkerrera + + + Resize selection right 1px + Aldatu hautapenaren tamaina pixel 1 eskuinera + + + Resize selection up 1px + Aldatu hautapenaren tamaina pixel 1 gora + + + Resize selection down 1px + Aldatu hautapenaren tamaina pixel 1 behera + + + Select entire screen + Hautatu pantaila osoa + + + Move selection left 1px + Mugitu hautapena pixel 1 ezkerrera + + + Move selection right 1px + Mugitu hautapena pixel 1 eskuinera + + + Move selection up 1px + Mugitu hautapena pixel 1 gora + + + Move selection down 1px + Mugitu hautapena pixel 1 behera + + + Commit text in text area + Idatzi testu-eremuan + + + Delete current tool + Delete current tool + + + + Quit capture + Irten argazki-hartzetik + + + + Screenshot history + Pantaila-argazkien erregistroa + + + + Capture screen + Egin pantailaren argazkia + + + + Show color picker + Bistaratu kolore hautagailua + + + + Change the tool's size + Aldatu tresnaren tamaina + + + Change the tool's thickness + Aldatu tresnaren lodiera + + + + RectangleTool + + + Rectangle + Laukizuzena + + + + Set the Rectangle as the paint tool + Ezarri Laukizuzena margotzeko tresna gisa + + + + RedoTool + + + Redo + Berregin + + + + Redo the next modification + Berregin azken aldaketa + + + + SaveTool + + + Save + Gorde + + + + Save screenshot to a file + Gorde pantaila-argazkia fitxategi batean + + + Save the capture + Gorde argazkia + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Ezin da mahaigaineko ingurunea detektatu (GNOME? KDE? Sway?...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + Wayland pantaila-kapturaren egokigailu unibertsalak Grim behar du Wayland-en pantaila-kapturaren osagai gisa. Pantaila-kapturaren osagaia falta bada, instalatu! + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + useGrimAdapter ezarpena ez badago gaituta, dbus protokoloa erabiliko da. Kontuan izan behar da dbus protokoloa Wayland-en erabiltzea ez dela gomendagarria. flameshot.ini fitxategian useGrimAdapter ezarpena aktibatzea gomendatzen da, Grim-ean oinarritutako Wayland pantaila-argazkiaren egokigailu orokorra aktibatzeko + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + Grim-en pantaila-argazkiaren osagaia 'wlroots'-en oinarritzen da, GNOMEn edo antzeko mahaigaineko inguruneetan ez litzateke erabili behar + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + Ezin da mahaigaineko ingurunea detektatu (GNOME? KDE? ¿Qile? {\an2}Sway? ...) + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + Aholkua: saiatu XDG_CURRENT_DESKTOP ingurune-aldagaia ezartzen. + + + + Unable to capture screen + Ezin da pantailaren argazkia egin + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + Idatzi zerbait hemen... + + + + &Send + &Bidali + + + + Error sending message + Errorea mezua bidaltzean + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + Hautaketa laukizuzena + + + + Set Selection as the paint tool + Ezarri Hautaketa margotzeko tresna gisa + + + + SetShortcutDialog + + + Set Shortcut + Ezarri laster-tekla + + + + Enter new shortcut to change + Sakatu laster-tekla berria aldatzeko + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Sakatu Esc uzteko edo ⌘+Atzera-tekla teklatuko lasterbidea desgaitzeko. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Sakatu Esc irteteko edo Atzera tekla hutsik uzteko. + + + + + Flameshot must be restarted for changes to take effect. + Flameshot berrabiarazi behar da aldaketak eragina izan dezan. + + + + ShortcutsWidget + + + Hot Keys + Laster-teklak + + + + Available shortcuts in the screen capture mode. + Argazki-hartze moduan erabili daitezken laster-teklak. + + + + Description + Deskribapena + + + + Key + Tekla + + + + Left Double-click + Ezkerreko klik bikoitza + + + + Toggle side panel + Bistaratu/Ezkutatu alboko panela + + + + Grab a color from the screen + Hartu kolore bat pantailatik + + + + Resize selection left 1px + Aldatu hautaketaren tamaina pixel 1 ezkerrera + + + + Resize selection right 1px + Aldatu hautaketaren tamaina pixel 1 eskuinera + + + + Resize selection up 1px + Aldatu hautaketaren tamaina pixel 1 gora + + + + Resize selection down 1px + Aldatu hautaketaren tamaina pixel 1 behera + + + + Symmetrically decrease width by 2px + Zabalera 2px-tan simetrikoki txikiagotzea + + + + Symmetrically increase width by 2px + Zabalera 2px-tan simetrikoki handiagotzea + + + + Symmetrically increase height by 2px + Altuera 2px-tan simetrikoki handiagotzea + + + + Symmetrically decrease height by 2px + Altuera 2px-tan simetrikoki txikiagotzea + + + + Select entire screen + Hautatu pantaila osoa + + + + Move selection left 1px + Mugitu hautaketa pixel 1 ezkerrera + + + + Move selection right 1px + Mugitu hautaketa pixel 1 eskuinera + + + + Move selection up 1px + Mugitu hautaketa pixel 1 gora + + + + Move selection down 1px + Mugitu hautaketa pixel 1 behera + + + + Commit text in text area + Idatzi testua testu-eremuan + + + + Delete selected drawn object + Ezabatu hautatutako objektu marraztua + + + + Cancel current selection + Utzi uneko hautapena + + + Delete current tool + Ezabatu uneko tresna + + + + Capture screen + Egin pantailaren argazkia + + + + Screenshot history + Pantaila-argazkien erregistroa + + + + SidePanelWidget + + Active thickness: + Uneko lodiera: + + + Active color: + Uneko kolorea: + + + Press ESC to cancel + Sakatu IHES uzteko + + + + Active tool size: + Tresna aktiboaren tamaina: + + + + Active Color: + Kolore aktiboa: + + + + Grab Color + Hartu kolorea + + + + Display grid + Erakutsi sareta + + + + SizeDecreaseTool + + + Decrease Tool Size + Txikiagotu tresnaren tamaina + + + + Decrease the size of the other tools + Txikiagotu gainerako tresnen tamaina + + + + SizeIncreaseTool + + + Increase Tool Size + Handiagotu tresnaren tamaina + + + + Increase the size of the other tools + Handiagotu beste tresnen tamaina + + + + SizeIndicatorTool + + Selection Size Indicator + Hautaketaren tamaina-adierazlea + + + Show X and Y dimensions of the selection + Erakutsi hautaketaren X eta Y dimentsioak + + + Show the dimensions of the selection (X Y) + Bistaratu hautapenaren dimentsioak (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + Mendea (00-99) + + + + Year (00-99) + Urtea (00-99) + + + + Year (2000) + Urtea (2000) + + + + Month Name (jan) + Hilabetearen izena (ira) + + + + Month Name (january) + Hilabetearen izena (iraila) + + + + Month (01-12) + Hilabetea (01-12) + + + + Week Day (1-7) + Asteko eguna (1-7) + + + + Week (01-53) + Astea (01-53) + + + + Day Name (mon) + Egunaren izena (ar.) + + + + Day Name (monday) + Egunaren izena (asteartea) + + + + Day (01-31) + Eguna (01-31) + + + + Day of Month (1-31) + Hilabeteko eguna (1-31) + + + + Day (001-366) + Urteko eguna (001-366) + + + + Time (%H-%M-%S) + Ordua (%H-%M-%S) + + + + Time (%H-%M) + Ordua (%H-%M) + + + + Hour (00-23) + Eguneko ordua (00-23) + + + + Hour (01-12) + Eguneko ordua (01-12) + + + + Minute (00-59) + Minutua (00-59) + + + + Second (00-59) + Segundoa (00-59) + + + + Full Date (%m/%d/%y) + Data (%h/%e/%u) + + + + Full Date (%Y-%m-%d) + Data (%U-%h-%e) + + + + Full Date (%d-%m-%Y) + + + + + SystemNotification + + + Flameshot Info + Flameshot-en informazioa + + + + TextConfig + + + StrikeOut + Marratua + + + + Underline + Azpimarratua + + + + Bold + Lodia + + + + Italic + Etzana + + + + Left Align + Lerrokatu ezkerrean + + + + Center Align + Lerrokatu erdian + + + + Right Align + Lerrokatu eskuinean + + + + TextTool + + + Text + Testua + + + + Add text to your capture + Gehitu testua zure argazkian + + + + TrayIcon + + + &Take Screenshot + Egin &pantailaren argazkia + + + + &Open Launcher + &Ireki abiarazlea + + + + &Configuration + &Ezarpenak + + + + &About + &Honi buruz + + + + Check for updates + Bilatu eguneraketak + + + + New version %1 is available + %1 bertsio berria eskuragarri dago + + + + &Quit + &Irten + + + + &Latest Uploads + &Azken kargak + + + + &Open Save Path + &Ireki gordetzeko bidea + + + + UIcolorEditor + + UI Color Editor + Interfaze-kolorearen editorea + + + + Change the color moving the selectors and see the changes in the preview buttons. + Aldatu kolorea hautagailuak mugituz eta ikusi aldaketak aurrebistako botoietan. + + + + Select a Button to modify it + Aukeratu botoi bat berbera aldatzeko + + + + Main Color + Kolore nagusia + + + + Click on this button to set the edition mode of the main color. + Sakatu botoi hau kolore nagusia aldatzeko. + + + + Contrast Color + Kontraste kolorea + + + + Click on this button to set the edition mode of the contrast color. + Sakatu botoi hau kontraste kolorea aldatzeko. + + + + UndoTool + + + Undo + Desegin + + + + Undo the last modification + Desegin azken aldaketa + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + Flameshot %1 bertsio berria eskuragarri dago + + + + Ignore + Ezikusi + + + + Later + Geroago + + + + Update + Eguneratu + + + + UploadHistory + + + Upload History + Igo historia + + + + Screenshots history is empty + Pantaila-argazkien erregistroa hutsik dago + + + + UploadLineItem + + + Form + Forma + + + + TextLabel + Testu etiketa + + + + Copy URL + Kopiatu URLa + + + + Open In Browser + Ireki nabigatzailean + + + + Confirm to delete + Berretsi ezabatzea + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Ziur pantaila-argazkia azken kargetatik eta zerbitzaritik ezabatu nahi duzula? + + + + UtilityPanel + + + Close + Itxi + + + + <Empty> + <Empty> + + + + VisualsEditor + + + Opacity of area outside selection: + Hautapenaren kanpoko eremuaren opakutasuna : + + + + UI Color Editor + Interfazearen kolorearen editorea + + + + Colorpicker Editor + Kolore-hautatzailea editorea + + + + Button Selection + Botoi-hautaketa + + + + Select All + Hautatu guztiak + + + + color_widgets::ColorDialog + + + Pick + Aukeratu + + + + color_widgets::ColorPalette + + + Unnamed + Izenik gabe + + + + color_widgets::ColorPaletteModel + + + Unnamed + Izenik gabe + + + + %1 (%2 colors) + %1 (%2 kolore) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + Ireki paleta berri bat fitxategitik + + + + + Create a new palette + Sortu paleta berri bat + + + + + Duplicate the current palette + Bikoiztu uneko paleta + + + + + Delete the current palette + Ezabatu uneko paleta + + + + + Revert changes to the current palette + Leheneratu aldaketak uneko paletara + + + + + Save changes to the current palette + Gorde aldaketak uneko paletan + + + + + Add a color to the palette + Gehitu kolore bat paletari + + + + + Remove the selected color from the palette + Kendu hautatutako kolorea paletatik + + + + + New Palette + Paleta berria + + + + + Name + Izena + + + + GIMP Palettes (*.gpl) + GIMP Paletak (*.gpl) + + + + Palette Image (%1) + Paleta Irudia (%1) + + + + All Files (*) + Fitxategi guztiak (*) + + + + + Open Palette + Ireki paleta + + + + Failed to load the palette file +%1 + Ezin izan da paleta fitxategia kargatu +%1 + + + + color_widgets::GradientEditor + + + Add Color + Gehitu kolorea + + + + Remove Color + Kendu kolorea + + + + Edit Color... + Editatu kolorea... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 kolore) + + + + color_widgets::Swatch + + + Clear Color + Kendu kolorea + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_fa.ts b/data/translations/Internationalization_fa.ts new file mode 100644 index 0000000..0a54c48 --- /dev/null +++ b/data/translations/Internationalization_fa.ts @@ -0,0 +1,3163 @@ + + + + + AbstractWidgetList + + + Add New + افزودن جدید + + + + Move Up + جابه‌جایی به بالا + + + + Move Down + جابه‌جایی به پایین + + + + Remove + حذف کردن + + + + AcceptTool + + + Accept + پذیرش + + + + Accept the capture + پذیرش نماگرفت + + + + AppLauncher + + + App Launcher + اجراگر برنامه + + + + Choose an app to open the capture + برنامه‌ای را برای گشودن نماگرفت انتخاب کنید + + + + AppLauncherWidget + + + Open With + گشودن با + + + + Launch in terminal + اجرا در پایانه + + + + Keep open after selection + پس از انتخاب باز بماند + + + + + Error + خطا + + + + Unable to launch in terminal. + عدم توانایی اجرا در پایانه. + + + + Unable to write in + عدم توانایی در نوشتن + + + + ArrowTool + + + Arrow + پیکان + + + + Set the Arrow as the paint tool + تنظیم پیکان به عنوان ابزار نقاشی + + + + BlurTool + + Blur + Desenfocament + + + Set Blur as the paint tool + Estableix el desenfocament com a eina de dibuix + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>حالت نماگرفت</b> + + + + Rectangular Region + ناحیه مستطیلی + + + + Full Screen (Current Display) + تمام صفحه (نمایشگر فعلی) + + + + Full Screen (All Monitors) + تمام صفحه (همه نمایشگرها) + + + + No Delay + بدون تاخیر + + + + second + ثانیه + + + + + + seconds + ثانیه + + + + + Take new screenshot + گرفتن نماگرفت جدید + + + + + Area: + مساحت: + + + + + Capture Launcher + گرفتن اجراگر + + + + + TextLabel + برچسب متنی + + + + + Capture Mode + حالت گرفتن + + + + + Delay: + تاخیر: + + + + + WxH+x+y + WxH+x+y + + + + CaptureWidget + + + Unable to capture screen + Impossible capturar la pantalla + نماگرفت از صفحه امکان پذیر نیست + + + + Mouse + موشواره + + + + Select screenshot area + گزینش ناحیهٔ نماگرفت + + + + Mouse Wheel + چرخ موشواره + + + + Change tool size + تغییر اندازهٔ ابزار + + + + Right Click + کلیک راست + + + + Show color picker + نمایش گزینشگر رنگ + + + + Open side panel + گشودن تابلو کناری + + + + Esc + Esc + + + + Exit + خروج + + + + Quit Capture + دست کشیدن از نماگرفت + + + + Are you sure you want to quit capture? + مطمئنید که می‌خواهید از نماگرفت دست بکشید؟ + + + + Do not show this again + این را دیگر نشان نده + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + تمرکز از Flameshot به جای دیگری منتقل شده. کلید های کیبورد کار نخواهند کرد تا زمانی که روی جایی از این صفحه کلیک کنید. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + خطای تنظیمات رفع شد. `flameshot gui` را اجرا کنید تا تغییرات اعمال شوند. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + ناحیه‌ای را با ماوس انتخاب کنید یا برای خروج Esc را فشار دهید. +برای نماگرفت از صفحه، کلید ورود را فشار دهید. +برای نمایش گزینشگر رنگ، راست کلیک کنید. +از لغزنده ماوس برای تغییر ضخامت ابزار خود استفاده کنید. +برای بازکردن تابلو کناری، کلید فاصله را فشار دهید. + + + + Tool Settings + تنظیمات ابزار + + + + CircleCountTool + + + Circle Counter + شمارنده دایره‌ای + + + + Add an autoincrementing counter bubble + افزودن حباب شمارش با افزایش خودکار + + + + CircleTool + + + Circle + دایره + + + + Set the Circle as the paint tool + تنظیم دایره به عنوان ابزار نقاشی + + + + ColorDialog + + + + Select Color + گزینش رنگ + + + + + Saturation + اشباع + + + + + Hue + فام + + + + + Hex + هگز + + + + + Blue + آبی + + + + + Value + مقدار + + + + + Green + سبز + + + + + Alpha + آلفا + + + + + Red + قرمز + + + + ColorGrabWidget + + + Accept color + پذیرش رنگ + + + + Enter or Left Click + کلید Enter یا کلیک چپ + + + + Precisely select color + گزینش رنگ دقیق + + + + Hold Left Click + نگه داشتن کلیک چپ + + + + Toggle magnifier + تغییر حالت ذره‌بین + + + + Space or Right Click + فاصله یا کلیک راست + + + + Cancel + لغو + + + + Esc + گریز + + + + ColorPickerEditor + + + Edit Preset: + تغییر پیشفرض: + + + + Enter color to update preset + رنگ را وارد کنید تا پیشفرض عوض شود + + + + Update + به‌روز رسانی + + + + Press button to update the selected preset + دکمه را فشار دهید تا پیشفرض انتخاب شده به‌روز شود + + + + Delete + حذف + + + + Press button to delete the selected preset + دکمه را فشار دهید تا پیشفرض انتخاب شده حذف شود + + + + Add Preset: + اضافه کردن رنگ پیشفرض: + + + + Enter color manually or select it using the color-wheel + اضافه کردن دستی رنگ یا انتخاب رنگ با استفاده از چرخ رنگ + + + + Add + افزودن + + + + Press button to add preset + دکمه را فشار دهید تا به رنگهای پیشفرض اضافه شود + + + + + Error + خطا + + + + Unable to add preset. Maximum limit reached. + افزودن به پیشفرض‌ها ممکن نیست. به مقدار حداکثری رسیده. + + + + Unable to remove preset. Minimum limit reached. + حذف کردن از پیشفرض‌ها ممکن نیست. به مقدار حداقلی رسیده. + + + + ConfigErrorDetails + + + Configuration errors + خطاهای پیکربندی + + + + ConfigHandler + + + Unrecognized setting: '%1' + + تنظمیات ناشناخته: '%1' + + + + + Unrecognized shortcut name: '%1'. + + نام میان‌بر ناشناخته:‌ '%1' + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + + + + + Bad value in '%1'. Expected: %2 + + + + + + You have successfully resolved the configuration error. + شما با موفقیت تمام خطاها در پیکربندی را اصلاح کردید. + + + + The configuration contains an error. Open configuration to resolve. + پیکربندی دارای خطا است. پیکربندی را باز کنید تا بتوانید اصلاحشان کنید. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + + + + + ConfigResolver + + + Resolve configuration errors + حل کردن خطاهای پیکربندی + + + + <b>You must resolve all errors before continuing:</b> + <b>شما باید تمام خطاها را پیش از ادامه، حل کنید:</b> + + + + Reset + بازنشانی + + + + Reset to the default value. + به مقدار پیش‌گزیده بازنشانی می‌شود. + + + + Remove + حذف + + + + Remove this setting. + حذف این تنظیمات. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + برخی از میانبرهای صفحه کلید تداخل دارند. +این مانع از شروع flameshot نمی‌شود. +لطفاً آنها را به صورت دستی در فایل پیکربندی حل کنید. + + + + Resolve all + حل کردن همه + + + + Resolve all listed errors. + تمام خطاهای فهرست شده حل می‌شوند. + + + + Details + جزییات + + + + ConfigWindow + + + Configuration + پیکربندی + + + + Interface + رابط کاربری + + + + Filename Editor + ویرایشگر نام پرونده + + + + General + عمومی + + + + Shortcuts + میان‌برها + + + + Resolve + حل کردن + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>پروندهٔ پیکربندی دارای خطاست. پیش از ادامه آن‌ها را حل کنید.</b> + + + + Controller + + New version %1 is available + نگارش جدید %1 در دسترس است + + + You have the latest version + شما آخرین نگارش را دارید + + + Failed to get information about the latest version. + دریافت اطّلاعات درباره آخرین نگارش شکست خورد. + + + Error + خطا + + + Unable to close active modal widgets + ناتوان در بستن ابزارک‌های پرکاربرد فعّال + + + &Open Launcher + &گشودن اجراگر + + + &Configuration + &پیکربندی + + + &About + &درباره + + + Check for updates + بررسی برای به‌روز رسانی‌ها + + + &Latest Uploads + &جدیدترین بارگذاری‌ها + + + URL copied to clipboard. + نشانی به تخته‌گیره رونویسی شد. + + + &Information + &Informació + + + &Quit + &خروج + + + &Take Screenshot + &گرفتن نماگرفت + + + + CopyTool + + + Copy + رونوشت + + + + Copy selection to clipboard + رونویسی محوطهٔ برگزیده به تخته‌گیره + + + Copy the selection into the clipboard + رونوشت گزیده در بُریده‌دان + + + + DBusUtils + + Unable to connect via DBus + عدم توانایی در اتصال به DBus + + + + ExitTool + + + Exit + خروج + + + + Leave the capture screen + ترک صفحهٔ نماگرفت + + + + FileNameEditor + + + Edit the name of your captures: + ویرایش نام نماگرفت‌هایتان: + + + + Edit: + ویرایش: + + + + Preview: + پیش‌نمایش: + + + + Save + ذخیره + + + + Saves the pattern + الگو را ذخیره می‌کند + + + + Restore + بازگردانی + + + Reset + Reinicialitza + + + + Restores the saved pattern + الگوی ذخیره شده را بازمی‌گرداند + + + + Clear + پاک‌کردن + + + + Deletes the name + نام را حذف می‌کند + + + + Flameshot + + + Error + خطا + + + + Unable to close active modal widgets + ناتوان در بستن ابزارک‌های فعّال + + + + URL copied to clipboard. + نشانی در بُریده‌دان ذخیره شد. + + + + FlameshotDaemon + + + New version %1 is available + نگارش جدید %1 در دسترس است + + + + You have the latest version + شما آخرین نگارش را دارید + + + + Failed to get information about the latest version. + دریافت اطّلاعات درباره آخرین نگارش ناموفق بود. + + + + Unable to connect via DBus + عدم توانایی در اتّصال توسط DBus + + + + GeneneralConf + + Show help message + Mostra el missatge d'ajuda + + + Show the help message at the beginning in the capture mode. + Mostra el missatge d'ajuda en iniciar el mode de captura. + + + Show desktop notifications + Mostra les notificacions d'escriptori + + + Show tray icon + Mostra la icona en la barra de tasques + + + Show the systemtray icon + Mostra la icona en la barra de tasques + + + Import + Importar + + + Error + Error + + + Unable to read file. + Impossible llegir el fitxer. + + + Unable to write file. + Impossible escriure al fitxer. + + + Save File + Guardar Arxiu + + + Confirm Reset + Confirmar Reset + + + Are you sure you want to reset the configuration? + Esteu segur que voleu reiniciar la configuració? + + + Configuration File + Fitxer de Configuració + + + Export + Exportar + + + Reset + Reset + + + Launch at startup + Llançament a l'inici + + + + GeneralConf + + + + Import + درون‌ریزی + + + + + + + Error + خطا + + + + Unable to read file. + خواندن پرونده امکان‌پذیر نیست. + + + + + Unable to write file. + نوشتن پرونده امکان پذیر نیست. + + + + Save File + ذخیرهٔ پرونده + + + + Confirm Reset + تأیید بازنشانی + + + + Are you sure you want to reset the configuration? + مطمئنید که می‌خواهید پیکربندی را بازنشانی کنید؟ + + + + Show help message + نمایش پیام راهنما + + + Show the help message at the beginning in the capture mode. + نمایش پیام راهنما در آغاز حالت نماگرفت. + + + + Show the side panel button + نمایش دکمه تابلوی کناری + + + Show the side panel toggle button in the capture mode. + نمایش دکمهٔ تغییر وضعیت تابلوی کناری در حالت نماگرفت. + + + + Show desktop notifications + نمایش آگاهی‌های میزکار + + + + Show tray icon + نمایش آیکون در سینی + + + Show the systemtray icon + نمایش آیکون در سینی سامانه + + + + Confirmation required to delete screenshot from the latest uploads + نیاز به تایید برای حذف نماگرفت از جدیدترین بارگذاری‌ها + + + + Configuration File + پروندهٔ پیکربندی + + + + Export + برون‌ریزی + + + + Reset + بازنشانی + + + + Automatic check for updates + بررسی خودکار برای بروزرسانی‌ها + + + + Allow multiple flameshot GUI instances simultaneously + اجازه دهید چندین نمونه flameshot gui به طور همزمان فعال شوند + + + Automatically close daemon when it is not needed + Automatically close daemon when it is not needed + + + Launch at startup + اجرا در هنگام شروع سامانه + + + Launch Flameshot + اجرای فلیم‌شات + + + + Show welcome message on launch + نمایش پیام خوشامدگویی در هنگام اجرا + + + + Use large predefined color palette + از پالت بزرگ رنگ های پیشفرض استفاده کن + + + + Copy URL after upload + رونویسی از نشانی پس از بارگذاری + + + Copy URL and close window after upload + رونویسی از نشانی و بستن پنجره، پس از بارگذاری + + + + Save image after copy + ذخیره تصویر پس از رونویسی + + + Save image file after copying it + ذخیرهٔ پروندهٔ تصویر پس از رونویسی آن + + + + Show the help message at the beginning in the capture mode + نمایش پیام راهنما در ابتدا در حالت نماگرفت + + + + Use last region for GUI mode + استفاده از آخرین ناحیه برای حالت GUI + + + + Use the last region as the default selection for the next screenshot in GUI mode + استفاده از آخرین ناحیه به عنوان پیش‌گزیده برای نماگرفت بعدی در حالت گرافیکی + + + + Show the side panel toggle button in the capture mode + دکمه‌ی تغییر وضعیت تابلو کناری را در حالت نماگرفت نمایش دهید + + + + Enable desktop notifications + به کار انداختن آگاهی‌های میزکار + + + + Show abort notifications + نمایش اعلان‌های لغو + + + + Enable abort notifications + فعال کردن لغو اعلان‌ها + + + + Show icon in the system tray + نمایش نقشک در سینی سامانه + + + + Use grim to capture screenshots + استفاده از grim برای نماگرفت + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + Grim یک ابزار فقط برای Wayland است که بر اساس پروتکل کپی صفحه نمایش، از صفحه نمایش عکس می‌گیرد. معمولاً فقط روی مدیران پنجره‌های مینیمال Wayland مانند sway، hyprland و غیره فعال می‌شود. + + + + Ask for confirmation to delete screenshot from the latest uploads + درخواست تأیید برای حذف نماگرفت از آخرین آپلودها + + + + Check for updates automatically + بررسی خودکار برای به‌روز رسانی‌‌ها + + + + This allows you to take screenshots of Flameshot itself for example + این به شما امکان می‌دهد برای مثال از خود Flameshot نماگرفت بگیرید + + + Launch Flameshot daemon when computer is booted + Launch Flameshot daemon when computer is booted + + + + Show the welcome message box in the middle of the screen while taking a screenshot + نمایش کادر پیام خوشامدگویی در وسط صفحه هنگام گرفتن نماگرفت + + + + Use a large predefined color palette + از پالت رنگ بزرگ پیشفرض استفاده کنید + + + + Copy on double click + کپی کردن با دوبار کلیک + + + Enable Copy on Double Click + Enable Copy on Double Click + + + Copy URL and close window after uploading was successful + Copy URL and close window after uploading was successful + + + + Automatically unload from memory when it is not needed + تخلیه خودکار از حافظه در صورت عدم نیاز به حظور در حافظه + + + + Automatically close daemon (background process) when it is not needed + بستن خودکار دیمن (فرآیند پس‌زمینه) در صورت عدم نیاز + + + + Launch in background at startup + اجرا در پس‌زمینه در زمان شروع برنامه + + + + Launch Flameshot daemon (background process) when computer is booted + اجرای دیمن Flameshot (فرایند پس‌زمینه) هنگام بوت شدن کامپیوتر + + + + Ask before quit capture + گرفتن تایید قبل از خروج از نماگرفت + + + + Show the confirmation prompt before ESC quit + نمایش اعلان تأیید قبل از خروج + + + + Enable Copy to clipboard on Double Click + فعال کردن کپی در بُریده‌دان با دوبار کلیک + + + + Copy URL after uploading was successful + پس از آپلود موفقیت‌آمیز، نشانی اینترنتی (URL) را کپی کنید + + + + After copying the screenshot, save it to a file as well + پس از کپی کردن نماگرفت، آن را در یک فایل نیز ذخیره کن + + + + Save Path + ذخیره مسیر + + + + Change... + تغییر... + + + + Use fixed path for screenshots to save + استفاده از مسیر ثابت برای ذخیرهٔ نماگرفت‌ها + + + + Preferred save file extension: + پسوند ترجیحی ذخیرهٔ پرونده: + + + + Latest Uploads Max Size + بیشینهٔ اندازهٔ جدیدترین بارگذاری‌ها + + + + Imgur Application Client ID + + + + + Undo limit + محدودیت برگرداندن + + + + Use JPG format for clipboard (PNG default) + استفاده از قالب JPG برای تخته‌گیره (پیش‌گزیده PNG) + + + + Use lossy JPG format for clipboard (lossless PNG default) + + + + + Copy file path after save + رونویسی از مسیر پرونده پس از ذخیره + + + + Copy the file path to clipboard after the file is saved + + + + + Anti-aliasing image when zoom the pinned image + + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + + + + + + Upload image without confirmation + بارگذاری تصویر بدون تأییدیه + + + + Choose a Folder + گزینش یک شاخه + + + + Unable to write to directory. + نوشتن در شاخه امکان پذیر نیست. + + + + Show magnifier + نمایش ذرّه‌بین + + + + Enable a magnifier while selecting the screenshot area + فعال کردن ذره‌بین زمانی که ناحیه ی نماگرفت انتخاب میشود + + + + Square shaped magnifier + ذره‌بین مربع شکل + + + + Make the magnifier to be square-shaped + تبدیل ذره‌بین به مربعی شکل + + + + Milliseconds before geometry display hides; 0 means do not hide + + + + + Set geometry display timeout (ms) + + + + + Selection Geometry Display + + + + + Display Location + مکان نمایش + + + + None + هیچ کجا + + + + Top Left + بالا چپ + + + + Top Right + بالا راست + + + + Bottom Left + پایین چپ + + + + Bottom Right + پایین راست + + + + Center + مرکز + + + + Quality range of 0-100; Higher number is better quality and larger file size + + + + + JPEG Quality + کیفیت JPEG + + + + Reverse arrow + پیکان معکوس + + + + Draw the arrow head first + کشیدن سر پیکان در ابتدا + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + جدیدترین بارگذاری‌ها + + + Screenshots history is empty + تاریخچه نماگرفت، خالی است + + + Copy URL + رونویسی نشانی + + + URL copied to clipboard. + نشانی به تخته‌گیره رونویسی شد. + + + Open in browser + گشودن در مرورگر + + + Confirm to delete + تأیید برای حذف + + + Are you sure you want to delete a screenshot from the latest uploads and server? + آیا مطمئنید که می‌خواهید نماگرفت را از جدیدترین بارگذاری‌ها و کارساز حذف کنید؟ + + + + ImgS3Uploader + + Uploading Image + S'està pujant la imatge + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Error + Error + + + + ImgUploadDialog + + + Upload Confirmation + تأییدیهٔ بارگذاری + + + + Do you want to upload this capture? + آیا می‌خواهید این نماگرفت را بارگذاری کنید؟ + + + + + Upload without confirmation + بارگذاری بدون تأییدیه + + + + ImgUploader + + Uploading Image + S'està pujant la imatge + + + Delete image + Esborra la imatge + + + Unable to open the URL. + No es pot obrir l'URL. + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + Copy URL + Copia l'URL + + + Open URL + Obri l'URL + + + Image to Clipboard. + Imatge al porta-retalls. + + + + ImgUploaderBase + + + Upload image + بارگذاری تصویر + + + + Uploading Image + در حال بارگذاری تصویر + + + + Copy URL + رونویسی نشانی + + + + Open URL + گشودن نشانی + + + + Delete image + حذف تصویر + + + + Image to Clipboard. + تصویر در تخته‌گیره. + + + + Save image + ذخیرهٔ تصویر + + + + Unable to open the URL. + نمی‌توان نشانی را گشود. + + + + URL copied to clipboard. + نشانی در تخته‌گیره رونویسی شد. + + + + Screenshot copied to clipboard. + نماگرفت در تخته‌گیره رونویسی شد. + + + + Unable to save the screenshot to disk. + ناتوان در ذخیرهٔ نماگرفت در دیسک. + + + + Screenshot saved. + نماگرفت ذخیره شد. + + + + ImgUploaderTool + + + Image Uploader + بارگذار تصویر + + + + Upload the selection + بارگذاری محوطهٔ برگزیده + + + + ImgurUploader + + Upload to Imgur + بارگذاری به Imgur + + + Uploading Image + در حال بارگذاری تصویر + + + Copy URL + رونوشت نشانی + + + Open URL + گشودن نشانی + + + Delete image + حذف تصویر + + + Image to Clipboard. + تصویر به بُریده‌دان. + + + + Unable to open the URL. + گشودن نشانی امکان پذیر نیست. + + + URL copied to clipboard. + نشانی به بُریده‌دان رونوشت شد. + + + Screenshot copied to clipboard. + نماگرفت به بُریده‌دان رونوشت شد. + + + + ImgurUploaderTool + + Image Uploader + بارگذار تصویر + + + Upload the selection to Imgur + بارگذاری گزیده به Imgur + + + + InfoWindow + + + + About + درباره + + + + + Icon + نقشک + + + + + License + پروانه + + + + + GPLv3+ + نگارش ۳ یا بالاتر جی‌پی‌ال + + + + + Version + نگارش + + + + + Flameshot v + فلیم‌شات ن + + + + + OS Info + اطّلاعات سیستم‌عامل + + + + + Copy Info + رونوشت از اطّلاعات + + + Right Click + Clic dret + + + Mouse Wheel + Roda del ratolí + + + Move selection 1px + Mou la selecció 1 px + + + Resize selection 1px + Redimensiona la selecció 1 px + + + Quit capture + Ix de la captura + + + Copy to clipboard + Copia al porta-retalls + + + Save selection as a file + Guarda la selecció com a fitxer + + + Undo the last modification + Desfés l'última modificació + + + Show color picker + Mostra el selector de color + + + Change the tool's thickness + Canvia el gruix de l'eina + + + Key + Tecla + + + Description + Descripció + + + <u><b>License</b></u> + <u><b>پروانه</b></u> + + + <u><b>Version</b></u> + <u><b>نگارش</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Dreceres</b></u> + + + Available shortcuts in the screen capture mode. + Dreceres disponibles en el mode de captura de pantalla. + + + + InvertTool + + + Invert + وارونگر + + + + Set Inverter as the paint tool + تنظیم وارونگر به عنوان ابزار نقاشی + + + + LineTool + + + Line + خط + + + + Set the Line as the paint tool + تنظیم خط به عنوان ابزار نقاشی + + + + MarkerTool + + + Marker + نشانه‌گذار + + + + Set the Marker as the paint tool + تنظیم نشانه‌گذار به عنوان ابزار نقاشی + + + + MoveTool + + + Move + جابه‌جایی + + + + Move the selection area + جابه‌جایی محوطه گزیده شده + + + + PencilTool + + + Pencil + مداد + + + + Set the Pencil as the paint tool + تنظیم مداد به عنوان ابزار نقاشی + + + + PinTool + + + Pin Tool + ابزار سنجاق + + + + Pin image on the desktop + سنجاق کردن تصویر بر روی میزکار + + + + PinWidget + + + Context menu + Context menu + + + + Copy to clipboard + ذخیره در بُریده‌دان + + + + Save to file + Save to file + + + + Rotate Right + چرخش به راست + + + + Rotate Left + چرخش به چپ + + + + Increase Opacity + کاهش شفافیت + + + + Decrease Opacity + افزایش شفافیت + + + + Close + بستن + + + + PixelateTool + + + Pixelate + شطرنجی + + + + Set Pixelate as the paint tool. + + + + Set Pixelate as the paint tool + تنظیم شطرنجی به عنوان ابزار نقاشی + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QHotkey + + Failed to register %1. Error: %2 + شکست در ثبت %1. خطا: %2 + + + Failed to unregister %1. Error: %2 + شکست در لغو ثبت %1. خطا: %2 + + + + QObject + + + + Capture saved to clipboard. + نماگرفت در تخته‌گیره ذخیره شد. + + + + Error while saving to clipboard + خطا هنگام ذخیره در تخته‌گیره + + + + Save screenshot + ذخیرهٔ نماگرفت + + + + Path copied to clipboard as + مسیر در تخته‌گیره رونویسی شد به عنوان + + + Saving canceled + ذخیره کردن لغو شد + + + Save canceled + ذخیره لغو شد + + + Capture is saved and copied to the clipboard as + نماگرفت ذخیره شد و در بُریده‌دان رونوشت شد به عنوان + + + + Save Error + ذخیره خطا + + + + + Capture saved as + نماگرفت ذخیره شد با نام + + + + + Error trying to save as + خطا هنگام تلاش برای ذخیره به عنوان + + + + Unable to connect via DBus + عدم توانایی در اتّصال به DBus + + + + Powerful yet simple to use screenshot software. + نرم‌افزار نماگرفتی قدرتمند و در عین حال، ساده. + + + + See + دیدن + + + Capture the entire desktop. + نماگرفت از کل میزکار. + + + + Open the capture launcher. + گشودن اجراگر نماگرفت. + + + + Start a manual capture in GUI mode. + شروع نماگرفت دستی در حالت GUI. + + + + Configure + پیکربندی + + + Capture a single screen. + نماگرفت از یک صفحه. + + + Path where the capture will be saved + مسیری که نماگرفت در آن ذخیره خواهد شد + + + + Capture screenshot of all monitors at the same time. + + + + + Capture a screenshot of the specified monitor. + + + + + Existing directory or new file to save to + شاخهٔ موجود یا پروندهٔ جدید برای ذخیره + + + + Save the capture to the clipboard + ذخیرهٔ نماگرفت در تخته‌گیره + + + + Pin the capture to the screen + سنجاق کردن نماگرفت در صفحه + + + + Upload screenshot + بارگذاری نماگرفت + + + + Delay time in milliseconds + زمان تاخیر به میلی‌ثانیه + + + + Repeat screenshot with previously selected region + Repeat screenshot with previously selected region + + + + Screenshot region to select + منطقهٔ نماگرفت برای گزینش + + + + Set the filename pattern + تنظیم الگوی نام پرونده + + + + Accept capture as soon as a selection is made + پذیرش گرفتن به محض ایجاد یک گزینش + + + + Enable or disable the trayicon + فعّال یا غیرفعّال کردن نقشک در سینی + + + + Enable or disable run at startup + فعّال یا غیرفعّال کردن اجرا هنگام شروع سامانه + + + + Enable or disable the notifications + + + + + Check the configuration for errors + پیکربندی را برای وجود خطاها بررسی کنید + + + + Show the help message in the capture mode + نمایش پیام راهنما در حالت نماگرفت + + + + Define the main UI color + تعریف رنگ اصلی رابط کاربری + + + + Define the contrast UI color + تعریف رنگ متضاد رابط کاربری + + + + Print raw PNG capture + چاپ نماگرفت PNG خام + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + مختصات گزیده را در قالب «WxH+X+Y» چاپ می‌کند. اگر چیزی مشخص نشده باشد، هیچ کاری انجام نمی‌دهد + + + + Define the screen to capture (starting from 0) + صفحه را برای نماگرفت مشخص کنید (از ۰ شروع می‌شود) + + + + Invalid delay, it must be a number greater than 0 + تأخیر نامعتبر است، مقدار باید یک عدد بزرگ‌تر از ۰ باشد + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + منطقهٔ نامعتبر، از «⁦WxH+X+Y⁩» یا «⁦all⁩» یا «⁦screen0/screen1/...⁩» استفاده کنید. + + + + Invalid path, must be an existing directory or a new file in an existing directory + مسیر نامعتبر است، باید یک شاخهٔ موجود یا یک پروندهٔ جدید در یک شاخهٔ موجود باشد + + + Define the screen to capture + صفحه را برای نماگرفت مشخص کنید + + + + default: screen containing the cursor + پیش‌گزیده: صفحه شامل اشاره‌گر + + + + Screen number + شمارهٔ صفحه + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + رنگ نامعتبر، این پرچم از قالب‌های زیر پشتیبانی می‌کند: +- #RGB (هر یک از R، G و B یک رقم هگز هستند) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- رنگ‌های نامگذاری شده مانند "blue" یا "red" +ممکن است لازم باشد از علامت "#" مانند "‎\#FFF" فرار کنید + + + Invalid delay, it must be higher than 0 + تأخیر نامعتبر است، مقدار باید بیشتر از 0 باشد + + + + Invalid screen number, it must be non negative + شماره صفحه نامعتبر است، باید مثبت باشد + + + Invalid path, it must be a real path in the system + مسیر نامعتبر است، باید یک مسیر واقعی در سامانه باشد + + + + Invalid value, it must be defined as 'true' or 'false' + مقدار نامعتبر است، باید به عنوان «true» یا «false» تعریف شود + + + + Error + خطا + + + + Unable to write in + نوشتن امکان پذیر نیست + + + URL copied to clipboard. + نشانی به بُریده‌دان رونوشت شد. + + + + Options + گزینه‌ها + + + Arguments + آرگومان‌ها + + + arguments + آرگومان‌ها + + + + Subcommands + + + + + subcommands + + + + + Usage + کارکرد + + + + options + گزینه‌ها + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + به صورت پیش‌گزیده فلیم‌شات را در پس‌زمینه اجرا و نماد سینی را برای پیکربندی اضافه می‌کند. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + سلام من اینجام! برای گرفتن نماگرفت روی نقشک برنامه در سینی کلیک یا برای مشاهده گزینه‌های بیشتر کلیک راست کنید. + + + + Requested screen exceeds screen count + + + + + Full screen screenshot pinned to screen + نماگرفت تمام‌صفحه در صفحه سنجاق شد + + + Toggle side panel + تغییر وضعیت تابلو کناری + + + Resize selection left 1px + تغییر اندازه محوطه گزیده شده 1 پیکسل به چپ + + + Resize selection right 1px + تغییر اندازه محوطه گزیده شده 1 پیکسل به راست + + + Resize selection up 1px + تغییر اندازه محوطه گزیده شده 1 پیکسل به بالا + + + Resize selection down 1px + تغییر اندازه محوطه گزیده شده 1 پیکسل به پایین + + + Select entire screen + گزینش کل صفحه + + + Move selection left 1px + جابه‌جایی محوطه گزیده شده 1 پیکسل به چپ + + + Move selection right 1px + جابه‌جایی محوطه گزیده شده 1 پیکسل به راست + + + Move selection up 1px + جابه‌جایی محوطه گزیده شده 1 پیکسل به بالا + + + Move selection down 1px + جابه‌جایی محوطه گزیده شده 1 پیکسل به پایین + + + Commit text in text area + متن ثبت در ناحیهٔ متنی + + + Delete current tool + حذف ابزار فعلی + + + + Quit capture + خروج از نماگرفت + + + + Screenshot history + تاریخچهٔ نماگرفت + + + + Capture screen + نماگرفت از صفحه + + + + Show color picker + نمایش گزینشگر رنگ + + + + Change the tool's size + تغییر اندازهٔ ابزار + + + Change the tool's thickness + تغییر ضخامت ابزارها + + + + RectangleTool + + + Rectangle + مستطیل + + + + Set the Rectangle as the paint tool + تنظیم مستطیل به عنوان ابزار نقاشی + + + + RedoTool + + + Redo + انجام دوباره + + + + Redo the next modification + انجام دوباره تغییر بعدی + + + + SaveTool + + + Save + ذخیره + + + + Save screenshot to a file + ذخیرهٔ نماگرفت در یک پرونده + + + Save the capture + ذخیره نماگرفت + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + آداپتور ضبط صفحه نمایش جهانی wayland به Grim به عنوان کامپوننت ضبط صفحه wayland نیاز دارد. اگر کامپوننت ضبط صفحه نمایش وجود ندارد، لطفاً آن را نصب کنید! + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + اگر تنظیم useGrimAdapter فعال نباشد، از پروتکل DBus استفاده خواهد شد. لازم به ذکر است که استفاده از پروتکل DBus در Wayland توصیه نمی‌شود. توصیه می‌شود تنظیم useGrimAdapter را در flameshot.ini فعال کنید تا آداپتور تصویر عمومی Wayland مبتنی بر grim فعال شود + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + کامپوننت اسکرین‌شات گریم بر اساس wlroots پیاده‌سازی شده است، ممکن است در گنوم یا محیط‌های دسکتاپ مشابه استفاده نشود + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + قادر به شناسایی محیط دسکتاپ (GNOME؟ KDE؟ Qile؟ Sway؟ ...) نیست + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + نکته: سعی کنید متغیر محیطی XDG_CURRENT_DESKTOP را تنظیم کنید. + + + + Unable to capture screen + نماگرفت از صفحه امکان پذیر نیست + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + گزینش مستطیلی + + + + Set Selection as the paint tool + تنظیم گزینش مستطیلی به عنوان ابزار نقاشی + + + + SetShortcutDialog + + + Set Shortcut + تنظیم میان‌بر + + + + Enter new shortcut to change + ورود میان‌بر جدید برای تغییر + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + برای لغو Esc را فشار دهید یا برای غیرفعال کردن میان‌بر صفحه‌کلید ‎⌘+Backspace را فشار دهید. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + برای لغو Esc را فشار دهید یا برای غیرفعّال کردن میان‌بر صفحه‌کلید Backspace را فشار دهید. + + + + + Flameshot must be restarted for changes to take effect. + برای اعمال تغییرات، فلیم‌شات باید راه‌اندازی مجدد شود. + + + + ShortcutsWidget + + + Hot Keys + کلیدهای داغ + + + + Available shortcuts in the screen capture mode. + میان‌برهایی که در حالت نماگرفت از صفحه در دسترس هستند. + + + + Description + توضیح + + + + Key + کلید + + + + Left Double-click + دوبار کلیک + + + + Toggle side panel + تغییر وضعیت تابلو کناری + + + + Grab a color from the screen + + + + + Resize selection left 1px + تغییر اندازه محوطه گزیده شده 1 پیکسل به چپ + + + + Resize selection right 1px + تغییر اندازه محوطه گزیده شده 1 پیکسل به راست + + + + Resize selection up 1px + تغییر اندازه محوطه گزیده شده 1 پیکسل به بالا + + + + Resize selection down 1px + تغییر اندازه محوطه گزیده شده 1 پیکسل به پایین + + + + Symmetrically decrease width by 2px + + + + + Symmetrically increase width by 2px + + + + + Symmetrically increase height by 2px + + + + + Symmetrically decrease height by 2px + + + + + Select entire screen + انتخاب تمام صفحه + + + + Move selection left 1px + جابه‌جایی محوطه گزیده شده 1 پیکسل به چپ + + + + Move selection right 1px + جابه‌جایی محوطه گزیده شده 1 پیکسل به راست + + + + Move selection up 1px + جابه‌جایی محوطه گزیده شده 1 پیکسل به بالا + + + + Move selection down 1px + جابه‌جایی محوطه گزیده شده 1 پیکسل به پایین + + + + Commit text in text area + ثبت متن در ناحیهٔ متنی + + + + Delete selected drawn object + شیء ترسیم شده انتخاب شده را حذف کنید + + + + Cancel current selection + لغو انتخاب فعلی + + + Delete current tool + حذف ابزار فعلی + + + + Capture screen + نماگرفت از صفحه + + + + Screenshot history + تاریخچهٔ نماگرفت + + + + SidePanelWidget + + Active thickness: + ضخامت فعال: + + + Active color: + رنگ فعال: + + + Press ESC to cancel + برای لغو کلید ESC را فشار دهید + + + + Active tool size: + اندازهٔ ابزار فعّال: + + + + Active Color: + رنگ فعّال: + + + + Grab Color + گرفتن رنگ + + + + Display grid + نمایش grid + + + + SizeDecreaseTool + + + Decrease Tool Size + کاهش اندازهٔ ابزار + + + + Decrease the size of the other tools + کاهش اندازهٔ سایر ابزارها + + + + SizeIncreaseTool + + + Increase Tool Size + افزایش اندازهٔ ابزار + + + + Increase the size of the other tools + افزایش اندازهٔ سایر ابزارها + + + + SizeIndicatorTool + + Selection Size Indicator + نشانگر اندازهٔ گزینش + + + Show X and Y dimensions of the selection + نمایش ابعاد X و Y قسمت برگزیده + + + Show the dimensions of the selection (X Y) + نمایش ابعاد گزیده (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + قرن (00-99) + + + + Year (00-99) + سال (00-99) + + + + Year (2000) + سال (2000) + + + + Month Name (jan) + نام ماه (jan) + + + + Month Name (january) + نام ماه (january) + + + + Month (01-12) + ماه (01-12) + + + + Week Day (1-7) + روز هفته (1-7) + + + + Week (01-53) + هفته (01-53) + + + + Day Name (mon) + نام روز (mon) + + + + Day Name (monday) + نام روز (monday) + + + + Day (01-31) + روز (01-31) + + + + Day of Month (1-31) + روز در ماه (1-31) + + + + Day (001-366) + روز (001-366) + + + + Hour (00-23) + ساعت (00-23) + + + + Hour (01-12) + ساعت (01-12) + + + + Minute (00-59) + دقیقه (00-59) + + + + Second (00-59) + ثانیه (00-59) + + + + Full Date (%m/%d/%y) + تاریخ کامل (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + تاریخ کامل (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + + + + + Time (%H-%M-%S) + زمان (%H-%M-%S) + + + + Time (%H-%M) + زمان (%H-%M) + + + + SystemNotification + + + Flameshot Info + اطّلاعات فلیم‌شات + + + + TextConfig + + + StrikeOut + خط‌خورده + + + + Underline + زیرخط + + + + Bold + ضخیم + + + + Italic + مورب + + + + Left Align + تراز چپ + + + + Center Align + تراز وسط + + + + Right Align + تراز راست + + + + TextTool + + + Text + متن + + + + Add text to your capture + افزودن متن به نماگرفتتان + + + + TrayIcon + + + &Take Screenshot + &گرفتن نماگرفت + + + + &Open Launcher + &گشودن اجراگر + + + + &Configuration + &پیکربندی + + + + &About + &درباره نرم‌افزار + + + + Check for updates + بررسی برای به‌روز رسانی‌ + + + + New version %1 is available + نگارش جدید %1 در دسترس است + + + + &Quit + &خروج + + + + &Latest Uploads + &آخرین بارگذاری‌ها + + + + &Open Save Path + + + + + UIcolorEditor + + UI Color Editor + ویرایشگر رنگ رابط کاربری + + + + Change the color moving the selectors and see the changes in the preview buttons. + برای تغییر رنگ، گزینشگرها را جابه‌جا کنید و تغییرات را در دکمه‌های پیش‌نمایش مشاهده کنید. + + + + Select a Button to modify it + دکمه‌ای را برای تغییرش برگزینید + + + + Main Color + رنگ اصلی + + + + Click on this button to set the edition mode of the main color. + برای رفتن به حالت ویرایش رنگ اصلی، روی این دکمه کلیک کنید. + + + + Contrast Color + رنگ متضاد + + + + Click on this button to set the edition mode of the contrast color. + برای رفتن به حالت ویرایش رنگ متضاد، روی این دکمه کلیک کنید. + + + + UndoTool + + + Undo + برگردان + + + + Undo the last modification + برگرداندن آخرین تغییر + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + نگارش جدید فلیم‌شات %1 در دسترس است + + + + Ignore + نادیده گرفتن + + + + Later + بعداً + + + + Update + به‌روز رسانی + + + + UploadHistory + + + Upload History + بارگذاری تاریخچه + + + + Screenshots history is empty + تاریخچهٔ نماگرفت خالیست + + + + UploadLineItem + + + Form + فرم + + + + TextLabel + برچسب متنی + + + + Copy URL + رونوشت از نشانی + + + + Open In Browser + گشودن در مرورگر + + + + Confirm to delete + تأیید برای حذف + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + مطمئنید که می‌خواهید نماگرفتی را از جدیدترین بارگذاری‌ها و کارساز حذف کنید؟ + + + + UtilityPanel + + + Close + بستن + + + + <Empty> + <خالی> + + + + VisualsEditor + + + Opacity of area outside selection: + کدری مناطق خارج از محوطهٔ گزیده شده: + + + + UI Color Editor + ویرایشگر رنگ رابط کاربری + + + + Colorpicker Editor + ویرایشگر گزینشگر رنگ + + + + Button Selection + گزینش دکمه + + + + Select All + گزینش همه + + + + color_widgets::ColorDialog + + + Pick + برگزیدن + + + + color_widgets::ColorPalette + + + Unnamed + بی‌نام + + + + color_widgets::ColorPaletteModel + + + Unnamed + بی‌نام + + + + %1 (%2 colors) + %1 (%2 رنگ) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + گشودن یک تخته‌رنگ جدید از پرونده + + + + + Create a new palette + ایجاد یک تخته‌رنگ جدید + + + + + Duplicate the current palette + تکرار تخته‌رنگ کنونی + + + + + Delete the current palette + حذف تخته‌رنگ کنونی + + + + + Revert changes to the current palette + مرجوع کردن تغییرات در تخته‌رنگ کنونی + + + + + Save changes to the current palette + ذخیرهٔ تغییرات در تخته‌رنگ کنونی + + + + + Add a color to the palette + افزودن یک رنگ به تخته‌رنگ + + + + + Remove the selected color from the palette + برداشتن رنگ گزیده شده از تخته‌رنگ + + + + + New Palette + تخته‌رنگ جدید + + + + + Name + نام + + + + GIMP Palettes (*.gpl) + تخته‌رنگ گیمپ (‎*.gpl) + + + + Palette Image (%1) + تصویر تخته‌رنگ (%1) + + + + All Files (*) + همهٔ پرونده‌ها (*) + + + + + Open Palette + گشودن تخته‌رنگ + + + + Failed to load the palette file +%1 + بار کردن پروندهٔ تخته‌رنگ شکست خورد +%1 + + + + color_widgets::GradientEditor + + + Add Color + افزودن رنگ + + + + Remove Color + برداشتن رنگ + + + + Edit Color... + ویرایش رنگ... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 رنگ) + + + + color_widgets::Swatch + + + Clear Color + پاک‌کردن رنگ + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_fi.ts b/data/translations/Internationalization_fi.ts new file mode 100644 index 0000000..6cbd119 --- /dev/null +++ b/data/translations/Internationalization_fi.ts @@ -0,0 +1,3169 @@ + + + + + AbstractWidgetList + + + Add New + Lisää uusi + + + + Move Up + Siirrä ylös + + + + Move Down + Siirrä alas + + + + Remove + Poista + + + + AcceptTool + + + Accept + Hyväksy + + + + Accept the capture + Hyväksy kaappaus + + + + AppLauncher + + + App Launcher + Sovelluskäynnistin + + + + Choose an app to open the capture + Valitse sovellus jossa kaappaus avataan + + + + AppLauncherWidget + + + Open With + Avaa sovelluksella + + + + Launch in terminal + Käynnistä päätteessä + + + + Keep open after selection + Pidä avoinna valinnan jälkeen + + + + + Error + Virhe + + + + Unable to launch in terminal. + Käynnistäminen päätteessä ei onnistunut. + + + + Unable to write in + Ei voitu kirjoittaa kohteeseen + + + + ArrowTool + + + Arrow + Nuoli + + + + Set the Arrow as the paint tool + Aseta nuoli työkalu + + + + BlurTool + + Blur + Desenfocament + + + Set Blur as the paint tool + Estableix el desenfocament com a eina de dibuix + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Kaappaustila</b> + + + + Rectangular Region + Suorakulmiomainen alue + + + + Full Screen (Current Display) + Koko näyttö (nykyinen näyttö) + + + + Full Screen (All Monitors) + Koko näyttö (kaikki näytöt) + + + + No Delay + Ei viivettä + + + + second + sekunti + + + + + + seconds + sekuntia + + + + + Take new screenshot + Ota uusi kaappaus + + + + + Area: + Alue: + + + + + Capture Launcher + Kaappauksen laukaisija + + + + + TextLabel + Tekstinimi + + + + + Capture Mode + Kaappaustila + + + + + Delay: + Viive: + + + + + WxH+x+y + LxK+x+y + + + + CaptureWidget + + + Unable to capture screen + Impossible capturar la pantalla + Kaappaaminen ei onnistunut + + + + Mouse + Hiiri + + + + Select screenshot area + Valitse kaappauksen alue + + + + Mouse Wheel + Hiiren rulla + + + + Change tool size + Vaihda työkalun kokoa + + + + Right Click + Hiiren oikea näppäin + + + + Show color picker + Näytä värivalitsin + + + + Open side panel + Avaa sivupaneeli + + + + Esc + Esc + + + + Exit + Poistu + + + + Quit Capture + Lopeta tallennus + + + + Are you sure you want to quit capture? + + + + + Do not show this again + + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot menetti kohdistuksen. Pikanäppäimet eivät toimi, ennen kuin napsautat jotain kohtaa. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + Määritysvirhe ratkaistu. Käynnistä "flameshot gui" uudelleen ottaaksesi sen käyttöön. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Valitse alue hiirellä, tai paina Esc poistuaksesi. +Paina Enter kaapataksesi näytön sisällön. +Paina hiiren oikeaa näppäintä avataksesi värivalitsimen. +Käytä hiiren rullaa muuttaaksesi työkalun paksuutta. +Paina väliyöntiä avataksesi sivupaneelin. + + + + Tool Settings + Työkalun asetukset + + + + CircleCountTool + + + Circle Counter + Ympyrä laskuri + + + + Add an autoincrementing counter bubble + Lisää laskurikupla, automaattisesti kasvava + + + + CircleTool + + + Circle + Ympyrä + + + + Set the Circle as the paint tool + Aseta ympyrä työkalu + + + + ColorDialog + + + + Select Color + Valitse väri + + + + + Saturation + Kylläisyys + + + + + Hue + Värisävy + + + + + Hex + Heksa + + + + + Blue + Sininen + + + + + Value + Arvo + + + + + Green + Vihreä + + + + + Alpha + Alpha + + + + + Red + Punainen + + + + ColorGrabWidget + + + Accept color + Hyväksy väri + + + + Enter or Left Click + Enter tai hiiren vasen painike + + + + Precisely select color + Valitse tarkka väri + + + + Hold Left Click + Pidä hiiren vasen painettuna + + + + Toggle magnifier + Suurennuslasi päällä/pois + + + + Space or Right Click + Välilyönti tai hiiren oikea + + + + Cancel + Peruuta + + + + Esc + Esc + + + + ColorPickerEditor + + Select Preset: + Valitse esiasetus: + + + + Edit Preset: + Muokkaa asetusta: + + + + Enter color to update preset + Anna väri päivittääksesi asetuksen + + + + Update + Päivitä + + + + Press button to update the selected preset + Paina painiketta päivittääksesi valitun asetuksen + + + + Delete + Poista + + + + Press button to delete the selected preset + Paina painiketta poistaaksesi valitun esiasetuksen + + + + Add Preset: + Lisää esiasetus: + + + + Enter color manually or select it using the color-wheel + Määritä väri manuaalisesti tai valitse se väripyörää käyttäen + + + + Add + Lisää + + + + Press button to add preset + Paina painiketta lisätäksesi esiasetuksen + + + + + Error + Virhe + + + + Unable to add preset. Maximum limit reached. + Esiasetuksen lisääminen ei onnistu. Enimmäisraja saavutettu. + + + + Unable to remove preset. Minimum limit reached. + Asetusta ei voida poistaa. Minimiraja saavutettu. + + + + ConfigErrorDetails + + + Configuration errors + Määritysvirheet + + + + ConfigHandler + + + Unrecognized setting: '%1' + + Tunnistamaton asetus: '%1' + + + + + Unrecognized shortcut name: '%1'. + + Tuntematon pikanäppäimen nimi: "%1". + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + Pikanäppäimen ristiriita: "%1" ja "%2" on sama näppäin: %3 + + + + + Bad value in '%1'. Expected: %2 + + Virheellinen arvo "%1". Odotettu: %2 + + + + + You have successfully resolved the configuration error. + Olet ratkaissut määritysvirheen. + + + + The configuration contains an error. Open configuration to resolve. + Määritys sisältää virheen. Avaa määritykset ja korjaa. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + Virheellinen asetusavain "%1" ConfigHandler:ssa. Ilmoita tämä virhe. + + + + ConfigResolver + + + Resolve configuration errors + Selvitä määritysvirheet + + + + <b>You must resolve all errors before continuing:</b> + <b>Selvitä kaikki virheet ennen jatkamista:</b> + + + + Reset + Nollaa + + + + Reset to the default value. + Palauta oletusarvoon. + + + + Remove + Poista + + + + Remove this setting. + Poista tämä asetus. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + Joissakin pikanäppäimissä on ristiriitoja. +Tämä ei estä flameshot-ohjelmaa käynnistymästä. +Ratkaise ne käsin muuttamalla asetustiedostoa. + + + + Resolve all + Selvitä kaikki + + + + Resolve all listed errors. + Selvitä kaikki listatut virheet. + + + + Details + Yksityiskohdat + + + + ConfigWindow + + + Configuration + Asetukset + + + + Interface + Käyttöliittymä + + + + Filename Editor + Tiedostonimen muokkain + + + + General + Yleiset + + + + Shortcuts + Pikanäppäimet + + + + Resolve + Selvitä + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>Asetustiedostossa on virheitä. Selvitä virheet ennen jatkamista.</b> + + + + Controller + + New version %1 is available + Uusi versio %1 on saatavilla + + + You have the latest version + Sinulla on uusin versio + + + Failed to get information about the latest version. + Uusimman version tietojen saaminen epäonnistui. + + + Error + Virhe + + + Unable to close active modal widgets + Aktiivisia modaalisia widgettejä ei voi sulkea + + + &Open Launcher + &Avaa käynnistin + + + &Configuration + &Asetukset + + + &About + &Tietoja + + + Check for updates + Tarkista päivitykset + + + &Latest Uploads + &Viimeisimmät lähetykset + + + URL copied to clipboard. + URL-osoite kopioitu leikepöydälle. + + + &Information + &Informació + + + &Quit + &Lopeta + + + &Take Screenshot + &Ota kuvakaappaus + + + + CopyTool + + + Copy + Kopioi + + + + Copy selection to clipboard + Kopioi valinta leikepöydälle + + + Copy the selection into the clipboard + Kopioi valinta leikepöydälle + + + + DBusUtils + + Unable to connect via DBus + DBusiin yhdistäminen ei onnistunut + + + + ExitTool + + + Exit + Poistu + + + + Leave the capture screen + Poistu kaappauksesta + + + + FileNameEditor + + + Edit the name of your captures: + Muokkaa kaappausten nimiä: + + + + Edit: + Muokkaa: + + + + Preview: + Esikatselu: + + + + Save + Tallenna + + + + Saves the pattern + Tallentaa kaavan + + + + Restore + Palauta + + + Reset + Reinicialitza + + + + Restores the saved pattern + Palauttaa tallennetun kaavan + + + + Clear + Tyhjennä + + + + Deletes the name + Poistaa nimen + + + + Flameshot + + + Error + Error + + + + Unable to close active modal widgets + Aktiivisia modaalisia widgettejä ei voi sulkea + + + + URL copied to clipboard. + URL-osoite kopioitu leikepöydälle. + + + + FlameshotDaemon + + + New version %1 is available + Uusi versio %1 on saatavilla + + + + You have the latest version + Sinulla on uusin versio + + + + Failed to get information about the latest version. + Uusimman version tietojen saaminen epäonnistui. + + + + Unable to connect via DBus + Yhdistäminen DBusin kautta ei onnistunut + + + + GeneneralConf + + Show help message + Mostra el missatge d'ajuda + + + Show the help message at the beginning in the capture mode. + Mostra el missatge d'ajuda en iniciar el mode de captura. + + + Show desktop notifications + Mostra les notificacions d'escriptori + + + Show tray icon + Mostra la icona en la barra de tasques + + + Show the systemtray icon + Mostra la icona en la barra de tasques + + + Import + Importar + + + Error + Error + + + Unable to read file. + Impossible llegir el fitxer. + + + Unable to write file. + Impossible escriure al fitxer. + + + Save File + Guardar Arxiu + + + Confirm Reset + Confirmar Reset + + + Are you sure you want to reset the configuration? + Esteu segur que voleu reiniciar la configuració? + + + Configuration File + Fitxer de Configuració + + + Export + Exportar + + + Reset + Reset + + + Launch at startup + Llançament a l'inici + + + + GeneralConf + + + + Import + Tuo + + + + + + + Error + Virhe + + + + Unable to read file. + Tiedoston lukeminen ei onnistunut. + + + + + Unable to write file. + Tiedoston kirjoittaminen ei onnistunut. + + + + Save File + Tallenna tiedosto + + + + Confirm Reset + Vahvista nollaus + + + + Are you sure you want to reset the configuration? + Haluatko varmasti nollata asetukset? + + + + Show help message + Näytä ohjeviesti + + + Show the help message at the beginning in the capture mode. + Show the help message at the beginning in the capture mode. + + + + Show the side panel button + Näytä sivupaneelin painike + + + Show the side panel toggle button in the capture mode. + Show the side panel toggle button in the capture mode. + + + + Show desktop notifications + Näytä ilmoitukset + + + + Show tray icon + Näytä kuvake paneelissa + + + Show the systemtray icon + Show the systemtray icon + + + + Confirmation required to delete screenshot from the latest uploads + Vahvistus tarvitaan kaappauksen poistamiseksi uusimmista latauksista + + + + Configuration File + Asetustiedosto + + + + Export + Vie + + + + Reset + Nollaa + + + + Automatic check for updates + Päivitysten automaattinen tarkistaminen + + + + Allow multiple flameshot GUI instances simultaneously + Salli useita Flameshot käyttöliittymiä samanaikaisesti + + + Automatically close daemon when it is not needed + Sulje taustapalvelu automaattisesti kun sitä ei tarvita + + + Launch at startup + Suorita käynnistyksen yhteydessä + + + Launch Flameshot + Käynnistä Flameshot + + + + Show welcome message on launch + Näytä tervetuloviesti käynnistyessä + + + + Use large predefined color palette + Käytä suurta esimääritettyä väripalettia + + + + Copy URL after upload + Kopioi URL-osoite lähetyksen jälkeen + + + Copy URL and close window after upload + Kopioi URL-osoite ja sulje ikkuna lähetyksen jälkeen + + + + Save image after copy + Tallenna kuva kopioinnin jälkeen + + + Save image file after copying it + Tallenna kuvatiedosto sen kopioinnin jälkeen + + + + Show the help message at the beginning in the capture mode + Näytä ohjeviesti kaappaustilan alussa + + + + Use last region for GUI mode + Käytä viimeistä aluetta + + + + Use the last region as the default selection for the next screenshot in GUI mode + Käyttää viimeistä aluetta seuraavan kaappauksen oletusvalintana + + + + Show the side panel toggle button in the capture mode + Näytä sivupaneelin kytkentäpainike kaappaustilassa + + + + Enable desktop notifications + Käytä ilmoituksia + + + + Show abort notifications + + + + + Enable abort notifications + + + + + Show icon in the system tray + Näytä kuvake ilmoitusalueella + + + + Use grim to capture screenshots + + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + + + + + Ask for confirmation to delete screenshot from the latest uploads + Kysy vahvistus kaappauksen poistamiseksi uusimmista lähetyksistä + + + + Check for updates automatically + Tarkista päivitykset automaattisesti + + + + This allows you to take screenshots of Flameshot itself for example + Tämä sallii kaappauksen ottamisen esimerkiksi itse Flameshotista + + + Launch Flameshot daemon when computer is booted + Käynnistä Flameshot-taustapalvelu kun tietokone käynnistetään + + + + Show the welcome message box in the middle of the screen while taking a screenshot + Näytä tervetuloa viestiruutu näytön keskellä, kun otat kaappauksen + + + + Use a large predefined color palette + Käytä suurta esimääritettyä väripalettia + + + + Copy on double click + Kopioi napsauttamalla kahdesti + + + Enable Copy on Double Click + Ota kopiointi käyttöön kaksoisnapsautuksella + + + Copy URL and close window after uploading was successful + Kopioi URL-osoite ja sulje ikkuna kun lähetys on onnistunut + + + + Automatically unload from memory when it is not needed + + + + + Automatically close daemon (background process) when it is not needed + + + + + Launch in background at startup + + + + + Launch Flameshot daemon (background process) when computer is booted + + + + + Ask before quit capture + + + + + Show the confirmation prompt before ESC quit + + + + + Enable Copy to clipboard on Double Click + + + + + Copy URL after uploading was successful + + + + + After copying the screenshot, save it to a file as well + Kaappauksen ottamisen jälkeen tallenna se tiedostoksi + + + + Save Path + Tallennuspolku + + + + Change... + Muuta... + + + + Use fixed path for screenshots to save + Käytä kiinteää polkua kaappausten tallentamiseen + + + + Preferred save file extension: + Tallennuksen tiedostopääte: + + + + Latest Uploads Max Size + Viimeisimpien lähetysten enimmäiskoko + + + + Imgur Application Client ID + Imgur-sovelluksen asiakastunnus + + + + Undo limit + Kumoa rajoitus + + + + Use JPG format for clipboard (PNG default) + Käytä JPG-muotoa leikepöydälle (PNG on oletus) + + + + Use lossy JPG format for clipboard (lossless PNG default) + + + + + Copy file path after save + Kopioi tiedoston polku tallentamisen jälkeen + + + + Copy the file path to clipboard after the file is saved + Kopioi tiedostopolku leikepöydälle sen jälkeen kun tiedosto on tallennettu + + + + Anti-aliasing image when zoom the pinned image + Pehmennä, kun skaalataan kiinnitettyä kuvaa + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + Kun kiinnitettyä kuvaa on suurennettu, pitäisikö kuvan tasoittua vai pysyä pikselimäisenä + + + + + Upload image without confirmation + Lähetä kuva ilman vahvistuksen kysymistä + + + + Choose a Folder + Valitse kansio + + + + Unable to write to directory. + Kansioon kirjoittaminen ei onnistunut. + + + + Show magnifier + Näytä suurennuslasi + + + + Enable a magnifier while selecting the screenshot area + Käytä suurenuslasia kun kaapattavaa aluetta valitaan + + + + Square shaped magnifier + Neliönmuotoinen suurennuslasi + + + + Make the magnifier to be square-shaped + Tee suurennuslasista neliönmuotoinen + + + + Milliseconds before geometry display hides; 0 means do not hide + + + + + Set geometry display timeout (ms) + + + + + Selection Geometry Display + + + + + Display Location + + + + + None + + + + + Top Left + + + + + Top Right + + + + + Bottom Left + + + + + Bottom Right + + + + + Center + + + + + Quality range of 0-100; Higher number is better quality and larger file size + + + + + JPEG Quality + + + + + Reverse arrow + + + + + Draw the arrow head first + + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + Viimeisimmät lähetykset + + + Screenshots history is empty + Kuvakaappausten historia on tyhjä + + + Copy URL + Kopioi URL-osoite + + + URL copied to clipboard. + URL-osoite kopioitu leikepöydälle. + + + Open in browser + Avaa selaimessa + + + Confirm to delete + Vahvista poisto + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Haluatko varmasti poistaa kuvakaappauksen viimeisimmistä lähetyksistä ja palvelimelta? + + + + ImgS3Uploader + + Uploading Image + S'està pujant la imatge + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Error + Error + + + + ImgUploadDialog + + + Upload Confirmation + Lähetysvahvistus + + + + Do you want to upload this capture? + Haluatko lähettää tämän kaappauksen? + + + + + Upload without confirmation + Lähetä ilman vahvistuksen kysymistä + + + + ImgUploader + + Uploading Image + S'està pujant la imatge + + + Delete image + Esborra la imatge + + + Unable to open the URL. + No es pot obrir l'URL. + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + Copy URL + Copia l'URL + + + Open URL + Obri l'URL + + + Image to Clipboard. + Imatge al porta-retalls. + + + + ImgUploaderBase + + + Upload image + Lähetä kuva + + + + Uploading Image + Lähetetään kuva + + + + Copy URL + Kopioi URL-osoite + + + + Open URL + Avaa URL-osoite + + + + Delete image + Poista kuva + + + + Image to Clipboard. + Kuva leikepöydälle. + + + + Save image + Tallenna kuva + + + + Unable to open the URL. + URL-osoitteen avaaminen ei onnistu. + + + + URL copied to clipboard. + URL-osoite kopioitu leikepöydälle. + + + + Screenshot copied to clipboard. + Kaappaus kopioitu leikepöydälle. + + + + Unable to save the screenshot to disk. + Kaappauksen tallentaminen levylle ei onnistu. + + + + Screenshot saved. + Kaappaus tallennettu. + + + + ImgUploaderTool + + + Image Uploader + Kuvan lähetys + + + + Upload the selection + Lähetä valinta imgur.com + + + + ImgurUploader + + Upload to Imgur + Lähetä Imguriin + + + Uploading Image + Lähetetään kuvaa + + + Copy URL + Kopioi URL-osoite + + + Open URL + Avaa URL-osoite + + + Delete image + Poista kuva + + + Image to Clipboard. + Kuva leikepöydälle. + + + + Unable to open the URL. + Osoitteen avaaminen ei onnistunut. + + + URL copied to clipboard. + URL-osoite kopioitu leikepöydälle. + + + Screenshot copied to clipboard. + Kuvakaappaus kopioitu leikepöydälle. + + + + ImgurUploaderTool + + Image Uploader + Kuvalähetin + + + Upload the selection to Imgur + Lähetä valinta Imguriin + + + + InfoWindow + + + + About + Tietoja + + + + + Icon + Kuvake + + + + + License + Lisenssi + + + + + GPLv3+ + GPLv3+ + + + + + Version + Versio + + + + + Flameshot v + Flameshot v + + + + + OS Info + Käyttöjärjestelmän tiedot + + + + + Copy Info + Kopioi tiedot + + + Right Click + Clic dret + + + Mouse Wheel + Roda del ratolí + + + Move selection 1px + Mou la selecció 1 px + + + Resize selection 1px + Redimensiona la selecció 1 px + + + Quit capture + Ix de la captura + + + Copy to clipboard + Copia al porta-retalls + + + Save selection as a file + Guarda la selecció com a fitxer + + + Undo the last modification + Desfés l'última modificació + + + Show color picker + Mostra el selector de color + + + Change the tool's thickness + Canvia el gruix de l'eina + + + Key + Tecla + + + Description + Descripció + + + <u><b>License</b></u> + <u><b>Lisenssi</b></u> + + + <u><b>Version</b></u> + <u><b>Versio</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Dreceres</b></u> + + + Available shortcuts in the screen capture mode. + Dreceres disponibles en el mode de captura de pantalla. + + + + InvertTool + + + Invert + Käänteinen + + + + Set Inverter as the paint tool + Aseta käänteinen väri työkalu + + + + LineTool + + + Line + Viiva + + + + Set the Line as the paint tool + Aseta viiva työkalu + + + + MarkerTool + + + Marker + Merkintäkynä + + + + Set the Marker as the paint tool + Aseta merkintäkynä työkalu + + + + MoveTool + + + Move + Siirrä + + + + Move the selection area + Siirrä valinta-aluetta + + + + PencilTool + + + Pencil + Kynä + + + + Set the Pencil as the paint tool + Aseta kynä työkalu + + + + PinTool + + + Pin Tool + Kiinnitys työkalu + + + + Pin image on the desktop + Kiinnitä kuva työpöydälle + + + + PinWidget + + + Context menu + Pudotusvalikko + + + + Copy to clipboard + Kopioi leikepöydälle + + + + Save to file + Tallenna tiedostoon + + + + Rotate Right + + + + + Rotate Left + + + + + Increase Opacity + + + + + Decrease Opacity + + + + + Close + Sulje + + + + PixelateTool + + + Pixelate + Pikselöi + + + + Set Pixelate as the paint tool. + + + + Set Pixelate as the paint tool + Aseta pikselöinti työkalu + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QHotkey + + Failed to register %1. Error: %2 + Rekisteröinti %1 epäonnistui. Virhe: %2 + + + Failed to unregister %1. Error: %2 + Rekisteröinnin poisto %1 epäonnistui. Virhe: %2 + + + + QObject + + + + Capture saved to clipboard. + Kaappaus tallennettu leikepöydälle. + + + + Error while saving to clipboard + Virhe tallentaessa leikepöydälle + + + + Save screenshot + Tallenna kaappaus + + + + Path copied to clipboard as + Polku kopioitiin leikepöydälle + + + Saving canceled + Tallentaminen peruttu + + + Save canceled + Tallennus peruttu + + + Capture is saved and copied to the clipboard as + Capture is saved and copied to the clipboard as + + + + Save Error + Tallennusvirhe + + + + + Capture saved as + Kaappaus tallennettu nimellä + + + + + Error trying to save as + Virhe tallentaessa nimellä + + + + Unable to connect via DBus + DBusiin yhdistäminen ei onnistunut + + + + Powerful yet simple to use screenshot software. + Tehokas mutta silti helppokäyttöinen ohjelma näytön kaappausten ottamiseen. + + + + See + Katso + + + Capture the entire desktop. + Kaappaa koko työpöytä. + + + + Open the capture launcher. + Avaa laukaisija. + + + + Start a manual capture in GUI mode. + Aloita manuaalinen kaappaus GUI-tilassa. + + + + Configure + Määritä + + + Capture a single screen. + Kaappaa yksittäinen näyttö. + + + Path where the capture will be saved + Polku johon kaappaus tallennetaan + + + + Capture screenshot of all monitors at the same time. + + + + + Capture a screenshot of the specified monitor. + + + + + Existing directory or new file to save to + Hakemisto tai uusi tiedosto, johon haluat tallentaa + + + + Save the capture to the clipboard + Tallenna kaappaus leikepöydälle + + + + Pin the capture to the screen + Kiinnitä kaappaus näytölle + + + + Upload screenshot + Lähetä kaappaus + + + + Delay time in milliseconds + Viiveen aika millisekunneissa + + + + Repeat screenshot with previously selected region + Toista kaappaus aiemmin valitulla alueella + + + + Screenshot region to select + Kaappauksen alue valittavaksi + + + + Set the filename pattern + Aseta tiedostonimen kaava + + + + Accept capture as soon as a selection is made + Hyväksy kaappaus välittömästi kun valinta on tehty + + + + Enable or disable the trayicon + Paneelin kuvake käyttöön tai poista se käytöstä + + + + Enable or disable run at startup + Suorita käynnistyksen yhteydessä tai poista se käytöstä + + + + Enable or disable the notifications + + + + + Check the configuration for errors + Tarkista asetukset virheiden varalta + + + + Show the help message in the capture mode + Näytä ohjeet kaappaustilassa + + + + Define the main UI color + Määritä käyttöliittymän pääväri + + + + Define the contrast UI color + Määritä käyttöliittymän kontrastiväri + + + + Print raw PNG capture + Tulosta raaka PNG-kaappaus + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + Tulosta valinta sivuasetuksilla muodossa LxK+X+Y. Ei tee mitään, jos raaka on määritetty + + + + Define the screen to capture (starting from 0) + Määritä kuvattava näyttö (alkaen nollasta) + + + + Invalid delay, it must be a number greater than 0 + Virheellinen viive, sen on oltava suurempi kuin 0 + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + Virheellinen alue, käytä "LxK+X+Y" tai "kaikki" tai "screen0/screen1/...". + + + + Invalid path, must be an existing directory or a new file in an existing directory + Virheellinen polku, pitää olla olemassa oleva hakemisto tai uusi tiedosto + + + Define the screen to capture + Define the screen to capture + + + + default: screen containing the cursor + oletus: näyttö, joka sisältää kursorin + + + + Screen number + Näytön numero + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Virheellinen väri, tämä tukee seuraavia muotoja: +- #RGB (kukin R, G ja B on yksi heksadesimaaliluku) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Nimetyt värit kuten "sininen" tai "punainen" +Sinun on ehkä vältettävä "#" merkkiä kuten "\#FFF" + + + Invalid delay, it must be higher than 0 + Invalid delay, it must be higher than 0 + + + + Invalid screen number, it must be non negative + Virheellinen näytön numero, se ei saa olla negatiivinen + + + Invalid path, it must be a real path in the system + Invalid path, it must be a real path in the system + + + + Invalid value, it must be defined as 'true' or 'false' + Virheellinen arvo, se on määriteltävä "true" tai "false" + + + + Error + Virhe + + + + Unable to write in + Ei voi kirjoittaa + + + URL copied to clipboard. + URL-osoite kopioitu leikepöydälle. + + + + Options + Valinnat + + + Arguments + Argumentit + + + arguments + argumentit + + + + Subcommands + + + + + subcommands + + + + + Usage + Käyttö + + + + options + options + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Oletus on suorittaa Flameshot taustalla ja lisätä kuvake paneeliin määritystä varten. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Hei, olen täällä! Kaappaa napsauttamalla paneelin kuvaketta tai hiiren oikea lisää vaihtoehtoja. + + + + Requested screen exceeds screen count + Pyydetty näyttö ylittää näyttöjen määrän + + + + Full screen screenshot pinned to screen + Koko näytön kaappaus kiinnitetty näyttöön + + + Toggle side panel + Näytä/piilota sivupaneeli + + + Resize selection left 1px + Resize selection left 1px + + + Resize selection right 1px + Resize selection right 1px + + + Resize selection up 1px + Resize selection up 1px + + + Resize selection down 1px + Resize selection down 1px + + + Select entire screen + Valitse koko näyttö + + + Move selection left 1px + Move selection left 1px + + + Move selection right 1px + Move selection right 1px + + + Move selection up 1px + Move selection up 1px + + + Move selection down 1px + Move selection down 1px + + + Commit text in text area + Commit text in text area + + + Delete current tool + Poista nykyinen työkalu + + + + Quit capture + Lopeta kaappaus + + + + Screenshot history + Kaappausten historia + + + + Capture screen + Kaappaa näyttö + + + + Show color picker + Näytä värivalitsin + + + + Change the tool's size + Vaihda työkalun kokoa + + + Change the tool's thickness + Vaihda työkalun paksuutta + + + + RectangleTool + + + Rectangle + Suorakulmio + + + + Set the Rectangle as the paint tool + Aseta suorakulmio työkalu + + + + RedoTool + + + Redo + Tee uudelleen + + + + Redo the next modification + Toista muutos uudelleen + + + + SaveTool + + + Save + Tallenna + + + + Save screenshot to a file + Tallenna kaappaus tiedostoon + + + Save the capture + Tallenna kaappaus + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Työpöytää ei pystytä tunnistamaan (GNOME? KDE? Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + Vihje: yritä asettaa XDG_CURRENT_DESKTOP ympäristömuuttuja. + + + + Unable to capture screen + Näytön kaappaaminen ei onnistunut + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + Suorakulmiomainen valinta + + + + Set Selection as the paint tool + Aseta valinta työkalu + + + + SetShortcutDialog + + + Set Shortcut + Aseta pikanäppäin + + + + Enter new shortcut to change + Anna uusi pikanäppäin muuttaaksesi + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Peruuta painamalla Esc tai ⌘+askelpalautin poistaaksesi pikanäppäimen käytöstä. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Peruuta painamalla Esc tai askelpalautin poistaaksesi pikanäppäimen käytöstä. + + + + + Flameshot must be restarted for changes to take effect. + Flameshot tulee käynnistää uudelleen, jotta muutokset tulevat voimaan. + + + + ShortcutsWidget + + + Hot Keys + Pikanäppäimet + + + + Available shortcuts in the screen capture mode. + Saatavilla olevat pikanäppäimet kaappaustilassa. + + + + Description + Kuvaus + + + + Key + Avain + + + + Left Double-click + Vasen kaksoisnapsautus + + + + Toggle side panel + Näytä/piilota sivupaneeli + + + + Grab a color from the screen + + + + + Resize selection left 1px + Muuta valinnan kokoa vasen 1px + + + + Resize selection right 1px + Muuta valinnan kokoa oikea 1px + + + + Resize selection up 1px + Muuta valinnan kokoa ylös 1px + + + + Resize selection down 1px + Muuta valinnan kokoa alas 1px + + + + Symmetrically decrease width by 2px + + + + + Symmetrically increase width by 2px + + + + + Symmetrically increase height by 2px + + + + + Symmetrically decrease height by 2px + + + + + Select entire screen + Valitse koko näyttö + + + + Move selection left 1px + Siirrä valinta vasen 1px + + + + Move selection right 1px + Siirrä valinta oikea 1px + + + + Move selection up 1px + Siirrä valinta ylös 1px + + + + Move selection down 1px + Siirrä valinta alas 1px + + + + Commit text in text area + Liittä teksti tekstialueelle + + + + Delete selected drawn object + + + + + Cancel current selection + + + + Delete current tool + Poista nykyinen työkalu + + + + Capture screen + Kaappaa näyttö + + + + Screenshot history + Kaappausten historia + + + + SidePanelWidget + + Active thickness: + Aktiivinen paksuus: + + + Active color: + Aktiivinen väri: + + + Press ESC to cancel + Paina ESC peruaksesi + + + + Active tool size: + Aktiivisen työkalun koko: + + + + Active Color: + Aktiivinen väri: + + + + Grab Color + Kaappaa väri + + + + Display grid + + + + + SizeDecreaseTool + + + Decrease Tool Size + Pienennä työkalun kokoa + + + + Decrease the size of the other tools + Pienennä muiden työkalujen kokoa + + + + SizeIncreaseTool + + + Increase Tool Size + Suurenna työkalun kokoa + + + + Increase the size of the other tools + Suurenna muiden työkalujen kokoa + + + + SizeIndicatorTool + + Selection Size Indicator + Valinnan koon ilmaisin + + + Show X and Y dimensions of the selection + Näytä valinnan mitat X ja Y + + + Show the dimensions of the selection (X Y) + Show the dimensions of the selection (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + Vuosisata (00-99) + + + + Year (00-99) + Vuosi (00-99) + + + + Year (2000) + Vuosi (2000) + + + + Month Name (jan) + Kuukauden nimi (tam) + + + + Month Name (january) + Kuukauden nimi (tammikuu) + + + + Month (01-12) + Kuukausi (01-12) + + + + Week Day (1-7) + Viikonpäivä (1-7) + + + + Week (01-53) + Viikko (01-53) + + + + Day Name (mon) + Päivän nimi (ma) + + + + Day Name (monday) + Päivän nimi (maanantai) + + + + Day (01-31) + Päivä (01-31) + + + + Day of Month (1-31) + Kuukauden päivä (1-31) + + + + Day (001-366) + Vuosipäivä (001-366) + + + + Hour (00-23) + Tunti (00-23) + + + + Hour (01-12) + Tunti (01-12) + + + + Minute (00-59) + Minuutti (00-59) + + + + Second (00-59) + Sekunti (00-59) + + + + Full Date (%m/%d/%y) + Päivämäärä (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + Päivämäärä (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + + + + + Time (%H-%M-%S) + Aika (%H-%M-%S) + + + + Time (%H-%M) + Aika (%H-%M) + + + + SystemNotification + + + Flameshot Info + Flameshotin tiedot + + + + TextConfig + + + StrikeOut + Yliviivaa + + + + Underline + Alleviivaa + + + + Bold + Lihavoi + + + + Italic + Kursivoi + + + + Left Align + Tasaa vasen + + + + Center Align + Keskitä + + + + Right Align + Tasaa oikea + + + + TextTool + + + Text + Teksti + + + + Add text to your capture + Lisää tekstiä kaappaukseen + + + + TrayIcon + + + &Take Screenshot + &Ota kaappaus + + + + &Open Launcher + &Avaa laukaisija + + + + &Configuration + &Asetukset + + + + &About + &Tietoja + + + + Check for updates + Tarkista päivitykset + + + + New version %1 is available + Uusi versio %1 on saatavilla + + + + &Quit + &Lopeta + + + + &Latest Uploads + &Uusimmat lataukset + + + + &Open Save Path + + + + + UIcolorEditor + + UI Color Editor + Käyttöliittymävärin muokkain + + + + Change the color moving the selectors and see the changes in the preview buttons. + Vaihda väriä siirtämällä valintaa ja katso muutokset esikatselun painikkeissa. + + + + Select a Button to modify it + Valitse painike ja muokkaa sitä + + + + Main Color + Pääväri + + + + Click on this button to set the edition mode of the main color. + Napsauta tätä painiketta ja aseta pääväri muokkaustilaan. + + + + Contrast Color + Kontrastiväri + + + + Click on this button to set the edition mode of the contrast color. + Napsauta tätä painiketta ja aseta kontrastiväri muokkaustilaan. + + + + UndoTool + + + Undo + Kumoa + + + + Undo the last modification + Kumoa viimeisin muutos + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + Uusi Flameshot-versio %1 on saatavilla + + + + Ignore + Ohita + + + + Later + Myöhemmin + + + + Update + Päivitä + + + + UploadHistory + + + Upload History + Lähetyshistoria + + + + Screenshots history is empty + Kaappausten historia on tyhjä + + + + UploadLineItem + + + Form + Form + + + + TextLabel + Tekstinimi + + + + Copy URL + Kopioi URL-osoite + + + + Open In Browser + Avaa selaimessa + + + + Confirm to delete + Vahvista poistaaksesi + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Haluatko varmasti poistaa kaappauksen lähetyksistä ja palvelimelta? + + + + UtilityPanel + + + Close + Sulje + + + + <Empty> + <Tyhjä> + + + + VisualsEditor + + + Opacity of area outside selection: + Valinnan ulkopuolisen alueen läpinäkyvyys: + + + + UI Color Editor + Käyttöliittymän väri + + + + Colorpicker Editor + Värivalitsimen muokkain + + + + Button Selection + Painikkeen valinta + + + + Select All + Valitse kaikki + + + + color_widgets::ColorDialog + + + Pick + Valitse + + + + color_widgets::ColorPalette + + + Unnamed + Nimetön + + + + color_widgets::ColorPaletteModel + + + Unnamed + Nimetön + + + + %1 (%2 colors) + %1 (%2 väriä) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + Avaa uusi paletti tiedostosta + + + + + Create a new palette + Luo uusi paletti + + + + + Duplicate the current palette + Monista nykyinen paletti + + + + + Delete the current palette + Poista nykyinen paletti + + + + + Revert changes to the current palette + Palauta muutokset nykyiseen palettiin + + + + + Save changes to the current palette + Tallenna muutokset nykyiseen palettiin + + + + + Add a color to the palette + Lisää väri palettiin + + + + + Remove the selected color from the palette + Poista valittu väri paletista + + + + + New Palette + Uusi paletti + + + + + Name + Nimi + + + + GIMP Palettes (*.gpl) + GIMP-paletit (*.gpl) + + + + Palette Image (%1) + Palettikuva (%1) + + + + All Files (*) + Kaikki tiedostot (*) + + + + + Open Palette + Avaa paletti + + + + Failed to load the palette file +%1 + Paletin lataaminen epäonnistui +%1 + + + + color_widgets::GradientEditor + + + Add Color + Lisää väri + + + + Remove Color + Poista väri + + + + Edit Color... + Muokkaa väriä... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 väriä) + + + + color_widgets::Swatch + + + Clear Color + Tyhjennä väri + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_fr.ts b/data/translations/Internationalization_fr.ts new file mode 100644 index 0000000..9a3fa71 --- /dev/null +++ b/data/translations/Internationalization_fr.ts @@ -0,0 +1,3180 @@ + + + + + AbstractWidgetList + + + Add New + Ajouter nouveau + + + + Move Up + Déplacer vers le haut + + + + Move Down + Déplacer vers le bas + + + + Remove + Enlever + + + + AcceptTool + + + Accept + Accepter + + + + Accept the capture + Accepter la capture + + + + AppLauncher + + + App Launcher + Lanceur d'applications + + + + Choose an app to open the capture + Sélectionner une application pour ouvrir la capture + + + + AppLauncherWidget + + + Open With + Ouvrir avec + + + + Launch in terminal + Lancer dans le terminal + + + + Keep open after selection + Maintenir ouvert après la sélection + + + + + Error + Erreur + + + + Unable to write in + Impossible d'écrire dessus + + + + Unable to launch in terminal. + Impossible de lancer dans le terminal. + + + + ArrowTool + + + Arrow + Flèche + + + + Set the Arrow as the paint tool + Sélectionner l'outil Flèche + + + + BlurTool + + Blur + Flou + + + Set Blur as the paint tool + Sélectionner l'outil Flou + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Mode de capture</b> + + + + Rectangular Region + Région rectangulaire + + + + Full Screen (Current Display) + Plein écran (affichage actuel) + + + + Full Screen (All Monitors) + Plein écran (tous les moniteurs) + + + + No Delay + Aucun retard + + + + second + seconde + + + + + + seconds + secondes + + + + + Take new screenshot + Prendre une nouvelle capture + + + + + Area: + Zone : + + + + + Capture Launcher + Lanceur de capture + + + + + TextLabel + Étiquette de texte + + + + + Capture Mode + Mode de capture + + + + + Delay: + Retard : + + + + + WxH+x+y + WxH+x+y + + + + CaptureWidget + + + Unable to capture screen + Impossible de capturer l'écran + + + + Mouse + Souris + + + + Select screenshot area + Sélectionner la zone de capture d'écran + + + + Mouse Wheel + Molette de la souris + + + + Change tool size + Changer la taille de l'outil + + + + Right Click + Clic droit + + + + Show color picker + Afficher la palette des couleurs + + + + Open side panel + Ouvrir le panneau latéral + + + + Esc + Échap + + + + Exit + Quitter + + + + Quit Capture + Annuler la capture + + + + Are you sure you want to quit capture? + Êtes-vous sûr de vouloir annuler la capture ? + + + + Do not show this again + Ne plus afficher ceci + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot a perdu le focus. Les raccourcis clavier ne fonctionneront pas sans avoir cliqué ailleurs. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + Erreur de configuration résolue. Lancer `flameshot gui` à nouveau. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Sélectionner une zone avec la souris ou appuyer sur Echap pour quitter +Appuyer sur Entrée pour capturer l'écran +Effectuer un clic droit pour afficher le sélecteur de couleurs. +Utiliser la molette de la souris pour changer l'épaisseur de l'outil. +Appuyer sur Espace pour ouvrir le panneau latéral. + + + + Tool Settings + Réglages des outils + + + + CircleCountTool + + + Circle Counter + Compteur circulaire + + + + Add an autoincrementing counter bubble + Ajoute une bulle de comptage auto-incrémentée + + + + CircleTool + + + Circle + Ellipse + + + + Set the Circle as the paint tool + Sélectionner l'outil Ellipse + + + + ColorDialog + + + + Select Color + Sélectionner Couleur + + + + + Saturation + Saturation + + + + + Hue + Teinte + + + + + Hex + Hex + + + + + Blue + Bleu + + + + + Value + Valeur + + + + + Green + Vert + + + + + Alpha + Alpha + + + + + Red + Rouge + + + + ColorGrabWidget + + + Accept color + Accepter couleur + + + + Enter or Left Click + Touche Entrée ou Clic Gauche + + + + Precisely select color + Sélection précise de couleur + + + + Hold Left Click + Maintenir Clic Gauche + + + + Toggle magnifier + Activer loupe + + + + Space or Right Click + Espace ou Clic Droit + + + + Cancel + Annuler + + + + Esc + Échap + + + + ColorPickerEditor + + Select Preset: + Sélectionner un préréglage : + + + Select preset using the spinbox + Sélectionnez un préréglage depuis la liste + + + + Edit Preset: + Modifier le préréglage : + + + + Enter color to update preset + Entrer la couleur pour mettre à jour le préréglage + + + + Update + Mettre à jour + + + + Press button to update the selected preset + Appuyer pour mettre à jour la sélection + + + + Delete + Supprimer + + + + Press button to delete the selected preset + Pressez le bouton pour supprimer le préréglage sélectionné + + + + Add Preset: + Ajouter un préréglage : + + + + Enter color manually or select it using the color-wheel + Entrez la couleur manuellement ou la sélectionner à partir de la palette + + + + Add + Ajouter + + + + Press button to add preset + Pressez le bouton pour ajouter un réglage + + + + + Error + Erreur + + + + Unable to add preset. Maximum limit reached. + Impossible d'ajouter un réglage. Limite maximale atteinte. + + + + Unable to remove preset. Minimum limit reached. + Impossible de supprimer un réglage. Limite minimale atteinte. + + + + ConfigErrorDetails + + + Configuration errors + Erreurs de configuration + + + + ConfigHandler + + + Unrecognized setting: '%1' + + Préférence inconnue : '%1' + + + + + Unrecognized shortcut name: '%1'. + + Nom de raccourcis inconnu : '%1'. + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + Conflit de raccourcis : '%1' et '%2' ont le même raccourci : %3 + + + + + Bad value in '%1'. Expected: %2 + + Mauvaise valeur dans '%1'. Attendu : %2 + + + + + You have successfully resolved the configuration error. + Vous avez résolu l'erreur de configuration. + + + + The configuration contains an error. Open configuration to resolve. + Cette configuration contient une erreur. Ouvrez la configuration pour la résoudre. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + Mauvaise clef de configuration'%1' dans ConfigHandler. Signaler le en tant que bug SVP. + + + + ConfigResolver + + + Resolve configuration errors + Résoudre les erreurs de configuration + + + + <b>You must resolve all errors before continuing:</b> + <b>Vous devez résoudre toutes les erreurs avant de continuer :</b> + + + + Reset + Réinitialiser + + + + Reset to the default value. + Rétablir la valeur par défaut. + + + + Remove + Retirer + + + + Remove this setting. + Retirer cette préférence. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + Certains raccourcis sont en conflits. +Cela n'empêchera PAS Flameshot de se lancer. +Veuillez résoudre ce problème manuellement depuis le fichier de configuration. + + + + Resolve all + Tout résoudre + + + + Resolve all listed errors. + Résoudre toutes les erreurs listées. + + + + Details + Détails + + + + ConfigWindow + + + Configuration + Configuration + + + + Interface + Interface + + + + Filename Editor + Editeur de Noms + + + + General + Général + + + + Shortcuts + Raccourcis + + + + Resolve + Résoudre + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>Le fichier de configuration contient des erreurs. Les résoudre avant de continuer.</b> + + + + Controller + + New version %1 is available + Nouvelle version %1 est disponible + + + You have the latest version + Vous avez la dernière version + + + Failed to get information about the latest version. + Impossible d'obtenir des informations sur la dernière version. + + + Error + Erreur + + + Unable to close active modal widgets + Incapable de fermer le widget modal actif + + + &Take Screenshot + &Capturer l'écran + + + &Open Launcher + &Ouvrir le lanceur + + + &Configuration + &Configuration + + + &About + &À propos + + + Check for updates + Vérifier les mises à jour + + + &Latest Uploads + &Derniers téléversements + + + URL copied to clipboard. + URL copiée dans le presse-papiers. + + + &Information + &Informations + + + &Quit + &Quitter + + + + CopyTool + + + Copy + Copier + + + + Copy selection to clipboard + Copier la sélection vers le presse-papiers + + + Copy the selection into the clipboard + Copier la sélection dans le presse-papier + + + + DBusUtils + + Unable to connect via DBus + Impossible de se connecter via DBus + + + + ExitTool + + + Exit + Sortir + + + + Leave the capture screen + Quitter l'écran de capture + + + + FileNameEditor + + + Edit the name of your captures: + Modifier le nom des captures : + + + + Edit: + Modifier : + + + + Preview: + Prévisualisation : + + + + Save + Sauvegarder + + + + Saves the pattern + Sauvegarder le modèle + + + + Restore + Restaurer + + + Reset + Réinitialiser + + + + Restores the saved pattern + Restaurer le modèle sauvegardé + + + + Clear + Purger + + + + Deletes the name + Supprime le nom + + + + Flameshot + + + Error + Erreur + + + + Unable to close active modal widgets + Impossible de fermer les widgets modales actifs + + + + URL copied to clipboard. + URL copiée dans le presse-papiers. + + + + FlameshotDaemon + + + New version %1 is available + La nouvelle version %1 est disponible + + + + You have the latest version + Vous avez la dernière version + + + + Failed to get information about the latest version. + Impossible d'obtenir des informations sur la dernière version. + + + + Unable to connect via DBus + Impossible de se connecter via DBus + + + + GeneneralConf + + Import + Importer + + + Error + Erreur + + + Unable to read file. + Impossible de lire le fichier. + + + Unable to write file. + Impossible d'écrire le fichier. + + + Save File + Sauvegarder le fichier + + + Confirm Reset + Confirmer la Réinitialisation + + + Are you sure you want to reset the configuration? + Êtes-vous sûr de vouloir réinitialiser la configuration ? + + + Show help message + Montrer le message d'aide + + + Show the help message at the beginning in the capture mode. + Afficher ce message au lancement du mode capture. + + + Show desktop notifications + Afficher les notifications du bureau + + + Show tray icon + Afficher les icones de la barre d'état + + + Show the systemtray icon + Afficher l'icône dans la barre de tâches + + + Configuration File + Fichier de Configuration + + + Export + Exporter + + + Reset + Réinitialiser + + + Launch at startup + Lancer au démarrage + + + Launch Flameshot + Démarrer Flameshot + + + Close after capture + Fermer après une capture + + + Close after taking a screenshot + Fermer l'application après une capture d'écran + + + + GeneralConf + + + + Import + Importer + + + + + + + Error + Erreur + + + + Unable to read file. + Impossible de lire le fichier. + + + + + Unable to write file. + Impossible d'écrire le fichier. + + + + Save File + Sauvegarder le fichier + + + + Confirm Reset + Confirmer la réinitialisation + + + + Are you sure you want to reset the configuration? + Êtes-vous sûr(e) de vouloir réinitialiser la configuration ? + + + + Show help message + Afficher le message d'aide + + + Show the help message at the beginning in the capture mode. + Afficher le message d'aide au lancement du mode capture. + + + + Show the side panel button + Afficher le bouton du panneau principal + + + Show the side panel toggle button in the capture mode. + Afficher le bouton de basculement du panneau latéral en mode capture. + + + + Show desktop notifications + Afficher les notifications du bureau + + + + Show tray icon + Afficher les icônes de la barre d'état + + + Show the systemtray icon + Afficher l'icône dans la barre de tâches + + + + Confirmation required to delete screenshot from the latest uploads + Confirmation requise pour supprimer la capture d'écran des derniers téléchargements + + + + Configuration File + Fichier de configuration + + + + Export + Exporter + + + + Reset + Réinitialiser + + + + Automatic check for updates + Contrôle automatique des mises à jour + + + + Allow multiple flameshot GUI instances simultaneously + Autoriser plusieurs instances simultanées de flameshot GUI + + + Automatically close daemon when it is not needed + Clore automatiquement le démon lorsqu'il n'est plus nécessaire + + + Launch at startup + Lancer au démarrage + + + Launch Flameshot + Démarrer Flameshot + + + + Show welcome message on launch + Afficher le message de bienvenue au démarrage + + + + Use large predefined color palette + Utiliser une large palette de couleurs prédéfinies + + + + Copy URL after upload + Copier l'URL après le téléchargement + + + Copy URL and close window after upload + Copier l'URL et fermer la fenêtre après le téléchargement + + + + Save image after copy + Enregistrer l'image après la copie + + + Save image file after copying it + Enregistrer le fichier image après l'avoir copiée + + + + Show the help message at the beginning in the capture mode + Afficher un message d'aide au début du mode de capture + + + + Use last region for GUI mode + Utiliser la dernière région pour le mode GUI + + + + Use the last region as the default selection for the next screenshot in GUI mode + Use the last region as the default selection for the next screenshot in GUI mode + + + + Show the side panel toggle button in the capture mode + Afficher le bouton pour activer le panneau du côté en mode capture + + + + Enable desktop notifications + Activer les notifications sur le bureau + + + + Show abort notifications + Afficher les notifications d'annulation + + + + Enable abort notifications + Permettre les notifications d'annulation + + + + Show icon in the system tray + Afficher une icône dans la barre de tâches + + + + Use grim to capture screenshots + Utiliser grim pour prendre des captures d'écran + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + + + + + Ask for confirmation to delete screenshot from the latest uploads + Demander la confirmation avant de supprimer les captures d'écran précédemment envoyées + + + + Check for updates automatically + Vérifier automatiquement les mises à jour + + + + This allows you to take screenshots of Flameshot itself for example + Cela permet par exemple de prendre des captures d'écran de Flameshot + + + Launch Flameshot daemon when computer is booted + Lancer le démon de Flameshot quand l'ordinateur démarre + + + + Show the welcome message box in the middle of the screen while taking a screenshot + Afficher la boite de message de bienvenue à milieu de l'écran à la prise d'une capture d'écran + + + + Use a large predefined color palette + Utiliser une vaste palette de couleurs prédéfinie + + + + Copy on double click + Copier en double-cliquant + + + Enable Copy on Double Click + Enable Copy on Double Click + + + Copy URL and close window after uploading was successful + Copier l'URL puis fermer la fenêtre au succès de l'envoi + + + + Automatically unload from memory when it is not needed + Déchargement automatique de la mémoire quand ce n'est pas nécessaire + + + + Automatically close daemon (background process) when it is not needed + Extinction automatique du Démon (processus en arrière-plan) quand il n'est plus utile + + + + Launch in background at startup + Démarrage en arrière-plan + + + + Launch Flameshot daemon (background process) when computer is booted + Démarrer le démon de Flameshot (processus en arrière-plan) lors de la mise en route de l'ordinateur + + + + Ask before quit capture + Demander avant de quitter la capture d'écran + + + + Show the confirmation prompt before ESC quit + Afficher la demande de confirmation avant d'annuler via ESC + + + + Enable Copy to clipboard on Double Click + Activer la copie vers le presse-papier par double-clic + + + + Copy URL after uploading was successful + Copier l'URL suite à un téléchargement fructueux + + + + After copying the screenshot, save it to a file as well + Après la copie de la capture d'écran, l'enregistrer aussi dans un fichier + + + + Save Path + Enregistrer le chemin + + + + Change... + modifier... + + + + Use fixed path for screenshots to save + Utiliser un emplacement spécifique pour l'enregistrement des captures d'écran + + + + Preferred save file extension: + Extension de fichier préférée pour l'enregistrement : + + + + Latest Uploads Max Size + Derniers téléchargements, taille maximale + + + + Imgur Application Client ID + Client ID pour l'application Imgur + + + + Undo limit + Annuler la limite + + + + Use JPG format for clipboard (PNG default) + Utiliser le format JPG pour le presse-papiers (PNG par défaut) + + + + Use lossy JPG format for clipboard (lossless PNG default) + Utiliser un format JPG avec perte pour le presse-papier (PNG sans perte par défaut) + + + + Copy file path after save + Copier le chemin du fichier après l'enregistrement + + + + Copy the file path to clipboard after the file is saved + Copier le chemin vers le fichier dans le presse-papier quand il a été enregistré + + + + Anti-aliasing image when zoom the pinned image + Anticrénelage de l'image lors du zoom de l'image épinglée + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + Après avoir zoomé sur l'image épinglée, l'image doit-elle être lissée ou rester pixelisée ? + + + + + Upload image without confirmation + Télécharger l'image sans confirmation + + + + Choose a Folder + Choisir un dossier + + + + Unable to write to directory. + Impossible d'écrire dans le répertoire. + + + + Show magnifier + Afficher la loupe + + + + Enable a magnifier while selecting the screenshot area + Activer la loupe lors de la sélection de l'aire de capture d'écran + + + + Square shaped magnifier + Loupe carrée + + + + Make the magnifier to be square-shaped + Affiche la loupe avec une forme carrée + + + + Milliseconds before geometry display hides; 0 means do not hide + Millisecondes avant que l'affichage géométrique ne se cache ; 0 indique "ne se cache jamais" + + + + Set geometry display timeout (ms) + Définir l'arrêt de l'affichage géométrique (ms) + + + + Selection Geometry Display + Sélectionner l'affichage géométrique + + + + Display Location + Afficher la location + + + + None + Aucun + + + + Top Left + Haut gauche + + + + Top Right + Haut droit + + + + Bottom Left + Bas gauche + + + + Bottom Right + Bas droit + + + + Center + Centre + + + + Quality range of 0-100; Higher number is better quality and larger file size + Variation de la qualité de 0 à 100. Un nombre plus grand indique une meilleure qualité et un fichier plus volumineux + + + + JPEG Quality + Qualité JPEG + + + + Reverse arrow + Flèche inversée + + + + Draw the arrow head first + Dessiner la pointe de la flèche en premier + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + Derniers téléchargements + + + Screenshots history is empty + L'historique des captures d'écrans est vide + + + Copy URL + Copier l'URL + + + URL copied to clipboard. + URL copiée dans le presse-papier. + + + Open in browser + Ouvrir dans le navigateur + + + Confirm to delete + Confirmer la suppression + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Êtes-vous sûr de vouloir supprimer une capture d'écran des derniers téléchargements et du serveur ? + + + + ImgS3Uploader + + Uploading Image + Mise en ligne de l'image + + + URL copied to clipboard. + URL copiée dans le Presse-papier. + + + Error + Erreur + + + + ImgUploadDialog + + + Upload Confirmation + Confirmation du téléversement + + + + Do you want to upload this capture? + Voulez-vous téléverser cette capture ? + + + + + Upload without confirmation + Téléverser sans confirmation + + + + ImgUploader + + Uploading Image + Mise en ligne de l'image + + + Unable to open the URL. + Impossible d'ouvrir l'URL. + + + URL copied to clipboard. + URL copiée dans le Presse-papier. + + + Screenshot copied to clipboard. + Capture d'écran copiée dans le Presse-papier. + + + Copy URL + Copier l'URL + + + Open URL + Ouvrir l'URL + + + Image to Clipboard. + Image dans le Presse-papier. + + + + ImgUploaderBase + + + Upload image + Téléverser l'image + + + + Uploading Image + Envoyer l'image + + + + Copy URL + Copier l'URL + + + + Open URL + Ouvrir l'URL + + + + Delete image + Effacer l'image + + + + Image to Clipboard. + Copier l'image dans le presse-papiers. + + + + Save image + Enregistrer l'image + + + + Unable to open the URL. + Impossible d'ouvrir l'URL. + + + + URL copied to clipboard. + URL copiée dans le presse-papiers. + + + + Screenshot copied to clipboard. + Capture d'écran copiée dans le presse-papier. + + + + Unable to save the screenshot to disk. + Impossible d'enregistrer la capture d'écran sur le disque. + + + + Screenshot saved. + Capture d'écran enregistrée. + + + + ImgUploaderTool + + + Image Uploader + Envoi d'images + + + + Upload the selection + Téléverser la sélection + + + + ImgurUploader + + Upload to Imgur + Mettre en ligne vers Imgur + + + Uploading Image + Mise en ligne de l'image + + + Copy URL + Copier l'URL + + + Open URL + Ouvrir l'URL + + + Delete image + Effacer l'image + + + Image to Clipboard. + Image dans le Presse-papier. + + + + Unable to open the URL. + Impossible d'ouvrir l'URL. + + + URL copied to clipboard. + URL copiée dans le Presse-papier. + + + Screenshot copied to clipboard. + Capture d'écran copiée dans le Presse-papier. + + + + ImgurUploaderTool + + Image Uploader + Mise en ligne d'images + + + Upload the selection to Imgur + Mettre en ligne la sélection vers Imgur + + + + InfoWindow + + + + About + À propos + + + + + Icon + Icône + + + + + License + Licence + + + + + GPLv3+ + GPLv3+ + + + + + Version + Version + + + + + Flameshot v + Flameshot v + + + + + OS Info + Infos SE + + + + + Copy Info + Copier infos + + + Right Click + Clic Droit + + + Mouse Wheel + Molette de la Souris + + + Move selection 1px + Déplacer la sélection 1px + + + Resize selection 1px + Redimensionner la sélection 1px + + + Quit capture + Quitter la capture d'écran + + + Copy to clipboard + Copier vers le Presse-papier + + + Save selection as a file + Sauvegarder la sélection vers un fichier + + + Undo the last modification + Annuler la dernière modification + + + Show color picker + Afficher la palette de couleurs + + + Change the tool's thickness + Changer l'épaisseur des outils + + + Available shortcuts in the screen capture mode. + Raccourcis disponibles en mode capture d'écran. + + + Key + Clé + + + Description + Description + + + <u><b>License</b></u> + <u><b>Licences</b></u> + + + <u><b>Version</b></u> + <u><b>Version</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Raccourci</b></u> + + + + InvertTool + + + Invert + Inverser + + + + Set Inverter as the paint tool + Sélectionner Inverseur comme outil de peinture + + + + LineTool + + + Line + Ligne + + + + Set the Line as the paint tool + Sélectionner l'outil Ligne + + + + MarkerTool + + + Marker + Surligneur + + + + Set the Marker as the paint tool + Sélectionner l'outil Surligneur + + + + MoveTool + + + Move + Déplacer + + + + Move the selection area + Déplacer la sélection + + + + PencilTool + + + Pencil + Crayon + + + + Set the Pencil as the paint tool + Sélectionner l'outil Crayon + + + + PinTool + + + Pin Tool + Outil Épinglage + + + + Pin image on the desktop + Épingler l'image sur le bureau + + + + PinWidget + + + Context menu + Context menu + + + + Copy to clipboard + Copier dans le presse-papier + + + + Save to file + Sauvegarder dans un fichier + + + + Rotate Right + Pivoter à droite + + + + Rotate Left + Pivoter à gauche + + + + Increase Opacity + Augmenter l'opacité + + + + Decrease Opacity + Diminuer l'opacité + + + + Close + Fermer + + + + PixelateTool + + + Pixelate + Pixeliser + + + + Set Pixelate as the paint tool. + Utiliser Pixeliser comme outil de peinture. + + + Set Pixelate as the paint tool + Choisir pixeliser comme outil de peinture + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QHotkey + + Failed to register %1. Error: %2 + Échec de l'enregistrement %1. Erreur : %2 + + + Failed to unregister %1. Error: %2 + Échec de la désinscription %1. Erreur : %2 + + + + QObject + + + Save Error + Erreur lors de la sauvegarde + + + + + Capture saved as + Capture d'écran sauvegardée sous + + + + + Capture saved to clipboard. + Capture enregistrée dans le presse-papier. + + + Capture saved to clipboard + Capture enregistrée dans le presse-papier. + + + + Error while saving to clipboard + Erreur lors de l'enregistrement dans le presse-papier + + + + + Error trying to save as + Erreur lors de la sauvegarde sous + + + + Save screenshot + Enregistrer la capture d'écran + + + + Path copied to clipboard as + Chemin d'accès copié dans le presse-papiers en tant que + + + Saving canceled + Enregistrement annulé + + + Save canceled + Enregistrement annulé + + + Capture is saved and copied to the clipboard as + Capture enregistrée et copiée dans le presse-papier + + + + Unable to connect via DBus + Impossible de se connecter via DBus + + + + Powerful yet simple to use screenshot software. + Logiciel de capture d'écran puissant mais simple à utiliser. + + + + See + Voir + + + Capture the entire desktop. + Capturer l'écran entier. + + + + Open the capture launcher. + Ouvrir le menu de capture. + + + + Start a manual capture in GUI mode. + Démarre une capture manuelle en mode graphique. + + + + Configure + Configurer + + + Capture a single screen. + Capturer un écran seul. + + + Path where the capture will be saved + Chemin où la capture sera enregistrée + + + + Capture screenshot of all monitors at the same time. + Capture d'écran de tous les moniteurs en même temps. + + + + Capture a screenshot of the specified monitor. + Effectuer une capture d'écran du moniteur spécifié. + + + + Existing directory or new file to save to + Dossier existant ou nouveau fichier à sauvegarder dans + + + + Save the capture to the clipboard + Enregistrer la capture dans le presse-papier + + + + Pin the capture to the screen + Pin the capture to the screen + + + + Upload screenshot + Upload screenshot + + + + Delay time in milliseconds + Délai en millisecondes + + + + Repeat screenshot with previously selected region + Repeat screenshot with previously selected region + + + + Screenshot region to select + Zone de capture d'écran à sélectionner + + + + Set the filename pattern + Définir le modèle de nom de fichier + + + + Accept capture as soon as a selection is made + Accepter la capture d'écran dès qu'une sélection est faite + + + + Enable or disable the trayicon + Activer ou désactiver l'icone de la barre des tâches + + + + Enable or disable run at startup + Activer ou désactiver le lancement au démarrage + + + + Enable or disable the notifications + Activer ou désactiver les notifications + + + + Check the configuration for errors + Vérifiez l'absence d'erreurs dans la configuration + + + + Show the help message in the capture mode + Afficher le message d'aide dans le mode capture + + + + Define the main UI color + Définir la couleur de base de l'interface + + + + Define the contrast UI color + Définir le contraste de l'interface utilisateur + + + + Print raw PNG capture + Print raw PNG capture + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + + + + Define the screen to capture (starting from 0) + Define the screen to capture (starting from 0) + + + + Invalid delay, it must be a number greater than 0 + Délai invalide, il doit être supérieur à 0 + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + + + + Invalid path, must be an existing directory or a new file in an existing directory + Invalid path, must be an existing directory or a new file in an existing directory + + + Define the screen to capture + Définir l'écran à capturer + + + + default: screen containing the cursor + Par défaut : Ecran contenant le curseur + + + + Screen number + Numéro d'écran + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Couleur incorrecte, ce champs supporte les formats suivants : +- #RGB (chacun des R, G, et B est un chiffre hexadécimal unique) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Nom des couleurs tel que "bleu" ou "rouge" +Vous devrez probablement remplacer le signe '#' par '\#FFF' + + + Invalid delay, it must be higher than 0 + Délai non valable, il doit être plus élevé que 0 + + + + Invalid screen number, it must be non negative + Numéro d'écran non-valable, il ne doit pas être négatif + + + Invalid path, it must be a real path in the system + Chemin non-valable, il doit indiquer un chemin existant du système + + + + Invalid value, it must be defined as 'true' or 'false' + Valeur non-valable, elle doit être définie comme 'true' ou 'false' + + + + Error + Erreur + + + + Unable to write in + Impossible d'écrire par dessus + + + + Requested screen exceeds screen count + Requested screen exceeds screen count + + + + Full screen screenshot pinned to screen + Full screen screenshot pinned to screen + + + URL copied to clipboard. + URL copiée dans le Presse-papier. + + + + Options + Options + + + Arguments + Arguments + + + arguments + arguments + + + + Subcommands + Sous-commandes + + + + subcommands + sous-commandes + + + + Usage + Usage + + + + options + options + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Par défaut, Flameshot fonctionne en arrière-plan et ajoute une icône dans la barre des tâches pour la configuration. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Hello, je suis là ! Clique sur l’icône dans la barre des tâches pour prendre une capture d'écran ou fait un clic droit pour voir plus d'options. + + + Resize selection left 1px + Redimensionner la sélection de 1px vers la gauche + + + Resize selection right 1px + Redimensionner la sélection de 1px vers la droite + + + Resize selection up 1px + Redimensionner la sélection de 1px vers le haut + + + Resize selection down 1px + Redimensionner la sélection de 1px vers le bas + + + Select entire screen + Sélectionner l'écran en entier + + + Move selection left 1px + Déplacer la sélection de 1px vers la gauche + + + Move selection right 1px + Déplacer la sélection de 1px vers la droite + + + Move selection up 1px + Déplacer la sélection de 1px vers le haut + + + Move selection down 1px + Déplacer la sélection de 1px vers le bas + + + Commit text in text area + Insérer du texte dans la zone de texte + + + Delete current tool + Effacer l'outil actuel + + + + Quit capture + Quitter la capture d'écran + + + + Screenshot history + Historique des captures d'écran + + + + Capture screen + Capturer l'écran + + + + Show color picker + Afficher la palette de couleurs + + + + Change the tool's size + Change the tool's size + + + Change the tool's thickness + Modifier l'épaisseur des outils + + + + RectangleTool + + + Rectangle + Rectangle plein + + + + Set the Rectangle as the paint tool + Sélectionner l'outil Rectangle plein + + + + RedoTool + + + Redo + Rétablir + + + + Redo the next modification + Refaire la prochaine modification + + + + SaveTool + + + Save + Sauvegarder + + + + Save screenshot to a file + Save screenshot to a file + + + Save the capture + Sauvegarder la capture d'écran + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Impossible de détecter l’environnement de bureau (GNOME ? KDE ? Sway ? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + Impossible de détecter l'environnement de bureau (GNOME ? KDE ? Qile ? Sway ?...) + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + Conseil : essayez de définir la variable d’environnement XDG_CURRENT_DESKTOP. + + + + Unable to capture screen + Impossible de capturer l'écran + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + Rectangle + + + + Set Selection as the paint tool + Sélectionner l'outil Rectangle + + + + SetShortcutDialog + + + Set Shortcut + Choisir un raccourci + + + + Enter new shortcut to change + Entrer un nouveau raccourci pour modifier + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Presser Esc pour annuler ou ⌘+Backspace pour désactiver le raccourci clavier. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Presser Esc pour annuler ou Backspace pour désactiver le raccourci clavier. + + + + + Flameshot must be restarted for changes to take effect. + Flameshot must be restarted for changes to take effect. + + + + ShortcutsWidget + + + Hot Keys + Raccourcis clavier + + + + Available shortcuts in the screen capture mode. + Raccourcis disponibles en mode capture d'écran. + + + + Description + Description + + + + Key + Clé + + + + Left Double-click + Left Double-click + + + + Toggle side panel + Toggle side panel + + + + Grab a color from the screen + + + + + Resize selection left 1px + Redimensionner la sélection de 1px vers la gauche + + + + Resize selection right 1px + Redimensionner la sélection de 1px vers la droite + + + + Resize selection up 1px + Redimensionner la sélection de 1px vers le haut + + + + Resize selection down 1px + Redimensionner la sélection de 1px vers le bas + + + + Symmetrically decrease width by 2px + Diminuer symétriquement la largeur de 2px + + + + Symmetrically increase width by 2px + Augmenter symétriquement la largeur de 2px + + + + Symmetrically increase height by 2px + Augmenter symétriquement la hauteur de 2px + + + + Symmetrically decrease height by 2px + Diminuer symétriquement la hauteur de 2px + + + + Select entire screen + Sélectionner l'écran en entier + + + + Move selection left 1px + Déplacer la sélection de 1px vers la gauche + + + + Move selection right 1px + Déplacer la sélection de 1px vers la droite + + + + Move selection up 1px + Déplacer la sélection de 1px vers le haut + + + + Move selection down 1px + Déplacer la sélection de 1px vers le bas + + + + Commit text in text area + Insérer du texte dans la zone de texte + + + + Delete selected drawn object + Supprimer l'objet sélectionné peint + + + + Cancel current selection + Effacer la sélection actuelle + + + Delete current tool + Effacer l'outil actuel + + + + Capture screen + Capturer l'écran + + + + Screenshot history + Historique des captures d'écran + + + + SidePanelWidget + + Active color: + Couleur actuelle : + + + Press ESC to cancel + Appuyer sur Échap pour annuler + + + + Active tool size: + Taille de l’outil actif : + + + + Active Color: + Couleur active : + + + + Grab Color + Saisir la couleur + + + + Display grid + Afficher la grille + + + Active thickness: + Épaisseur sélectionnée: + + + + SizeDecreaseTool + + + Decrease Tool Size + Réduire la taille de l'outil + + + + Decrease the size of the other tools + Réduire la taille des autres outils + + + + SizeIncreaseTool + + + Increase Tool Size + Augmenter la taille de l'outil + + + + Increase the size of the other tools + Augmenter la taille des autres outils + + + + SizeIndicatorTool + + Selection Size Indicator + Indicateur de la taille de la sélection + + + Show X and Y dimensions of the selection + Show X and Y dimensions of the selection + + + Show the dimensions of the selection (X Y) + Montrer les dimensions de la sélection (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + Siècle (00-99) + + + + Year (00-99) + Année (00-99) + + + + Year (2000) + Année (2000) + + + + Month Name (jan) + Nom des Mois (jan) + + + + Month Name (january) + nom des Mois (janvier) + + + + Month (01-12) + Mois (01-12) + + + + Week Day (1-7) + Jour de la Semaine (1-7) + + + + Week (01-53) + Semaine (01-53) + + + + Day Name (mon) + Nom du Jour (lun) + + + + Day Name (monday) + Nom du Jour (lundi) + + + + Day (01-31) + Jour (01-31) + + + + Day of Month (1-31) + Jour du Mois (1-31) + + + + Day (001-366) + Jour de l'année (001-366) + + + + Time (%H-%M-%S) + Heure (%H-%M-%S) + + + + Time (%H-%M) + Heure (%H-%M) + + + + Hour (00-23) + Heure (00-23) + + + + Hour (01-12) + Heure (01-12) + + + + Minute (00-59) + Minute (00-59) + + + + Second (00-59) + Seconde (00-59) + + + + Full Date (%m/%d/%y) + Date (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + Date Complête (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + + + + + SystemNotification + + + Flameshot Info + Info Flameshot + + + + TextConfig + + + StrikeOut + Rayer + + + + Underline + Souligner + + + + Bold + Gras + + + + Italic + Italique + + + + Left Align + Aligner à gauche + + + + Center Align + Aligner au centre + + + + Right Align + Aligner à droite + + + + TextTool + + + Text + Texte + + + + Add text to your capture + Ajouter du texte à la capture + + + + TrayIcon + + + &Take Screenshot + &Capturer l'écran + + + + &Open Launcher + &Ouvrir le lanceur + + + + &Configuration + &Configuration + + + + &About + &À propos + + + + Check for updates + Vérifier les mises à jour + + + + New version %1 is available + La nouvelle version %1 est disponible + + + + &Quit + &Quitter + + + + &Latest Uploads + &Derniers téléversements + + + + &Open Save Path + Répertoire d'&Ouverture et de Sauvegarde + + + + UIcolorEditor + + UI Color Editor + Editeur de la Couleur de l'interface + + + + Change the color moving the selectors and see the changes in the preview buttons. + Modifier la couleur en déplaçant les sélecteur et voir les changements dans les boutons de prévisualisation. + + + + Select a Button to modify it + Sélectionner un bouton pour le modifier + + + + Main Color + Couleur principale + + + + Click on this button to set the edition mode of the main color. + Cliquer sur ce bouton pour définir le mode édition de la couleur principale. + + + + Contrast Color + Couleur de contraste + + + + Click on this button to set the edition mode of the contrast color. + Cliquer sur ce bouton pour définir le mode édition de la couleur de contraste. + + + + UndoTool + + + Undo + Annuler + + + + Undo the last modification + Annuler la dernière modification + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + Une nouvelle version %1 de Flameshot est disponible + + + + Ignore + Ignorer + + + + Later + Plus tard + + + + Update + Mettre à jour + + + + UploadHistory + + + Upload History + Historique d'envois + + + + Screenshots history is empty + L'historique des captures d'écrans est vide + + + + UploadLineItem + + + Form + Formulaire + + + + TextLabel + étiquette de texte + + + + Copy URL + Copier l'URL + + + + Open In Browser + Ouvrir dans le navigateur + + + + Confirm to delete + Confirmer la suppression + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Êtes-vous sûr de vouloir supprimer une capture d'écran depuis les derniers envois et du serveur ? + + + + UtilityPanel + + + Close + Fermer + + + + <Empty> + <Vide> + + + + VisualsEditor + + + Opacity of area outside selection: + Opacité de la zone en dehors de la sélection : + + + + UI Color Editor + Éditeur de la couleur d'interface + + + + Colorpicker Editor + Éditeur de la palette + + + + Button Selection + Sélection du bouton + + + + Select All + Tout sélectionner + + + + color_widgets::ColorDialog + + + Pick + Pick + + + + color_widgets::ColorPalette + + + Unnamed + Unnamed + + + + color_widgets::ColorPaletteModel + + + Unnamed + Unnamed + + + + %1 (%2 colors) + %1 (%2 couleurs) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + Ouvrir une nouvelle palette depuis un fichier + + + + + Create a new palette + Ouvrir une nouvelle palette + + + + + Duplicate the current palette + Dupliquer la palette actuelle + + + + + Delete the current palette + Supprimer la palette actuelle + + + + + Revert changes to the current palette + Rétablir les modifications de la palette actuelle + + + + + Save changes to the current palette + Sauvegarder les modifications de la palette actuelle + + + + + Add a color to the palette + Ajouter une couleur à la palette + + + + + Remove the selected color from the palette + Retirer la couleur sélectionnée de la palette + + + + + New Palette + Nouvelle palette + + + + + Name + Nom + + + + GIMP Palettes (*.gpl) + Palettes GIMP (*.gpl) + + + + Palette Image (%1) + Image palette (%1) + + + + All Files (*) + Tous les fichiers (*) + + + + + Open Palette + Ouvrir la palette + + + + Failed to load the palette file +%1 + Impossible d'ouvrir le fichier de palette +%1 + + + + color_widgets::GradientEditor + + + Add Color + Ajouter la couleur + + + + Remove Color + Retirer la couleur + + + + Edit Color... + Modification de la couleur... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 couleurs) + + + + color_widgets::Swatch + + + Clear Color + Réinitialiser la couleur + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_ga.ts b/data/translations/Internationalization_ga.ts new file mode 100644 index 0000000..940d11d --- /dev/null +++ b/data/translations/Internationalization_ga.ts @@ -0,0 +1,3169 @@ + + + + + AbstractWidgetList + + + Add New + Cuir Nua leis + + + + Move Up + Bog Suas + + + + Move Down + Bog Síos + + + + Remove + Bain + + + + AcceptTool + + + Accept + Glac leis + + + + Accept the capture + Glac leis an ngabháil + + + + AppLauncher + + + App Launcher + Tosaitheoir Aipeanna + + + + Choose an app to open the capture + Roghnaigh aip chun an ghabháil a oscailt + + + + AppLauncherWidget + + + Open With + Oscail Le + + + + Launch in terminal + Seoladh sa teirminéal + + + + Keep open after selection + Coinnigh ar oscailt tar éis roghnú + + + + + Error + Earráid + + + + Unable to launch in terminal. + Ní féidir é a sheoladh sa teirminéal. + + + + Unable to write in + Ní féidir scríobh isteach + + + + ArrowTool + + + Arrow + Saighead + + + + Set the Arrow as the paint tool + Socraigh an tSaighead mar uirlis péint + + + + BlurTool + + Blur + Desenfocament + + + Set Blur as the paint tool + Estableix el desenfocament com a eina de dibuix + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Mode de captura</b> + + + + Rectangular Region + Réigiún Dronuilleogach + + + + Full Screen (Current Display) + Scáileán Iomlán (Taispeáint Reatha) + + + + Full Screen (All Monitors) + Scáileán Iomlán (Gach Monatóir) + + + + No Delay + Gan Moill + + + + second + an dara ceann + + + + + + seconds + soicind + + + + + Take new screenshot + Tóg scáileán nua + + + + + Area: + Ceantar: + + + + + Capture Launcher + Tosaitheoir Gabhála + + + + + TextLabel + Lipéad Téacs + + + + + Capture Mode + Mód Gabhála + + + + + Delay: + Moill: + + + + + WxH+x+y + LxA+x+y + + + + CaptureWidget + + + Unable to capture screen + Impossible capturar la pantalla + Ní féidir an scáileán a ghabháil + + + + Mouse + Luch + + + + Select screenshot area + Roghnaigh limistéar an scáileáin + + + + Mouse Wheel + Roth na Luiche + + + + Change tool size + Athraigh méid na huirlisí + + + + Right Click + Cliceáil ar dheis + + + + Show color picker + Taispeáin roghnóir dathanna + + + + Open side panel + Oscail painéal taoibh + + + + Esc + Esc + + + + Exit + Scoir + + + + Quit Capture + Scoir den Gabháil + + + + Are you sure you want to quit capture? + An bhfuil tú cinnte gur mian leat scor den ghabháil? + + + + Do not show this again + Ná taispeáin seo arís + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Tá fócas caillte ag Flameshot. Ní oibreoidh aicearraí méarchláir go dtí go gcliceálann tú áit éigin. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + Réitíodh earráid chumraíochta. Seoladh 'flameshot gui' arís chun é a chur i bhfeidhm. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Escolliu una àrea amb el ratolí, o premeu Esc per sortir. +Premeu Entrar per capturar la pantalla. +Premeu clic dret per mostrar l'eina de selecció de color. +Gireu la rodeta del ratolí per canviar el gruix de l'eina de dibuix. +Premeu Espai per obrir el calaix lateral. + + + + Tool Settings + Socruithe Uirlisí + + + + CircleCountTool + + + Circle Counter + Cuntar Ciorcail + + + + Add an autoincrementing counter bubble + Cuir mboilgeog cuntar autoincrementing leis + + + + CircleTool + + + Circle + Ciorcal + + + + Set the Circle as the paint tool + Socraigh an Ciorcal mar uirlis péint + + + + ColorDialog + + + + Select Color + Roghnaigh Dath + + + + + Saturation + Sáithiú + + + + + Hue + Lí + + + + + Hex + Heicsidheachúil + + + + + Blue + Gorm + + + + + Value + Luach + + + + + Green + Glas + + + + + Alpha + Alfa + + + + + Red + Dearg + + + + ColorGrabWidget + + + Accept color + Glac le dath + + + + Enter or Left Click + Iontráil nó cliceáil ar chlé + + + + Precisely select color + Roghnaigh dath go beacht + + + + Hold Left Click + Coinnigh Cliceáil ar Chlé + + + + Toggle magnifier + Scoránaigh an formhéadaitheoir + + + + Space or Right Click + Spás nó cliceáil ar dheis + + + + Cancel + Cuir ar ceal + + + + Esc + Esc + + + + ColorPickerEditor + + + Edit Preset: + Cuir Réamhshocraithe in Eagar: + + + + Enter color to update preset + Iontráil dath le réamhshocrú a nuashonrú + + + + Update + Nuashonraigh + + + + Press button to update the selected preset + Brúigh an cnaipe chun an réamhshocrú roghnaithe a nuashonrú + + + + Delete + Scrios + + + + Press button to delete the selected preset + Brúigh an cnaipe chun an réamhshocrú roghnaithe a scriosadh + + + + Add Preset: + Cuir Réamhshocraithe leis: + + + + Enter color manually or select it using the color-wheel + Iontráil dath de láimh nó roghnaigh é ag baint úsáide as an roth dathanna + + + + Add + Cuir leis + + + + Press button to add preset + Brúigh an cnaipe chun réamhshocrú a chur leis + + + + + Error + Earráid + + + + Unable to add preset. Maximum limit reached. + Ní féidir réamhshocrú a chur leis. Uasteorainn bainte amach. + + + + Unable to remove preset. Minimum limit reached. + Ní féidir réamhshocrú a bhaint. An t-íosteorainn bainte amach. + + + + ConfigErrorDetails + + + Configuration errors + Earráidí cumraíochta + + + + ConfigHandler + + + Unrecognized setting: '%1' + + Socrú anaithnid: '%1' + + + + + Unrecognized shortcut name: '%1'. + + Ainm aicearra neamhaitheanta: '%1'. + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + Coimhlint aicearra: tá an aicearra céanna ag '%1' agus '%2':% 3 + + + + + Bad value in '%1'. Expected: %2 + + Drochluach i '%1'. Ag súil leis: %2 + + + + + You have successfully resolved the configuration error. + D'éirigh leat an earráid chumraíochta a réiteach. + + + + The configuration contains an error. Open configuration to resolve. + Tá earráid sa chumraíocht. Oscail cumraíocht le réiteach. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + Droch-eochair chumraíochta '%1' i ConfigurHandler. Tuairiscigh é seo mar fhabht. + + + + ConfigResolver + + + Resolve configuration errors + Réitigh earráidí cumraíochta + + + + <b>You must resolve all errors before continuing:</b> + <b>Ní mór duit na hearráidí go léir a réiteach sula leanann tú ar aghaidh:</b> + + + + Reset + Athshocraigh + + + + Reset to the default value. + Athshocraigh go dtí an luach réamhshocraithe. + + + + Remove + Bain + + + + Remove this setting. + Bain an socrú seo. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + Tá coimhlintí ag roinnt aicearraí méarchláir. +NÍ chuirfidh sé seo cosc ar flameshot ó thosú. +Réitigh iad de láimh sa chomhad cumraíochta. + + + + Resolve all + Réitigh gach rud + + + + Resolve all listed errors. + Réitigh gach earráid liostaithe. + + + + Details + Sonraí + + + + ConfigWindow + + + Configuration + Cumraíocht + + + + Interface + Comhéadan + + + + Filename Editor + Eagarthóir Ainm Comhaid + + + + General + Ginearálta + + + + Shortcuts + Aicearraí + + + + Resolve + Réitigh + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>Tá earráidí sa chomhad cumraíochta. Réitigh iad sula leanann tú ar aghaidh.</b> + + + + Controller + + New version %1 is available + La nova versió %1 ja és disponible + + + You have the latest version + Teniu la versió més recent + + + Failed to get information about the latest version. + Error a l'intentar obtenir informació sobre actualitzacions. + + + Error + Error + + + Unable to close active modal widgets + No s'han pogut tancar els widgets modals actius + + + &Open Launcher + &Obre el llançador d'aplicacions + + + &Configuration + &Ajustaments + + + &About + &Quant a + + + Check for updates + Comprova si hi ha actualitzacions disponibles + + + &Latest Uploads + &Últimes càrregues + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + &Information + &Informació + + + &Quit + &Surt + + + &Take Screenshot + &Captura + + + + CopyTool + + + Copy + Cóipeáil + + + + Copy selection to clipboard + Cóipeáil an roghnúchán go gearrthaisce + + + Copy the selection into the clipboard + Copia la selecció al porta-retalls + + + + DBusUtils + + Unable to connect via DBus + No s'ha pogut connectar mitjançant DBus + + + + ExitTool + + + Exit + Scoir + + + + Leave the capture screen + Fág an scáileán gabhála + + + + FileNameEditor + + + Edit the name of your captures: + Cuir ainm do ghabhálacha in eagar: + + + + Edit: + Cuir in eagar: + + + + Preview: + Réamhamharc: + + + + Save + Sábháil + + + + Saves the pattern + Sábhálann an patrún + + + + Restore + Athchóirigh + + + Reset + Reinicialitza + + + + Restores the saved pattern + Athchóiríonn sé an patrún a shábháil + + + + Clear + Glan + + + + Deletes the name + Scrios an t-ainm + + + + Flameshot + + + Error + Earráid + + + + Unable to close active modal widgets + Ní féidir giuirléidí módúla gníomhacha a dhúnadh + + + + URL copied to clipboard. + URL cóipeáilte chuig an ghearrthaisce. + + + + FlameshotDaemon + + + New version %1 is available + Tá leagan nua %1 ar fáil + + + + You have the latest version + Tá an leagan is déanaí agat + + + + Failed to get information about the latest version. + Theip ar eolas a fháil faoin leagan is déanaí. + + + + Unable to connect via DBus + Ní féidir ceangal a dhéanamh trí DBus + + + + GeneneralConf + + Show help message + Mostra el missatge d'ajuda + + + Show the help message at the beginning in the capture mode. + Mostra el missatge d'ajuda en iniciar el mode de captura. + + + Show desktop notifications + Mostra les notificacions d'escriptori + + + Show tray icon + Mostra la icona en la barra de tasques + + + Show the systemtray icon + Mostra la icona en la barra de tasques + + + Import + Importar + + + Error + Error + + + Unable to read file. + Impossible llegir el fitxer. + + + Unable to write file. + Impossible escriure al fitxer. + + + Save File + Guardar Arxiu + + + Confirm Reset + Confirmar Reset + + + Are you sure you want to reset the configuration? + Esteu segur que voleu reiniciar la configuració? + + + Configuration File + Fitxer de Configuració + + + Export + Exportar + + + Reset + Reset + + + Launch at startup + Llançament a l'inici + + + + GeneralConf + + + + Import + Iompórtáil + + + + + + + Error + Earráid + + + + Unable to read file. + Ní féidir an comhad a léamh. + + + + + Unable to write file. + Ní féidir comhad a scríobh. + + + + Save File + Sábháil Comhad + + + + Confirm Reset + Deimhnigh Athshocraigh + + + + Are you sure you want to reset the configuration? + An bhfuil tú cinnte gur mhaith leat an chumraíocht a athshocrú? + + + + Show help message + Taispeáin teachtaireacht chabhrach + + + Show the help message at the beginning in the capture mode. + Mostra el missatge d'ajuda en iniciar el mode de captura. + + + + Show the side panel button + Taispeáin an cnaipe painéil taoibh + + + Show the side panel toggle button in the capture mode. + Mostra el botó del calaix lateral en el mode de captura. + + + + Show desktop notifications + Taispeáin fógraí deisce + + + + Show tray icon + Taispeáin deilbhín tráidire + + + Show the systemtray icon + Mostra la icona a la barra de tasques del sistema + + + + Confirmation required to delete screenshot from the latest uploads + Deimhniú ag teastáil chun an pictiúr a scriosadh ó na huaslódálacha is déanaí + + + + Configuration File + Comhad Cumraíochta + + + + Export + Easpórtáil + + + + Reset + Athshocraigh + + + + Automatic check for updates + Seiceáil go huathoibríoch le haghaidh nuashonruithe + + + + Allow multiple flameshot GUI instances simultaneously + Ceadaigh iliomad cásanna GUI flameshot ag an am céanna + + + This allows you to take screenshots of flameshot itself for example. + This allows you to take screenshots of flameshot itself for example. + + + Automatically close daemon when it is not needed + Dún an deamhan go huathoibríoch nuair nach bhfuil sé ag teastáil + + + Launch at startup + Seoladh ag tosú + + + Launch Flameshot + Inicia el Flameshot + + + + Show welcome message on launch + Taispeáin teachtaireacht fáilte ar an seoladh + + + + Use large predefined color palette + Úsáid pailéad mór dathanna réamhshainithe + + + + Copy URL after upload + Cóipeáil URL tar éis uaslódáil + + + Copy URL and close window after upload + Copia la URL i tanca la finestra després de la càrrega + + + + Save image after copy + Sábháil íomhá tar éis cóipeála + + + Save image file after copying it + Desa el fitxer d'imatge després d'haver-lo copiat + + + + Show the help message at the beginning in the capture mode + Taispeáin an teachtaireacht chabhrach ag an tús sa mhodh gabhála + + + + Use last region for GUI mode + Úsáid an réigiún deireanach le haghaidh mód comhéadain + + + + Use the last region as the default selection for the next screenshot in GUI mode + Bain úsáid as an réigiún deireanach mar roghnú réamhshocraithe don chéad scáileán eile i mód GUI + + + + Show the side panel toggle button in the capture mode + Taispeáin an cnaipe scoránaigh painéil taobh sa mhodh gabhála + + + + Enable desktop notifications + Cumasaigh fógraí deisce + + + + Show abort notifications + Taispeáin fógraí scoir + + + + Enable abort notifications + Cumasaigh fógraí scoir + + + + Show icon in the system tray + Taispeáin deilbhín i dtráidire an chórais + + + + Use grim to capture screenshots + Úsáid grim chun scáileáin a ghabháil + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + Is fóntais de chuid Wayland amháin é Grim chun scáileáin a ghabháil bunaithe ar an bprótacal cóipeála scáileáin. Go ginearálta, ní féidir é a chumasú ach ar bhainisteoirí fuinneoige íosta Wayland ar nós Sway, Hyprland, srl. + + + + Ask for confirmation to delete screenshot from the latest uploads + Iarr dearbhú chun an pictiúr a scriosadh ó na huaslódáil is déanaí + + + + Check for updates automatically + Seiceáil le haghaidh nuashonruithe go huathoibríoch + + + + This allows you to take screenshots of Flameshot itself for example + Ligeann sé seo duit screenshots de Flameshot féin a thógáil, mar shampla + + + Launch Flameshot daemon when computer is booted + Seoladh deamhan Flameshot nuair a bhíonn an ríomhaire tosaithe + + + + Show the welcome message box in the middle of the screen while taking a screenshot + Taispeáin an bosca teachtaireachta fáilte i lár an scáileáin agus scáileán á thógáil agat + + + + Use a large predefined color palette + Bain úsáid as pailéad mór dathanna réamhshainithe + + + + Copy on double click + Cóipeáil ar chliceáil dhúbailte + + + Enable Copy on Double Click + Cumasaigh Cóip ar Chliceáil Dhúbailte + + + Copy URL and close window after uploading was successful + Cóipeáil URL agus dún an fhuinneog tar éis gur éirigh leis an uaslódáil + + + + Automatically unload from memory when it is not needed + Díluchtú go huathoibríoch ón gcuimhne nuair nach bhfuil gá leis + + + + Automatically close daemon (background process) when it is not needed + Dún an daemon (próiseas cúlra) go huathoibríoch nuair nach bhfuil gá leis + + + + Launch in background at startup + Seoladh sa chúlra ag an am tosaithe + + + + Launch Flameshot daemon (background process) when computer is booted + Seoladh daemon Flameshot (próiseas cúlra) nuair a thosaítear an ríomhaire + + + + Ask before quit capture + Fiafraigh sula scoireann tú den ghabháil + + + + Show the confirmation prompt before ESC quit + Taispeáin an leid dheimhnithe sula scoireann ESC + + + + Enable Copy to clipboard on Double Click + Cumasaigh Cóipeáil chuig an ngearrthaisce ar Chliceáil Dhúbailte + + + + Copy URL after uploading was successful + Cóipeáil URL tar éis an uaslódála a bheith rathúil + + + + After copying the screenshot, save it to a file as well + Tar éis an scáileán a chóipeáil, sábháil é i gcomhad freisin + + + + Save Path + Sábháil Conair + + + + Change... + Athraigh... + + + + Use fixed path for screenshots to save + Úsáid cosán seasta le haghaidh screenshots le sábháil + + + + Preferred save file extension: + An síneadh comhaid sábhála is fearr leat: + + + + Latest Uploads Max Size + Uaslódáil is déanaí Uasmhéid + + + + Imgur Application Client ID + Aitheantas Cliant Feidhmchláir Imgur + + + + Undo limit + Teorainn a chur ar ceal + + + + Use JPG format for clipboard (PNG default) + Úsáid formáid JPG le haghaidh gearrthaisce (réamhshocrú PNG) + + + + Use lossy JPG format for clipboard (lossless PNG default) + Úsáid formáid JPG caillteanach don ghearrthaisce (PNG gan chailliúint réamhshocraithe) + + + + Copy file path after save + Cóipeáil cosán an chomhaid tar éis sábháil + + + + Copy the file path to clipboard after the file is saved + Cóipeáil cosán an chomhaid go dtí an gearrthaisce tar éis an comhad a shábháil + + + + Anti-aliasing image when zoom the pinned image + Íomhá frith-ailiasú nuair a bhíonn an íomhá greamaithe á zúmáil + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + Tar éis an íomhá phionnaithe a súmáil, ba chóir go bhfaigheadh an íomhá smúdáil nó go bhfanfadh sé picteilíneach + + + + + Upload image without confirmation + Uaslódáil íomhá gan deimhniú + + + + Choose a Folder + Roghnaigh Fillteán + + + + Unable to write to directory. + Ní féidir scríobh chuig comhadlann. + + + + Show magnifier + Taispeáin formhéadaitheoir + + + + Enable a magnifier while selecting the screenshot area + Cumasaigh formhéadúitheoir agus an limistéar pictiúr á roghnú agat + + + + Square shaped magnifier + Formhéadú-chruthach cearnach + + + + Make the magnifier to be square-shaped + Déan an formhéadóir a bheith i gcruth cearnach + + + + Milliseconds before geometry display hides; 0 means do not hide + Mileasoicindí sula bhfolaítear an taispeáint geoiméadrachta; ciallaíonn 0 nach bhfolaítear é + + + + Set geometry display timeout (ms) + Socraigh am scoir taispeána geoiméadrachta (ms) + + + + Selection Geometry Display + Taispeántas Geoiméadrachta Roghnúcháin + + + + Display Location + Suíomh Taispeána + + + + None + Dada + + + + Top Left + Barr ar Chlé + + + + Top Right + Barr ar Dheis + + + + Bottom Left + Bun ar Chlé + + + + Bottom Right + Bun ar Dheis + + + + Center + Lár + + + + Quality range of 0-100; Higher number is better quality and larger file size + Raon cáilíochta 0-100; Is fearr cáilíocht agus méid comhaid níos mó uimhir níos airde + + + + JPEG Quality + Cáilíocht JPEG + + + + Reverse arrow + Saighead droim ar ais + + + + Draw the arrow head first + Tarraing ceann na saighde ar dtús + + + + Insecure Pixelate + Picteilín Neamhshábháilte + + + + Draw the pixelation effect in an insecure but more asethetic way. + Tarraing an éifeacht picteilithe ar bhealach neamhchinnte ach níos neamh-eitiéiteach. + + + + HistoryWidget + + Latest Uploads + Últimes càrregues + + + Screenshots history is empty + L'historial de captures de pantalla és buit + + + Copy URL + Copia l'URL + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Open in browser + Obre al navegador + + + Confirm to delete + Confirmeu per esborrar + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Esteu segur de voler esborrar la captura de les últimes càrregues i del servidor? + + + + ImgS3Uploader + + Uploading Image + S'està pujant la imatge + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Error + Error + + + + ImgUploadDialog + + + Upload Confirmation + Dearbhú Uaslódáil + + + + Do you want to upload this capture? + An bhfuil fonn ort an ghabháil seo a uaslódáil? + + + + + Upload without confirmation + Uaslódáil gan deimhniú + + + + ImgUploader + + Uploading Image + S'està pujant la imatge + + + Delete image + Esborra la imatge + + + Unable to open the URL. + No es pot obrir l'URL. + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + Copy URL + Copia l'URL + + + Open URL + Obri l'URL + + + Image to Clipboard. + Imatge al porta-retalls. + + + + ImgUploaderBase + + + Upload image + Uaslódáil íomhá + + + + Uploading Image + Íomhá á Uaslódáil + + + + Copy URL + Cóipeáil URL + + + + Open URL + Oscail URL + + + + Delete image + Scrios íomhá + + + + Image to Clipboard. + Íomhá go Gearrthaisce . + + + + Save image + Sábháil íomhá + + + + Unable to open the URL. + Ní féidir an URL a oscailt. + + + + URL copied to clipboard. + URL cóipeáilte go gearrthaisce. + + + + Screenshot copied to clipboard. + Scáileán cóipeáilte chuig an ghearrthaisce. + + + + Unable to save the screenshot to disk. + Ní féidir an scáileán a shábháil ar dhiosca. + + + + Screenshot saved. + Scáileán sábhálta. + + + + ImgUploaderTool + + + Image Uploader + Uaslódálaí Íomhá + + + + Upload the selection + Uaslódáil an roghnúchán + + + + ImgurUploader + + Upload to Imgur + Puja a Imgur + + + Uploading Image + S'està pujant la imatge + + + Copy URL + Copia l'URL + + + Open URL + Obre l'URL + + + Delete image + Esborra la imatge + + + Image to Clipboard. + Imatge al porta-retalls. + + + + Unable to open the URL. + Ní féidir an URL a oscailt. + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + + ImgurUploaderTool + + Image Uploader + Puja la imatge + + + Upload the selection to Imgur + Puja la selecció a Imgur + + + + InfoWindow + + + + About + Maidir + + + + + Icon + Deilbhín + + + + + License + Ceadúnas + + + + + GPLv3+ + GPLv3+ + + + + + Version + Leagan + + + + + Flameshot v + Flameshot v + + + + + OS Info + Eolas faoin TOS + + + + + Copy Info + Cóipeáil Eolas + + + Right Click + Clic dret + + + Mouse Wheel + Roda del ratolí + + + Move selection 1px + Mou la selecció 1 px + + + Resize selection 1px + Redimensiona la selecció 1 px + + + Quit capture + Ix de la captura + + + Copy to clipboard + Copia al porta-retalls + + + Save selection as a file + Guarda la selecció com a fitxer + + + Undo the last modification + Desfés l'última modificació + + + Show color picker + Mostra el selector de color + + + Change the tool's thickness + Canvia el gruix de l'eina + + + Key + Tecla + + + Description + Descripció + + + <u><b>License</b></u> + <u><b>Llicència</b></u> + + + <u><b>Version</b></u> + <u><b>Versió</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Dreceres</b></u> + + + Available shortcuts in the screen capture mode. + Dreceres disponibles en el mode de captura de pantalla. + + + + InvertTool + + + Invert + Inbhéartaigh + + + + Set Inverter as the paint tool + Socraigh Inverter mar an uirlis péint + + + + LineTool + + + Line + Líne + + + + Set the Line as the paint tool + Socraigh an Líne mar uirlis péint + + + + MarkerTool + + + Marker + Marcóir + + + + Set the Marker as the paint tool + Socraigh an Marcóir mar uirlis péint + + + + MoveTool + + + Move + Bog + + + + Move the selection area + Bog an limistéar roghnúcháin + + + + PencilTool + + + Pencil + Peann luaidhe + + + + Set the Pencil as the paint tool + Socraigh an Peann luaidhe mar uirlis péint + + + + PinTool + + + Pin Tool + Uirlis Bioráin + + + + Pin image on the desktop + Bioráin íomhá ar an deasc + + + + PinWidget + + + Context menu + Roghchlár comhthéacs + + + + Copy to clipboard + Cóipeáil go gearrthaisce + + + + Save to file + Sábháil i gcomhad + + + + Rotate Right + Rothlaigh ar Dheis + + + + Rotate Left + Rothlaigh ar Chlé + + + + Increase Opacity + Méadaigh Teimhneacht + + + + Decrease Opacity + Laghdaigh an Teimhneacht + + + + Close + Dún + + + + PixelateTool + + + Pixelate + Picteilín + + + + Set Pixelate as the paint tool. + Socraigh Pixelate mar an uirlis péintéireachta. + + + Set Pixelate as the paint tool + Socraigh Pixelate mar uirlis péint + + + + PrimaryInstanceWidget + + + Primary instance + Príomh-eiseamláir + + + + <b>Primary instance.</b> Messages received from secondaries: + <b>Príomh-chás.</b> Teachtaireachtaí a fuarthas ó thánaisteacha: + + + + QHotkey + + Failed to register %1. Error: %2 + Theip ar chlárú %1. Earráid:%2 + + + Failed to unregister %1. Error: %2 + Theip ar dhíchlárú %1. Earráid:%2 + + + + QObject + + + + Capture saved to clipboard. + Gabháil sábháil sa ghearrthaisce . + + + + Error while saving to clipboard + Earráid agus tú ag sábháil sa ghearrthaisce + + + + Save screenshot + Sábháil an pictiúr + + + + Path copied to clipboard as + Cosán cóipeáilte go gearrthaisce mar + + + Saving canceled + Saving canceled + + + Save canceled + Save canceled + + + Capture is saved and copied to the clipboard as + La captura serà desada i copiada al porta-retalls com a + + + + Save Error + Earráid Sábhála + + + + + Capture saved as + Gabháil mar + + + + + Error trying to save as + Earráid agus é ag iarraidh sábháil mar + + + + Unable to connect via DBus + Ní féidir ceangal a dhéanamh trí DBus + + + + Powerful yet simple to use screenshot software. + Bogearraí scáileáin cumhachtach ach simplí le húsáid. + + + + See + Féach + + + Capture the entire desktop. + Gabháil an deasc iomlán. + + + + Open the capture launcher. + Oscail an tosaitheoir gabhála. + + + + Start a manual capture in GUI mode. + Tosaigh gabháil láimhe i mód GUI. + + + + Configure + Cumraigh + + + Capture a single screen. + Gabh scáileán amháin. + + + Path where the capture will be saved + Camí on es desarà la captura + + + + Capture screenshot of all monitors at the same time. + Gabh pictiúr scáileáin de na monatóirí go léir ag an am céanna. + + + + Capture a screenshot of the specified monitor. + Gabh pictiúr scáileáin den mhonatóir sonraithe. + + + + Existing directory or new file to save to + Comhadlann nó comhad nua atá ann cheana le sábháil ann + + + + Save the capture to the clipboard + Sábháil an ghabháil sa ghearrthaisce + + + + Pin the capture to the screen + Bioráin an ghabháil ar an scáileán + + + + Upload screenshot + Uaslódáil an pictiúr + + + + Delay time in milliseconds + Am moille i milleasoicind + + + + Repeat screenshot with previously selected region + Déan an pictiúr arís leis an réigiún a roghnaíodh roimhe seo + + + + Screenshot region to select + Réigiún scáileáin le roghnú + + + + Set the filename pattern + Socraigh patrún ainm comhaid + + + + Accept capture as soon as a selection is made + Glac le gabháil chomh luath agus a dhéantar roghnú + + + + Enable or disable the trayicon + Cumasaigh nó díchumasaigh an deilbhín tráidire + + + + Enable or disable run at startup + Cumasaigh nó díchumasaigh rith ag an tosaithe + + + + Enable or disable the notifications + Cumasaigh nó díchumasaigh na fógraí + + + + Check the configuration for errors + Seiceáil an chumraíocht le haghaidh earráidí + + + + Show the help message in the capture mode + Taispeáin an teachtaireacht chabhrach sa mhodh gabhála + + + + Define the main UI color + Sainmhínigh príomhdhath an chomhéadain + + + + Define the contrast UI color + Sainmhínigh dath an chomhéadain chodarsnachta + + + + Print raw PNG capture + Priontáil gabháil PNG amh + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + Priontáil geoiméadracht an roghnúcháin san fhormáid WxH + X + Y. Ní dhéanann aon rud má tá amh sonraithe + + + + Define the screen to capture (starting from 0) + Sainmhínigh an scáileán le gabháil (ag tosú ó 0) + + + + Invalid delay, it must be a number greater than 0 + Moill neamhbhailí, caithfidh sé a bheith ina uimhir níos mó ná 0 + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + Réigiún neamhbhailí, bain úsáid as 'WxH+X+Y' nó 'all' nó 'screen0/screen1/...'. + + + + Invalid path, must be an existing directory or a new file in an existing directory + Conair neamhbhailí, caithfidh sé a bheith ina chomhadlann atá ann cheana féin nó comhad nua i gcomhadlann atá ann cheana + + + Define the screen to capture + Define the screen to capture + + + + default: screen containing the cursor + réamhshocrú: scáileán ina bhfuil an cúrsóir + + + + Screen number + Uimhir scáileáin + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Dath neamhbhailí, tacaíonn an bhratach seo leis na formáidí seo a leanas: +- #RGB (is dhigit heicsidheichúil amháin é gach ceann de R, G, agus B) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Dathanna ainmnithe mar 'gorm' nó 'dearg' +B'fhéidir go mbeidh ort éalú ón gcomhartha '#' mar atá i '\#FFF' + + + Invalid delay, it must be higher than 0 + Invalid delay, it must be higher than 0 + + + + Invalid screen number, it must be non negative + Uimhir scáileáin neamhbhailí, caithfidh sé a bheith neamhdhiúltach + + + Invalid path, it must be a real path in the system + Invalid path, it must be a real path in the system + + + + Invalid value, it must be defined as 'true' or 'false' + Luach neamhbhailí, caithfear é a shainmhíniú mar 'fíor' nó 'bréagach' + + + + Error + Earráid + + + + Unable to write in + Ní féidir scríobh isteach + + + + Requested screen exceeds screen count + Sáraíonn an scáileán iarrtha líon na scáileáin + + + + Full screen screenshot pinned to screen + Scáileán iomlán greamaithe ar an scáileán + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + + Options + Roghanna + + + Arguments + Argóintí + + + arguments + argóintí + + + + Subcommands + Fo-orduithe + + + + subcommands + fo-orduithe + + + + Usage + Úsáid + + + + options + roghanna + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Ritheann Flameshot sa chúlra agus cuireann sé deilbhín tráidire le haghaidh cumraíochta. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Dia duit, tá mé anseo! Cliceáil ar an deilbhín sa tráidire chun scáileán a thógáil nó cliceáil le cnaipe ar dheis chun níos mó roghanna a fheiceáil. + + + Toggle side panel + Toggle side panel + + + Resize selection left 1px + Resize selection left 1px + + + Resize selection right 1px + Resize selection right 1px + + + Resize selection up 1px + Resize selection up 1px + + + Resize selection down 1px + Resize selection down 1px + + + Select entire screen + Select entire screen + + + Move selection left 1px + Move selection left 1px + + + Move selection right 1px + Move selection right 1px + + + Move selection up 1px + Move selection up 1px + + + Move selection down 1px + Move selection down 1px + + + Commit text in text area + Commit text in text area + + + Delete current tool + Delete current tool + + + + Quit capture + Scoir de ghabháil + + + + Screenshot history + Stair an scáileáin + + + + Capture screen + Gabháil an scáileán + + + + Show color picker + Taispeáin roghnóir dathanna + + + + Change the tool's size + Athraigh méid na huirlise + + + Change the tool's thickness + Canvia el gruix de l'eina + + + + RectangleTool + + + Rectangle + Dronuilleog + + + + Set the Rectangle as the paint tool + Socraigh an Dronuilleog mar uirlis péint + + + + RedoTool + + + Redo + Athdhéanamh + + + + Redo the next modification + Déan an chéad mhodhnú eile arís + + + + SaveTool + + + Save + Sábháil + + + + Save screenshot to a file + Sábháil an pictiúr i gcomhad + + + Save the capture + Guarda la captura + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Ní féidir timpeallacht deisce a bhrath (GNOME? KDE? Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + Éilíonn an t-oiriúntóir gabhála scáileáin uilíoch Wayland Grim mar chomhpháirt gabhála scáileáin de Wayland. Mura bhfuil an chomhpháirt gabhála scáileáin ann, suiteáil é le do thoil! + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + Mura bhfuil an socrú useGrimAdapter cumasaithe, úsáidfear an prótacal dbus. Ba chóir a thabhairt faoi deara nach moltar an prótacal dbus a úsáid faoi wayland. Moltar an socrú useGrimAdapter a chumasú i flameshot.ini chun an t-oiriúntóir scáileáin wayland ginearálta bunaithe ar grim a ghníomhachtú + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + Tá comhpháirt scáileáin grim curtha i bhfeidhm bunaithe ar wlroots, ní fhéadfar é a úsáid i dtimpeallachtaí deisce GNOME nó i dtimpeallachtaí deisce comhchosúla + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + Ní féidir timpeallacht deisce a bhrath (GNOME? KDE? Qile? Sway? ...) + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + Leid: déan iarracht an athróg timpeallachta XDG_CURRENT_DESKTOP a shocrú. + + + + Unable to capture screen + Ní féidir an scáileán a ghabháil + + + + SecondaryInstanceWidget + + + Secondary instance + Sampla tánaisteach + + + + <b>Secondary instance.</b> Send message to primary: + <b>Ceist thánaisteach.</b> Seol teachtaireacht chuig an bpríomhcheantar: + + + + Type something here... + Clóscríobh rud éigin anseo... + + + + &Send + &Seol + + + + Error sending message + Earráid ag seoladh an teachtaireachta + + + + The message '%1' could not be sent to the primary. + Níorbh fhéidir an teachtaireacht '%1' a sheoladh chuig an bpríomh-theachtaireacht. + + + + SelectionTool + + + Rectangular Selection + Roghnú Dronuilleogach + + + + Set Selection as the paint tool + Socraigh Roghnúchán mar uirlis péint + + + + SetShortcutDialog + + + Set Shortcut + Socraigh Aicearra + + + + Enter new shortcut to change + Iontráil aicearra nua le hathrú + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Brúigh Esc chun an aicearra méarchláir a dhíchumasú. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Brúigh Esc chun an aicearra méarchláir a dhíchumasú. + + + + + Flameshot must be restarted for changes to take effect. + Caithfear Flameshot a atosú chun go dtiocfaidh athruithe. + + + + ShortcutsWidget + + + Hot Keys + Eochracha Te + + + + Available shortcuts in the screen capture mode. + Aicearraí atá ar fáil sa mhodh gabhála scáileáin. + + + + Description + Cur síos + + + + Key + Eochair + + + + Left Double-click + Cliceáil ar chlé faoi dhó + + + + Toggle side panel + Scoránaigh painéal taoibh + + + + Grab a color from the screen + Faigh dath ón scáileán + + + + Resize selection left 1px + Athraigh méid an roghnúcháin ar chlé 1px + + + + Resize selection right 1px + Athraigh méid an roghnúcháin ar dheis 1px + + + + Resize selection up 1px + Athraigh méid an roghnúcháin suas 1px + + + + Resize selection down 1px + Athraigh méid an roghnúcháin síos 1px + + + + Symmetrically decrease width by 2px + Laghdaigh an leithead go siméadrach faoi 2px + + + + Symmetrically increase width by 2px + Méadaigh an leithead go siméadrach faoi 2px + + + + Symmetrically increase height by 2px + Méadaigh an airde go siméadrach faoi 2px + + + + Symmetrically decrease height by 2px + Laghdaigh an airde go siméadrach faoi 2px + + + + Select entire screen + Roghnaigh an scáileán iomlán + + + + Move selection left 1px + Bog an roghnúchán ar chlé 1px + + + + Move selection right 1px + Bog an roghnúchán ar dheis 1px + + + + Move selection up 1px + Bog an roghnúchán suas 1px + + + + Move selection down 1px + Bog an roghnúchán síos 1px + + + + Commit text in text area + Tiomantaigh téacs i limistéar téacs + + + + Delete selected drawn object + Scrios an réad tarraingthe roghnaithe + + + + Cancel current selection + Cealaigh an rogha reatha + + + Delete current tool + Scrios uirlis reatha + + + + Capture screen + Gabháil an scáileán + + + + Screenshot history + Stair an scáileáin + + + + SidePanelWidget + + Active thickness: + Active thickness: + + + Active color: + Active color: + + + Press ESC to cancel + Press ESC to cancel + + + + Active tool size: + Méid uirlisí gníomhach: + + + + Active Color: + Dath Gníomhach: + + + + Grab Color + Grab Dath + + + + Display grid + Eangach taispeána + + + + SizeDecreaseTool + + + Decrease Tool Size + Laghdaigh Méid na nUirlisí + + + + Decrease the size of the other tools + Laghdaigh méid na n-uirlisí eile + + + + SizeIncreaseTool + + + Increase Tool Size + Méadaigh Méid na nUirlisí + + + + Increase the size of the other tools + Méadaigh méid na n-uirlisí eile + + + + SizeIndicatorTool + + Selection Size Indicator + Táscaire Méid Roghnúcháin + + + Show X and Y dimensions of the selection + Taispeáin toisí X agus Y an roghnúcháin + + + Show the dimensions of the selection (X Y) + Mostra les mides de la selecció (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + Céad (00-99) + + + + Year (00-99) + Bliain (00-99) + + + + Year (2000) + Tá tús á chur amárach le hobair athchóirithe atá beartaithe ar 22 scoil a thóg Western Building Systems + + + + Month Name (jan) + Ainm Míosa (eanáir) + + + + Month Name (january) + Ainm na Míosa (Eanáir) + + + + Month (01-12) + Mí (01-12) + + + + Week Day (1-7) + Lá na Seachtaine (1-7) + + + + Week (01-53) + Seachtain (01-53) + + + + Day Name (mon) + Ainm an Lae (Aigne) + + + + Day Name (monday) + Ainm an Lae (Dé Luain) + + + + Day (01-31) + Lá (01-31) + + + + Day of Month (1-31) + Lá na Míosa (1-31) + + + + Day (001-366) + Lá (001-366) + + + + Hour (00-23) + Uair an chloig (00-23) + + + + Hour (01-12) + Uair (01-12) + + + + Minute (00-59) + Nóiméad (00-59) + + + + Second (00-59) + An Dara (00-59) + + + + Full Date (%m/%d/%y) + Dáta Iomlán (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + Dáta Iomlán (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + Dáta Iomlán (%d-%m-%Y) + + + + Time (%H-%M-%S) + Am (%H-%M-%S) + + + + Time (%H-%M) + Am (%H-%M) + + + + SystemNotification + + + Flameshot Info + Eolas Flameshot + + + + TextConfig + + + StrikeOut + Bualadh amach + + + + Underline + Béim + + + + Bold + Cló trom + + + + Italic + Iodálach + + + + Left Align + Ailínigh ar Chlé + + + + Center Align + Lárnaigh Ailíniú + + + + Right Align + Ailíniú ar Dheis + + + + TextTool + + + Text + Téacs + + + + Add text to your capture + Cuir téacs le do ghabháil + + + + TrayIcon + + + &Take Screenshot + &Tóg Scáileán den Scáileán + + + + &Open Launcher + &Oscail an Tosaitheoir + + + + &Configuration + &Cumraíocht + + + + &About + &Maidir + + + + Check for updates + Seiceáil le haghaidh nuashonruithe + + + + New version %1 is available + Tá leagan nua %1 ar fáil + + + + &Quit + &Scoir + + + + &Latest Uploads + &Uaslódálacha is Déanaí + + + + &Open Save Path + &Oscail an Chonair Shábháilte + + + + UIcolorEditor + + UI Color Editor + Editor de color de la interfície + + + + Change the color moving the selectors and see the changes in the preview buttons. + Athraigh an dath ag bogadh na roghnóirí agus féach na hathruithe sna cnaipí réamhamhairc. + + + + Select a Button to modify it + Roghnaigh Cnaipe chun é a mhodhnú + + + + Main Color + Príomhdhath + + + + Click on this button to set the edition mode of the main color. + Cliceáil ar an gcnaipe seo chun modh eagrán an phríomhdhath a shocrú. + + + + Contrast Color + Dath Codarsnachta + + + + Click on this button to set the edition mode of the contrast color. + Cliceáil ar an gcnaipe seo chun modh eagrán an dath codarsnachta a shocrú. + + + + UndoTool + + + Undo + Cealaigh + + + + Undo the last modification + Cealaigh an mhodhnú deireanach + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + Tá leagan nua Flameshot %1 ar fáil + + + + Ignore + Déan neamhaird + + + + Later + Níos déanaí + + + + Update + Nuashonraigh + + + + UploadHistory + + + Upload History + Stair Uaslódáil + + + + Screenshots history is empty + Tá stair na screenshots folamh + + + + UploadLineItem + + + Form + Foirm + + + + TextLabel + Lipéad Téacs + + + + Copy URL + Cóipeáil URL + + + + Open In Browser + Oscail sa bhrabhsálaí + + + + Confirm to delete + Deimhnigh é a scriosadh + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + An bhfuil tú cinnte gur mhaith leat scáileán a scriosadh ón uaslódáil agus ón bhfreastalaí is déanaí? + + + + UtilityPanel + + + Close + Dún + + + + <Empty> + <Folamh> + + + + VisualsEditor + + + Opacity of area outside selection: + Teimhneacht an limistéir taobh amuigh den roghnú: + + + + UI Color Editor + Eagarthóir Dathanna Chomhéadain + + + + Colorpicker Editor + Eagarthóir Pioctha Dathanna + + + + Button Selection + Roghnú Cnaipe + + + + Select All + Roghnaigh Gach Rud + + + + color_widgets::ColorDialog + + + Pick + Pioc + + + + color_widgets::ColorPalette + + + Unnamed + Gan ainm + + + + color_widgets::ColorPaletteModel + + + Unnamed + Gan ainm + + + + %1 (%2 colors) + %1 (%2 dathanna) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + Oscail pailéad nua ó chomhad + + + + + Create a new palette + Cruthaigh pailéad nua + + + + + Duplicate the current palette + Dúbailt an pailéad reatha + + + + + Delete the current palette + Scrios an pailéad reatha + + + + + Revert changes to the current palette + Cuir athruithe ar an bpailéad reatha ar ais + + + + + Save changes to the current palette + Sábháil athruithe ar an bpailéad reatha + + + + + Add a color to the palette + Cuir dath leis an bpailéad + + + + + Remove the selected color from the palette + Bain an dath roghnaithe ón bpailéad + + + + + New Palette + Pailéad Nua + + + + + Name + Ainm + + + + GIMP Palettes (*.gpl) + Pailléid GIMP (*.gpl) + + + + Palette Image (%1) + Pailéad Íomhá (%1) + + + + All Files (*) + Gach Comhad (*) + + + + + Open Palette + Oscail Pailéad + + + + Failed to load the palette file +%1 + Theip ar an gcomhad pailéad a luchtú +%1 + + + + color_widgets::GradientEditor + + + Add Color + Cuir Dath leis + + + + Remove Color + Bain Dath + + + + Edit Color... + Cuir Dath in Eagar... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 dathanna) + + + + color_widgets::Swatch + + + Clear Color + Glan Dath + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_gl.ts b/data/translations/Internationalization_gl.ts new file mode 100644 index 0000000..69a7d56 --- /dev/null +++ b/data/translations/Internationalization_gl.ts @@ -0,0 +1,3165 @@ + + + + + AbstractWidgetList + + + Add New + Add New + + + + Move Up + Move Up + + + + Move Down + Move Down + + + + Remove + Remove + + + + AcceptTool + + + Accept + Accept + + + + Accept the capture + Accept the capture + + + + AppLauncher + + + App Launcher + Lanzador de aplicacións + + + + Choose an app to open the capture + Escolle unha aplicación para abrir a captura + + + + AppLauncherWidget + + + Open With + Abrir con + + + + Launch in terminal + Abrir no terminal + + + + Keep open after selection + Manter aberto após a selección + + + + + Error + Erro + + + + Unable to launch in terminal. + Non foi posíbel abrir no terminal. + + + + Unable to write in + Non é posíbel escribir en + + + + ArrowTool + + + Arrow + Frecha + + + + Set the Arrow as the paint tool + Usar a Frecha como ferramenta de deseño + + + + BlurTool + + Blur + Desenfocament + + + Set Blur as the paint tool + Estableix el desenfocament com a eina de dibuix + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Modo de captura</b> + + + + Rectangular Region + Rexión rectangular + + + + Full Screen (Current Display) + Pantalla enteira (Monitor actual) + + + + Full Screen (All Monitors) + Pantalla enteira (Todos os monitores) + + + + No Delay + Sen atraso + + + + second + segundo + + + + + + seconds + segundos + + + + + Take new screenshot + Tirar unha nova captura de pantalla + + + + + Area: + Área: + + + + + Capture Launcher + Capture Launcher + + + + + TextLabel + TextLabel + + + + + Capture Mode + Capture Mode + + + + + Delay: + Atraso: + + + + + WxH+x+y + WxH+x+y + + + + CaptureWidget + + + Unable to capture screen + Impossible capturar la pantalla + Non foi posíbel capturar a pantalla + + + + Mouse + Mouse + + + + Select screenshot area + Select screenshot area + + + + Mouse Wheel + Roda del ratolí + + + + Change tool size + Change tool size + + + + Right Click + Clic dret + + + + Show color picker + Show color picker + + + + Open side panel + Open side panel + + + + Esc + Esc + + + + Exit + Saír + + + + Quit Capture + + + + + Are you sure you want to quit capture? + + + + + Do not show this again + + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + Configuration error resolved. Launch `flameshot gui` again to apply it. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Selecciona unha área co rato, ou preme Esc para saír. +Preme Enter para capturar a pantalla. +Preme Click Dereito para mostrar o selector de cor. +Usa a roda do rato para cambiar o grosor da ferramenta. +Preme Espacio para abrir o panel lateral. + + + + Tool Settings + Configuración das ferramentas + + + + CircleCountTool + + + Circle Counter + Contorno do círculo + + + + Add an autoincrementing counter bubble + Engade unha burbulla de contador autoincrementante + + + + CircleTool + + + Circle + Círculo + + + + Set the Circle as the paint tool + Usa o círculo como ferramenta de deseño + + + + ColorDialog + + + + Select Color + Select Color + + + + + Saturation + Saturation + + + + + Hue + Hue + + + + + Hex + Hex + + + + + Blue + Blue + + + + + Value + Value + + + + + Green + Green + + + + + Alpha + Alpha + + + + + Red + Red + + + + ColorGrabWidget + + + Accept color + Accept color + + + + Enter or Left Click + Enter or Left Click + + + + Precisely select color + Precisely select color + + + + Hold Left Click + Hold Left Click + + + + Toggle magnifier + Toggle magnifier + + + + Space or Right Click + Space or Right Click + + + + Cancel + Cancel + + + + Esc + Esc + + + + ColorPickerEditor + + + Edit Preset: + Edit Preset: + + + + Enter color to update preset + Enter color to update preset + + + + Update + Update + + + + Press button to update the selected preset + Press button to update the selected preset + + + + Delete + Delete + + + + Press button to delete the selected preset + Press button to delete the selected preset + + + + Add Preset: + Add Preset: + + + + Enter color manually or select it using the color-wheel + Enter color manually or select it using the color-wheel + + + + Add + Add + + + + Press button to add preset + Press button to add preset + + + + + Error + Error + + + + Unable to add preset. Maximum limit reached. + Unable to add preset. Maximum limit reached. + + + + Unable to remove preset. Minimum limit reached. + Unable to remove preset. Minimum limit reached. + + + + ConfigErrorDetails + + + Configuration errors + Configuration errors + + + + ConfigHandler + + + Unrecognized setting: '%1' + + Unrecognized setting: '%1' + + + + + Unrecognized shortcut name: '%1'. + + Unrecognized shortcut name: '%1'. + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + + + + Bad value in '%1'. Expected: %2 + + Bad value in '%1'. Expected: %2 + + + + + You have successfully resolved the configuration error. + You have successfully resolved the configuration error. + + + + The configuration contains an error. Open configuration to resolve. + The configuration contains an error. Open configuration to resolve. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + Bad config key '%1' in ConfigHandler. Please report this as a bug. + + + + ConfigResolver + + + Resolve configuration errors + Resolve configuration errors + + + + <b>You must resolve all errors before continuing:</b> + <b>You must resolve all errors before continuing:</b> + + + + Reset + Reset + + + + Reset to the default value. + Reset to the default value. + + + + Remove + Remove + + + + Remove this setting. + Remove this setting. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + + + + Resolve all + Resolve all + + + + Resolve all listed errors. + Resolve all listed errors. + + + + Details + Details + + + + ConfigWindow + + + Configuration + Configuración + + + + Interface + Interface + + + + Filename Editor + Editor do nome do arquivo + + + + General + Xeral + + + + Shortcuts + Atallos + + + + Resolve + Resolve + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>Configuration file has errors. Resolve them before continuing.</b> + + + + Controller + + New version %1 is available + Nova versión %1 está dispoñíbel + + + You have the latest version + Tes a versión máis recente + + + Failed to get information about the latest version. + Non foi posíbel obter informacións sobre a versión máis recente. + + + Error + Erro + + + Unable to close active modal widgets + Incapaz de pechar widgets modais activos + + + &Open Launcher + &Abrir o lanzador de aplicativos + + + &Configuration + &Configuración + + + &About + &Sobre + + + Check for updates + Verificar se hai actualizacións + + + &Latest Uploads + &Últimos envíos + + + &Information + &Informació + + + &Quit + &Saír + + + &Take Screenshot + &Tirar unha captura de pantalla + + + + CopyTool + + + Copy + Copiar + + + + Copy selection to clipboard + Copy selection to clipboard + + + Copy the selection into the clipboard + Copia a selección para a área de transferencia + + + + DBusUtils + + Unable to connect via DBus + Non foi posible conectar vía DBus + + + + ExitTool + + + Exit + Saír + + + + Leave the capture screen + Saír da pantalla de captura + + + + FileNameEditor + + + Edit the name of your captures: + Edita o nome das túas capturas: + + + + Edit: + Editar: + + + + Preview: + Previsualización: + + + + Save + Gardar + + + + Saves the pattern + Garda o patrón + + + + Restore + Restaurar + + + Reset + Reinicialitza + + + + Restores the saved pattern + Restaura o padrón gardado + + + + Clear + Limpar + + + + Deletes the name + Apaga o padrón + + + + Flameshot + + + Error + Error + + + + Unable to close active modal widgets + Incapaz de pechar widgets modais activos + + + + URL copied to clipboard. + URL copied to clipboard. + + + + FlameshotDaemon + + + New version %1 is available + Nova versión %1 está dispoñíbel + + + + You have the latest version + Tes a versión máis recente + + + + Failed to get information about the latest version. + Non foi posíbel obter informacións sobre a versión máis recente. + + + + Unable to connect via DBus + Unable to connect via DBus + + + + GeneneralConf + + Show help message + Mostra el missatge d'ajuda + + + Show the help message at the beginning in the capture mode. + Mostra el missatge d'ajuda en iniciar el mode de captura. + + + Show desktop notifications + Mostra les notificacions d'escriptori + + + Show tray icon + Mostra la icona en la barra de tasques + + + Show the systemtray icon + Mostra la icona en la barra de tasques + + + Import + Importar + + + Error + Error + + + Unable to read file. + Impossible llegir el fitxer. + + + Unable to write file. + Impossible escriure al fitxer. + + + Save File + Guardar Arxiu + + + Confirm Reset + Confirmar Reset + + + Are you sure you want to reset the configuration? + Esteu segur que voleu reiniciar la configuració? + + + Configuration File + Fitxer de Configuració + + + Export + Exportar + + + Reset + Reset + + + Launch at startup + Llançament a l'inici + + + + GeneralConf + + + + Import + Importar + + + + + + + Error + Erro + + + + Unable to read file. + Incapaz de ler o arquivo. + + + + + Unable to write file. + Incapaz de gardar o arquivo. + + + + Save File + Gardar arquivo + + + + Confirm Reset + Confirma a reinicialización + + + + Are you sure you want to reset the configuration? + Tes certeza que queres reinicializar a configuración? + + + + Show help message + Mostra a mensaxe de axuda + + + Show the help message at the beginning in the capture mode. + Mostra a mensaxe de axuda no inicio do modo de captura. + + + + Show the side panel button + Mostra o botón no panel lateral + + + Show the side panel toggle button in the capture mode. + Mostra o botón de alternancia do panel lateral no modo de captura. + + + + Show desktop notifications + Amosar as notificacións no escritorio + + + + Show tray icon + Mostrar icono na barra de tarefas + + + Show the systemtray icon + Mostrar o icono na barra de tarefas do sistema + + + + Confirmation required to delete screenshot from the latest uploads + Confirmación necesaria para excluir a captura de pantalla dos uploads mais recentes + + + + Configuration File + Arquivo de configuración + + + + Export + Exportar + + + + Reset + Reiniciar + + + + Automatic check for updates + Verificación automática de actualizacións + + + + Allow multiple flameshot GUI instances simultaneously + Allow multiple flameshot GUI instances simultaneously + + + Automatically close daemon when it is not needed + Automatically close daemon when it is not needed + + + Launch at startup + Executar no inicio do sistema + + + Launch Flameshot + Executar Flameshot + + + + Show welcome message on launch + Amosar mensaxe de benvida no inicio + + + + Use large predefined color palette + Use large predefined color palette + + + + Copy URL after upload + Copiar a URL despois da subida + + + Copy URL and close window after upload + Copiar a URL e pechar a xanela despois da subida + + + + Save image after copy + Gardar a imaxe despois de copiar + + + Save image file after copying it + Gardar o arquivo de imaxe despois de copialo + + + + Show the help message at the beginning in the capture mode + Show the help message at the beginning in the capture mode + + + + Use last region for GUI mode + Use last region for GUI mode + + + + Use the last region as the default selection for the next screenshot in GUI mode + Use the last region as the default selection for the next screenshot in GUI mode + + + + Show the side panel toggle button in the capture mode + Show the side panel toggle button in the capture mode + + + + Enable desktop notifications + Enable desktop notifications + + + + Show abort notifications + + + + + Enable abort notifications + + + + + Show icon in the system tray + Show icon in the system tray + + + + Use grim to capture screenshots + + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + + + + + Ask for confirmation to delete screenshot from the latest uploads + Ask for confirmation to delete screenshot from the latest uploads + + + + Check for updates automatically + Check for updates automatically + + + + This allows you to take screenshots of Flameshot itself for example + This allows you to take screenshots of Flameshot itself for example + + + Launch Flameshot daemon when computer is booted + Launch Flameshot daemon when computer is booted + + + + Show the welcome message box in the middle of the screen while taking a screenshot + Show the welcome message box in the middle of the screen while taking a screenshot + + + + Use a large predefined color palette + Use a large predefined color palette + + + + Copy on double click + Copy on double click + + + Enable Copy on Double Click + Enable Copy on Double Click + + + Copy URL and close window after uploading was successful + Copy URL and close window after uploading was successful + + + + Automatically unload from memory when it is not needed + + + + + Automatically close daemon (background process) when it is not needed + + + + + Launch in background at startup + + + + + Launch Flameshot daemon (background process) when computer is booted + + + + + Ask before quit capture + + + + + Show the confirmation prompt before ESC quit + + + + + Enable Copy to clipboard on Double Click + + + + + Copy URL after uploading was successful + + + + + After copying the screenshot, save it to a file as well + After copying the screenshot, save it to a file as well + + + + Save Path + Gardar ruta + + + + Change... + Alterar... + + + + Use fixed path for screenshots to save + Usar unha ruta fixa para gardar a captura de pantalla + + + + Preferred save file extension: + Preferred save file extension: + + + + Latest Uploads Max Size + Tamaño máximo das subidas mais recentes + + + + Imgur Application Client ID + Imgur Application Client ID + + + + Undo limit + Undo limit + + + + Use JPG format for clipboard (PNG default) + Usa o formato JPG para a área de transferencia (PNG por defecto) + + + + Use lossy JPG format for clipboard (lossless PNG default) + + + + + Copy file path after save + Copia a ruta do arquivo despois de gardar + + + + Copy the file path to clipboard after the file is saved + Copy the file path to clipboard after the file is saved + + + + Anti-aliasing image when zoom the pinned image + Anti-aliasing image when zoom the pinned image + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + After zooming the pinned image, should the image get smoothened or stay pixelated + + + + + Upload image without confirmation + Upload image without confirmation + + + + Choose a Folder + Escolle un directorio + + + + Unable to write to directory. + Incapaz de escribir no directorio. + + + + Show magnifier + Show magnifier + + + + Enable a magnifier while selecting the screenshot area + Enable a magnifier while selecting the screenshot area + + + + Square shaped magnifier + Square shaped magnifier + + + + Make the magnifier to be square-shaped + Make the magnifier to be square-shaped + + + + Milliseconds before geometry display hides; 0 means do not hide + + + + + Set geometry display timeout (ms) + + + + + Selection Geometry Display + + + + + Display Location + + + + + None + + + + + Top Left + + + + + Top Right + + + + + Bottom Left + + + + + Bottom Right + + + + + Center + + + + + Quality range of 0-100; Higher number is better quality and larger file size + + + + + JPEG Quality + + + + + Reverse arrow + + + + + Draw the arrow head first + + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + Últimos envíos + + + Screenshots history is empty + O histórico de capturas de pantalla está valeiro + + + Copy URL + Copiar a URL + + + URL copied to clipboard. + URL copiada para a área de transferencia. + + + Open in browser + Abrir no navegador + + + Confirm to delete + Confirma para borrar + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Tes certeza de que desexas borrar unha captura de pantalla das últimas subidas e do servidor? + + + + ImgS3Uploader + + Uploading Image + S'està pujant la imatge + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Error + Error + + + + ImgUploadDialog + + + Upload Confirmation + Upload Confirmation + + + + Do you want to upload this capture? + Do you want to upload this capture? + + + + + Upload without confirmation + Upload without confirmation + + + + ImgUploader + + Uploading Image + S'està pujant la imatge + + + Delete image + Esborra la imatge + + + Unable to open the URL. + No es pot obrir l'URL. + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + Copy URL + Copia l'URL + + + Open URL + Obri l'URL + + + Image to Clipboard. + Imatge al porta-retalls. + + + + ImgUploaderBase + + + Upload image + Upload image + + + + Uploading Image + Uploading Image + + + + Copy URL + Copy URL + + + + Open URL + Open URL + + + + Delete image + Delete image + + + + Image to Clipboard. + Image to Clipboard. + + + + Save image + Save image + + + + Unable to open the URL. + Unable to open the URL. + + + + URL copied to clipboard. + URL copied to clipboard. + + + + Screenshot copied to clipboard. + Screenshot copied to clipboard. + + + + Unable to save the screenshot to disk. + Unable to save the screenshot to disk. + + + + Screenshot saved. + Screenshot saved. + + + + ImgUploaderTool + + + Image Uploader + Cargador de imaxes + + + + Upload the selection + Upload the selection + + + + ImgurUploader + + Upload to Imgur + Enviar para Imgur + + + Uploading Image + Enviando imaxe + + + Copy URL + Copiar URL + + + Open URL + Abrir URL + + + Delete image + Borrar imaxe + + + Image to Clipboard. + Imaxe a área de transeferencia. + + + + Unable to open the URL. + Non foi posible abrir a URL. + + + URL copied to clipboard. + URL copiada para a área de transferencia. + + + Screenshot copied to clipboard. + Captura de pantalla copiada para a área de transferencia. + + + + ImgurUploaderTool + + Image Uploader + Image Uploader + + + Upload the selection to Imgur + Upload the selection to Imgur + + + + InfoWindow + + + + About + Información + + + + + Icon + Icon + + + + + License + License + + + + + GPLv3+ + GPLv3+ + + + + + Version + Version + + + + + Flameshot v + Flameshot v + + + + + OS Info + OS Info + + + + + Copy Info + Copy Info + + + Right Click + Clic dret + + + Mouse Wheel + Roda del ratolí + + + Move selection 1px + Mou la selecció 1 px + + + Resize selection 1px + Redimensiona la selecció 1 px + + + Quit capture + Ix de la captura + + + Copy to clipboard + Copia al porta-retalls + + + Save selection as a file + Guarda la selecció com a fitxer + + + Undo the last modification + Desfés l'última modificació + + + Show color picker + Mostra el selector de color + + + Change the tool's thickness + Canvia el gruix de l'eina + + + Key + Tecla + + + Description + Descripció + + + <u><b>License</b></u> + <u><b>Licenza</b></u> + + + <u><b>Version</b></u> + <u><b>Version</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Dreceres</b></u> + + + Available shortcuts in the screen capture mode. + Dreceres disponibles en el mode de captura de pantalla. + + + + InvertTool + + + Invert + Invert + + + + Set Inverter as the paint tool + Set Inverter as the paint tool + + + + LineTool + + + Line + Line + + + + Set the Line as the paint tool + Set the Line as the paint tool + + + + MarkerTool + + + Marker + Marker + + + + Set the Marker as the paint tool + Set the Marker as the paint tool + + + + MoveTool + + + Move + Move + + + + Move the selection area + Move the selection area + + + + PencilTool + + + Pencil + Pencil + + + + Set the Pencil as the paint tool + Set the Pencil as the paint tool + + + + PinTool + + + Pin Tool + Pin Tool + + + + Pin image on the desktop + Pin image on the desktop + + + + PinWidget + + + Context menu + Context menu + + + + Copy to clipboard + Copia al porta-retalls + + + + Save to file + Save to file + + + + Rotate Right + + + + + Rotate Left + + + + + Increase Opacity + + + + + Decrease Opacity + + + + + Close + Close + + + + PixelateTool + + + Pixelate + Pixelate + + + + Set Pixelate as the paint tool. + + + + Set Pixelate as the paint tool + Set Pixelate as the paint tool + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QHotkey + + Failed to register %1. Error: %2 + Failed to register %1. Error: %2 + + + Failed to unregister %1. Error: %2 + Failed to unregister %1. Error: %2 + + + + QObject + + + + Capture saved to clipboard. + Capture saved to clipboard. + + + + Error while saving to clipboard + Error while saving to clipboard + + + + Save screenshot + Save screenshot + + + + Path copied to clipboard as + Path copied to clipboard as + + + Saving canceled + Saving canceled + + + Save canceled + Save canceled + + + Capture is saved and copied to the clipboard as + Capture is saved and copied to the clipboard as + + + + Save Error + Save Error + + + + + Capture saved as + Capture saved as + + + + + Error trying to save as + Error trying to save as + + + + Unable to connect via DBus + Unable to connect via DBus + + + + Powerful yet simple to use screenshot software. + Powerful yet simple to use screenshot software. + + + + See + See + + + Capture the entire desktop. + Capture the entire desktop. + + + + Open the capture launcher. + Open the capture launcher. + + + + Start a manual capture in GUI mode. + Start a manual capture in GUI mode. + + + + Configure + Configure + + + Capture a single screen. + Capture a single screen. + + + Path where the capture will be saved + Path where the capture will be saved + + + + Capture screenshot of all monitors at the same time. + + + + + Capture a screenshot of the specified monitor. + + + + + Existing directory or new file to save to + Existing directory or new file to save to + + + + Save the capture to the clipboard + Save the capture to the clipboard + + + + Pin the capture to the screen + Pin the capture to the screen + + + + Upload screenshot + Upload screenshot + + + + Delay time in milliseconds + Delay time in milliseconds + + + + Repeat screenshot with previously selected region + Repeat screenshot with previously selected region + + + + Screenshot region to select + Screenshot region to select + + + + Set the filename pattern + Set the filename pattern + + + + Accept capture as soon as a selection is made + Accept capture as soon as a selection is made + + + + Enable or disable the trayicon + Enable or disable the trayicon + + + + Enable or disable run at startup + Enable or disable run at startup + + + + Enable or disable the notifications + + + + + Check the configuration for errors + Check the configuration for errors + + + + Show the help message in the capture mode + Show the help message in the capture mode + + + + Define the main UI color + Define the main UI color + + + + Define the contrast UI color + Define the contrast UI color + + + + Print raw PNG capture + Print raw PNG capture + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + + + + Define the screen to capture (starting from 0) + Define the screen to capture (starting from 0) + + + + Invalid delay, it must be a number greater than 0 + Invalid delay, it must be a number greater than 0 + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + + + + Invalid path, must be an existing directory or a new file in an existing directory + Invalid path, must be an existing directory or a new file in an existing directory + + + Define the screen to capture + Define the screen to capture + + + + default: screen containing the cursor + default: screen containing the cursor + + + + Screen number + Screen number + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + + + Invalid delay, it must be higher than 0 + Invalid delay, it must be higher than 0 + + + + Invalid screen number, it must be non negative + Invalid screen number, it must be non negative + + + Invalid path, it must be a real path in the system + Invalid path, it must be a real path in the system + + + + Invalid value, it must be defined as 'true' or 'false' + Invalid value, it must be defined as 'true' or 'false' + + + + Error + Error + + + + Unable to write in + Unable to write in + + + Capture saved to clipboard + Capture saved to clipboard + + + URL copied to clipboard. + URL copied to clipboard. + + + + Options + Options + + + Arguments + Arguments + + + arguments + arguments + + + + Subcommands + + + + + subcommands + + + + + Usage + Usage + + + + options + options + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Per default runs Flameshot in the background and adds a tray icon for configuration. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + + + + Requested screen exceeds screen count + Requested screen exceeds screen count + + + + Full screen screenshot pinned to screen + Full screen screenshot pinned to screen + + + Toggle side panel + Toggle side panel + + + Resize selection left 1px + Resize selection left 1px + + + Resize selection right 1px + Resize selection right 1px + + + Resize selection up 1px + Resize selection up 1px + + + Resize selection down 1px + Resize selection down 1px + + + Select entire screen + Select entire screen + + + Move selection left 1px + Move selection left 1px + + + Move selection right 1px + Move selection right 1px + + + Move selection up 1px + Move selection up 1px + + + Move selection down 1px + Move selection down 1px + + + Commit text in text area + Commit text in text area + + + Delete current tool + Delete current tool + + + + Quit capture + Quit capture + + + + Screenshot history + Screenshot history + + + + Capture screen + Capture screen + + + + Show color picker + Show color picker + + + + Change the tool's size + Change the tool's size + + + Change the tool's thickness + Change the tool's thickness + + + + RectangleTool + + + Rectangle + Rectangle + + + + Set the Rectangle as the paint tool + Set the Rectangle as the paint tool + + + + RedoTool + + + Redo + Redo + + + + Redo the next modification + Redo the next modification + + + + SaveTool + + + Save + Save + + + + Save screenshot to a file + Save screenshot to a file + + + Save the capture + Save the capture + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + + + + Unable to capture screen + Unable to capture screen + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + Rectangular Selection + + + + Set Selection as the paint tool + Set Selection as the paint tool + + + + SetShortcutDialog + + + Set Shortcut + Set Shortcut + + + + Enter new shortcut to change + Enter new shortcut to change + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Press Esc to cancel or Backspace to disable the keyboard shortcut. + + + + + Flameshot must be restarted for changes to take effect. + Flameshot must be restarted for changes to take effect. + + + + ShortcutsWidget + + + Hot Keys + Hot Keys + + + + Available shortcuts in the screen capture mode. + Available shortcuts in the screen capture mode. + + + + Description + Description + + + + Key + Key + + + + Left Double-click + Left Double-click + + + + Toggle side panel + Toggle side panel + + + + Grab a color from the screen + + + + + Resize selection left 1px + Resize selection left 1px + + + + Resize selection right 1px + Resize selection right 1px + + + + Resize selection up 1px + Resize selection up 1px + + + + Resize selection down 1px + Resize selection down 1px + + + + Symmetrically decrease width by 2px + + + + + Symmetrically increase width by 2px + + + + + Symmetrically increase height by 2px + + + + + Symmetrically decrease height by 2px + + + + + Select entire screen + Select entire screen + + + + Move selection left 1px + Move selection left 1px + + + + Move selection right 1px + Move selection right 1px + + + + Move selection up 1px + Move selection up 1px + + + + Move selection down 1px + Move selection down 1px + + + + Commit text in text area + Commit text in text area + + + + Delete selected drawn object + + + + + Cancel current selection + + + + Delete current tool + Delete current tool + + + + Capture screen + Capture screen + + + + Screenshot history + Screenshot history + + + + SidePanelWidget + + Active thickness: + Active thickness: + + + Active color: + Active color: + + + Press ESC to cancel + Press ESC to cancel + + + + Active tool size: + Active tool size: + + + + Active Color: + Active Color: + + + + Grab Color + Grab Color + + + + Display grid + + + + + SizeDecreaseTool + + + Decrease Tool Size + Decrease Tool Size + + + + Decrease the size of the other tools + Decrease the size of the other tools + + + + SizeIncreaseTool + + + Increase Tool Size + Increase Tool Size + + + + Increase the size of the other tools + Increase the size of the other tools + + + + SizeIndicatorTool + + Selection Size Indicator + Selection Size Indicator + + + Show X and Y dimensions of the selection + Show X and Y dimensions of the selection + + + Show the dimensions of the selection (X Y) + Show the dimensions of the selection (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + Century (00-99) + + + + Year (00-99) + Year (00-99) + + + + Year (2000) + Year (2000) + + + + Month Name (jan) + Month Name (jan) + + + + Month Name (january) + Month Name (january) + + + + Month (01-12) + Month (01-12) + + + + Week Day (1-7) + Week Day (1-7) + + + + Week (01-53) + Week (01-53) + + + + Day Name (mon) + Day Name (mon) + + + + Day Name (monday) + Day Name (monday) + + + + Day (01-31) + Day (01-31) + + + + Day of Month (1-31) + Day of Month (1-31) + + + + Day (001-366) + Day (001-366) + + + + Hour (00-23) + Hour (00-23) + + + + Hour (01-12) + Hour (01-12) + + + + Minute (00-59) + Minute (00-59) + + + + Second (00-59) + Second (00-59) + + + + Full Date (%m/%d/%y) + Full Date (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + Full Date (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + + + + + Time (%H-%M-%S) + Time (%H-%M-%S) + + + + Time (%H-%M) + Time (%H-%M) + + + + SystemNotification + + + Flameshot Info + Flameshot Info + + + + TextConfig + + + StrikeOut + StrikeOut + + + + Underline + Underline + + + + Bold + Bold + + + + Italic + Italic + + + + Left Align + Left Align + + + + Center Align + Center Align + + + + Right Align + Right Align + + + + TextTool + + + Text + Text + + + + Add text to your capture + Add text to your capture + + + + TrayIcon + + + &Take Screenshot + &Tirar unha captura de pantalla + + + + &Open Launcher + &Abrir o lanzador de aplicativos + + + + &Configuration + &Configuración + + + + &About + &Sobre + + + + Check for updates + Verificar se hai actualizacións + + + + New version %1 is available + Nova versión %1 está dispoñíbel + + + + &Quit + &Saír + + + + &Latest Uploads + &Últimos envíos + + + + &Open Save Path + + + + + UIcolorEditor + + UI Color Editor + UI Color Editor + + + + Change the color moving the selectors and see the changes in the preview buttons. + Change the color moving the selectors and see the changes in the preview buttons. + + + + Select a Button to modify it + Select a Button to modify it + + + + Main Color + Main Color + + + + Click on this button to set the edition mode of the main color. + Click on this button to set the edition mode of the main color. + + + + Contrast Color + Contrast Color + + + + Click on this button to set the edition mode of the contrast color. + Click on this button to set the edition mode of the contrast color. + + + + UndoTool + + + Undo + Undo + + + + Undo the last modification + Undo the last modification + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + New Flameshot version %1 is available + + + + Ignore + Ignore + + + + Later + Later + + + + Update + Update + + + + UploadHistory + + + Upload History + Upload History + + + + Screenshots history is empty + O histórico de capturas de pantalla está valeiro + + + + UploadLineItem + + + Form + Form + + + + TextLabel + TextLabel + + + + Copy URL + Copy URL + + + + Open In Browser + Open In Browser + + + + Confirm to delete + Confirma para borrar + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Tes certeza de que desexas borrar unha captura de pantalla das últimas subidas e do servidor? + + + + UtilityPanel + + + Close + Close + + + + <Empty> + <Empty> + + + + VisualsEditor + + + Opacity of area outside selection: + Opacity of area outside selection: + + + + UI Color Editor + UI Color Editor + + + + Colorpicker Editor + Colorpicker Editor + + + + Button Selection + Button Selection + + + + Select All + Select All + + + + color_widgets::ColorDialog + + + Pick + Pick + + + + color_widgets::ColorPalette + + + Unnamed + Unnamed + + + + color_widgets::ColorPaletteModel + + + Unnamed + Unnamed + + + + %1 (%2 colors) + %1 (%2 colors) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + Open a new palette from file + + + + + Create a new palette + Create a new palette + + + + + Duplicate the current palette + Duplicate the current palette + + + + + Delete the current palette + Delete the current palette + + + + + Revert changes to the current palette + Revert changes to the current palette + + + + + Save changes to the current palette + Save changes to the current palette + + + + + Add a color to the palette + Add a color to the palette + + + + + Remove the selected color from the palette + Remove the selected color from the palette + + + + + New Palette + New Palette + + + + + Name + Name + + + + GIMP Palettes (*.gpl) + GIMP Palettes (*.gpl) + + + + Palette Image (%1) + Palette Image (%1) + + + + All Files (*) + All Files (*) + + + + + Open Palette + Open Palette + + + + Failed to load the palette file +%1 + Failed to load the palette file +%1 + + + + color_widgets::GradientEditor + + + Add Color + Add Color + + + + Remove Color + Remove Color + + + + Edit Color... + Edit Color... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 colors) + + + + color_widgets::Swatch + + + Clear Color + Clear Color + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_grc.ts b/data/translations/Internationalization_grc.ts new file mode 100644 index 0000000..9d30df4 --- /dev/null +++ b/data/translations/Internationalization_grc.ts @@ -0,0 +1,1698 @@ + + + + + AppLauncher + + + App Launcher + App Launcher + + + + Choose an app to open the capture + Choose an app to open the capture + + + + AppLauncherWidget + + + Open With + Open With + + + + Launch in terminal + Launch in terminal + + + + Keep open after selection + Keep open after selection + + + + + Error + Error + + + + Unable to launch in terminal. + Unable to launch in terminal. + + + + Unable to write in + Unable to write in + + + + ArrowTool + + + Arrow + Arrow + + + + Set the Arrow as the paint tool + Set the Arrow as the paint tool + + + + BlurTool + + Blur + Desenfocament + + + Set Blur as the paint tool + Estableix el desenfocament com a eina de dibuix + + + + CaptureLauncher + + + <b>Capture Mode</b> + <b>Capture Mode</b> + + + + Rectangular Region + Rectangular Region + + + + Full Screen (Current Display) + Full Screen (Current Display) + + + + Full Screen (All Monitors) + Full Screen (All Monitors) + + + + No Delay + No Delay + + + + second + second + + + + seconds + seconds + + + + Take new screenshot + Take new screenshot + + + + Area: + Area: + + + + Delay: + Delay: + + + + CaptureWidget + + + Unable to capture screen + Impossible capturar la pantalla + Unable to capture screen + + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + + + + Tool Settings + Tool Settings + + + + CircleCountTool + + + Circle Counter + Circle Counter + + + + Add an autoincrementing counter bubble + Add an autoincrementing counter bubble + + + + CircleTool + + + Circle + Circle + + + + Set the Circle as the paint tool + Set the Circle as the paint tool + + + + ConfigWindow + + + Configuration + Configuration + + + + Interface + Interface + + + + Filename Editor + Filename Editor + + + + General + General + + + + Shortcuts + Shortcuts + + + + Controller + + + New version %1 is available + New version %1 is available + + + + You have the latest version + You have the latest version + + + + Failed to get information about the latest version. + Failed to get information about the latest version. + + + + Error + Error + + + + Unable to close active modal widgets + Unable to close active modal widgets + + + + &Open Launcher + &Open Launcher + + + + &Configuration + &Configuration + + + + &About + &About + + + + Check for updates + Check for updates + + + + &Latest Uploads + &Latest Uploads + + + &Information + &Informació + + + + &Quit + &Quit + + + + &Take Screenshot + &Take Screenshot + + + + CopyTool + + + Copy + Copy + + + + Copy the selection into the clipboard + Copy the selection into the clipboard + + + + DBusUtils + + + Unable to connect via DBus + Unable to connect via DBus + + + + ExitTool + + + Exit + Exit + + + + Leave the capture screen + Leave the capture screen + + + + FileNameEditor + + + Edit the name of your captures: + Edit the name of your captures: + + + + Edit: + Edit: + + + + Preview: + Preview: + + + + Save + Save + + + + Saves the pattern + Saves the pattern + + + + Restore + Restore + + + Reset + Reinicialitza + + + + Restores the saved pattern + Restores the saved pattern + + + + Clear + Clear + + + + Deletes the name + Deletes the name + + + + GeneneralConf + + Show help message + Mostra el missatge d'ajuda + + + Show the help message at the beginning in the capture mode. + Mostra el missatge d'ajuda en iniciar el mode de captura. + + + Show desktop notifications + Mostra les notificacions d'escriptori + + + Show tray icon + Mostra la icona en la barra de tasques + + + Show the systemtray icon + Mostra la icona en la barra de tasques + + + Import + Importar + + + Error + Error + + + Unable to read file. + Impossible llegir el fitxer. + + + Unable to write file. + Impossible escriure al fitxer. + + + Save File + Guardar Arxiu + + + Confirm Reset + Confirmar Reset + + + Are you sure you want to reset the configuration? + Esteu segur que voleu reiniciar la configuració? + + + Configuration File + Fitxer de Configuració + + + Export + Exportar + + + Reset + Reset + + + Launch at startup + Llançament a l'inici + + + + GeneralConf + + + + Import + Import + + + + + + + Error + Error + + + + Unable to read file. + Unable to read file. + + + + + Unable to write file. + Unable to write file. + + + + Save File + Save File + + + + Confirm Reset + Confirm Reset + + + + Are you sure you want to reset the configuration? + Are you sure you want to reset the configuration? + + + + Show help message + Show help message + + + + Show the help message at the beginning in the capture mode. + Show the help message at the beginning in the capture mode. + + + + Show the side panel button + Show the side panel button + + + + Show the side panel toggle button in the capture mode. + Show the side panel toggle button in the capture mode. + + + + + Show desktop notifications + Show desktop notifications + + + + Show tray icon + Show tray icon + + + + Show the systemtray icon + Show the systemtray icon + + + + + Confirmation required to delete screenshot from the latest uploads + Confirmation required to delete screenshot from the latest uploads + + + + Configuration File + Configuration File + + + + Export + Export + + + + Reset + Reset + + + + + Automatic check for updates + Automatic check for updates + + + + Launch at startup + Launch at startup + + + + + Launch Flameshot + Launch Flameshot + + + + Show welcome message on launch + Show welcome message on launch + + + + Copy URL after upload + Copy URL after upload + + + + Copy URL and close window after upload + Copy URL and close window after upload + + + + Save image after copy + Save image after copy + + + + Save image file after copying it + Save image file after copying it + + + + Save Path + Save Path + + + + Change... + Change... + + + + Use fixed path for screenshots to save + Use fixed path for screenshots to save + + + + Latest Uploads Max Size + Latest Uploads Max Size + + + + Undo limit + Undo limit + + + + + Use JPG format for clipboard (PNG default) + Use JPG format for clipboard (PNG default) + + + + + Copy file path after save + Copy file path after save + + + + Choose a Folder + Choose a Folder + + + + Unable to write to directory. + Unable to write to directory. + + + + HistoryWidget + + + Latest Uploads + Latest Uploads + + + + Screenshots history is empty + Screenshots history is empty + + + + Copy URL + Copy URL + + + + URL copied to clipboard. + URL copied to clipboard. + + + + Open in browser + Open in browser + + + + Confirm to delete + Confirm to delete + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Are you sure you want to delete a screenshot from the latest uploads and server? + + + + ImgS3Uploader + + Uploading Image + S'està pujant la imatge + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Error + Error + + + + ImgUploader + + Uploading Image + S'està pujant la imatge + + + Delete image + Esborra la imatge + + + Unable to open the URL. + No es pot obrir l'URL. + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + Copy URL + Copia l'URL + + + Open URL + Obri l'URL + + + Image to Clipboard. + Imatge al porta-retalls. + + + + ImgurUploader + + + Upload to Imgur + Upload to Imgur + + + + Uploading Image + Uploading Image + + + + Copy URL + Copy URL + + + + Open URL + Open URL + + + + Delete image + Delete image + + + + Image to Clipboard. + Image to Clipboard. + + + + + Unable to open the URL. + Unable to open the URL. + + + + URL copied to clipboard. + URL copied to clipboard. + + + + Screenshot copied to clipboard. + Screenshot copied to clipboard. + + + + ImgurUploaderTool + + + Image Uploader + Image Uploader + + + + Upload the selection to Imgur + Upload the selection to Imgur + + + + InfoWindow + + + About + About + + + Right Click + Clic dret + + + Mouse Wheel + Roda del ratolí + + + Move selection 1px + Mou la selecció 1 px + + + Resize selection 1px + Redimensiona la selecció 1 px + + + Quit capture + Ix de la captura + + + Copy to clipboard + Copia al porta-retalls + + + Save selection as a file + Guarda la selecció com a fitxer + + + Undo the last modification + Desfés l'última modificació + + + Show color picker + Mostra el selector de color + + + Change the tool's thickness + Canvia el gruix de l'eina + + + Key + Tecla + + + Description + Descripció + + + + <u><b>License</b></u> + <u><b>License</b></u> + + + + <u><b>Version</b></u> + <u><b>Version</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Dreceres</b></u> + + + Available shortcuts in the screen capture mode. + Dreceres disponibles en el mode de captura de pantalla. + + + + LineTool + + + Line + Line + + + + Set the Line as the paint tool + Set the Line as the paint tool + + + + MarkerTool + + + Marker + Marker + + + + Set the Marker as the paint tool + Set the Marker as the paint tool + + + + MoveTool + + + Move + Move + + + + Move the selection area + Move the selection area + + + + PencilTool + + + Pencil + Pencil + + + + Set the Pencil as the paint tool + Set the Pencil as the paint tool + + + + PinTool + + + Pin Tool + Pin Tool + + + + Pin image on the desktop + Pin image on the desktop + + + + PixelateTool + + + Pixelate + Pixelate + + + + Set Pixelate as the paint tool + Set Pixelate as the paint tool + + + + QHotkey + + + Failed to register %1. Error: %2 + Failed to register %1. Error: %2 + + + + Failed to unregister %1. Error: %2 + Failed to unregister %1. Error: %2 + + + + QObject + + + + Capture saved to clipboard. + Capture saved to clipboard. + + + + Error while saving to clipboard + Error while saving to clipboard + + + + Save screenshot + Save screenshot + + + + Saving canceled + Saving canceled + + + + Save canceled + Save canceled + + + + Capture is saved and copied to the clipboard as + Capture is saved and copied to the clipboard as + + + + Save Error + Save Error + + + + + Capture saved as + Capture saved as + + + + + Error trying to save as + Error trying to save as + + + + + + + + Unable to connect via DBus + Unable to connect via DBus + + + + Powerful yet simple to use screenshot software. + Powerful yet simple to use screenshot software. + + + + See + See + + + + Capture the entire desktop. + Capture the entire desktop. + + + + Open the capture launcher. + Open the capture launcher. + + + + Start a manual capture in GUI mode. + Start a manual capture in GUI mode. + + + + Configure + Configure + + + + Capture a single screen. + Capture a single screen. + + + + Path where the capture will be saved + Path where the capture will be saved + + + + Save the capture to the clipboard + Save the capture to the clipboard + + + + Delay time in milliseconds + Delay time in milliseconds + + + + Set the filename pattern + Set the filename pattern + + + + Enable or disable the trayicon + Enable or disable the trayicon + + + + Enable or disable run at startup + Enable or disable run at startup + + + + Show the help message in the capture mode + Show the help message in the capture mode + + + + Define the main UI color + Define the main UI color + + + + Define the contrast UI color + Define the contrast UI color + + + + Print raw PNG capture + Print raw PNG capture + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + + + + Define the screen to capture + Define the screen to capture + + + + default: screen containing the cursor + default: screen containing the cursor + + + + Screen number + Screen number + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + + + + Invalid delay, it must be higher than 0 + Invalid delay, it must be higher than 0 + + + + Invalid screen number, it must be non negative + Invalid screen number, it must be non negative + + + + Invalid path, it must be a real path in the system + Invalid path, it must be a real path in the system + + + + Invalid value, it must be defined as 'true' or 'false' + Invalid value, it must be defined as 'true' or 'false' + + + + Error + Error + + + + Unable to write in + Unable to write in + + + + URL copied to clipboard. + URL copied to clipboard. + + + + Options + Options + + + + Arguments + Arguments + + + + arguments + arguments + + + + Usage + Usage + + + + options + options + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Per default runs Flameshot in the background and adds a tray icon for configuration. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + + + + Toggle side panel + Toggle side panel + + + + Resize selection left 1px + Resize selection left 1px + + + + Resize selection right 1px + Resize selection right 1px + + + + Resize selection up 1px + Resize selection up 1px + + + + Resize selection down 1px + Resize selection down 1px + + + + Select entire screen + Select entire screen + + + + Move selection left 1px + Move selection left 1px + + + + Move selection right 1px + Move selection right 1px + + + + Move selection up 1px + Move selection up 1px + + + + Move selection down 1px + Move selection down 1px + + + + Commit text in text area + Commit text in text area + + + + + Delete current tool + Delete current tool + + + + Quit capture + Quit capture + + + + + Screenshot history + Screenshot history + + + + + Capture screen + Capture screen + + + + Show color picker + Show color picker + + + + Change the tool's thickness + Change the tool's thickness + + + + RectangleTool + + + Rectangle + Rectangle + + + + Set the Rectangle as the paint tool + Set the Rectangle as the paint tool + + + + RedoTool + + + Redo + Redo + + + + Redo the next modification + Redo the next modification + + + + SaveTool + + + Save + Save + + + + Save the capture + Save the capture + + + + ScreenGrabber + + + Unable to capture screen + Unable to capture screen + + + + SelectionTool + + + Rectangular Selection + Rectangular Selection + + + + Set Selection as the paint tool + Set Selection as the paint tool + + + + SetShortcutDialog + + + Set Shortcut + Set Shortcut + + + + Enter new shortcut to change + Enter new shortcut to change + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Press Esc to cancel or Backspace to disable the keyboard shortcut. + + + + ShortcutsWidget + + + Hot Keys + Hot Keys + + + + Available shortcuts in the screen capture mode. + Available shortcuts in the screen capture mode. + + + + Description + Description + + + + Key + Key + + + + SidePanelWidget + + + Active thickness: + Active thickness: + + + + Active color: + Active color: + + + + Press ESC to cancel + Press ESC to cancel + + + + Grab Color + Grab Color + + + + SizeDecreaseTool + + + Decrease Tool Size + Decrease Tool Size + + + + Decrease the size of the other tools + Decrease the size of the other tools + + + + SizeIncreaseTool + + + Increase Tool Size + Increase Tool Size + + + + Increase the size of the other tools + Increase the size of the other tools + + + + SizeIndicatorTool + + + Selection Size Indicator + Selection Size Indicator + + + + Show the dimensions of the selection (X Y) + Show the dimensions of the selection (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + Century (00-99) + + + + Year (00-99) + Year (00-99) + + + + Year (2000) + Year (2000) + + + + Month Name (jan) + Month Name (jan) + + + + Month Name (january) + Month Name (january) + + + + Month (01-12) + Month (01-12) + + + + Week Day (1-7) + Week Day (1-7) + + + + Week (01-53) + Week (01-53) + + + + Day Name (mon) + Day Name (mon) + + + + Day Name (monday) + Day Name (monday) + + + + Day (01-31) + Day (01-31) + + + + Day of Month (1-31) + Day of Month (1-31) + + + + Day (001-366) + Day (001-366) + + + + Hour (00-23) + Hour (00-23) + + + + Hour (01-12) + Hour (01-12) + + + + Minute (00-59) + Minute (00-59) + + + + Second (00-59) + Second (00-59) + + + + Full Date (%m/%d/%y) + Full Date (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + Full Date (%Y-%m-%d) + + + + Time (%H-%M-%S) + Time (%H-%M-%S) + + + + Time (%H-%M) + Time (%H-%M) + + + + SystemNotification + + + Flameshot Info + Flameshot Info + + + + TextConfig + + + StrikeOut + StrikeOut + + + + Underline + Underline + + + + Bold + Bold + + + + Italic + Italic + + + + TextTool + + + Text + Text + + + + Add text to your capture + Add text to your capture + + + + UIcolorEditor + + + UI Color Editor + UI Color Editor + + + + Change the color moving the selectors and see the changes in the preview buttons. + Change the color moving the selectors and see the changes in the preview buttons. + + + + Select a Button to modify it + Select a Button to modify it + + + + Main Color + Main Color + + + + Click on this button to set the edition mode of the main color. + Click on this button to set the edition mode of the main color. + + + + Contrast Color + Contrast Color + + + + Click on this button to set the edition mode of the contrast color. + Click on this button to set the edition mode of the contrast color. + + + + UndoTool + + + Undo + Undo + + + + Undo the last modification + Undo the last modification + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + New Flameshot version %1 is available + + + + Ignore + Ignore + + + + Later + Later + + + + Update + Update + + + + UtilityPanel + + + Close + Close + + + + <Empty> + <Empty> + + + + VisualsEditor + + + Opacity of area outside selection: + Opacity of area outside selection: + + + + Button Selection + Button Selection + + + + Select All + Select All + + + diff --git a/data/translations/Internationalization_he.ts b/data/translations/Internationalization_he.ts new file mode 100644 index 0000000..5e961a3 --- /dev/null +++ b/data/translations/Internationalization_he.ts @@ -0,0 +1,3181 @@ + + + + + AbstractWidgetList + + + Add New + הוספת חדש + + + + Move Up + העברה מעלה + + + + Move Down + העברה מטה + + + + Remove + הסרה + + + + AcceptTool + + + Accept + קבלה + + + + Accept the capture + קבלת הלכידה + + + + AppLauncher + + + App Launcher + משגר יישומון + + + + Choose an app to open the capture + נא לבחור יישומון לפתיחת הלכידה + + + + AppLauncherWidget + + + Open With + פתיחה באמצעות + + + + Launch in terminal + שיגור במסוף + + + + Keep open after selection + להשאיר פתוח לאחר בחירה + + + + + Error + שגיאה + + + + Unable to launch in terminal. + לא ניתן לשגר במסוף. + + + + Unable to write in + לא ניתן לכתוב ל־ + + + + ArrowTool + + + Arrow + חץ + + + + Set the Arrow as the paint tool + הגדרת ה'חץ' ככלי צבע + + + + BlurTool + + Blur + Desenfocament + + + Set Blur as the paint tool + Estableix el desenfocament com a eina de dibuix + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>מצב לכידה</b> + + + + Rectangular Region + אזור מרובע + + + + Full Screen (Current Display) + מסך מלא (מצג נוכחי) + + + + Full Screen (All Monitors) + מסך מלא (כל הצגים) + + + + No Delay + ללא השהייה + + + + second + שניה + + + + + + seconds + שניות + + + + + Take new screenshot + צילום־מסך חדש + + + + + Area: + אזור: + + + + + Capture Launcher + משגר לכידה + + + + + TextLabel + מלל תוית + + + + + Capture Mode + אופן לכידה + + + + + Delay: + אזור: + + + + + WxH+x+y + WxH+x+y + + + + CaptureWidget + + + Unable to capture screen + Impossible capturar la pantalla + לא ניתן ללכוד מסך + + + + Mouse + עכבר + + + + Select screenshot area + נא לבחור את אזור צילום־המסך + + + + Mouse Wheel + גלגל עכבר + + + + Change tool size + שינוי גודל כלי + + + + Right Click + הקשה ימנית + + + + Show color picker + הצגת דוגם צבע + + + + Open side panel + פתיחת חלונית צד + + + + Esc + יציאה (Esc) + + + + Exit + יציאה + + + + Quit Capture + יציאה מלכידה + + + + Are you sure you want to quit capture? + האם לצאת מלכידה? + + + + Do not show this again + לא להציג שוב + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + פליימשוט איבדה מיקוד. קיצורי מקשים לא יפעלו עד להקשה על אזור כול שהוא. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + שגיאת תצורה נפתרה. להחלה, נא לשגר את 'flameshot gui' שוב. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + בחירת אזור באמצעות העכבר, או הקשה על 'Esc' כדי לצאת. +הקשה על 'Enter' כדי ללכוד את המסך. +לחצה באמצעות לחצן העכבר הימני כדי להציג את דוגם הצבע. +נא להשתמש בגלגל העכבר כדי לשנות את עובי כלי הציור. +הקשה על 'Space' לפתיחת חלונית הצד. + + + + Tool Settings + הגדרות כלי + + + + CircleCountTool + + + Circle Counter + מונה עיגולים + + + + Add an autoincrementing counter bubble + הוספת בועת־מניה אוטומטית + + + + CircleTool + + + Circle + עיגול + + + + Set the Circle as the paint tool + הגדרת ה'עיגול' ככלי צבע + + + + ColorDialog + + + + Select Color + נא לבחור צבע + + + + + Saturation + רִוּוּי + + + + + Hue + גוון + + + + + Hex + הקס + + + + + Blue + כחול + + + + + Value + ערך + + + + + Green + ירוק + + + + + Alpha + אלפא + + + + + Red + אדום + + + + ColorGrabWidget + + + Accept color + קבלת צבע + + + + Enter or Left Click + מקש אנטר או הקשת לחצן עכבר שמאלי + + + + Precisely select color + בחירת צבע במדויק + + + + Hold Left Click + החזקת והקשת לחצן עכבר שמאלי + + + + Toggle magnifier + מחלף זכוכית מגדלת + + + + Space or Right Click + מקש רווח או הקשת לחצן עכבר ימני + + + + Cancel + ביטול + + + + Esc + יציאה (Esc) + + + + ColorPickerEditor + + Select Preset: + בחירת קיבוע־מראש: + + + Select preset using the spinbox + בחירת קיבוע־מראש בעמצאות תיבת־הגלילה + + + + Edit Preset: + עריכת קיבוע־מראש: + + + + Enter color to update preset + נא להזין צבע כדי לעדכן קיבוע־מראש + + + + Update + עדכון + + + + Press button to update the selected preset + הקשה על הלחצן כדי לעדכן קיבוע־מראש שנבחר + + + + Delete + מחיקה + + + + Press button to delete the selected preset + לחיצה על הלחצן למחיקת קיבוע־מראש שנבחר + + + + Add Preset: + הוספת קיבוע־מראש: + + + + Enter color manually or select it using the color-wheel + הזנת צבע באופן ידני, או בחירה תוך שימוש ב'גלגל־הצבעים' + + + + Add + הוספה + + + + Press button to add preset + לחיצה על הלחצן להוספת קיבוע־מראש + + + + + Error + שגיאה + + + + Unable to add preset. Maximum limit reached. + לא ניתן להוסיף קיבוע־מראש. מגבלה מירבית הושגה. + + + + Unable to remove preset. Minimum limit reached. + לא ניתן להסיר קיבוע־מראש. מגבלה מזערית הושגה. + + + + ConfigErrorDetails + + + Configuration errors + שגיאות תצורה + + + + ConfigHandler + + + Unrecognized setting: '%1' + + הגדרה לא מזוהה: '%1' + + + + + Unrecognized shortcut name: '%1'. + + שם קיצור דרך לא מזוהה: '%1'. + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + התנגשות קיצורי דרך: ל־'%1' ול־'%2' קיצור דרך זהה: %3 + + + + + Bad value in '%1'. Expected: %2 + + ערך שגוי ב־'%1'. ערך צפוי: %2 + + + + + You have successfully resolved the configuration error. + שגיאת התצורה נפתרה בהצלחה. + + + + The configuration contains an error. Open configuration to resolve. + התצורה מכילה שגיאה. לתיקון, נא להקיש על 'תצור'. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + מפתח תצורה '%1' ב־ConfigHandler, שגוי. נא לדווח זאת כתקל. + + + + ConfigResolver + + + Resolve configuration errors + פתרון שגיאות תצורה + + + + <b>You must resolve all errors before continuing:</b> + <b>נא לתקן את כל השגיאות כדי להמשיך:</b> + + + + Reset + שיצוב + + + + Reset to the default value. + שיצוב לערכי ברירת המחדל. + + + + Remove + הסרה + + + + Remove this setting. + הסרת הגדרה זו. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + קיצורי מקשים מסוימים כוללים התנגשויות. +אלו לא ימנעו מפליימשוט לאתחל. +נא לפתור התנגשויות באופן ידני בקובץ התצורה. + + + + Resolve all + לפתור הכול + + + + Resolve all listed errors. + פתורון כל השגיאות שברשימה. + + + + Details + פרטים + + + + ConfigWindow + + + Configuration + תצור + + + + Interface + מנשק + + + + Filename Editor + עורך שם קובץ + + + + General + כללי + + + + Shortcuts + קיצורי־דרך + + + + Resolve + לפתור + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>קובץ התצורה מכיל שגיאות. נא לפתור אותם כדי להמשיך.</b> + + + + Controller + + New version %1 is available + גרסה חדשה %1, זמינה + + + You have the latest version + הגרסה העדכנית ביותר כבר מותקנת + + + Failed to get information about the latest version. + קבלת מידע אודות הגרסה העדכנית ביותר, כשלה. + + + Error + שגיאה + + + Unable to close active modal widgets + לא ניתן לסגור ווידג'טים מודאליים + + + &Open Launcher + &פתיחת משגר + + + &Configuration + &תצור + + + &About + &על אודות + + + Check for updates + בדיקת זמינות עדכונים + + + &Latest Uploads + &העלאות אחרונות + + + URL copied to clipboard. + מען URL הועתק ללוח־הגזירים. + + + &Information + &Informació + + + &Quit + &יציאה + + + &Take Screenshot + &צילום־מסך + + + + CopyTool + + + Copy + העתקה + + + + Copy selection to clipboard + העתקת בחירה ללוח־הגזירים + + + Copy the selection into the clipboard + העתקת הבחירה ללוח־הגזירים + + + + DBusUtils + + Unable to connect via DBus + לא ניתן להתחבר דרך DBus + + + + ExitTool + + + Exit + יציאה + + + + Leave the capture screen + עזיבת מסך הלכידה + + + + FileNameEditor + + + Edit the name of your captures: + עריכת שמות הלכידות: + + + + Edit: + עריכה: + + + + Preview: + תצוגה מקדימה: + + + + Save + שמירה + + + + Saves the pattern + שמירת הדפוס + + + + Restore + שחזור + + + Reset + Reinicialitza + + + + Restores the saved pattern + שחזור דפוס שמור + + + + Clear + ניקוי + + + + Deletes the name + מחיקת השם + + + + Flameshot + + + Error + Error + + + + Unable to close active modal widgets + לא ניתן לסגור ווידג'טים מודאליים + + + + URL copied to clipboard. + כתובת URL הועתקה ללוח־גזירים. + + + + FlameshotDaemon + + + New version %1 is available + גרסה חדשה %1, זמינה + + + + You have the latest version + הגרסה העדכנית ביותר כבר מותקנת + + + + Failed to get information about the latest version. + קבלת מידע אודות הגרסה העדכנית ביותר, כשלה. + + + + Unable to connect via DBus + לא ניתן להתחבר דרך DBus + + + + GeneneralConf + + Show help message + Mostra el missatge d'ajuda + + + Show the help message at the beginning in the capture mode. + Mostra el missatge d'ajuda en iniciar el mode de captura. + + + Show desktop notifications + Mostra les notificacions d'escriptori + + + Show tray icon + Mostra la icona en la barra de tasques + + + Show the systemtray icon + Mostra la icona en la barra de tasques + + + Import + Importar + + + Error + Error + + + Unable to read file. + Impossible llegir el fitxer. + + + Unable to write file. + Impossible escriure al fitxer. + + + Save File + Guardar Arxiu + + + Confirm Reset + Confirmar Reset + + + Are you sure you want to reset the configuration? + Esteu segur que voleu reiniciar la configuració? + + + Configuration File + Fitxer de Configuració + + + Export + Exportar + + + Reset + Reset + + + Launch at startup + Llançament a l'inici + + + + GeneralConf + + + + Import + ייבוא + + + + + + + Error + שגיאה + + + + Unable to read file. + לא ניתן לקרוא קובץ. + + + + + Unable to write file. + לא ניתן לכתוב קובץ. + + + + Save File + שמירת קובץ + + + + Confirm Reset + אישור שיצוב + + + + Are you sure you want to reset the configuration? + האם לשצב את התצורה? + + + + Show help message + הצגת הודעת עזרה זו + + + Show the help message at the beginning in the capture mode. + הצגת הודעת העזרה באתחול, במצב לכידה. + + + + Show the side panel button + הצגת לחצן חלונית־הצד + + + Show the side panel toggle button in the capture mode. + הצגת לחצן מיתוג לוחית־צד במצב לכידה. + + + + Show desktop notifications + הצגת התראות שולחן־עבודה + + + + Show tray icon + הצגת סמל מגש + + + Show the systemtray icon + הצגת סמל מגש־מערכת + + + + Confirmation required to delete screenshot from the latest uploads + למחיקת צילום מסך מבין ההעלאות האחרונות, נדרש אישור + + + + Configuration File + קובץ תצורה + + + + Export + ייצוא + + + + Reset + שיצוב + + + + Automatic check for updates + בדיקת עדכונים אוטומטית + + + + Allow multiple flameshot GUI instances simultaneously + אפשור ריבוי אדגמי flameshot GUI בה־בעת + + + This allows you to take screenshots of flameshot itself for example. + מאפשר צילומי מסך של flameshot עצמו, לדוגמה. + + + Automatically close daemon when it is not needed + סגירת שדון באופן אוטומטי כאשר אין בו עוד צורך + + + Launch at startup + שיגור באתחול + + + Launch Flameshot + שיגור Flameshot + + + + Show welcome message on launch + הצגת הודעת ברכה בעת השיגור + + + + Use large predefined color palette + שימוש בלוח צבעים גדול מוגדר מראש + + + + Copy URL after upload + העתקת מען־URL לאחר ההעלאה + + + Copy URL and close window after upload + העתקת מען־URL וסגירת חלון לאחר ההעלאה + + + + Save image after copy + שמירת תמונה לאחר העתקה + + + Save image file after copying it + שמירת קובץ תמונה לאחר העתקתו + + + + Show the help message at the beginning in the capture mode + הצגת הודעת עזרה עם תחילת מצב לכידה + + + + Use last region for GUI mode + להשתמש באזור האחרון למצב GUI + + + + Use the last region as the default selection for the next screenshot in GUI mode + שימוש באזור האחרון כבחירת ברירת מחדל עבור צילום המסך הבא במצב GUI + + + + Show the side panel toggle button in the capture mode + הצגת לחצן מחלף חלונית צד, במצב לכידה + + + + Enable desktop notifications + אפשר הודעות שולחן־עבודה + + + + Show abort notifications + הצגת התראות נטישה + + + + Enable abort notifications + אפשור התראות נטישה + + + + Show icon in the system tray + הצגת סמל במגש המערכת + + + + Use grim to capture screenshots + שחמןש ב־grim ללכידות מרקע + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + Grim היא תוכנה ל־wayland בלבד ללכידת מסכים המבוססת על פרוטוקול screencopy. באופן כללי, ניתן להפעיל אותה רק במנהלי חלונות מזעריים של wayland כמו sway, hyprland וכו'. + + + + Ask for confirmation to delete screenshot from the latest uploads + בקשת אישור למחיקת צילום־מסך מההעלאות האחרונות + + + + Check for updates automatically + בדיקת עדכונים אוטומטית + + + + This allows you to take screenshots of Flameshot itself for example + לדוגמה, פעולה זו מאפשרת לצלם מסך של פליימשוט עצמה + + + Launch Flameshot daemon when computer is booted + שיגור שרת פליימשוט עם אתחול המחשב + + + + Show the welcome message box in the middle of the screen while taking a screenshot + הצגת תיבת הודעת־הפתיחה במרכז המסך בזמן צילום־מסך + + + + Use a large predefined color palette + שימוש בלוח־צבעים מוגדר מראש, גדול + + + + Copy on double click + העתק בהקשה כפולה + + + Enable Copy on Double Click + אפשר העתקה בהקשה כפולה + + + Copy URL and close window after uploading was successful + העתקת מען־URL וסגירת חלון לאחר שהעלאה צלחה + + + + Automatically unload from memory when it is not needed + פריקה אוטומטית מהזיכרון כאשר אין צורך בכך + + + + Automatically close daemon (background process) when it is not needed + סגירת שדון באופן אוטומטי (תהליך רקע) כאשר אין בו צורך + + + + Launch in background at startup + שיגור רקע העת אתחול + + + + Launch Flameshot daemon (background process) when computer is booted + הפעלת שדון Flameshot (תהליך רקע) כאשר המחשב מאותחל + + + + Ask before quit capture + לשאול לפני יציאה מלכידה + + + + Show the confirmation prompt before ESC quit + הצגת הנחיית אישור לפני יציאת ESC + + + + Enable Copy to clipboard on Double Click + אפשר העתקה ללוח־גזירים בהקשה כפולה + + + + Copy URL after uploading was successful + העתקת מען־URL לאחר שהעלאה צלחה + + + + After copying the screenshot, save it to a file as well + לאחר העתקת צילום־המסך, נא לשמור אותו גם לקובץ + + + + Save Path + שמירת נתיב + + + + Change... + שינוי... + + + + Use fixed path for screenshots to save + שימוש בנתיב קבוע לשמירת צילומי־מסך + + + + Preferred save file extension: + סיומת קובץ מועדפת בעת שמירה : + + + + Latest Uploads Max Size + גודל מרבי של העלאות אחרונות + + + + Imgur Application Client ID + מזהה לקוח יישומון Imgur + + + + Undo limit + ביטול מגבלה + + + + Use JPG format for clipboard (PNG default) + שימוש בתבנית JPG עבור לוח־הגזירים (ברירת המחדל היא PNG) + + + + Use lossy JPG format for clipboard (lossless PNG default) + שימוש בתסדיר lossy JPG בלוח־הגזירים (ברירת המחדל היא PNG) + + + + Copy file path after save + העתקת נתיב קובץ לאחר השמירה + + + + Copy the file path to clipboard after the file is saved + העתקת הנתיב אל הקובץ, ללוח־גזירים, לאחר שהקובץ נשמר + + + + Anti-aliasing image when zoom the pinned image + החלקת־עקומת תמונה בעת שינוי גודל מצג תמונה נעוצה + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + לאחר שינוי גודל מצג התמונה הנעוצה, האם התמונה תוחלק או תישאר מפוקסלת + + + + + Upload image without confirmation + העלאת תמונה ללא אישרור + + + + Choose a Folder + נא לבחור תיקייה + + + + Unable to write to directory. + לא ניתן לכתוב למחיצה. + + + + Show magnifier + הצגת זכוכית מגדלת + + + + Enable a magnifier while selecting the screenshot area + אפשור זכוכית מגדלת בעת בחירת אזור צילום־מסך + + + + Square shaped magnifier + זכוכית מגדלת בצורת ריבוע + + + + Make the magnifier to be square-shaped + הפיכת זכוכית המגדלת לצורת ריבוע + + + + Milliseconds before geometry display hides; 0 means do not hide + מילי שניות לפני שהצגת הגאומטריה מוסתרת; 0 פירושו לא להסתיר + + + + Set geometry display timeout (ms) + הגדרת פסק־זמן מצג גיאומטריה (ms) + + + + Selection Geometry Display + בחירת מצג גאומטריה + + + + Display Location + הצגת מיקום + + + + None + ללא + + + + Top Left + פינה שמאלית עליונה + + + + Top Right + פינה ימנית עליונה + + + + Bottom Left + פינה שמאלית תחתונה + + + + Bottom Right + פינה ימנית תחתונה + + + + Center + מרכז + + + + Quality range of 0-100; Higher number is better quality and larger file size + טווח איכות של 0-100; מספר גבוה יותר מציין איכות טובה יותר וקובץ גדול יותר + + + + JPEG Quality + איכות JPEG + + + + Reverse arrow + חץ הפוך + + + + Draw the arrow head first + ציור ראש ה החץ תחילה + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + עדכונים אחרונים + + + Screenshots history is empty + היסטוריית צילומי־מסך, ריקה + + + Copy URL + העתקת מען־URL + + + URL copied to clipboard. + מען־URL הועתק ללוח הגזירים. + + + Open in browser + פתיחה בדפדפן + + + Confirm to delete + אישור מחיקה + + + Are you sure you want to delete a screenshot from the latest uploads and server? + האם למחוק צילום־מסך מבין ההעלאות האחרונות והשרת? + + + + ImgS3Uploader + + Uploading Image + S'està pujant la imatge + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Error + Error + + + + ImgUploadDialog + + + Upload Confirmation + אישרור העלאה + + + + Do you want to upload this capture? + האם לעדכן לכישה זו? + + + + + Upload without confirmation + העלאה ללא אישרור + + + + ImgUploader + + Uploading Image + S'està pujant la imatge + + + Delete image + Esborra la imatge + + + Unable to open the URL. + No es pot obrir l'URL. + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + Copy URL + Copia l'URL + + + Open URL + Obri l'URL + + + Image to Clipboard. + Imatge al porta-retalls. + + + + ImgUploaderBase + + + Upload image + העלאת תמונה + + + + Uploading Image + תמונה מועלת + + + + Copy URL + העתק מען־URL + + + + Open URL + פתיחת מען־URL + + + + Delete image + מחיקת תמונה + + + + Image to Clipboard. + תמונה ללוח־גזירים. + + + + Save image + שמירת תמונה + + + + Unable to open the URL. + לא ניתן לפתוח מען־URL. + + + + URL copied to clipboard. + מען URL הועתק ללוח־הגזירים. + + + + Screenshot copied to clipboard. + צילום־מסך הועתק לוח־גזירים. + + + + Unable to save the screenshot to disk. + לא ניתן לשמור צילום־מסך על הכונן. + + + + Screenshot saved. + צילום־מסך נשמר. + + + + ImgUploaderTool + + + Image Uploader + מעלה התמונות + + + + Upload the selection + העלאת הבחירה + + + + ImgurUploader + + Upload to Imgur + העלאה ל־Imgur + + + Uploading Image + העלאת תמונה + + + Copy URL + העתקת מען־URL + + + Open URL + פתיחת מען־URL + + + Delete image + מחיקת תמונה + + + Image to Clipboard. + תמונה ללוח־גזירים. + + + + Unable to open the URL. + לא ניתן לפתוח את מען ה־URL. + + + URL copied to clipboard. + מען־URL הועתק ללוח הגזירים. + + + Screenshot copied to clipboard. + צילום מסך הועתק ללוח. + + + + ImgurUploaderTool + + Image Uploader + מעלה תמונות + + + Upload the selection to Imgur + העלאת הבחירה ל־Imgur + + + + InfoWindow + + + + About + אודות + + + + + Icon + סמל + + + + + License + רישיון + + + + + GPLv3+ + GPLv3+ + + + + + Version + גרסה + + + + + Flameshot v + Flameshot v + + + + + OS Info + מידע מערכת הפעלה + + + + + Copy Info + העתקת מידע + + + Right Click + Clic dret + + + Mouse Wheel + Roda del ratolí + + + Move selection 1px + Mou la selecció 1 px + + + Resize selection 1px + Redimensiona la selecció 1 px + + + Quit capture + Ix de la captura + + + Copy to clipboard + Copia al porta-retalls + + + Save selection as a file + Guarda la selecció com a fitxer + + + Undo the last modification + Desfés l'última modificació + + + Show color picker + Mostra el selector de color + + + Change the tool's thickness + Canvia el gruix de l'eina + + + Key + Tecla + + + Description + Descripció + + + <u><b>License</b></u> + <u> <b>רישיון</b></u> + + + <u><b>Version</b></u> + <u> <b>גרסה</b> </u> + + + <u><b>Shortcuts</b></u> + <u><b>Dreceres</b></u> + + + Available shortcuts in the screen capture mode. + Dreceres disponibles en el mode de captura de pantalla. + + + + InvertTool + + + Invert + שיכול + + + + Set Inverter as the paint tool + הגדרת המשכל ככלי צבע + + + + LineTool + + + Line + קו + + + + Set the Line as the paint tool + הגדרת 'קו' ככלי צבע + + + + MarkerTool + + + Marker + מדגש + + + + Set the Marker as the paint tool + הגדרת 'מדגש' ככלי צבע + + + + MoveTool + + + Move + העברה + + + + Move the selection area + העברת אזור הבחירה + + + + PencilTool + + + Pencil + עפרון + + + + Set the Pencil as the paint tool + הגדרת 'עיפרון' ככלי צבע + + + + PinTool + + + Pin Tool + נעיצת כלי + + + + Pin image on the desktop + נעיצת תמונה על שולחן־העבודה + + + + PinWidget + + + Context menu + Context menu + + + + Copy to clipboard + העתקה ללוח־גזירים + + + + Save to file + שמירה לקובץ + + + + Rotate Right + סיבוב לימין + + + + Rotate Left + סיבוב לשמאל + + + + Increase Opacity + הגדלת אטימות + + + + Decrease Opacity + הקטנת אטימות + + + + Close + סגירה + + + + PixelateTool + + + Pixelate + פיקסול + + + + Set Pixelate as the paint tool. + הגדרת 'פיקסול' ככלי צבע. + + + Set Pixelate as the paint tool + הגדרת 'פיקסול' ככלי צבע + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QHotkey + + Failed to register %1. Error: %2 + רישום %1 כשל. שגיאה: %2 + + + Failed to unregister %1. Error: %2 + ביטול רישום %1 כשל. שגיאה: %2 + + + + QObject + + + + Capture saved to clipboard. + לכידה נשמרה בלוח־הגזירים. + + + + Error while saving to clipboard + שגיאה בעת שמירה בלוח־הגזירים + + + + Save screenshot + שמירת צילום־מסך + + + + Path copied to clipboard as + הנתיב הועתק ללוח־הגזירים כ־ + + + Saving canceled + שמירה בוטלה + + + Save canceled + שמירה בוטלה + + + Capture is saved and copied to the clipboard as + הלכידה נשמרת והועתקה ללוח־הגזירים כ־ + + + + Save Error + שגיאת שמירה + + + + + Capture saved as + לכידה נשמרה כ־ + + + + + Error trying to save as + שגיאה בניסיון שמירה כ־ + + + + Unable to connect via DBus + לא ניתן להתחבר דרך DBus + + + + Powerful yet simple to use screenshot software. + תכנות צילומי־מסך, רבת עצמה, אך קלה לשימוש. + + + + See + ראו + + + Capture the entire desktop. + לכידת שולחן־העבודה כולו. + + + + Open the capture launcher. + פתיחת משגר הלכידה. + + + + Start a manual capture in GUI mode. + אתחול לכידה ידנית במצב מנשק משתמש גרפי. + + + + Configure + תצור + + + Capture a single screen. + לכידת מסך יחיד. + + + Path where the capture will be saved + הנתיב בו תשמר הלכידה + + + + Capture screenshot of all monitors at the same time. + צילום מסך של כל הצגים בו זמנית. + + + + Capture a screenshot of the specified monitor. + צילום מסך בצג שצויין. + + + + Existing directory or new file to save to + שמירה במחיצה קימת או בקובץ חדש + + + + Save the capture to the clipboard + שמירת הלכידה ללוח־הגזירים + + + + Pin the capture to the screen + נעיצת הלכידה על־גבי המסך + + + + Upload screenshot + העלאת צילום־מסך + + + + Delay time in milliseconds + זמן השהיה באלפיות שניה + + + + Repeat screenshot with previously selected region + חזרה על צילום־מסך עם האזור שנבחר לאחרונה + + + + Screenshot region to select + אזור צילום־מסך לבחירה + + + + Set the filename pattern + הגדרת דפוס שם קובץ + + + + Accept capture as soon as a selection is made + קבלת לכידה מיד עם הבחירה + + + + Enable or disable the trayicon + אפשור או השבתת סמל המגש + + + + Enable or disable run at startup + אפשור או השבתת הפעלה באתחול + + + + Enable or disable the notifications + לאפשר או להשבית את ההודעות + + + + Check the configuration for errors + בדיקת תצורה לאיתור שגיאות + + + + Show the help message in the capture mode + הצגת הודעת העזרה במצב לכידה + + + + Define the main UI color + הגדרת צבעי מנשק המשתמש הראשי + + + + Define the contrast UI color + הגדרת נגודיות צבעי מנשק המשתמש + + + + Print raw PNG capture + הדפסת לכידת PNG גולמית + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + הדפסת גאומטרית הבחירה בתבנית WxH+X+Y. לא עושה דבר אם צוין 'גלמי' + + + + Define the screen to capture (starting from 0) + הגדרת המסך ללכידה (התחלה מ־0) + + + + Invalid delay, it must be a number greater than 0 + השהיה לא תקינה, המספר חייב להיות גדול מ־0 + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + אזור לא תקין, נא להשתמש ב־'WxH+X+Y', או 'הכול', או 'צג0/צג1/...'. + + + + Invalid path, must be an existing directory or a new file in an existing directory + נתיב לא חוקי, חייב להיות 'מחיצה קיימת', או 'קובץ חדש', במחיצה קיימת + + + Define the screen to capture + הגדרת מסך ללכידה + + + + default: screen containing the cursor + ברירת מחדל: מסך לרבות סמן־העכבר + + + + Screen number + מספר צג + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + צבע לא תקין, דגל זה תומך בתבניות הבאות: +- #RGB (כל R, G, ו־Bהוא תו HEX יחיד) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- שמות צבעים כמו 'blue' או 'red' +יתכן שיידרש לחלץ את התו '#' מהמחרוזת'\#FFF' + + + Invalid delay, it must be higher than 0 + משך השהייה לא תקין, חייב להיות מספר גדול מ־0 + + + + Invalid screen number, it must be non negative + מספר מסך לא תקין, לא יכול להיות מספק שלילי + + + Invalid path, it must be a real path in the system + נתיב לא תקין, חייב להיות נתיב מערכת אמיתי + + + + Invalid value, it must be defined as 'true' or 'false' + ערך לא תקין, יש להגדיר כ־'true' או 'false' + + + + Error + שגיאה + + + + Unable to write in + לא ניתן לכתוב ב־ + + + Capture saved to clipboard + לכידה נשמרה ללוח־הגזירים + + + URL copied to clipboard. + מען־URL הועתק ללוח־הגזירים. + + + + Options + אפשרויות + + + Arguments + משתנים + + + arguments + משתנים + + + + Subcommands + פקודות משנה + + + + subcommands + פקודות משנה + + + + Usage + שימוש + + + + options + אפשרויות + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + כברירת מחדל Flameshot פועל ברקע ומוסיף סמל מגש לתצורה. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + שלום אני כאן! נא להקיש על הסמל במגש לצילום־מסך או הקשה על לחצן עכבר ימני להצגת אפשרויות נוספות. + + + + Requested screen exceeds screen count + המסך המבוקש חורג ממספר המסכים + + + + Full screen screenshot pinned to screen + צילום־מסך מלא, נעוץ למסך + + + Toggle side panel + בררת סרגל־צד + + + Resize selection left 1px + שינוי גודל הבחירה לשמאל פיקסל 1 + + + Resize selection right 1px + שינוי גודל הבחירה לימין פיקסל 1 + + + Resize selection up 1px + שינוי גודל הבחירה מעלה פיקסל 1 + + + Resize selection down 1px + שינוי גודל הבחירה מטה פיקסל 1 + + + Select entire screen + בחירת כל המסך + + + Move selection left 1px + העברת בחירה 1px לשמאל + + + Move selection right 1px + העברת בחירה 1px לימין + + + Move selection up 1px + העברת בחירה 1px מעלה + + + Move selection down 1px + העברת בחירה 1px מטה + + + Commit text in text area + קיבוע מלל באזור המלל + + + Delete current tool + מחיקת כלי נוכחי + + + + Quit capture + יציאה מלכידה + + + + Screenshot history + היסטורית צילומי־מסך + + + + Capture screen + לכידת מסך + + + + Show color picker + הצגת בורר הצבעים + + + + Change the tool's size + שינוי גודל הכלי + + + Change the tool's thickness + שינוי עובי הכלי + + + + RectangleTool + + + Rectangle + ריבוע + + + + Set the Rectangle as the paint tool + הגדרת 'מרובע' ככלי צבע + + + + RedoTool + + + Redo + החזרה + + + + Redo the next modification + החזרת ההסגלה הבאה + + + + SaveTool + + + Save + שמירה + + + + Save screenshot to a file + שמירת צילו־מסך לקובץ + + + Save the capture + שמירת הלכידה + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + לא ניתן לזהות סביבת שולחן עבודה (GNOME? KDE? להתנדנד? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + מתאם לכידת המסך האוניברסלי של Wayland דורש את Grim כרכיב לכידת המסך של Wayland. אם רכיב לכידת המסך חסר, נא להתקין אותו! + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + אם ההגדרה useGrimAdapter לא מאופשרת, ייעשה שימוש בפרוטוקול dbus. יש לציין כי לא מומלץ להשתמש בפרוטוקול dbus תחת wayland. מומלץ לאפשר את ההגדרה useGrimAdapter ב־flameshot.ini כדי להפעיל את מתאם צילום המסך הכללי של wayland המבוסס על grim + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + רכיב צילום המסך של grim מיושם על סמך wlroots, ייתכן שלא ניתן להשתמש בו ב־GNOME או בסביבות שולחן עבודה דומות + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + לא ניתן לזהות סביבת שולחן עבודה (GNOME? KDE? Sway? ...) + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + רמז: נא לנסות להגדיר את משתנה הסביבה XDG_CURRENT_DESKTOP. + + + + Unable to capture screen + לא ניתן ללכוד מסך + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + בחירת ריבוע + + + + Set Selection as the paint tool + הגדרת 'בחירה' ככלי הצביע + + + + SetShortcutDialog + + + Set Shortcut + הגדרת קיצור־דרך + + + + Enter new shortcut to change + נא להזין קיצור־דרך חדש לשינוי + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + הקשה על Esc לבטול או ⌘+Backspace כדי להשבית את קיצור המקלדת. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + הקשה על Esc לבטול או על Backspace כדי להשבית את קיצור המקלדת. + + + + + Flameshot must be restarted for changes to take effect. + נא לאתחל את Flameshot כדי שהשינויים ייכנסו לתוקף. + + + + ShortcutsWidget + + + Hot Keys + מקשים חמים + + + + Available shortcuts in the screen capture mode. + קיצורי־דרך זמינים במצב לכידת מסך. + + + + Description + תיאור + + + + Key + מקש + + + + Left Double-click + הקשת־עכבר כפולה שמאלית + + + + Toggle side panel + מחלף סרגל־צד + + + + Grab a color from the screen + + + + + Resize selection left 1px + שינוי גודל הבחירה לשמאל פיקסל 1 + + + + Resize selection right 1px + שינוי גודל הבחירה לימין פיקסל 1 + + + + Resize selection up 1px + שינוי גודל הבחירה מעלה פיקסל 1 + + + + Resize selection down 1px + שינוי גודל הבחירה מטה פיקסל 1 + + + + Symmetrically decrease width by 2px + להקטין באופן סימטרי רוחב ב־2 פיקסלים + + + + Symmetrically increase width by 2px + להגדיל באופן סימטרי רוחב ב-2 פיקסלים + + + + Symmetrically increase height by 2px + להגדיל באופן סימטרי גובה ב-2 פיקסלים + + + + Symmetrically decrease height by 2px + להקטין באופן סימטרי גובה ב-2 פיקסלים + + + + Select entire screen + בחירת כל המסך + + + + Move selection left 1px + העברת בחירה 1px לשמאל + + + + Move selection right 1px + העברת בחירה 1px לימין + + + + Move selection up 1px + העברת בחירה 1px מעלה + + + + Move selection down 1px + העברת בחירה 1px מטה + + + + Commit text in text area + קיבוע מלל באזור מלל + + + + Delete selected drawn object + מחיקת העצם המצויר שנבחר + + + + Cancel current selection + ביטול בחירה נוכחית + + + Delete current tool + מחיקת כלי נוכחי + + + + Capture screen + לכידת מסך + + + + Screenshot history + היסטורית צילומי־מסך + + + + SidePanelWidget + + Active thickness: + עובי פעיל: + + + Active color: + צבע פעיל: + + + Press ESC to cancel + הקשה על ESC ליציאה + + + + Active tool size: + גודל כלי פעיל: + + + + Active Color: + צבע פעיל: + + + + Grab Color + תפיסת צבע + + + + Display grid + הצגת רשת + + + + SizeDecreaseTool + + + Decrease Tool Size + הקטנת גודל כלי + + + + Decrease the size of the other tools + הקטנת גודל הכלים האחרים + + + + SizeIncreaseTool + + + Increase Tool Size + הגדלת גודל כלי + + + + Increase the size of the other tools + הגדלת גודל הכלי האחר + + + + SizeIndicatorTool + + Selection Size Indicator + מחוון גודל־בחירה + + + Show X and Y dimensions of the selection + הצגת ממדי X ו־Y של האזור שנבחר + + + Show the dimensions of the selection (X Y) + הצגת ממדי הבחירה (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + מאה (00-99) + + + + Year (00-99) + שנה (00-99) + + + + Year (2000) + שנה (2000) + + + + Month Name (jan) + שם חודש (ינו) + + + + Month Name (january) + שם חודש (ינואר) + + + + Month (01-12) + חודש (01-12) + + + + Week Day (1-7) + יום בשבוע (1-7) + + + + Week (01-53) + שבוע (01-53) + + + + Day Name (mon) + שם יום (א') + + + + Day Name (monday) + שם יום (ראשון) + + + + Day (01-31) + יום (01-31) + + + + Day of Month (1-31) + יום בחודש (1-31) + + + + Day (001-366) + יום (001-366) + + + + Hour (00-23) + שעה (00-23) + + + + Hour (01-12) + שעה (01-12) + + + + Minute (00-59) + דקה (00-59) + + + + Second (00-59) + שניה (00-59) + + + + Full Date (%m/%d/%y) + תאריך מלא (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + תאריך מלא (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + + + + + Time (%H-%M-%S) + זמן (%H-%M-%S) + + + + Time (%H-%M) + זמן (%H-%M) + + + + SystemNotification + + + Flameshot Info + מידע Flameshot + + + + TextConfig + + + StrikeOut + קו־חוצה + + + + Underline + קו תחתון + + + + Bold + מודגש + + + + Italic + נטוי + + + + Left Align + יישור לשמאל + + + + Center Align + יישור למרכז + + + + Right Align + יישור לימין + + + + TextTool + + + Text + מלל + + + + Add text to your capture + הוספת מלל ללכידה + + + + TrayIcon + + + &Take Screenshot + &צילום־מסך + + + + &Open Launcher + &פתיחת משגר + + + + &Configuration + &תצור + + + + &About + &על אודות + + + + Check for updates + בדיקת זמינות עדכונים + + + + New version %1 is available + גרסה חדשה %1, זמינה + + + + &Quit + &יציאה + + + + &Latest Uploads + &העלאות אחרונות + + + + &Open Save Path + &פתיחת 'שמירת נתיב' + + + + UIcolorEditor + + UI Color Editor + עורך צבעי מנשק משתמש + + + + Change the color moving the selectors and see the changes in the preview buttons. + שנוי הצבע שמזיז את הבוררים וצפיה בשינויים בלחצני התצוגה המקדימה. + + + + Select a Button to modify it + נא לבחור לחצן להסגלה + + + + Main Color + צבע ראשי + + + + Click on this button to set the edition mode of the main color. + נא להקיש על לחצן זה להגדרת מצב עריכת צבע הראשי. + + + + Contrast Color + צבע ניגודיות + + + + Click on this button to set the edition mode of the contrast color. + נא להקיש על לחצן זה להגדרת מצב עריכת צבע ניגודיות. + + + + UndoTool + + + Undo + הסגה + + + + Undo the last modification + הסגת ההסגלה האחרונה + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + זמינה גרסת Flamesho %1 חדשה + + + + Ignore + להתעלם + + + + Later + מאוחר יותר + + + + Update + עדכון + + + + UploadHistory + + + Upload History + העלאת היסטוריה + + + + Screenshots history is empty + היסטוריית צילומי־מסך, ריקה + + + + UploadLineItem + + + Form + טופס + + + + TextLabel + תווית מלל + + + + Copy URL + העתקת מען־URL + + + + Open In Browser + פתיחה בדפדפן + + + + Confirm to delete + אישור מחיקה + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + האם למחוק צילום־מסך מבין ההעלאות האחרונות והשרת? + + + + UtilityPanel + + + Close + סגירה + + + + <Empty> + <ריק> + + + + VisualsEditor + + + Opacity of area outside selection: + אטימות השטח מחוץ לבחירה: + + + + UI Color Editor + עורך צבעי מנשק משתמש + + + + Colorpicker Editor + עורך בוחר־צבעים + + + + Button Selection + מקטע תחתון + + + + Select All + בחירת הכל + + + + color_widgets::ColorDialog + + + Pick + ליקוט + + + + color_widgets::ColorPalette + + + Unnamed + ללא שם + + + + color_widgets::ColorPaletteModel + + + Unnamed + ללא שם + + + + %1 (%2 colors) + %1 (%2 צבעים) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + פתיחת לוח צבעים חדש מקובץ + + + + + Create a new palette + יצירת לוח־צבעים צבעים חדש + + + + + Duplicate the current palette + שכפול לוח־הצבעים הנוכחי + + + + + Delete the current palette + מחיקת לוח־הצבעים הנוכחי + + + + + Revert changes to the current palette + השבת שינויים בלוח הצבעים הנוכחי לקדמותם + + + + + Save changes to the current palette + שמירת שינויים ללוח־הצבעים הנוכחי + + + + + Add a color to the palette + הוספת צבע לוח־הצבעים + + + + + Remove the selected color from the palette + הסרת הצבע שנבחר מלוח־הצבעים + + + + + New Palette + לוח־צבעים חדש + + + + + Name + שם + + + + GIMP Palettes (*.gpl) + לוחות־צבעים GIMP (*.gpl) + + + + Palette Image (%1) + תמונת לוח־צבעים (%1) + + + + All Files (*) + כול הקבצים (*) + + + + + Open Palette + פתיחת לוח־צבעים + + + + Failed to load the palette file +%1 + טעינת קובץ לוח־הצבעים כשלה +%1 + + + + color_widgets::GradientEditor + + + Add Color + הוספת צבע + + + + Remove Color + הסרת צבע + + + + Edit Color... + עריכת צבע... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 צבעים) + + + + color_widgets::Swatch + + + Clear Color + נקוי צבע + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_hu.ts b/data/translations/Internationalization_hu.ts new file mode 100644 index 0000000..88ae3f4 --- /dev/null +++ b/data/translations/Internationalization_hu.ts @@ -0,0 +1,3209 @@ + + + + + AbstractWidgetList + + + Add New + Új hozzáadása + + + + Move Up + Mozogj feljebb + + + + Move Down + Mozgás lefelé + + + + Remove + Eltávolítani + + + + AcceptTool + + + Accept + Elfogadom + + + + Accept the capture + Fogadja el az elfogást + + + + AppLauncher + + + App Launcher + Alkalmazás indító + + + + Choose an app to open the capture + Válassz egy alkalmazást hogy elinduljon a felvétel + + + + AppLauncherWidget + + + Open With + Megnyitás ezzel + + + + Launch in terminal + Futtatás terminálban + + + + Keep open after selection + Kiválasztás után maradjon nyitva + + + + + Error + Hiba + + + + Unable to launch in terminal. + Nem lehet megnyitni a terminálban. + + + + Unable to write in + Nem lehet írni + + + + ArrowTool + + + Arrow + Nyíl + + + + Set the Arrow as the paint tool + Beállítja a nyíl eszközt festő eszközként + + + + BlurTool + + Blur + Homályosítás + + + Set Blur as the paint tool + Beállítja a Homályosítás eszközt festő eszközként + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Rögzítési mód</b> + + + + Rectangular Region + Téglalapos kijelölő + + + + Full Screen (All Monitors) + Teljes Képernyő (Minden Kijelzőn) + + + + No Delay + Késleltetés Nélkül + + + + second + másodperc + + + + + + seconds + másodperc + + + + + Take new screenshot + Új képernyőmentés + + + + + Area: + Terület: + + + + + Delay: + Késleltetés: + + + + Full Screen (Current Display) + Teljes képernyő (Jelenlegi kijelzőn) + + + + + Capture Launcher + Capture Launcher + + + + + TextLabel + TextLabel + + + + + Capture Mode + Capture Mode + + + + + WxH+x+y + WxH+x+y + + + + CaptureWidget + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. + Válassz egy területet egérrel, vagy nyomj Esc-et a kilépéshez. +Nyomj entert a felvételhez. +Kattints job egérgombal a szín választásához. +Használd a görgőt az eszköz vastagságának állítására. + + + + Unable to capture screen + Nem lehet felvételt készíteni + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Jelölj ki egy területet az egérrel, vagy lépj ki az Esc billentyűvel. +Nyomj Entert a képernyő rögzítéséhez. +Nyomd meg a Jobb Egérgombot a szín választó megjelenítéséhez. +Használd az egérgörgőt az eszköz vonalvastagságának változtatásáért. +Nyomd meg a Space billentyűt, hogy megnyisd az oldalsó panelt. + + + + Tool Settings + Eszközbeállítások + + + + Mouse + Mouse + + + + Select screenshot area + Képernyőkép terület kiválasztása + + + + Mouse Wheel + Görgő + + + + Change tool size + Szerszámméret váltás + + + + Right Click + jobb egérgomb + + + + Show color picker + Színválasztó mutatása + + + + Open side panel + Nyitott oldalfal + + + + Esc + Esc + + + + Exit + Bezárás + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot elvesztette a fókuszt. A billentyűparancsok nem működnek, amíg nem kattintasz valahol. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + Konfigurációs hiba megoldva. Indítsa el újra a `flameshot gui-t` az alkalmazáshoz. + + + + Quit Capture + Kilépés a rögzítésből + + + + Are you sure you want to quit capture? + Biztosan meg akarja szakítani a rögzítést? + + + + Do not show this again + Ne mutasd újra + + + + CircleCountTool + + + Circle Counter + Körös Számláló Eszköz + + + + Add an autoincrementing counter bubble + Hozzáad egy buborékban lévő folyamatosan növekvő számot + + + + CircleTool + + + Circle + Kör + + + + Set the Circle as the paint tool + Beálítja a Kör eszközt festő eszközként + + + + ColorDialog + + + + Select Color + Válasszon színt + + + + + Saturation + Telítettség + + + + + Hue + Árnyalat + + + + + Hex + Hex + + + + + Blue + Blue + + + + + Value + Érték + + + + + Green + Green + + + + + Alpha + Alpha + + + + + Red + Red + + + + ColorGrabWidget + + + Accept color + Szín elfogadása + + + + Precisely select color + Precisely select color + + + + Toggle magnifier + Toggle magnifier + + + + Cancel + Cancel + + + + Enter or Left Click + Enter or Left Click + + + + Hold Left Click + Hold Left Click + + + + Space or Right Click + Space or Right Click + + + + Esc + Esc + + + + ColorPickerEditor + + + Delete + Delete + + + + Press button to delete the selected preset + Press button to delete the selected preset + + + + Add Preset: + Add Preset: + + + + Enter color manually or select it using the color-wheel + Enter color manually or select it using the color-wheel + + + + Add + Add + + + + Press button to add preset + Press button to add preset + + + + + Error + Hiba + + + + Unable to add preset. Maximum limit reached. + Unable to add preset. Maximum limit reached. + + + + Unable to remove preset. Minimum limit reached. + Unable to remove preset. Minimum limit reached. + + + + Edit Preset: + Edit Preset: + + + + Enter color to update preset + Enter color to update preset + + + + Update + Frissítés + + + + Press button to update the selected preset + Press button to update the selected preset + + + + ConfigErrorDetails + + + Configuration errors + Configuration errors + + + + ConfigHandler + + + You have successfully resolved the configuration error. + You have successfully resolved the configuration error. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + Bad config key '%1' in ConfigHandler. Please report this as a bug. + + + + Unrecognized setting: '%1' + + Unrecognized setting: '%1' + + + + + Unrecognized shortcut name: '%1'. + + Unrecognized shortcut name: '%1'. + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + + + + Bad value in '%1'. Expected: %2 + + Bad value in '%1'. Expected: %2 + + + + + The configuration contains an error. Open configuration to resolve. + The configuration contains an error. Open configuration to resolve. + + + + ConfigResolver + + + Resolve configuration errors + Resolve configuration errors + + + + <b>You must resolve all errors before continuing:</b> + <b>You must resolve all errors before continuing:</b> + + + + Reset + Visszaállítás + + + + Reset to the default value. + Reset to the default value. + + + + Remove + Eltávolítani + + + + Remove this setting. + Remove this setting. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + + + + Resolve all + Resolve all + + + + Resolve all listed errors. + Resolve all listed errors. + + + + Details + Details + + + + ConfigWindow + + + Configuration + Beállítások + + + + Interface + Kezelőfelület + + + + Filename Editor + Fájlnév szerkesztő + + + + General + Általános + + + + Shortcuts + Gyorsbillentyűk + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>Configuration file has errors. Resolve them before continuing.</b> + + + + Resolve + Resolve + + + + Controller + + &Configuration + &Konfiguráció + + + &Information + &Információ + + + &Quit + &Bezárás + + + &Take Screenshot + &Képernyő Mentés Készítése + + + &Open Launcher + &Alkalmazásindító Megnyitása + + + &About + &Rólunk + + + &Latest Uploads + &Eddigi Feltöltések + + + New version %1 is available + Elérhető az új %1 verzió + + + You have the latest version + A legfrisebb verzió van feltelepítve + + + Check for updates + Frissítések keresése + + + Failed to get information about the latest version. + Nem sikerült információt szerezni a legújabb verzióról. + + + Error + Hiba + + + Unable to close active modal widgets + Nem sikerült bezárni az aktív widgeteket + + + URL copied to clipboard. + URL másolva a vágólapra. + + + + CopyTool + + + Copy + Másolás + + + Copies the selecion into the clipboard + Másolja a kiválasztott területet + + + Copy the selection into the clipboard + Vágolapra másolja a kijelölt területet + + + + Copy selection to clipboard + Copy selection to clipboard + + + + DBusUtils + + Unable to connect via DBus + Nem lehet csatlakozni DBus-al + + + + ExitTool + + + Exit + Bezárás + + + + Leave the capture screen + Bezárja a felvevőt + + + + FileNameEditor + + + Edit the name of your captures: + Felvételek neveinek szerkesztése: + + + + Edit: + Szerkesztés: + + + + Preview: + Előnézet: + + + + Save + Mentés + + + + Saves the pattern + Minta mentése + + + Reset + Visszaállítás + + + + Restores the saved pattern + Visszaállítja a mentett mintát + + + + Clear + Törlés + + + + Deletes the name + Törli a nevet + + + + Restore + Restore + + + + FileNameHandler + + screenshot + Képernyőmentés + + + + Flameshot + + + Error + Hiba + + + + Unable to close active modal widgets + Nem sikerült bezárni az aktív widgeteket + + + + URL copied to clipboard. + URL másolva a vágólapra. + + + + FlameshotDBusAdapter + + Unable to capture screen + Nem lehet képernyőképet készíteni + + + + FlameshotDaemon + + + Unable to connect via DBus + Unable to connect via DBus + + + + New version %1 is available + Elérhető az új %1 verzió + + + + You have the latest version + A legfrisebb verzió van feltelepítve + + + + Failed to get information about the latest version. + Nem sikerült információt szerezni a legújabb verzióról. + + + + GeneneralConf + + Show help message + Mutassa a segítséget + + + Show the help message at the beginning in the capture mode. + Mutassa a segítséget a felvevő mód kezdetekor. + + + Show desktop notifications + Mutassa az asztali üzeneteket + + + Show tray icon + Tray ikon mutatása + + + Show the systemtray icon + Systemtray ikon mutatása + + + Import + Importálás + + + Error + Hiba + + + Unable to read file. + Nem lehet olvasni a fájlt. + + + Unable to write file. + Nem lehet írni a fájlt. + + + Save File + Fájl mentése + + + Confirm Reset + Visszaállítás elfogadása + + + Are you sure you want to reset the configuration? + Biztos vagy benne hogy viszaállítod a beállításokat? + + + Configuration File + Konfigurációs fájl + + + Export + Export + + + Reset + Visszaállítás + + + Launch at startup + Indítás rendszerinduláskor + + + Launch Flameshot + Flameshot indítása + + + + GeneralConf + + + + Import + Importálás + + + + + + + Error + Hiba + + + + Unable to read file. + Nem lehet olvasni a fájlt. + + + + + Unable to write file. + Nem lehet írni a fájlt. + + + + Save File + Fájl mentése + + + + Confirm Reset + Visszaállítás elfogadása + + + + Are you sure you want to reset the configuration? + Biztos vagy benne hogy viszaállítod a beállításokat? + + + + Show help message + Súgó üzenet mutatása + + + Show the help message at the beginning in the capture mode. + Súgó üzenet mutatása rögzítő mód kezdetekor. + + + + Show the side panel button + Oldalsó panel nyitó gomb mutatása + + + Show the side panel toggle button in the capture mode. + Oldalsó panel nyitó gomb megjelenítése rögzítő módban. + + + + Show desktop notifications + Asztali értesítések megjelenítése + + + + Show tray icon + Ikon megjelenítése a tálcán + + + Show the systemtray icon + Ikon megjelenítése a tálcán + + + + Confirmation required to delete screenshot from the latest uploads + Legutóbb feltöltött képek közül törléskor kérjen megerősítést + + + + Configuration File + Konfigurációs fájl + + + + Export + Exportálás + + + + Reset + Visszaállítás + + + + Automatic check for updates + Frissítések automatikus keresése + + + Launch at startup + Indítás rendszerinduláskor + + + Launch Flameshot + Flameshot indítása + + + + Show welcome message on launch + Üdvözlő üzenet mutatása indításkor + + + + Copy URL after upload + URL vágolapra másolása feltöltés után + + + Copy URL and close window after upload + URL vágolapra másolása és ablak bezárása feltöltés után + + + + Save image after copy + Másolás után kép mentése + + + Save image file after copying it + Fénykép elmentése másolás után + + + + Save Path + Mentés helye + + + + Change... + Változtatás... + + + + Use fixed path for screenshots to save + Fix elérési útvonal használata a képernyőmentésekhez + + + + Copy file path after save + Mentés után elérési útvonal másolása + + + + Choose a Folder + Válassz egy Mappát + + + + Unable to write to directory. + Nem lehet menteni ebbe a mappába. + + + + Use JPG format for clipboard (PNG default) + JPG formátum használata vágolapra másoláskor (PNG az alapértelmezett) + + + + Latest Uploads Max Size + Latest Uploads Max Size + + + + Undo limit + Undo limit + + + + Allow multiple flameshot GUI instances simultaneously + Allow multiple flameshot GUI instances simultaneously + + + Automatically close daemon when it is not needed + Automatically close daemon when it is not needed + + + + Use large predefined color palette + Use large predefined color palette + + + + Preferred save file extension: + Preferred save file extension: + + + + Anti-aliasing image when zoom the pinned image + Anti-aliasing image when zoom the pinned image + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + After zooming the pinned image, should the image get smoothened or stay pixelated + + + + + Upload image without confirmation + Upload image without confirmation + + + + Show the help message at the beginning in the capture mode + Show the help message at the beginning in the capture mode + + + + Show the side panel toggle button in the capture mode + Show the side panel toggle button in the capture mode + + + + Enable desktop notifications + Enable desktop notifications + + + + Show icon in the system tray + Show icon in the system tray + + + + Ask for confirmation to delete screenshot from the latest uploads + Ask for confirmation to delete screenshot from the latest uploads + + + + Check for updates automatically + Check for updates automatically + + + + This allows you to take screenshots of Flameshot itself for example + This allows you to take screenshots of Flameshot itself for example + + + Launch Flameshot daemon when computer is booted + Launch Flameshot daemon when computer is booted + + + + Show the welcome message box in the middle of the screen while taking a screenshot + Show the welcome message box in the middle of the screen while taking a screenshot + + + + Use a large predefined color palette + Use a large predefined color palette + + + Copy URL and close window after uploading was successful + Copy URL and close window after uploading was successful + + + + After copying the screenshot, save it to a file as well + After copying the screenshot, save it to a file as well + + + + Copy the file path to clipboard after the file is saved + Copy the file path to clipboard after the file is saved + + + + Show magnifier + Show magnifier + + + + Enable a magnifier while selecting the screenshot area + Enable a magnifier while selecting the screenshot area + + + + Square shaped magnifier + Square shaped magnifier + + + + Make the magnifier to be square-shaped + Make the magnifier to be square-shaped + + + + Use last region for GUI mode + Use last region for GUI mode + + + + Use the last region as the default selection for the next screenshot in GUI mode + Use the last region as the default selection for the next screenshot in GUI mode + + + + Copy on double click + Copy on double click + + + Enable Copy on Double Click + Enable Copy on Double Click + + + + Imgur Application Client ID + Imgur Application Client ID + + + + Show abort notifications + Megszakítási értesítések megjelenítése + + + + Enable abort notifications + Megszakítási értesítések engedélyezése + + + + Use grim to capture screenshots + A grim segítségével készíthet képernyőképeket + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + A Grim egy Wayland segédprogram, amely a screencopy protokollon alapuló képernyőképek rögzítésére szolgál. Általában csak minimális Wayland ablakkezelőkön, például sway, hyprland stb. engedélyezhető. + + + + Automatically unload from memory when it is not needed + Ha nincs rá szükség, automatikusan törölje a memóriából + + + + Automatically close daemon (background process) when it is not needed + A daemon (háttérfolyamat) automatikus bezárása, ha nincs rá szükség + + + + Launch in background at startup + Indítás a háttérben a rendszer indításakor + + + + Launch Flameshot daemon (background process) when computer is booted + A Flameshot daemon (háttérfolyamat) elindítása a számítógép indításakor + + + + Ask before quit capture + Kérdezzen, mielőtt kilépne a rögzítésből + + + + Show the confirmation prompt before ESC quit + Az ESC kilépés előtt mutassa meg a megerősítést kérő ablakot + + + + Enable Copy to clipboard on Double Click + Kattintson duplán a Másolás a vágólapra opcióra + + + + Copy URL after uploading was successful + A feltöltés sikeres befejezése után másolja az URL-t + + + + Use lossy JPG format for clipboard (lossless PNG default) + Használjon veszteséges JPG formátumot a vágólaphoz (alapértelmezés szerint veszteségmentes PNG) + + + + Milliseconds before geometry display hides; 0 means do not hide + A geometria megjelenítésének elrejtése előtti milliszekundumok száma; 0 azt jelenti, hogy ne rejtse el + + + + Set geometry display timeout (ms) + A geometria megjelenítésének időkorlátja (ms) + + + + Selection Geometry Display + Kiválasztási geometria megjelenítése + + + + Display Location + Kijelző helye + + + + None + Semmelyik + + + + Top Left + Bal felső sarok + + + + Top Right + Jobb felső sarok + + + + Bottom Left + Bal alsó sarok + + + + Bottom Right + Jobb alsó sarok + + + + Center + Középpont + + + + Quality range of 0-100; Higher number is better quality and larger file size + Minőségi tartomány: 0–100; Minél magasabb a szám, annál jobb a minőség és annál nagyobb a fájlmére + + + + JPEG Quality + JPEG minőség + + + + Reverse arrow + Fordított nyíl + + + + Draw the arrow head first + Először rajzolja meg a nyílat + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + Rajzolja meg a pixelizációs hatást bizonytalan, de esztétikusabb módon. + + + + HistoryWidget + + Latest Uploads + Korábbi Feltöltések + + + Screenshots history is empty + Nincs korábbi képernyőmentésed + + + Copy URL + URL másolása + + + URL copied to clipboard. + URL másolva a vágólapra. + + + Open in browser + Megnyitás böngészőben + + + Confirm to delete + Törlés megerősítése + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Biztosan törölni szeretnéd a képernyőmentést a korábbi feltöltések közül és a szerverről is? + + + + ImgS3Uploader + + Uploading Image + Kép feltöltése + + + URL copied to clipboard. + URL másolva a vágólapra. + + + Error + Hiba + + + + ImgUploadDialog + + + Upload Confirmation + Upload Confirmation + + + + Do you want to upload this capture? + Do you want to upload this capture? + + + + + Upload without confirmation + Upload without confirmation + + + + ImgUploader + + Uploading Image + Kép feltöltése + + + Unable to open the URL. + Nem lehet az URL-t megnyitni. + + + URL copied to clipboard. + URL másolva a vágólapra. + + + Screenshot copied to clipboard. + Képernyőmentés másolva a vágólapra. + + + Copy URL + URL másolása + + + Open URL + URL megnyitása + + + Image to Clipboard. + Kép a vágolapra. + + + Delete image + Kép törlése + + + + ImgUploaderBase + + + Upload image + Upload image + + + + Uploading Image + Kép feltöltése + + + + Copy URL + URL másolása + + + + Open URL + URL megnyitása + + + + Delete image + Kép törlése + + + + Image to Clipboard. + Image to Clipboard. + + + + Unable to open the URL. + Unable to open the URL. + + + + URL copied to clipboard. + URL másolva a vágólapra. + + + + Screenshot copied to clipboard. + Képernyőmentés másolva a vágólapra. + + + + Save image + Save image + + + + Unable to save the screenshot to disk. + Unable to save the screenshot to disk. + + + + Screenshot saved. + Screenshot saved. + + + + ImgUploaderTool + + + Image Uploader + Kép Feltöltő + + + + Upload the selection + Upload the selection + + + + ImgurUploader + + Upload to Imgur + Feltöltés Imgur -ra + + + Uploading Image + Kép feltöltése + + + Copy URL + URL másolása + + + Open URL + URL megnyitása + + + Image to Clipboard. + Kép másolása a Vágolapra. + + + + Unable to open the URL. + Nem lehet megnyitni az URL-t. + + + URL copied to clipboard. + URL másolva a vágólapra. + + + Screenshot copied to clipboard. + Képernyőmentés másolva a vágólapra. + + + Delete image + Kép törlése + + + + ImgurUploaderTool + + Image Uploader + Kép Feltöltő + + + Upload the selection to Imgur + Feltölti a kiválasztott képet az Imgur -ra + + + + InfoWindow + + + + About + Rólunk + + + Right Click + jobb egérgomb + + + Mouse Wheel + Görgő + + + Move selection 1px + Kijelölés mozgatása 1px + + + Resize selection 1px + Kijelölés méretezése 1 px + + + Quit capture + Felvétel bezárása + + + Copy to clipboard + Másolás vágólapra + + + Save selection as a file + Kijelölés mentése fájlba + + + Undo the last modification + Utolsó módosítás visszavonása + + + Show color picker + Színválasztó mutatása + + + Change the tool's thickness + Vastagság állítása + + + Key + Kulcs + + + Description + Leírás + + + <u><b>License</b></u> + <u><b>Licensz</b></u> + + + <u><b>Version</b></u> + <u><b>Verzió</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Gyorsbillentyűk</b></u> + + + Available shortcuts in the screen capture mode. + Elérhető gyorsbillentyűk a képernyőfelvétel módban. + + + + + Icon + Icon + + + + + License + License + + + + + GPLv3+ + GPLv3+ + + + + + Version + Version + + + + + Flameshot v + Flameshot v + + + + + OS Info + OS Info + + + + + Copy Info + Copy Info + + + + InvertTool + + + Invert + Invert + + + + Set Inverter as the paint tool + Set Inverter as the paint tool + + + + LineTool + + + Line + Vonal + + + + Set the Line as the paint tool + Vonal festőeszköz kiválasztása + + + + MarkerTool + + + Marker + Kijelölő + + + + Set the Marker as the paint tool + Kijelőlő festőeszköz kiválaszása + + + + MoveTool + + + Move + Mozgatás eszköz + + + + Move the selection area + Mozgatja a kiválasztott területet + + + + PencilTool + + + Pencil + Ceruza + + + + Set the Pencil as the paint tool + Ceruza festőeszköz kiválaszása + + + + PinTool + + + Pin Tool + Gombostű Eszköz + + + + Pin image on the desktop + Előtérben tartja a képet + + + + PinWidget + + + Context menu + Context menu + + + + Copy to clipboard + Másolás vágólapra + + + + Save to file + Save to file + + + + Rotate Right + Jobbra forgatás + + + + Rotate Left + Balra forgatás + + + + Increase Opacity + Átlátszóság növelése + + + + Decrease Opacity + Átlátszóság csökkentése + + + + Close + Bezárás + + + + PixelateTool + + + Pixelate + Homályosítás + + + Set Pixelate as the paint tool + Homályosító festőeszköz kiválasztása + + + + Set Pixelate as the paint tool. + + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QHotkey + + Failed to register %1. Error: %2 + Nem sikerült %1 rögzítése. %2 Hiba + + + Failed to unregister %1. Error: %2 + Sikertelen rögzítés törlés %1 -nél. %2 Hiba + + + + QObject + + + Save Error + Mentési hiba + + + + + Capture saved as + It is hard to esxpress such stence in hungary eg. Capture saved as JPG in hungary : A felvétel JPG -ben mentve lett. (Better solution using expressions in string like: Capture saved as %s ) + Felvétel mentve itt: + + + + + Error trying to save as + Hiba a mentésnél + + + + Unable to connect via DBus + Nem lehet D-Bus -on keresztül csatlakozni + + + + Error + Hiba + + + + Unable to write in + Nem írni + + + Capture saved to clipboard + Felvétel mentve a vágólapra + + + URL copied to clipboard. + URL másolva a vágólapra. + + + + Options + Opciók + + + Arguments + Feltételek + + + arguments + feltételek + + + + Usage + Használat + + + + options + opciók + + + + Powerful yet simple to use screenshot software. + Multifunkcionális, könnyen használható képernyőmentő szotver. + + + + See + Megnézés + + + Capture the entire desktop. + Teljes kijelző rögzítése. + + + + Open the capture launcher. + Rögzítésindító megnyitása. + + + + Start a manual capture in GUI mode. + Manuális rögzítés indítása GUI módban. + + + + Configure + Konfiguráció + + + Capture a single screen. + Egy kijelző rögzítése. + + + Path where the capture will be saved + Rögzítés mentési helye + + + + Save the capture to the clipboard + Rögzítés másolása a vágólapra + + + + Delay time in milliseconds + Késleltetési idő milliszekundumban + + + + Set the filename pattern + Fájlnév minta megadása + + + + Enable or disable the trayicon + Tálca ikon be- és kikapcsolása + + + + Enable or disable run at startup + Indítás rendszerinduláskor be- és kikapcsolása + + + + Show the help message in the capture mode + Súgó szöveg mutatása rögzítő módban + + + + Define the main UI color + Kezelőfelület fő színének beállítása + + + + Define the contrast UI color + Kezelőfelület kiemelő színének beállítása + + + + Print raw PNG capture + Rögzítés nyomtatása PNG -ből + + + Define the screen to capture + Rögzítési képernyő megadása + + + + default: screen containing the cursor + alapértelmezett: a kijelző amin a kurzor is elhelyezkedik + + + + Screen number + Kijelző száma + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Érvénytelen szín, ez az opció a következő formátumokat támogatja: +- #RGB (egyjegyű hexadecimális értékek) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Elnevezett színek, mint 'blue' vagy 'red' +Lehet, hogy meg kepp adnod egy '\' karaktert a '#' karakter előtt például: '\#FFF' + + + Invalid delay, it must be higher than 0 + Érvénytelen késleltetés, 0-nál nagyobb értéknel kell lennie + + + + Invalid screen number, it must be non negative + Érvénytelen kijelző szám, nem lehet negatív + + + Invalid path, it must be a real path in the system + Érvénytelen elérési útvonal, nincs ilyen elérési útvonal ezen az eszközön + + + + Invalid value, it must be defined as 'true' or 'false' + Érvénytelen érték, lehetséges értékek a 'true' és a 'false' + + + + + Capture saved to clipboard. + Rögzítés másolva a vágólapra. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Heló, Itt vagyok! Kattints a tálca ikonra, hogy képernyőmentést készíts vagy kattints jobb egérgombbal a további lehetőségekért. + + + Toggle side panel + Oldalsó panel ki- és bekapcsolása + + + Resize selection left 1px + Kijelölés átméretezése balra 1px-el + + + Resize selection right 1px + Kijelölés átméretezése jobbra 1px-el + + + Resize selection up 1px + Kijelölés átméretezése fel 1px-el + + + Resize selection down 1px + Kijelölés átméretezése le 1px-el + + + Move selection left 1px + Kijelölés mozgatása balra 1px-el + + + Move selection right 1px + Kijelölés mozgatása jobbra 1px-el + + + Move selection up 1px + Kijelölés mozgatása fel 1px-el + + + Move selection down 1px + Kijelölés mozgatása le 1px-el + + + + Quit capture + Felvétel bezárása + + + + Screenshot history + Képernyőmentési előzmények + + + + Capture screen + Képernyő rögzítése + + + + Show color picker + Színválasztó mutatása + + + Change the tool's thickness + Eszköz vonalvastagságának állítása + + + + Save screenshot + Képernyőkép mentése + + + Capture is saved and copied to the clipboard as + A rögzítés mentve és vágolara másolva a következőként + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + A Flameshot alapértelmezés szerint fut a háttérben és ikont helyez el a tálcán a beállítások elérése érdekében. + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + A kijelölés geometriáját írja ki Sz M X Y (Szélesség Magasság X pozíció Y pozíció) formátumban. Nem csinál semmit, hogyha a nyers opció aktív + + + Select entire screen + Teljes kijelző kijelölése + + + Commit text in text area + Szöveg megadása a szöveg mezőben + + + + Error while saving to clipboard + Hiba a vágolapra másolás közben + + + Delete current tool + Delete current tool + + + Saving canceled + Saving canceled + + + Save canceled + Save canceled + + + + Change the tool's size + Change the tool's size + + + + Full screen screenshot pinned to screen + Full screen screenshot pinned to screen + + + + Existing directory or new file to save to + Existing directory or new file to save to + + + + Pin the capture to the screen + Pin the capture to the screen + + + + Upload screenshot + Upload screenshot + + + + Screenshot region to select + Screenshot region to select + + + + Accept capture as soon as a selection is made + Accept capture as soon as a selection is made + + + + Check the configuration for errors + Check the configuration for errors + + + + Define the screen to capture (starting from 0) + Define the screen to capture (starting from 0) + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + + + + Invalid path, must be an existing directory or a new file in an existing directory + Invalid path, must be an existing directory or a new file in an existing directory + + + + Path copied to clipboard as + Path copied to clipboard as + + + + Invalid delay, it must be a number greater than 0 + Invalid delay, it must be a number greater than 0 + + + + Requested screen exceeds screen count + Requested screen exceeds screen count + + + + Repeat screenshot with previously selected region + Repeat screenshot with previously selected region + + + + Subcommands + + + + + subcommands + + + + + Capture screenshot of all monitors at the same time. + Az összes monitor képernyőképeinek egyidejű rögzítése. + + + + Capture a screenshot of the specified monitor. + Készítsen képernyőképet a megadott monitorról. + + + + Enable or disable the notifications + Az értesítések engedélyezése vagy letiltása + + + + RectangleTool + + + Rectangle + Téglalap + + + + Set the Rectangle as the paint tool + Téglalap festőeszköz kiválaszása + + + + RedoTool + + + Redo + Újra + + + + Redo the next modification + Következő módosítás újra alkalmazása + + + + SaveTool + + + Save + Mentés + + + Save the capture + Menti a felvételt + + + + Save screenshot to a file + Save screenshot to a file + + + + ScreenGrabber + + + Unable to capture screen + Nem sikerült rögzíteni a kijelzőt + + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + Az általános wayland képernyőfelvétel-adapter Grim-et igényel, mint a wayland képernyőfelvétel-komponensét. Ha a képernyőfelvétel-komponens hiányzik, kérjük, telepítse! + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + A grim képernyőkép-összetevő wlroots alapján készült, ezért nem használható GNOME vagy hasonló asztali környezetekben + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + Nem sikerült felismerni az asztali környezetet (GNOME? KDE? Qile? Sway? ...) + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + Írjon ide valamit... + + + + &Send + &Küldés + + + + Error sending message + Hiba az üzenet küldése közben + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + Üres téglalap + + + + Set Selection as the paint tool + Üres téglalap festőeszköz kiválaszása + + + + SetShortcutDialog + + + Set Shortcut + Gyorsbillentyű beállítása + + + + Enter new shortcut to change + Adj meg egy új gyorsbillentyűt a változtatáshoz + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Nyomd meg az Esc billentyűt a kilépéshet vagy a Backspace-t a gyorsbillentyűk kikapcsolásához. + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + + + + + Flameshot must be restarted for changes to take effect. + Flameshot must be restarted for changes to take effect. + + + + ShortcutsWidget + + + Hot Keys + Gyorsbillentyűk + + + + Available shortcuts in the screen capture mode. + Képernyőfelvétel módban elérhető gyorsbillentyűk. + + + + Description + Leírás + + + + Key + Billentyű kombináció + + + + Left Double-click + Left Double-click + + + + Toggle side panel + Oldalsó panel ki- és bekapcsolása + + + + Grab a color from the screen + Válasszon ki egy színt a képernyőről + + + + Resize selection left 1px + Kijelölés átméretezése balra 1px-el + + + + Resize selection right 1px + Kijelölés átméretezése jobbra 1px-el + + + + Resize selection up 1px + Kijelölés átméretezése fel 1px-el + + + + Resize selection down 1px + Kijelölés átméretezése le 1px-el + + + + Select entire screen + Teljes kijelző kijelölése + + + + Move selection left 1px + Kijelölés mozgatása balra 1px-el + + + + Move selection right 1px + Kijelölés mozgatása jobbra 1px-el + + + + Move selection up 1px + Kijelölés mozgatása fel 1px-el + + + + Move selection down 1px + Kijelölés mozgatása le 1px-el + + + + Commit text in text area + Szöveg megadása a szöveg mezőben + + + Delete current tool + Delete current tool + + + + Capture screen + Képernyő rögzítése + + + + Screenshot history + Képernyőmentési előzmények + + + + Symmetrically decrease width by 2px + Szimmetrikusan csökkentse a szélességet 2 képponttal + + + + Symmetrically increase width by 2px + Szimmetrikusan növelje a szélességet 2 képponttal + + + + Symmetrically increase height by 2px + Szimmetrikusan növelje a magasságot 2 képponttal + + + + Symmetrically decrease height by 2px + Szimmetrikusan csökkentse a magasságot 2 képponttal + + + + Delete selected drawn object + Kiválasztott rajzolt objektum törlése + + + + Cancel current selection + Jelenlegi kijelölés törlése + + + + SidePanelWidget + + Active thickness: + Aktív vastagság: + + + Active color: + Aktív szín: + + + Press ESC to cancel + Nyomd meg az ESC-et a kilépéshez + + + + Grab Color + Szín választása + + + + Active tool size: + Active tool size: + + + + Active Color: + Active Color: + + + + Display grid + Rács megjelenítése + + + + SizeDecreaseTool + + + Decrease Tool Size + Decrease Tool Size + + + + Decrease the size of the other tools + Decrease the size of the other tools + + + + SizeIncreaseTool + + + Increase Tool Size + Increase Tool Size + + + + Increase the size of the other tools + Increase the size of the other tools + + + + SizeIndicatorTool + + Selection Size Indicator + Kiválaszás Méretének Jelzése + + + Show the dimensions of the selection (X Y) + Mutatja a kijelölés pozícióját (X Y) + + + Show X and Y dimensions of the selection + Show X and Y dimensions of the selection + + + + StrftimeChooserWidget + + + Century (00-99) + Század (00-99) + + + + Year (00-99) + Év (00-99) + + + + Year (2000) + Év (2000) + + + + Month Name (jan) + Hónapnév (jan) + + + + Month Name (january) + Hónapnév (január) + + + + Month (01-12) + Hónap (01-12) + + + + Week Day (1-7) + Hét napja (1-7) + + + + Week (01-53) + Hét (01-53) + + + + Day Name (mon) + Nap neve (Csüt) + + + + Day Name (monday) + Nap neve (Csütörtök) + + + + Day (01-31) + Nap (01-31) + + + + Day of Month (1-31) + Nap a hónapban (1-31) + + + + Day (001-366) + Nap (001-366) + + + + Full Date (%d-%m-%Y) + Teljes dátum (%d-%m-%Y) + + + Time (%H:%M:%S) + Idő (%H:%M:%S) + + + Time (%H:%M) + Idő (%H:%M) + + + + Hour (00-23) + Óra (00-23) + + + + Hour (01-12) + Óra (01-12) + + + + Minute (00-59) + Perc (00-59) + + + + Second (00-59) + Másodperc (00-59) + + + + Full Date (%m/%d/%y) + Teljes dátum (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + Teljes dátum (%Y-%m-%d) + + + + Time (%H-%M-%S) + Idő (%H-%M-%S) + + + + Time (%H-%M) + Idő (%H-%M) + + + + SystemNotification + + + Flameshot Info + A Flameshot-ról + + + + TextConfig + + + StrikeOut + Áthúzott + + + + Underline + Aláhúzott + + + + Bold + Félkövér + + + + Italic + Dőlt + + + + Left Align + Left Align + + + + Center Align + Center Align + + + + Right Align + Right Align + + + + TextTool + + + Text + Szöveg + + + + Add text to your capture + Adj szöveget a rögzítéshez + + + + TrayIcon + + + &Take Screenshot + &Képernyő Mentés Készítése + + + + &Open Launcher + &Alkalmazásindító Megnyitása + + + + &Configuration + &Konfiguráció + + + + &About + &Rólunk + + + + Check for updates + Frissítések keresése + + + + New version %1 is available + Elérhető az új %1 verzió + + + + &Quit + &Bezárás + + + + &Latest Uploads + &Eddigi Feltöltések + + + + &Open Save Path + &Nyitás Mentési útvonal + + + + UIcolorEditor + + UI Color Editor + Kezelőfelület Színeinek Szerkesztése + + + + Change the color moving the selectors and see the changes in the preview buttons. + Válassz színt az egér mozgatásával és nézd ahogy változnak az előnézeti gombok. + + + + Select a Button to modify it + Válassz gombot a módosításához + + + + Main Color + Fő Szín + + + + Click on this button to set the edition mode of the main color. + Kattints a gombra hogy beállítsd a szerkesztő módját a fő színnek. + + + + Contrast Color + Kiemelő Szín + + + + Click on this button to set the edition mode of the contrast color. + Kattints erre a gombra hogy beállítsd a szerkesztő módját a kiemelő színnek. + + + + UndoTool + + + Undo + Vissza + + + + Undo the last modification + Visszavonja az utolsó módosítást + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + Elérhető az új %1 Flameshot verzió + + + + Ignore + Mellőzés + + + + Later + Később + + + + Update + Frissítés + + + + UploadHistory + + + Upload History + Upload History + + + + Screenshots history is empty + Nincs korábbi képernyőmentésed + + + + UploadLineItem + + + Form + Form + + + + TextLabel + TextLabel + + + + Copy URL + URL másolása + + + + Open In Browser + Open In Browser + + + + Confirm to delete + Törlés megerősítése + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Biztosan törölni szeretnéd a képernyőmentést a korábbi feltöltések közül és a szerverről is? + + + + UtilityPanel + + + Close + Bezárás + + + + <Empty> + <Empty> + + + + VisualsEditor + + + Opacity of area outside selection: + A kijelölésen kívüli terület átlátszósága: + + + + Button Selection + Gomb választás + + + + Select All + Összes kiválasztása + + + + UI Color Editor + Kezelőfelület Színeinek Szerkesztése + + + + Colorpicker Editor + Colorpicker Editor + + + + color_widgets::ColorDialog + + + Pick + Pick + + + + color_widgets::ColorPalette + + + Unnamed + Unnamed + + + + color_widgets::ColorPaletteModel + + + Unnamed + Unnamed + + + + %1 (%2 colors) + %1 (%2 colors) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + Open a new palette from file + + + + + Create a new palette + Create a new palette + + + + + Duplicate the current palette + Duplicate the current palette + + + + + Delete the current palette + Delete the current palette + + + + + Revert changes to the current palette + Revert changes to the current palette + + + + + Save changes to the current palette + Save changes to the current palette + + + + + Add a color to the palette + Add a color to the palette + + + + + Remove the selected color from the palette + Remove the selected color from the palette + + + + + New Palette + New Palette + + + + + Name + Name + + + + GIMP Palettes (*.gpl) + GIMP Palettes (*.gpl) + + + + Palette Image (%1) + Palette Image (%1) + + + + All Files (*) + All Files (*) + + + + + Open Palette + Open Palette + + + + Failed to load the palette file +%1 + Failed to load the palette file +%1 + + + + color_widgets::GradientEditor + + + Add Color + Add Color + + + + Remove Color + Remove Color + + + + Edit Color... + Edit Color... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 colors) + + + + color_widgets::Swatch + + + Clear Color + Clear Color + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_id.ts b/data/translations/Internationalization_id.ts new file mode 100644 index 0000000..53041ce --- /dev/null +++ b/data/translations/Internationalization_id.ts @@ -0,0 +1,3181 @@ + + + + + AbstractWidgetList + + + Add New + Tambah Baru + + + + Move Up + Pindah Ke Atas + + + + Move Down + Pindah Ke Bawah + + + + Remove + Hapus + + + + AcceptTool + + + Accept + Terima + + + + Accept the capture + Terima cuplikan + + + + AppLauncher + + + App Launcher + Peluncur Aplikasi + + + + Choose an app to open the capture + Pilih aplikasi untuk membuka cuplikan layar + + + + AppLauncherWidget + + + Open With + Buka Dengan + + + + Launch in terminal + Luncurkan di terminal + + + + Keep open after selection + Tetap buka setelah memilih + + + + + Error + Galat + + + + Unable to launch in terminal. + Tidak dapat meluncurkan pada terminal. + + + + Unable to write in + Tidak dapat menulis + + + + ArrowTool + + + Arrow + Panah + + + + Set the Arrow as the paint tool + Atur Panah sebagai paint tool + + + + BlurTool + + Blur + Desenfocament + + + Set Blur as the paint tool + Estableix el desenfocament com a eina de dibuix + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Mode Cuplikan</b> + + + + Rectangular Region + Daerah Persegi Panjang + + + + Full Screen (Current Display) + Layar Penuh (Tampilan saat ini) + + + + Full Screen (All Monitors) + Layar Penuh (Semua Monitor) + + + + No Delay + Tanpa Jeda + + + + second + detik + + + + + + seconds + detik + + + + + Take new screenshot + Ambil tangkapan layar baru + + + + + Area: + Area: + + + + + Capture Launcher + Peluncur Penangkap + + + + + TextLabel + LabelTeks + + + + + Capture Mode + Mode Penangkapan + + + + + Delay: + Jeda: + + + + + WxH+x+y + WxH+x+y + + + + CaptureWidget + + + Unable to capture screen + Impossible capturar la pantalla + Tidak dapat menangkap layar + + + + Mouse + Mouse + + + + Select screenshot area + Pilih area tangkapan layar + + + + Mouse Wheel + Roda Mouse + + + + Change tool size + Ubah ukuran alat + + + + Right Click + Klik Kanan + + + + Show color picker + Tampilkan pemilih warna + + + + Open side panel + Buka panel samping + + + + Esc + Esc + + + + Exit + Keluar + + + + Quit Capture + + + + + Are you sure you want to quit capture? + + + + + Do not show this again + + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot telah kehilangan fokus. Pintasan keyboard tidak akan berfungsi sampai Anda mengklik di suatu tempat. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + Kesalahan konfigurasi teratasi. Jalankan `flameshot gui` lagi untuk menerapkannya. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + + + + Tool Settings + Pengaturan Alat + + + + CircleCountTool + + + Circle Counter + Penghitung Lingkaran + + + + Add an autoincrementing counter bubble + Tambahkan gelembung penghitung autoincrementing + + + + CircleTool + + + Circle + Lingkaran + + + + Set the Circle as the paint tool + Atur Lingkaran sebagai paint tool + + + + ColorDialog + + + + Select Color + Pilih Warna + + + + + Saturation + Saturasi + + + + + Hue + Warna + + + + + Hex + Hex + + + + + Blue + Biru + + + + + Value + Nilai + + + + + Green + Hijau + + + + + Alpha + Alfa + + + + + Red + Merah + + + + ColorGrabWidget + + + Accept color + Terima warna + + + + Enter or Left Click + Enter or Left Click + + + + Precisely select color + Pilih warna dengan tepat + + + + Hold Left Click + Hold Left Click + + + + Toggle magnifier + Alihkan kaca pembesar + + + + Space or Right Click + Space or Right Click + + + + Cancel + Batalkan + + + + Esc + Esc + + + + ColorPickerEditor + + Select Preset: + Pilih Preset: + + + Select preset using the spinbox + Pilih preset memakai kotak putar + + + + Edit Preset: + Edit Preset: + + + + Enter color to update preset + Enter color to update preset + + + + Update + Perbarui + + + + Press button to update the selected preset + Press button to update the selected preset + + + + Delete + Hapus + + + + Press button to delete the selected preset + Tekan tombol untuk menghapus preset yang dipilih + + + + Add Preset: + Tambah Prasetel: + + + + Enter color manually or select it using the color-wheel + Masukkan warna secara manual atau pilih itu dengan menggunakan roda-warna + + + + Add + Tambah + + + + Press button to add preset + Tekan tombol untuk menambah prasetel + + + + + Error + Galat + + + + Unable to add preset. Maximum limit reached. + Tidak dapat menambahkan prasetel. Batas maksimum tercapai. + + + + Unable to remove preset. Minimum limit reached. + Tidak dapat menghapus prasetel. Batas minimum tercapai. + + + + ConfigErrorDetails + + + Configuration errors + Kesalahan konfigurasi + + + + ConfigHandler + + + Unrecognized setting: '%1' + + Pengaturan tidak dikenal: '%1' + + + + + Unrecognized shortcut name: '%1'. + + Nama shortcut tidak dikenal: '%1'. + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + Konflik shortcut: '%1' dan '%2' memiliki shortcut yang samaL %3 + + + + + Bad value in '%1'. Expected: %2 + + Nilai buruk pada '%1': Seharusnya: %2 + + + + + You have successfully resolved the configuration error. + Anda telah berhasil mengatasi kesalahan konfigurasi. + + + + The configuration contains an error. Open configuration to resolve. + Konfigurasi berisi kesalahan. Buka konfigurasi untuk mengatasinya. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + Kunci konfig '%1' buruk pada ConfigHandler. Mohon laporkan ini sebagai bug. + + + + ConfigResolver + + + Resolve configuration errors + Atasi kesalahan konfigurasi + + + + <b>You must resolve all errors before continuing:</b> + <b>Anda harus mengatasi semua kesalahan sebelum lanjut:</b> + + + + Reset + Atur ulang + + + + Reset to the default value. + Atur ulang ke nilai default. + + + + Remove + Hapus + + + + Remove this setting. + Hapus pengaturan ini. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + Beberapa shortcut keyboard memiliki konflik. +Ini TIDAK akan menahan flameshot untuk memulai. +Mohon atasi mereka secara manual di file konfigurasi. + + + + Resolve all + Atasi semua + + + + Resolve all listed errors. + Atasi semua kesalahan yang terdaftar. + + + + Details + Detail + + + + ConfigWindow + + + Configuration + Pengaturan + + + + Interface + Antarmuka + + + + Filename Editor + Pengaturan Nama File + + + + General + Umum + + + + Shortcuts + Pintasan + + + + Resolve + Atasi + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>File konfigurasi memiliki kesalahan. Atasi mereka sebelum melanjutkan.</b> + + + + Controller + + New version %1 is available + Versi baru %1 tersedia + + + You have the latest version + Anda telah menggunakan versi terbaru + + + Failed to get information about the latest version. + Gagal mengambil informasi versi terbaru. + + + Error + Galat + + + Unable to close active modal widgets + Tidak dapat menutup widget modal aktif + + + &Open Launcher + &Buka Peluncur + + + &Configuration + &Pengaturan + + + &About + &Ihwal + + + Check for updates + Periksa pembaruan + + + &Latest Uploads + &Unggahan Terbaru + + + URL copied to clipboard. + URL tersalin ke clipboard. + + + &Information + &Informació + + + &Quit + &Hentikan Flameshot + + + &Take Screenshot + &Ambil Cuplikan Layar + + + + CopyTool + + + Copy + Salin + + + + Copy selection to clipboard + Salin pilihan ke clipboard + + + Copy the selection into the clipboard + Salin seleksi terpilih ke papan klip + + + + DBusUtils + + Unable to connect via DBus + Tidak dapat terhubung melalui DBus + + + + ExitTool + + + Exit + Keluar + + + + Leave the capture screen + Tinggalkan cuplikan layar + + + + FileNameEditor + + + Edit the name of your captures: + Ubah nama hasil tangkapan: + + + + Edit: + Sunting: + + + + Preview: + Pratinjau: + + + + Save + Simpan + + + + Saves the pattern + Simpan pola + + + + Restore + Pulihkan + + + Reset + Reinicialitza + + + + Restores the saved pattern + Pulihkan pola yang tersimpan + + + + Clear + Kosongkan + + + + Deletes the name + Hapus nama + + + + Flameshot + + + Error + Error + + + + Unable to close active modal widgets + Tidak dapat menutup widget modal aktif + + + + URL copied to clipboard. + URL copied to clipboard. + + + + FlameshotDaemon + + + New version %1 is available + Versi baru %1 tersedia + + + + You have the latest version + Anda telah menggunakan versi terbaru + + + + Failed to get information about the latest version. + Gagal mengambil informasi versi terbaru. + + + + Unable to connect via DBus + Tidak dapat terhubung via DBus + + + + GeneneralConf + + Show help message + Mostra el missatge d'ajuda + + + Show the help message at the beginning in the capture mode. + Mostra el missatge d'ajuda en iniciar el mode de captura. + + + Show desktop notifications + Mostra les notificacions d'escriptori + + + Show tray icon + Mostra la icona en la barra de tasques + + + Show the systemtray icon + Mostra la icona en la barra de tasques + + + Import + Importar + + + Error + Error + + + Unable to read file. + Impossible llegir el fitxer. + + + Unable to write file. + Impossible escriure al fitxer. + + + Save File + Guardar Arxiu + + + Confirm Reset + Confirmar Reset + + + Are you sure you want to reset the configuration? + Esteu segur que voleu reiniciar la configuració? + + + Configuration File + Fitxer de Configuració + + + Export + Exportar + + + Reset + Reset + + + Launch at startup + Llançament a l'inici + + + + GeneralConf + + + + Import + Impor + + + + + + + Error + Galat + + + + Unable to read file. + Tidak bisa membaca berkas. + + + + + Unable to write file. + Tak bisa menulis berkas. + + + + Save File + Simpan File + + + + Confirm Reset + Konfirmasi atur ulang + + + + Are you sure you want to reset the configuration? + Apakah Anda yakin ingin mengatur ulang konfigurasi? + + + + Show help message + Tampilkan pesan bantuan + + + Show the help message at the beginning in the capture mode. + Tampilkan pesan bantuan di awal dalam mode capture. + + + + Show the side panel button + Tampilkan tombol panel samping + + + Show the side panel toggle button in the capture mode. + Tampilkan tombol panel samping di mode capture. + + + + Show desktop notifications + Tampilkan notifikasi desktop + + + + Show tray icon + Tampilkan ikon baki + + + Show the systemtray icon + Tampilkan ikon baki sistem + + + + Confirmation required to delete screenshot from the latest uploads + Konfirmasi diperlukan untuk menghapus screenshot dari unggahan terbaru + + + + Configuration File + Konfigurasi Berkas + + + + Export + Ekspor + + + + Reset + Setel ulang + + + + Automatic check for updates + Pemeriksaan otomatis pembaruan + + + + Allow multiple flameshot GUI instances simultaneously + Izinkan beberapa instance flameshot GUI secara bersamaan + + + This allows you to take screenshots of flameshot itself for example. + Ini memungkinkan Anda untuk mengambil screenshot dari flameshot itu sendiri misalnya. + + + Automatically close daemon when it is not needed + Otomatis tutup daemon ketika tidak dibutuhkan + + + Launch at startup + Luncurkan saat startup + + + Launch Flameshot + Luncurkan Flameshot + + + + Show welcome message on launch + Tampilkan pesan selamat datang saat peluncuran + + + + Use large predefined color palette + Gunakan palet warna besar yang telah ditentukan + + + + Copy URL after upload + Salin URL setelah mengunggah + + + Copy URL and close window after upload + Salin URL dan tutup jendela setelah mengunggah + + + + Save image after copy + Simpan gambar setelah menyalin + + + Save image file after copying it + Simpan file gambar setelah menyalinnya + + + + Show the help message at the beginning in the capture mode + Tampilkan pesan bantuan pada awal dalam mode penangkapan + + + + Use last region for GUI mode + Use last region for GUI mode + + + + Use the last region as the default selection for the next screenshot in GUI mode + Use the last region as the default selection for the next screenshot in GUI mode + + + + Show the side panel toggle button in the capture mode + Tampilkan tombol jungkit Panel samping pada mode penangkapan + + + + Enable desktop notifications + Aktifkan pemberitahuan desktop + + + + Show abort notifications + + + + + Enable abort notifications + + + + + Show icon in the system tray + Tampilkan ikon di baki sistem + + + + Use grim to capture screenshots + + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + + + + + Ask for confirmation to delete screenshot from the latest uploads + Tanyakan konfirmasi untuk menghapus cuplikan layar dari upload terbaru + + + + Check for updates automatically + Periksa pemutakhiran secara otomatis + + + + This allows you to take screenshots of Flameshot itself for example + Hal ini memungkinkan Anda untuk mengambil cuplikan layar dari nyala api sendiri misalnya + + + Launch Flameshot daemon when computer is booted + Luncurkan Jurik Flameshot ketika komputer dinyalakan + + + + Show the welcome message box in the middle of the screen while taking a screenshot + Tampilkan kotak pesan sambutan di tengah layar saat mengambil cuplikan layar + + + + Use a large predefined color palette + Palet warna terpradefinisi + + + + Copy on double click + Copy on double click + + + Enable Copy on Double Click + Enable Copy on Double Click + + + Copy URL and close window after uploading was successful + Salin URL dan tutup jendela setelah mengunggah berhasil + + + + Automatically unload from memory when it is not needed + + + + + Automatically close daemon (background process) when it is not needed + + + + + Launch in background at startup + + + + + Launch Flameshot daemon (background process) when computer is booted + + + + + Ask before quit capture + + + + + Show the confirmation prompt before ESC quit + + + + + Enable Copy to clipboard on Double Click + + + + + Copy URL after uploading was successful + + + + + After copying the screenshot, save it to a file as well + Setelah menyalin cuplikan layar, simpan ke berkas juga + + + + Save Path + Simpan Jalur + + + + Change... + Ubah... + + + + Use fixed path for screenshots to save + Gunakan lokasi tetap untuk menyimpan tangkapan layar + + + + Preferred save file extension: + Ekstensi file penyimpanan yang disukai: + + + + Latest Uploads Max Size + Ukuran Maksimal Unggahan Terbaru + + + + Imgur Application Client ID + Imgur Application Client ID + + + + Undo limit + Batas undurkan + + + + Use JPG format for clipboard (PNG default) + Gunakan format JPG untuk clipboard (PNG default) + + + + Use lossy JPG format for clipboard (lossless PNG default) + + + + + Copy file path after save + Salin lokasi file setelah menyimpan + + + + Copy the file path to clipboard after the file is saved + Salin lokasi berkas ke papan klip setelah berkas disimpan + + + + Anti-aliasing image when zoom the pinned image + Gambar anti-aliasing saat memperbesar gambar yang disematkan + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + Setelah memperbesar gambar tersemat, harusnya gambar diperhalus atau tetap ber pixel + + + + + Upload image without confirmation + Unggah gambar tanpa konfirmasi + + + + Choose a Folder + Pilih Folder + + + + Unable to write to directory. + Tidak dapat menulis ke direktori. + + + + Show magnifier + Tampilkan pembesar + + + + Enable a magnifier while selecting the screenshot area + Aktifkan magnifier saat memilih area cuplikan layar + + + + Square shaped magnifier + Kaca pembesar persegi + + + + Make the magnifier to be square-shaped + Membuat pembesar harus berbentuk persegi + + + + Milliseconds before geometry display hides; 0 means do not hide + + + + + Set geometry display timeout (ms) + + + + + Selection Geometry Display + + + + + Display Location + + + + + None + + + + + Top Left + + + + + Top Right + + + + + Bottom Left + + + + + Bottom Right + + + + + Center + + + + + Quality range of 0-100; Higher number is better quality and larger file size + + + + + JPEG Quality + + + + + Reverse arrow + + + + + Draw the arrow head first + + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + Upload Terbaru + + + Screenshots history is empty + Riwayat cuplikan layar kosong + + + Copy URL + Salin URL + + + URL copied to clipboard. + URL disalin ke papan klip. + + + Open in browser + Buka di peramban + + + Confirm to delete + Konfirmasi hapus + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Apakah Anda yakin ingin menghapus screenshot dari unggahan terbaru dan server? + + + + ImgS3Uploader + + Uploading Image + S'està pujant la imatge + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Error + Error + + + + ImgUploadDialog + + + Upload Confirmation + Konfirmasi Unggahan + + + + Do you want to upload this capture? + Apakah Anda ingin mengunggah capture ini? + + + + + Upload without confirmation + Unggah tanpa konfirmasi + + + + ImgUploader + + Uploading Image + S'està pujant la imatge + + + Delete image + Esborra la imatge + + + Unable to open the URL. + No es pot obrir l'URL. + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + Copy URL + Copia l'URL + + + Open URL + Obri l'URL + + + Image to Clipboard. + Imatge al porta-retalls. + + + + ImgUploaderBase + + + Upload image + Unggah gambar + + + + Uploading Image + Mengunggah Gambar + + + + Copy URL + Salin URL + + + + Open URL + Buka URL + + + + Delete image + Hapus gambar + + + + Image to Clipboard. + Gambar ke Clipboard. + + + + Save image + Simpan gambar + + + + Unable to open the URL. + Tidak dapat membuka URL. + + + + URL copied to clipboard. + URL tersalin ke clipboard. + + + + Screenshot copied to clipboard. + Screenshot tersalin ke clipboard. + + + + Unable to save the screenshot to disk. + Tidak dapat menyimpan cuplikan layar ke disk. + + + + Screenshot saved. + Cuplikan layar disimpan. + + + + ImgUploaderTool + + + Image Uploader + Pengunggah Gambar + + + + Upload the selection + Unggah pilihan + + + + ImgurUploader + + Upload to Imgur + Unggah ke Imgur + + + Uploading Image + Mengunggah Gambar + + + Copy URL + Salin URL + + + Open URL + Buka URL + + + Delete image + Hapus gambar + + + Image to Clipboard. + Image to Clipboard. + + + + Unable to open the URL. + Tidak dapat membuka URL. + + + URL copied to clipboard. + URL disalin ke papan klip. + + + Screenshot copied to clipboard. + Cuplikan layar disalin ke papan klip. + + + + ImgurUploaderTool + + Image Uploader + Pengunggah Gambar + + + Upload the selection to Imgur + Upload the selection to Imgur + + + + InfoWindow + + + + About + Tentang + + + + + Icon + Ikon + + + + + License + Lisensi + + + + + GPLv3+ + GPL v3+ + + + + + Version + Versi + + + + + Flameshot v + Flameshot v + + + + + OS Info + Info OS + + + + + Copy Info + Salin Info + + + Right Click + Clic dret + + + Mouse Wheel + Roda del ratolí + + + Move selection 1px + Mou la selecció 1 px + + + Resize selection 1px + Redimensiona la selecció 1 px + + + Quit capture + Ix de la captura + + + Copy to clipboard + Copia al porta-retalls + + + Save selection as a file + Guarda la selecció com a fitxer + + + Undo the last modification + Desfés l'última modificació + + + Show color picker + Mostra el selector de color + + + Change the tool's thickness + Canvia el gruix de l'eina + + + Key + Tecla + + + Description + Descripció + + + <u><b>License</b></u> + <u><b>Lisensi</b></u> + + + <u><b>Version</b></u> + <u><b>Versi</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Dreceres</b></u> + + + Available shortcuts in the screen capture mode. + Dreceres disponibles en el mode de captura de pantalla. + + + + InvertTool + + + Invert + Balikkan + + + + Set Inverter as the paint tool + Atur inverter sebagai paint tool + + + + LineTool + + + Line + Garis + + + + Set the Line as the paint tool + Atur garis sebagai alat gambar + + + + MarkerTool + + + Marker + Penanda + + + + Set the Marker as the paint tool + Atur penanda sebagai paint tool + + + + MoveTool + + + Move + Geser + + + + Move the selection area + Geser daerah terseleksi + + + + PencilTool + + + Pencil + Pensil + + + + Set the Pencil as the paint tool + Atur pensil sebagai alat gambar + + + + PinTool + + + Pin Tool + Alat Semat + + + + Pin image on the desktop + Sematkan gambar ke desktop + + + + PinWidget + + + Context menu + Context menu + + + + Copy to clipboard + Copia al porta-retalls + + + + Save to file + Save to file + + + + Rotate Right + + + + + Rotate Left + + + + + Increase Opacity + + + + + Decrease Opacity + + + + + Close + Tutup + + + + PixelateTool + + + Pixelate + Piksel + + + + Set Pixelate as the paint tool. + + + + Set Pixelate as the paint tool + Atur Pixelate sebagai paint tool + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QHotkey + + Failed to register %1. Error: %2 + Gagal untuk mendaftarkan %1. Kesalahan: %2 + + + Failed to unregister %1. Error: %2 + Gagal untuk membatalkan pendaftaran %1. Kesalahan: %2 + + + + QObject + + + + Capture saved to clipboard. + Cuplikan layar tersimpan ke papan klip. + + + + Error while saving to clipboard + Gagal saat menyimpan ke papan klip + + + + Save screenshot + Simpan cuplikan layar + + + + Path copied to clipboard as + Jalur tersalin ke clipboard sebagai + + + Saving canceled + Menyimpan dibatalkan + + + Save canceled + Simpan dibatalkan + + + Capture is saved and copied to the clipboard as + Cuplikan layar tersimpan dan disalin ke papan klip sebagai + + + + Save Error + Gagal menyimpan + + + + + Capture saved as + Cuplikan layar disimpan sebagai + + + + + Error trying to save as + Gagal ketika mencoba menyimpan sebagai + + + + Unable to connect via DBus + Tidak dapat terhubung melalui DBus + + + + Powerful yet simple to use screenshot software. + Software screenshot yang kuat namun mudah digunakan. + + + + See + Lihat + + + Capture the entire desktop. + Ambil cuplikan layar seluruh desktop. + + + + Open the capture launcher. + Buka peluncur capture. + + + + Start a manual capture in GUI mode. + Jalankan capture manual di mode GUI. + + + + Configure + Konfigurasikan + + + Capture a single screen. + Caputre satu layar. + + + Path where the capture will be saved + Path where the capture will be saved + + + + Capture screenshot of all monitors at the same time. + + + + + Capture a screenshot of the specified monitor. + + + + + Existing directory or new file to save to + Direktori yang ada atau file baru untuk disimpan + + + + Save the capture to the clipboard + Simpan cuplikan layar ke papan klip + + + + Pin the capture to the screen + Sematkan capture ke layar + + + + Upload screenshot + Unggah tangkapan layar + + + + Delay time in milliseconds + Waktu jeda dalam milidetik + + + + Repeat screenshot with previously selected region + Repeat screenshot with previously selected region + + + + Screenshot region to select + Daerah tangkapan layar untuk dipilih + + + + Set the filename pattern + Atur pola nama file + + + + Accept capture as soon as a selection is made + Terima capture segera setelah seleksi dibuat + + + + Enable or disable the trayicon + Hidupkan atau matikan ikon baki + + + + Enable or disable run at startup + Hidupkan atau matikan jalan saat startup + + + + Enable or disable the notifications + + + + + Check the configuration for errors + Cek kesalahan dari konfigurasi + + + + Show the help message in the capture mode + Tampilkan pesan bantuan di mode capture + + + + Define the main UI color + Definisikan warna utama UI + + + + Define the contrast UI color + Definisikan warna kontras UI + + + + Print raw PNG capture + Cetak capture PNG raw + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + Cetak geometri pilihan dalam format WxH+X+Y. Tidak melakukan apa pun jika raw ditentukan + + + + Define the screen to capture (starting from 0) + Definisikan layar untuk capture (dimulai dari 0) + + + + Invalid delay, it must be a number greater than 0 + Jeda tidak valid, harus berupa angka yang lebih dari 0 + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + Bagian tidak valid, gunakan 'WxH+X+Y' atau 'all' atau 'screen0/screen1/...'. + + + + Invalid path, must be an existing directory or a new file in an existing directory + Jalur tidak valid, harus berupa direkotri yang sudah ada atau file baru di direktori yang sudah ada + + + Define the screen to capture + Define the screen to capture + + + + default: screen containing the cursor + default: layar berisi kursor + + + + Screen number + Angka layar + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Warna tidak valid, tanda ini mendukung dengan format berikut: +- #RGB (masing-masing R, G, dan B adalah satu digit hex) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Warna yang bernama seperti 'blue' atau 'red' +Anda mungkin perlu untuk escape dari tanda '#' seperti pada '\#FFF' + + + Invalid delay, it must be higher than 0 + Waktu jeda tidak valid, harus lebih besar dari 0 + + + + Invalid screen number, it must be non negative + Angka layar tidak valid, harus berupa non negatif + + + Invalid path, it must be a real path in the system + Invalid path, it must be a real path in the system + + + + Invalid value, it must be defined as 'true' or 'false' + Nilai tidak valid, harus bernilai 'true' atau 'false' + + + + Error + Galat + + + + Unable to write in + Gagal menulis + + + Capture saved to clipboard + Cuplikan layar tersimpan ke papan klip + + + URL copied to clipboard. + URL disalin ke papan klip. + + + + Options + Opsi + + + Arguments + Argumen + + + arguments + argumen + + + + Subcommands + + + + + subcommands + + + + + Usage + Penggunaan + + + + options + opsi + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Per default menjalankan Flameshot di latar belakang dan menambahkan ikon baki untuk konfigurasi. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Halo, Saya disini! Klik ikon di baki untuk mengambil screenshot atau klik dengan tombol kanan untuk melihat opsi lebih banyak. + + + + Requested screen exceeds screen count + Requested screen exceeds screen count + + + + Full screen screenshot pinned to screen + Screenshot layar penuh disematkan ke layar + + + Toggle side panel + Toggle side panel + + + Resize selection left 1px + Ubah ukuran seleksi sebesar 1px ke kiri + + + Resize selection right 1px + Ubah ukuran seleksi sebesar 1px ke kanan + + + Resize selection up 1px + Ubah ukuran seleksi sebesar 1px ke atas + + + Resize selection down 1px + Ubah ukuran seleksi sebesar 1px ke bawah + + + Select entire screen + Seleksi seluruh layar + + + Move selection left 1px + Geser seleksi sebesar 1px ke kiri + + + Move selection right 1px + Geser seleksi sebesar 1px ke kanan + + + Move selection up 1px + Geser seleksi sebesar 1px ke atas + + + Move selection down 1px + Geser seleksi sebesar 1px ke bawah + + + Commit text in text area + Commit text in text area + + + Delete current tool + Delete current tool + + + + Quit capture + Keluar capture + + + + Screenshot history + Riwayat screenshot + + + + Capture screen + Ambil capture + + + + Show color picker + Tampilkan pemilih warna + + + + Change the tool's size + Ubah ukuran alat + + + Change the tool's thickness + Change the tool's thickness + + + + RectangleTool + + + Rectangle + Persegi panjang + + + + Set the Rectangle as the paint tool + Atur persegi panjang sebagai paint tool + + + + RedoTool + + + Redo + Ulangi + + + + Redo the next modification + Ulangi modifikasi berikutnya + + + + SaveTool + + + Save + Simpan + + + + Save screenshot to a file + Simpan screenshot sebagai file + + + Save the capture + Save the capture + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + + + + Unable to capture screen + Tidak dapat capture layar + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + Seleksi persegi panjang + + + + Set Selection as the paint tool + Atur Seleksian sebagai paint tool + + + + SetShortcutDialog + + + Set Shortcut + Atur Shortcut + + + + Enter new shortcut to change + Masukkan shortcut baru untuk mengubah + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Tekan Esc untuk membatalkan atau ⌘+Backspace untuk mematikan shortcut keyboard. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Tekan Esc untuk membatalkan atau Backspace untuk mematikan shorcut keyboard. + + + + + Flameshot must be restarted for changes to take effect. + Flameshot harus di mulai ulang agar perubahan diterapkan. + + + + ShortcutsWidget + + + Hot Keys + Tombol Panas + + + + Available shortcuts in the screen capture mode. + Shortcut yang tersedia di mode capture layar. + + + + Description + Deskripsi + + + + Key + Kunci + + + + Left Double-click + Left Double-click + + + + Toggle side panel + Toggle side panel + + + + Grab a color from the screen + + + + + Resize selection left 1px + Ubah ukuran seleksi sebesar 1px ke kiri + + + + Resize selection right 1px + Ubah ukuran seleksi sebesar 1px ke kanan + + + + Resize selection up 1px + Ubah ukuran seleksi sebesar 1px ke atas + + + + Resize selection down 1px + Ubah ukuran seleksi sebesar 1px ke bawah + + + + Symmetrically decrease width by 2px + + + + + Symmetrically increase width by 2px + + + + + Symmetrically increase height by 2px + + + + + Symmetrically decrease height by 2px + + + + + Select entire screen + Seleksi seluruh layar + + + + Move selection left 1px + Geser seleksi sebesar 1px ke kiri + + + + Move selection right 1px + Geser seleksi sebesar 1px ke kanan + + + + Move selection up 1px + Geser seleksi sebesar 1px ke atas + + + + Move selection down 1px + Geser seleksi sebesar 1px ke bawah + + + + Commit text in text area + Commit text in text area + + + + Delete selected drawn object + + + + + Cancel current selection + + + + Delete current tool + Delete current tool + + + + Capture screen + Ambil capture + + + + Screenshot history + Riwayat screenshot + + + + SidePanelWidget + + Active thickness: + Active thickness: + + + Active color: + Active color: + + + Press ESC to cancel + Press ESC to cancel + + + + Active tool size: + Ukuran alat aktif: + + + + Active Color: + Warna aktif: + + + + Grab Color + Ambil Warna + + + + Display grid + + + + + SizeDecreaseTool + + + Decrease Tool Size + Kecilkan Ukuran Alat + + + + Decrease the size of the other tools + Kecilkan ukuran dari alat yang lainnya + + + + SizeIncreaseTool + + + Increase Tool Size + Besarkan Alat + + + + Increase the size of the other tools + Besarkan ukuran dari alat yang lain + + + + SizeIndicatorTool + + Selection Size Indicator + Indikator Ukuran Pilihan + + + Show X and Y dimensions of the selection + Tampilkan dimensi X dan Y pada seleksi + + + Show the dimensions of the selection (X Y) + Show the dimensions of the selection (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + Abad (00-99) + + + + Year (00-99) + Tahun (00-99) + + + + Year (2000) + Tahun (2000) + + + + Month Name (jan) + Nama Bulan (jan) + + + + Month Name (january) + Nama Bulan (january) + + + + Month (01-12) + Bulan (01-12) + + + + Week Day (1-7) + Hari Mingguan (1-7) + + + + Week (01-53) + Minggu (01-53) + + + + Day Name (mon) + Nama Hari (mon) + + + + Day Name (monday) + Nama Hari (monday) + + + + Day (01-31) + Hari (01-31) + + + + Day of Month (1-31) + Tanggal (1-31) + + + + Day (001-366) + Hari (001-366) + + + + Hour (00-23) + Jam (00-23) + + + + Hour (01-12) + Jam (01-12) + + + + Minute (00-59) + Menit (00-59) + + + + Second (00-59) + Detik (00-59) + + + + Full Date (%m/%d/%y) + Tanggal Penuh (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + Tanggal Penuh (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + + + + + Time (%H-%M-%S) + Waktu (%H-%M-%S) + + + + Time (%H-%M) + Waktu (%H-%M) + + + + SystemNotification + + + Flameshot Info + Info Flameshot + + + + TextConfig + + + StrikeOut + Coretan + + + + Underline + Garis bawah + + + + Bold + Tebal + + + + Italic + Miring + + + + Left Align + Rata Kiri + + + + Center Align + Rata Tengah + + + + Right Align + Rata Kanan + + + + TextTool + + + Text + Teks + + + + Add text to your capture + Tambahkan teks ke cuplikan layar Anda + + + + TrayIcon + + + &Take Screenshot + &Ambil Cuplikan Layar + + + + &Open Launcher + &Buka Peluncur + + + + &Configuration + &Pengaturan + + + + &About + &Ihwal + + + + Check for updates + Periksa pembaruan + + + + New version %1 is available + Versi baru %1 tersedia + + + + &Quit + &Hentikan Flameshot + + + + &Latest Uploads + &Unggahan Terbaru + + + + &Open Save Path + + + + + UIcolorEditor + + UI Color Editor + Pengedit Warna UI + + + + Change the color moving the selectors and see the changes in the preview buttons. + Ubah warna dengan memindahkan pemilih dan lihat perubahan di tombol pratinjau. + + + + Select a Button to modify it + Pilih Tombol untuk mengubahnya + + + + Main Color + Warna Utama + + + + Click on this button to set the edition mode of the main color. + Klik pada tombol ini untuk mengatur warna utama dari mode edisi. + + + + Contrast Color + Warna Kontras + + + + Click on this button to set the edition mode of the contrast color. + Klik pada tombol ini untuk mengatur warna kontras pada mode edisi. + + + + UndoTool + + + Undo + Batalkan + + + + Undo the last modification + Batalkan perubahan terakhir + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + Versi Flameshot terbaru %1 tersedia + + + + Ignore + Abaikan + + + + Later + Nanti + + + + Update + Perbarui + + + + UploadHistory + + + Upload History + Unggah Riwayat + + + + Screenshots history is empty + Riwayat cuplikan layar kosong + + + + UploadLineItem + + + Form + Formulir + + + + TextLabel + LabelTeks + + + + Copy URL + Salin URL + + + + Open In Browser + Buka Dalam Peramban + + + + Confirm to delete + Konfirmasi hapus + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Apakah Anda yakin ingin menghapus screenshot dari unggahan terbaru dan server? + + + + UtilityPanel + + + Close + Tutup + + + + <Empty> + <Kosong> + + + + VisualsEditor + + + Opacity of area outside selection: + Opacity area di luar seleksi: + + + + UI Color Editor + Pengedit Warna UI + + + + Colorpicker Editor + Penyunting pemilih warna + + + + Button Selection + Seleksi Tombol + + + + Select All + Pilih Semua + + + + color_widgets::ColorDialog + + + Pick + Ambil + + + + color_widgets::ColorPalette + + + Unnamed + Tidak bernama + + + + color_widgets::ColorPaletteModel + + + Unnamed + Tidak bernama + + + + %1 (%2 colors) + %1 (warna %2) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + Buka palet baru dari file + + + + + Create a new palette + Buat palet baru + + + + + Duplicate the current palette + Duplikat palet saat ini + + + + + Delete the current palette + Hapus palet saat ini + + + + + Revert changes to the current palette + Kembalikan perubahan palet saat ini + + + + + Save changes to the current palette + Simpan perubahan palet saat ini + + + + + Add a color to the palette + Tambahkan warna pada palet + + + + + Remove the selected color from the palette + Hapus warna yang terpilih dari palet + + + + + New Palette + Palet Baru + + + + + Name + Nama + + + + GIMP Palettes (*.gpl) + Palet GIMP (*.gpl) + + + + Palette Image (%1) + Gambar Palet (%1) + + + + All Files (*) + Semua File (*) + + + + + Open Palette + Buka Palet + + + + Failed to load the palette file +%1 + Gagal memuat file palet +%1 + + + + color_widgets::GradientEditor + + + Add Color + Tambahkan Warna + + + + Remove Color + Hapus Warna + + + + Edit Color... + Ubah Warna... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (warna %2) + + + + color_widgets::Swatch + + + Clear Color + Hapus Warna + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_it_IT.ts b/data/translations/Internationalization_it_IT.ts new file mode 100644 index 0000000..223e96e --- /dev/null +++ b/data/translations/Internationalization_it_IT.ts @@ -0,0 +1,3038 @@ + + + + + AbstractWidgetList + + + Add New + Aggiungi Nuovo + + + + Move Up + Sposta Su + + + + Move Down + Sposta Giù + + + + Remove + Rimuovi + + + + AcceptTool + + + Accept + Accetta + + + + Accept the capture + Accetta la cattura + + + + AppLauncher + + + App Launcher + Avvia App + + + + Choose an app to open the capture + Scegli un'app per aprire l'acquisizione + + + + AppLauncherWidget + + + Open With + Apri con + + + + Launch in terminal + Avvia nel terminale + + + + Keep open after selection + Mantieni aperto dopo la selezione + + + + + Error + Errore + + + + Unable to write in + Impossibile scrivere + + + + Unable to launch in terminal. + Impossibile avviare nel terminale. + + + + ArrowTool + + + Arrow + Freccia + + + + Set the Arrow as the paint tool + Imposta la freccia come strumento di disegno + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Modalità Cattura</b> + + + + Rectangular Region + Regione rettangolare + + + + Full Screen (Current Display) + Schermo intero (Visualizzazione Corrente) + + + + Full Screen (All Monitors) + Schermo Intero (tutti i monitor) + + + + No Delay + Nessun ritardo + + + + second + secondo + + + + + + seconds + secondi + + + + + Take new screenshot + Acquisisci nuovo screenshot + + + + + Area: + Area: + + + + + Capture Launcher + Cattura lanciatore + + + + + TextLabel + Etichetta di testo + + + + + Capture Mode + Modalità di cattura + + + + + Delay: + Ritardo: + + + + + WxH+x+y + WxH+x+y + + + + CaptureWidget + + + Unable to capture screen + Impossibile acquisire lo schermo + + + + Mouse + Mouse + + + + Select screenshot area + Seleziona l'area dello screenshot + + + + Mouse Wheel + Rotellina del mouse + + + + Change tool size + Cambia la dimensione dello strumento + + + + Right Click + Clic destro + + + + Show color picker + Mostra selettore colore + + + + Open side panel + Apri pannello laterale + + + + Esc + Esc + + + + Exit + Esci + + + + Quit Capture + Esci da Cattura + + + + Are you sure you want to quit capture? + Vuoi davvero uscire dall'acquisizione? + + + + Do not show this again + Non mostrare più questo messaggio + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot ha perso la messa a fuoco. Le scorciatoie da tastiera non funzioneranno finché non fai clic da qualche parte. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + Errore di configurazione risolto. Avvia di nuovo "flameshot gui" per applicarlo. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Seleziona un'area con il mouse o premi Esc per uscire. +Premi Invio per catturare lo schermo. +Premere il pulsante destro del mouse per visualizzare il selettore dei colori. +Usa la rotellina del mouse per modificare lo spessore del tuo strumento. +Premi la barra spaziatrice per aprire il pannello laterale. + + + + Tool Settings + Impostazioni Strumento + + + + CircleCountTool + + + Circle Counter + Contatore circolare + + + + Add an autoincrementing counter bubble + Aggiungi un contatore a bolla autoincrementante + + + + CircleTool + + + Circle + Cerchio + + + + Set the Circle as the paint tool + Imposta il cerchio come strumento di disegno + + + + ColorDialog + + + + Select Color + Seleziona Colore + + + + + Saturation + Saturazione + + + + + Hue + Tonalità + + + + + Hex + Esadecimale + + + + + Blue + Blu + + + + + Value + Valore + + + + + Green + Verde + + + + + Alpha + Alfa + + + + + Red + Rosso + + + + ColorGrabWidget + + + Accept color + Accetta colore + + + + Enter or Left Click + Enter o clic sinistro + + + + Precisely select color + Seleziona con precisione il colore + + + + Hold Left Click + Tieni premuto clic sinistro + + + + Toggle magnifier + Attiva/disattiva lente d'ingrandimento + + + + Space or Right Click + Spazio o clic destro + + + + Cancel + Cancella + + + + Esc + Esc + + + + ColorPickerEditor + + Select Preset: + Seleziona Preimpostazione: + + + Select preset using the spinbox + Seleziona il preset usando la casella di selezione + + + + Edit Preset: + Modifica Preset: + + + + Enter color to update preset + Immettere il colore per aggiornare il preset + + + + Update + Aggiorna + + + + Press button to update the selected preset + Premere il pulsante per aggiornare il preset selezionato + + + + Delete + Cancella + + + + Press button to delete the selected preset + Premere il pulsante per eliminare il preset selezionato + + + + Add Preset: + Aggiungi Preimpostazione: + + + + Enter color manually or select it using the color-wheel + Immettere il colore manualmente o selezionarlo utilizzando la ruota dei colori + + + + Add + Aggiungi + + + + Press button to add preset + Premere il pulsante per aggiungere il preset + + + + + Error + Errore + + + + Unable to add preset. Maximum limit reached. + Impossibile aggiungere il preset. Limite massimo raggiunto. + + + + Unable to remove preset. Minimum limit reached. + Impossibile rimuovere il preset. Limite minimo raggiunto. + + + + ConfigErrorDetails + + + Configuration errors + Errori di configurazione + + + + ConfigHandler + + + Unrecognized setting: '%1' + + Impostazione non riconosciuta: '%1' + + + + + Unrecognized shortcut name: '%1'. + + Nome del collegamento non riconosciuto: '%1'. + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + Conflitto collegamento: '%1' e '%2' hanno lo stesso collegamento: %3 + + + + + Bad value in '%1'. Expected: %2 + + Valore errato in '%1'. Previsto: %2 + + + + + You have successfully resolved the configuration error. + Hai risolto con successo l'errore di configurazione. + + + + The configuration contains an error. Open configuration to resolve. + La configurazione contiene un errore. Apri la configurazione per risolvere. + + + The configuration contains an error. Falling back to default. + La configurazione contiene un errore. Ritorno al default. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + Chiave di configurazione '%1' errata in ConfigHandler. Si prega di segnalare questo come un bug. + + + + ConfigResolver + + + Resolve configuration errors + Risolvere gli errori di configurazione + + + + <b>You must resolve all errors before continuing:</b> + <b>Devi risolvere tutti gli errori prima di continuare:</b> + + + + Reset + Ripristina + + + + Reset to the default value. + Ripristina il valore predefinito. + + + + Remove + Rimuovi + + + + Remove this setting. + Rimuovi questa impostazione. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + Alcune scorciatoie da tastiera presentano conflitti. +Ciò NON impedirà l'avvio di flameshot. +Si prega di risolverli manualmente nel file di configurazione. + + + + Resolve all + Risolvere tutto + + + + Resolve all listed errors. + Risolvere tutti gli errori elencati. + + + + Details + Dettagli + + + + ConfigWindow + + + Configuration + Configurazione + + + + Interface + Interfaccia + + + + Filename Editor + Editor nome file + + + + General + Generale + + + + Shortcuts + Scorciatoie + + + + Resolve + Risolvere + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>Il file di configurazione contiene errori. Risolvili prima di continuare.</b> + + + + Controller + + New version %1 is available + È disponibile la nuova versione %1 + + + You have the latest version + Hai l'ultima versione + + + Failed to get information about the latest version. + Impossibile ottenere informazioni sull'ultima versione. + + + Error + Errore + + + Unable to close active modal widgets + Impossibile chiudere i widget modali attivi + + + &Take Screenshot + &Acquisisci screenshot + + + &Open Launcher + &Apri Launcher + + + &Configuration + &Configurazione + + + &About + &Informazioni + + + Check for updates + Verifica la disponibilità di aggiornamenti + + + &Quit + &Esci + + + &Latest Uploads + &Ultimi caricamenti + + + URL copied to clipboard. + URL copiato negli appunti. + + + + CopyTool + + + Copy + Copia + + + + Copy selection to clipboard + Copia la selezione negli appunti + + + Copy the selection into the clipboard + Copia la selezione negli appunti + + + + DBusUtils + + Unable to connect via DBus + Impossibile connettersi tramite DBus + + + + ExitTool + + + Exit + Uscita + + + + Leave the capture screen + Esci dalla schermata di acquisizione + + + + FileNameEditor + + + Edit the name of your captures: + Modifica il nome delle tue acquisizioni: + + + + Edit: + Modifica: + + + + Preview: + Anteprima: + + + + Save + Salva + + + + Saves the pattern + Salva il modello + + + + Restore + Ripristina + + + Reset + Ripristina + + + + Restores the saved pattern + Ripristina il modello salvato + + + + Clear + Pulisci + + + + Deletes the name + Elimina il nome + + + + Flameshot + + + Error + Errore + + + + Unable to close active modal widgets + Impossibile chiudere i widget modali attivi + + + + URL copied to clipboard. + URL copiato negli appunti. + + + + FlameshotDaemon + + + New version %1 is available + È disponibile la nuova versione %1 + + + + You have the latest version + Hai l'ultima versione + + + + Failed to get information about the latest version. + Impossibile ottenere informazioni sull'ultima versione. + + + + Unable to connect via DBus + Impossibile connettersi tramite DBus + + + + GeneralConf + + + + Import + Importa + + + + + + + Error + Errore + + + + Unable to read file. + Impossibile leggere il file. + + + + + Unable to write file. + Impossibile scrivere il file. + + + + Save File + Salva il file + + + + Confirm Reset + Conferma il ripristino + + + + Are you sure you want to reset the configuration? + Sei sicuro/a di voler ripristinare la configurazione? + + + + Show help message + Mostra messaggio di aiuto + + + Show the help message at the beginning in the capture mode. + Mostra il messaggio di aiuto all'inizio nella modalità di acquisizione. + + + + Show the side panel button + Mostra il pulsante del pannello laterale + + + Show the side panel toggle button in the capture mode. + Mostra il pulsante di attivazione/disattivazione del pannello laterale nella modalità di acquisizione. + + + + Show desktop notifications + Mostra notifiche desktop + + + + Show tray icon + Mostra icona nella barra delle applicazioni + + + Show the systemtray icon + Mostra l'icona sulla barra delle applicazioni + + + + Confirmation required to delete screenshot from the latest uploads + Conferma richiesta per eliminare screenshot dagli ultimi caricamenti + + + + Configuration File + File di Configurazione + + + + Export + Esporta + + + + Reset + Ripristina + + + + Automatic check for updates + Controllo automatico degli aggiornamenti + + + + Allow multiple flameshot GUI instances simultaneously + Consenti più istanze della GUI di flameshot contemporaneamente + + + This allows you to take screenshots of flameshot itself for example. + Ciò ti consente di acquisire schermate di Flameshot stesso, ad esempio. + + + Automatically close daemon when it is not needed + Chiudi automaticamente il demone quando non è necessario + + + Launch at startup + Esegui all'avvio + + + Launch Flameshot + Esegui Flameshot + + + + Show welcome message on launch + Mostra il messaggio di benvenuto all'avvio + + + + Use large predefined color palette + Usa una grande tavolozza di colori predefinita + + + + Copy URL after upload + Copia l'URL dopo il caricamento + + + Copy URL and close window after upload + Copia l'URL e chiudi la finestra dopo il caricamento + + + + Save image after copy + Salva l'immagine dopo la copia + + + Save image file after copying it + Salva il file immagine dopo averlo copiato + + + + Show the help message at the beginning in the capture mode + Mostra il messaggio di aiuto all'inizio nella modalità di acquisizione + + + + Use last region for GUI mode + Utilizza l'ultima regione per la modalità GUI + + + + Use the last region as the default selection for the next screenshot in GUI mode + Utilizza l'ultima regione come selezione predefinita per lo screenshot successivo in modalità GUI + + + + Show the side panel toggle button in the capture mode + Mostra il pulsante di attivazione/disattivazione del pannello laterale nella modalità di acquisizione + + + + Enable desktop notifications + Abilita notifiche desktop + + + + Show abort notifications + Mostra notifiche di interruzione + + + + Enable abort notifications + Abilita notifiche di interruzione + + + + Show icon in the system tray + Mostra l'icona nella barra delle applicazioni + + + + Use grim to capture screenshots + Usa Grim per catturare screenshot + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + Grim è un'utilità esclusiva di Wayland per catturare schermate basata sul protocollo Screencopy. Generalmente è abilitata solo su window manager Wayland minimali come Sway, Hyprland, ecc. + + + + Ask for confirmation to delete screenshot from the latest uploads + Chiedi conferma per eliminare screenshot dagli ultimi caricamenti + + + + Check for updates automatically + Controlla automaticamente gli aggiornamenti + + + + This allows you to take screenshots of Flameshot itself for example + Ciò ti consente, ad esempio, di acquisire schermate di Flameshot stesso + + + Launch Flameshot daemon when computer is booted + Avvia il demone Flameshot all'avvio del computer + + + + Show the welcome message box in the middle of the screen while taking a screenshot + Mostra la finestra del messaggio di benvenuto al centro dello schermo mentre acquisisci uno screenshot + + + + Use a large predefined color palette + Usa un'ampia tavolozza di colori predefinita + + + + Copy on double click + Copia con doppio clic + + + Enable Copy on Double Click + Abilita copia su doppio clic + + + Copy URL and close window after uploading was successful + Copia l'URL e chiudi la finestra dopo che il caricamento è andato a buon fine + + + + Automatically unload from memory when it is not needed + Scarica automaticamente dalla memoria quando non è necessario + + + + Automatically close daemon (background process) when it is not needed + Chiudere automaticamente il demone (processo in background) quando non è necessario + + + + Launch in background at startup + Avvia in background all'avvio + + + + Launch Flameshot daemon (background process) when computer is booted + Avvia il demone di Flameshot (processo in background) all'avvio del computer + + + + Ask before quit capture + Chiedi prima di uscire dall'acquisizione + + + + Show the confirmation prompt before ESC quit + Mostra la richiesta di conferma prima di uscire da ESC + + + + Enable Copy to clipboard on Double Click + Abilita Copia negli appunti con doppio clic + + + + Copy URL after uploading was successful + Copia l'URL dopo che il caricamento è riuscito + + + + After copying the screenshot, save it to a file as well + Dopo aver copiato lo screenshot, salvalo anche su un file + + + + Save Path + Salva Percorso + + + + Change... + Cambia... + + + + Use fixed path for screenshots to save + Usa percorso fisso per salvare gli screenshot + + + + Preferred save file extension: + Estensione file di salvataggio preferita: + + + + Latest Uploads Max Size + Dimensione Massima Ultimi Caricamenti + + + + Imgur Application Client ID + Chiave API Imgur + + + + Undo limit + Annulla limite + + + + Use JPG format for clipboard (PNG default) + Usa il formato JPG per gli appunti (impostazione predefinita PNG) + + + + Use lossy JPG format for clipboard (lossless PNG default) + Utilizza il formato JPG con perdita di dati per gli appunti (il formato predefinito è PNG senza perdita di dati) + + + + Copy file path after save + Copia il percorso del file dopo il salvataggio + + + + Copy the file path to clipboard after the file is saved + Copia il percorso del file negli appunti dopo che il file è stato salvato + + + + Anti-aliasing image when zoom the pinned image + Anti-alias dell'immagine quando si esegue lo zoom dell'immagine bloccata + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + Dopo aver ingrandito l'immagine bloccata, l'immagine dovrebbe essere smussata o rimanere pixelata + + + + + Upload image without confirmation + Carica immagine senza conferma + + + + Choose a Folder + Scegli una Cartella + + + + Unable to write to directory. + Impossibile scrivere nella directory. + + + + Show magnifier + Mostra lente d'ingrandimento + + + + Enable a magnifier while selecting the screenshot area + Abilita una lente di ingrandimento durante la selezione dell'area dello screenshot + + + + Square shaped magnifier + Lente d'ingrandimento a forma quadrata + + + + Make the magnifier to be square-shaped + Rendi la lente d'ingrandimento di forma quadrata + + + + Milliseconds before geometry display hides; 0 means do not hide + Millisecondi prima che la visualizzazione della geometria venga nascosta; 0 significa non nascondere + + + + Set geometry display timeout (ms) + Imposta il timeout di visualizzazione della geometria (ms) + + + + Selection Geometry Display + Visualizzazione della geometria di selezione + + + + Display Location + Posizione di visualizzazione + + + + None + Nessuna + + + + Top Left + In alto a sinistra + + + + Top Right + In alto a destra + + + + Bottom Left + In basso a sinistra + + + + Bottom Right + In basso a destra + + + + Center + Centro + + + + Quality range of 0-100; Higher number is better quality and larger file size + Gamma di qualità da 0 a 100; un numero più alto indica una qualità migliore e una dimensione del file maggiore + + + + JPEG Quality + Qualità JPEG + + + + Reverse arrow + Freccia inversa + + + + Draw the arrow head first + Disegna prima la punta della freccia + + + + Insecure Pixelate + Pixellamento non sicuro + + + + Draw the pixelation effect in an insecure but more asethetic way. + Disegna l'effetto pixel in modo insicuro ma più estetico. + + + + HistoryWidget + + Latest Uploads + Ultimi Caricamenti + + + Screenshots history is empty + La cronologia delle schermate è vuota + + + Copy URL + Copia URL + + + URL copied to clipboard. + URL copiato negli appunti. + + + Open in browser + Apri nel browser + + + Confirm to delete + Conferma per eliminare + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Sei sicuro di voler eliminare un screenshot dagli ultimi caricamenti e dal server? + + + + ImgS3Uploader + + URL copied to clipboard. + URL copiato negli appunti. + + + Error + Errore + + + + ImgUploadDialog + + + Upload Confirmation + Conferma di caricamento + + + + Do you want to upload this capture? + Vuoi caricare questa acquisizione? + + + + + Upload without confirmation + Carica senza conferma + + + + ImgUploader + + Delete image + Elimina immagine + + + Unable to open the URL. + Impossibile aprire l'URL. + + + URL copied to clipboard. + URL copiato negli appunti. + + + Screenshot copied to clipboard. + Screenshot copiato negli appunti. + + + Copy URL + Copia URL + + + Open URL + Apri URL + + + Image to Clipboard. + Immagine negli Appunti. + + + + ImgUploaderBase + + + Upload image + Carica immagine + + + + Uploading Image + Caricamento Immagine + + + + Copy URL + Copia URL + + + + Open URL + Apri URL + + + + Delete image + Elimina immagine + + + + Image to Clipboard. + Immagine negli Appunti. + + + + Save image + Salva immagine + + + + Unable to open the URL. + Impossibile aprire l'URL. + + + + URL copied to clipboard. + URL copiato negli appunti. + + + + Screenshot copied to clipboard. + Screenshot copiato negli appunti. + + + + Unable to save the screenshot to disk. + Impossibile salvare lo screenshot su disco. + + + + Screenshot saved. + Screenshot salvato. + + + + ImgUploaderTool + + + Image Uploader + Caricatore di immagini + + + + Upload the selection + Carica la selezione + + + + ImgurUploader + + Upload to Imgur + Carica su Imgur + + + Uploading Image + Caricamento dell'immagine + + + Copy URL + Copia URL + + + Open URL + Apri URL + + + Delete image + Elimina immagine + + + Image to Clipboard. + Immagine negli Appunti. + + + + Unable to open the URL. + Impossibile aprire l'URL. + + + URL copied to clipboard. + URL copiato negli appunti. + + + Screenshot copied to clipboard. + Screenshot copiato negli appunti. + + + + ImgurUploaderTool + + Image Uploader + Uploader di immagini + + + Upload the selection to Imgur + Carica la selezione su Imgur + + + + InfoWindow + + + + About + Informazioni + + + + + Icon + Icona + + + + + License + Licenza + + + + + GPLv3+ + GPLv3+ + + + + + Version + Versione + + + + + Flameshot v + Flameshot v + + + + + OS Info + Info sul sistema operativo + + + + + Copy Info + Copia informazioni + + + <u><b>License</b></u> + <u><b>Licenza</b></u> + + + <u><b>Version</b></u> + <u><b>Versione</b></u> + + + + InvertTool + + + Invert + Inverti + + + + Set Inverter as the paint tool + Imposta l'Inverter come strumento di pittura + + + + LineTool + + + Line + Linea + + + + Set the Line as the paint tool + Imposta la Linea come strumento di disegno + + + + MarkerTool + + + Marker + Marcatore + + + + Set the Marker as the paint tool + Imposta il Pennarello come strumento di disegno + + + + MoveTool + + + Move + Sposta + + + + Move the selection area + Sposta l'area di selezione + + + + PencilTool + + + Pencil + Matita + + + + Set the Pencil as the paint tool + Imposta la matita come strumento di pittura + + + + PinTool + + + Pin Tool + Blocca Strumento + + + + Pin image on the desktop + Blocca immagine sul desktop + + + + PinWidget + + + Context menu + Context menu + + + + Copy to clipboard + Copia negli appunti + + + + Save to file + Salva su file + + + + Rotate Right + Ruota a destra + + + + Rotate Left + Ruota a sinistra + + + + Increase Opacity + Aumenta l'opacità + + + + Decrease Opacity + Diminuisci l'opacità + + + + Close + Chiudi + + + + PixelateTool + + + Pixelate + Pixellato + + + + Set Pixelate as the paint tool. + Imposta Pixelate come strumento di disegno. + + + Set Pixelate as the paint tool + Imposta Pixelate come strumento di disegno + + + + PrimaryInstanceWidget + + + Primary instance + Istanza primaria + + + + <b>Primary instance.</b> Messages received from secondaries: + <b>Istanza primaria.</b> Messaggi ricevuti dalle istanze secondarie: + + + + QHotkey + + Failed to register %1. Error: %2 + Impossibile registrare %1. Errore: %2 + + + Failed to unregister %1. Error: %2 + Impossibile annullare la registrazione di %1. Errore: %2 + + + + QObject + + + Options + Opzioni + + + Arguments + Argomenti + + + arguments + argomenti + + + + Subcommands + Sottocomandi + + + + subcommands + Sottocomandi + + + + Usage + Utilizzo + + + + options + opzioni + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Per impostazione predefinita, Flameshot viene eseguito in background e aggiunge un'icona nella barra per la configurazione. + + + + Unable to connect via DBus + Impossibile connettersi tramite DBus + + + + Powerful yet simple to use screenshot software. + Software di screenshot potente ma semplice da usare. + + + + See + Vedi + + + Capture the entire desktop. + Cattura l'intero desktop. + + + + Open the capture launcher. + Apri il programma di avvio per l'acquisizione. + + + + Start a manual capture in GUI mode. + Avvia un'acquisizione manuale in modalità GUI. + + + + Configure + Configura + + + Capture a single screen. + Cattura una singola schermata. + + + Path where the capture will be saved + Percorso in cui verrà salvata l'acquisizione + + + + Capture screenshot of all monitors at the same time. + Cattura screenshot di tutti i monitor contemporaneamente. + + + + Capture a screenshot of the specified monitor. + Cattura uno screenshot del monitor specificato. + + + + Existing directory or new file to save to + Directory esistente o nuovo file in cui salvare + + + + Save the capture to the clipboard + Salva la cattura negli appunti + + + + Pin the capture to the screen + Blocca l'acquisizione sullo schermo + + + + Upload screenshot + Upload screenshot + + + + Delay time in milliseconds + Tempo di ritardo in millisecondi + + + + Repeat screenshot with previously selected region + Ripeti lo screenshot con la regione precedentemente selezionata + + + + Screenshot region to select + Screenshot della regione da selezionare + + + + Set the filename pattern + Imposta il modello del nome del file + + + + Accept capture as soon as a selection is made + Accetta l'acquisizione non appena viene effettuata una selezione + + + + Enable or disable the trayicon + Abilita o disabilita l'icona della barra delle applicazioni + + + + Enable or disable run at startup + Abilita o disabilita l'esecuzione all'avvio + + + + Enable or disable the notifications + Abilitare o disabilitare le notifiche + + + + Check the configuration for errors + Controllare la configurazione per errori + + + + Show the help message in the capture mode + Mostra il messaggio di aiuto nella modalità di acquisizione + + + + Define the main UI color + Definisci il colore dell'interfaccia utente principale + + + + Define the contrast UI color + Definisci il colore dell'interfaccia utente del contrasto + + + + Print raw PNG capture + Stampa l'acquisizione raw PNG + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + Stampa la geometria della selezione nel formato WxH+X+Y. Non fa nulla se raw è specificato + + + + Define the screen to capture (starting from 0) + Definisci lo schermo da catturare (a partire da 0) + + + + Invalid delay, it must be a number greater than 0 + Ritardo non valido, deve essere un numero maggiore di 0 + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + Regione non valida, usa WxH+X+Y' o 'tutto' o 'schermo0/schermo1/...'. + + + + Invalid path, must be an existing directory or a new file in an existing directory + Percorso non valido, deve essere una directory esistente o un nuovo file in una directory esistente + + + Define the screen to capture + Definisci lo schermo da catturare + + + + default: screen containing the cursor + default: schermata contenente il cursore + + + + Screen number + Numero di schermo + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Colore non valido, questo flag supporta i seguenti formati: +- #RGB (ciascuno di R, G e B è una singola cifra esadecimale) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Colori denominati come 'blu' o 'rosso' +You may need to escape the '#' sign as in '\#FFF' + + + Invalid delay, it must be higher than 0 + Ritardo non valido, deve essere maggiore di 0 + + + + Invalid screen number, it must be non negative + Numero di schermo non valido, deve essere non negativo + + + Invalid path, it must be a real path in the system + Percorso non valido, deve essere un percorso reale nel sistema + + + + Invalid value, it must be defined as 'true' or 'false' + Valore non valido, deve essere definito come "vero" o "falso" + + + + Requested screen exceeds screen count + La schermata richiesta supera il conteggio delle schermate + + + + Full screen screenshot pinned to screen + Schermata a schermo intero bloccata sullo schermo + + + URL copied to clipboard. + URL copiato negli appunti. + + + + Error + Errore + + + + Unable to write in + Impossibile scrivere + + + + + Capture saved to clipboard. + Cattura salvata negli appunti. + + + Capture saved to clipboard + Cattura salvata negli appunti + + + + Error while saving to clipboard + Errore durante il salvataggio negli appunti + + + + + Capture saved as + Cattura salvata come + + + + + Error trying to save as + Errore durante il tentativo di salvare come + + + + Save screenshot + Salva screenshot + + + + Path copied to clipboard as + Percorso copiato negli appunti come + + + Saving canceled + Salvataggio annullato + + + Save canceled + Salvataggio annullato + + + Capture is saved and copied to the clipboard as + L'acquisizione viene salvata e copiata negli appunti come + + + + Save Error + Salva errore + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Ciao sono qui! Fare clic sull'icona nella barra delle applicazioni per acquisire uno screenshot o fare clic con il pulsante destro per visualizzare più opzioni. + + + Toggle side panel + Attiva/disattiva il pannello laterale + + + Resize selection left 1px + Ridimensiona la selezione a sinistra di 1px + + + Resize selection right 1px + Ridimensiona la selezione a destra di 1px + + + Resize selection up 1px + Ridimensiona la selezione sopra di 1px + + + Resize selection down 1px + Ridimensiona la selezione giù di 1 px + + + Select entire screen + Seleziona tutto lo schermo + + + Move selection left 1px + Sposta la selezione a sinistra di 1 px + + + Move selection right 1px + Sposta la selezione a destra di 1 px + + + Move selection up 1px + Sposta la selezione sopra di 1 px + + + Move selection down 1px + Sposta la selezione giù di 1 px + + + Commit text in text area + Conferma testo nell'area testo + + + Delete current tool + Elimina lo strumento corrente + + + + Quit capture + Esci dalla cattura + + + + Screenshot history + Cronologia degli screenshot + + + + Capture screen + Cattura schermo + + + + Show color picker + Mostra selettore colore + + + + Change the tool's size + Modifica le dimensioni dello strumento + + + Change the tool's thickness + Cambia lo spessore dello strumento + + + + RectangleTool + + + Rectangle + Rettangolo + + + + Set the Rectangle as the paint tool + Imposta il rettangolo come strumento di disegno + + + + RedoTool + + + Redo + Rifai + + + + Redo the next modification + Rifai la modifica successiva + + + + SaveTool + + + Save + Salva + + + + Save screenshot to a file + Salva lo screenshot in un file + + + Save the capture + Salva la cattura + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Impossibile rilevare l'ambiente desktop (GNOME? KDE? Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + L'adattatore universale per la cattura dello schermo Wayland richiede Grim come componente di cattura dello schermo di Wayland. Se il componente di cattura dello schermo è mancante, installalo! + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + Se l'impostazione useGrimAdapter non è abilitata, verrà utilizzato il protocollo dbus. Si prega di notare che l'utilizzo del protocollo dbus in Wayland non è raccomandato. Si consiglia di abilitare l'impostazione useGrimAdapter in flameshot.ini per attivare l'adattatore generico per screenshot Wayland basato su Grim + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + Il componente screenshot di grim è implementato in base a wlroots, non può essere utilizzato in GNOME o ambienti desktop simili + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + Impossibile rilevare l'ambiente desktop (GNOME? KDE? Qile? Sway? ...) + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + Suggerimento: prova a impostare la variabile di ambiente XDG_CURRENT_DESKTOP. + + + + Unable to capture screen + Impossibile acquisire lo schermo + + + + SecondaryInstanceWidget + + + Secondary instance + Istanza secondaria + + + + <b>Secondary instance.</b> Send message to primary: + <b>Istanza secondaria.</b> Invia messaggio a primaria: + + + + Type something here... + Scrivi qualcosa qui... + + + + &Send + &Invia + + + + Error sending message + Errore durante l'invio del messaggio + + + + The message '%1' could not be sent to the primary. + Impossibile inviare il messaggio '%1' al server primario. + + + + SelectionTool + + + Rectangular Selection + Selezione rettangolare + + + + Set Selection as the paint tool + Imposta Selezione come strumento di disegno + + + + SetShortcutDialog + + + Set Shortcut + Imposta Scorciatoia + + + + Enter new shortcut to change + Inserisci una nuova scorciatoia da cambiare + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Premere Esc per annullare o ⌘+Backspace per disabilitare la scorciatoia da tastiera. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Premi Esc per annullare o Backspace per disabilitare la scorciatoia da tastiera. + + + + + Flameshot must be restarted for changes to take effect. + Flameshot deve essere riavviato per rendere effettive le modifiche. + + + + ShortcutsWidget + + + Hot Keys + Tasti di scelta rapida + + + + Available shortcuts in the screen capture mode. + Scorciatoie disponibili nella modalità di cattura dello schermo. + + + + Description + Descrizione + + + + Key + Tasto + + + + Left Double-click + Doppio clic sinistro + + + + Toggle side panel + Attiva il pannello laterale + + + + Grab a color from the screen + Prendi un colore dallo schermo + + + + Resize selection left 1px + Ridimensiona la selezione sinistra di 1px + + + + Resize selection right 1px + Ridimensiona la selezione destra di 1px + + + + Resize selection up 1px + Ridimensiona la selezione sopra di 1px + + + + Resize selection down 1px + Ridimensiona la selezione giù di 1 px + + + + Symmetrically decrease width by 2px + Ridurre simmetricamente la larghezza di 2px + + + + Symmetrically increase width by 2px + Aumentare simmetricamente la larghezza di 2px + + + + Symmetrically increase height by 2px + Aumentare simmetricamente l'altezza di 2px + + + + Symmetrically decrease height by 2px + Ridurre simmetricamente l'altezza di 2px + + + + Select entire screen + Seleziona tutto lo schermo + + + + Move selection left 1px + Sposta la selezione a sinistra di 1 px + + + + Move selection right 1px + Sposta la selezione a destra di 1 px + + + + Move selection up 1px + Sposta la selezione sopra di 1 px + + + + Move selection down 1px + Sposta la selezione giù di 1 px + + + + Commit text in text area + Conferma testo nell'area testo + + + + Delete selected drawn object + Elimina l'oggetto disegnato selezionato + + + + Cancel current selection + Annulla la selezione corrente + + + Delete current tool + Elimina lo strumento corrente + + + + Capture screen + Cattura schermo + + + + Screenshot history + Cronologia degli screenshot + + + + SidePanelWidget + + Active thickness: + Spessore attivo: + + + Active color: + Colore attivo: + + + Press ESC to cancel + Premere ESC per annullare + + + + Active tool size: + Dimensione strumento attivo: + + + + Active Color: + Active Color: + + + + Grab Color + Prendi il colore + + + + Display grid + Griglia di visualizzazione + + + + SizeDecreaseTool + + + Decrease Tool Size + Diminuisci le Dimensioni dello Strumento + + + + Decrease the size of the other tools + Diminuisci le dimensioni degli altri strumenti + + + + SizeIncreaseTool + + + Increase Tool Size + Aumenta la dimensione dello strumento + + + + Increase the size of the other tools + Aumenta le dimensioni degli altri strumenti + + + + SizeIndicatorTool + + Selection Size Indicator + Indicatore della dimensione della selezione + + + Show X and Y dimensions of the selection + Mostra le dimensioni X e Y della selezione + + + Show the dimensions of the selection (X Y) + Mostra le dimensioni della selezione (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + Secolo (00-99) + + + + Year (00-99) + Anno (00-99) + + + + Year (2000) + Anno (2000) + + + + Month Name (jan) + Nome mese (gennaio) + + + + Month Name (january) + Nome Mese (gennaio) + + + + Month (01-12) + Mese (01-12) + + + + Week Day (1-7) + Giorno della settimana (1-7) + + + + Week (01-53) + Settimana (01-53) + + + + Day Name (mon) + Nome Giorno (lunedì) + + + + Day Name (monday) + Nome Giorno (lunedì) + + + + Day (01-31) + Giorno (01-31) + + + + Day of Month (1-31) + Giorno del Mese (1-31) + + + + Day (001-366) + Giorno (001-366) + + + + Time (%H-%M-%S) + Tempo (%H-%M-%S) + + + + Time (%H-%M) + Tempo (%H-%M) + + + + Hour (00-23) + Ora (00-23) + + + + Hour (01-12) + Ora (01-12) + + + + Minute (00-59) + Minuto (00-59) + + + + Second (00-59) + Secondo (00-59) + + + + Full Date (%m/%d/%y) + Data completa (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + Data completa (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + Data completa (%g-%m-%A) + + + + SystemNotification + + + Flameshot Info + Informazioni su Flameshot + + + + TextConfig + + + StrikeOut + Cancella + + + + Underline + Sottolineare + + + + Bold + Grassetto + + + + Italic + Corsivo + + + + Left Align + Allinea a sinistra + + + + Center Align + Allinea al centro + + + + Right Align + Allinea a destra + + + + TextTool + + + Text + Testo + + + + Add text to your capture + Aggiungi testo alla tua cattura + + + + TrayIcon + + + &Take Screenshot + &Acquisisci screenshot + + + + &Open Launcher + &Apri Launcher + + + + &Configuration + &Configurazione + + + + &About + &Informazioni + + + + Check for updates + Verifica la disponibilità di aggiornamenti + + + + New version %1 is available + È disponibile la nuova versione %1 + + + + &Quit + &Esci + + + + &Latest Uploads + &Ultimi caricamenti + + + + &Open Save Path + &Apri percorso di salvataggio + + + + UIcolorEditor + + UI Color Editor + Editor dei colori dell'interfaccia utente + + + + Change the color moving the selectors and see the changes in the preview buttons. + Cambia il colore spostando i selettori e guarda le modifiche nei pulsanti di anteprima. + + + + Select a Button to modify it + Seleziona un pulsante per modificarlo + + + + Main Color + Colore Principale + + + + Click on this button to set the edition mode of the main color. + Fare clic su questo pulsante per impostare la modalità di modifica del colore principale. + + + + Contrast Color + Colore di Contrasto + + + + Click on this button to set the edition mode of the contrast color. + Fare clic su questo pulsante per impostare la modalità di modifica del colore di contrasto. + + + + UndoTool + + + Undo + Annulla + + + + Undo the last modification + Annulla l'ultima modifica + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + È disponibile la nuova versione di Flameshot %1 + + + + Ignore + Ignora + + + + Later + Dopo + + + + Update + Aggiorna + + + + UploadHistory + + + Upload History + Carica cronologia + + + + Screenshots history is empty + La cronologia degli screenshot è vuota + + + + UploadLineItem + + + Form + Modulo + + + + TextLabel + Etichetta di testo + + + + Copy URL + Copia URL + + + + Open In Browser + Apri nel browser + + + + Confirm to delete + Conferma per eliminare + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Sei sicuro di voler eliminare uno screenshot dagli ultimi caricamenti e dal server? + + + + UtilityPanel + + + Close + Chiudi + + + + <Empty> + <Vuoto> + + + + VisualsEditor + + + Opacity of area outside selection: + Opacità dell'area al di fuori della selezione: + + + + UI Color Editor + Editor del colore dell'interfaccia + + + + Colorpicker Editor + Editor per la selezione dei colori + + + + Button Selection + Selezione dei Pulsanti + + + + Select All + Seleziona Tutto + + + + color_widgets::ColorDialog + + + Pick + Scegli + + + + color_widgets::ColorPalette + + + Unnamed + Senza nome + + + + color_widgets::ColorPaletteModel + + + Unnamed + Senza nome + + + + %1 (%2 colors) + %1 (%2 colori) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + Apri una nuova tavolozza da file + + + + + Create a new palette + Crea una nuova tavolozza + + + + + Duplicate the current palette + Duplica la tavolozza corrente + + + + + Delete the current palette + Elimina la tavolozza corrente + + + + + Revert changes to the current palette + Ripristina le modifiche alla tavolozza corrente + + + + + Save changes to the current palette + Salva le modifiche alla tavolozza corrente + + + + + Add a color to the palette + Aggiungi un colore alla tavolozza + + + + + Remove the selected color from the palette + Rimuovere il colore selezionato dalla tavolozza + + + + + New Palette + Nuova tavolozza + + + + + Name + Name + + + + GIMP Palettes (*.gpl) + Tavolozze GIMP (*.gpl) + + + + Palette Image (%1) + Immagine tavolozza (%1) + + + + All Files (*) + Tutti i files (*) + + + + + Open Palette + Apri tavolozza + + + + Failed to load the palette file +%1 + Impossibile caricare il file della tavolozza +%1 + + + + color_widgets::GradientEditor + + + Add Color + Add Color + + + + Remove Color + Rimuovi colore + + + + Edit Color... + Modifica colore... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 colori) + + + + color_widgets::Swatch + + + Clear Color + Colore chiaro + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_ja.ts b/data/translations/Internationalization_ja.ts new file mode 100644 index 0000000..f43153b --- /dev/null +++ b/data/translations/Internationalization_ja.ts @@ -0,0 +1,3168 @@ + + + + + AbstractWidgetList + + + Add New + Add New + + + + Move Up + Move Up + + + + Move Down + Move Down + + + + Remove + Remove + + + + AcceptTool + + + Accept + Accept + + + + Accept the capture + Accept the capture + + + + AppLauncher + + + App Launcher + アプリケーションランチャー + + + + Choose an app to open the capture + キャプチャーを開くアプリケーションを選択する + + + + AppLauncherWidget + + + Open With + 次で開く + + + + Launch in terminal + 端末内で起動する + + + + Keep open after selection + 選択後も開いたままにする + + + + + Error + エラー + + + + Unable to launch in terminal. + 端末内で起動できません。 + + + + Unable to write in + 書き込めません: + + + + ArrowTool + + + Arrow + 矢印 + + + + Set the Arrow as the paint tool + ペイントツールとして「矢印」をセットする + + + + BlurTool + + Blur + ぼかし + + + Set Blur as the paint tool + ペイントツールとして「ぼかし」をセットする + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>キャプチャーモード</b> + + + + Rectangular Region + 四角形選択 + + + + Full Screen (Current Display) + 全画面(このディスプレイ) + + + + Full Screen (All Monitors) + 全画面(すべてのディスプレイ) + + + + No Delay + ディレイなし + + + + second + 秒 + + + + + + seconds + 秒 + + + + + Take new screenshot + 新しいキャプチャー + + + + + Area: + 選択タイプ: + + + + + Capture Launcher + Capture Launcher + + + + + TextLabel + TextLabel + + + + + Capture Mode + Capture Mode + + + + + Delay: + ディレイ: + + + + + WxH+x+y + WxH+x+y + + + + CaptureWidget + + + Unable to capture screen + 画面をキャプチャーできません + + + + Mouse + Mouse + + + + Select screenshot area + Select screenshot area + + + + Mouse Wheel + マウスホイール + + + + Change tool size + Change tool size + + + + Right Click + 右クリック + + + + Show color picker + カラーピッカーを表示する + + + + Open side panel + Open side panel + + + + Esc + Esc + + + + Exit + 終了 + + + + Quit Capture + + + + + Are you sure you want to quit capture? + + + + + Do not show this again + + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + Configuration error resolved. Launch `flameshot gui` again to apply it. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + マウスで領域を選択、Esc を押すと終了。 +Enter を押すと画面をキャプチャー。 +マウスの右ボタンでカラーピッカーを表示。 +マウスホイールでツールの太さ等を変更。 +スペースを押すとサイドパネルを開く。 + + + + Tool Settings + ツール設定 + + + + CircleCountTool + + + Circle Counter + 丸カウンター + + + + Add an autoincrementing counter bubble + 自動的に増加する丸カウンターを追加する + + + + CircleTool + + + Circle + 円形 + + + + Set the Circle as the paint tool + ペイントツールとして「円形」をセットする + + + + ColorDialog + + + + Select Color + Select Color + + + + + Saturation + Saturation + + + + + Hue + Hue + + + + + Hex + Hex + + + + + Blue + Blue + + + + + Value + Value + + + + + Green + Green + + + + + Alpha + Alpha + + + + + Red + Red + + + + ColorGrabWidget + + + Accept color + Accept color + + + + Enter or Left Click + Enter or Left Click + + + + Precisely select color + Precisely select color + + + + Hold Left Click + Hold Left Click + + + + Toggle magnifier + Toggle magnifier + + + + Space or Right Click + Space or Right Click + + + + Cancel + Cancel + + + + Esc + Esc + + + + ColorPickerEditor + + + Edit Preset: + Edit Preset: + + + + Enter color to update preset + Enter color to update preset + + + + Update + Update + + + + Press button to update the selected preset + Press button to update the selected preset + + + + Delete + Delete + + + + Press button to delete the selected preset + Press button to delete the selected preset + + + + Add Preset: + Add Preset: + + + + Enter color manually or select it using the color-wheel + Enter color manually or select it using the color-wheel + + + + Add + Add + + + + Press button to add preset + Press button to add preset + + + + + Error + エラー + + + + Unable to add preset. Maximum limit reached. + Unable to add preset. Maximum limit reached. + + + + Unable to remove preset. Minimum limit reached. + Unable to remove preset. Minimum limit reached. + + + + ConfigErrorDetails + + + Configuration errors + Configuration errors + + + + ConfigHandler + + + Unrecognized setting: '%1' + + Unrecognized setting: '%1' + + + + + Unrecognized shortcut name: '%1'. + + Unrecognized shortcut name: '%1'. + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + + + + Bad value in '%1'. Expected: %2 + + Bad value in '%1'. Expected: %2 + + + + + You have successfully resolved the configuration error. + You have successfully resolved the configuration error. + + + + The configuration contains an error. Open configuration to resolve. + The configuration contains an error. Open configuration to resolve. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + Bad config key '%1' in ConfigHandler. Please report this as a bug. + + + + ConfigResolver + + + Resolve configuration errors + Resolve configuration errors + + + + <b>You must resolve all errors before continuing:</b> + <b>You must resolve all errors before continuing:</b> + + + + Reset + リセット + + + + Reset to the default value. + Reset to the default value. + + + + Remove + Remove + + + + Remove this setting. + Remove this setting. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + + + + Resolve all + Resolve all + + + + Resolve all listed errors. + Resolve all listed errors. + + + + Details + Details + + + + ConfigWindow + + + Configuration + 設定 + + + + Interface + インターフェース + + + + Filename Editor + ファイル名エディター + + + + General + 全般 + + + + Shortcuts + ショートカット + + + + Resolve + Resolve + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>Configuration file has errors. Resolve them before continuing.</b> + + + + Controller + + New version %1 is available + 新しいバージョン%1が公開されました + + + You have the latest version + 最新バージョンです + + + Failed to get information about the latest version. + 最新バージョン情報を取得に失敗しました。 + + + Error + エラー + + + Unable to close active modal widgets + アクティブなモーダルを閉じることができません + + + &Take Screenshot + スクリーンショットを撮る(&T) + + + &Open Launcher + ランチャーを開く(&O) + + + &Configuration + 設定(&C) + + + &About + ついて(&A) + + + Check for updates + 更新をチェックする + + + &Latest Uploads + 最新アップロード(&L) + + + &Information + 情報(&I) + + + &Quit + 終了(&Q) + + + + CopyTool + + + Copy + コピー + + + + Copy selection to clipboard + Copy selection to clipboard + + + Copy the selection into the clipboard + 選択範囲をクリップボードにコピーする + + + + DBusUtils + + Unable to connect via DBus + DBus に接続できません + + + + ExitTool + + + Exit + 終了 + + + + Leave the capture screen + 画面キャプチャーを終了する + + + + FileNameEditor + + + Edit the name of your captures: + キャプチャー名の編集: + + + + Edit: + 編集: + + + + Preview: + プレビュー: + + + + Save + 保存 + + + + Saves the pattern + パターンを保存する + + + + Restore + Restore + + + Reset + リセット + + + + Restores the saved pattern + 保存されたパターンに戻す + + + + Clear + 消去 + + + + Deletes the name + 名前を削除する + + + + Flameshot + + + Error + エラー + + + + Unable to close active modal widgets + アクティブなモーダルを閉じることができません + + + + URL copied to clipboard. + URL copied to clipboard. + + + + FlameshotDaemon + + + New version %1 is available + 新しいバージョン%1が公開されました + + + + You have the latest version + 最新バージョンです + + + + Failed to get information about the latest version. + 最新バージョン情報を取得に失敗しました。 + + + + Unable to connect via DBus + DBus に接続できません + + + + GeneneralConf + + Show help message + ヘルプメッセージを表示する + + + Show the help message at the beginning in the capture mode. + キャプチャーモード開始時にヘルプメッセージを表示する。 + + + Show desktop notifications + デスクトップの通知を表示する + + + Show tray icon + トレイアイコンを表示する + + + Show the systemtray icon + システムトレイアイコンを表示する + + + Import + インポート + + + Error + エラー + + + Unable to read file. + ファイルを読み込めません。 + + + Unable to write file. + ファイルに書き込めません。 + + + Save File + ファイルを保存 + + + Confirm Reset + リセットの確認 + + + Are you sure you want to reset the configuration? + 設定をリセットしてもよろしいですか? + + + Configuration File + 設定ファイル + + + Export + エクスポート + + + Reset + リセット + + + Launch at startup + スタートアップ時に起動する + + + Launch Flameshot + Flameshot を起動する + + + + GeneralConf + + + + Import + インポート + + + + + + + Error + エラー + + + + Unable to read file. + ファイルを読み込みに失敗しました。 + + + + + Unable to write file. + ファイルを書き込みに失敗しました。 + + + + Save File + ファイルを保存する + + + + Confirm Reset + よろしい + + + + Are you sure you want to reset the configuration? + 設定をリセットしてよろしいですか? + + + + Show help message + ヘルプメッセージを表示する + + + Show the help message at the beginning in the capture mode. + キャプチャーモード開始時にヘルプメッセージを表示する。 + + + + Show the side panel button + サイドパネルのボタンを表示する + + + Show the side panel toggle button in the capture mode. + キャプチャーモードでサイドパネルのトグルボタンを表示する。 + + + + Show desktop notifications + デスクトップ通知を表示する + + + + Show tray icon + トレイアイコンを表示する + + + Show the systemtray icon + システムトレイにアプリアイコンを表示する + + + + Confirmation required to delete screenshot from the latest uploads + 最新アップロードからのキャプチャーを削除する前に確認が必要 + + + + Configuration File + 設定ファイル + + + + Export + エクスポート + + + + Reset + リセット + + + + Automatic check for updates + 自動的に更新を検索する + + + + Allow multiple flameshot GUI instances simultaneously + Allow multiple flameshot GUI instances simultaneously + + + Automatically close daemon when it is not needed + Automatically close daemon when it is not needed + + + Launch at startup + システム起動時に起動する + + + Launch Flameshot + Flameshotを起動する + + + + Show welcome message on launch + 起動時にようこそメッセージを表示する + + + + Use large predefined color palette + Use large predefined color palette + + + + Copy URL after upload + アップロードあとでURLをコピーする + + + Copy URL and close window after upload + アップロードあとでURLをコピーしてウィンドウを閉じる + + + + Save image after copy + コピーあとで画像を保存する + + + Save image file after copying it + コピーあとで、画像ファイルを保存する + + + + Show the help message at the beginning in the capture mode + Show the help message at the beginning in the capture mode + + + + Use last region for GUI mode + Use last region for GUI mode + + + + Use the last region as the default selection for the next screenshot in GUI mode + Use the last region as the default selection for the next screenshot in GUI mode + + + + Show the side panel toggle button in the capture mode + Show the side panel toggle button in the capture mode + + + + Enable desktop notifications + Enable desktop notifications + + + + Show abort notifications + + + + + Enable abort notifications + + + + + Show icon in the system tray + Show icon in the system tray + + + + Use grim to capture screenshots + + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + + + + + Ask for confirmation to delete screenshot from the latest uploads + Ask for confirmation to delete screenshot from the latest uploads + + + + Check for updates automatically + Check for updates automatically + + + + This allows you to take screenshots of Flameshot itself for example + This allows you to take screenshots of Flameshot itself for example + + + Launch Flameshot daemon when computer is booted + Launch Flameshot daemon when computer is booted + + + + Show the welcome message box in the middle of the screen while taking a screenshot + Show the welcome message box in the middle of the screen while taking a screenshot + + + + Use a large predefined color palette + Use a large predefined color palette + + + + Copy on double click + Copy on double click + + + Enable Copy on Double Click + Enable Copy on Double Click + + + Copy URL and close window after uploading was successful + Copy URL and close window after uploading was successful + + + + Automatically unload from memory when it is not needed + + + + + Automatically close daemon (background process) when it is not needed + + + + + Launch in background at startup + + + + + Launch Flameshot daemon (background process) when computer is booted + + + + + Ask before quit capture + + + + + Show the confirmation prompt before ESC quit + + + + + Enable Copy to clipboard on Double Click + + + + + Copy URL after uploading was successful + + + + + After copying the screenshot, save it to a file as well + After copying the screenshot, save it to a file as well + + + + Save Path + パスを保存する + + + + Change... + 変更… + + + + Use fixed path for screenshots to save + 一定なパスにキャプチャーを保存する + + + + Preferred save file extension: + Preferred save file extension: + + + + Latest Uploads Max Size + Latest Uploads Max Size + + + + Imgur Application Client ID + Imgur Application Client ID + + + + Undo limit + Undo limit + + + + Use JPG format for clipboard (PNG default) + JPEGフォーマットでクリップボードにコピーする(PNG規定) + + + + Use lossy JPG format for clipboard (lossless PNG default) + + + + + Copy file path after save + 保存するあとでファイルパスをコピーする + + + + Copy the file path to clipboard after the file is saved + Copy the file path to clipboard after the file is saved + + + + Anti-aliasing image when zoom the pinned image + Anti-aliasing image when zoom the pinned image + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + After zooming the pinned image, should the image get smoothened or stay pixelated + + + + + Upload image without confirmation + Upload image without confirmation + + + + Choose a Folder + フォルダーを選択 + + + + Unable to write to directory. + フォルダーで書き込みに失敗しました。 + + + + Show magnifier + Show magnifier + + + + Enable a magnifier while selecting the screenshot area + Enable a magnifier while selecting the screenshot area + + + + Square shaped magnifier + Square shaped magnifier + + + + Make the magnifier to be square-shaped + Make the magnifier to be square-shaped + + + + Milliseconds before geometry display hides; 0 means do not hide + + + + + Set geometry display timeout (ms) + + + + + Selection Geometry Display + + + + + Display Location + + + + + None + + + + + Top Left + + + + + Top Right + + + + + Bottom Left + + + + + Bottom Right + + + + + Center + + + + + Quality range of 0-100; Higher number is better quality and larger file size + + + + + JPEG Quality + + + + + Reverse arrow + + + + + Draw the arrow head first + + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + 最新のアップロード + + + Screenshots history is empty + キャプチャー歴史がない + + + Copy URL + URL をコピーする + + + URL copied to clipboard. + URL がクリップボードにコピーされました。 + + + Open in browser + ブラウザーで開く + + + Confirm to delete + よろしい + + + Are you sure you want to delete a screenshot from the latest uploads and server? + サーバーとローカルからのキャプチャーを削除してよろしいですか? + + + + ImgS3Uploader + + Uploading Image + 画像をアップロード中 + + + URL copied to clipboard. + URL をクリップボードにコピーしました。 + + + Error + エラー + + + + ImgUploadDialog + + + Upload Confirmation + Upload Confirmation + + + + Do you want to upload this capture? + Do you want to upload this capture? + + + + + Upload without confirmation + Upload without confirmation + + + + ImgUploader + + Uploading Image + 画像をアップロード中 + + + Unable to open the URL. + URL を開けません。 + + + URL copied to clipboard. + URL をクリップボードにコピーしました。 + + + Screenshot copied to clipboard. + スクリーンショットをクリップボードにコピーしました。 + + + Copy URL + URL をコピー + + + Open URL + URL を開く + + + Delete image + 画像を削除 + + + Image to Clipboard. + 画像をクリップボードへ。 + + + + ImgUploaderBase + + + Upload image + Upload image + + + + Uploading Image + 画像をアップロード中 + + + + Copy URL + Copy URL + + + + Open URL + URL を開く + + + + Delete image + 画像を削除 + + + + Image to Clipboard. + 画像をクリップボードへ。 + + + + Save image + Save image + + + + Unable to open the URL. + URL を開けません。 + + + + URL copied to clipboard. + URL copied to clipboard. + + + + Screenshot copied to clipboard. + スクリーンショットをクリップボードにコピーしました。 + + + + Unable to save the screenshot to disk. + Unable to save the screenshot to disk. + + + + Screenshot saved. + Screenshot saved. + + + + ImgUploaderTool + + + Image Uploader + 画像アップローダー + + + + Upload the selection + Upload the selection + + + + ImgurUploader + + Upload to Imgur + Imgur にアップロード + + + Uploading Image + 画像をアップロード中 + + + Copy URL + URL をコピー + + + Open URL + URL を開く + + + Delete image + 画像を削除 + + + Image to Clipboard. + 画像をクリップボードへ。 + + + + Unable to open the URL. + URL を開けません。 + + + URL copied to clipboard. + URL をクリップボードにコピーしました。 + + + Screenshot copied to clipboard. + スクリーンショットをクリップボードにコピーしました。 + + + + ImgurUploaderTool + + Image Uploader + 画像アップローダー + + + Upload the selection to Imgur + Imgur に選択範囲をアップロードする + + + + InfoWindow + + + + About + このアプリケーションについて + + + + + Icon + Icon + + + + + License + License + + + + + GPLv3+ + GPLv3+ + + + + + Version + Version + + + + + Flameshot v + Flameshot v + + + + + OS Info + OS Info + + + + + Copy Info + Copy Info + + + Right Click + 右クリック + + + Mouse Wheel + マウスホイール + + + Move selection 1px + 選択範囲を 1px 動かす + + + Resize selection 1px + 選択範囲を 1px リサイズする + + + Quit capture + キャプチャーを終了する + + + Copy to clipboard + クリップボードにコピーする + + + Save selection as a file + 選択範囲をファイルに保存する + + + Undo the last modification + 最後の変更を元に戻す + + + Show color picker + カラーピッカーを表示する + + + Change the tool's thickness + ツールの値 (太さや濃さ) を変更する + + + Key + キー + + + Description + 説明 + + + <u><b>License</b></u> + <u><b>ライセンス</b></u> + + + <u><b>Version</b></u> + <u><b>バージョン</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>ショートカット</b></u> + + + Available shortcuts in the screen capture mode. + スクリーンキャプチャーモードで利用可能なショートカット。 + + + + InvertTool + + + Invert + Invert + + + + Set Inverter as the paint tool + Set Inverter as the paint tool + + + + LineTool + + + Line + 直線 + + + + Set the Line as the paint tool + ペイントツールとして「直線」をセットする + + + + MarkerTool + + + Marker + マーカー + + + + Set the Marker as the paint tool + ペイントツールとして「マーカー」をセットする + + + + MoveTool + + + Move + 移動 + + + + Move the selection area + 選択範囲を移動する + + + + PencilTool + + + Pencil + 鉛筆 + + + + Set the Pencil as the paint tool + ペイントツールとして「鉛筆」をセットする + + + + PinTool + + + Pin Tool + 固定ツール + + + + Pin image on the desktop + 選択範囲をデスクトップ上に配置する + + + + PinWidget + + + Context menu + Context menu + + + + Copy to clipboard + クリップボードにコピーする + + + + Save to file + Save to file + + + + Rotate Right + + + + + Rotate Left + + + + + Increase Opacity + + + + + Decrease Opacity + + + + + Close + Close + + + + PixelateTool + + + Pixelate + ピクセル化する + + + + Set Pixelate as the paint tool. + + + + Set Pixelate as the paint tool + ピクセル化がペイントツールとして設定する + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QHotkey + + Failed to register %1. Error: %2 + ショートカット%1を設定に失敗しました。エラー%2 + + + Failed to unregister %1. Error: %2 + ショートカット%1を削除に失敗しました。エラー%2 + + + + QObject + + + Save Error + 保存エラー + + + + + Capture saved as + キャプチャーを保存しました: + + + + + Capture saved to clipboard. + キャプチャーがクリップボードにコピーされました。 + + + Capture saved to clipboard + キャプチャーをクリップボードに保存しました + + + + Error while saving to clipboard + コピーに失敗しました + + + + + Error trying to save as + 保存時にエラーが発生しました: + + + + Save screenshot + キャプチャーを保存する + + + + Path copied to clipboard as + Path copied to clipboard as + + + Saving canceled + Saving canceled + + + Save canceled + Save canceled + + + Capture is saved and copied to the clipboard as + キャプチャーがコピーされて として保存されました + + + + Unable to connect via DBus + DBus に接続できません + + + + Powerful yet simple to use screenshot software. + Powerful yet simple to use screenshot software. + + + + See + 見る + + + Capture the entire desktop. + デスクトップをキャプチャー。 + + + + Open the capture launcher. + キャプチャーランチャーを開く。 + + + + Start a manual capture in GUI mode. + 手動的にGUIキャプチャーを開始する。 + + + + Configure + 設定 + + + Capture a single screen. + 単一のディスプレイをキャプチャー。 + + + Path where the capture will be saved + キャプチャーの保存パス + + + + Capture screenshot of all monitors at the same time. + + + + + Capture a screenshot of the specified monitor. + + + + + Existing directory or new file to save to + Existing directory or new file to save to + + + + Save the capture to the clipboard + キャプチャーがクリップボードにコピーする + + + + Pin the capture to the screen + Pin the capture to the screen + + + + Upload screenshot + Upload screenshot + + + + Delay time in milliseconds + ミリ秒でディレイ時間 + + + + Repeat screenshot with previously selected region + Repeat screenshot with previously selected region + + + + Screenshot region to select + Screenshot region to select + + + + Set the filename pattern + ファイル名のパターンを設定する + + + + Accept capture as soon as a selection is made + Accept capture as soon as a selection is made + + + + Enable or disable the trayicon + トレイアイコンを無効・有効 + + + + Enable or disable run at startup + スタートアップに起動を無効・有効 + + + + Enable or disable the notifications + + + + + Check the configuration for errors + Check the configuration for errors + + + + Show the help message in the capture mode + キャプチャーでヘルプメッセージを表示 + + + + Define the main UI color + マインのUI色を設定する + + + + Define the contrast UI color + コントラストのUI色を設定する + + + + Print raw PNG capture + PNGのキャプチャーを印刷する + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + + + + Define the screen to capture (starting from 0) + Define the screen to capture (starting from 0) + + + + Invalid delay, it must be a number greater than 0 + Invalid delay, it must be a number greater than 0 + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + + + + Invalid path, must be an existing directory or a new file in an existing directory + Invalid path, must be an existing directory or a new file in an existing directory + + + Define the screen to capture + Define the screen to capture + + + + default: screen containing the cursor + default: screen containing the cursor + + + + Screen number + Screen number + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + + + Invalid delay, it must be higher than 0 + Invalid delay, it must be higher than 0 + + + + Invalid screen number, it must be non negative + Invalid screen number, it must be non negative + + + Invalid path, it must be a real path in the system + Invalid path, it must be a real path in the system + + + + Invalid value, it must be defined as 'true' or 'false' + Invalid value, it must be defined as 'true' or 'false' + + + + Error + エラー + + + + Unable to write in + 書き込めません: + + + + Requested screen exceeds screen count + Requested screen exceeds screen count + + + + Full screen screenshot pinned to screen + Full screen screenshot pinned to screen + + + URL copied to clipboard. + URL をクリップボードにコピーしました。 + + + + Options + Options + + + Arguments + Arguments + + + arguments + arguments + + + + Subcommands + + + + + subcommands + + + + + Usage + Usage + + + + options + options + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Per default runs Flameshot in the background and adds a tray icon for configuration. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + + + Toggle side panel + Toggle side panel + + + Resize selection left 1px + Resize selection left 1px + + + Resize selection right 1px + Resize selection right 1px + + + Resize selection up 1px + Resize selection up 1px + + + Resize selection down 1px + Resize selection down 1px + + + Select entire screen + Select entire screen + + + Move selection left 1px + Move selection left 1px + + + Move selection right 1px + Move selection right 1px + + + Move selection up 1px + Move selection up 1px + + + Move selection down 1px + Move selection down 1px + + + Commit text in text area + Commit text in text area + + + Delete current tool + Delete current tool + + + + Quit capture + キャプチャーを終了する + + + + Screenshot history + Screenshot history + + + + Capture screen + Capture screen + + + + Show color picker + カラーピッカーを表示する + + + + Change the tool's size + Change the tool's size + + + Change the tool's thickness + ツールの値 (太さや濃さ) を変更する + + + + RectangleTool + + + Rectangle + 矩形 + + + + Set the Rectangle as the paint tool + ペイントツールとして「矩形」をセットする + + + + RedoTool + + + Redo + やり直し + + + + Redo the next modification + 次の変更にやり直す + + + + SaveTool + + + Save + 保存 + + + + Save screenshot to a file + Save screenshot to a file + + + Save the capture + キャプチャーを保存する + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + + + + Unable to capture screen + 画面をキャプチャーできません + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + 矩形選択 + + + + Set Selection as the paint tool + ペイントツールとして「矩形選択」をセットする + + + + SetShortcutDialog + + + Set Shortcut + Set Shortcut + + + + Enter new shortcut to change + Enter new shortcut to change + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Press Esc to cancel or Backspace to disable the keyboard shortcut. + + + + + Flameshot must be restarted for changes to take effect. + Flameshot must be restarted for changes to take effect. + + + + ShortcutsWidget + + + Hot Keys + Hot Keys + + + + Available shortcuts in the screen capture mode. + スクリーンキャプチャーモードで利用可能なショートカット。 + + + + Description + 説明 + + + + Key + キー + + + + Left Double-click + Left Double-click + + + + Toggle side panel + Toggle side panel + + + + Grab a color from the screen + + + + + Resize selection left 1px + Resize selection left 1px + + + + Resize selection right 1px + Resize selection right 1px + + + + Resize selection up 1px + Resize selection up 1px + + + + Resize selection down 1px + Resize selection down 1px + + + + Symmetrically decrease width by 2px + + + + + Symmetrically increase width by 2px + + + + + Symmetrically increase height by 2px + + + + + Symmetrically decrease height by 2px + + + + + Select entire screen + Select entire screen + + + + Move selection left 1px + Move selection left 1px + + + + Move selection right 1px + Move selection right 1px + + + + Move selection up 1px + Move selection up 1px + + + + Move selection down 1px + Move selection down 1px + + + + Commit text in text area + Commit text in text area + + + + Delete selected drawn object + + + + + Cancel current selection + + + + Delete current tool + Delete current tool + + + + Capture screen + Capture screen + + + + Screenshot history + Screenshot history + + + + SidePanelWidget + + Active thickness: + Active thickness: + + + Active color: + アクティブな色: + + + Press ESC to cancel + ESC でキャンセル + + + + Active tool size: + Active tool size: + + + + Active Color: + Active Color: + + + + Grab Color + 色の取得 + + + + Display grid + + + + + SizeDecreaseTool + + + Decrease Tool Size + Decrease Tool Size + + + + Decrease the size of the other tools + Decrease the size of the other tools + + + + SizeIncreaseTool + + + Increase Tool Size + Increase Tool Size + + + + Increase the size of the other tools + Increase the size of the other tools + + + + SizeIndicatorTool + + Selection Size Indicator + 選択サイズインジケーター + + + Show X and Y dimensions of the selection + Show X and Y dimensions of the selection + + + Show the dimensions of the selection (X Y) + 選択範囲の寸法 (X Y) を表示する + + + + StrftimeChooserWidget + + + Century (00-99) + 世紀 (00-99) + + + + Year (00-99) + 年 (00-99) + + + + Year (2000) + 年 (2000) + + + + Month Name (jan) + 月 (jan) + + + + Month Name (january) + 月 (january) + + + + Month (01-12) + 月 (01-12) + + + + Week Day (1-7) + 週日 (1-7) + + + + Week (01-53) + 週 (01-53) + + + + Day Name (mon) + 曜日 (月) + + + + Day Name (monday) + 曜日 (月曜日) + + + + Day (01-31) + 日 (01-31) + + + + Day of Month (1-31) + 日 (1-31) + + + + Day (001-366) + 日 (001-366) + + + + Time (%H-%M-%S) + 時刻 (%H-%M-%S) + + + + Time (%H-%M) + 時刻 (%H-%M) + + + + Hour (00-23) + 時 (00-23) + + + + Hour (01-12) + 時 (01-12) + + + + Minute (00-59) + 分 (00-59) + + + + Second (00-59) + 秒 (00-59) + + + + Full Date (%m/%d/%y) + 年月日 (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + 年月日 (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + + + + + SystemNotification + + + Flameshot Info + Flameshot の情報 + + + + TextConfig + + + StrikeOut + 取り消し線 + + + + Underline + 下線 + + + + Bold + 太字 + + + + Italic + 斜体 + + + + Left Align + Left Align + + + + Center Align + Center Align + + + + Right Align + Right Align + + + + TextTool + + + Text + テキスト + + + + Add text to your capture + キャプチャーにテキストを追加する + + + + TrayIcon + + + &Take Screenshot + スクリーンショットを撮る(&T) + + + + &Open Launcher + ランチャーを開く(&O) + + + + &Configuration + 設定(&C) + + + + &About + ついて(&A) + + + + Check for updates + 更新をチェックする + + + + New version %1 is available + 新しいバージョン%1が公開されました + + + + &Quit + 終了(&Q) + + + + &Latest Uploads + 最新アップロード(&L) + + + + &Open Save Path + + + + + UIcolorEditor + + UI Color Editor + UI カラーエディター + + + + Change the color moving the selectors and see the changes in the preview buttons. + セレクターを動かして色を変更し、プレビューボタンの色がどう変化するか確認してください。 + + + + Select a Button to modify it + 変更するボタンを選択してください + + + + Main Color + メインカラー + + + + Click on this button to set the edition mode of the main color. + このボタンをクリックすると、メインカラーの編集モードをセットします。 + + + + Contrast Color + コントラストカラー + + + + Click on this button to set the edition mode of the contrast color. + このボタンをクリックすると、コントラストカラーの編集モードをセットします。 + + + + UndoTool + + + Undo + 元に戻す + + + + Undo the last modification + 最後の変更を元に戻す + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + New Flameshot version %1 is available + + + + Ignore + Ignore + + + + Later + Later + + + + Update + Update + + + + UploadHistory + + + Upload History + Upload History + + + + Screenshots history is empty + キャプチャー歴史がない + + + + UploadLineItem + + + Form + Form + + + + TextLabel + TextLabel + + + + Copy URL + Copy URL + + + + Open In Browser + Open In Browser + + + + Confirm to delete + よろしい + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + サーバーとローカルからのキャプチャーを削除してよろしいですか? + + + + UtilityPanel + + + Close + Close + + + + <Empty> + <Empty> + + + + VisualsEditor + + + Opacity of area outside selection: + 選択範囲外の不透明度: + + + + UI Color Editor + UI カラーエディター + + + + Colorpicker Editor + Colorpicker Editor + + + + Button Selection + ボタンの選択 + + + + Select All + すべて選択 + + + + color_widgets::ColorDialog + + + Pick + Pick + + + + color_widgets::ColorPalette + + + Unnamed + Unnamed + + + + color_widgets::ColorPaletteModel + + + Unnamed + Unnamed + + + + %1 (%2 colors) + %1 (%2 colors) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + Open a new palette from file + + + + + Create a new palette + Create a new palette + + + + + Duplicate the current palette + Duplicate the current palette + + + + + Delete the current palette + Delete the current palette + + + + + Revert changes to the current palette + Revert changes to the current palette + + + + + Save changes to the current palette + Save changes to the current palette + + + + + Add a color to the palette + Add a color to the palette + + + + + Remove the selected color from the palette + Remove the selected color from the palette + + + + + New Palette + New Palette + + + + + Name + Name + + + + GIMP Palettes (*.gpl) + GIMP Palettes (*.gpl) + + + + Palette Image (%1) + Palette Image (%1) + + + + All Files (*) + All Files (*) + + + + + Open Palette + Open Palette + + + + Failed to load the palette file +%1 + Failed to load the palette file +%1 + + + + color_widgets::GradientEditor + + + Add Color + Add Color + + + + Remove Color + Remove Color + + + + Edit Color... + Edit Color... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 colors) + + + + color_widgets::Swatch + + + Clear Color + Clear Color + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_ka.ts b/data/translations/Internationalization_ka.ts new file mode 100644 index 0000000..e8cff47 --- /dev/null +++ b/data/translations/Internationalization_ka.ts @@ -0,0 +1,3160 @@ + + + + + AbstractWidgetList + + + Add New + Add New + + + + Move Up + Move Up + + + + Move Down + Move Down + + + + Remove + Remove + + + + AcceptTool + + + Accept + Accept + + + + Accept the capture + Accept the capture + + + + AppLauncher + + + App Launcher + აპლიკაციის გამშვები + + + + Choose an app to open the capture + აირჩიეთ აპლიკაცია სურათის გასახსნელად + + + + AppLauncherWidget + + + Open With + გახსნა პროგრამით + + + + Launch in terminal + ტერმინალში გაშვება + + + + Keep open after selection + არ დახურო დიალოგი არჩევის შემდეგ + + + + + Error + შეცდომა + + + + Unable to write in + შემდეგ მისამართზე ჩაწერა ვერ მოხერხდა: + + + + Unable to launch in terminal. + ტერმინალში გაშვება ვერ მოხერხდა. + + + + ArrowTool + + + Arrow + ისარი + + + + Set the Arrow as the paint tool + ისრის ხელსაწყოს არჩევა სახატავად + + + + BlurTool + + Blur + გაბუნდოვნება + + + Set Blur as the paint tool + გაბუნდოვნების ხელსაწყოს არჩევა სახატავად + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Capture Mode</b> + + + + Rectangular Region + Rectangular Region + + + + Full Screen (Current Display) + Full Screen (Current Display) + + + + Full Screen (All Monitors) + Full Screen (All Monitors) + + + + No Delay + No Delay + + + + second + second + + + + + + seconds + seconds + + + + + Take new screenshot + Take new screenshot + + + + + Area: + Area: + + + + + Capture Launcher + Capture Launcher + + + + + TextLabel + TextLabel + + + + + Capture Mode + Capture Mode + + + + + Delay: + Delay: + + + + + WxH+x+y + WxH+x+y + + + + CaptureWidget + + + Unable to capture screen + ეკრანის გადაღება ვერ მოხერხდა + + + + Mouse + Mouse + + + + Select screenshot area + Select screenshot area + + + + Mouse Wheel + მაუსის გორგოლაჭი + + + + Change tool size + Change tool size + + + + Right Click + მაუსის მარჯვენა ღილაკი + + + + Show color picker + ფერის შესარჩევის ჩვენება + + + + Open side panel + Open side panel + + + + Esc + Esc + + + + Exit + გამოსვლა + + + + Quit Capture + + + + + Are you sure you want to quit capture? + + + + + Do not show this again + + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + Configuration error resolved. Launch `flameshot gui` again to apply it. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + + + + Tool Settings + Tool Settings + + + + CircleCountTool + + + Circle Counter + Circle Counter + + + + Add an autoincrementing counter bubble + Add an autoincrementing counter bubble + + + + CircleTool + + + Circle + წრე + + + + Set the Circle as the paint tool + წრის ხელსაწყოს არჩევა სახატავად + + + + ColorDialog + + + + Select Color + Select Color + + + + + Saturation + Saturation + + + + + Hue + Hue + + + + + Hex + Hex + + + + + Blue + Blue + + + + + Value + Value + + + + + Green + Green + + + + + Alpha + Alpha + + + + + Red + Red + + + + ColorGrabWidget + + + Accept color + Accept color + + + + Enter or Left Click + Enter or Left Click + + + + Precisely select color + Precisely select color + + + + Hold Left Click + Hold Left Click + + + + Toggle magnifier + Toggle magnifier + + + + Space or Right Click + Space or Right Click + + + + Cancel + Cancel + + + + Esc + Esc + + + + ColorPickerEditor + + + Edit Preset: + Edit Preset: + + + + Enter color to update preset + Enter color to update preset + + + + Update + Update + + + + Press button to update the selected preset + Press button to update the selected preset + + + + Delete + Delete + + + + Press button to delete the selected preset + Press button to delete the selected preset + + + + Add Preset: + Add Preset: + + + + Enter color manually or select it using the color-wheel + Enter color manually or select it using the color-wheel + + + + Add + Add + + + + Press button to add preset + Press button to add preset + + + + + Error + შეცდომა + + + + Unable to add preset. Maximum limit reached. + Unable to add preset. Maximum limit reached. + + + + Unable to remove preset. Minimum limit reached. + Unable to remove preset. Minimum limit reached. + + + + ConfigErrorDetails + + + Configuration errors + Configuration errors + + + + ConfigHandler + + + Unrecognized setting: '%1' + + Unrecognized setting: '%1' + + + + + Unrecognized shortcut name: '%1'. + + Unrecognized shortcut name: '%1'. + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + + + + Bad value in '%1'. Expected: %2 + + Bad value in '%1'. Expected: %2 + + + + + You have successfully resolved the configuration error. + You have successfully resolved the configuration error. + + + + The configuration contains an error. Open configuration to resolve. + The configuration contains an error. Open configuration to resolve. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + Bad config key '%1' in ConfigHandler. Please report this as a bug. + + + + ConfigResolver + + + Resolve configuration errors + Resolve configuration errors + + + + <b>You must resolve all errors before continuing:</b> + <b>You must resolve all errors before continuing:</b> + + + + Reset + განულება + + + + Reset to the default value. + Reset to the default value. + + + + Remove + Remove + + + + Remove this setting. + Remove this setting. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + + + + Resolve all + Resolve all + + + + Resolve all listed errors. + Resolve all listed errors. + + + + Details + Details + + + + ConfigWindow + + + Configuration + პარამეტრები + + + + Interface + ინტერფეისი + + + + Filename Editor + ფაილის სახელის რედაქტორი + + + + General + ზოგადი + + + + Shortcuts + Shortcuts + + + + Resolve + Resolve + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>Configuration file has errors. Resolve them before continuing.</b> + + + + Controller + + New version %1 is available + New version %1 is available + + + You have the latest version + You have the latest version + + + Failed to get information about the latest version. + Failed to get information about the latest version. + + + Error + შეცდომა + + + Unable to close active modal widgets + Unable to close active modal widgets + + + &Take Screenshot + &Take Screenshot + + + &Open Launcher + &Open Launcher + + + &Configuration + &პარამეტრები + + + &About + &About + + + Check for updates + Check for updates + + + &Latest Uploads + &Latest Uploads + + + URL copied to clipboard. + URL დაკოპირდა გაცვლის ბუფერში. + + + &Information + &ინფორმაცია + + + &Quit + &გამოსვლა + + + + CopyTool + + + Copy + კოპირება + + + + Copy selection to clipboard + Copy selection to clipboard + + + Copy the selection into the clipboard + Copy the selection into the clipboard + + + + DBusUtils + + Unable to connect via DBus + DBus-ით დაკავშირება ვერ მოხერხდა + + + + ExitTool + + + Exit + გამოსვლა + + + + Leave the capture screen + ეკრანის გადაღების დატოვება + + + + FileNameEditor + + + Edit the name of your captures: + შეცვალეთ თქვენი სურათების სახელი: + + + + Edit: + თარგი: + + + + Preview: + გადახედვა: + + + + Save + შენახვა + + + + Saves the pattern + თარგის შენახვა + + + + Restore + Restore + + + Reset + განულება + + + + Restores the saved pattern + შენახული შაბლონის განულება + + + + Clear + გაწმენდა + + + + Deletes the name + სახელის წაშლა + + + + Flameshot + + + Error + შეცდომა + + + + Unable to close active modal widgets + Unable to close active modal widgets + + + + URL copied to clipboard. + URL დაკოპირდა გაცვლის ბუფერში. + + + + FlameshotDaemon + + + New version %1 is available + New version %1 is available + + + + You have the latest version + You have the latest version + + + + Failed to get information about the latest version. + Failed to get information about the latest version. + + + + Unable to connect via DBus + DBus-ით დაკავშირება ვერ მოხერხდა + + + + GeneneralConf + + Import + იმპორტირება + + + Error + შეცდომა + + + Unable to read file. + ფაილის წაკითხვა ვერ მოხერხდა. + + + Unable to write file. + ფაილის ჩაწერა ვერ მოხერხდა. + + + Save File + ფაილის შენახვა + + + Confirm Reset + განულების დადასტურება + + + Are you sure you want to reset the configuration? + დარწმუნებული ხართ, რომ გსურთ პარამეტრების განულება? + + + Show help message + დახმარების შეტყობინების ნახვა + + + Show the help message at the beginning in the capture mode. + დახმარების შეტყობინების ნახვა გადაღების რეჟიმის დაწყებისას. + + + Show desktop notifications + ცნობების ჩვენება სამუშაო მაგიდაზე + + + Show tray icon + ხატულის ჩვენება სისტემურ პანელზე + + + Show the systemtray icon + ხატულის ჩვენება სისტემურ პანელზე + + + Configuration File + პარამეტრების ფაილი + + + Export + ექსპორტირება + + + Reset + განულება + + + Launch at startup + გაშვება სისტემის ჩატვირთვისას + + + + GeneralConf + + + + Import + იმპორტირება + + + + + + + Error + შეცდომა + + + + Unable to read file. + ფაილის წაკითხვა ვერ მოხერხდა. + + + + + Unable to write file. + ფაილის ჩაწერა ვერ მოხერხდა. + + + + Save File + ფაილის შენახვა + + + + Confirm Reset + განულების დადასტურება + + + + Are you sure you want to reset the configuration? + დარწმუნებული ხართ, რომ გსურთ პარამეტრების განულება? + + + + Show help message + დახმარების შეტყობინების ნახვა + + + Show the help message at the beginning in the capture mode. + დახმარების შეტყობინების ნახვა გადაღების რეჟიმის დაწყებისას. + + + + Show the side panel button + Show the side panel button + + + Show the side panel toggle button in the capture mode. + Show the side panel toggle button in the capture mode. + + + + Show desktop notifications + ცნობების ჩვენება სამუშაო მაგიდაზე + + + + Show tray icon + ხატულის ჩვენება სისტემურ პანელზე + + + Show the systemtray icon + ხატულის ჩვენება სისტემურ პანელზე + + + + Confirmation required to delete screenshot from the latest uploads + Confirmation required to delete screenshot from the latest uploads + + + + Configuration File + პარამეტრების ფაილი + + + + Export + ექსპორტირება + + + + Reset + განულება + + + + Automatic check for updates + Automatic check for updates + + + + Allow multiple flameshot GUI instances simultaneously + Allow multiple flameshot GUI instances simultaneously + + + Automatically close daemon when it is not needed + Automatically close daemon when it is not needed + + + Launch at startup + გაშვება სისტემის ჩატვირთვისას + + + Launch Flameshot + Launch Flameshot + + + + Show welcome message on launch + Show welcome message on launch + + + + Use large predefined color palette + Use large predefined color palette + + + + Copy URL after upload + Copy URL after upload + + + Copy URL and close window after upload + Copy URL and close window after upload + + + + Save image after copy + Save image after copy + + + Save image file after copying it + Save image file after copying it + + + + Show the help message at the beginning in the capture mode + Show the help message at the beginning in the capture mode + + + + Use last region for GUI mode + Use last region for GUI mode + + + + Use the last region as the default selection for the next screenshot in GUI mode + Use the last region as the default selection for the next screenshot in GUI mode + + + + Show the side panel toggle button in the capture mode + Show the side panel toggle button in the capture mode + + + + Enable desktop notifications + Enable desktop notifications + + + + Show abort notifications + + + + + Enable abort notifications + + + + + Show icon in the system tray + Show icon in the system tray + + + + Use grim to capture screenshots + + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + + + + + Ask for confirmation to delete screenshot from the latest uploads + Ask for confirmation to delete screenshot from the latest uploads + + + + Check for updates automatically + Check for updates automatically + + + + This allows you to take screenshots of Flameshot itself for example + This allows you to take screenshots of Flameshot itself for example + + + Launch Flameshot daemon when computer is booted + Launch Flameshot daemon when computer is booted + + + + Show the welcome message box in the middle of the screen while taking a screenshot + Show the welcome message box in the middle of the screen while taking a screenshot + + + + Use a large predefined color palette + Use a large predefined color palette + + + + Copy on double click + Copy on double click + + + Enable Copy on Double Click + Enable Copy on Double Click + + + Copy URL and close window after uploading was successful + Copy URL and close window after uploading was successful + + + + Automatically unload from memory when it is not needed + + + + + Automatically close daemon (background process) when it is not needed + + + + + Launch in background at startup + + + + + Launch Flameshot daemon (background process) when computer is booted + + + + + Ask before quit capture + + + + + Show the confirmation prompt before ESC quit + + + + + Enable Copy to clipboard on Double Click + + + + + Copy URL after uploading was successful + + + + + After copying the screenshot, save it to a file as well + After copying the screenshot, save it to a file as well + + + + Save Path + Save Path + + + + Change... + Change... + + + + Use fixed path for screenshots to save + Use fixed path for screenshots to save + + + + Preferred save file extension: + Preferred save file extension: + + + + Latest Uploads Max Size + Latest Uploads Max Size + + + + Imgur Application Client ID + Imgur Application Client ID + + + + Undo limit + Undo limit + + + + Use JPG format for clipboard (PNG default) + Use JPG format for clipboard (PNG default) + + + + Use lossy JPG format for clipboard (lossless PNG default) + + + + + Copy file path after save + Copy file path after save + + + + Copy the file path to clipboard after the file is saved + Copy the file path to clipboard after the file is saved + + + + Anti-aliasing image when zoom the pinned image + Anti-aliasing image when zoom the pinned image + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + After zooming the pinned image, should the image get smoothened or stay pixelated + + + + + Upload image without confirmation + Upload image without confirmation + + + + Choose a Folder + Choose a Folder + + + + Unable to write to directory. + Unable to write to directory. + + + + Show magnifier + Show magnifier + + + + Enable a magnifier while selecting the screenshot area + Enable a magnifier while selecting the screenshot area + + + + Square shaped magnifier + Square shaped magnifier + + + + Make the magnifier to be square-shaped + Make the magnifier to be square-shaped + + + + Milliseconds before geometry display hides; 0 means do not hide + + + + + Set geometry display timeout (ms) + + + + + Selection Geometry Display + + + + + Display Location + + + + + None + + + + + Top Left + + + + + Top Right + + + + + Bottom Left + + + + + Bottom Right + + + + + Center + + + + + Quality range of 0-100; Higher number is better quality and larger file size + + + + + JPEG Quality + + + + + Reverse arrow + + + + + Draw the arrow head first + + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + Latest Uploads + + + Screenshots history is empty + Screenshots history is empty + + + Copy URL + URL-ის კოპირება + + + URL copied to clipboard. + URL დაკოპირდა გაცვლის ბუფერში. + + + Open in browser + Open in browser + + + Confirm to delete + Confirm to delete + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Are you sure you want to delete a screenshot from the latest uploads and server? + + + + ImgS3Uploader + + Uploading Image + სურათის ატვირთვა + + + URL copied to clipboard. + URL დაკოპირდა გაცვლის ბუფერში. + + + Error + შეცდომა + + + + ImgUploadDialog + + + Upload Confirmation + Upload Confirmation + + + + Do you want to upload this capture? + Do you want to upload this capture? + + + + + Upload without confirmation + Upload without confirmation + + + + ImgUploader + + Uploading Image + სურათის ატვირთვა + + + Unable to open the URL. + URL-ის გახსნა ვერ მოხერხდა. + + + URL copied to clipboard. + URL დაკოპირდა გაცვლის ბუფერში. + + + Screenshot copied to clipboard. + სურათი დაკოპირდა გაცვლის ბუფერში. + + + Copy URL + URL-ის კოპირება + + + Open URL + URL-ის გახსნა + + + Image to Clipboard. + სურათის გაცვლის ბუფერში გაგზავნა + + + + ImgUploaderBase + + + Upload image + Upload image + + + + Uploading Image + სურათის ატვირთვა + + + + Copy URL + URL-ის კოპირება + + + + Open URL + URL-ის გახსნა + + + + Delete image + Delete image + + + + Image to Clipboard. + სურათის გაცვლის ბუფერში გაგზავნა + + + + Save image + Save image + + + + Unable to open the URL. + URL-ის გახსნა ვერ მოხერხდა. + + + + URL copied to clipboard. + URL დაკოპირდა გაცვლის ბუფერში. + + + + Screenshot copied to clipboard. + სურათი დაკოპირდა გაცვლის ბუფერში. + + + + Unable to save the screenshot to disk. + Unable to save the screenshot to disk. + + + + Screenshot saved. + Screenshot saved. + + + + ImgUploaderTool + + + Image Uploader + სურათის ამტვირთველი + + + + Upload the selection + Upload the selection + + + + ImgurUploader + + Upload to Imgur + Imgur-ზე ატვირთვა + + + Uploading Image + სურათის ატვირთვა + + + Copy URL + URL-ის კოპირება + + + Open URL + URL-ის გახსნა + + + Delete image + Delete image + + + Image to Clipboard. + სურათის გაცვლის ბუფერში გაგზავნა + + + + Unable to open the URL. + URL-ის გახსნა ვერ მოხერხდა. + + + URL copied to clipboard. + URL დაკოპირდა გაცვლის ბუფერში. + + + Screenshot copied to clipboard. + სურათი დაკოპირდა გაცვლის ბუფერში. + + + + ImgurUploaderTool + + Image Uploader + სურათის ამტვირთველი + + + Upload the selection to Imgur + შერჩეულის Imgur-ზე ატვირთვა + + + + InfoWindow + + + + About + პროგრამის შესახებ + + + + + Icon + Icon + + + + + License + License + + + + + GPLv3+ + GPLv3+ + + + + + Version + Version + + + + + Flameshot v + Flameshot v + + + + + OS Info + OS Info + + + + + Copy Info + Copy Info + + + Right Click + მაუსის მარჯვენა ღილაკი + + + Mouse Wheel + მაუსის გორგოლაჭი + + + Move selection 1px + შერჩეულის გადაადგილება 1px-ით + + + Resize selection 1px + შერჩეულის ზომის შეცვლა 1px-ით + + + Quit capture + გადაღებიდან გამოსვლა + + + Copy to clipboard + გაცვლის ბუფერში კოპირება + + + Save selection as a file + შერჩეულის ფაილად შენახვა + + + Undo the last modification + ბოლო ცვლილების გაუქმება + + + Show color picker + ფერის შესარჩევის ჩვენება + + + Change the tool's thickness + ხელსაწყოს სისქის შეცვლა + + + Available shortcuts in the screen capture mode. + გადაღების რეჟიმში ხელმისაწვდომი მალსახმობები. + + + Key + კლავიში + + + Description + აღწერა + + + <u><b>License</b></u> + <u><b>ლიცენზია</b></u> + + + <u><b>Version</b></u> + <u><b>ვერსია</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>მალსახმობები</b></u> + + + + InvertTool + + + Invert + Invert + + + + Set Inverter as the paint tool + Set Inverter as the paint tool + + + + LineTool + + + Line + ხაზი + + + + Set the Line as the paint tool + ხაზის ხელსაწყოს არჩევა სახატავად + + + + MarkerTool + + + Marker + მარკერი + + + + Set the Marker as the paint tool + მარკერის ხელსაწყოს არჩევა სახატავად + + + + MoveTool + + + Move + გადაადგილება + + + + Move the selection area + შერჩეული არის გადაადგილება + + + + PencilTool + + + Pencil + ფანქარი + + + + Set the Pencil as the paint tool + ფანქრის ხელსაწყოს არჩევა სახატავად + + + + PinTool + + + Pin Tool + Pin Tool + + + + Pin image on the desktop + Pin image on the desktop + + + + PinWidget + + + Context menu + Context menu + + + + Copy to clipboard + გაცვლის ბუფერში კოპირება + + + + Save to file + Save to file + + + + Rotate Right + + + + + Rotate Left + + + + + Increase Opacity + + + + + Decrease Opacity + + + + + Close + Close + + + + PixelateTool + + + Pixelate + Pixelate + + + + Set Pixelate as the paint tool. + + + + Set Pixelate as the paint tool + Set Pixelate as the paint tool + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QHotkey + + Failed to register %1. Error: %2 + Failed to register %1. Error: %2 + + + Failed to unregister %1. Error: %2 + Failed to unregister %1. Error: %2 + + + + QObject + + + Save Error + შეცდომა შენახვისას + + + + + Capture saved as + სურათი შენახულია როგორც: + + + + + Capture saved to clipboard. + Capture saved to clipboard. + + + + Error while saving to clipboard + Error while saving to clipboard + + + + + Error trying to save as + შეცდომა მცდელობისას შენახულიყო როგორც: + + + + Save screenshot + Save screenshot + + + + Path copied to clipboard as + Path copied to clipboard as + + + Saving canceled + Saving canceled + + + Save canceled + Save canceled + + + Capture is saved and copied to the clipboard as + Capture is saved and copied to the clipboard as + + + + Unable to connect via DBus + DBus-ით დაკავშირება ვერ მოხერხდა + + + + Powerful yet simple to use screenshot software. + Powerful yet simple to use screenshot software. + + + + See + See + + + Capture the entire desktop. + Capture the entire desktop. + + + + Open the capture launcher. + Open the capture launcher. + + + + Start a manual capture in GUI mode. + Start a manual capture in GUI mode. + + + + Configure + Configure + + + Capture a single screen. + Capture a single screen. + + + Path where the capture will be saved + Path where the capture will be saved + + + + Capture screenshot of all monitors at the same time. + + + + + Capture a screenshot of the specified monitor. + + + + + Existing directory or new file to save to + Existing directory or new file to save to + + + + Save the capture to the clipboard + Save the capture to the clipboard + + + + Pin the capture to the screen + Pin the capture to the screen + + + + Upload screenshot + Upload screenshot + + + + Delay time in milliseconds + Delay time in milliseconds + + + + Repeat screenshot with previously selected region + Repeat screenshot with previously selected region + + + + Screenshot region to select + Screenshot region to select + + + + Set the filename pattern + Set the filename pattern + + + + Accept capture as soon as a selection is made + Accept capture as soon as a selection is made + + + + Enable or disable the trayicon + Enable or disable the trayicon + + + + Enable or disable run at startup + Enable or disable run at startup + + + + Enable or disable the notifications + + + + + Check the configuration for errors + Check the configuration for errors + + + + Show the help message in the capture mode + Show the help message in the capture mode + + + + Define the main UI color + Define the main UI color + + + + Define the contrast UI color + Define the contrast UI color + + + + Print raw PNG capture + Print raw PNG capture + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + + + + Define the screen to capture (starting from 0) + Define the screen to capture (starting from 0) + + + + Invalid delay, it must be a number greater than 0 + Invalid delay, it must be a number greater than 0 + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + + + + Invalid path, must be an existing directory or a new file in an existing directory + Invalid path, must be an existing directory or a new file in an existing directory + + + Define the screen to capture + Define the screen to capture + + + + default: screen containing the cursor + default: screen containing the cursor + + + + Screen number + Screen number + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + + + Invalid delay, it must be higher than 0 + Invalid delay, it must be higher than 0 + + + + Invalid screen number, it must be non negative + Invalid screen number, it must be non negative + + + Invalid path, it must be a real path in the system + Invalid path, it must be a real path in the system + + + + Invalid value, it must be defined as 'true' or 'false' + Invalid value, it must be defined as 'true' or 'false' + + + + Error + შეცდომა + + + + Unable to write in + შემდეგ მისამართზე ჩაწერა ვერ მოხერხდა: + + + + Requested screen exceeds screen count + Requested screen exceeds screen count + + + + Full screen screenshot pinned to screen + Full screen screenshot pinned to screen + + + URL copied to clipboard. + URL დაკოპირდა გაცვლის ბუფერში. + + + + Options + Options + + + Arguments + Arguments + + + arguments + arguments + + + + Subcommands + + + + + subcommands + + + + + Usage + Usage + + + + options + options + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Per default runs Flameshot in the background and adds a tray icon for configuration. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + + + Toggle side panel + Toggle side panel + + + Resize selection left 1px + Resize selection left 1px + + + Resize selection right 1px + Resize selection right 1px + + + Resize selection up 1px + Resize selection up 1px + + + Resize selection down 1px + Resize selection down 1px + + + Select entire screen + Select entire screen + + + Move selection left 1px + Move selection left 1px + + + Move selection right 1px + Move selection right 1px + + + Move selection up 1px + Move selection up 1px + + + Move selection down 1px + Move selection down 1px + + + Commit text in text area + Commit text in text area + + + Delete current tool + Delete current tool + + + + Quit capture + გადაღებიდან გამოსვლა + + + + Screenshot history + Screenshot history + + + + Capture screen + Capture screen + + + + Show color picker + ფერის შესარჩევის ჩვენება + + + + Change the tool's size + Change the tool's size + + + Change the tool's thickness + ხელსაწყოს სისქის შეცვლა + + + + RectangleTool + + + Rectangle + მართკუთხედი + + + + Set the Rectangle as the paint tool + მართკუთხედის ხელსაწყოს არჩევა სახატავად + + + + RedoTool + + + Redo + Redo + + + + Redo the next modification + Redo the next modification + + + + SaveTool + + + Save + შენახვა + + + + Save screenshot to a file + Save screenshot to a file + + + Save the capture + სურათის შენახვა + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + + + + Unable to capture screen + ეკრანის გადაღება ვერ მოხერხდა + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + მართკუთხა შერჩევა + + + + Set Selection as the paint tool + შერჩევის ხელსაწყოს არჩევა სახატავად + + + + SetShortcutDialog + + + Set Shortcut + Set Shortcut + + + + Enter new shortcut to change + Enter new shortcut to change + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Press Esc to cancel or Backspace to disable the keyboard shortcut. + + + + + Flameshot must be restarted for changes to take effect. + Flameshot must be restarted for changes to take effect. + + + + ShortcutsWidget + + + Hot Keys + Hot Keys + + + + Available shortcuts in the screen capture mode. + გადაღების რეჟიმში ხელმისაწვდომი მალსახმობები. + + + + Description + აღწერა + + + + Key + კლავიში + + + + Left Double-click + Left Double-click + + + + Toggle side panel + Toggle side panel + + + + Grab a color from the screen + + + + + Resize selection left 1px + Resize selection left 1px + + + + Resize selection right 1px + Resize selection right 1px + + + + Resize selection up 1px + Resize selection up 1px + + + + Resize selection down 1px + Resize selection down 1px + + + + Symmetrically decrease width by 2px + + + + + Symmetrically increase width by 2px + + + + + Symmetrically increase height by 2px + + + + + Symmetrically decrease height by 2px + + + + + Select entire screen + Select entire screen + + + + Move selection left 1px + Move selection left 1px + + + + Move selection right 1px + Move selection right 1px + + + + Move selection up 1px + Move selection up 1px + + + + Move selection down 1px + Move selection down 1px + + + + Commit text in text area + Commit text in text area + + + + Delete selected drawn object + + + + + Cancel current selection + + + + Delete current tool + Delete current tool + + + + Capture screen + Capture screen + + + + Screenshot history + Screenshot history + + + + SidePanelWidget + + Active thickness: + Active thickness: + + + Active color: + Active color: + + + Press ESC to cancel + Press ESC to cancel + + + + Active tool size: + Active tool size: + + + + Active Color: + Active Color: + + + + Grab Color + Grab Color + + + + Display grid + + + + + SizeDecreaseTool + + + Decrease Tool Size + Decrease Tool Size + + + + Decrease the size of the other tools + Decrease the size of the other tools + + + + SizeIncreaseTool + + + Increase Tool Size + Increase Tool Size + + + + Increase the size of the other tools + Increase the size of the other tools + + + + SizeIndicatorTool + + Selection Size Indicator + შერჩეულის ზომის მაჩვენებელი + + + Show X and Y dimensions of the selection + Show X and Y dimensions of the selection + + + Show the dimensions of the selection (X Y) + აჩვენებს შერჩეული არის განზომილებებს (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + საუკუნე (00-99) + + + + Year (00-99) + წელი (00-99) + + + + Year (2000) + წელი (2000) + + + + Month Name (jan) + თვის სახელი (იან) + + + + Month Name (january) + თვის სახელი (იანვარი) + + + + Month (01-12) + თვე (01-12) + + + + Week Day (1-7) + კვირის დღე (1-7) + + + + Week (01-53) + კვირა (01-53) + + + + Day Name (mon) + დღის სახელი (ორშ) + + + + Day Name (monday) + დღის სახელი (ორშაბათი) + + + + Day (01-31) + დღე (01-31) + + + + Day of Month (1-31) + თვის დღე (1-31) + + + + Day (001-366) + დღე (001-366) + + + + Time (%H-%M-%S) + Time (%H-%M-%S) + + + + Time (%H-%M) + Time (%H-%M) + + + + Hour (00-23) + საათი (00-23) + + + + Hour (01-12) + საათი (01-12) + + + + Minute (00-59) + წუთი (00-59) + + + + Second (00-59) + წამი (00-59) + + + + Full Date (%m/%d/%y) + სრული თარიღი (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + სრული თარიღი (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + + + + + SystemNotification + + + Flameshot Info + Flameshot Info + + + + TextConfig + + + StrikeOut + StrikeOut + + + + Underline + Underline + + + + Bold + Bold + + + + Italic + Italic + + + + Left Align + Left Align + + + + Center Align + Center Align + + + + Right Align + Right Align + + + + TextTool + + + Text + Text + + + + Add text to your capture + Add text to your capture + + + + TrayIcon + + + &Take Screenshot + &Take Screenshot + + + + &Open Launcher + &Open Launcher + + + + &Configuration + &პარამეტრები + + + + &About + &About + + + + Check for updates + Check for updates + + + + New version %1 is available + New version %1 is available + + + + &Quit + &გამოსვლა + + + + &Latest Uploads + &Latest Uploads + + + + &Open Save Path + + + + + UIcolorEditor + + UI Color Editor + ინტერფეისის ფერის რედაქტორი + + + + Change the color moving the selectors and see the changes in the preview buttons. + შეცვალეთ ფერი ნიშნულის გადაადგილებით და შეხედეთ ცვლილებებს გადასახედ ღილაკებზე. + + + + Select a Button to modify it + აირჩიეთ ღილაკი მის შესაცვლელად + + + + Main Color + ძირითადი ფერი + + + + Click on this button to set the edition mode of the main color. + დააწექით ამ ღილაკს ძირითადი ფერის არჩევის რეჟიმის ჩასართავად. + + + + Contrast Color + კონტრასტული ფერი + + + + Click on this button to set the edition mode of the contrast color. + დააწექით ამ ღილაკს კონტრასტული ფერის არჩევის რეჟიმის ჩასართავად. + + + + UndoTool + + + Undo + უკუქმნა + + + + Undo the last modification + ბოლო ცვლილების გაუქმება + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + New Flameshot version %1 is available + + + + Ignore + Ignore + + + + Later + Later + + + + Update + Update + + + + UploadHistory + + + Upload History + Upload History + + + + Screenshots history is empty + Screenshots history is empty + + + + UploadLineItem + + + Form + Form + + + + TextLabel + TextLabel + + + + Copy URL + URL-ის კოპირება + + + + Open In Browser + Open In Browser + + + + Confirm to delete + Confirm to delete + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Are you sure you want to delete a screenshot from the latest uploads and server? + + + + UtilityPanel + + + Close + Close + + + + <Empty> + <Empty> + + + + VisualsEditor + + + Opacity of area outside selection: + შერჩეულის გარე არეს გაუმჭვირვალობა + + + + UI Color Editor + ინტერფეისის ფერის რედაქტორი + + + + Colorpicker Editor + Colorpicker Editor + + + + Button Selection + ღილაკის არჩევა + + + + Select All + ყველაფრის შერჩევა + + + + color_widgets::ColorDialog + + + Pick + Pick + + + + color_widgets::ColorPalette + + + Unnamed + Unnamed + + + + color_widgets::ColorPaletteModel + + + Unnamed + Unnamed + + + + %1 (%2 colors) + %1 (%2 colors) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + Open a new palette from file + + + + + Create a new palette + Create a new palette + + + + + Duplicate the current palette + Duplicate the current palette + + + + + Delete the current palette + Delete the current palette + + + + + Revert changes to the current palette + Revert changes to the current palette + + + + + Save changes to the current palette + Save changes to the current palette + + + + + Add a color to the palette + Add a color to the palette + + + + + Remove the selected color from the palette + Remove the selected color from the palette + + + + + New Palette + New Palette + + + + + Name + Name + + + + GIMP Palettes (*.gpl) + GIMP Palettes (*.gpl) + + + + Palette Image (%1) + Palette Image (%1) + + + + All Files (*) + All Files (*) + + + + + Open Palette + Open Palette + + + + Failed to load the palette file +%1 + Failed to load the palette file +%1 + + + + color_widgets::GradientEditor + + + Add Color + Add Color + + + + Remove Color + Remove Color + + + + Edit Color... + Edit Color... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 colors) + + + + color_widgets::Swatch + + + Clear Color + Clear Color + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_ko.ts b/data/translations/Internationalization_ko.ts new file mode 100644 index 0000000..bcd0762 --- /dev/null +++ b/data/translations/Internationalization_ko.ts @@ -0,0 +1,3190 @@ + + + + + AbstractWidgetList + + + Add New + 새로 추가 + + + + Move Up + 위로 이동 + + + + Move Down + 아래로 이동 + + + + Remove + 제거 + + + + AcceptTool + + + Accept + 수락 + + + + Accept the capture + 캡처 수락 + + + + AppLauncher + + + App Launcher + 앱 런처 + + + + Choose an app to open the capture + 캡처를 열 앱 선택 + + + + AppLauncherWidget + + + Open With + 다음으로 열기 + + + + Launch in terminal + 터미널에서 실행 + + + + Keep open after selection + 선택 후에도 열려 있음 유지 + + + + + Error + 오류 + + + + Unable to launch in terminal. + 터미널에서 실행할 수 없습니다. + + + + Unable to write in + 작성할 수 없음 + + + + ArrowTool + + + Arrow + 화살표 + + + + Set the Arrow as the paint tool + 화살표를 페인트 도구로 설정 + + + + BlurTool + + Blur + ぼかし + + + Set Blur as the paint tool + ペイントツールとして「ぼかし」をセットする + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>캡처 모드</b> + + + + Rectangular Region + 직사각형 영역 + + + + Full Screen (Current Display) + 전체 화면 (현재 디스플레이) + + + + Full Screen (All Monitors) + 전체 화면 (모든 모니터) + + + + No Delay + 지연 없음 + + + + second + 초 + + + + + + seconds + 초 + + + + + Take new screenshot + 새 스크린샷 찍기 + + + + + Area: + 영역: + + + + + Capture Launcher + 캡처 런처 + + + + + TextLabel + 텍스트 레이블 + + + + + Capture Mode + 캡처 모드 + + + + + Delay: + 지연: + + + + + WxH+x+y + WxH+x+y + + + + CaptureWidget + + + Unable to capture screen + 화면을 캡처할 수 없습니다 + + + + Mouse + 마우스 + + + + Select screenshot area + 스크린샷 영역 선택 + + + + Mouse Wheel + 마우스 휠 + + + + Change tool size + 도구 크기 변경 + + + + Right Click + 오른쪽 클릭 + + + + Show color picker + 색상 선택기 표시 + + + + Open side panel + 측면 패널 열기 + + + + Esc + Esc + + + + Exit + 종료 + + + + Quit Capture + 캡처 종료 + + + + Are you sure you want to quit capture? + 캡처를 종료하시겠습니까? + + + + Do not show this again + 다시 표시하지 않음 + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot은 초점을 잃었습니다. 키보드 단축키는 어딘가를 클릭하기 전까지는 작동하지 않습니다. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + 구성 오류가 해결되었습니다. 'flameshot gui'를 다시 실행하여 적용합니다. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + 마우스로 영역을 선택하거나 Esc로 종료합니다. +Enter로 눌러 화면을 캡처합니다. +우클릭으로 색상선택기를 봅니다. +마우스 휠로 사용자 도구의 두께를 바꿉니다. +Space로 사이드 패널을 엽니다. + + + + Tool Settings + 도구 설정 + + + + CircleCountTool + + + Circle Counter + 원형 카운터 + + + + Add an autoincrementing counter bubble + 자동 증가 카운터 버블 추가 + + + + CircleTool + + + Circle + 원형 + + + + Set the Circle as the paint tool + 원을 페인트 도구로 설정 + + + + ColorDialog + + + + Select Color + 색상 선택 + + + + + Saturation + 채도 + + + + + Hue + 색조 + + + + + Hex + 16진수 + + + + + Blue + 파랑 + + + + + Value + 값 + + + + + Green + 녹색 + + + + + Alpha + 알파 + + + + + Red + 빨강 + + + + ColorGrabWidget + + + Accept color + 색상 허용 + + + + Enter or Left Click + 입력 또는 왼쪽 클릭 + + + + Precisely select color + 색상을 정확하게 선택하세요 + + + + Hold Left Click + 왼쪽 클릭 유지 + + + + Toggle magnifier + 돋보기 전환 + + + + Space or Right Click + 스페이스 또는 오른쪽 클릭 + + + + Cancel + 취소 + + + + Esc + Esc + + + + ColorPickerEditor + + + Edit Preset: + 프리셋 편집: + + + + Enter color to update preset + 색상을 입력하여 프리셋 업데이트 + + + + Update + 업데이트 + + + + Press button to update the selected preset + 버튼을 눌러 선택한 프리셋 업데이트 + + + + Delete + 삭제 + + + + Press button to delete the selected preset + 버튼을 눌러 선택한 프리셋 삭제 + + + + Add Preset: + 프리셋 추가: + + + + Enter color manually or select it using the color-wheel + 색상을 수동으로 입력하거나 색상 휠을 사용하여 선택 + + + + Add + 추가 + + + + Press button to add preset + 버튼을 눌러 프리셋 추가 + + + + + Error + 오류 + + + + Unable to add preset. Maximum limit reached. + 프리셋을 추가할 수 없습니다. 최대 한도에 도달했습니다. + + + + Unable to remove preset. Minimum limit reached. + 프리셋을 제거할 수 없습니다. 최소 한도에 도달했습니다. + + + + ConfigErrorDetails + + + Configuration errors + 구성 오류 + + + + ConfigHandler + + + Unrecognized setting: '%1' + + 인식되지 않는 설정: '%1' + + + + + Unrecognized shortcut name: '%1'. + + 인식되지 않는 단축키 이름: '%1'. + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + 단축키 충돌: '%1'과 '%2'는 같은 단축키를 가지고 있습니다: %3 + + + + + Bad value in '%1'. Expected: %2 + + '%1'에서 나쁜 값. 예상: %2 + + + + + You have successfully resolved the configuration error. + 구성 오류를 성공적으로 해결했습니다. + + + + The configuration contains an error. Open configuration to resolve. + 구성에 오류가 있습니다. 해결하려면 구성을 엽니다. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + ConfigHandler의 설정 키 '%1'이 잘못되었습니다. 이를 버그로 보고해 주세요. + + + + ConfigResolver + + + Resolve configuration errors + 구성 오류 해결 + + + + <b>You must resolve all errors before continuing:</b> + <b>계속하기 전에 모든 오류를 해결해야 합니다:</b> + + + + Reset + 재설정 + + + + Reset to the default value. + 기본값으로 재설정합니다. + + + + Remove + 제거 + + + + Remove this setting. + 이 설정을 제거합니다. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + 일부 키보드 단축키에는 충돌이 있습니다. +이것은 flameshot이 시작되는 것을 막지 못할 것입니다. +구성 파일에서 수동으로 해결해 주세요. + + + + Resolve all + 모두 해결 + + + + Resolve all listed errors. + 나열된 모든 오류를 해결합니다. + + + + Details + 세부 사항 + + + + ConfigWindow + + + Configuration + 구성 + + + + Interface + 인터페이스 + + + + Filename Editor + 파일 이름 편집기 + + + + General + 일반 + + + + Shortcuts + 단축키 + + + + Resolve + 해결 + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>구성 파일에 오류가 있습니다. 계속 진행하기 전에 문제를 해결하세요.</b> + + + + Controller + + New version %1 is available + New version %1 is available + + + You have the latest version + You have the latest version + + + Failed to get information about the latest version. + Failed to get information about the latest version. + + + Error + 오류 + + + Unable to close active modal widgets + Unable to close active modal widgets + + + &Take Screenshot + 스크린샷 촬영(&T) + + + &Open Launcher + 런처 열기(&O) + + + &Configuration + 설정(&C) + + + &About + &About + + + Check for updates + Check for updates + + + &Latest Uploads + &Latest Uploads + + + URL copied to clipboard. + URL을 클립보드에 복사했습니다. + + + &Information + 정보(&I) + + + &Quit + 종료(&Q) + + + + CopyTool + + + Copy + 복사 + + + + Copy selection to clipboard + 클립보드에 선택 항목 복사 + + + Copy the selection into the clipboard + 선택 영역을 클립보드에 복사 + + + + DBusUtils + + Unable to connect via DBus + DBus에 접속할 수 없습니다 + + + + ExitTool + + + Exit + 종료 + + + + Leave the capture screen + 캡처 화면 나가기 + + + + FileNameEditor + + + Edit the name of your captures: + 캡처 이름 편집: + + + + Edit: + 편집: + + + + Preview: + 미리보기: + + + + Save + 저장 + + + + Saves the pattern + 패턴 저장 + + + + Restore + 복원 + + + Reset + 초기화 + + + + Restores the saved pattern + 저장된 패턴 복원 + + + + Clear + 지우기 + + + + Deletes the name + 이름 삭제 + + + + Flameshot + + + Error + 오류 + + + + Unable to close active modal widgets + 활성 모드 위젯을 닫을 수 없습니다 + + + + URL copied to clipboard. + URL이 클립보드에 복사되었습니다. + + + + FlameshotDaemon + + + New version %1 is available + 새 버전 %1 사용 가능 + + + + You have the latest version + 최신 버전이 있습니다 + + + + Failed to get information about the latest version. + 최신 버전에 대한 정보를 얻지 못했습니다. + + + + Unable to connect via DBus + DBus를 통해 연결할 수 없습니다 + + + + GeneneralConf + + Show help message + 도움 메세지 보기 + + + Show the help message at the beginning in the capture mode. + 캡처 모드 시작에 도움 메세지 보기. + + + Show desktop notifications + 데스크톱 알림 사용 + + + Show tray icon + 트레이 아이콘 보기 + + + Show the systemtray icon + 시스템 트레이 아이콘 보기 + + + Import + 불러오기 + + + Error + 오류 + + + Unable to read file. + 파일을 읽을 수 없습니다. + + + Unable to write file. + 파일을 작성할 수 없습니다. + + + Save File + 파일을 저장 + + + Confirm Reset + 초기화 확인 + + + Are you sure you want to reset the configuration? + 설정을 초기화해도 괜찮습니까? + + + Configuration File + 설정 파일 + + + Export + 내보내기 + + + Reset + 초기화 + + + Launch at startup + startup의 적절한 번역이 필요합니다. + 컴퓨터를 시작할 때 실행 + + + Launch Flameshot + Flameshot을 실행 + + + Close after capture + 캡처 후 닫기 + + + Close after taking a screenshot + 스크린샷을 찍은 후 닫기 + + + Copy URL after upload + 업로드 이후 URL 복사 + + + Copy URL and close window after upload + 업로드 이후 URL을 복사하고 창 닫기 + + + + GeneralConf + + + + Import + 가져오기 + + + + + + + Error + 오류 + + + + Unable to read file. + 파일을 읽을 수 없습니다. + + + + + Unable to write file. + 파일을 쓸 수 없습니다. + + + + Save File + 파일 저장 + + + + Confirm Reset + 재설정 확인 + + + + Are you sure you want to reset the configuration? + 구성을 재설정하시겠습니까? + + + + Show help message + 도움말 메시지 표시 + + + Show the help message at the beginning in the capture mode. + 캡처 모드 시작에 도움 메세지 보기. + + + + Show the side panel button + 측면 패널 버튼 표시 + + + Show the side panel toggle button in the capture mode. + Show the side panel toggle button in the capture mode. + + + + Show desktop notifications + 데스크톱 알림 표시 + + + + Show tray icon + 트레이 아이콘 표시 + + + Show the systemtray icon + 시스템 트레이 아이콘 보기 + + + + Confirmation required to delete screenshot from the latest uploads + 최신 업로드에서 스크린샷을 삭제하려면 확인이 필요합니다 + + + + Configuration File + 구성 파일 + + + + Export + 내보내기 + + + + Reset + 재설정 + + + + Automatic check for updates + 업데이트 자동 확인 + + + + Allow multiple flameshot GUI instances simultaneously + 여러 개의 flameshot GUI 인스턴스 동시 허용 + + + Automatically close daemon when it is not needed + Automatically close daemon when it is not needed + + + Launch at startup + 컴퓨터를 시작할 때 실행 + + + Launch Flameshot + Flameshot을 실행 + + + + Show welcome message on launch + 시작 시 환영 메시지 표시 + + + + Use large predefined color palette + 미리 정의된 큰 색상 팔레트 사용 + + + + Copy URL after upload + 업로드 후 URL 복사 + + + Copy URL and close window after upload + 업로드 이후 URL을 복사하고 창 닫기 + + + + Save image after copy + 복사 후 이미지 저장 + + + Save image file after copying it + Save image file after copying it + + + + Show the help message at the beginning in the capture mode + 캡처 모드의 시작 부분에 도움말 메시지 표시 + + + + Use last region for GUI mode + GUI 모드에 마지막 영역 사용 + + + + Use the last region as the default selection for the next screenshot in GUI mode + GUI 모드에서 마지막 영역을 다음 스크린샷의 기본 선택으로 사용 + + + + Show the side panel toggle button in the capture mode + 캡처 모드에서 측면 패널 전환 버튼 표시 + + + + Enable desktop notifications + 데스크톱 알림 활성화 + + + + Show abort notifications + 중단 알림 표시 + + + + Enable abort notifications + 중단 알림 활성화 + + + + Show icon in the system tray + 시스템 트레이에 아이콘 표시 + + + + Use grim to capture screenshots + 스크린샷을 캡처하려면 grim 사용 + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + Grim은 화면 복사 프로토콜을 기반으로 화면을 캡처하는 유일한 wayland 유틸리티입니다. 일반적으로 Sway, hyprland 등과 같은 최소한의 wayland 창 관리자에서만 활성화됩니다. + + + + Ask for confirmation to delete screenshot from the latest uploads + 최신 업로드에서 스크린샷 삭제 확인 요청 + + + + Check for updates automatically + 자동으로 업데이트 확인 + + + + This allows you to take screenshots of Flameshot itself for example + 이를 통해 예를 들어 Flameshot 자체의 스크린샷을 찍을 수 있습니다 + + + Launch Flameshot daemon when computer is booted + Launch Flameshot daemon when computer is booted + + + + Show the welcome message box in the middle of the screen while taking a screenshot + 스크린샷을 찍을 때 화면 중앙에 환영 메시지 상자 표시 + + + + Use a large predefined color palette + 미리 정의된 큰 색상 팔레트 사용 + + + + Copy on double click + 더블 클릭 시 복사 + + + Enable Copy on Double Click + Enable Copy on Double Click + + + Copy URL and close window after uploading was successful + Copy URL and close window after uploading was successful + + + + Automatically unload from memory when it is not needed + 필요하지 않을 때 메모리에서 자동으로 로드 해제 + + + + Automatically close daemon (background process) when it is not needed + 필요하지 않을 때 데몬 (배경 프로세스)을 자동으로 닫습니다 + + + + Launch in background at startup + 시작 시 백그라운드에서 실행 + + + + Launch Flameshot daemon (background process) when computer is booted + 컴퓨터가 부팅될 때 Flameshot 데몬 (배경 프로세스) 실행 + + + + Ask before quit capture + 캡처를 중단하기 전에 묻기 + + + + Show the confirmation prompt before ESC quit + ESC 종료 전 확인 프롬프트 표시 + + + + Enable Copy to clipboard on Double Click + 더블 클릭 시 클립보드에 복사 활성화 + + + + Copy URL after uploading was successful + 업로드 후 URL 복사에 성공했습니다 + + + + After copying the screenshot, save it to a file as well + 스크린샷을 복사한 후 파일에도 저장 + + + + Save Path + 경로 저장 + + + + Change... + 변경... + + + + Use fixed path for screenshots to save + 스크린샷에 고정 경로를 사용하여 저장 + + + + Preferred save file extension: + 선호하는 저장 파일 확장자: + + + + Latest Uploads Max Size + 최신 업로드 최대 크기 + + + + Imgur Application Client ID + Imgur 응용 프로그램 클라이언트 ID + + + + Undo limit + 실행 취소 제한 + + + + Use JPG format for clipboard (PNG default) + 클립보드에 JPG 형식 사용 (PNG 기본값) + + + + Use lossy JPG format for clipboard (lossless PNG default) + 클립보드에 손실이 없는 JPG 형식 사용 (손실 없는 PNG 기본값) + + + + Copy file path after save + 저장 후 파일 경로 복사 + + + + Copy the file path to clipboard after the file is saved + 파일이 저장된 후 클립보드에 파일 경로 복사 + + + + Anti-aliasing image when zoom the pinned image + 고정된 이미지를 확대할 때 안티에일리어싱 이미지 + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + 고정된 이미지를 확대한 후, 이미지가 매끄러워지거나 픽셀화된 상태로 유지 + + + + + Upload image without confirmation + 확인 없이 이미지 업로드 + + + + Choose a Folder + 폴더 선택 + + + + Unable to write to directory. + 디렉터리에 쓸 수 없습니다. + + + + Show magnifier + 돋보기 표시 + + + + Enable a magnifier while selecting the screenshot area + 스크린샷 영역을 선택하는 동안 돋보기 활성화 + + + + Square shaped magnifier + 정사각형 돋보기 + + + + Make the magnifier to be square-shaped + 돋보기를 정사각형 모양으로 만들기 + + + + Milliseconds before geometry display hides; 0 means do not hide + 지오메트리 표시 숨기기 전 밀리초, 0은 숨기기 않음을 의미합니다 + + + + Set geometry display timeout (ms) + 지오메트리 표시 시간 초과 설정 (ms) + + + + Selection Geometry Display + 선택 지오메트리 표시 + + + + Display Location + 표시 위치 + + + + None + 없음 + + + + Top Left + 왼쪽 상단 + + + + Top Right + 오른쪽 상단 + + + + Bottom Left + 왼쪽 하단 + + + + Bottom Right + 오른쪽 하단 + + + + Center + 가운데 + + + + Quality range of 0-100; Higher number is better quality and larger file size + 품질 범위는 0-100이며, 숫자가 높을수록 품질이 좋고 파일 크기가 커집니다 + + + + JPEG Quality + JPEG 품질 + + + + Reverse arrow + 역방향 화살표 + + + + Draw the arrow head first + 화살표 머리 먼저 그리기 + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + Latest Uploads + + + Screenshots history is empty + Screenshots history is empty + + + Copy URL + URL을 복사 + + + URL copied to clipboard. + URL을 클립보드에 복사했습니다. + + + Open in browser + Open in browser + + + Confirm to delete + Confirm to delete + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Are you sure you want to delete a screenshot from the latest uploads and server? + + + + ImgS3Uploader + + URL copied to clipboard. + URL을 클립보드에 복사했습니다. + + + Error + 오류 + + + + ImgUploadDialog + + + Upload Confirmation + 업로드 확인 + + + + Do you want to upload this capture? + 이 캡처를 업로드하시겠습니까? + + + + + Upload without confirmation + 확인 없이 업로드 + + + + ImgUploader + + Delete image + 이미지를 삭제 + + + Unable to open the URL. + URL을 열 수 없습니다. + + + URL copied to clipboard. + URL을 클립보드에 복사했습니다. + + + Screenshot copied to clipboard. + 스크린샷을 클립보드에 복사했습니다. + + + Copy URL + URL을 복사 + + + Open URL + URL 열기 + + + Image to Clipboard. + 이미지를 클립보드로. + + + + ImgUploaderBase + + + Upload image + Upload image + + + + Uploading Image + 이미지 업로드 + + + + Copy URL + URL 복사 + + + + Open URL + URL 열기 + + + + Delete image + 이미지 삭제 + + + + Image to Clipboard. + 이미지를 클립보드에 복사합니다. + + + + Save image + 이미지 저장 + + + + Unable to open the URL. + URL을 열 수 없습니다. + + + + URL copied to clipboard. + URL이 클립보드에 복사되었습니다. + + + + Screenshot copied to clipboard. + 스크린샷이 클립보드에 복사되었습니다. + + + + Unable to save the screenshot to disk. + 스크린샷을 디스크에 저장할 수 없습니다. + + + + Screenshot saved. + 스크린샷이 저장되었습니다. + + + + ImgUploaderTool + + + Image Uploader + 이미지 업로더 + + + + Upload the selection + 선택 항목 업로드 + + + + ImgurUploader + + Upload to Imgur + Imgur에 업로드 + + + Uploading Image + 이미지를 업로드하는 중 + + + Copy URL + URL을 복사 + + + Open URL + URL 열기 + + + Delete image + 이미지를 삭제 + + + Image to Clipboard. + 이미지를 클립보드로. + + + + Unable to open the URL. + URL을 열 수 없습니다. + + + URL copied to clipboard. + URL을 클립보드에 복사했습니다. + + + Screenshot copied to clipboard. + 스크린샷을 클립보드에 복사했습니다. + + + + ImgurUploaderTool + + Image Uploader + 이미지 업로더 + + + Upload the selection to Imgur + Imgur에 선택영역을 업로드 + + + + InfoWindow + + + + About + 이 어플리케이션에 대하여 + + + + + Icon + Icon + + + + + License + 라이선스 + + + + + GPLv3+ + GPLv3+ + + + + + Version + Version + + + + + Flameshot v + Flameshot v + + + + + OS Info + OS Info + + + + + Copy Info + 복사 정보 + + + SPACEBAR + 스페이스바 + + + Right Click + 우클릭 + + + Mouse Wheel + 마우스 휠 + + + Move selection 1px + 선택 영역을 1px 이동 + + + Resize selection 1px + 선택 영역을 1px 조정 + + + Quit capture + 캡처를 종료 + + + Copy to clipboard + 클립보드에 복사 + + + Save selection as a file + 선택 영역을 파일로 저장 + + + Undo the last modification + 마지막 변경 되돌리기 + + + Toggle visibility of sidebar with options of the selected tool + 사이드바를 열어 선택한 도구의 옵션보기 + + + Show color picker + 색상 선택기를 표시 + + + Change the tool's thickness + 도구 두께 변경 + + + Key + 키 + + + Description + 설명 + + + <u><b>License</b></u> + <u><b>라이센스</b></u> + + + <u><b>Version</b></u> + <u><b>버전</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>단축키</b></u> + + + Available shortcuts in the screen capture mode. + 화면 캡처 모드에서 단축키를 사용할 수 있습니다. + + + + InvertTool + + + Invert + 반전 + + + + Set Inverter as the paint tool + 인버터를 페인트 도구로 설정 + + + + LineTool + + + Line + 직선 + + + + Set the Line as the paint tool + 페인트 도구로 직선을 설정 + + + + MarkerTool + + + Marker + 마커 + + + + Set the Marker as the paint tool + 페인트 도구로 마커를 설정 + + + + MoveTool + + + Move + 이동 + + + + Move the selection area + 선택 영역을 이동 + + + + PencilTool + + + Pencil + 연필 + + + + Set the Pencil as the paint tool + 페인트 도구로 연필을 설정 + + + + PinTool + + + Pin Tool + 고정 도구 + + + + Pin image on the desktop + 선택 영역을 데스크톱 위에 고정 + + + + PinWidget + + + Context menu + 컨텍스트 메뉴 + + + + Copy to clipboard + 클립보드에 복사 + + + + Save to file + 파일에 저장 + + + + Rotate Right + 오른쪽으로 회전 + + + + Rotate Left + 왼쪽으로 회전 + + + + Increase Opacity + 불투명도 증가 + + + + Decrease Opacity + 불투명도 감소 + + + + Close + 닫기 + + + + PixelateTool + + + Pixelate + 픽셀화 + + + + Set Pixelate as the paint tool. + 페인트 도구로 픽셀화를 설정합니다. + + + Set Pixelate as the paint tool + 페인트 도구로 픽셀화를 설정 + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QHotkey + + Failed to register %1. Error: %2 + Failed to register %1. Error: %2 + + + Failed to unregister %1. Error: %2 + Failed to unregister %1. Error: %2 + + + + QObject + + + Save Error + 저장 오류 + + + + + Capture saved as + 캡처를 다음으로 저장: + + + + + Capture saved to clipboard. + 캡처가 클립보드에 저장되었습니다. + + + Capture saved to clipboard + 캡처를 클립보드에 저장했습니다 + + + + Error while saving to clipboard + 클립보드에 저장하는 중 오류 발생 + + + + + Error trying to save as + 저장하려고 하는 중 오류 발생: + + + + Save screenshot + 스크린샷 저장 + + + + Path copied to clipboard as + 클립보드에 복사된 경로 + + + Saving canceled + Saving canceled + + + Save canceled + Save canceled + + + Capture is saved and copied to the clipboard as + Capture is saved and copied to the clipboard as + + + + Unable to connect via DBus + DBus에 접속할 수 없습니다 + + + + Powerful yet simple to use screenshot software. + 강력하면서도 사용하기 쉬운 스크린샷 소프트웨어입니다. + + + + See + 참조 + + + Capture the entire desktop. + Capture the entire desktop. + + + + Open the capture launcher. + 캡처 런처를 엽니다. + + + + Start a manual capture in GUI mode. + GUI 모드에서 수동 캡처를 시작합니다. + + + + Configure + 구성 + + + Capture a single screen. + Capture a single screen. + + + Path where the capture will be saved + Path where the capture will be saved + + + + Capture screenshot of all monitors at the same time. + 모든 모니터의 스크린샷을 동시에 캡처합니다. + + + + Capture a screenshot of the specified monitor. + 지정된 모니터의 스크린샷을 캡처합니다. + + + + Existing directory or new file to save to + 저장할 기존 디렉터리 또는 새 파일 + + + + Save the capture to the clipboard + 캡처를 클립보드에 저장 + + + + Pin the capture to the screen + 캡처를 화면에 고정 + + + + Upload screenshot + Upload screenshot + + + + Delay time in milliseconds + 지연 시간 (밀리초) + + + + Repeat screenshot with previously selected region + 이전에 선택한 영역으로 스크린샷 반복 + + + + Screenshot region to select + 선택할 스크린샷 영역 + + + + Set the filename pattern + 파일 이름 패턴 설정 + + + + Accept capture as soon as a selection is made + 선택이 이루어지면 즉시 캡처 수락 + + + + Enable or disable the trayicon + 트레이 아이콘 활성화 또는 비활성화 + + + + Enable or disable run at startup + 시작 시 실행 활성화 또는 비활성화 + + + + Enable or disable the notifications + 알림 활성화 또는 비활성화 + + + + Check the configuration for errors + 구성에 오류가 있는지 확인 + + + + Show the help message in the capture mode + 캡처 모드에서 도움말 메시지 표시 + + + + Define the main UI color + 기본 UI 색상 정의 + + + + Define the contrast UI color + 대비 UI 색상 정의 + + + + Print raw PNG capture + 원시 PNG 캡처 인쇄 + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + 선택 항목의 지오메트리를 WxH+X+Y 형식으로 인쇄합니다. 원시가 지정된 경우 아무 작업도 수행하지 않습니다 + + + + Define the screen to capture (starting from 0) + 캡처할 화면을 정의합니다 (0부터 시작) + + + + Invalid delay, it must be a number greater than 0 + 잘못된 지연, 0보다 큰 숫자여야 합니다 + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + 잘못된 영역, 'WxH+X+Y' 또는 '모두' 또는 'screen0/screen1/...'를 사용합니다. + + + + Invalid path, must be an existing directory or a new file in an existing directory + 잘못된 경로, 기존 디렉터리 또는 기존 디렉터리의 새 파일이어야 합니다 + + + Define the screen to capture + Define the screen to capture + + + + default: screen containing the cursor + 기본값: 커서가 포함된 화면 + + + + Screen number + Screen number + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + 색상이 잘못되었습니다. 이 플래그는 다음 형식을 지원합니다: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- '파랑' 또는 '빨강'과 같은 명명된 색상 +'#FFF'에서처럼 '#' 기호를 피해야 할 수도 있습니다 + + + Invalid delay, it must be higher than 0 + Invalid delay, it must be higher than 0 + + + + Invalid screen number, it must be non negative + 잘못된 화면 번호입니다. 음수가 아니어야 합니다 + + + Invalid path, it must be a real path in the system + Invalid path, it must be a real path in the system + + + + Invalid value, it must be defined as 'true' or 'false' + 잘못된 값이므로 '참' 또는 '거짓'으로 정의해야 합니다 + + + + Error + 오류 + + + + Unable to write in + 작성할 수 없습니다: + + + + Requested screen exceeds screen count + 요청된 화면이 화면 수를 초과합니다 + + + + Full screen screenshot pinned to screen + 화면에 고정된 전체 화면 스크린샷 + + + URL copied to clipboard. + URL을 클립보드에 복사했습니다. + + + + Options + Options + + + Arguments + Arguments + + + arguments + arguments + + + + Subcommands + 하위 명령어 + + + + subcommands + 하위 명령어 + + + + Usage + 사용법 + + + + options + options + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + 기본적으로 Flameshot을 백그라운드에서 실행하고 설정을 위한 트레이 아이콘을 추가합니다. + + + Toggle side panel + Toggle side panel + + + Resize selection left 1px + Resize selection left 1px + + + Resize selection right 1px + Resize selection right 1px + + + Resize selection up 1px + Resize selection up 1px + + + Resize selection down 1px + Resize selection down 1px + + + Select entire screen + Select entire screen + + + Move selection left 1px + Move selection left 1px + + + Move selection right 1px + Move selection right 1px + + + Move selection up 1px + Move selection up 1px + + + Move selection down 1px + Move selection down 1px + + + Commit text in text area + Commit text in text area + + + Delete current tool + Delete current tool + + + + Quit capture + 캡처 종료 + + + + Screenshot history + 스크린샷 기록 + + + + Capture screen + 화면 캡처 + + + + Show color picker + 색상 선택기 표시 + + + + Change the tool's size + 도구 크기 변경 + + + Change the tool's thickness + 도구 두께 변경 + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + 안녕하세요, 여기 있습니다! 트레이에 있는 아이콘을 클릭해서 스크린샷을 찍거나, 마우스 오른쪽 버튼을 클릭해서 더 많은 옵션을 확인하세요. + + + + RectangleTool + + + Rectangle + 직사각형 + + + + Set the Rectangle as the paint tool + 페인트 도구로 직사각형을 설정 + + + + RedoTool + + + Redo + 되돌리기 + + + + Redo the next modification + 다음 변경을 되돌리기 + + + + SaveTool + + + Save + 저장 + + + + Save screenshot to a file + 스크린샷을 파일에 저장 + + + Save the capture + 캡처를 저장 + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + 화면 캡처 어댑터는 wayland의 화면 캡처 구성 요소로 그림이 필요합니다. 화면 캡처 구성 요소가 누락된 경우 설치해 주세요! + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + useGrimAdapter 설정이 활성화되지 않은 경우 dbus 프로토콜이 사용됩니다. 경유지에서 dbus 프로토콜을 사용하는 것은 권장되지 않습니다. flameshot.ini에서 useGrimAdapter 설정을 활성화하여 그림 기반의 일반 경유지 스크린샷 어댑터를 활성화하는 것이 좋습니다 + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + grim의 스크린샷 구성 요소는 wlroot 기반으로 구현되었으며, GNOME 또는 유사한 데스크톱 환경에서는 사용되지 않을 수 있습니다 + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + 데스크톱 환경을 감지할 수 없습니다 (GNOME? KDE? Qile? Sway? ...) + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + 힌트: XDG_CURRENT_DESKTOP 환경 변수를 설정해 보세요. + + + + Unable to capture screen + 화면을 캡처할 수 없음 + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + selection에 대한 적절한 번역이 필요합니다. + 직사각형 Selection + + + + Set Selection as the paint tool + 페인트 도구로 직사각형 선택을 설정 + + + + SetShortcutDialog + + + Set Shortcut + 단축키 설정 + + + + Enter new shortcut to change + 변경할 새 단축키 입력 + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Esc 키를 눌러 취소하거나 ⌘+Backspace 키를 눌러 키보드 바로 가기를 비활성화합니다. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Esc 키를 눌러 취소하거나 백스페이스 키를 눌러 키보드 단축키를 비활성화합니다. + + + + + Flameshot must be restarted for changes to take effect. + 변경 사항을 적용하려면 Flameshot을 재시작해야 합니다. + + + + ShortcutsWidget + + + Hot Keys + 단축키 + + + + Available shortcuts in the screen capture mode. + 화면 캡처 모드에서 사용 가능한 단축키입니다. + + + + Description + 설명 + + + + Key + 키 + + + + Left Double-click + 왼쪽 더블 클릭 + + + + Toggle side panel + 측면 패널 전환 + + + + Grab a color from the screen + + + + + Resize selection left 1px + 선택 영역 왼쪽 1px 크기 조정 + + + + Resize selection right 1px + 선택 영역 크기를 오른쪽 1px 조정 + + + + Resize selection up 1px + 선택 영역 크기를 위쪽 1px 조정 + + + + Resize selection down 1px + 선택 영역 크기를 아래쪽 1px 조정 + + + + Symmetrically decrease width by 2px + 대칭적으로 너비 2px 감소 + + + + Symmetrically increase width by 2px + 대칭적으로 너비 2px 증가 + + + + Symmetrically increase height by 2px + 대칭적으로 높이 2px 증가 + + + + Symmetrically decrease height by 2px + 대칭적으로 높이 2px 감소 + + + + Select entire screen + 전체 화면 선택 + + + + Move selection left 1px + 선택 항목을 왼쪽으로 1px 이동 + + + + Move selection right 1px + 선택 영역을 오른쪽으로 1px 이동 + + + + Move selection up 1px + 선택 영역을 위로 1px 이동 + + + + Move selection down 1px + 선택 영역을 아래로 1px 이동 + + + + Commit text in text area + 텍스트 영역에 텍스트 적용 + + + + Delete selected drawn object + 선택한 그려진 객체 삭제 + + + + Cancel current selection + 현재 선택 영역 취소 + + + Delete current tool + Delete current tool + + + + Capture screen + 화면 캡처 + + + + Screenshot history + 스크린샷 기록 + + + + SidePanelWidget + + Active thickness: + 활성 두께: + + + Active color: + 활성 색상: + + + Press ESC to cancel + ESC를 눌러 취소 + + + + Active tool size: + 활성 도구 크기: + + + + Active Color: + 활성 색상: + + + + Grab Color + 색상 잡기 + + + + Display grid + 격자 표시 + + + + SizeDecreaseTool + + + Decrease Tool Size + 도구 크기 줄이기 + + + + Decrease the size of the other tools + 다른 도구의 크기 줄이기 + + + + SizeIncreaseTool + + + Increase Tool Size + 도구 크기 늘리기 + + + + Increase the size of the other tools + 다른 도구의 크기 늘리기 + + + + SizeIndicatorTool + + Selection Size Indicator + 선택 크기 표시기 + + + Show X and Y dimensions of the selection + Show X and Y dimensions of the selection + + + Show the dimensions of the selection (X Y) + 선택 범위의 치수 (X Y)를 표시 + + + + StrftimeChooserWidget + + + Century (00-99) + 세기 (00-99) + + + + Year (00-99) + 년도 (00-99) + + + + Year (2000) + 년도 (2000) + + + + Month Name (jan) + 월 이름 (1월) + + + + Month Name (january) + 월 이름 (1월) + + + + Month (01-12) + 월 (01-12) + + + + Week Day (1-7) + 주중 (1-7) + + + + Week (01-53) + 주 (01-53) + + + + Day Name (mon) + 요일 이름 (월) + + + + Day Name (monday) + 요일 이름 (월요일) + + + + Day (01-31) + 일 (01-31) + + + + Day of Month (1-31) + 매월의 일 (1-31) + + + + Day (001-366) + 일 (001-366) + + + + Time (%H-%M-%S) + 시간 (%H-%M-%S) + + + + Time (%H-%M) + 시간 (%H-%M) + + + + Hour (00-23) + 시간 (00-23) + + + + Hour (01-12) + 시간 (01-12) + + + + Minute (00-59) + 분 (00-59) + + + + Second (00-59) + 초 (00-59) + + + + Full Date (%m/%d/%y) + 전체 날짜 (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + 전체 날짜 (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + + + + + SystemNotification + + + Flameshot Info + Flameshot 정보 + + + + TextConfig + + + StrikeOut + 취소선 + + + + Underline + 밑줄 + + + + Bold + 굵게 + + + + Italic + 기울임꼴 + + + + Left Align + 왼쪽 정렬 + + + + Center Align + 가운데 정렬 + + + + Right Align + 오른쪽 정렬 + + + + TextTool + + + Text + 텍스트 + + + + Add text to your capture + 캡처에 텍스트 추가 + + + + TrayIcon + + + &Take Screenshot + 스크린샷 찍기(&T) + + + + &Open Launcher + 런처 열기(&O) + + + + &Configuration + 구성(&C) + + + + &About + 정보(&A) + + + + Check for updates + 업데이트 확인 + + + + New version %1 is available + 새 버전 %1 사용 가능 + + + + &Quit + 종료(&Q) + + + + &Latest Uploads + 최신 업로드(&L) + + + + &Open Save Path + 저장 경로 열기(&O) + + + + UIcolorEditor + + UI Color Editor + UI 컬러 편집기 + + + + Change the color moving the selectors and see the changes in the preview buttons. + 선택기를 이동하는 색상을 변경하고 미리보기 버튼의 변경 사항을 확인합니다. + + + + Select a Button to modify it + 버튼을 선택하여 수정 + + + + Main Color + 기본 색상 + + + + Click on this button to set the edition mode of the main color. + 이 버튼을 클릭하여 기본 색상의 에디션 모드를 설정하세요. + + + + Contrast Color + 대비 색상 + + + + Click on this button to set the edition mode of the contrast color. + 이 버튼을 클릭하여 대비 색상의 편집 모드를 설정합니다. + + + + UndoTool + + + Undo + 실행 취소 + + + + Undo the last modification + 마지막 수정 실행 취소 + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + 새 Flameshot 버전 %1 사용 가능 + + + + Ignore + 무시 + + + + Later + 나중에 + + + + Update + 업데이트 + + + + UploadHistory + + + Upload History + 업로드 기록 + + + + Screenshots history is empty + 스크린샷 기록이 비어 있습니다 + + + + UploadLineItem + + + Form + Form + + + + TextLabel + 텍스트 레이블 + + + + Copy URL + URL 복사 + + + + Open In Browser + 브라우저에서 열기 + + + + Confirm to delete + 삭제 확인 + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + 최신 업로드 및 서버에서 스크린샷을 삭제하시겠습니까? + + + + UtilityPanel + + + Close + 닫기 + + + + <Empty> + <비어 있음> + + + + VisualsEditor + + + Opacity of area outside selection: + 선택을 벗어난 영역의 불투명성: + + + + UI Color Editor + UI 색상 편집기 + + + + Colorpicker Editor + 색상 선택기 편집기 + + + + Button Selection + 버튼 선택 + + + + Select All + 모두 선택 + + + + color_widgets::ColorDialog + + + Pick + 선택 + + + + color_widgets::ColorPalette + + + Unnamed + 이름 없음 + + + + color_widgets::ColorPaletteModel + + + Unnamed + 이름 없음 + + + + %1 (%2 colors) + %1 (%2 색) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + 파일에서 새 팔레트 열기 + + + + + Create a new palette + 새 팔레트 만들기 + + + + + Duplicate the current palette + 현재 팔레트 복제 + + + + + Delete the current palette + 현재 팔레트 삭제 + + + + + Revert changes to the current palette + 현재 팔레트로 변경 사항 되돌리기 + + + + + Save changes to the current palette + 현재 팔레트에 변경 사항 저장 + + + + + Add a color to the palette + 팔레트에 색상 추가 + + + + + Remove the selected color from the palette + 팔레트에서 선택한 색상 제거 + + + + + New Palette + 새 팔레트 + + + + + Name + 이름 + + + + GIMP Palettes (*.gpl) + GIMP 팔레트 (*.gpl) + + + + Palette Image (%1) + 팔레트 이미지 (%1) + + + + All Files (*) + 모든 파일 (*) + + + + + Open Palette + 팔레트 열기 + + + + Failed to load the palette file +%1 + 팔레트 파일을 로드하지 못했습니다 +%1 + + + + color_widgets::GradientEditor + + + Add Color + 색상 추가 + + + + Remove Color + 색상 제거 + + + + Edit Color... + 색상 편집... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 색) + + + + color_widgets::Swatch + + + Clear Color + 색 지우기 + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_nb_NO.ts b/data/translations/Internationalization_nb_NO.ts new file mode 100644 index 0000000..2a1cdbb --- /dev/null +++ b/data/translations/Internationalization_nb_NO.ts @@ -0,0 +1,3161 @@ + + + + + AbstractWidgetList + + + Add New + Add New + + + + Move Up + Move Up + + + + Move Down + Move Down + + + + Remove + Remove + + + + AcceptTool + + + Accept + Accept + + + + Accept the capture + Accept the capture + + + + AppLauncher + + + App Launcher + App Launcher + + + + Choose an app to open the capture + Choose an app to open the capture + + + + AppLauncherWidget + + + Open With + Open With + + + + Launch in terminal + Launch in terminal + + + + Keep open after selection + Keep open after selection + + + + + Error + Error + + + + Unable to launch in terminal. + Unable to launch in terminal. + + + + Unable to write in + Unable to write in + + + + ArrowTool + + + Arrow + Arrow + + + + Set the Arrow as the paint tool + Set the Arrow as the paint tool + + + + BlurTool + + Blur + Desenfocament + + + Set Blur as the paint tool + Estableix el desenfocament com a eina de dibuix + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Capture Mode</b> + + + + Rectangular Region + Rectangular Region + + + + Full Screen (Current Display) + Full Screen (Current Display) + + + + Full Screen (All Monitors) + Full Screen (All Monitors) + + + + No Delay + No Delay + + + + second + second + + + + + + seconds + seconds + + + + + Take new screenshot + Take new screenshot + + + + + Area: + Area: + + + + + Capture Launcher + Capture Launcher + + + + + TextLabel + TextLabel + + + + + Capture Mode + Capture Mode + + + + + Delay: + Delay: + + + + + WxH+x+y + WxH+x+y + + + + CaptureWidget + + + Unable to capture screen + Impossible capturar la pantalla + Unable to capture screen + + + + Mouse + Mouse + + + + Select screenshot area + Select screenshot area + + + + Mouse Wheel + Roda del ratolí + + + + Change tool size + Change tool size + + + + Right Click + Clic dret + + + + Show color picker + Mostra el selector de color + + + + Open side panel + Open side panel + + + + Esc + Esc + + + + Exit + Exit + + + + Quit Capture + + + + + Are you sure you want to quit capture? + + + + + Do not show this again + + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + Configuration error resolved. Launch `flameshot gui` again to apply it. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + + + + Tool Settings + Tool Settings + + + + CircleCountTool + + + Circle Counter + Circle Counter + + + + Add an autoincrementing counter bubble + Add an autoincrementing counter bubble + + + + CircleTool + + + Circle + Circle + + + + Set the Circle as the paint tool + Set the Circle as the paint tool + + + + ColorDialog + + + + Select Color + Select Color + + + + + Saturation + Saturation + + + + + Hue + Hue + + + + + Hex + Hex + + + + + Blue + Blue + + + + + Value + Value + + + + + Green + Green + + + + + Alpha + Alpha + + + + + Red + Red + + + + ColorGrabWidget + + + Accept color + Accept color + + + + Enter or Left Click + Enter or Left Click + + + + Precisely select color + Precisely select color + + + + Hold Left Click + Hold Left Click + + + + Toggle magnifier + Toggle magnifier + + + + Space or Right Click + Space or Right Click + + + + Cancel + Cancel + + + + Esc + Esc + + + + ColorPickerEditor + + + Edit Preset: + Edit Preset: + + + + Enter color to update preset + Enter color to update preset + + + + Update + Update + + + + Press button to update the selected preset + Press button to update the selected preset + + + + Delete + Delete + + + + Press button to delete the selected preset + Press button to delete the selected preset + + + + Add Preset: + Add Preset: + + + + Enter color manually or select it using the color-wheel + Enter color manually or select it using the color-wheel + + + + Add + Add + + + + Press button to add preset + Press button to add preset + + + + + Error + Error + + + + Unable to add preset. Maximum limit reached. + Unable to add preset. Maximum limit reached. + + + + Unable to remove preset. Minimum limit reached. + Unable to remove preset. Minimum limit reached. + + + + ConfigErrorDetails + + + Configuration errors + Configuration errors + + + + ConfigHandler + + + Unrecognized setting: '%1' + + Unrecognized setting: '%1' + + + + + Unrecognized shortcut name: '%1'. + + Unrecognized shortcut name: '%1'. + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + + + + Bad value in '%1'. Expected: %2 + + Bad value in '%1'. Expected: %2 + + + + + You have successfully resolved the configuration error. + You have successfully resolved the configuration error. + + + + The configuration contains an error. Open configuration to resolve. + The configuration contains an error. Open configuration to resolve. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + Bad config key '%1' in ConfigHandler. Please report this as a bug. + + + + ConfigResolver + + + Resolve configuration errors + Resolve configuration errors + + + + <b>You must resolve all errors before continuing:</b> + <b>You must resolve all errors before continuing:</b> + + + + Reset + Reset + + + + Reset to the default value. + Reset to the default value. + + + + Remove + Remove + + + + Remove this setting. + Remove this setting. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + + + + Resolve all + Resolve all + + + + Resolve all listed errors. + Resolve all listed errors. + + + + Details + Details + + + + ConfigWindow + + + Configuration + Configuration + + + + Interface + Interface + + + + Filename Editor + Filename Editor + + + + General + General + + + + Shortcuts + Shortcuts + + + + Resolve + Resolve + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>Configuration file has errors. Resolve them before continuing.</b> + + + + Controller + + New version %1 is available + New version %1 is available + + + You have the latest version + You have the latest version + + + Failed to get information about the latest version. + Failed to get information about the latest version. + + + Error + Error + + + Unable to close active modal widgets + Unable to close active modal widgets + + + &Open Launcher + &Open Launcher + + + &Configuration + &Configuration + + + &About + &About + + + Check for updates + Check for updates + + + &Latest Uploads + &Latest Uploads + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + &Information + &Informació + + + &Quit + &Quit + + + &Take Screenshot + &Take Screenshot + + + + CopyTool + + + Copy + Copy + + + + Copy selection to clipboard + Copy selection to clipboard + + + Copy the selection into the clipboard + Copy the selection into the clipboard + + + + DBusUtils + + Unable to connect via DBus + Unable to connect via DBus + + + + ExitTool + + + Exit + Exit + + + + Leave the capture screen + Leave the capture screen + + + + FileNameEditor + + + Edit the name of your captures: + Edit the name of your captures: + + + + Edit: + Edit: + + + + Preview: + Preview: + + + + Save + Save + + + + Saves the pattern + Saves the pattern + + + + Restore + Restore + + + Reset + Reset + + + + Restores the saved pattern + Restores the saved pattern + + + + Clear + Clear + + + + Deletes the name + Deletes the name + + + + Flameshot + + + Error + Error + + + + Unable to close active modal widgets + Unable to close active modal widgets + + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + + FlameshotDaemon + + + New version %1 is available + New version %1 is available + + + + You have the latest version + You have the latest version + + + + Failed to get information about the latest version. + Failed to get information about the latest version. + + + + Unable to connect via DBus + Unable to connect via DBus + + + + GeneneralConf + + Show help message + Mostra el missatge d'ajuda + + + Show the help message at the beginning in the capture mode. + Mostra el missatge d'ajuda en iniciar el mode de captura. + + + Show desktop notifications + Mostra les notificacions d'escriptori + + + Show tray icon + Mostra la icona en la barra de tasques + + + Show the systemtray icon + Mostra la icona en la barra de tasques + + + Import + Importar + + + Error + Error + + + Unable to read file. + Impossible llegir el fitxer. + + + Unable to write file. + Impossible escriure al fitxer. + + + Save File + Guardar Arxiu + + + Confirm Reset + Confirmar Reset + + + Are you sure you want to reset the configuration? + Esteu segur que voleu reiniciar la configuració? + + + Configuration File + Fitxer de Configuració + + + Export + Exportar + + + Reset + Reset + + + Launch at startup + Llançament a l'inici + + + + GeneralConf + + + + Import + Importar + + + + + + + Error + Error + + + + Unable to read file. + Impossible llegir el fitxer. + + + + + Unable to write file. + Impossible escriure al fitxer. + + + + Save File + Guardar Arxiu + + + + Confirm Reset + Confirmar Reset + + + + Are you sure you want to reset the configuration? + Esteu segur que voleu reiniciar la configuració? + + + + Show help message + Mostra el missatge d'ajuda + + + Show the help message at the beginning in the capture mode. + Mostra el missatge d'ajuda en iniciar el mode de captura. + + + + Show the side panel button + Show the side panel button + + + Show the side panel toggle button in the capture mode. + Show the side panel toggle button in the capture mode. + + + + Show desktop notifications + Mostra les notificacions d'escriptori + + + + Show tray icon + Mostra la icona en la barra de tasques + + + Show the systemtray icon + Mostra la icona en la barra de tasques + + + + Confirmation required to delete screenshot from the latest uploads + Confirmation required to delete screenshot from the latest uploads + + + + Configuration File + Fitxer de Configuració + + + + Export + Exportar + + + + Reset + Reset + + + + Automatic check for updates + Automatic check for updates + + + + Allow multiple flameshot GUI instances simultaneously + Allow multiple flameshot GUI instances simultaneously + + + Automatically close daemon when it is not needed + Automatically close daemon when it is not needed + + + Launch at startup + Llançament a l'inici + + + Launch Flameshot + Launch Flameshot + + + + Show welcome message on launch + Show welcome message on launch + + + + Use large predefined color palette + Use large predefined color palette + + + + Copy URL after upload + Copy URL after upload + + + Copy URL and close window after upload + Copy URL and close window after upload + + + + Save image after copy + Save image after copy + + + Save image file after copying it + Save image file after copying it + + + + Show the help message at the beginning in the capture mode + Show the help message at the beginning in the capture mode + + + + Use last region for GUI mode + Use last region for GUI mode + + + + Use the last region as the default selection for the next screenshot in GUI mode + Use the last region as the default selection for the next screenshot in GUI mode + + + + Show the side panel toggle button in the capture mode + Show the side panel toggle button in the capture mode + + + + Enable desktop notifications + Enable desktop notifications + + + + Show abort notifications + + + + + Enable abort notifications + + + + + Show icon in the system tray + Show icon in the system tray + + + + Use grim to capture screenshots + + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + + + + + Ask for confirmation to delete screenshot from the latest uploads + Ask for confirmation to delete screenshot from the latest uploads + + + + Check for updates automatically + Check for updates automatically + + + + This allows you to take screenshots of Flameshot itself for example + This allows you to take screenshots of Flameshot itself for example + + + Launch Flameshot daemon when computer is booted + Launch Flameshot daemon when computer is booted + + + + Show the welcome message box in the middle of the screen while taking a screenshot + Show the welcome message box in the middle of the screen while taking a screenshot + + + + Use a large predefined color palette + Use a large predefined color palette + + + + Copy on double click + Copy on double click + + + Enable Copy on Double Click + Enable Copy on Double Click + + + Copy URL and close window after uploading was successful + Copy URL and close window after uploading was successful + + + + Automatically unload from memory when it is not needed + + + + + Automatically close daemon (background process) when it is not needed + + + + + Launch in background at startup + + + + + Launch Flameshot daemon (background process) when computer is booted + + + + + Ask before quit capture + + + + + Show the confirmation prompt before ESC quit + + + + + Enable Copy to clipboard on Double Click + + + + + Copy URL after uploading was successful + + + + + After copying the screenshot, save it to a file as well + After copying the screenshot, save it to a file as well + + + + Save Path + Save Path + + + + Change... + Change... + + + + Use fixed path for screenshots to save + Use fixed path for screenshots to save + + + + Preferred save file extension: + Preferred save file extension: + + + + Latest Uploads Max Size + Latest Uploads Max Size + + + + Imgur Application Client ID + Imgur Application Client ID + + + + Undo limit + Undo limit + + + + Use JPG format for clipboard (PNG default) + Use JPG format for clipboard (PNG default) + + + + Use lossy JPG format for clipboard (lossless PNG default) + + + + + Copy file path after save + Copy file path after save + + + + Copy the file path to clipboard after the file is saved + Copy the file path to clipboard after the file is saved + + + + Anti-aliasing image when zoom the pinned image + Anti-aliasing image when zoom the pinned image + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + After zooming the pinned image, should the image get smoothened or stay pixelated + + + + + Upload image without confirmation + Upload image without confirmation + + + + Choose a Folder + Choose a Folder + + + + Unable to write to directory. + Unable to write to directory. + + + + Show magnifier + Show magnifier + + + + Enable a magnifier while selecting the screenshot area + Enable a magnifier while selecting the screenshot area + + + + Square shaped magnifier + Square shaped magnifier + + + + Make the magnifier to be square-shaped + Make the magnifier to be square-shaped + + + + Milliseconds before geometry display hides; 0 means do not hide + + + + + Set geometry display timeout (ms) + + + + + Selection Geometry Display + + + + + Display Location + + + + + None + + + + + Top Left + + + + + Top Right + + + + + Bottom Left + + + + + Bottom Right + + + + + Center + + + + + Quality range of 0-100; Higher number is better quality and larger file size + + + + + JPEG Quality + + + + + Reverse arrow + + + + + Draw the arrow head first + + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + Latest Uploads + + + Screenshots history is empty + Screenshots history is empty + + + Copy URL + Copia l'URL + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Open in browser + Open in browser + + + Confirm to delete + Confirm to delete + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Are you sure you want to delete a screenshot from the latest uploads and server? + + + + ImgS3Uploader + + Uploading Image + S'està pujant la imatge + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Error + Error + + + + ImgUploadDialog + + + Upload Confirmation + Upload Confirmation + + + + Do you want to upload this capture? + Do you want to upload this capture? + + + + + Upload without confirmation + Upload without confirmation + + + + ImgUploader + + Uploading Image + S'està pujant la imatge + + + Unable to open the URL. + No es pot obrir l'URL. + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + Copy URL + Copia l'URL + + + Open URL + Obri l'URL + + + Image to Clipboard. + Imatge al porta-retalls. + + + + ImgUploaderBase + + + Upload image + Upload image + + + + Uploading Image + S'està pujant la imatge + + + + Copy URL + Copia l'URL + + + + Open URL + Obri l'URL + + + + Delete image + Delete image + + + + Image to Clipboard. + Imatge al porta-retalls. + + + + Save image + Save image + + + + Unable to open the URL. + No es pot obrir l'URL. + + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + + Unable to save the screenshot to disk. + Unable to save the screenshot to disk. + + + + Screenshot saved. + Screenshot saved. + + + + ImgUploaderTool + + + Image Uploader + Image Uploader + + + + Upload the selection + Upload the selection + + + + ImgurUploader + + Upload to Imgur + Upload to Imgur + + + Uploading Image + S'està pujant la imatge + + + Copy URL + Copia l'URL + + + Open URL + Obri l'URL + + + Delete image + Delete image + + + Image to Clipboard. + Imatge al porta-retalls. + + + + Unable to open the URL. + No es pot obrir l'URL. + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + + ImgurUploaderTool + + Image Uploader + Image Uploader + + + Upload the selection to Imgur + Upload the selection to Imgur + + + + InfoWindow + + + + About + About + + + + + Icon + Icon + + + + + License + License + + + + + GPLv3+ + GPLv3+ + + + + + Version + Version + + + + + Flameshot v + Flameshot v + + + + + OS Info + OS Info + + + + + Copy Info + Copy Info + + + Right Click + Clic dret + + + Mouse Wheel + Roda del ratolí + + + Move selection 1px + Mou la selecció 1 px + + + Resize selection 1px + Redimensiona la selecció 1 px + + + Quit capture + Ix de la captura + + + Copy to clipboard + Copia al porta-retalls + + + Save selection as a file + Guarda la selecció com a fitxer + + + Undo the last modification + Desfés l'última modificació + + + Show color picker + Mostra el selector de color + + + Change the tool's thickness + Canvia el gruix de l'eina + + + Key + Tecla + + + Description + Descripció + + + <u><b>License</b></u> + <u><b>License</b></u> + + + <u><b>Version</b></u> + <u><b>Version</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Dreceres</b></u> + + + Available shortcuts in the screen capture mode. + Dreceres disponibles en el mode de captura de pantalla. + + + + InvertTool + + + Invert + Invert + + + + Set Inverter as the paint tool + Set Inverter as the paint tool + + + + LineTool + + + Line + Line + + + + Set the Line as the paint tool + Set the Line as the paint tool + + + + MarkerTool + + + Marker + Marker + + + + Set the Marker as the paint tool + Set the Marker as the paint tool + + + + MoveTool + + + Move + Move + + + + Move the selection area + Move the selection area + + + + PencilTool + + + Pencil + Pencil + + + + Set the Pencil as the paint tool + Set the Pencil as the paint tool + + + + PinTool + + + Pin Tool + Pin Tool + + + + Pin image on the desktop + Pin image on the desktop + + + + PinWidget + + + Context menu + Context menu + + + + Copy to clipboard + Copia al porta-retalls + + + + Save to file + Save to file + + + + Rotate Right + + + + + Rotate Left + + + + + Increase Opacity + + + + + Decrease Opacity + + + + + Close + Close + + + + PixelateTool + + + Pixelate + Pixelate + + + + Set Pixelate as the paint tool. + + + + Set Pixelate as the paint tool + Set Pixelate as the paint tool + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QHotkey + + Failed to register %1. Error: %2 + Failed to register %1. Error: %2 + + + Failed to unregister %1. Error: %2 + Failed to unregister %1. Error: %2 + + + + QObject + + + + Capture saved to clipboard. + Capture saved to clipboard. + + + + Error while saving to clipboard + Error while saving to clipboard + + + + Save screenshot + Save screenshot + + + + Path copied to clipboard as + Path copied to clipboard as + + + Saving canceled + Saving canceled + + + Save canceled + Save canceled + + + Capture is saved and copied to the clipboard as + Capture is saved and copied to the clipboard as + + + + Save Error + Save Error + + + + + Capture saved as + Capture saved as + + + + + Error trying to save as + Error trying to save as + + + + Unable to connect via DBus + Unable to connect via DBus + + + + Powerful yet simple to use screenshot software. + Powerful yet simple to use screenshot software. + + + + See + See + + + Capture the entire desktop. + Capture the entire desktop. + + + + Open the capture launcher. + Open the capture launcher. + + + + Start a manual capture in GUI mode. + Start a manual capture in GUI mode. + + + + Configure + Configure + + + Capture a single screen. + Capture a single screen. + + + Path where the capture will be saved + Path where the capture will be saved + + + + Capture screenshot of all monitors at the same time. + + + + + Capture a screenshot of the specified monitor. + + + + + Existing directory or new file to save to + Existing directory or new file to save to + + + + Save the capture to the clipboard + Save the capture to the clipboard + + + + Pin the capture to the screen + Pin the capture to the screen + + + + Upload screenshot + Upload screenshot + + + + Delay time in milliseconds + Delay time in milliseconds + + + + Repeat screenshot with previously selected region + Repeat screenshot with previously selected region + + + + Screenshot region to select + Screenshot region to select + + + + Set the filename pattern + Set the filename pattern + + + + Accept capture as soon as a selection is made + Accept capture as soon as a selection is made + + + + Enable or disable the trayicon + Enable or disable the trayicon + + + + Enable or disable run at startup + Enable or disable run at startup + + + + Enable or disable the notifications + + + + + Check the configuration for errors + Check the configuration for errors + + + + Show the help message in the capture mode + Show the help message in the capture mode + + + + Define the main UI color + Define the main UI color + + + + Define the contrast UI color + Define the contrast UI color + + + + Print raw PNG capture + Print raw PNG capture + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + + + + Define the screen to capture (starting from 0) + Define the screen to capture (starting from 0) + + + + Invalid delay, it must be a number greater than 0 + Invalid delay, it must be a number greater than 0 + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + + + + Invalid path, must be an existing directory or a new file in an existing directory + Invalid path, must be an existing directory or a new file in an existing directory + + + Define the screen to capture + Define the screen to capture + + + + default: screen containing the cursor + default: screen containing the cursor + + + + Screen number + Screen number + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + + + Invalid delay, it must be higher than 0 + Invalid delay, it must be higher than 0 + + + + Invalid screen number, it must be non negative + Invalid screen number, it must be non negative + + + Invalid path, it must be a real path in the system + Invalid path, it must be a real path in the system + + + + Invalid value, it must be defined as 'true' or 'false' + Invalid value, it must be defined as 'true' or 'false' + + + + Error + Error + + + + Unable to write in + Unable to write in + + + + Requested screen exceeds screen count + Requested screen exceeds screen count + + + + Full screen screenshot pinned to screen + Full screen screenshot pinned to screen + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + + Options + Options + + + Arguments + Arguments + + + arguments + arguments + + + + Subcommands + + + + + subcommands + + + + + Usage + Usage + + + + options + options + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Per default runs Flameshot in the background and adds a tray icon for configuration. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + + + Toggle side panel + Toggle side panel + + + Resize selection left 1px + Resize selection left 1px + + + Resize selection right 1px + Resize selection right 1px + + + Resize selection up 1px + Resize selection up 1px + + + Resize selection down 1px + Resize selection down 1px + + + Select entire screen + Select entire screen + + + Move selection left 1px + Move selection left 1px + + + Move selection right 1px + Move selection right 1px + + + Move selection up 1px + Move selection up 1px + + + Move selection down 1px + Move selection down 1px + + + Commit text in text area + Commit text in text area + + + Delete current tool + Delete current tool + + + + Quit capture + Ix de la captura + + + + Screenshot history + Screenshot history + + + + Capture screen + Capture screen + + + + Show color picker + Mostra el selector de color + + + + Change the tool's size + Change the tool's size + + + Change the tool's thickness + Canvia el gruix de l'eina + + + + RectangleTool + + + Rectangle + Rectangle + + + + Set the Rectangle as the paint tool + Set the Rectangle as the paint tool + + + + RedoTool + + + Redo + Redo + + + + Redo the next modification + Redo the next modification + + + + SaveTool + + + Save + Save + + + + Save screenshot to a file + Save screenshot to a file + + + Save the capture + Save the capture + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + + + + Unable to capture screen + Unable to capture screen + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + Rectangular Selection + + + + Set Selection as the paint tool + Set Selection as the paint tool + + + + SetShortcutDialog + + + Set Shortcut + Set Shortcut + + + + Enter new shortcut to change + Enter new shortcut to change + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Press Esc to cancel or Backspace to disable the keyboard shortcut. + + + + + Flameshot must be restarted for changes to take effect. + Flameshot must be restarted for changes to take effect. + + + + ShortcutsWidget + + + Hot Keys + Hot Keys + + + + Available shortcuts in the screen capture mode. + Dreceres disponibles en el mode de captura de pantalla. + + + + Description + Descripció + + + + Key + Tecla + + + + Left Double-click + Left Double-click + + + + Toggle side panel + Toggle side panel + + + + Grab a color from the screen + + + + + Resize selection left 1px + Resize selection left 1px + + + + Resize selection right 1px + Resize selection right 1px + + + + Resize selection up 1px + Resize selection up 1px + + + + Resize selection down 1px + Resize selection down 1px + + + + Symmetrically decrease width by 2px + + + + + Symmetrically increase width by 2px + + + + + Symmetrically increase height by 2px + + + + + Symmetrically decrease height by 2px + + + + + Select entire screen + Select entire screen + + + + Move selection left 1px + Move selection left 1px + + + + Move selection right 1px + Move selection right 1px + + + + Move selection up 1px + Move selection up 1px + + + + Move selection down 1px + Move selection down 1px + + + + Commit text in text area + Commit text in text area + + + + Delete selected drawn object + + + + + Cancel current selection + + + + Delete current tool + Delete current tool + + + + Capture screen + Capture screen + + + + Screenshot history + Screenshot history + + + + SidePanelWidget + + Active thickness: + Active thickness: + + + Active color: + Active color: + + + Press ESC to cancel + Press ESC to cancel + + + + Active tool size: + Active tool size: + + + + Active Color: + Active Color: + + + + Grab Color + Grab Color + + + + Display grid + + + + + SizeDecreaseTool + + + Decrease Tool Size + Decrease Tool Size + + + + Decrease the size of the other tools + Decrease the size of the other tools + + + + SizeIncreaseTool + + + Increase Tool Size + Increase Tool Size + + + + Increase the size of the other tools + Increase the size of the other tools + + + + SizeIndicatorTool + + Selection Size Indicator + Selection Size Indicator + + + Show X and Y dimensions of the selection + Show X and Y dimensions of the selection + + + Show the dimensions of the selection (X Y) + Show the dimensions of the selection (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + Century (00-99) + + + + Year (00-99) + Year (00-99) + + + + Year (2000) + Year (2000) + + + + Month Name (jan) + Month Name (jan) + + + + Month Name (january) + Month Name (january) + + + + Month (01-12) + Month (01-12) + + + + Week Day (1-7) + Week Day (1-7) + + + + Week (01-53) + Week (01-53) + + + + Day Name (mon) + Day Name (mon) + + + + Day Name (monday) + Day Name (monday) + + + + Day (01-31) + Day (01-31) + + + + Day of Month (1-31) + Day of Month (1-31) + + + + Day (001-366) + Day (001-366) + + + + Hour (00-23) + Hour (00-23) + + + + Hour (01-12) + Hour (01-12) + + + + Minute (00-59) + Minute (00-59) + + + + Second (00-59) + Second (00-59) + + + + Full Date (%m/%d/%y) + Full Date (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + Full Date (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + + + + + Time (%H-%M-%S) + Time (%H-%M-%S) + + + + Time (%H-%M) + Time (%H-%M) + + + + SystemNotification + + + Flameshot Info + Flameshot Info + + + + TextConfig + + + StrikeOut + StrikeOut + + + + Underline + Underline + + + + Bold + Bold + + + + Italic + Italic + + + + Left Align + Left Align + + + + Center Align + Center Align + + + + Right Align + Right Align + + + + TextTool + + + Text + Text + + + + Add text to your capture + Add text to your capture + + + + TrayIcon + + + &Take Screenshot + &Take Screenshot + + + + &Open Launcher + &Open Launcher + + + + &Configuration + &Configuration + + + + &About + &About + + + + Check for updates + Check for updates + + + + New version %1 is available + New version %1 is available + + + + &Quit + &Quit + + + + &Latest Uploads + &Latest Uploads + + + + &Open Save Path + + + + + UIcolorEditor + + UI Color Editor + UI Color Editor + + + + Change the color moving the selectors and see the changes in the preview buttons. + Change the color moving the selectors and see the changes in the preview buttons. + + + + Select a Button to modify it + Select a Button to modify it + + + + Main Color + Main Color + + + + Click on this button to set the edition mode of the main color. + Click on this button to set the edition mode of the main color. + + + + Contrast Color + Contrast Color + + + + Click on this button to set the edition mode of the contrast color. + Click on this button to set the edition mode of the contrast color. + + + + UndoTool + + + Undo + Undo + + + + Undo the last modification + Desfés l'última modificació + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + New Flameshot version %1 is available + + + + Ignore + Ignore + + + + Later + Later + + + + Update + Update + + + + UploadHistory + + + Upload History + Upload History + + + + Screenshots history is empty + Screenshots history is empty + + + + UploadLineItem + + + Form + Form + + + + TextLabel + TextLabel + + + + Copy URL + Copia l'URL + + + + Open In Browser + Open In Browser + + + + Confirm to delete + Confirm to delete + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Are you sure you want to delete a screenshot from the latest uploads and server? + + + + UtilityPanel + + + Close + Close + + + + <Empty> + <Empty> + + + + VisualsEditor + + + Opacity of area outside selection: + Opacity of area outside selection: + + + + UI Color Editor + UI Color Editor + + + + Colorpicker Editor + Colorpicker Editor + + + + Button Selection + Button Selection + + + + Select All + Select All + + + + color_widgets::ColorDialog + + + Pick + Pick + + + + color_widgets::ColorPalette + + + Unnamed + Unnamed + + + + color_widgets::ColorPaletteModel + + + Unnamed + Unnamed + + + + %1 (%2 colors) + %1 (%2 colors) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + Open a new palette from file + + + + + Create a new palette + Create a new palette + + + + + Duplicate the current palette + Duplicate the current palette + + + + + Delete the current palette + Delete the current palette + + + + + Revert changes to the current palette + Revert changes to the current palette + + + + + Save changes to the current palette + Save changes to the current palette + + + + + Add a color to the palette + Add a color to the palette + + + + + Remove the selected color from the palette + Remove the selected color from the palette + + + + + New Palette + New Palette + + + + + Name + Name + + + + GIMP Palettes (*.gpl) + GIMP Palettes (*.gpl) + + + + Palette Image (%1) + Palette Image (%1) + + + + All Files (*) + All Files (*) + + + + + Open Palette + Open Palette + + + + Failed to load the palette file +%1 + Failed to load the palette file +%1 + + + + color_widgets::GradientEditor + + + Add Color + Add Color + + + + Remove Color + Remove Color + + + + Edit Color... + Edit Color... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 colors) + + + + color_widgets::Swatch + + + Clear Color + Clear Color + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_nl.ts b/data/translations/Internationalization_nl.ts new file mode 100644 index 0000000..c248f3b --- /dev/null +++ b/data/translations/Internationalization_nl.ts @@ -0,0 +1,3130 @@ + + + + + AbstractWidgetList + + + Add New + + + + + Move Up + + + + + Move Down + + + + + Remove + + + + + AcceptTool + + + Accept + + + + + Accept the capture + + + + + AppLauncher + + + App Launcher + App-starter + + + + Choose an app to open the capture + Kies een app om de schermafdruk mee te openen + + + + AppLauncherWidget + + + Open With + Openen met + + + + Launch in terminal + Openen in terminalvenster + + + + Keep open after selection + Openhouden na selectie + + + + + Error + Fout + + + + Unable to write in + Kan niet schrijven naar + + + + Unable to launch in terminal. + Kan niet openen in terminalvenster. + + + + ArrowTool + + + Arrow + Cursor + + + + Set the Arrow as the paint tool + Cursor instellen als verfgereedschap + + + + BlurTool + + Blur + Vervaging + + + Set Blur as the paint tool + Vervaging instellen als verfgereedschap + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Vastlegmodus</b> + + + + Rectangular Region + Rechthoekig gebied + + + + Full Screen (Current Display) + Volledig scherm (huidig beeldscherm) + + + + Full Screen (All Monitors) + Volledig scherm (alle beeldschermen) + + + + No Delay + Geen wachttijd + + + + second + seconde + + + + + + seconds + seconden + + + + + Take new screenshot + Nieuwe schermfoto maken + + + + + Area: + Gebied: + + + + + Capture Launcher + + + + + + TextLabel + + + + + + Capture Mode + + + + + + Delay: + Wachttijd: + + + + + WxH+x+y + + + + + CaptureWidget + + + Unable to capture screen + Kan scherm niet vastleggen + + + + Mouse + + + + + Select screenshot area + + + + + Mouse Wheel + Muiswiel + + + + Change tool size + + + + + Right Click + Rechtsklikken + + + + Show color picker + Kleurkiezer tonen + + + + Open side panel + + + + + Esc + + + + + Exit + Afsluiten + + + + Quit Capture + + + + + Are you sure you want to quit capture? + + + + + Do not show this again + + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Selecteer een gebied met de cursor of druk op Esc om af te sluiten. +Druk op Enter om het scherm vast te leggen. +Klik met de rechtermuisknop om de kleurkiezer te tonen. +Gebruik het muiswiel om de gereedschapsdikte aan te passen. +Druk op spatie om het zijpaneel te openen. + + + + Tool Settings + Gereedschapsinstellingen + + + + CircleCountTool + + + Circle Counter + Cirkelteller + + + + Add an autoincrementing counter bubble + Voeg een automatisch verhogende cirkelvormige teller toe + + + + CircleTool + + + Circle + Cirkel + + + + Set the Circle as the paint tool + Cirkel instellen als verfgereedschap + + + + ColorDialog + + + + Select Color + + + + + + Saturation + + + + + + Hue + + + + + + Hex + + + + + + Blue + + + + + + Value + + + + + + Green + + + + + + Alpha + + + + + + Red + + + + + ColorGrabWidget + + + Accept color + + + + + Enter or Left Click + + + + + Precisely select color + + + + + Hold Left Click + + + + + Toggle magnifier + + + + + Space or Right Click + + + + + Cancel + + + + + Esc + + + + + ColorPickerEditor + + + Edit Preset: + + + + + Enter color to update preset + + + + + Update + Bijwerken + + + + Press button to update the selected preset + + + + + Delete + + + + + Press button to delete the selected preset + + + + + Add Preset: + + + + + Enter color manually or select it using the color-wheel + + + + + Add + + + + + Press button to add preset + + + + + + Error + + + + + Unable to add preset. Maximum limit reached. + + + + + Unable to remove preset. Minimum limit reached. + + + + + ConfigErrorDetails + + + Configuration errors + + + + + ConfigHandler + + + Unrecognized setting: '%1' + + + + + + Unrecognized shortcut name: '%1'. + + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + + + + + Bad value in '%1'. Expected: %2 + + + + + + You have successfully resolved the configuration error. + + + + + The configuration contains an error. Open configuration to resolve. + + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + + + + + ConfigResolver + + + Resolve configuration errors + + + + + <b>You must resolve all errors before continuing:</b> + + + + + Reset + Standaardwaarden + + + + Reset to the default value. + + + + + Remove + + + + + Remove this setting. + + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + + + + + Resolve all + + + + + Resolve all listed errors. + + + + + Details + + + + + ConfigWindow + + + Configuration + Configuratie + + + + Interface + Uiterlijk + + + + Filename Editor + Bestandsnaambewerker + + + + General + Algemeen + + + + Shortcuts + Sneltoetsen + + + + Resolve + + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + + + + + Controller + + New version %1 is available + Er is een nieuwe versie beschikbaar: %1 + + + You have the latest version + Je beschikt over de nieuwste versie + + + Failed to get information about the latest version. + Er kan geen versie-informatie worden opgehaald. + + + Error + Foutmelding + + + Unable to close active modal widgets + De actieve, modale widgets kunnen niet worden gesloten + + + &Take Screenshot + Schermafdruk &maken + + + &Open Launcher + Starter &openen + + + &Configuration + &Configuratie + + + &About + &Over + + + Check for updates + Controleren op updates + + + &Latest Uploads + Recentste up&loads + + + URL copied to clipboard. + URL gekopieerd naar klembord. + + + &Information + &Informatie + + + &Quit + &Afsluiten + + + + CopyTool + + + Copy + Kopiëren + + + + Copy selection to clipboard + + + + Copy the selection into the clipboard + Selectie kopiëren naar klembord + + + + DBusUtils + + Unable to connect via DBus + Kan niet verbinden via DBus + + + + ExitTool + + + Exit + Afsluiten + + + + Leave the capture screen + Verlaat het vastlegscherm + + + + FileNameEditor + + + Edit the name of your captures: + Bewerk de naam van je schermafdrukken: + + + + Edit: + Bewerken: + + + + Preview: + Voorbeeld: + + + + Save + Opslaan + + + + Saves the pattern + Slaat het patroon op + + + + Restore + + + + Reset + Standaardwaarden + + + + Restores the saved pattern + Herstelt het standaardpatroon + + + + Clear + Wissen + + + + Deletes the name + Wist de naam + + + + Flameshot + + + Error + + + + + Unable to close active modal widgets + De actieve, modale widgets kunnen niet worden gesloten + + + + URL copied to clipboard. + URL gekopieerd naar klembord. + + + + FlameshotDaemon + + + New version %1 is available + Er is een nieuwe versie beschikbaar: %1 + + + + You have the latest version + Je beschikt over de nieuwste versie + + + + Failed to get information about the latest version. + Er kan geen versie-informatie worden opgehaald. + + + + Unable to connect via DBus + Kan niet verbinden via DBus + + + + GeneneralConf + + Import + Importeren + + + Error + Fout + + + Unable to read file. + Kan bestand niet uitlezen. + + + Unable to write file. + Kan bestand niet wegschrijven. + + + Save File + Bestand opslaan + + + Confirm Reset + Herstellen bevestigen + + + Are you sure you want to reset the configuration? + Weet je zeker dat je de standwaardwaarden van de configuratie wilt herstellen? + + + Show help message + Uitleg tonen + + + Show the help message at the beginning in the capture mode. + Toont een bericht met uitleg bij het openen van de vastlegmodus. + + + Show desktop notifications + Bureaubladmeldingen tonen + + + Show tray icon + Systeemvakpictogram tonen + + + Show the systemtray icon + Toont het systeemvakpictogram + + + Configuration File + Configuratiebestand + + + Export + Exporteren + + + Reset + Standaardwaarden + + + Launch at startup + Automatisch opstarten + + + Launch Flameshot + Flameshot openen + + + + GeneralConf + + + + Import + Importeren + + + + + + + Error + Foutmelding + + + + Unable to read file. + Kan bestand niet uitlezen. + + + + + Unable to write file. + Kan bestand niet wegschrijven. + + + + Save File + Bestand opslaan + + + + Confirm Reset + Herstellen bevestigen + + + + Are you sure you want to reset the configuration? + Weet je zeker dat je de standwaardwaarden van de configuratie wilt herstellen? + + + + Show help message + Uitleg tonen + + + Show the help message at the beginning in the capture mode. + Toont een bericht met uitleg bij het openen van de vastlegmodus. + + + + Show the side panel button + Zijpaneelknop tonen + + + Show the side panel toggle button in the capture mode. + Toont de zijpaneelknop in de vastlegmodus. + + + + Show desktop notifications + Bureaubladmeldingen tonen + + + + Show tray icon + Systeemvakpictogram tonen + + + Show the systemtray icon + Toont het systeemvakpictogram + + + + Confirmation required to delete screenshot from the latest uploads + Schermfoto verwijderen uit recentste uploads bevestigen + + + + Configuration File + Configuratiebestand + + + + Export + Exporteren + + + + Reset + Standaardwaarden + + + + Automatic check for updates + Automatisch controleren op updates + + + + Allow multiple flameshot GUI instances simultaneously + + + + Launch at startup + Automatisch opstarten + + + Launch Flameshot + Flameshot openen + + + + Show welcome message on launch + Welkomstbericht tonen na opstarten + + + + Use large predefined color palette + + + + + Copy URL after upload + URL kopiëren na uploaden + + + Copy URL and close window after upload + Kopieer de url en sluit het venster na het uploaden + + + + Save image after copy + Afbeelding opslaan na kopiëren + + + Save image file after copying it + Sla de afbeelding op na deze gekopieerd te hebben + + + + Show the help message at the beginning in the capture mode + + + + + Use last region for GUI mode + Use last region for GUI mode + + + + Use the last region as the default selection for the next screenshot in GUI mode + Use the last region as the default selection for the next screenshot in GUI mode + + + + Show the side panel toggle button in the capture mode + + + + + Enable desktop notifications + + + + + Show abort notifications + + + + + Enable abort notifications + + + + + Show icon in the system tray + + + + + Use grim to capture screenshots + + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + + + + + Ask for confirmation to delete screenshot from the latest uploads + + + + + Check for updates automatically + + + + + This allows you to take screenshots of Flameshot itself for example + + + + + Show the welcome message box in the middle of the screen while taking a screenshot + + + + + Use a large predefined color palette + + + + + Copy on double click + + + + + Automatically unload from memory when it is not needed + + + + + Automatically close daemon (background process) when it is not needed + + + + + Launch in background at startup + + + + + Launch Flameshot daemon (background process) when computer is booted + + + + + Ask before quit capture + + + + + Show the confirmation prompt before ESC quit + + + + + Enable Copy to clipboard on Double Click + + + + + Copy URL after uploading was successful + + + + + After copying the screenshot, save it to a file as well + + + + + Save Path + Opslaglocatie + + + + Change... + Wijzigen... + + + + Use fixed path for screenshots to save + Schermfoto's altijd opslaan op dezelfde locatie + + + + Preferred save file extension: + + + + + Latest Uploads Max Size + + + + + Imgur Application Client ID + + + + + Undo limit + + + + + Use JPG format for clipboard (PNG default) + JPG-formaat gebruiken op klembord (standaard: png) + + + + Use lossy JPG format for clipboard (lossless PNG default) + + + + + Copy file path after save + Bestandspad kopiëren na opslaan + + + + Copy the file path to clipboard after the file is saved + + + + + Anti-aliasing image when zoom the pinned image + + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + + + + + + Upload image without confirmation + + + + + Choose a Folder + Kies een map + + + + Unable to write to directory. + Kan niet wegschrijven naar map. + + + + Show magnifier + + + + + Enable a magnifier while selecting the screenshot area + + + + + Square shaped magnifier + + + + + Make the magnifier to be square-shaped + + + + + Milliseconds before geometry display hides; 0 means do not hide + + + + + Set geometry display timeout (ms) + + + + + Selection Geometry Display + + + + + Display Location + + + + + None + + + + + Top Left + + + + + Top Right + + + + + Bottom Left + + + + + Bottom Right + + + + + Center + + + + + Quality range of 0-100; Higher number is better quality and larger file size + + + + + JPEG Quality + + + + + Reverse arrow + + + + + Draw the arrow head first + + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + Recentste uploads + + + Screenshots history is empty + Er zijn nog geen schermfoto's gemaakt + + + Copy URL + URL kopiëren + + + URL copied to clipboard. + URL gekopieerd naar klembord. + + + Open in browser + Openen in browser + + + Confirm to delete + Verwijderen bevestigen + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Weet je zeker dat je de schermfoto wilt verwijderen uit de recentste uploads en van de server? + + + + ImgS3Uploader + + Uploading Image + Bezig met uploaden van afbeelding... + + + URL copied to clipboard. + URL gekopieerd naar klembord. + + + Error + Fout + + + + ImgUploadDialog + + + Upload Confirmation + + + + + Do you want to upload this capture? + + + + + + Upload without confirmation + + + + + ImgUploader + + Uploading Image + Bezig met uploaden van afbeelding... + + + Unable to open the URL. + Kan URL niet openen. + + + URL copied to clipboard. + URL gekopieerd naar klembord. + + + Screenshot copied to clipboard. + Schermafdruk gekopieerd naar klembord. + + + Copy URL + URL kopiëren + + + Open URL + URL openen + + + Delete image + Afbeelding verwijderen + + + Image to Clipboard. + Afbeelding naar klembord. + + + + ImgUploaderBase + + + Upload image + + + + + Uploading Image + Bezig met uploaden van afbeelding... + + + + Copy URL + URL kopiëren + + + + Open URL + URL openen + + + + Delete image + Afbeelding verwijderen + + + + Image to Clipboard. + Afbeelding naar klembord. + + + + Save image + + + + + Unable to open the URL. + Kan URL niet openen. + + + + URL copied to clipboard. + URL gekopieerd naar klembord. + + + + Screenshot copied to clipboard. + Schermafdruk gekopieerd naar klembord. + + + + Unable to save the screenshot to disk. + + + + + Screenshot saved. + + + + + ImgUploaderTool + + + Image Uploader + Afbeeldingsuploader + + + + Upload the selection + + + + + ImgurUploader + + Upload to Imgur + Uploaden naar Imgur + + + Uploading Image + Bezig met uploaden van afbeelding... + + + Copy URL + URL kopiëren + + + Open URL + URL openen + + + Delete image + Afbeelding verwijderen + + + Image to Clipboard. + Afbeelding naar klembord. + + + + Unable to open the URL. + Kan URL niet openen. + + + URL copied to clipboard. + URL gekopieerd naar klembord. + + + Screenshot copied to clipboard. + Schermafdruk gekopieerd naar klembord. + + + + ImgurUploaderTool + + Image Uploader + Afbeeldingsuploader + + + Upload the selection to Imgur + Upload de selectie naar Imgur + + + + InfoWindow + + + + About + Over + + + + + Icon + + + + + + License + + + + + + GPLv3+ + + + + + + Version + + + + + + Flameshot v + + + + + + OS Info + + + + + + Copy Info + + + + Right Click + Rechtsklikken + + + Mouse Wheel + Muiswiel + + + Move selection 1px + Selectie 1px verplaatsen + + + Resize selection 1px + Afmetingen van selectie 1px aanpassen + + + Quit capture + Vastleggen afsluiten + + + Copy to clipboard + Kopiëren naar klembord + + + Save selection as a file + Selectie opslaan als bestand + + + Undo the last modification + Laatste wijziging ongedaan maken + + + Toggle visibility of sidebar with options of the selected tool + Zijbalk met gereedschapsopties tonen/verbergen + + + Show color picker + Kleurkiezer tonen + + + Change the tool's thickness + Wijzig de gereedschapsdikte + + + Available shortcuts in the screen capture mode. + Beschikbare sneltoetsen in de vastlegmodus. + + + Key + Toets + + + Description + Omschrijving + + + <u><b>License</b></u> + <u><b>Лиценца</b></u> + + + <u><b>Version</b></u> + <u><b>Верзија</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Пречице</b></u> + + + + InvertTool + + + Invert + + + + + Set Inverter as the paint tool + + + + + LineTool + + + Line + Lijn + + + + Set the Line as the paint tool + Lijn instellen als verfgereedschap + + + + MarkerTool + + + Marker + Markeerstift + + + + Set the Marker as the paint tool + Markeerstift instellen als verfgereedschap + + + + MoveTool + + + Move + Verplaatsen + + + + Move the selection area + Selectiegebied verplaatsen + + + + PencilTool + + + Pencil + Potlood + + + + Set the Pencil as the paint tool + Potlood instellen als verfgereedschap + + + + PinTool + + + Pin Tool + Vastmaken + + + + Pin image on the desktop + Afbeelding vastmaken op bureaublad + + + + PinWidget + + + Context menu + + + + + Copy to clipboard + Kopiëren naar klembord + + + + Save to file + + + + + Rotate Right + + + + + Rotate Left + + + + + Increase Opacity + + + + + Decrease Opacity + + + + + Close + Sluiten + + + + PixelateTool + + + Pixelate + Pixelvorming + + + + Set Pixelate as the paint tool. + + + + Set Pixelate as the paint tool + Pixelvorming instellen als verfgereedschap + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QHotkey + + Failed to register %1. Error: %2 + '%1' kan niet worden ingesteld. Foutmelding: %2 + + + Failed to unregister %1. Error: %2 + '%1' kan niet worden vrijgegeven. Foutmelding: %2 + + + + QObject + + + Save Error + Fout tijdens opslaan + + + + + Capture saved as + Schermafdruk opgeslagen als + + + + + Capture saved to clipboard. + Schermfoto vastgelegd op klembord. + + + Capture saved to clipboard + Schermafdruk vastgelegd op klembord + + + + Error while saving to clipboard + Fout tijdens opslaan op klembord + + + + + Error trying to save as + Fout tijdens opslaan als + + + + Save screenshot + Schermfoto opslaan + + + + Path copied to clipboard as + + + + Capture is saved and copied to the clipboard as + De schermfoto is opgeslagen en gekopieerd naar het klembord als + + + + Unable to connect via DBus + Kan niet verbinden via DBus + + + + Powerful yet simple to use screenshot software. + Eenvoudig doch krachtig schermfotoprogramma. + + + + See + Bekijken + + + Capture the entire desktop. + Leg de volledige werkomgeving vast. + + + + Open the capture launcher. + Open de schermfotostarter. + + + + Start a manual capture in GUI mode. + Start een handmatige vastlegging in programmamodus. + + + + Configure + Instellen + + + Capture a single screen. + Leg een beeldscherm vast. + + + Path where the capture will be saved + Het pad waar de schermfoto wordt opgeslagen + + + + Capture screenshot of all monitors at the same time. + + + + + Capture a screenshot of the specified monitor. + + + + + Existing directory or new file to save to + + + + + Save the capture to the clipboard + Schermfoto opslaan op klembord + + + + Pin the capture to the screen + + + + + Upload screenshot + + + + + Delay time in milliseconds + Wachttijd (in milliseconden) + + + + Repeat screenshot with previously selected region + + + + + Screenshot region to select + + + + + Set the filename pattern + Bestandsnaampatroon instellen + + + + Accept capture as soon as a selection is made + + + + + Enable or disable the trayicon + Systeemvakpictogram in- of uitschakelen + + + + Enable or disable run at startup + Automatisch opstarten in- of uitschakelen + + + + Enable or disable the notifications + + + + + Check the configuration for errors + + + + + Show the help message in the capture mode + Uitleg tonen in vastlegmodus + + + + Define the main UI color + Standaard vormgevingskleur instellen + + + + Define the contrast UI color + Standaard contrasterende vormgevingskleur instellen + + + + Print raw PNG capture + Onbewerkte png-schermfoto tonen + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + Afmetingen van de selectie tonen in B H X Y. Niet van toepassing als 'onbewerkt' is opgegeven. + + + + Define the screen to capture (starting from 0) + + + + + Invalid delay, it must be a number greater than 0 + + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + + + + + Invalid path, must be an existing directory or a new file in an existing directory + + + + Define the screen to capture + Kies het vast te leggen scherm + + + + default: screen containing the cursor + standaard: het scherm met de cursor + + + + Screen number + Beeldschermnummer + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Ongeldige kleur. Deze optie ondersteunt de volgende opmaken: +- #RGB (elke van R, G en B is een los hex-getal) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Kleurnamen, zoals 'blue' of 'red' +Mogelijk moet je het '#'-teken insluiten. Voorbeeld: '\#FFF' + + + Invalid delay, it must be higher than 0 + Ongeldige wachttijd: de wachttijd moet hoger dan 0 zijn + + + + Invalid screen number, it must be non negative + Ongeldig beeldschermnummer: het nummer mag geen negatief getal zijn + + + Invalid path, it must be a real path in the system + Ongeldig pad: het pad moet bestaan + + + + Invalid value, it must be defined as 'true' or 'false' + Ongeldige waarde: deze moet worden opgegeven als 'true' of 'false' + + + + Error + Fout + + + + Unable to write in + Kan niet wegschrijven naar + + + + Requested screen exceeds screen count + + + + + Full screen screenshot pinned to screen + + + + URL copied to clipboard. + URL gekopieerd naar klembord. + + + + Options + Opties + + + Arguments + Aanvullende opties + + + arguments + aanvullende opties + + + + Subcommands + + + + + subcommands + + + + + Usage + Gebruik + + + + options + opties + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Standaard wordt Flameshot op de achtergrond uitgevoerd en toont daarbij een systeemvakpictogram. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Hallo, hier ben ik! Klik op het systeemvakpictogram om een schermfoto te maken of rechtsklik om meer opties te tonen. + + + Toggle side panel + Zijpaneel in-/uitklappen + + + Resize selection left 1px + Afmetingen van selectie 1px aanpassen (links) + + + Resize selection right 1px + Afmetingen van selectie 1px aanpassen (rechts + + + Resize selection up 1px + Afmetingen van selectie 1px aanpassen (omhoog) + + + Resize selection down 1px + Afmetingen van selectie 1px aanpassen (omlaag) + + + Select entire screen + Gehele scherm selecteren + + + Move selection left 1px + Selectie 1px naar links verschuiven + + + Move selection right 1px + Selectie 1px naar rechts verschuiven + + + Move selection up 1px + Selectie 1px omhoog verschuiven + + + Move selection down 1px + Selectie 1px omlaag verschuiven + + + Commit text in text area + Tekst in tekstvak + + + + Quit capture + Vastleggen afsluiten + + + + Screenshot history + Schermfotogeschiedenis + + + + Capture screen + Scherm vastleggen + + + + Show color picker + Kleurkiezer tonen + + + + Change the tool's size + + + + Change the tool's thickness + Wijzig de gereedschapsdikte + + + + RectangleTool + + + Rectangle + Rechthoek + + + + Set the Rectangle as the paint tool + Rechthoek instellen als verfgereedschap + + + + RedoTool + + + Redo + Opnieuw + + + + Redo the next modification + Volgende wijziging opnieuw toepassen + + + + SaveTool + + + Save + Сачувај + Opslaan + + + + Save screenshot to a file + + + + Save the capture + Schermafdruk opslaan + + + + ScreenGrabber + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + + + + + Unable to capture screen + Kan scherm niet vastleggen + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + Rechthoekige selectie + + + + Set Selection as the paint tool + Selectie instellen als verfgereedschap + + + + SetShortcutDialog + + + Set Shortcut + Sneltoets instellen + + + + Enter new shortcut to change + Druk op een nieuwe sneltoets voor + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Druk op Esc om af te breken of Backspace om de sneltoets uit te schakelen. + + + + + Flameshot must be restarted for changes to take effect. + + + + + ShortcutsWidget + + + Hot Keys + Sneltoetsen + + + + Available shortcuts in the screen capture mode. + Beschikbare sneltoetsen in de vastlegmodus. + + + + Description + Omschrijving + + + + Key + Toets + + + + Left Double-click + + + + + Toggle side panel + Zijpaneel in-/uitklappen + + + + Grab a color from the screen + + + + + Resize selection left 1px + Afmetingen van selectie 1px aanpassen (links) + + + + Resize selection right 1px + Afmetingen van selectie 1px aanpassen (rechts + + + + Resize selection up 1px + Afmetingen van selectie 1px aanpassen (omhoog) + + + + Resize selection down 1px + Afmetingen van selectie 1px aanpassen (omlaag) + + + + Symmetrically decrease width by 2px + + + + + Symmetrically increase width by 2px + + + + + Symmetrically increase height by 2px + + + + + Symmetrically decrease height by 2px + + + + + Select entire screen + Gehele scherm selecteren + + + + Move selection left 1px + Selectie 1px naar links verschuiven + + + + Move selection right 1px + Selectie 1px naar rechts verschuiven + + + + Move selection up 1px + Selectie 1px omhoog verschuiven + + + + Move selection down 1px + Selectie 1px omlaag verschuiven + + + + Commit text in text area + Tekst in tekstvak + + + + Delete selected drawn object + + + + + Cancel current selection + + + + + Capture screen + Scherm vastleggen + + + + Screenshot history + Schermfotogeschiedenis + + + + SidePanelWidget + + Active thickness: + Actieve dikte: + + + Active color: + Actieve kleur: + + + Press ESC to cancel + Druk op Esc om te annuleren + + + + Active tool size: + + + + + Active Color: + + + + + Grab Color + Kleur opnemen + + + + Display grid + + + + + SizeDecreaseTool + + + Decrease Tool Size + + + + + Decrease the size of the other tools + + + + + SizeIncreaseTool + + + Increase Tool Size + + + + + Increase the size of the other tools + + + + + SizeIndicatorTool + + Selection Size Indicator + Grootteindicatie van selectie + + + Show the dimensions of the selection (X Y) + Toon de afmetingen van de selectie (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + Eeuw (00-99) + + + + Year (00-99) + Jaar (00-99) + + + + Year (2000) + Jaar (2000) + + + + Month Name (jan) + Naam van de maand (јаn) + + + + Month Name (january) + Naam van de maand (јаnuari) + + + + Month (01-12) + Maand (01-12) + + + + Week Day (1-7) + Weekdag (1-7) + + + + Week (01-53) + Week (01-53) + + + + Day Name (mon) + Naam van de dag (ma) + + + + Day Name (monday) + Naam van de dag (maandag) + + + + Day (01-31) + Dag (01-31) + + + + Day of Month (1-31) + Dag van de maand (1-31) + + + + Day (001-366) + Dag (001-366) + + + + Time (%H-%M-%S) + Tijd (%H-%M-%S) + + + + Time (%H-%M) + Tijd (%H-%M) + + + + Hour (00-23) + Uur (00-23) + + + + Hour (01-12) + Uur (01-12) + + + + Minute (00-59) + Minuten (00-59) + + + + Second (00-59) + Seconden (00-59) + + + + Full Date (%m/%d/%y) + Volledige datum (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + Volledige datum (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + + + + + SystemNotification + + + Flameshot Info + Flameshot-informatie + + + + TextConfig + + + StrikeOut + Doorhalen + + + + Underline + Onderstrepen + + + + Bold + Vetgedrukt + + + + Italic + Cursief + + + + Left Align + + + + + Center Align + + + + + Right Align + + + + + TextTool + + + Text + Tekst + + + + Add text to your capture + Voeg tekst toe aan je schermafdruk + + + + TrayIcon + + + &Take Screenshot + Schermafdruk &maken + + + + &Open Launcher + Starter &openen + + + + &Configuration + &Configuratie + + + + &About + &Over + + + + Check for updates + Controleren op updates + + + + New version %1 is available + Er is een nieuwe versie beschikbaar: %1 + + + + &Quit + &Afsluiten + + + + &Latest Uploads + Recentste up&loads + + + + &Open Save Path + + + + + UIcolorEditor + + UI Color Editor + Kleurenschemabewerker + + + + Change the color moving the selectors and see the changes in the preview buttons. + Wijzig de kleur d.m.v. de selectie-indicators en bekijk de wijzigingen op de voorbeeldknoppen. + + + + Select a Button to modify it + Kies een te bewerken knop + + + + Main Color + Hoofdkleur + + + + Click on this button to set the edition mode of the main color. + Klik op deze knop om de hoofdkleur te bwerken. + + + + Contrast Color + Contrastkleur + + + + Click on this button to set the edition mode of the contrast color. + Klik op deze knop om de contrastkleur te bewerken. + + + + UndoTool + + + Undo + Ongedaan mken + + + + Undo the last modification + Laatste wijziging ongedaan maken + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + Er is een nieuwe versie beschikbaar: %1 + + + + Ignore + Negeren + + + + Later + Later + + + + Update + Bijwerken + + + + UploadHistory + + + Upload History + + + + + Screenshots history is empty + Er zijn nog geen schermfoto's gemaakt + + + + UploadLineItem + + + Form + + + + + TextLabel + + + + + Copy URL + URL kopiëren + + + + Open In Browser + + + + + Confirm to delete + Verwijderen bevestigen + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Weet je zeker dat je de schermfoto wilt verwijderen uit de recentste uploads en van de server? + + + + UtilityPanel + + + Close + Sluiten + + + + <Empty> + + + + + VisualsEditor + + + Opacity of area outside selection: + Doorzichtigheid van gebied buiten selectie: + + + + UI Color Editor + Kleurenschemabewerker + + + + Colorpicker Editor + + + + + Button Selection + Knopselectie + + + + Select All + Alles selecteren + + + + color_widgets::ColorDialog + + + Pick + + + + + color_widgets::ColorPalette + + + Unnamed + + + + + color_widgets::ColorPaletteModel + + + Unnamed + + + + + %1 (%2 colors) + + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + + + + + + Create a new palette + + + + + + Duplicate the current palette + + + + + + Delete the current palette + + + + + + Revert changes to the current palette + + + + + + Save changes to the current palette + + + + + + Add a color to the palette + + + + + + Remove the selected color from the palette + + + + + + New Palette + + + + + + Name + + + + + GIMP Palettes (*.gpl) + + + + + Palette Image (%1) + + + + + All Files (*) + + + + + + Open Palette + + + + + Failed to load the palette file +%1 + + + + + color_widgets::GradientEditor + + + Add Color + + + + + Remove Color + + + + + Edit Color... + + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + + + + + color_widgets::Swatch + + + Clear Color + + + + + %1 (%2) + + + + diff --git a/data/translations/Internationalization_nl_NL.ts b/data/translations/Internationalization_nl_NL.ts new file mode 100644 index 0000000..ee7ef84 --- /dev/null +++ b/data/translations/Internationalization_nl_NL.ts @@ -0,0 +1,3189 @@ + + + + + AbstractWidgetList + + + Add New + Nieuwe Toevoegen + + + + Move Up + Naar boven + + + + Move Down + Naar beneden + + + + Remove + Verwijder + + + + AcceptTool + + + Accept + Accepteren + + + + Accept the capture + Accepteer de vangst + + + + AppLauncher + + + App Launcher + App-starter + + + + Choose an app to open the capture + Kies een programma om de schermfoto mee te openen + + + + AppLauncherWidget + + + Open With + Openen met + + + + Launch in terminal + Openen in terminalvenster + + + + Keep open after selection + Openhouden na selectie + + + + + Error + Fout + + + + Unable to write in + Kan niet schrijven naar + + + + Unable to launch in terminal. + Kan niet openen in terminalvenster. + + + + ArrowTool + + + Arrow + Cursor + + + + Set the Arrow as the paint tool + Cursor instellen als verfgereedschap + + + + BlurTool + + Blur + Vervaging + + + Set Blur as the paint tool + Vervaging instellen als verfgereedschap + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Vastlegmodus</b> + + + + Rectangular Region + Rechthoekig gebied + + + + Full Screen (Current Display) + Volledig scherm (huidig beeldscherm) + + + + Full Screen (All Monitors) + Volledig scherm (alle beeldschermen) + + + + No Delay + Geen wachttijd + + + + second + seconde + + + + + + seconds + seconden + + + + + Take new screenshot + Nieuwe schermfoto maken + + + + + Area: + Gebied: + + + + + Capture Launcher + Opname starter + + + + + TextLabel + TekstLabel + + + + + Capture Mode + Opname mode + + + + + Delay: + Wachttijd: + + + + + WxH+x+y + WxH+x+y + + + + CaptureWidget + + + Unable to capture screen + Kan scherm niet vastleggen + + + + Mouse + Muis + + + + Select screenshot area + Selecteer schermopname gebied + + + + Mouse Wheel + Muiswiel + + + + Change tool size + Gereedschapsmaat wijzigen + + + + Right Click + Rechterklik + + + + Show color picker + Kleurkiezer tonen + + + + Open side panel + Open zijpaneel + + + + Esc + Esc + + + + Exit + Afsluiten + + + + Quit Capture + + + + + Are you sure you want to quit capture? + + + + + Do not show this again + + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot is de focus kwijt. Toetsenbord sneltoetsen werken niet totdat je ergens klikt. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + Configuratie fout opgelost. Start `flameshot gui` opnieuw om het toe te passen. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Selecteer een gebied met de cursor of druk op Esc om af te sluiten. +Druk op Enter om het scherm vast te leggen. +Klik met de rechtermuisknop om de kleurkiezer te tonen. +Gebruik het muiswiel om de gereedschapsdikte aan te passen. +Druk op spatie om het zijpaneel te openen. + + + + Tool Settings + Gereedschapsinstellingen + + + + CircleCountTool + + + Circle Counter + Cirkelteller + + + + Add an autoincrementing counter bubble + Voeg een automatisch verhogende cirkelvormige teller toe + + + + CircleTool + + + Circle + Cirkel + + + + Set the Circle as the paint tool + Cirkel instellen als verfgereedschap + + + + ColorDialog + + + + Select Color + Selecteer Kleur + + + + + Saturation + Verzadiging + + + + + Hue + Tint + + + + + Hex + Hex + + + + + Blue + Blauw + + + + + Value + Waarde + + + + + Green + Groen + + + + + Alpha + Alpha + + + + + Red + Rood + + + + ColorGrabWidget + + + Accept color + Accepteer kleur + + + + Enter or Left Click + Enter or Left Click + + + + Precisely select color + Kies precies de kleur + + + + Hold Left Click + Hold Left Click + + + + Toggle magnifier + Vergrootglas + + + + Space or Right Click + Space or Right Click + + + + Cancel + Annuleer + + + + Esc + Esc + + + + ColorPickerEditor + + Select Preset: + Voorinstelling selecteren: + + + Select preset using the spinbox + Selecteer de voorinstelling met de draaischijf + + + + Edit Preset: + Edit Preset: + + + + Enter color to update preset + Enter color to update preset + + + + Update + Bijwerken + + + + Press button to update the selected preset + Press button to update the selected preset + + + + Delete + Verwijder + + + + Press button to delete the selected preset + Druk op de knop om de geselecteerde preset te wissen + + + + Add Preset: + Voorinstelling toevoegen: + + + + Enter color manually or select it using the color-wheel + Voer kleur handmatig in of selecteer deze met het kleurenwiel + + + + Add + Toevoegen + + + + Press button to add preset + Druk op de knop om een voorinstelling toe te voegen + + + + + Error + Fout + + + + Unable to add preset. Maximum limit reached. + Kan geen voorinstelling toevoegen. Maximum limiet bereikt. + + + + Unable to remove preset. Minimum limit reached. + Kan voorinstelling niet verwijderen. Minimum limiet bereikt. + + + + ConfigErrorDetails + + + Configuration errors + Configuratie fouten + + + + ConfigHandler + + + Unrecognized setting: '%1' + + Niet-herkende instelling: '%1' + + + + + Unrecognized shortcut name: '%1'. + + Niet-herkende snelkoppelingsnaam: '%1'. + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + Snelkoppelingsconflict: '%1' en '%2' hebben dezelfde snelkoppeling: %3 + + + + + Bad value in '%1'. Expected: %2 + + Slechte waarde in '%1'. Verwacht: %2 + + + + + You have successfully resolved the configuration error. + U hebt de configuratiefout met succes opgelost. + + + + The configuration contains an error. Open configuration to resolve. + De configuratie bevat een fout. Open de configuratie om op te lossen. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + Slechte config key '%1' in ConfigHandler. Gelieve dit als een bug te melden. + + + + ConfigResolver + + + Resolve configuration errors + Configuratiefouten oplossen + + + + <b>You must resolve all errors before continuing:</b> + <b>U moet alle fouten oplossen voordat u verdergaat:</b> + + + + Reset + Terugstellen + + + + Reset to the default value. + Terugzetten op de standaardwaarde. + + + + Remove + Verwijder + + + + Remove this setting. + Verwijder deze instelling. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + Sommige sneltoetsen hebben conflicten. +Dit zal NIET voorkomen dat flameshot start. +Los ze alstublieft handmatig op in het configuratiebestand. + + + + Resolve all + Los alles op + + + + Resolve all listed errors. + Los alle vermelde fouten op. + + + + Details + Informatie + + + + ConfigWindow + + + Configuration + Configuratie + + + + Interface + Uiterlijk + + + + Filename Editor + Bestandsnaambewerker + + + + General + Algemeen + + + + Shortcuts + Sneltoetsen + + + + Resolve + Oplossen + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>Configuratie bestand heeft fouten. Los ze op alvorens verder te gaan.</b> + + + + Controller + + New version %1 is available + Er is een nieuwe versie beschikbaar: %1 + + + You have the latest version + Je beschikt over de nieuwste versie + + + Failed to get information about the latest version. + Er kan geen versie-informatie worden opgehaald. + + + Error + Foutmelding + + + Unable to close active modal widgets + De actieve, modale widgets kunnen niet worden gesloten + + + &Take Screenshot + Schermfo&to maken + + + &Open Launcher + Starter &openen + + + &Configuration + &Configuratie + + + &About + &Over + + + Check for updates + Controleren op updates + + + &Latest Uploads + Recentste up&loads + + + URL copied to clipboard. + URL gekopieerd naar klembord. + + + &Information + &Informatie + + + &Quit + &Afsluiten + + + + CopyTool + + + Copy + Kopiëren + + + + Copy selection to clipboard + Kopieer selectie naar klembord + + + Copy the selection into the clipboard + Selectie kopiëren naar klembord + + + + DBusUtils + + Unable to connect via DBus + Kan niet verbinden via DBus + + + + ExitTool + + + Exit + Afsluiten + + + + Leave the capture screen + Verlaat het vastlegscherm + + + + FileNameEditor + + + Edit the name of your captures: + Bewerk de naam van je schermfoto's: + + + + Edit: + Bewerken: + + + + Preview: + Voorbeeld: + + + + Save + Opslaan + + + + Saves the pattern + Slaat het patroon op + + + + Restore + Herstellen + + + Reset + Standaardwaarden + + + + Restores the saved pattern + Herstelt het standaardpatroon + + + + Clear + Wissen + + + + Deletes the name + Wist de naam + + + + Flameshot + + + Error + Error + + + + Unable to close active modal widgets + De actieve, modale widgets kunnen niet worden gesloten + + + + URL copied to clipboard. + URL gekopieerd naar klembord. + + + + FlameshotDaemon + + + New version %1 is available + Er is een nieuwe versie beschikbaar: %1 + + + + You have the latest version + Je beschikt over de nieuwste versie + + + + Failed to get information about the latest version. + Er kan geen versie-informatie worden opgehaald. + + + + Unable to connect via DBus + Kan niet verbinden via DBus + + + + GeneneralConf + + Import + Importeren + + + Error + Fout + + + Unable to read file. + Kan bestand niet uitlezen. + + + Unable to write file. + Kan bestand niet wegschrijven. + + + Save File + Bestand opslaan + + + Confirm Reset + Herstellen bevestigen + + + Are you sure you want to reset the configuration? + Weet je zeker dat je de standwaardwaarden van de configuratie wilt herstellen? + + + Show help message + Uitleg tonen + + + Show the help message at the beginning in the capture mode. + Toont een bericht met uitleg bij het openen van de vastlegmodus. + + + Show desktop notifications + Bureaubladmeldingen tonen + + + Show tray icon + Systeemvakpictogram tonen + + + Show the systemtray icon + Toont het systeemvakpictogram + + + Configuration File + Configuratiebestand + + + Export + Exporteren + + + Reset + Standaardwaarden + + + Launch at startup + Automatisch opstarten + + + Launch Flameshot + Flameshot openen + + + + GeneralConf + + + + Import + Importeren + + + + + + + Error + Foutmelding + + + + Unable to read file. + Kan bestand niet uitlezen. + + + + + Unable to write file. + Kan bestand niet wegschrijven. + + + + Save File + Bestand opslaan + + + + Confirm Reset + Herstellen bevestigen + + + + Are you sure you want to reset the configuration? + Weet je zeker dat je de standwaardwaarden van de configuratie wilt herstellen? + + + + Show help message + Uitleg tonen + + + Show the help message at the beginning in the capture mode. + Toont een bericht met uitleg bij het openen van de vastlegmodus. + + + + Show the side panel button + Zijpaneelknop tonen + + + Show the side panel toggle button in the capture mode. + Toont de zijpaneelknop in de vastlegmodus. + + + + Show desktop notifications + Bureaubladmeldingen tonen + + + + Show tray icon + Systeemvakpictogram tonen + + + Show the systemtray icon + Toont het systeemvakpictogram + + + + Confirmation required to delete screenshot from the latest uploads + Schermfoto verwijderen uit recentste uploads bevestigen + + + + Configuration File + Configuratiebestand + + + + Export + Exporteren + + + + Reset + Standaardwaarden + + + + Automatic check for updates + Automatisch controleren op updates + + + + Allow multiple flameshot GUI instances simultaneously + Sta meerdere flameshot GUI instanties tegelijk toe + + + This allows you to take screenshots of flameshot itself for example. + Hiermee kunt u screenshots maken van bijvoorbeeld Flameshot zelf. + + + Automatically close daemon when it is not needed + Automatisch sluiten van de daemon wanneer deze niet nodig is + + + Launch at startup + Automatisch opstarten + + + Launch Flameshot + Flameshot openen + + + + Show welcome message on launch + Welkomstbericht tonen na opstarten + + + + Use large predefined color palette + Gebruik groot voorgedefinieerd kleurenpalet + + + + Copy URL after upload + URL kopiëren na uploaden + + + Copy URL and close window after upload + Kopieer de url en sluit het venster na het uploaden + + + + Save image after copy + Afbeelding opslaan na kopiëren + + + Save image file after copying it + Sla de afbeelding op na deze gekopieerd te hebben + + + + Show the help message at the beginning in the capture mode + Toon het helpbericht aan het begin in de vastlegmodus + + + + Use last region for GUI mode + Use last region for GUI mode + + + + Use the last region as the default selection for the next screenshot in GUI mode + Use the last region as the default selection for the next screenshot in GUI mode + + + + Show the side panel toggle button in the capture mode + Toon de schakelknop op het zijpaneel in de vastlegmodus + + + + Enable desktop notifications + Meldingen op bureaublad inschakelen + + + + Show abort notifications + + + + + Enable abort notifications + + + + + Show icon in the system tray + Pictogram in systeemvak tonen + + + + Use grim to capture screenshots + + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + + + + + Ask for confirmation to delete screenshot from the latest uploads + Vraag om bevestiging om screenshot te verwijderen van de laatste uploads + + + + Check for updates automatically + Automatisch controleren op updates + + + + This allows you to take screenshots of Flameshot itself for example + Hiermee kunt u screenshots maken van Flameshot zelf, bijvoorbeeld + + + Launch Flameshot daemon when computer is booted + Start Flameshot daemon wanneer de computer wordt opgestart + + + + Show the welcome message box in the middle of the screen while taking a screenshot + Toon de welkomstboodschap in het midden van het scherm tijdens het maken van een screenshot + + + + Use a large predefined color palette + Gebruik een groot voorgedefinieerd kleurenpalet + + + + Copy on double click + Copy on double click + + + Enable Copy on Double Click + Enable Copy on Double Click + + + Copy URL and close window after uploading was successful + Kopieer URL en sluit venster nadat het uploaden succesvol was + + + + Automatically unload from memory when it is not needed + + + + + Automatically close daemon (background process) when it is not needed + + + + + Launch in background at startup + + + + + Launch Flameshot daemon (background process) when computer is booted + + + + + Ask before quit capture + + + + + Show the confirmation prompt before ESC quit + + + + + Enable Copy to clipboard on Double Click + + + + + Copy URL after uploading was successful + + + + + After copying the screenshot, save it to a file as well + Nadat u de schermafbeelding hebt gekopieerd, slaat u deze ook op in een bestand + + + + Save Path + Opslaglocatie + + + + Change... + Wijzigen... + + + + Use fixed path for screenshots to save + Schermfoto's altijd opslaan op dezelfde locatie + + + + Preferred save file extension: + Voorkeursbestandsextensie: + + + + Latest Uploads Max Size + Max. grootte van recentste uploads + + + + Imgur Application Client ID + Imgur Application Client ID + + + + Undo limit + Beperking ongedaan maken + + + + Use JPG format for clipboard (PNG default) + JPG-formaat gebruiken op klembord (standaard: png) + + + + Use lossy JPG format for clipboard (lossless PNG default) + + + + + Copy file path after save + Bestandspad kopiëren na opslaan + + + + Copy the file path to clipboard after the file is saved + Kopieer het bestandspad naar het klembord nadat het bestand is opgeslagen + + + + Anti-aliasing image when zoom the pinned image + Anti-aliasing afbeelding bij het inzoomen van de vastgepinde afbeelding + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + Na het zoomen van de vastgepinde afbeelding, moet de afbeelding gladder worden of pixelig blijven + + + + + Upload image without confirmation + Afbeelding uploaden zonder bevestiging + + + + Choose a Folder + Kies een map + + + + Unable to write to directory. + Kan niet wegschrijven naar map. + + + + Show magnifier + Vergrootglas tonen + + + + Enable a magnifier while selecting the screenshot area + Een vergrootglas inschakelen bij het selecteren van het screenshotgebied + + + + Square shaped magnifier + Vierkant vergrootglas + + + + Make the magnifier to be square-shaped + Maak de loep vierkant + + + + Milliseconds before geometry display hides; 0 means do not hide + + + + + Set geometry display timeout (ms) + + + + + Selection Geometry Display + + + + + Display Location + + + + + None + + + + + Top Left + + + + + Top Right + + + + + Bottom Left + + + + + Bottom Right + + + + + Center + + + + + Quality range of 0-100; Higher number is better quality and larger file size + + + + + JPEG Quality + + + + + Reverse arrow + + + + + Draw the arrow head first + + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + Recentste uploads + + + Screenshots history is empty + Er zijn nog geen schermfoto's gemaakt + + + Copy URL + URL kopiëren + + + URL copied to clipboard. + URL gekopieerd naar klembord. + + + Open in browser + Openen in browser + + + Confirm to delete + Verwijderen bevestigen + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Weet je zeker dat je de schermfoto wilt verwijderen uit de recentste uploads en van de server? + + + + ImgS3Uploader + + Uploading Image + Bezig met uploaden van afbeelding... + + + URL copied to clipboard. + URL gekopieerd naar klembord. + + + Error + Fout + + + + ImgUploadDialog + + + Upload Confirmation + Upload Bevestigingn + + + + Do you want to upload this capture? + Wil je deze opname uploaden? + + + + + Upload without confirmation + Uploaden zonder bevestiging + + + + ImgUploader + + Uploading Image + Bezig met uploaden van afbeelding... + + + Unable to open the URL. + Kan URL niet openen. + + + URL copied to clipboard. + URL gekopieerd naar klembord. + + + Screenshot copied to clipboard. + Schermafdruk gekopieerd naar klembord. + + + Copy URL + URL kopiëren + + + Open URL + URL openen + + + Delete image + Afbeelding verwijderen + + + Image to Clipboard. + Afbeelding naar klembord. + + + + ImgUploaderBase + + + Upload image + Upload image + + + + Uploading Image + Afbeelding uploaden + + + + Copy URL + URL kopiëren + + + + Open URL + URL openen + + + + Delete image + Afbeelding verwijderen + + + + Image to Clipboard. + Afbeelding naar klembord. + + + + Save image + Beeld bewaren + + + + Unable to open the URL. + Kan URL niet openen. + + + + URL copied to clipboard. + URL gekopieerd naar klembord. + + + + Screenshot copied to clipboard. + Screenshot gekopieerd naar klembord. + + + + Unable to save the screenshot to disk. + Kan de schermafbeelding niet op schijf opslaan. + + + + Screenshot saved. + Screenshot bewaard. + + + + ImgUploaderTool + + + Image Uploader + Afbeelding uploader + + + + Upload the selection + Uploaden van de selectie + + + + ImgurUploader + + Upload to Imgur + Uploaden naar Imgur + + + Uploading Image + Uploaden van afbeelding + + + Copy URL + URL kopiëren + + + Open URL + URL openen + + + Delete image + Afbeelding verwijderen + + + Image to Clipboard. + Afbeelding naar klembord. + + + + Unable to open the URL. + Kan URL niet openen. + + + URL copied to clipboard. + URL gekopieerd naar klembord. + + + Screenshot copied to clipboard. + De schermfoto is gekopieerd naar het klembord. + + + + ImgurUploaderTool + + Image Uploader + Afbeelding uploader + + + Upload the selection to Imgur + Upload de selectie naar Imgur + + + + InfoWindow + + + + About + Over + + + + + Icon + Ikoontje + + + + + License + Licentie + + + + + GPLv3+ + GPLv3+ + + + + + Version + Versie + + + + + Flameshot v + Flameshot versie + + + + + OS Info + Besturingssysteem info + + + + + Copy Info + Kopieer Info + + + Right Click + Rechtsklikken + + + Mouse Wheel + Muiswiel + + + Move selection 1px + Selectie 1px verplaatsen + + + Resize selection 1px + Afmetingen van selectie 1px aanpassen + + + Quit capture + Vastleggen afsluiten + + + Copy to clipboard + Kopiëren naar klembord + + + Save selection as a file + Selectie opslaan als bestand + + + Undo the last modification + Laatste wijziging ongedaan maken + + + Toggle visibility of sidebar with options of the selected tool + Zijbalk met gereedschapsopties tonen/verbergen + + + Show color picker + Kleurkiezer tonen + + + Change the tool's thickness + Wijzig de gereedschapsdikte + + + Available shortcuts in the screen capture mode. + Beschikbare sneltoetsen in de vastlegmodus. + + + Key + Toets + + + Description + Omschrijving + + + <u><b>License</b></u> + <u><b>Overeenkomst</b></u> + + + <u><b>Version</b></u> + <u><b>Versie</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Пречице</b></u> + + + + InvertTool + + + Invert + Omkeren + + + + Set Inverter as the paint tool + Inverter instellen als schildergereedschap + + + + LineTool + + + Line + Lijn + + + + Set the Line as the paint tool + Lijn instellen als verfgereedschap + + + + MarkerTool + + + Marker + Markeerstift + + + + Set the Marker as the paint tool + Markeerstift instellen als verfgereedschap + + + + MoveTool + + + Move + Verplaatsen + + + + Move the selection area + Selectiegebied verplaatsen + + + + PencilTool + + + Pencil + Potlood + + + + Set the Pencil as the paint tool + Potlood instellen als verfgereedschap + + + + PinTool + + + Pin Tool + Vastmaken + + + + Pin image on the desktop + Afbeelding vastmaken op bureaublad + + + + PinWidget + + + Context menu + Context menu + + + + Copy to clipboard + Kopiëren naar klembord + + + + Save to file + Save to file + + + + Rotate Right + + + + + Rotate Left + + + + + Increase Opacity + + + + + Decrease Opacity + + + + + Close + Sluiten + + + + PixelateTool + + + Pixelate + Pixelvorming + + + + Set Pixelate as the paint tool. + + + + Set Pixelate as the paint tool + Pixelvorming instellen als verfgereedschap + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QHotkey + + Failed to register %1. Error: %2 + '%1' kan niet worden ingesteld. Foutmelding: %2 + + + Failed to unregister %1. Error: %2 + '%1' kan niet worden vrijgegeven. Foutmelding: %2 + + + + QObject + + + Save Error + Fout tijdens opslaan + + + + + Capture saved as + De schermfoto is opgeslagen als + + + + + Capture saved to clipboard. + Schermfoto vastgelegd op klembord. + + + Capture saved to clipboard + De schermfoto is vastgelegd op het klembord + + + + Error while saving to clipboard + Fout tijdens opslaan op klembord + + + + + Error trying to save as + Fout tijdens opslaan als + + + + Save screenshot + Schermfoto opslaan + + + + Path copied to clipboard as + Pad gekopieerd naar klembord als + + + Saving canceled + Het opslaan is afgebroken + + + Save canceled + Het opslaan is afgebroken + + + Capture is saved and copied to the clipboard as + De schermfoto is opgeslagen en gekopieerd naar het klembord als + + + + Unable to connect via DBus + Kan niet verbinden via DBus + + + + Powerful yet simple to use screenshot software. + Eenvoudig doch krachtig schermfotoprogramma. + + + + See + Bekijken + + + Capture the entire desktop. + Leg de volledige werkomgeving vast. + + + + Open the capture launcher. + Open de schermfotostarter. + + + + Start a manual capture in GUI mode. + Start een handmatige vastlegging in programmamodus. + + + + Configure + Instellen + + + Capture a single screen. + Leg een beeldscherm vast. + + + Path where the capture will be saved + Het pad waar de schermfoto wordt opgeslagen + + + + Capture screenshot of all monitors at the same time. + + + + + Capture a screenshot of the specified monitor. + + + + + Existing directory or new file to save to + Bestaande map of nieuw bestand om op te slaan + + + + Save the capture to the clipboard + Schermfoto opslaan op klembord + + + + Pin the capture to the screen + Zet de opname vast op het scherm + + + + Upload screenshot + Upload screenshot + + + + Delay time in milliseconds + Wachttijd (in milliseconden) + + + + Repeat screenshot with previously selected region + Repeat screenshot with previously selected region + + + + Screenshot region to select + Screenshot regio te selecteren + + + + Set the filename pattern + Bestandsnaampatroon instellen + + + + Accept capture as soon as a selection is made + Accepteer vastlegging zodra een selectie is gemaakt + + + + Enable or disable the trayicon + Systeemvakpictogram in- of uitschakelen + + + + Enable or disable run at startup + Automatisch opstarten in- of uitschakelen + + + + Enable or disable the notifications + + + + + Check the configuration for errors + Controleer de configuratie op fouten + + + + Show the help message in the capture mode + Uitleg tonen in vastlegmodus + + + + Define the main UI color + Standaard vormgevingskleur instellen + + + + Define the contrast UI color + Standaard contrasterende vormgevingskleur instellen + + + + Print raw PNG capture + Onbewerkte PNG schermfoto tonen + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + Print de geometrie van de selectie in het formaat WxH+X+Y. Doet niets als raw is opgegeven + + + + Define the screen to capture (starting from 0) + Definieer het vast te leggen scherm (beginnend bij 0) + + + + Invalid delay, it must be a number greater than 0 + Ongeldige vertraging, het moet een getal groter dan 0 zijn + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + Ongeldige regio, gebruik 'BxH+X+Y' of 'alle' of 'screen0/screen1/...'. + + + + Invalid path, must be an existing directory or a new file in an existing directory + Ongeldig pad, moet een bestaande map zijn of een nieuw bestand in een bestaande map + + + Define the screen to capture + Kies het vast te leggen scherm + + + + default: screen containing the cursor + standaard: het scherm met de cursor + + + + Screen number + Beeldschermnummer + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Ongeldige kleur. Deze optie ondersteunt de volgende opmaken: +- #RGB (elke van R, G en B is een los hex-getal) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Kleurnamen, zoals 'blue' of 'red' +Mogelijk moet je het '#'-teken insluiten. Voorbeeld: '\#FFF' + + + Invalid delay, it must be higher than 0 + Ongeldige wachttijd: de wachttijd moet hoger dan 0 zijn + + + + Invalid screen number, it must be non negative + Ongeldig beeldschermnummer: het nummer mag geen negatief getal zijn + + + Invalid path, it must be a real path in the system + Ongeldig pad: het pad moet bestaan + + + + Invalid value, it must be defined as 'true' or 'false' + Ongeldige waarde: deze moet worden opgegeven als 'true' of 'false' + + + + Error + Fout + + + + Unable to write in + Kan niet wegschrijven naar + + + + Requested screen exceeds screen count + Requested screen exceeds screen count + + + + Full screen screenshot pinned to screen + Schermvullende schermafbeelding vastgepind op scherm + + + URL copied to clipboard. + URL gekopieerd naar klembord. + + + + Options + Opties + + + Arguments + Argumenten + + + arguments + argumenten + + + + Subcommands + + + + + subcommands + + + + + Usage + Gebruik + + + + options + opties + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Standaard wordt Flameshot op de achtergrond uitgevoerd en toont daarbij een systeemvakpictogram. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Hallo, hier ben ik! Klik op het systeemvakpictogram om een schermfoto te maken of rechtsklik om meer opties te tonen. + + + Toggle side panel + Zijpaneel in-/uitklappen + + + Resize selection left 1px + Afmetingen van selectie 1px aanpassen (links) + + + Resize selection right 1px + Afmetingen van selectie 1px aanpassen (rechts + + + Resize selection up 1px + Afmetingen van selectie 1px aanpassen (omhoog) + + + Resize selection down 1px + Afmetingen van selectie 1px aanpassen (omlaag) + + + Select entire screen + Gehele scherm selecteren + + + Move selection left 1px + Selectie 1px naar links verschuiven + + + Move selection right 1px + Selectie 1px naar rechts verschuiven + + + Move selection up 1px + Selectie 1px omhoog verschuiven + + + Move selection down 1px + Selectie 1px omlaag verschuiven + + + Commit text in text area + Tekst in tekstvak + + + Delete current tool + Huidig gereedschap verwijderen + + + + Quit capture + Vastleggen afsluiten + + + + Screenshot history + Schermfotogeschiedenis + + + + Capture screen + Scherm vastleggen + + + + Show color picker + Kleurkiezer tonen + + + + Change the tool's size + De grootte van het gereedschap wijzigen + + + Change the tool's thickness + Wijzig de gereedschapsdikte + + + + RectangleTool + + + Rectangle + Rechthoek + + + + Set the Rectangle as the paint tool + Rechthoek instellen als verfgereedschap + + + + RedoTool + + + Redo + Opnieuw + + + + Redo the next modification + Volgende wijziging opnieuw toepassen + + + + SaveTool + + + Save + Сачувај + Opslaan + + + + Save screenshot to a file + Screenshot opslaan als bestand + + + Save the capture + Schermfoto opslaan + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + + + + Unable to capture screen + Kan scherm niet vastleggen + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + Rechthoekige selectie + + + + Set Selection as the paint tool + Selectie instellen als verfgereedschap + + + + SetShortcutDialog + + + Set Shortcut + Sneltoets instellen + + + + Enter new shortcut to change + Druk op een nieuwe sneltoets voor + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Druk op Esc om af te breken of ⌘+Backspace om deze sneltoets uit te schakelen. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Druk op Esc om af te breken of Backspace om de sneltoets uit te schakelen. + + + + + Flameshot must be restarted for changes to take effect. + Flameshot moet opnieuw worden opgestart om de wijzigingen van kracht te laten worden. + + + + ShortcutsWidget + + + Hot Keys + Sneltoetsen + + + + Available shortcuts in the screen capture mode. + Beschikbare sneltoetsen in de vastlegmodus. + + + + Description + Omschrijving + + + + Key + Toets + + + + Left Double-click + Left Double-click + + + + Toggle side panel + Zijpaneel in-/uitklappen + + + + Grab a color from the screen + + + + + Resize selection left 1px + Afmetingen van selectie 1px aanpassen (links) + + + + Resize selection right 1px + Afmetingen van selectie 1px aanpassen (rechts + + + + Resize selection up 1px + Afmetingen van selectie 1px aanpassen (omhoog) + + + + Resize selection down 1px + Afmetingen van selectie 1px aanpassen (omlaag) + + + + Symmetrically decrease width by 2px + + + + + Symmetrically increase width by 2px + + + + + Symmetrically increase height by 2px + + + + + Symmetrically decrease height by 2px + + + + + Select entire screen + Gehele scherm selecteren + + + + Move selection left 1px + Selectie 1px naar links verschuiven + + + + Move selection right 1px + Selectie 1px naar rechts verschuiven + + + + Move selection up 1px + Selectie 1px omhoog verschuiven + + + + Move selection down 1px + Selectie 1px omlaag verschuiven + + + + Commit text in text area + Tekst in tekstvak + + + + Delete selected drawn object + + + + + Cancel current selection + + + + Delete current tool + Huidig gereedschap verwijderen + + + + Capture screen + Scherm vastleggen + + + + Screenshot history + Schermfotogeschiedenis + + + + SidePanelWidget + + Active thickness: + Actieve dikte: + + + Active color: + Actieve kleur: + + + Press ESC to cancel + Druk op Esc om te annuleren + + + + Active tool size: + Actief gereedschap: + + + + Active Color: + Active Color: + + + + Grab Color + Kleur opnemen + + + + Display grid + + + + + SizeDecreaseTool + + + Decrease Tool Size + Gereedschapsomvang verlagen + + + + Decrease the size of the other tools + Verlaag de omvang van andere gereedschappen + + + + SizeIncreaseTool + + + Increase Tool Size + Gereedschapsomvang verhogen + + + + Increase the size of the other tools + Verhoog de omvang van andere gereedschappen + + + + SizeIndicatorTool + + Selection Size Indicator + Grootte indicatie van selectie + + + Show X and Y dimensions of the selection + Toon X en Y afmetingen van de selectie + + + Show the dimensions of the selection (X Y) + Toon de afmetingen van de selectie (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + Eeuw (00-99) + + + + Year (00-99) + Jaar (00-99) + + + + Year (2000) + Jaar (2000) + + + + Month Name (jan) + Naam van de maand (јаn) + + + + Month Name (january) + Naam van de maand (јаnuari) + + + + Month (01-12) + Maand (01-12) + + + + Week Day (1-7) + Weekdag (1-7) + + + + Week (01-53) + Wek (01-53) + + + + Day Name (mon) + Naam van de dag (ma) + + + + Day Name (monday) + Naam van de dag (maandag) + + + + Day (01-31) + Dag (01-31) + + + + Day of Month (1-31) + Dag van de maand (1-31) + + + + Day (001-366) + Dag (001-366) + + + + Time (%H-%M-%S) + Tijd (%H-%M-%S) + + + + Time (%H-%M) + Tijd (%H-%M) + + + + Hour (00-23) + Uur (00-23) + + + + Hour (01-12) + Uur (01-12) + + + + Minute (00-59) + Minuten (00-59) + + + + Second (00-59) + Seconden (00-59) + + + + Full Date (%m/%d/%y) + Volledige datum (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + Volledige datum (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + + + + + SystemNotification + + + Flameshot Info + Flameshot informatie + + + + TextConfig + + + StrikeOut + Doorhalen + + + + Underline + Onderstrepen + + + + Bold + Vetgedrukt + + + + Italic + Cursief + + + + Left Align + Links uitlijnen + + + + Center Align + Midden uitlijnen + + + + Right Align + Rechts uitlijnen + + + + TextTool + + + Text + Tekst + + + + Add text to your capture + Voeg tekst toe aan je schermfoto + + + + TrayIcon + + + &Take Screenshot + Schermfo&to maken + + + + &Open Launcher + Starter &openen + + + + &Configuration + &Configuratie + + + + &About + &Over + + + + Check for updates + Controleren op updates + + + + New version %1 is available + Er is een nieuwe versie beschikbaar: %1 + + + + &Quit + &Afsluiten + + + + &Latest Uploads + Recentste up&loads + + + + &Open Save Path + + + + + UIcolorEditor + + UI Color Editor + Kleurenschemabewerker + + + + Change the color moving the selectors and see the changes in the preview buttons. + Wijzig de kleur d.m.v. de selectie-indicators en bekijk de wijzigingen op de voorbeeldknoppen. + + + + Select a Button to modify it + Selecteer een knop om deze te bewerken + + + + Main Color + Hoofdkleur + + + + Click on this button to set the edition mode of the main color. + Klik op deze knop om de hoofdkleur te bewerken. + + + + Contrast Color + Contrastkleur + + + + Click on this button to set the edition mode of the contrast color. + Klik op deze knop om de contrastkleur te bewerken. + + + + UndoTool + + + Undo + Ongedaan maken + + + + Undo the last modification + Laatste wijziging ongedaan maken + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + Er is een nieuwe versie beschikbaar: %1 + + + + Ignore + Negeren + + + + Later + Straks + + + + Update + Bijwerken + + + + UploadHistory + + + Upload History + Uploaden Geschiedenis + + + + Screenshots history is empty + Schermopname geschiedenis is leeg + + + + UploadLineItem + + + Form + Formulier + + + + TextLabel + TekstLabel + + + + Copy URL + Kopieer URL + + + + Open In Browser + Openen in browser + + + + Confirm to delete + Bevestig om te verwijderen + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Weet je zeker dat je de schermopname wilt verwijderen uit de recentste uploads en van de server? + + + + UtilityPanel + + + Close + Sluiten + + + + <Empty> + <Leeg> + + + + VisualsEditor + + + Opacity of area outside selection: + Doorzichtigheid van gebied buiten selectie: + + + + UI Color Editor + Gebruikersomgeving kleur bewerker + + + + Colorpicker Editor + Kleurkiezer bewerker + + + + Button Selection + Knopselectie + + + + Select All + Alles selecteren + + + + color_widgets::ColorDialog + + + Pick + Kies + + + + color_widgets::ColorPalette + + + Unnamed + Naamloos + + + + color_widgets::ColorPaletteModel + + + Unnamed + Naamloos + + + + %1 (%2 colors) + %1 (%2 kleuren) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + Open een nieuw palet vanuit een bestand + + + + + Create a new palette + Maak een nieuw palet + + + + + Duplicate the current palette + Dupliceer het huidige palet + + + + + Delete the current palette + Verwijder het huidige palet + + + + + Revert changes to the current palette + Wijzigingen terugdraaien naar het huidige palet + + + + + Save changes to the current palette + Wijzigingen opslaan in het huidige palet + + + + + Add a color to the palette + Voeg een kleur toe aan het palet + + + + + Remove the selected color from the palette + Verwijder de geselecteerde kleur uit het palet + + + + + New Palette + Nieuw Palet + + + + + Name + Name + + + + GIMP Palettes (*.gpl) + GIMP Paletten (*.gpl) + + + + Palette Image (%1) + Palet afbeelding (%1) + + + + All Files (*) + Alle bestanden (*) + + + + + Open Palette + Palet openen + + + + Failed to load the palette file +%1 + Het laden van het paletbestand is mislukt +%1 + + + + color_widgets::GradientEditor + + + Add Color + Kleur toevoegen + + + + Remove Color + Verwijder Kleur + + + + Edit Color... + Bewerk Kleur... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 kleuren) + + + + color_widgets::Swatch + + + Clear Color + Heldere Kleur + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_pl.ts b/data/translations/Internationalization_pl.ts new file mode 100644 index 0000000..fd07783 --- /dev/null +++ b/data/translations/Internationalization_pl.ts @@ -0,0 +1,3204 @@ + + + + + AbstractWidgetList + + + Add New + Dodaj nowy + + + + Move Up + Ruch w górę + + + + Move Down + Ruch w dół + + + + Remove + Usuń + + + + AcceptTool + + + Accept + Akceptuj + + + + Accept the capture + Akceptuj zrzut + + + + AppLauncher + + + App Launcher + Uruchamianie aplikacji + + + + Choose an app to open the capture + Wybierz aplikację do otwierania zrzutu + + + + AppLauncherWidget + + + Open With + Otwórz za pomocą + + + + Launch in terminal + Otwórz w konsoli + + + + Keep open after selection + Pozostaw otwarte po zaznaczeniu + + + + + Error + Błąd + + + + Unable to write in + Nie można zapisać + + + + Unable to launch in terminal. + Nie można uruchomić w terminalu. + + + + ArrowTool + + + Arrow + Strzałka + + + + Set the Arrow as the paint tool + Wybierz strzałkę jako narzędzie rysowania + + + + BlurTool + + Blur + Rozmycie + + + Set Blur as the paint tool + Rozmywanie obszarów + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Tryb przechwytywania</b> + + + + Rectangular Region + Zaznaczony obszar + + + + Full Screen (Current Display) + Pełny ekran (obecny monitory) + + + + Full Screen (All Monitors) + Pełny ekran (wszystkie monitory) + + + + No Delay + Bez opóźnienia + + + + second + sekunda + + + + + + seconds + sekundy + + + + + Take new screenshot + Wykonaj nowy zrzut ekranu + + + + + Area: + Obszar: + + + + + Capture Launcher + Capture Launcher + + + + + TextLabel + TextLabel + + + + + Capture Mode + Capture Mode + + + + + Delay: + Opóźnienie: + + + + + WxH+x+y + WxH+x+y + + + + CaptureWidget + + + Unable to capture screen + Nie można przechwycić ekranu + + + + Mouse + Myszka + + + + Select screenshot area + Wybierz obszar zrzutu ekranu + + + + Mouse Wheel + Kółko myszy + + + + Change tool size + Zmień rozmiar narzędzia + + + + Right Click + Prawy przycisk + + + + Show color picker + Pokaż próbnik kolorów + + + + Open side panel + Otwórz panel boczny + + + + Esc + Esc + + + + Exit + Wyjdź + + + + Quit Capture + + + + + Are you sure you want to quit capture? + + + + + Do not show this again + + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot przeszedł w tryb działania w tle. Skróty klawiszowe nie zadziałają dopóki gdzieś nie klikniesz. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + Błąd konfiguracji rozwiązany. Otwórz 'flameshot gui' ponownie. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Wybierz obszar za pomocą myszy lub wciśnij Esc aby wyjść. +Wciśnij Enter, aby wykonać zrzut ekranu. +Prawy klik, aby pokazać próbnik kolorów. +Użyj kółka myszy aby zmienić grubość narzędzia. +Spacja, aby pokazać panel boczny. + + + + Tool Settings + Ustawienia narzędzi + + + + CircleCountTool + + + Circle Counter + Licznik + + + + Add an autoincrementing counter bubble + Dodaj automatycznie zwiększający się bąbelek licznika + + + + CircleTool + + + Circle + Okręgi + + + + Set the Circle as the paint tool + Rysowanie okręgów i elips + + + + ColorDialog + + + + Select Color + Wybierz kolor + + + + + Saturation + Nasycenie + + + + + Hue + Barwa + + + + + Hex + Kod heksadecymalny + + + + + Blue + Niebieski + + + + + Value + Wartość + + + + + Green + Zielony + + + + + Alpha + Alfa + + + + + Red + Czerwony + + + + ColorGrabWidget + + + Accept color + Akceptuj kolor + + + + Enter or Left Click + Enter or Left Click + + + + Precisely select color + Wybierz kolor precyzyjnie + + + + Hold Left Click + Hold Left Click + + + + Toggle magnifier + Włącz/wyłącz lupę + + + + Space or Right Click + Space or Right Click + + + + Cancel + Anuluj + + + + Esc + Esc + + + + ColorPickerEditor + + + Edit Preset: + Edit Preset: + + + + Enter color to update preset + Enter color to update preset + + + + Update + Aktualizuj + + + + Press button to update the selected preset + Press button to update the selected preset + + + + Delete + Usuń + + + + Press button to delete the selected preset + Press button to delete the selected preset + + + + Add Preset: + Add Preset: + + + + Enter color manually or select it using the color-wheel + Enter color manually or select it using the color-wheel + + + + Add + Dodaj + + + + Press button to add preset + Press button to add preset + + + + + Error + Błąd + + + + Unable to add preset. Maximum limit reached. + Unable to add preset. Maximum limit reached. + + + + Unable to remove preset. Minimum limit reached. + Unable to remove preset. Minimum limit reached. + + + + ConfigErrorDetails + + + Configuration errors + Błędy konfiguracji + + + + ConfigHandler + + + Unrecognized setting: '%1' + + Nieznane ustawienie: '%1' + + + + + Unrecognized shortcut name: '%1'. + + Nieznany skrót klawiszowy: '%1'. + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + Konflikt skrótów klawiszowych: '%1' i '%2' mają przypisany ten sam skrót: %3 + + + + + Bad value in '%1'. Expected: %2 + + Nieprawidłowa wartość w '%1'. Oczekiwano: %2 + + + + + You have successfully resolved the configuration error. + Rozwiązałeś błąd konfiguracji. + + + + The configuration contains an error. Open configuration to resolve. + Konfiguracja zawiera błąd. Otwórz konfigurację by go rozwiązać. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + Nieprawidłowy klucz konfiguracji: '%1'. Zgłoś to jako błąd. + + + + ConfigResolver + + + Resolve configuration errors + Rozwiąż błędy konfiguracji + + + + <b>You must resolve all errors before continuing:</b> + <b>Musisz rozwiązać wszystkie błędy przed kontynuowaniem:</b> + + + + Reset + Przywróć + + + + Reset to the default value. + Przywróć do wartości domyślnej. + + + + Remove + Usuń + + + + Remove this setting. + Usuń to ustawienie. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + Niektóre skróty klawiszowe są w konflikcie. +To NIE spowoduje zamknięcia programu. +Rozwiąż błędy ręcznie w pliku konfiguracyjnym. + + + + Resolve all + Rozwiąż wszystkie + + + + Resolve all listed errors. + Rozwiąż wszystkie błędy. + + + + Details + Szczegóły + + + + ConfigWindow + + + Configuration + Konfiguracja + + + + Interface + Interfejs + + + + Filename Editor + Edytor nazw plików + + + + General + Ogólne + + + + Shortcuts + Skróty + + + + Resolve + Rozwiąż + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>Plik konfiguracyjny zawiera błędy. Rozwiąż je przed kontynuowaniem.</b> + + + + Controller + + New version %1 is available + Nowa wersja %1 jest dostępna + + + You have the latest version + Masz najnowszą wersję + + + Failed to get information about the latest version. + Nie udało się uzyskać informacji o najnowszej wersji. + + + Error + Błąd + + + Unable to close active modal widgets + Nie można zamknąć aktywnych widżetów modalnych + + + &Take Screenshot + &Zrzut ekranu + + + &Open Launcher + &Pokaż ekran startowy + + + &Configuration + &Konfiguracja + + + &About + &O programie + + + Check for updates + Sprawdź aktualizacje + + + &Latest Uploads + &Ostatnio wysłane + + + URL copied to clipboard. + URL skopiowany do schowka. + + + &Information + &Informacje + + + &Quit + &Wyjdź + + + + CopyTool + + + Copy + Kopiuj + + + + Copy selection to clipboard + Kopiuj zaznaczenie do schowka + + + Copy the selection into the clipboard + Kopiuj zaznaczony obszar do schowka + + + + DBusUtils + + Unable to connect via DBus + Nie można się połączyć za pomocą DBus + + + + ExitTool + + + Exit + Wyjdź + + + + Leave the capture screen + Opuść ekran przechwytywania + + + + FileNameEditor + + + Edit the name of your captures: + Edycja wzorca nazwy plików: + + + + Edit: + Edytuj: + + + + Preview: + Podgląd: + + + + Save + Zapisz + + + + Saves the pattern + Zapisuje wzorzec + + + + Restore + Przywróć + + + Reset + Reset + + + + Restores the saved pattern + Przywraca zapisany wzorzec + + + + Clear + Wyczyść + + + + Deletes the name + Usuwa nazwę + + + + Flameshot + + + Error + Błąd + + + + Unable to close active modal widgets + Nie można zamknąć aktywnych widżetów modalnych + + + + URL copied to clipboard. + Adres URL został skopiowany do schowka. + + + + FlameshotDaemon + + + New version %1 is available + Dostępna jest nowa wersja %1 + + + + You have the latest version + Masz najnowszą wersję + + + + Failed to get information about the latest version. + Nie udało się uzyskać informacji o najnowszej wersji. + + + + Unable to connect via DBus + Nie można nawiązać połączenia z DBus + + + + GeneneralConf + + Import + Import + + + Error + Błąd + + + Unable to read file. + Nie można odczytać pliku. + + + Unable to write file. + Nie można zapisać pliku. + + + Save File + Zapisz plik + + + Confirm Reset + Potwierdź Reset + + + Are you sure you want to reset the configuration? + Czy na pewno chcesz zresetować konfigurację? + + + Show help message + Pokaż podpowiedzi + + + Show the help message at the beginning in the capture mode. + Pokaż podpowiedzi na początku trybu przechwytywania. + + + Show desktop notifications + Pokaż powiadomienia ekranowe + + + Show tray icon + Pokaż ikonę w trayu + + + Show the systemtray icon + Pokaż ikonę w zasobniku systemowym + + + Configuration File + Plik konfiguracyjny + + + Export + Export + + + Reset + Reset + + + Launch at startup + Uruchom podczas startu + + + Launch Flameshot + Uruchom Flameshot + + + Close after capture + Zamknij po wykonaniu zrzutu + + + Close after taking a screenshot + Zamknij po wykonaniu zrzutu ekranu + + + Copy URL after upload + Kopiuj adres URL po wysłaniu + + + Copy URL and close window after upload + Kopiuj adres URL po wysłaniu i zamknij okno + + + + GeneralConf + + + + Import + Importuj + + + + + + + Error + Błąd + + + + Unable to read file. + Nie można odczytać pliku. + + + + + Unable to write file. + Nie można zapisać pliku. + + + + Save File + Zapisz plik + + + + Confirm Reset + Potwierdź przywracanie + + + + Are you sure you want to reset the configuration? + Czy na pewno chcesz przywrócić konfigurację domyślną? + + + + Show help message + Pokaż podpowiedzi + + + Show the help message at the beginning in the capture mode. + Pokaż podpowiedzi na początku trybu przechwytywania. + + + + Show the side panel button + Pokaż przycisk panelu bocznego + + + Show the side panel toggle button in the capture mode. + Pokaż przełącznik panelu bocznego w trybie przechwytywania. + + + + Show desktop notifications + Pokaż powiadomienia ekranowe + + + + Show tray icon + Pokaż ikonę w centrum akcji + + + Show the systemtray icon + Pokaż ikonę w zasobniku systemowym + + + + Confirmation required to delete screenshot from the latest uploads + Potwierdź aby usunąć zrzuty z ostatnio wysłanych + + + + Configuration File + Plik konfiguracyjny + + + + Export + Eksportuj + + + + Reset + Przywróć + + + + Automatic check for updates + Automatycznie sprawdzaj aktualizacje + + + + Allow multiple flameshot GUI instances simultaneously + Zezwól na wiele instancji flameshot GUI jednocześnie + + + This allows you to take screenshots of flameshot itself for example. + To ustawienie zezwala na chociażby tworzenie zrzutu ekranów samego flameshot'a. + + + Automatically close daemon when it is not needed + Automatycznie zamykaj deamon, gdy nie jest już potrzebny + + + Launch at startup + Uruchom podczas startu + + + Launch Flameshot + Uruchom Flameshot + + + + Show welcome message on launch + Pokaż wiadomość powitalną przy starcie + + + + Use large predefined color palette + Używaj dużej predefiniowanej palety kolorów + + + + Copy URL after upload + Kopiuj adres URL po wysłaniu + + + Copy URL and close window after upload + Kopiuj adres URL i zamknij okno po wysłaniu + + + + Save image after copy + Zapisz obraz po skopiowaniu + + + Save image file after copying it + Zapisz plik obrazu po skopiowaniu + + + + Show the help message at the beginning in the capture mode + Show the help message at the beginning in the capture mode + + + + Use last region for GUI mode + Use last region for GUI mode + + + + Use the last region as the default selection for the next screenshot in GUI mode + Use the last region as the default selection for the next screenshot in GUI mode + + + + Show the side panel toggle button in the capture mode + Show the side panel toggle button in the capture mode + + + + Enable desktop notifications + Enable desktop notifications + + + + Show abort notifications + + + + + Enable abort notifications + + + + + Show icon in the system tray + Show icon in the system tray + + + + Use grim to capture screenshots + + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + + + + + Ask for confirmation to delete screenshot from the latest uploads + Ask for confirmation to delete screenshot from the latest uploads + + + + Check for updates automatically + Check for updates automatically + + + + This allows you to take screenshots of Flameshot itself for example + This allows you to take screenshots of Flameshot itself for example + + + Launch Flameshot daemon when computer is booted + Launch Flameshot daemon when computer is booted + + + + Show the welcome message box in the middle of the screen while taking a screenshot + Show the welcome message box in the middle of the screen while taking a screenshot + + + + Use a large predefined color palette + Use a large predefined color palette + + + + Copy on double click + Copy on double click + + + Enable Copy on Double Click + Enable Copy on Double Click + + + Copy URL and close window after uploading was successful + Copy URL and close window after uploading was successful + + + + Automatically unload from memory when it is not needed + + + + + Automatically close daemon (background process) when it is not needed + + + + + Launch in background at startup + + + + + Launch Flameshot daemon (background process) when computer is booted + + + + + Ask before quit capture + + + + + Show the confirmation prompt before ESC quit + + + + + Enable Copy to clipboard on Double Click + + + + + Copy URL after uploading was successful + + + + + After copying the screenshot, save it to a file as well + After copying the screenshot, save it to a file as well + + + + Save Path + Zapisz ścieżkę + + + + Change... + Zmień... + + + + Use fixed path for screenshots to save + Użyj ustalonej ścieżki do zapisywania zrzutów + + + + Preferred save file extension: + Preferowane rozszerzenie plików zapisu: + + + + Latest Uploads Max Size + Maksymalny rozmiar ostatniego wysyłania + + + + Imgur Application Client ID + Imgur Application Client ID + + + + Undo limit + Limit cofania + + + + Use JPG format for clipboard (PNG default) + Użyj formatu JPG dla schowka (domyślnie PNG) + + + + Use lossy JPG format for clipboard (lossless PNG default) + + + + + Copy file path after save + Skopiuj ścieżkę pliku po zapisaniu + + + + Copy the file path to clipboard after the file is saved + Copy the file path to clipboard after the file is saved + + + + Anti-aliasing image when zoom the pinned image + Zastosuj anti-aliasing podczas przybliżania przypiętego obrazu + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + Po przybliżeniu przypiętego obrazu, obraz powinien zostać wygładzony czy rozmazany + + + + + Upload image without confirmation + Wyślij obraz bez potwierdzenia + + + + Choose a Folder + Wybierz folder + + + + Unable to write to directory. + Nie można zapisać do folderu. + + + + Show magnifier + Show magnifier + + + + Enable a magnifier while selecting the screenshot area + Enable a magnifier while selecting the screenshot area + + + + Square shaped magnifier + Square shaped magnifier + + + + Make the magnifier to be square-shaped + Make the magnifier to be square-shaped + + + + Milliseconds before geometry display hides; 0 means do not hide + + + + + Set geometry display timeout (ms) + + + + + Selection Geometry Display + + + + + Display Location + + + + + None + + + + + Top Left + + + + + Top Right + + + + + Bottom Left + + + + + Bottom Right + + + + + Center + + + + + Quality range of 0-100; Higher number is better quality and larger file size + + + + + JPEG Quality + + + + + Reverse arrow + + + + + Draw the arrow head first + + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + Ostatnio wysłane + + + Screenshots history is empty + Historia zrzutów jest pusta + + + Copy URL + Kopiuj URL + + + URL copied to clipboard. + URL skopiowany do schowka. + + + Open in browser + Otwórz w przeglądarce + + + Confirm to delete + Potwierdź usunięcie + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Czy na pewno chcesz usunąć zrzut ekranu z ostatnio wysłanych i z serwera? + + + + ImgS3Uploader + + Uploading Image + Wysyłanie obrazka + + + URL copied to clipboard. + URL skopiowany do schowka. + + + Error + Błąd + + + + ImgUploadDialog + + + Upload Confirmation + Potwierdzenie wysyłania + + + + Do you want to upload this capture? + Czy na pewno chcesz wysłać ten zrzut ekranu? + + + + + Upload without confirmation + Wyślij bez potwierdzenia + + + + ImgUploader + + Uploading Image + Wysyłanie obrazka + + + Unable to open the URL. + Nie można otworzyć adresu URL. + + + URL copied to clipboard. + URL skopiowany do schowka. + + + Screenshot copied to clipboard. + Zrzut ekranu skopiowany do schowka. + + + Copy URL + Kopiuj URL + + + Open URL + Otwórz URL + + + Delete image + Usuń obrazek + + + Image to Clipboard. + Obrazek do schowka. + + + + ImgUploaderBase + + + Upload image + Wyślij obraz + + + + Uploading Image + Wysyłanie obrazu + + + + Copy URL + Kopiuj URL + + + + Open URL + Otwórz URL + + + + Delete image + Usuń obraz + + + + Image to Clipboard. + Obraz do schowka. + + + + Save image + Zapisz obraz + + + + Unable to open the URL. + Nie można otworzyć adresu URL. + + + + URL copied to clipboard. + URL skopiowany do schowka. + + + + Screenshot copied to clipboard. + Zrzut ekranu skopiowany do schowka. + + + + Unable to save the screenshot to disk. + Unable to save the screenshot to disk. + + + + Screenshot saved. + Screenshot saved. + + + + ImgUploaderTool + + + Image Uploader + Wysyłanie obrazów + + + + Upload the selection + Wyślij zaznaczenie + + + + ImgurUploader + + Upload to Imgur + Wyślij do Imgur + + + Uploading Image + Wysyłanie obrazka + + + Copy URL + Kopiuj URL + + + Open URL + Otwórz URL + + + Delete image + Usuń obrazek + + + Image to Clipboard. + Obrazek do schowka. + + + + Unable to open the URL. + Nie można otworzyć adresu URL. + + + URL copied to clipboard. + URL skopiowany do schowka. + + + Screenshot copied to clipboard. + Zrzut ekranu skopiowany do schowka. + + + + ImgurUploaderTool + + Image Uploader + Uploader obrazów + + + Upload the selection to Imgur + Wyślij zaznaczenie do Imgur + + + + InfoWindow + + + + About + O programie + + + + + Icon + Icon + + + + + License + License + + + + + GPLv3+ + GPLv3+ + + + + + Version + Version + + + + + Flameshot v + Flameshot v + + + + + OS Info + OS Info + + + + + Copy Info + Copy Info + + + SPACEBAR + SPACJA + + + Right Click + Prawy klik + + + Mouse Wheel + Kółko myszy + + + Move selection 1px + Przesuń zaznaczenie o 1px + + + Resize selection 1px + Zmień rozmiar zaznaczenia o 1px + + + Quit capture + Zakończ przechwytywanie + + + Copy to clipboard + Kopiuj do schowka + + + Save selection as a file + Zapisz zaznaczenie jako plik + + + Undo the last modification + Cofnij ostatnią modyfikację + + + Toggle visibility of sidebar with options of the selected tool + Przełącz widoczność paska bocznego z opcjami wybranego narzędzia + + + Show color picker + Pokaż próbnik kolorów + + + Change the tool's thickness + Zmień grubość narzędzia + + + Available shortcuts in the screen capture mode. + Dostępne skróty w trybie przechwytywania obrazu. + + + Key + Klawisz + + + Description + Działanie + + + <u><b>License</b></u> + <u><b>Licencja</b></u> + + + <u><b>Version</b></u> + <u><b>Wersja</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Skróty klawiszowe</b></u> + + + + InvertTool + + + Invert + Odwróć + + + + Set Inverter as the paint tool + Wybierz Odwrócenie jako narzędzie rysowania + + + + LineTool + + + Line + Linia + + + + Set the Line as the paint tool + Ustaw Linię jako narzędzie rysowania + + + + MarkerTool + + + Marker + Marker + + + + Set the Marker as the paint tool + Ustaw Marker jako narzędzie rysowania + + + + MoveTool + + + Move + Przesuwanie + + + + Move the selection area + Przesuń zaznaczenie + + + + PencilTool + + + Pencil + Ołówek + + + + Set the Pencil as the paint tool + Ustaw Ołówek jako narzędzie rysowania + + + + PinTool + + + Pin Tool + Narzędzie przypinania + + + + Pin image on the desktop + Przypnij obraz do pulpitu + + + + PinWidget + + + Context menu + Context menu + + + + Copy to clipboard + Kopiuj do schowka + + + + Save to file + Save to file + + + + Rotate Right + + + + + Rotate Left + + + + + Increase Opacity + + + + + Decrease Opacity + + + + + Close + Zamknij + + + + PixelateTool + + + Pixelate + Rozmazywanie + + + + Set Pixelate as the paint tool. + + + + Set Pixelate as the paint tool + Ustaw Rozmazywanie jako narzędzie rysowania + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QHotkey + + Failed to register %1. Error: %2 + Nie udało się zarejestrować %1. Błąd: %2 + + + Failed to unregister %1. Error: %2 + Nie udało się wyrejestrować %1. Błąd: %2 + + + + QObject + + + Save Error + Błąd zapisu + + + + + Capture saved as + Zrzut ekranu zapisany jako + + + + + Capture saved to clipboard. + Zrzut ekranu skopiowano do schowka. + + + Capture saved to clipboard + Zrzut skopiowano do schowka + + + + Error while saving to clipboard + Błąd podczas kopiowania do schowka + + + + + Error trying to save as + Błąd przy próbie zapisu jako + + + + Save screenshot + Zapisz zrzut ekranu + + + + Path copied to clipboard as + Ścieżka zapisana do schowka jako + + + Saving canceled + Saving canceled + + + Save canceled + Save canceled + + + Capture is saved and copied to the clipboard as + Zrzut jest zapisywany i kopiowany do schowka jako + + + + Unable to connect via DBus + Nie udało się połączyć za pomocą DBus + + + + Powerful yet simple to use screenshot software. + Zaawansowany lecz prosty w użyciu program do zrzutów ekranu. + + + + See + Zobacz + + + Capture the entire desktop. + Przechwyć cały pulpit. + + + + Open the capture launcher. + Otwórz program do zrzutów. + + + + Start a manual capture in GUI mode. + Rozpocznij przechwytywanie w trybie GUI. + + + + Configure + Konfiguruj + + + Capture a single screen. + Przechwyć pojedynczy ekran. + + + Path where the capture will be saved + Ścieżka do której zrzut zostanie zapisany + + + + Capture screenshot of all monitors at the same time. + + + + + Capture a screenshot of the specified monitor. + + + + + Existing directory or new file to save to + Docelowy istniejący folder lub nowy plik + + + + Save the capture to the clipboard + Zapisz zrzut do schowka + + + + Pin the capture to the screen + Przypnij zrzut do ekranu + + + + Upload screenshot + Wyślij zrzut ekranu + + + + Delay time in milliseconds + Opóźnienie w milisekundach + + + + Repeat screenshot with previously selected region + Repeat screenshot with previously selected region + + + + Screenshot region to select + Obszar zrzutu ekranu do zaznaczenia + + + + Set the filename pattern + Ustaw wzorzec nazwy pliku + + + + Accept capture as soon as a selection is made + Zatwierdź zrzut ekranu w momencie zaznaczenia + + + + Enable or disable the trayicon + Włącz lub wyłącz ikonę w centrum akcji + + + + Enable or disable run at startup + Włącz lub wyłącz uruchamianie przy starcie + + + + Enable or disable the notifications + + + + + Check the configuration for errors + Szukaj błędów w konfiguracji + + + + Show the help message in the capture mode + Pokaż pomoc w trybie przechwytywania + + + + Define the main UI color + Zdefiniuj główny kolor interfejsu + + + + Define the contrast UI color + Zdefiniuj kontrastowy kolor interfejsu + + + + Print raw PNG capture + Wydrukuj nieprzetworzony zrzut PNG + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + Drukuj geometrię zaznaczenia w formacie WxH+X+Y. Brak efektu jeśli wybrano nieprzetwarzanie + + + + Define the screen to capture (starting from 0) + Wybierz ekran do zrzutu (zaczynając od 0) + + + + Invalid delay, it must be a number greater than 0 + Nieprawidłowe opóźnienie; wartość musi być liczbą większą od 0 + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + Nieprawidłowy region; wybierz 'WxH+X+Y' lub 'all' lub 'screen0/screen1/...'. + + + + Invalid path, must be an existing directory or a new file in an existing directory + Nieprawidłowa ścieżka; musi być istniejącym folderem lub nowym plikiem w istniejącym folderze + + + Define the screen to capture + Zdefiniuj ekran do przechwycenia + + + + default: screen containing the cursor + domyślnie: ekran zawierający kursor + + + + Screen number + Numer ekranu + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Niepoprawny kolor, wspierane są następujące formaty: +- #RGB (każdy R, G, i B jest pojedynczym numerem szesnastkowym) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Nazwane kolory jak 'blue' lub 'red' +Może być konieczne opuszczenie znaku '#' jak np.: '\#FFF' + + + Invalid delay, it must be higher than 0 + Niepoprawne opóźnienie, musi być większe od 0 + + + + Invalid screen number, it must be non negative + Niepoprawny numer ekranu, musi być liczbą nieujemną + + + Invalid path, it must be a real path in the system + Niepoprawna ścieżka, to musi być rzeczywista ścieżka w systemie + + + + Invalid value, it must be defined as 'true' or 'false' + Niepoprawna wartość, musi być zdefiniowana jako 'true' lub 'false' + + + + Error + Błąd + + + + Unable to write in + Nie można zapisać w + + + + Requested screen exceeds screen count + Requested screen exceeds screen count + + + + Full screen screenshot pinned to screen + Zrzut pełnoekranowy przypięty do ekranu + + + URL copied to clipboard. + URL skopiowany do schowka. + + + + Options + Opcje + + + Arguments + Argumenty + + + arguments + argumenty + + + + Subcommands + + + + + subcommands + + + + + Usage + Użycie + + + + options + opcje + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Domyślnie uruchamia Flameshot w tle i dodaje ikonę w zasobniku do konfiguracji. + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Domyślnie uruchamia Flameshot w tle i dodaje ikonę w zasobniku systemowym do konfiguracji. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Cześć, jestem tutaj! Kliknij ikonę w zasobniku, aby zrobić zrzut ekranu, lub kliknij prawym przyciskiem, aby zobaczyć więcej opcji. + + + Toggle side panel + Przełącz panel boczny + + + Resize selection left 1px + Zmień rozmiar zaznaczenia w lewo o 1 piksel + + + Resize selection right 1px + Zmień rozmiar zaznaczenia w prawo o 1 piksel + + + Resize selection up 1px + Zmień rozmiar zaznaczenia w górę o 1 piksel + + + Resize selection down 1px + Zmień rozmiar zaznaczenia w dół o 1 piksel + + + Select entire screen + Wybierz cały ekran + + + Move selection left 1px + Przesuń zaznaczenie w lewo o 1 piksel + + + Move selection right 1px + Przesuń zaznaczenie w prawo o 1 piksel + + + Move selection up 1px + Przesuń zaznaczenie w górę o 1 piksel + + + Move selection down 1px + Przesuń zaznaczenie w dół o 1 piksel + + + Commit text in text area + Zatwierdź tekst w obszarze tekstowym + + + Delete current tool + Delete current tool + + + + Quit capture + Zakończ przechwytywanie + + + + Screenshot history + Historia zrzutów ekranu + + + + Capture screen + Przechwyć ekran + + + + Show color picker + Pokaż próbnik kolorów + + + + Change the tool's size + Zmień rozmiar narzędzia + + + Change the tool's thickness + Zmień grubość narzędzia + + + + RectangleTool + + + Rectangle + Prostokąt + + + + Set the Rectangle as the paint tool + Ustaw Prostokąt jako narzędzie rysowania + + + + RedoTool + + + Redo + Ponów + + + + Redo the next modification + Ponów następną modyfikację + + + + SaveTool + + + Save + Zapisz + + + + Save screenshot to a file + Zapisz zrzut ekranu do pliku + + + Save the capture + Zapisz zaznaczenie + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + + + + Unable to capture screen + Nie można przechwycić ekranu + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + Zaznaczenie prostokątne + + + + Set Selection as the paint tool + Ustawia Zaznaczenie prostokątne jako narzędzie rysowania + + + + SetShortcutDialog + + + Set Shortcut + Ustaw skróty klawiszowe + + + + Enter new shortcut to change + Wprowadź nowy skrót klawiszowy do zmiany + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Naciśnij Esc, by anulować lub ⌘+Backspace by wyłączyć skrót klawiszowy. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Naciśnij Esc, by anulować lub Backspace aby wyłączyć skrót klawiszowy. + + + + + Flameshot must be restarted for changes to take effect. + Flameshot musi zostać uruchomiony ponownie, by zmiany miały efekt. + + + + ShortcutsWidget + + + Hot Keys + Skróty klawiszowe + + + + Available shortcuts in the screen capture mode. + Dostępne skróty klawiszowe w trybie przechwytywania obrazu. + + + + Description + Opis + + + + Key + Klawisz + + + + Left Double-click + Left Double-click + + + + Toggle side panel + Przełącz panel boczny + + + + Grab a color from the screen + + + + + Resize selection left 1px + Zmień rozmiar zaznaczenia w lewo o 1 piksel + + + + Resize selection right 1px + Zmień rozmiar zaznaczenia w prawo o 1 piksel + + + + Resize selection up 1px + Zmień rozmiar zaznaczenia w górę o 1 piksel + + + + Resize selection down 1px + Zmień rozmiar zaznaczenia w dół o 1 piksel + + + + Symmetrically decrease width by 2px + + + + + Symmetrically increase width by 2px + + + + + Symmetrically increase height by 2px + + + + + Symmetrically decrease height by 2px + + + + + Select entire screen + Wybierz cały ekran + + + + Move selection left 1px + Przesuń zaznaczenie w lewo o 1 piksel + + + + Move selection right 1px + Przesuń zaznaczenie w prawo o 1 piksel + + + + Move selection up 1px + Przesuń zaznaczenie w górę o 1 piksel + + + + Move selection down 1px + Przesuń zaznaczenie w dół o 1 piksel + + + + Commit text in text area + Zatwierdź tekst w obszarze tekstowym + + + + Delete selected drawn object + + + + + Cancel current selection + + + + Delete current tool + Usuń bieżące narzędzie + + + + Capture screen + Przechwyć ekran + + + + Screenshot history + Historia zrzutów ekranu + + + + SidePanelWidget + + Active thickness: + Grubość: + + + Active color: + Kolor: + + + Press ESC to cancel + Wciśnij ESC, aby anulować + + + + Active tool size: + Rozmiar aktywnego narzędzia: + + + + Active Color: + Aktywny kolor: + + + + Grab Color + Pobierz kolor + + + + Display grid + + + + + SizeDecreaseTool + + + Decrease Tool Size + Zmniejsz rozmiar narzędzia + + + + Decrease the size of the other tools + Zmniejsz rozmiar pozostałych narzędzi + + + + SizeIncreaseTool + + + Increase Tool Size + Zwiększ rozmiar narzędzia + + + + Increase the size of the other tools + Zwiększ rozmiar pozostałych narzędzi + + + + SizeIndicatorTool + + Selection Size Indicator + Miernik zaznaczenia + + + Show X and Y dimensions of the selection + Pokaż wymiary X i Y zaznaczenia + + + Show the dimensions of the selection (X Y) + Pokazuje wymiary zaznaczenia (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + Stulecie (00-99) + + + + Year (00-99) + Rok (00-99) + + + + Year (2000) + Rok (2000) + + + + Month Name (jan) + Nazwa miesiąca (sty) + + + + Month Name (january) + Nazwa miesiąca (styczeń) + + + + Month (01-12) + Miesiąc (01-12) + + + + Week Day (1-7) + Dzień tygodnia (1-7) + + + + Week (01-53) + Tydzień (01-53) + + + + Day Name (mon) + Nazwa dnia (pon) + + + + Day Name (monday) + Nazwa dnia (poniedziałek) + + + + Day (01-31) + Dzień (01-31) + + + + Day of Month (1-31) + Dzień miesiąca (1-31) + + + + Day (001-366) + Dzień (001-366) + + + + Time (%H-%M-%S) + Czas (%H-%M-%S) + + + + Time (%H-%M) + Czas (%H-%M) + + + + Hour (00-23) + Godzina (00-23) + + + + Hour (01-12) + Godzina (01-12) + + + + Minute (00-59) + Minuta (00-59) + + + + Second (00-59) + Sekunda (00-59) + + + + Full Date (%m/%d/%y) + Data (%d/%m/%y) + + + + Full Date (%Y-%m-%d) + Data (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + + + + + SystemNotification + + + Flameshot Info + O Flameshot + + + + TextConfig + + + StrikeOut + Przekreślenie + + + + Underline + Podkreślenie + + + + Bold + Pogrubienie + + + + Italic + Kursywa + + + + Left Align + Wyrównanie do lewej + + + + Center Align + Wyśrodkowanie + + + + Right Align + Wyrównanie do prawej + + + + TextTool + + + Text + Tekst + + + + Add text to your capture + Dodaj tekst do zrzutu ekranu + + + + TrayIcon + + + &Take Screenshot + &Zrób zrzut ekranu + + + + &Open Launcher + &Pokaż okno + + + + &Configuration + &Konfiguracja + + + + &About + &O programie + + + + Check for updates + Sprawdź dostępność aktualizacji + + + + New version %1 is available + Dostępna jest nowa wersja %1 + + + + &Quit + &Wyjdź + + + + &Latest Uploads + &Ostatnio wysłane + + + + &Open Save Path + + + + + UIcolorEditor + + UI Color Editor + Edytor kolorów interfejsu + + + + Change the color moving the selectors and see the changes in the preview buttons. + Zmień kolor przesuwając selektory i obserwując podgląd przycisków. + + + + Select a Button to modify it + Wybierz przycisk do zmodyfikowania + + + + Main Color + Kolor główny + + + + Click on this button to set the edition mode of the main color. + Kliknij ten przycisk, by móc modyfikować kolor główny. + + + + Contrast Color + Kolor kontrastowy + + + + Click on this button to set the edition mode of the contrast color. + Kliknij ten przycisk, by móc modyfikować kolor kontrastowy. + + + + UndoTool + + + Undo + Cofnij + + + + Undo the last modification + Cofnij ostatnią zmianę + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + Nowa wersja Flameshot %1 jest dostępna + + + + Ignore + Ignoruj + + + + Later + Później + + + + Update + Aktualizuj + + + + UploadHistory + + + Upload History + Upload History + + + + Screenshots history is empty + Historia zrzutów jest pusta + + + + UploadLineItem + + + Form + Form + + + + TextLabel + TextLabel + + + + Copy URL + Kopiuj adres URL + + + + Open In Browser + Otwórz w przeglądarce + + + + Confirm to delete + Potwierdź usunięcie + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Czy na pewno chcesz usunąć zrzut ekranu z ostatnio wysłanych i z serwera? + + + + UtilityPanel + + + Close + Zamknij + + + + <Empty> + <Pusto> + + + + VisualsEditor + + + Opacity of area outside selection: + Przezroczystość obszaru poza zaznaczeniem: + + + + UI Color Editor + Edytor kolorów interfejsu + + + + Colorpicker Editor + Colorpicker Editor + + + + Button Selection + Wybór przycisków + + + + Select All + Wybierz wszystkie + + + + color_widgets::ColorDialog + + + Pick + Wybierz + + + + color_widgets::ColorPalette + + + Unnamed + Bez nazwy + + + + color_widgets::ColorPaletteModel + + + Unnamed + Bez nazwy + + + + %1 (%2 colors) + %1 (%2 kolory) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + Otwórz nową paletę z pliku + + + + + Create a new palette + Utwórz nową paletę + + + + + Duplicate the current palette + Duplikuj obecną paletę + + + + + Delete the current palette + Usuń obecną paletę + + + + + Revert changes to the current palette + Cofnij zmiany obecnej palety + + + + + Save changes to the current palette + Zapisz zmiany do obecnej palety + + + + + Add a color to the palette + Dodaj kolor do palety + + + + + Remove the selected color from the palette + Zmień wybrany kolor z palety + + + + + New Palette + Nowa paleta + + + + + Name + Nazwa + + + + GIMP Palettes (*.gpl) + Palety GIMP (*.gpl) + + + + Palette Image (%1) + Obraz palety (%1) + + + + All Files (*) + Wszystkie pliki (*) + + + + + Open Palette + Otwórz paletę + + + + Failed to load the palette file +%1 + Nie udało się otworzyć palety z pliku +%1 + + + + color_widgets::GradientEditor + + + Add Color + Dodaj kolor + + + + Remove Color + Usuń kolor + + + + Edit Color... + Edytuj kolor... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 kolory) + + + + color_widgets::Swatch + + + Clear Color + Wyczyść kolor + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_pt.ts b/data/translations/Internationalization_pt.ts new file mode 100644 index 0000000..1c98947 --- /dev/null +++ b/data/translations/Internationalization_pt.ts @@ -0,0 +1,3169 @@ + + + + + AbstractWidgetList + + + Add New + Adicionar novo + + + + Move Up + Mover para cima + + + + Move Down + Mover para baixo + + + + Remove + Remover + + + + AcceptTool + + + Accept + Aceitar + + + + Accept the capture + Aceitar a captura + + + + AppLauncher + + + App Launcher + Iniciar aplicação + + + + Choose an app to open the capture + Escolha uma aplicação para abrir a captura + + + + AppLauncherWidget + + + Open With + Abrir com + + + + Launch in terminal + Abrir no terminal + + + + Keep open after selection + Manter aberto após seleção + + + + + Error + Erro + + + + Unable to launch in terminal. + Não foi possível abrir no terminal. + + + + Unable to write in + Não foi possível gravar em + + + + ArrowTool + + + Arrow + Seta + + + + Set the Arrow as the paint tool + Usar a Seta como ferramenta de desenho + + + + BlurTool + + Blur + Desenfocament + + + Set Blur as the paint tool + Estableix el desenfocament com a eina de dibuix + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Mode de captura</b> + + + + Rectangular Region + Região retangular + + + + Full Screen (Current Display) + Ecrã Inteiro (Monitor atual) + + + + Full Screen (All Monitors) + Ecrã inteiro (Todos os monitores) + + + + No Delay + Sem atraso + + + + second + segundo + + + + + + seconds + segundos + + + + + Take new screenshot + Tirar nova captura de ecrã + + + + + Area: + Área: + + + + + Capture Launcher + Lançador de captura + + + + + TextLabel + TextLabel + + + + + Capture Mode + Modo de Captura + + + + + Delay: + Atraso: + + + + + WxH+x+y + WxH+x+y + + + + CaptureWidget + + + Unable to capture screen + Impossible capturar la pantalla + Não foi possível capturar o ecrã + + + + Mouse + Rato + + + + Select screenshot area + Área de seleção + + + + Mouse Wheel + Roda do rato + + + + Change tool size + Alterar tamanho da ferramenta + + + + Right Click + Clique direito + + + + Show color picker + Mostrar seletor de cores + + + + Open side panel + Abrir painel lateral + + + + Esc + Esc + + + + Exit + Sair + + + + Quit Capture + Sair de captura + + + + Are you sure you want to quit capture? + Pretende sair da captura? + + + + Do not show this again + Não mostrar isto novamente + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot perdeu o foco. As teclas de atalho não funcionarão até que clique em algum lugar. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + Erro de configuração resolvido. Inicie o “flameshot gui” novamente para aplicá-lo. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Escolliu una àrea amb el ratolí, o premeu Esc per sortir. +Premeu Entrar per capturar la pantalla. +Premeu clic dret per mostrar l'eina de selecció de color. +Gireu la rodeta del ratolí per canviar el gruix de l'eina de dibuix. +Premeu Espai per obrir el calaix lateral. + + + + Tool Settings + Definições das ferramentas + + + + CircleCountTool + + + Circle Counter + Contorno do círculo + + + + Add an autoincrementing counter bubble + Adicionar um balão de contorno de incremento automático + + + + CircleTool + + + Circle + Círculo + + + + Set the Circle as the paint tool + Definir o Círculo como ferramenta de desenho + + + + ColorDialog + + + + Select Color + Selecionar cor + + + + + Saturation + Saturação + + + + + Hue + Matiz + + + + + Hex + Hex + + + + + Blue + Azul + + + + + Value + Valor + + + + + Green + Verde + + + + + Alpha + Alfa + + + + + Red + Vermelho + + + + ColorGrabWidget + + + Accept color + Aceitar cor + + + + Enter or Left Click + Enter ou Clique Esquerdo + + + + Precisely select color + Selecione a cor com precisão + + + + Hold Left Click + Segurar o Clique Esquerdo + + + + Toggle magnifier + Habilitar/Desabilitar a lupa + + + + Space or Right Click + Espaço ou Clique Direito + + + + Cancel + Cancelar + + + + Esc + Esc + + + + ColorPickerEditor + + + Edit Preset: + Editar predefinição: + + + + Enter color to update preset + Insira a cor para atualizar a predefinição + + + + Update + Atualizar + + + + Press button to update the selected preset + Prima o botão para atualizar a predefinição selecionada + + + + Delete + Eliminar + + + + Press button to delete the selected preset + Prima o botão para eliminar a predefinição selecionada + + + + Add Preset: + Adicionar predefinição: + + + + Enter color manually or select it using the color-wheel + Insira a cor manualmente ou selecione-a usando a roda de cores + + + + Add + Adicionar + + + + Press button to add preset + Prima o botão para adicionar predefinição + + + + + Error + Erro + + + + Unable to add preset. Maximum limit reached. + Não foi possível adicionar a predefinição. Limite máximo atingido. + + + + Unable to remove preset. Minimum limit reached. + Não foi possível remover a predefinição. Limite mínimo atingido. + + + + ConfigErrorDetails + + + Configuration errors + Erros de configuração + + + + ConfigHandler + + + Unrecognized setting: '%1' + + Definição não reconhecida: '%1' + + + + + Unrecognized shortcut name: '%1'. + + Nome de atalho não reconhecido: '%1'. + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + Conflito de atalho: '%1' e '%2' têm o mesmo atalho: %3 + + + + + Bad value in '%1'. Expected: %2 + + Valor incorreto em '%1'. Esperado: %2 + + + + + You have successfully resolved the configuration error. + Resolveu com sucesso o erro de configuração. + + + + The configuration contains an error. Open configuration to resolve. + A configuração contém um erro. Abra a configuração para resolver. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + Chave de configuração inválida '%1' no ConfigHandler. Por favor, relate isso como um bug. + + + + ConfigResolver + + + Resolve configuration errors + Resolver erros de configuração + + + + <b>You must resolve all errors before continuing:</b> + <b>Deve resolver todos os erros antes de continuar:</b> + + + + Reset + Repor + + + + Reset to the default value. + Repor para o valor predefinido. + + + + Remove + Remover + + + + Remove this setting. + Remova esta definição. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + Algumas teclas de atalho apresentam conflitos. +Isto NÃO impedirá o Flameshot de iniciar. +Resolva-as manualmente no ficheiro de configuração. + + + + Resolve all + Resolver tudo + + + + Resolve all listed errors. + Resolva todos os erros listados. + + + + Details + Details + + + + ConfigWindow + + + Configuration + Configuração + + + + Interface + Interface + + + + Filename Editor + Editor de nome de ficheiro + + + + General + Geral + + + + Shortcuts + Atalhos + + + + Resolve + Resolver + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>O ficheiro de configuração contém erros. Resolva-os antes de continuar.</b> + + + + Controller + + New version %1 is available + La nova versió %1 ja és disponible + + + You have the latest version + Teniu la versió més recent + + + Failed to get information about the latest version. + Error a l'intentar obtenir informació sobre actualitzacions. + + + Error + Error + + + Unable to close active modal widgets + No s'han pogut tancar els widgets modals actius + + + &Open Launcher + &Obre el llançador d'aplicacions + + + &Configuration + &Ajustaments + + + &About + &Quant a + + + Check for updates + Comprova si hi ha actualitzacions disponibles + + + &Latest Uploads + &Últimes càrregues + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + &Information + &Informació + + + &Quit + &Surt + + + &Take Screenshot + &Captura + + + + CopyTool + + + Copy + Copiar + + + + Copy selection to clipboard + Copiar seleção para a área de transferência + + + Copy the selection into the clipboard + Copia la selecció al porta-retalls + + + + DBusUtils + + Unable to connect via DBus + No s'ha pogut connectar mitjançant DBus + + + + ExitTool + + + Exit + Sair + + + + Leave the capture screen + Sair da ferramenta de captura + + + + FileNameEditor + + + Edit the name of your captures: + Edite o nome das suas capturas: + + + + Edit: + Editar: + + + + Preview: + Pré-visualização: + + + + Save + Guardar + + + + Saves the pattern + Guarda o padrão + + + + Restore + Restaurar + + + Reset + Reinicialitza + + + + Restores the saved pattern + Restaura o padrão guardado + + + + Clear + Limpar + + + + Deletes the name + Elimina o nome + + + + Flameshot + + + Error + Erro + + + + Unable to close active modal widgets + Incapaz de fechar widgets modais ativos + + + + URL copied to clipboard. + URL copiada para a área de transferência. + + + + FlameshotDaemon + + + New version %1 is available + Nova versão %1 está disponível + + + + You have the latest version + Você está com a versão mais recente + + + + Failed to get information about the latest version. + Não foi possível obter informações sobre a versão mais recente. + + + + Unable to connect via DBus + Não foi possível conectar via DBus + + + + GeneneralConf + + Show help message + Mostra el missatge d'ajuda + + + Show the help message at the beginning in the capture mode. + Mostra el missatge d'ajuda en iniciar el mode de captura. + + + Show desktop notifications + Mostra les notificacions d'escriptori + + + Show tray icon + Mostra la icona en la barra de tasques + + + Show the systemtray icon + Mostra la icona en la barra de tasques + + + Import + Importar + + + Error + Error + + + Unable to read file. + Impossible llegir el fitxer. + + + Unable to write file. + Impossible escriure al fitxer. + + + Save File + Guardar Arxiu + + + Confirm Reset + Confirmar Reset + + + Are you sure you want to reset the configuration? + Esteu segur que voleu reiniciar la configuració? + + + Configuration File + Fitxer de Configuració + + + Export + Exportar + + + Reset + Reset + + + Launch at startup + Llançament a l'inici + + + + GeneralConf + + + + Import + Importar + + + + + + + Error + Erro + + + + Unable to read file. + Incapaz de ler o ficheiro. + + + + + Unable to write file. + Incapaz de gravar o ficheiro. + + + + Save File + Guardar Ficheiro + + + + Confirm Reset + Confirmar reposição + + + + Are you sure you want to reset the configuration? + Tem a certeza que pretende repor a configuração? + + + + Show help message + Mostrar mensagem de ajuda + + + Show the help message at the beginning in the capture mode. + Mostra el missatge d'ajuda en iniciar el mode de captura. + + + + Show the side panel button + Mostrar botão no painel lateral + + + Show the side panel toggle button in the capture mode. + Mostra el botó del calaix lateral en el mode de captura. + + + + Show desktop notifications + Mostrar notificações na área de trabalho + + + + Show tray icon + Mostrar ícone na bandeja + + + Show the systemtray icon + Mostra la icona a la barra de tasques del sistema + + + + Confirmation required to delete screenshot from the latest uploads + Confirmação necessária para excluir a captura de ecrã dos uploads mais recentes + + + + Configuration File + Ficheiro de configuração + + + + Export + Exportar + + + + Reset + Repor + + + + Automatic check for updates + Verificação automática de atualizações + + + + Allow multiple flameshot GUI instances simultaneously + Permitir várias instâncias GUI do flameshot simultaneamente + + + This allows you to take screenshots of flameshot itself for example. + This allows you to take screenshots of flameshot itself for example. + + + Automatically close daemon when it is not needed + Automatically close daemon when it is not needed + + + Launch at startup + Llança a l'inici + + + Launch Flameshot + Inicia el Flameshot + + + + Show welcome message on launch + Mostrar mensagem de boas-vindas na inicialização + + + + Use large predefined color palette + Usar paleta de cores predefinida grande + + + + Copy URL after upload + Copiar URL após upload + + + Copy URL and close window after upload + Copia la URL i tanca la finestra després de la càrrega + + + + Save image after copy + Guardar imagem após copiar + + + Save image file after copying it + Desa el fitxer d'imatge després d'haver-lo copiat + + + + Show the help message at the beginning in the capture mode + Mostrar a mensagem de ajuda no início no modo de captura + + + + Use last region for GUI mode + Usar a última região para modo GUI + + + + Use the last region as the default selection for the next screenshot in GUI mode + Usa a última região como a seleção predefinida para a próxima captura de ecrã em modo GUI + + + + Show the side panel toggle button in the capture mode + Mostrar o botão de alternância do painel lateral no modo de captura + + + + Enable desktop notifications + Habilitar notificações da área de trabalho + + + + Show abort notifications + Mostrar notificações de abortar + + + + Enable abort notifications + Ativar as notificações de abortar + + + + Show icon in the system tray + Mostrar ícone na bandeja do sistema + + + + Use grim to capture screenshots + Utilizar o grim para capturar imagens de ecrã + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + Grim é um utilitário exclusivo do Wayland para captura de tela com base no protocolo screencopy. Geralmente só é habilitado em gerenciadores de janelas Wayland minimalistas, como Sway, Hyprland, etc. + + + + Ask for confirmation to delete screenshot from the latest uploads + Peça confirmação para eliminar a captura de ecrã dos envios mais recentes + + + + Check for updates automatically + Procurar por atualizações automaticamente + + + + This allows you to take screenshots of Flameshot itself for example + Isto permite que tire capturas de ecrã do próprio Flameshot, por exemplo + + + Launch Flameshot daemon when computer is booted + Launch Flameshot daemon when computer is booted + + + + Show the welcome message box in the middle of the screen while taking a screenshot + Mostrar a caixa de mensagem de boas-vindas no meio do ecrã enquanto faz uma captura de ecrã + + + + Use a large predefined color palette + Usar uma paleta de cores predefinida grande + + + + Copy on double click + Copiar com duplo clique + + + Enable Copy on Double Click + Enable Copy on Double Click + + + Copy URL and close window after uploading was successful + Copy URL and close window after uploading was successful + + + + Automatically unload from memory when it is not needed + Liberar automaticamente da memória quando não for necessário + + + + Automatically close daemon (background process) when it is not needed + Fechar automaticamente o daemon (processo em segundo plano) quando não for necessário + + + + Launch in background at startup + Iniciar em segundo plano na inicialização + + + + Launch Flameshot daemon (background process) when computer is booted + Iniciar o Flameshot em segundo plano quando o computador for inicializado + + + + Ask before quit capture + Confirmar antes de sair da captura + + + + Show the confirmation prompt before ESC quit + Mostrar uma janela de confirmação antes de sair da ferramenta de captura + + + + Enable Copy to clipboard on Double Click + Habilitar cópia para a área de transferência com duplo clique + + + + Copy URL after uploading was successful + Copiar URL após o upload ser bem-sucedido + + + + After copying the screenshot, save it to a file as well + Depois de copiar a captura de ecrã, guarde-a num ficheiro também + + + + Save Path + Guardar Caminho + + + + Change... + Alterar... + + + + Use fixed path for screenshots to save + Use o caminho fixo para guardar captura de ecrã + + + + Preferred save file extension: + Extensão de ficheiro preferida para guardar: + + + + Latest Uploads Max Size + Tamanho máximo dos envios mais recentes + + + + Imgur Application Client ID + ID do Cliente do Aplicativo Imgur + + + + Undo limit + Limite de desfazer + + + + Use JPG format for clipboard (PNG default) + Use o formato JPG para a área de transferência (PNG padrão) + + + + Use lossy JPG format for clipboard (lossless PNG default) + Usar o formato JPG com perdas para a área de transferência (PNG sem perdas por padrão) + + + + Copy file path after save + Copiar o caminho do ficheiro após guardar + + + + Copy the file path to clipboard after the file is saved + Copie o caminho do ficheiro para a área de transferência depois que o ficheiro for guardado + + + + Anti-aliasing image when zoom the pinned image + Imagem sem serrilhado ao ampliar a imagem fixada + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + Depois de aplicar zoom na imagem fixada, a imagem deve ser suavizada ou permanecer pixelada + + + + + Upload image without confirmation + Enviar imagem sem confirmação + + + + Choose a Folder + Escolha uma pasta + + + + Unable to write to directory. + Incapaz de escrever no diretório. + + + + Show magnifier + Mostrar lupa + + + + Enable a magnifier while selecting the screenshot area + Ativar uma lupa ao selecionar a área de captura de ecrã + + + + Square shaped magnifier + Lupa de forma quadrada + + + + Make the magnifier to be square-shaped + Alterar a lupa para um formato quadrado + + + + Milliseconds before geometry display hides; 0 means do not hide + Milissegundos antes da exibição da geometria ser ocultada; 0 significa não ocultar + + + + Set geometry display timeout (ms) + Definir tempo limite de exibição da geometria (ms) + + + + Selection Geometry Display + Exibição de geometria de seleção + + + + Display Location + Localização de exibição + + + + None + Nenhum + + + + Top Left + Canto superior esquerdo + + + + Top Right + Canto superior direito + + + + Bottom Left + Canto inferior esquerdo + + + + Bottom Right + Canto inferior direito + + + + Center + Centro + + + + Quality range of 0-100; Higher number is better quality and larger file size + Nível de qualidade de 0 a 100; Qualidade maior aumenta o peso do ficheiro + + + + JPEG Quality + Qualidade do JPEG + + + + Reverse arrow + Seta reversa + + + + Draw the arrow head first + Desenhar primeiro a ponta da seta + + + + Insecure Pixelate + Pixelização insegura + + + + Draw the pixelation effect in an insecure but more asethetic way. + Desenhar o efeito de pixelização de uma forma menos segura, mas mais estética. + + + + HistoryWidget + + Latest Uploads + Últimes càrregues + + + Screenshots history is empty + L'historial de captures de pantalla és buit + + + Copy URL + Copia l'URL + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Open in browser + Obre al navegador + + + Confirm to delete + Confirmeu per esborrar + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Esteu segur de voler esborrar la captura de les últimes càrregues i del servidor? + + + + ImgS3Uploader + + Uploading Image + S'està pujant la imatge + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Error + Error + + + + ImgUploadDialog + + + Upload Confirmation + Confirmação de Envio + + + + Do you want to upload this capture? + Deseja fazer o envio desta captura? + + + + + Upload without confirmation + Enviar sem confirmação + + + + ImgUploader + + Uploading Image + S'està pujant la imatge + + + Delete image + Esborra la imatge + + + Unable to open the URL. + No es pot obrir l'URL. + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + Copy URL + Copia l'URL + + + Open URL + Obri l'URL + + + Image to Clipboard. + Imatge al porta-retalls. + + + + ImgUploaderBase + + + Upload image + Upload image + + + + Uploading Image + Enviando Imagem + + + + Copy URL + Copiar URL + + + + Open URL + Abrir URL + + + + Delete image + Deletar imagem + + + + Image to Clipboard. + Imagem para a Área de Transferência. + + + + Save image + Guardar imagem + + + + Unable to open the URL. + Não foi possível abrir o URL. + + + + URL copied to clipboard. + URL copiada para a área de transferência. + + + + Screenshot copied to clipboard. + Captura de acrã copiada para a área de transferência. + + + + Unable to save the screenshot to disk. + Não foi possível guardar a captura de ecrã no disco. + + + + Screenshot saved. + Captura de ecrã guardada. + + + + ImgUploaderTool + + + Image Uploader + Carregador de Imagem + + + + Upload the selection + Envie a seleção + + + + ImgurUploader + + Upload to Imgur + Puja a Imgur + + + Uploading Image + S'està pujant la imatge + + + Copy URL + Copia l'URL + + + Open URL + Obre l'URL + + + Delete image + Esborra la imatge + + + Image to Clipboard. + Imatge al porta-retalls. + + + + Unable to open the URL. + Não foi possível abrir a URL. + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + + ImgurUploaderTool + + Image Uploader + Puja la imatge + + + Upload the selection to Imgur + Puja la selecció a Imgur + + + + InfoWindow + + + + About + Sobre + + + + + Icon + Icon + + + + + License + Licença + + + + + GPLv3+ + GPLv3+ + + + + + Version + Version + + + + + Flameshot v + Flameshot v + + + + + OS Info + OS Info + + + + + Copy Info + Copiar Informações + + + Right Click + Clic dret + + + Mouse Wheel + Roda del ratolí + + + Move selection 1px + Mou la selecció 1 px + + + Resize selection 1px + Redimensiona la selecció 1 px + + + Quit capture + Ix de la captura + + + Copy to clipboard + Copia al porta-retalls + + + Save selection as a file + Guarda la selecció com a fitxer + + + Undo the last modification + Desfés l'última modificació + + + Show color picker + Mostra el selector de color + + + Change the tool's thickness + Canvia el gruix de l'eina + + + Key + Tecla + + + Description + Descripció + + + <u><b>License</b></u> + <u><b>Llicència</b></u> + + + <u><b>Version</b></u> + <u><b>Versió</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Dreceres</b></u> + + + Available shortcuts in the screen capture mode. + Dreceres disponibles en el mode de captura de pantalla. + + + + InvertTool + + + Invert + Inverter + + + + Set Inverter as the paint tool + Defina o Inversor como a ferramenta de pintura + + + + LineTool + + + Line + Linha + + + + Set the Line as the paint tool + Usar a Linha como ferramenta de desenho + + + + MarkerTool + + + Marker + Marcador + + + + Set the Marker as the paint tool + Usar o marcador como ferramenta de desenho + + + + MoveTool + + + Move + Mover + + + + Move the selection area + Mover a área de seleção + + + + PencilTool + + + Pencil + Pincel + + + + Set the Pencil as the paint tool + Usar o Lápis como ferramenta de desenho + + + + PinTool + + + Pin Tool + Ferramenta de fixação + + + + Pin image on the desktop + Fixar imagem na área de trabalho + + + + PinWidget + + + Context menu + Menu de contexto + + + + Copy to clipboard + Copiar para área de transferência + + + + Save to file + Guardar no ficheiro + + + + Rotate Right + Girar para a direita + + + + Rotate Left + Girar para a esquerda + + + + Increase Opacity + Aumentar a opacidade + + + + Decrease Opacity + Diminuir a opacidade + + + + Close + Fechar + + + + PixelateTool + + + Pixelate + Pixelador + + + + Set Pixelate as the paint tool. + Definir pixelizar como a ferramenta de pintura. + + + Set Pixelate as the paint tool + Estableix l'eina de pixel·lament com a eina de dibuix + + + + PrimaryInstanceWidget + + + Primary instance + Instância principal + + + + <b>Primary instance.</b> Messages received from secondaries: + <b>Instância principal.</b> Mensagens recebidas das secundárias: + + + + QHotkey + + Failed to register %1. Error: %2 + No s'ha pogut registrar %1. Error: %2 + + + Failed to unregister %1. Error: %2 + No s'ha pogut desregistrar %1. Error: %2 + + + + QObject + + + + Capture saved to clipboard. + Captura guardada na área de transferência. + + + + Error while saving to clipboard + Erro ao guardar na área de transferência + + + + Save screenshot + Guardar captura de ecrã + + + + Path copied to clipboard as + Caminho copiado para a área de transferência como + + + Saving canceled + Saving canceled + + + Save canceled + Save canceled + + + Capture is saved and copied to the clipboard as + La captura serà desada i copiada al porta-retalls com a + + + + Save Error + Erro ao guardar + + + + + Capture saved as + Captura guardada como + + + + + Error trying to save as + Erro ao tentar guardar como + + + + Unable to connect via DBus + Não foi possível ligar via DBus + + + + Powerful yet simple to use screenshot software. + Software de captura de ecrã poderoso, mas simples de usar. + + + + See + Ver + + + Capture the entire desktop. + Captureu l'escriptori sencer. + + + + Open the capture launcher. + Abrir a ferramente de captura. + + + + Start a manual capture in GUI mode. + Iniciar uma captura manual no modo GUI. + + + + Configure + Configurar + + + Capture a single screen. + Captura una sola pantalla. + + + Path where the capture will be saved + Camí on es desarà la captura + + + + Capture screenshot of all monitors at the same time. + Capturar o ecrã de todos os monitores ao mesmo tempo. + + + + Capture a screenshot of the specified monitor. + Capture ao ecrã do monitor especificado. + + + + Existing directory or new file to save to + Diretório existente ou novo ficheiro para guardar + + + + Save the capture to the clipboard + Guardar a captura na Área de Transferência + + + + Pin the capture to the screen + Fixar a captura no ecrã + + + + Upload screenshot + Enviar captura de ecrã + + + + Delay time in milliseconds + Tempo do atraso em milissegundos + + + + Repeat screenshot with previously selected region + Repetir captura de ecrã com a região selecionada anteriormente + + + + Screenshot region to select + Região da captura de ecrã a ser selecionada + + + + Set the filename pattern + Defina o padrão do nome do ficheiro + + + + Accept capture as soon as a selection is made + Aceitar captura assim que uma seleção for feita + + + + Enable or disable the trayicon + Ativar ou desativar o ícone de bandeja + + + + Enable or disable run at startup + Ativar ou desativar a execução na inicialização + + + + Enable or disable the notifications + Ativar ou desativar as notificações + + + + Check the configuration for errors + Verifique se há erros na configuração + + + + Show the help message in the capture mode + Mostrar a mensagem de ajuda no modo captura + + + + Define the main UI color + Defina a cor principal da IU + + + + Define the contrast UI color + Defina a cor de contraste da IU + + + + Print raw PNG capture + Imprimir captura PNG bruta + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + Imprime a geometria da seleção no formato WxH+X+Y. Não faz nada se raw for especificado + + + + Define the screen to capture (starting from 0) + Definir o ecrã a ser capturado (a partir de 0) + + + + Invalid delay, it must be a number greater than 0 + Atraso inválido, deve ser um número maior que 0 + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + Região inválida, use 'WxH+X+Y' ou 'all' ou 'screen0/screen1/...'. + + + + Invalid path, must be an existing directory or a new file in an existing directory + Caminho inválido, deve ser um diretório existente ou um novo ficheiro em um diretório existente + + + Define the screen to capture + Define the screen to capture + + + + default: screen containing the cursor + padrão: ecrã contendo o cursor + + + + Screen number + Número do ecrã + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Cor inválida, esta bandeira suporta os seguintes formatos: +- #RGB (sendo R, G, e B simbolos hexadecimal simples) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Nome de cores como 'azul' ou 'vermelho' +Você pode ter que invalidar o sinal '#', por exemplo '\#FFF' + + + Invalid delay, it must be higher than 0 + Invalid delay, it must be higher than 0 + + + + Invalid screen number, it must be non negative + Número de ecrã inválido, deve ser maior que zero + + + Invalid path, it must be a real path in the system + Invalid path, it must be a real path in the system + + + + Invalid value, it must be defined as 'true' or 'false' + Valor inválido, deve ser definido como 'verdadeiro' ou 'falso' + + + + Error + Erro + + + + Unable to write in + Não foi possível escrever em + + + + Requested screen exceeds screen count + O ecrã solicitado excede a contagem de ecrãs + + + + Full screen screenshot pinned to screen + Captura de ecrã inteiro fixado no ecrã + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + + Options + Opções + + + Arguments + Arguments + + + arguments + arguments + + + + Subcommands + Subcomandos + + + + subcommands + subcomandos + + + + Usage + Uso + + + + options + opções + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Por padrão, o Flameshot é executado em segundo plano e adiciona um ícone de bandeja para configuração. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Ola, eu estou aqui! Clique no ícone na áre de notificação para fazer uma captura de ecrã ou clique com o botão direito para ver mais opções. + + + Toggle side panel + Toggle side panel + + + Resize selection left 1px + Resize selection left 1px + + + Resize selection right 1px + Resize selection right 1px + + + Resize selection up 1px + Resize selection up 1px + + + Resize selection down 1px + Resize selection down 1px + + + Select entire screen + Select entire screen + + + Move selection left 1px + Move selection left 1px + + + Move selection right 1px + Move selection right 1px + + + Move selection up 1px + Move selection up 1px + + + Move selection down 1px + Move selection down 1px + + + Commit text in text area + Commit text in text area + + + Delete current tool + Delete current tool + + + + Quit capture + Sair da captura + + + + Screenshot history + Histórico de captura de ecrã + + + + Capture screen + Captura de ecrã + + + + Show color picker + Mostrar seletor de cores + + + + Change the tool's size + Alterar o tamanho da ferramenta + + + Change the tool's thickness + Canvia el gruix de l'eina + + + + RectangleTool + + + Rectangle + Retângulo + + + + Set the Rectangle as the paint tool + Usar o Retângulo como ferramenta de desenho + + + + RedoTool + + + Redo + Refazer + + + + Redo the next modification + Refazer última modificação + + + + SaveTool + + + Save + Guardar + + + + Save screenshot to a file + Guardar captura de ecrã num ficheiro + + + Save the capture + Guarda la captura + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + O adaptador universal de captura do ecrã do Wayland requer o Grim como componente de captura de ecrã do Wayland. Se o componente de captura de ecrã estiver ausente, instale-o! + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + Se a configuração useGrimAdapter não estiver ativada, o protocolo dbus será usado. Observe que o uso do protocolo dbus no Wayland não é recomendado. Recomenda-se ativar a configuração useGrimAdapter no flameshot.ini para ativar o adaptador de captura de ecrã geral do Wayland baseado em Grim + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + O componente de captura de ecrã do grim é implementado com base no wlroots, não pode ser usado no GNOME ou em ambientes de desktop semelhantes + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + Não foi possível detetar o ambiente de trabalho (GNOME? KDE? Qile? Sway? ...) + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + Dica: tente definir a variável de ambiente XDG_CURRENT_DESKTOP. + + + + Unable to capture screen + Não foi possível capturar o ecrã + + + + SecondaryInstanceWidget + + + Secondary instance + Instância secundária + + + + <b>Secondary instance.</b> Send message to primary: + <b>Instância secundária.</b> Enviar mensagem para a instância principal: + + + + Type something here... + Escreva algo aqui... + + + + &Send + &Enviar + + + + Error sending message + Erro ao enviar mensagem + + + + The message '%1' could not be sent to the primary. + Não foi possível enviar a mensagem '%1' para o destinatário principal. + + + + SelectionTool + + + Rectangular Selection + Seleção Retangular + + + + Set Selection as the paint tool + Usar o Selecionador como ferramenta de desenho + + + + SetShortcutDialog + + + Set Shortcut + Definir atalho + + + + Enter new shortcut to change + Insira um novo atalho para definir + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Pressione Esc para cancelar ou ⌘+Backspace para desativar o atalho de teclado. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Pressione Esc para cancelar ou Backspace para desabilitar o atalho de teclado. + + + + + Flameshot must be restarted for changes to take effect. + O Flameshot deve ser reiniciado para que as alterações entrem em vigor. + + + + ShortcutsWidget + + + Hot Keys + Teclas de atalho + + + + Available shortcuts in the screen capture mode. + Atalhos disponíveis no modo de captura de ecrã. + + + + Description + Descrição + + + + Key + Tecla + + + + Left Double-click + Clique Duplo com o Botão Esquerdo + + + + Toggle side panel + Alternar painel lateral + + + + Grab a color from the screen + Selecione uma cor do ecrã + + + + Resize selection left 1px + Redimensionar seleção para a esquerda em 1px + + + + Resize selection right 1px + Redimensionar seleção para a direita em 1px + + + + Resize selection up 1px + Redimensionar a seleção para cima em 1px + + + + Resize selection down 1px + Redimensionar seleção para baixo em 1px + + + + Symmetrically decrease width by 2px + Diminuir simetricamente a largura em 2px + + + + Symmetrically increase width by 2px + Aumentar simetricamente a largura em 2px + + + + Symmetrically increase height by 2px + Aumentar simetricamente a altura em 2px + + + + Symmetrically decrease height by 2px + Diminuir simetricamente a altura em 2px + + + + Select entire screen + Selecionar o ecrã inteiro + + + + Move selection left 1px + Mover seleção para a esquerda em 1px + + + + Move selection right 1px + Mover seleção para a direita em 1px + + + + Move selection up 1px + Mover seleção para cima em 1px + + + + Move selection down 1px + Mover seleção para baixo 1px + + + + Commit text in text area + Confirmar texto na área de texto + + + + Delete selected drawn object + Apagar o objeto desenhado selecionado + + + + Cancel current selection + Cancelar seleção atual + + + Delete current tool + Delete current tool + + + + Capture screen + Ecrã de captura + + + + Screenshot history + Histórico de captura de ecrã + + + + SidePanelWidget + + Active thickness: + Active thickness: + + + Active color: + Active color: + + + Press ESC to cancel + Press ESC to cancel + + + + Active tool size: + Tamanho ativo da ferramenta: + + + + Active Color: + Active Color: + + + + Grab Color + Pegar Cor + + + + Display grid + Grade de exibição + + + + SizeDecreaseTool + + + Decrease Tool Size + Diminuir tamanho da ferramenta + + + + Decrease the size of the other tools + Diminui o tamanho das outras ferramentas + + + + SizeIncreaseTool + + + Increase Tool Size + Aumentar tamanho da ferramenta + + + + Increase the size of the other tools + Aumenta o tamanho das outras ferramentas + + + + SizeIndicatorTool + + Selection Size Indicator + Indicador de mida de selecció + + + Show X and Y dimensions of the selection + Show X and Y dimensions of the selection + + + Show the dimensions of the selection (X Y) + Mostra les mides de la selecció (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + Século (00-99) + + + + Year (00-99) + Ano (00-99) + + + + Year (2000) + Ano (2000) + + + + Month Name (jan) + Nome do mês (jan) + + + + Month Name (january) + Nome do mês (janeiro) + + + + Month (01-12) + Mês (01-12) + + + + Week Day (1-7) + Dia da semana (1-7) + + + + Week (01-53) + Semana (01-53) + + + + Day Name (mon) + Nome do dia (seg) + + + + Day Name (monday) + Nome do dia (segunda) + + + + Day (01-31) + Dia (01-31) + + + + Day of Month (1-31) + Dia do Mês (1-31) + + + + Day (001-366) + Dia (001-366) + + + + Hour (00-23) + Hora (00-23) + + + + Hour (01-12) + Hora (01-12) + + + + Minute (00-59) + Minuto (00-59) + + + + Second (00-59) + Segundos (00-59) + + + + Full Date (%m/%d/%y) + Data Completa (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + Data Completa (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + Data completa (%d-%m-%Y) + + + + Time (%H-%M-%S) + Tempo (%H-%M-%S) + + + + Time (%H-%M) + Tempo (%H-%M) + + + + SystemNotification + + + Flameshot Info + Informações do Flameshot + + + + TextConfig + + + StrikeOut + Sobrescrito + + + + Underline + Sublinhado + + + + Bold + Negrito + + + + Italic + Itálico + + + + Left Align + Alinhamento à Esquerda + + + + Center Align + Alinhamento Central + + + + Right Align + Alinhamento à Direita + + + + TextTool + + + Text + Texto + + + + Add text to your capture + Adicionar texto à captura + + + + TrayIcon + + + &Take Screenshot + &Tirar Captura de Ecrã + + + + &Open Launcher + &Abrir Lançador + + + + &Configuration + &Configuração + + + + &About + &Sobre + + + + Check for updates + Verifique se há atualizações + + + + New version %1 is available + Nova versão %1 está disponível + + + + &Quit + &Sair + + + + &Latest Uploads + &Últimos Envios + + + + &Open Save Path + &Abrir local de gravação + + + + UIcolorEditor + + UI Color Editor + Editor de color de la interfície + + + + Change the color moving the selectors and see the changes in the preview buttons. + Modifique a cor movendo os seletores e veja as mudanças nos botões de preview. + + + + Select a Button to modify it + Selecione um botão para modificá-lo + + + + Main Color + Cor Principal + + + + Click on this button to set the edition mode of the main color. + Clique neste botão para setar o modo de edição da cor principal. + + + + Contrast Color + Cor de Contraste + + + + Click on this button to set the edition mode of the contrast color. + Clique neste botão para setar o modo de edição da cor de contraste. + + + + UndoTool + + + Undo + Desfazer + + + + Undo the last modification + Desfazer a última modificação + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + Nova versão Flameshot %1 está disponível + + + + Ignore + Ignorar + + + + Later + Depois + + + + Update + Atualizar + + + + UploadHistory + + + Upload History + Histórico de Envio + + + + Screenshots history is empty + O histórico de capturas de ecrã está vazio + + + + UploadLineItem + + + Form + Form + + + + TextLabel + TextLabel + + + + Copy URL + Copiar URL + + + + Open In Browser + Open In Browser + + + + Confirm to delete + Confirme para deletar + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Tem a certeza que pretende eliminar uma captura de ecrã dos últimos envios e do servidor? + + + + UtilityPanel + + + Close + Fechar + + + + <Empty> + <Vazio> + + + + VisualsEditor + + + Opacity of area outside selection: + Opacidade da área fora da seleção: + + + + UI Color Editor + Interface de Edição de Cores + + + + Colorpicker Editor + Editor do Seletor de Cores + + + + Button Selection + Botão de seleção + + + + Select All + Selecionar Todos + + + + color_widgets::ColorDialog + + + Pick + Escolher + + + + color_widgets::ColorPalette + + + Unnamed + Sem-nome + + + + color_widgets::ColorPaletteModel + + + Unnamed + Sem-nome + + + + %1 (%2 colors) + %1 (%2 cores) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + Abrir uma nova paleta a partir do ficheiro + + + + + Create a new palette + Criar uma nova paleta + + + + + Duplicate the current palette + Duplicar a paleta atual + + + + + Delete the current palette + Excluir a paleta atual + + + + + Revert changes to the current palette + Reverter alterações na paleta atual + + + + + Save changes to the current palette + Guardar alterações na paleta atual + + + + + Add a color to the palette + Adicionar uma cor à paleta + + + + + Remove the selected color from the palette + Remover a cor selecionada da paleta + + + + + New Palette + Nova Paleta + + + + + Name + Name + + + + GIMP Palettes (*.gpl) + Paletas do GIMP (*.gpl) + + + + Palette Image (%1) + Imagem da Paleta (%1) + + + + All Files (*) + Todos os Ficheiros (*) + + + + + Open Palette + Abrir Paleta + + + + Failed to load the palette file +%1 + Falha ao carregar o ficheiro de paleta +%1 + + + + color_widgets::GradientEditor + + + Add Color + Add Color + + + + Remove Color + Remover Cor + + + + Edit Color... + Editar Cor... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 cores) + + + + color_widgets::Swatch + + + Clear Color + Limpar Cor + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_pt_BR.ts b/data/translations/Internationalization_pt_BR.ts new file mode 100644 index 0000000..bf9c8ff --- /dev/null +++ b/data/translations/Internationalization_pt_BR.ts @@ -0,0 +1,3236 @@ + + + + + AbstractWidgetList + + + Add New + Add New + + + + Move Up + Mover para Cima + + + + Move Down + Mover para Baixo + + + + Remove + Remover + + + + AcceptTool + + + Accept + Aceitar + + + + Accept the capture + Aceitar a captura + + + + AppLauncher + + + App Launcher + Iniciar app + + + + Choose an app to open the capture + Escolha uma aplicação para abrir a captura + + + + AppLauncherWidget + + + Open With + Abrir Com + + + + Launch in terminal + Abrir no terminal + + + + Keep open after selection + Manter aberto após seleção + + + + + Error + Erro + + + + Unable to write in + Não é possível escrever em + + + + Unable to launch in terminal. + Não foi possível abrir no terminal. + + + + ArrowTool + + + Arrow + Flecha + + + + Set the Arrow as the paint tool + Usar a Flecha como ferramenta de desenho + + + + BlurTool + + Blur + Desfoque + + + Set Blur as the paint tool + Usar o Desfoque como ferramenta de desenho + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Modo Captura</b> + + + + Rectangular Region + Região Retangular + + + + Full Screen (Current Display) + Tela Inteira (Monitor Atual) + + + + Full Screen (All Monitors) + Tela Inteira (Todos os Monitores) + + + + No Delay + Sem atraso + + + + second + segundo + + + + + + seconds + segundos + + + + + Take new screenshot + Tirar uma nova captura de tela + + + + + Area: + Área: + + + + + Capture Launcher + Lançador de Captura + + + + + TextLabel + TextLabel + + + + + Capture Mode + Modo de Captura + + + + + Delay: + Atraso: + + + + + WxH+x+y + WxH+x+y + + + + CaptureWidget + + + Unable to capture screen + Não foi possível capturar a tela + + + + Mouse + Mouse + + + + Select screenshot area + Área de seleção + + + + Mouse Wheel + Roda do mouse ("scroll") + + + + Change tool size + Alterar tamanho da ferramenta + + + + Right Click + Botão Direito + + + + Show color picker + Mostrar seletor de cores + + + + Open side panel + Abrir painel lateral + + + + Esc + Esc + + + + Exit + Sair + + + + Quit Capture + Sair da captura + + + + Are you sure you want to quit capture? + Tem certeza de que deseja sair da captura? + + + + Do not show this again + Não mostre isso novamente + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot perdeu o foco. Os atalhos de teclado não funcionarão até que você clique em algum lugar. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + Erro de configuração resolvido. Inicie o “flameshot gui” novamente para aplicá-lo. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Selecione uma área com o mouse, ou pressione Esc para sair. +Pressione Enter para capturar a tela. +Pressione o botão direito do mouse para abrir o seletor de cores. +Use a roda do mouse para alterar a espessura do pincel. +Pressione espaço para abrir o painel lateral. + + + + Tool Settings + Configurações das ferramentas + + + + CircleCountTool + + + Circle Counter + Contorno do círculo + + + + Add an autoincrementing counter bubble + Adicionar um balão de contador de incremento automático + + + + CircleTool + + + Circle + Círculo + + + + Set the Circle as the paint tool + Usar o Círculo como ferramenta de desenho + + + + ColorDialog + + + + Select Color + Selecionar Color + + + + + Saturation + Saturação + + + + + Hue + Matiz + + + + + Hex + Hex + + + + + Blue + Azul + + + + + Value + Valor + + + + + Green + Verde + + + + + Alpha + Alpha + + + + + Red + Vermelho + + + + ColorGrabWidget + + + Accept color + Aceitar cor + + + + Enter or Left Click + Enter ou Clique Esquerdo + + + + Precisely select color + Selecione a cor com precisão + + + + Hold Left Click + Segurar o Clique Esquerdo + + + + Toggle magnifier + Habilitar/Desabilitar a lupa + + + + Space or Right Click + Espaço ou Clique Direito + + + + Cancel + Cancelar + + + + Esc + Esc + + + + ColorPickerEditor + + Select Preset: + Selecione Predefinição: + + + + Edit Preset: + Editar Predefinição: + + + + Enter color to update preset + Insira a cor para atualizar a predefinição + + + + Update + Atualizar + + + + Press button to update the selected preset + Pressione o botão para atualizar a predefinição selecionada + + + + Delete + Apagar + + + + Press button to delete the selected preset + Pressione o botão para deletar a predefinição selecionada + + + + Add Preset: + Adicionar Predefinição: + + + + Enter color manually or select it using the color-wheel + Insira a cor manualmente ou selecione-a usando a roda de cores + + + + Add + Adicionar + + + + Press button to add preset + Pressione o botão para adicionar predefinição + + + + + Error + Erro + + + + Unable to add preset. Maximum limit reached. + Não foi possível adicionar a predefinição. Limite máximo atingido. + + + + Unable to remove preset. Minimum limit reached. + Não foi possível remover a predefinição. Limite mínimo atingido. + + + + ConfigErrorDetails + + + Configuration errors + Detalhes dos erros + + + + ConfigHandler + + + Unrecognized setting: '%1' + + Configuração não reconhecida: '%1' + + + + + Unrecognized shortcut name: '%1'. + + Nome de atalho não reconhecido: '%1'. + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + Conflito de atalho: '%1' e '%2' têm o mesmo atalho: %3 + + + + + Bad value in '%1'. Expected: %2 + + Valor incorreto em '%1'. Esperado: %2 + + + + + You have successfully resolved the configuration error. + Você resolveu com sucesso o erro de configuração. + + + + The configuration contains an error. Open configuration to resolve. + A configuração contém um erro. Abra a configuração para resolver. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + Chave de configuração inválida '%1' no ConfigHandler. Por favor, relate isso como um bug. + + + + ConfigResolver + + + Resolve configuration errors + Resolver erros de configuração + + + + <b>You must resolve all errors before continuing:</b> + <b>Você deve resolver todos os erros antes de continuar:</b> + + + + Reset + Reset + + + + Reset to the default value. + Redefina para o valor padrão. + + + + Remove + Remover + + + + Remove this setting. + Remova esta configuração. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + Alguns atalhos de teclado apresentam conflitos. +Isso NÃO impedirá que o Flameshot comece. +Por favor, resolva-os manualmente no arquivo de configuração. + + + + Resolve all + Resolver tudo + + + + Resolve all listed errors. + Resolva todos os erros listados. + + + + Details + Details + + + + ConfigWindow + + + Configuration + Configuração + + + + Interface + Interface + + + + Filename Editor + Editor de nome de arquivo + + + + General + Geral + + + + Shortcuts + Atalhos + + + + Resolve + Resolver + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>O arquivo de configuração contém erros. Resolva-os antes de continuar.</b> + + + + Controller + + New version %1 is available + Nova versão %1 está disponível + + + You have the latest version + Você está com a versão mais recente + + + Failed to get information about the latest version. + Não foi possível obter informações sobre a versão mais recente. + + + Error + Erro + + + Unable to close active modal widgets + Incapaz de fechar widgets modais ativos + + + &Take Screenshot + &Tirar Captura de Tela + + + &Open Launcher + &Abrir Launcher + + + &Configuration + &Configuração + + + &About + &Sobre + + + Check for updates + Verifique se há atualizações + + + &Latest Uploads + &Últimos Envios + + + URL copied to clipboard. + URL copiada para a área de transferência. + + + &Information + &Informações + + + &Quit + &Sair + + + + CopyTool + + + Copy + Copiar + + + + Copy selection to clipboard + Copiar seleção para a área de transferência + + + Copy the selection into the clipboard + Copie a seleção para a área de transferência + + + + DBusUtils + + Unable to connect via DBus + Não foi possível conectar via DBus + + + + ExitTool + + + Exit + Sair + + + + Leave the capture screen + Sair da ferramenta de captura + + + + FileNameEditor + + + Edit the name of your captures: + Edite o nome das suas capturas: + + + + Edit: + Editar: + + + + Preview: + Pré-visualização: + + + + Save + Salvar + + + + Saves the pattern + Salva o padrão + + + + Restore + Restaurar + + + Reset + Restaurar + + + + Restores the saved pattern + Restaura o padrão salvo + + + + Clear + Limpar + + + + Deletes the name + Deletar o nome + + + + Flameshot + + + Error + Erro + + + + Unable to close active modal widgets + Incapaz de fechar widgets modais ativos + + + + URL copied to clipboard. + URL copiada para a área de transferência. + + + + FlameshotDaemon + + + New version %1 is available + Nova versão %1 está disponível + + + + You have the latest version + Você está com a versão mais recente + + + + Failed to get information about the latest version. + Não foi possível obter informações sobre a versão mais recente. + + + + Unable to connect via DBus + Não foi possível conectar via DBus + + + + GeneneralConf + + Import + Importar + + + Error + Erro + + + Unable to read file. + Não foi possível ler o arquivo. + + + Unable to write file. + Não foi possível escrever no arquivo. + + + Save File + Salvar Arquivo + + + Confirm Reset + Confirmar Reset + + + Are you sure you want to reset the configuration? + Tem certeza que deseja resetar a configuração? + + + Show help message + Mostrar mensagem de ajuda + + + Show the help message at the beginning in the capture mode. + Mostrar mensagem de ajuda no início do modo de captura. + + + Show the side panel button + Mostrar botão no painel lateral + + + Show the side panel toggle button in the capture mode. + Mostrar altenador do painel lateral. + + + Show desktop notifications + Mostrar notificações de Desktop + + + Show tray icon + Mostrar ícone de tray + + + Show the systemtray icon + Mosrar ícone na barra de aplicações + + + Configuration File + Arquivo de Configurações + + + Export + Exportar + + + Reset + Reset + + + Launch at startup + Iniciar junto com o sistema + + + Launch Flameshot + Iniciar Flameshot + + + Close after capture + Fechar após captura + + + Close after taking a screenshot + Fechar após tirar uma screenshot + + + Copy URL after upload + Copiar URL após upload + + + Copy URL and close window after upload + Copiar URL e fechar janela após upload + + + Save image after copy + Salvar imagem após copiar + + + Save image file after copying it + Salvar imagem após copiar + + + Save Path + Salvar Caminho + + + Change... + Alterar... + + + Choose a Folder + Selecione uma pasta + + + Unable to write to directory. + Não foi possível escrever no diretório. + + + + GeneralConf + + + + Import + Importar + + + + + + + Error + Erro + + + + Unable to read file. + Incapaz de ler o arquivo. + + + + + Unable to write file. + Incapaz de gravar o arquivo. + + + + Save File + Salvar Arquivo + + + + Confirm Reset + Confirmar redefinição + + + + Are you sure you want to reset the configuration? + Tem certeza que deseja redefinir a configuração? + + + + Show help message + Mostrar mensagem de ajuda + + + Show the help message at the beginning in the capture mode. + Mostrar mensagem de ajuda no início do modo de captura. + + + + Show the side panel button + Mostrar botão no painel lateral + + + Show the side panel toggle button in the capture mode. + Mostra o botão de alternância do painel lateral no modo de captura. + + + + Show desktop notifications + Mostrar notificações na área de trabalho + + + + Show tray icon + Mostrar ícone na bandeja + + + Show the systemtray icon + Mostra o ícone na bandeja do sistema + + + + Confirmation required to delete screenshot from the latest uploads + Confirmação necessária para excluir a captura de tela dos uploads mais recentes + + + + Configuration File + Arquivo de configuração + + + + Export + Exportar + + + + Reset + Redefinir + + + + Automatic check for updates + Verificação automática de atualizações + + + + Allow multiple flameshot GUI instances simultaneously + Permitir várias instâncias GUI do flameshot simultaneamente + + + Automatically close daemon when it is not needed + Feche automaticamente o daemon quando ele não for necessário + + + Launch at startup + Executar junto ao sistema + + + Launch Flameshot + Executar Flameshot + + + + Show welcome message on launch + Mostrar mensagem de boas-vindas na inicialização + + + + Use large predefined color palette + Usar paleta de cores predefinida grande + + + + Copy URL after upload + Copiar URL após upload + + + Copy URL and close window after upload + Copiar URL e fechar janela após upload + + + + Save image after copy + Salvar imagem após copiar + + + Save image file after copying it + Salve o arquivo de imagem após copiá-lo + + + + Show the help message at the beginning in the capture mode + Mostrar a mensagem de ajuda no início no modo de captura + + + + Use last region for GUI mode + Usar a última região para modo de interface + + + + Use the last region as the default selection for the next screenshot in GUI mode + Usa a última região como a seleção padrão para a próxima captura de tela na modo de interface + + + + Show the side panel toggle button in the capture mode + Mostrar o botão de alternância do painel lateral no modo de captura + + + + Enable desktop notifications + Habilitar notificações da área de trabalho + + + + Show abort notifications + Mostrar notificações de aborto + + + + Enable abort notifications + Habilitar notificações de aborto + + + + Show icon in the system tray + Mostrar ícone na bandeja do sistema + + + + Use grim to capture screenshots + Usar o grim para capturar a tela + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + Grim é um utilitário exclusivo do Wayland para captura de tela com base no protocolo screencopy. Geralmente só é habilitado em gerenciadores de janelas Wayland minimalistas, como Sway, Hyprland, etc. + + + + Ask for confirmation to delete screenshot from the latest uploads + Peça confirmação para excluir a captura de tela dos uploads mais recentes + + + + Check for updates automatically + Verificar se há atualizações automaticamente + + + + This allows you to take screenshots of Flameshot itself for example + Isso permite que você tire capturas de tela do próprio Flameshot, por exemplo + + + Launch Flameshot daemon when computer is booted + Inicie o daemon Flameshot quando o computador for inicializado + + + + Show the welcome message box in the middle of the screen while taking a screenshot + Mostrar a caixa de mensagem de boas-vindas no meio da tela enquanto faz uma captura de tela + + + + Use a large predefined color palette + Usar uma paleta de cores predefinida grande + + + + Copy on double click + Copiar com duplo clique + + + Enable Copy on Double Click + Habilitar Copiar com Duplo Clique + + + Copy URL and close window after uploading was successful + Copiar URL e fechar janela após o upload ser bem-sucedido + + + + Automatically unload from memory when it is not needed + Liberar automaticamente da memória quando não for necessário + + + + Automatically close daemon (background process) when it is not needed + Fechar automaticamente o daemon (processo em segundo plano) quando não for necessário + + + + Launch in background at startup + Iniciar em segundo plano na inicialização + + + + Launch Flameshot daemon (background process) when computer is booted + Iniciar o daemon Flameshot (processo em segundo plano) quando o computador for inicializado + + + + Ask before quit capture + Confirmar antes de sair da ferramenta de captura + + + + Show the confirmation prompt before ESC quit + Mostrar uma janela de confirmação antes de sair da ferramenta de captura + + + + Enable Copy to clipboard on Double Click + Habilitar cópia para a área de transferência com duplo clique + + + + Copy URL after uploading was successful + Copiar URL após o upload ser bem-sucedido + + + + After copying the screenshot, save it to a file as well + Depois de copiar a captura de tela, salve-a em um arquivo também + + + + Save Path + Local de salvamento + + + + Change... + Alterar... + + + + Use fixed path for screenshots to save + Salvar automaticamente nesse local + + + + Preferred save file extension: + Extensão de arquivo de salvamento preferida: + + + + Latest Uploads Max Size + Tamanho máximo dos uploads mais recentes + + + + Imgur Application Client ID + ID do Cliente do Aplicativo Imgur + + + + Undo limit + Limite de desfazer + + + + Use JPG format for clipboard (PNG default) + Use o formato JPG para a área de transferência (PNG padrão) + + + + Use lossy JPG format for clipboard (lossless PNG default) + Use o formato JPG com perdas para a área de transferência (PNG sem perdas é o padrão) + + + + Copy file path after save + Copiar a localização do arquivo após salvar + + + + Copy the file path to clipboard after the file is saved + Copiar a localização do arquivo para a área de transferência depois que o arquivo for salvo + + + + Anti-aliasing image when zoom the pinned image + Imagem sem serrilhado ao ampliar a imagem fixada + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + Depois de aplicar zoom na imagem fixada, a imagem deve ser suavizada ou permanecer pixelada + + + + + Upload image without confirmation + Enviar imagem sem confirmação + + + + Choose a Folder + Escolha uma pasta + + + + Unable to write to directory. + Incapaz de escrever no diretório. + + + + Show magnifier + Mostrar lupa + + + + Enable a magnifier while selecting the screenshot area + Habilitar uma lupa ao selecionar a área de captura de tela + + + + Square shaped magnifier + Lupa de forma quadrada + + + + Make the magnifier to be square-shaped + Alterar a lupa para um formato quadrado + + + + Milliseconds before geometry display hides; 0 means do not hide + Milissegundos antes que a exibição da geometria seja ocultada; 0 significa não ocultar + + + + Set geometry display timeout (ms) + Definir tempo limite de exibição da geometria (ms) + + + + Selection Geometry Display + Exibição de Geometria de Seleção + + + + Display Location + Localização de exibição + + + + None + Nenhum + + + + Top Left + Canto superior esquerdo + + + + Top Right + Canto superior direito + + + + Bottom Left + Canto inferior esquerdo + + + + Bottom Right + Canto inferior direito + + + + Center + Centro + + + + Quality range of 0-100; Higher number is better quality and larger file size + Nível de qualidade de 0 a 100; Qualidade maior aumenta o peso do arquivo + + + + JPEG Quality + Qualidade do JPEG + + + + Reverse arrow + Seta reversa + + + + Draw the arrow head first + Desenhar primeiro a ponta da seta + + + + Insecure Pixelate + Pixelado inseguro + + + + Draw the pixelation effect in an insecure but more asethetic way. + Desenhe o efeito de pixelização de uma forma insegura, mas mais asestética. + + + + HistoryWidget + + Latest Uploads + Últimos Envios + + + Screenshots history is empty + O histórico de capturas de tela está vazio + + + Copy URL + Copiar URL + + + URL copied to clipboard. + URL copiada para a área de transferência. + + + Open in browser + Abrir no navegador + + + Confirm to delete + Confirme para deletar + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Tem certeza de que deseja deletar uma captura de tela dos últimos uploads e servidor? + + + + ImgS3Uploader + + Uploading Image + Upando Imagem + + + URL copied to clipboard. + URL copiada para a área de transferência. + + + Error + Erro + + + + ImgUploadDialog + + + Upload Confirmation + Confirmação de Envio + + + + Do you want to upload this capture? + Deseja fazer o envio desta captura? + + + + + Upload without confirmation + Enviar sem confirmação + + + + ImgUploader + + Uploading Image + Upando Imagem + + + Unable to open the URL. + Não foi possível abrir a URL. + + + URL copied to clipboard. + URL copiada para a área de transferência. + + + Screenshot copied to clipboard. + Screenshot copiada para a área de transferência. + + + Copy URL + Copiar URL + + + Open URL + Abrir URL + + + Delete image + Deletar imagem + + + Image to Clipboard. + Imagem na área de transferência. + + + + ImgUploaderBase + + + Upload image + Upload image + + + + Uploading Image + Enviando Imagem + + + + Copy URL + Copiar URL + + + + Open URL + Abrir URL + + + + Delete image + Deletar imagem + + + + Image to Clipboard. + Imagem para a Área de Transferência. + + + + Save image + Salvar imagem + + + + Unable to open the URL. + Não foi possível abrir a URL. + + + + URL copied to clipboard. + URL copiada para a área de transferência. + + + + Screenshot copied to clipboard. + Captura de tela copiada para a área de transferência. + + + + Unable to save the screenshot to disk. + Não foi possível salvar a captura de tela em disco. + + + + Screenshot saved. + Captura de tela salva. + + + + ImgUploaderTool + + + Image Uploader + Carregador de Imagem + + + + Upload the selection + Envie a seleção + + + + ImgurUploader + + Upload to Imgur + Enviar para Imgur + + + Uploading Image + Enviando Imagem + + + Copy URL + Copiar URL + + + Open URL + Abrir URL + + + Delete image + Deletar imagem + + + Image to Clipboard. + Imagem na área de transferência. + + + + Unable to open the URL. + Não foi possível abrir a URL. + + + URL copied to clipboard. + URL copiada para a área de transferência. + + + Screenshot copied to clipboard. + Captura de tela copiada para a área de transferência. + + + + ImgurUploaderTool + + Image Uploader + Enviador de imagens + + + Upload the selection to Imgur + Envia a seleção ao Imgur + + + + InfoWindow + + + + About + Sobre + + + + + Icon + Icon + + + + + License + Licença + + + + + GPLv3+ + GPLv3+ + + + + + Version + Version + + + + + Flameshot v + Flameshot v + + + + + OS Info + OS Info + + + + + Copy Info + Copiar Informações + + + SPACEBAR + Barra de Espaço + + + Right Click + Botão Direito + + + Mouse Wheel + Roda do mouse + + + Move selection 1px + Move a seleção em 1px + + + Resize selection 1px + Redimensiona a seleção em 1px + + + Quit capture + Sair da captura + + + Copy to clipboard + Copiar para área de transferência + + + Save selection as a file + Salvar seleção em um arquivo + + + Undo the last modification + Desfazer última modificação + + + Toggle visibility of sidebar with options of the selected tool + Alterar barra lateral com as opções da ferramenta selecionada + + + Show color picker + Mostrar seletor de cores + + + Change the tool's thickness + Mudar a grossura do pincel + + + Available shortcuts in the screen capture mode. + Atalhos disponívels na tela de captura. + + + Key + Tecla + + + Description + Descrição + + + <u><b>License</b></u> + <u><b>Licença</b></u> + + + <u><b>Version</b></u> + <u><b>Versão</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Atalhos</b></u> + + + + InvertTool + + + Invert + Inverter + + + + Set Inverter as the paint tool + Defina o Inversor como a ferramenta de pintura + + + + LineTool + + + Line + Linha + + + + Set the Line as the paint tool + Usar a Linha como ferramenta de desenho + + + + MarkerTool + + + Marker + Marcador + + + + Set the Marker as the paint tool + Usar o marcador como ferramenta de desenho + + + + MoveTool + + + Move + Mover + + + + Move the selection area + Mover a área de seleção + + + + PencilTool + + + Pencil + Pincel + + + + Set the Pencil as the paint tool + Usar o Lápis como ferramenta de desenho + + + + PinTool + + + Pin Tool + Ferramenta de fixação + + + + Pin image on the desktop + Fixar imagem na área de trabalho + + + + PinWidget + + + Context menu + Context menu + + + + Copy to clipboard + Copiar para área de transferência + + + + Save to file + Salvar em arquivo + + + + Rotate Right + Girar para a direita + + + + Rotate Left + Girar para a esquerda + + + + Increase Opacity + Aumentar a opacidade + + + + Decrease Opacity + Diminuir a opacidade + + + + Close + Fechar + + + + PixelateTool + + + Pixelate + Pixelador + + + + Set Pixelate as the paint tool. + Definir pixelizar como a ferramenta de pintura. + + + Set Pixelate as the paint tool + Usar Pixelador na ferramenta de pintura + + + + PrimaryInstanceWidget + + + Primary instance + Instância primária + + + + <b>Primary instance.</b> Messages received from secondaries: + <b>Instância primária.</b> Mensagens recebidas de secundárias: + + + + QHotkey + + Failed to register %1. Error: %2 + Falha ao registrar %1. Erro: %2 + + + Failed to unregister %1. Error: %2 + Falha ao cancelar o registro %1. Erro: %2 + + + + QObject + + + Save Error + Erro ao salvar + + + + + Capture saved as + Captura salva como + + + + + Capture saved to clipboard. + Captura salva na área de transferência. + + + Capture saved to clipboard + Captura salva na área de transferência + + + + Error while saving to clipboard + Erro ao salvar na área de transferência + + + + + Error trying to save as + Erro ao tentar salvar como + + + + Save screenshot + Salvar captura de tela + + + + Path copied to clipboard as + Localização copiada para a área de transferência como + + + Saving canceled + Salvamento cancelado + + + Save canceled + Salvar cancelado + + + Capture is saved and copied to the clipboard as + A captura é salva e copiada para a área de transferência como + + + + Unable to connect via DBus + Não foi possível conectar via DBus + + + + Powerful yet simple to use screenshot software. + Software de captura de tela poderoso, mas simples de usar. + + + + See + Ver + + + Capture the entire desktop. + Capture toda a área de trabalho. + + + + Open the capture launcher. + Abrir a ferramente de captura. + + + + Start a manual capture in GUI mode. + Iniciar uma captura manual no modo GUI. + + + + Configure + Configurar + + + Capture a single screen. + Capturar uma única tela. + + + Path where the capture will be saved + Caminho onde a captura será salva + + + + Capture screenshot of all monitors at the same time. + Capturar a tela de todos os monitores ao mesmo tempo. + + + + Capture a screenshot of the specified monitor. + Capture a tela do monitor especificado. + + + + Existing directory or new file to save to + Diretório existente ou novo arquivo para salvar + + + + Save the capture to the clipboard + Salvar a captura na Área de Transferência + + + + Pin the capture to the screen + Fixar a captura na tela + + + + Upload screenshot + Upload screenshot + + + + Delay time in milliseconds + Tempo do atraso em milissegundos + + + + Repeat screenshot with previously selected region + Repetir captura de tela com a região selecionada anteriormente + + + + Screenshot region to select + Região da captura de tela a ser selecionada + + + + Set the filename pattern + Defina o padrão do nome do arquivo + + + + Accept capture as soon as a selection is made + Aceitar captura assim que uma seleção for feita + + + + Enable or disable the trayicon + Ativar ou desativar o ícone de bandeja + + + + Enable or disable run at startup + Ativar ou desativar a execução na inicialização + + + + Enable or disable the notifications + Habilitar ou desabilitar as notificações + + + + Check the configuration for errors + Verifique se há erros na configuração + + + + Show the help message in the capture mode + Mostrar a mensagem de ajuda no modo captura + + + + Define the main UI color + Defina a cor principal da IU + + + + Define the contrast UI color + Defina a cor de contraste da IU + + + + Print raw PNG capture + Imprimir captura PNG bruta + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + Imprime a geometria da seleção no formato WxH+X+Y. Não faz nada se raw for especificado + + + + Define the screen to capture (starting from 0) + Definir a tela a ser capturada (a partir de 0) + + + + Invalid delay, it must be a number greater than 0 + Atraso inválido, deve ser um número maior que 0 + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + Região inválida, use 'WxH+X+Y' ou 'all' ou 'screen0/screen1/...'. + + + + Invalid path, must be an existing directory or a new file in an existing directory + Caminho inválido, deve ser um diretório existente ou um novo arquivo em um diretório existente + + + Define the screen to capture + Defina a tela a ser capturada + + + + default: screen containing the cursor + padrão: tela contendo o cursor + + + + Screen number + Número da tela + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Cor inválida, esta bandeira suporta os seguintes formatos: +- #RGB (sendo R, G, e B simbolos hexadecimal simples) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Nome de cores como 'azul' ou 'vermelho' +Você pode ter que invalidar o sinal '#', por exemplo '\#FFF' + + + Invalid delay, it must be higher than 0 + Atraso inválido, deve ser maior que 0 + + + + Invalid screen number, it must be non negative + Número de tela inválido, deve ser maior que zero + + + Invalid path, it must be a real path in the system + Caminho inválido, deve ser um caminho real no sistema + + + + Invalid value, it must be defined as 'true' or 'false' + Valor inválido, deve ser definido como 'verdadeiro' ou 'falso' + + + + Error + Erro + + + + Unable to write in + Não foi possível escrever em + + + + Options + Opções + + + Arguments + Argumentos + + + arguments + argumentos + + + + Subcommands + Subcomandos + + + + subcommands + subcomandos + + + + Usage + Uso + + + + options + opções + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Por padrão, o Flameshot é executado em segundo plano e adiciona um ícone de bandeja para configuração. + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Por padrão roda Flameshot no background e adiciona um ícone na bandeija para configuração. + + + + Requested screen exceeds screen count + A tela solicitada excede a contagem de telas + + + + Full screen screenshot pinned to screen + Captura de tela inteira fixada na tela + + + URL copied to clipboard. + URL copiada para a área de transferência. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Ola, eu estou aqui! Clique no ícone na bandeja para fazer uma captura de tela ou clique com o botão direito para ver mais opções. + + + Toggle side panel + Alternar painel lateral + + + Resize selection left 1px + Redimensionar seleção para a esquerda 1px + + + Resize selection right 1px + Redimensionar seleção para a direita 1px + + + Resize selection up 1px + Redimensionar a seleção para cima 1px + + + Resize selection down 1px + Redimensionar seleção para baixo 1px + + + Select entire screen + Selecionar a tela inteira + + + Move selection left 1px + Mover seleção para a esquerda 1px + + + Move selection right 1px + Mover seleção para a direita 1px + + + Move selection up 1px + Mover seleção para a cima 1px + + + Move selection down 1px + Mover seleção para a baixo 1px + + + Commit text in text area + Confirmar texto na área de texto + + + Delete current tool + Excluir ferramenta atual + + + + Quit capture + Sair da captura + + + + Screenshot history + Histórico de captura de tela + + + + Capture screen + Captura de tela + + + + Show color picker + Mostrar seletor de cores + + + + Change the tool's size + Alterar o tamanho da ferramenta + + + Change the tool's thickness + Alterar a espessura da ferramenta + + + + RectangleTool + + + Rectangle + Retângulo + + + + Set the Rectangle as the paint tool + Usar o Retângulo como ferramenta de desenho + + + + RedoTool + + + Redo + Refazer + + + + Redo the next modification + Refazer última modificação + + + + SaveTool + + + Save + Salvar + + + + Save screenshot to a file + Salvar captura de tela em um arquivo + + + Save the capture + Salvar a captura + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Não é possível detectar o ambiente de desktop (GNOME? KDE? Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + O adaptador universal de captura de tela do Wayland requer o Grim como componente de captura de tela do Wayland. Se o componente de captura de tela estiver ausente, instale-o! + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + Se a configuração useGrimAdapter não estiver habilitada, o protocolo dbus será usado. Observe que o uso do protocolo dbus no Wayland não é recomendado. Recomenda-se habilitar a configuração useGrimAdapter no flameshot.ini para ativar o adaptador de captura de tela geral do Wayland baseado em Grim + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + O componente de captura de tela do grim é implementado com base no wlroots, não pode ser usado no GNOME ou em ambientes de desktop semelhantes + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + Não foi possível detectar o ambiente de trabalho (GNOME? KDE? Qile? Sway? ...) + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + Dica: tente definir a variável de ambiente XDG_CURRENT_DESKTOP. + + + + Unable to capture screen + Não foi possível capturar a tela + + + + SecondaryInstanceWidget + + + Secondary instance + Instância secundária + + + + <b>Secondary instance.</b> Send message to primary: + <b>Instância secundária.</b> Enviar mensagem para a primária: + + + + Type something here... + Digite algo aqui... + + + + &Send + &Enviar + + + + Error sending message + Erro ao enviar a mensagem + + + + The message '%1' could not be sent to the primary. + A mensagem '%1' não pôde ser enviada ao primário. + + + + SelectionTool + + + Rectangular Selection + Seleção Retangular + + + + Set Selection as the paint tool + Usar o Selecionador como ferramenta de desenho + + + + SetShortcutDialog + + + Set Shortcut + Definir atalho + + + + Enter new shortcut to change + Insira um novo atalho para definir + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Pressione Esc para cancelar ou ⌘+Backspace para desativar o atalho de teclado. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Pressione Esc para cancelar ou Backspace para desabilitar o atalho de teclado. + + + + + Flameshot must be restarted for changes to take effect. + O Flameshot deve ser reiniciado para que as alterações entrem em vigor. + + + + ShortcutsWidget + + + Hot Keys + Teclas de atalho + + + + Available shortcuts in the screen capture mode. + Atalhos disponíveis no modo de captura de tela. + + + + Description + Descrição + + + + Key + Tecla + + + + Left Double-click + Clique Duplo com o Botão Esquerdo + + + + Toggle side panel + Alternar painel lateral + + + + Grab a color from the screen + Escolha uma cor da tela + + + + Resize selection left 1px + Redimensionar seleção para a esquerda em 1px + + + + Resize selection right 1px + Redimensionar seleção para a direita em 1px + + + + Resize selection up 1px + Redimensionar a seleção para cima em 1px + + + + Resize selection down 1px + Redimensionar seleção para baixo em 1px + + + + Symmetrically decrease width by 2px + Diminuir simetricamente a largura em 2px + + + + Symmetrically increase width by 2px + Aumentar simetricamente a largura em 2px + + + + Symmetrically increase height by 2px + Aumentar simetricamente a altura em 2px + + + + Symmetrically decrease height by 2px + Diminuir simetricamente a altura em 2px + + + + Select entire screen + Selecionar a tela inteira + + + + Move selection left 1px + Mover seleção para a esquerda em 1px + + + + Move selection right 1px + Mover seleção para a direita em 1px + + + + Move selection up 1px + Mover seleção para cima em 1px + + + + Move selection down 1px + Mover seleção para baixo 1px + + + + Commit text in text area + Confirmar texto na área de texto + + + + Delete selected drawn object + Excluir o objeto desenhado selecionado + + + + Cancel current selection + Cancelar seleção atual + + + Delete current tool + Excluir ferramenta atual + + + + Capture screen + Tela de captura + + + + Screenshot history + Histórico de captura de tela + + + + SidePanelWidget + + Active thickness: + Espessura ativa: + + + Active color: + Cor ativa: + + + Press ESC to cancel + Pressione Esc para cancelar + + + + Active tool size: + Tamanho ativo da ferramenta: + + + + Active Color: + Active Color: + + + + Grab Color + Pegar Cor + + + + Display grid + Grade de exibição + + + + SizeDecreaseTool + + + Decrease Tool Size + Diminuir tamanho da ferramenta + + + + Decrease the size of the other tools + Diminui o tamanho das outras ferramentas + + + + SizeIncreaseTool + + + Increase Tool Size + Aumentar tamanho da ferramenta + + + + Increase the size of the other tools + Aumenta o tamanho das outras ferramentas + + + + SizeIndicatorTool + + Selection Size Indicator + Indicador do Tamanho da Seleção + + + Show X and Y dimensions of the selection + Mostrar dimensões X e Y da seleção + + + Show the dimensions of the selection (X Y) + Mostra as dimensões da seleção (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + Século (00-99) + + + + Year (00-99) + Ano (00-99) + + + + Year (2000) + Ano (2000) + + + + Month Name (jan) + Nome do mês (jan) + + + + Month Name (january) + Nome do mês (janeiro) + + + + Month (01-12) + Mês (01-12) + + + + Week Day (1-7) + Dia da semana (1-7) + + + + Week (01-53) + Semana (01-53) + + + + Day Name (mon) + Nome do dia (seg) + + + + Day Name (monday) + Nome do dia (segunda) + + + + Day (01-31) + Dia (01-31) + + + + Day of Month (1-31) + Dia do Mês (1-31) + + + + Day (001-366) + Dia (001-366) + + + + Time (%H-%M-%S) + Tempo (%H-%M-%S) + + + + Time (%H-%M) + Tempo (%H-%M) + + + + Hour (00-23) + Hora (00-23) + + + + Hour (01-12) + Hora (01-12) + + + + Minute (00-59) + Minuto (00-59) + + + + Second (00-59) + Segundos (00-59) + + + + Full Date (%m/%d/%y) + Data Completa (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + Data Completa (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + Data completa (%d-%m-%Y) + + + + SystemNotification + + + Flameshot Info + Informações do Flameshot + + + + TextConfig + + + StrikeOut + Sobrescrito + + + + Underline + Sublinhado + + + + Bold + Negrito + + + + Italic + Itálico + + + + Left Align + Alinhamento à Esquerda + + + + Center Align + Alinhamento Central + + + + Right Align + Alinhamento à Direita + + + + TextTool + + + Text + Texto + + + + Add text to your capture + Adicionar texto à captura + + + + TrayIcon + + + &Take Screenshot + &Tirar Captura de Tela + + + + &Open Launcher + &Abrir Lançador + + + + &Configuration + &Configuração + + + + &About + &Sobre + + + + Check for updates + Verifique se há atualizações + + + + New version %1 is available + Nova versão %1 está disponível + + + + &Quit + &Sair + + + + &Latest Uploads + &Últimos Envios + + + + &Open Save Path + &Abrir local de salvamento + + + + UIcolorEditor + + UI Color Editor + Interface de Edição de Cores + + + + Change the color moving the selectors and see the changes in the preview buttons. + Modifique a cor movendo os seletores e veja as mudanças nos botões de preview. + + + + Select a Button to modify it + Selecione um botão para modificá-lo + + + + Main Color + Cor Principal + + + + Click on this button to set the edition mode of the main color. + Clique neste botão para setar o modo de edição da cor principal. + + + + Contrast Color + Cor de Contraste + + + + Click on this button to set the edition mode of the contrast color. + Clique neste botão para setar o modo de edição da cor de contraste. + + + + UndoTool + + + Undo + Desfazer + + + + Undo the last modification + Desfazer a última modificação + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + Nova versão Flameshot %1 está disponível + + + + Ignore + Ignorar + + + + Later + Depois + + + + Update + Atualizar + + + + UploadHistory + + + Upload History + Histórico de Envio + + + + Screenshots history is empty + O histórico de capturas de tela está vazio + + + + UploadLineItem + + + Form + Form + + + + TextLabel + TextLabel + + + + Copy URL + Copiar URL + + + + Open In Browser + Open In Browser + + + + Confirm to delete + Confirme para deletar + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Tem certeza de que deseja deletar uma captura de tela dos últimos envios e do servidor? + + + + UtilityPanel + + + Close + Fechar + + + + <Empty> + <Vazio> + + + + VisualsEditor + + + Opacity of area outside selection: + Opacidade da área fora da seleção: + + + + UI Color Editor + Interface de Edição de Cores + + + + Colorpicker Editor + Editor do Seletor de Cores + + + + Button Selection + Botão de seleção + + + + Select All + Selecionar Todos + + + + color_widgets::ColorDialog + + + Pick + Escolher + + + + color_widgets::ColorPalette + + + Unnamed + Sem-nome + + + + color_widgets::ColorPaletteModel + + + Unnamed + Sem-nome + + + + %1 (%2 colors) + %1 (%2 cores) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + Abrir uma nova paleta a partir do arquivo + + + + + Create a new palette + Criar uma nova paleta + + + + + Duplicate the current palette + Duplicar a paleta atual + + + + + Delete the current palette + Excluir a paleta atual + + + + + Revert changes to the current palette + Reverter alterações na paleta atual + + + + + Save changes to the current palette + Salvar alterações na paleta atual + + + + + Add a color to the palette + Adicionar uma cor à paleta + + + + + Remove the selected color from the palette + Remover a cor selecionada da paleta + + + + + New Palette + Nova Paleta + + + + + Name + Name + + + + GIMP Palettes (*.gpl) + Paletas do GIMP (*.gpl) + + + + Palette Image (%1) + Imagem da Paleta (%1) + + + + All Files (*) + Todos os Arquivos (*) + + + + + Open Palette + Abrir Paleta + + + + Failed to load the palette file +%1 + Falha ao carregar o arquivo de paleta +%1 + + + + color_widgets::GradientEditor + + + Add Color + Add Color + + + + Remove Color + Remover Cor + + + + Edit Color... + Editar Cor... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 cores) + + + + color_widgets::Swatch + + + Clear Color + Limpar Cor + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_ro.ts b/data/translations/Internationalization_ro.ts new file mode 100644 index 0000000..fe3eb47 --- /dev/null +++ b/data/translations/Internationalization_ro.ts @@ -0,0 +1,3093 @@ + + + + + AbstractWidgetList + + + Add New + + + + + Move Up + + + + + Move Down + + + + + Remove + + + + + AcceptTool + + + Accept + + + + + Accept the capture + + + + + AppLauncher + + + App Launcher + + + + + Choose an app to open the capture + + + + + AppLauncherWidget + + + Open With + + + + + Launch in terminal + + + + + Keep open after selection + + + + + + Error + Error + + + + Unable to launch in terminal. + + + + + Unable to write in + No es pot escriure a + + + + ArrowTool + + + Arrow + + + + + Set the Arrow as the paint tool + + + + + BlurTool + + Blur + Desenfocament + + + Set Blur as the paint tool + Estableix el desenfocament com a eina de dibuix + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Mode de captura</b> + + + + Rectangular Region + + + + + Full Screen (Current Display) + + + + + Full Screen (All Monitors) + + + + + No Delay + + + + + second + + + + + + + seconds + + + + + + Take new screenshot + + + + + + Area: + + + + + + Capture Launcher + + + + + + TextLabel + + + + + + Capture Mode + + + + + + Delay: + + + + + + WxH+x+y + + + + + CaptureWidget + + + Unable to capture screen + Impossible capturar la pantalla + Imposible capturar la pantalla + + + + Mouse + + + + + Select screenshot area + + + + + Mouse Wheel + Roda del ratolí + + + + Change tool size + + + + + Right Click + Clic dret + + + + Show color picker + Mostra el selector de color + + + + Open side panel + + + + + Esc + Esc + + + + Exit + Surt + + + + Quit Capture + + + + + Are you sure you want to quit capture? + + + + + Do not show this again + + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Escolliu una àrea amb el ratolí, o premeu Esc per sortir. +Premeu Entrar per capturar la pantalla. +Premeu clic dret per mostrar l'eina de selecció de color. +Gireu la rodeta del ratolí per canviar el gruix de l'eina de dibuix. +Premeu Espai per obrir el calaix lateral. + + + + Tool Settings + + + + + CircleCountTool + + + Circle Counter + + + + + Add an autoincrementing counter bubble + + + + + CircleTool + + + Circle + + + + + Set the Circle as the paint tool + + + + + ColorDialog + + + + Select Color + + + + + + Saturation + + + + + + Hue + + + + + + Hex + + + + + + Blue + + + + + + Value + + + + + + Green + + + + + + Alpha + + + + + + Red + + + + + ColorGrabWidget + + + Accept color + + + + + Enter or Left Click + + + + + Precisely select color + + + + + Hold Left Click + + + + + Toggle magnifier + + + + + Space or Right Click + + + + + Cancel + + + + + Esc + Esc + + + + ColorPickerEditor + + + Edit Preset: + + + + + Enter color to update preset + + + + + Update + Update + + + + Press button to update the selected preset + + + + + Delete + + + + + Press button to delete the selected preset + + + + + Add Preset: + + + + + Enter color manually or select it using the color-wheel + + + + + Add + + + + + Press button to add preset + + + + + + Error + Error + + + + Unable to add preset. Maximum limit reached. + + + + + Unable to remove preset. Minimum limit reached. + + + + + ConfigErrorDetails + + + Configuration errors + + + + + ConfigHandler + + + Unrecognized setting: '%1' + + + + + + Unrecognized shortcut name: '%1'. + + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + + + + + Bad value in '%1'. Expected: %2 + + + + + + You have successfully resolved the configuration error. + + + + + The configuration contains an error. Open configuration to resolve. + + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + + + + + ConfigResolver + + + Resolve configuration errors + + + + + <b>You must resolve all errors before continuing:</b> + + + + + Reset + + + + + Reset to the default value. + + + + + Remove + + + + + Remove this setting. + + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + + + + + Resolve all + + + + + Resolve all listed errors. + + + + + Details + + + + + ConfigWindow + + + Configuration + + + + + Interface + + + + + Filename Editor + + + + + General + + + + + Shortcuts + + + + + Resolve + + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + + + + + Controller + + New version %1 is available + La nova versió %1 ja és disponible + + + You have the latest version + Teniu la versió més recent + + + Failed to get information about the latest version. + Error a l'intentar obtenir informació sobre actualitzacions. + + + Error + Error + + + Unable to close active modal widgets + No s'han pogut tancar els widgets modals actius + + + &Open Launcher + &Obre el llançador d'aplicacions + + + &Configuration + &Ajustaments + + + &About + &Quant a + + + Check for updates + Comprova si hi ha actualitzacions disponibles + + + &Latest Uploads + &Últimes càrregues + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + &Information + &Informació + + + &Quit + &Surt + + + &Take Screenshot + &Captura + + + + CopyTool + + + Copy + + + + + Copy selection to clipboard + + + + Copy the selection into the clipboard + Copia la selecció al porta-retalls + + + + DBusUtils + + Unable to connect via DBus + No s'ha pogut connectar mitjançant DBus + + + + ExitTool + + + Exit + Surt + + + + Leave the capture screen + + + + + FileNameEditor + + + Edit the name of your captures: + + + + + Edit: + + + + + Preview: + + + + + Save + + + + + Saves the pattern + + + + + Restore + + + + Reset + Reinicialitza + + + + Restores the saved pattern + + + + + Clear + + + + + Deletes the name + + + + + Flameshot + + + Error + Error + + + + Unable to close active modal widgets + No s'han pogut tancar els widgets modals actius + + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + + FlameshotDaemon + + + New version %1 is available + La nova versió %1 ja és disponible + + + + You have the latest version + Teniu la versió més recent + + + + Failed to get information about the latest version. + Error a l'intentar obtenir informació sobre actualitzacions. + + + + Unable to connect via DBus + No s'ha pogut connectar mitjançant DBus + + + + GeneneralConf + + Show help message + Mostra el missatge d'ajuda + + + Show the help message at the beginning in the capture mode. + Mostra el missatge d'ajuda en iniciar el mode de captura. + + + Show desktop notifications + Mostra les notificacions d'escriptori + + + Show tray icon + Mostra la icona en la barra de tasques + + + Show the systemtray icon + Mostra la icona en la barra de tasques + + + Import + Importar + + + Error + Error + + + Unable to read file. + Impossible llegir el fitxer. + + + Unable to write file. + Impossible escriure al fitxer. + + + Save File + Guardar Arxiu + + + Confirm Reset + Confirmar Reset + + + Are you sure you want to reset the configuration? + Esteu segur que voleu reiniciar la configuració? + + + Configuration File + Fitxer de Configuració + + + Export + Exportar + + + Reset + Reset + + + Launch at startup + Llançament a l'inici + + + + GeneralConf + + + + Import + Importar + + + + + + + Error + Error + + + + Unable to read file. + Impossible llegir el fitxer. + + + + + Unable to write file. + Impossible escriure al fitxer. + + + + Save File + Guardar Arxiu + + + + Confirm Reset + Confirmar Reset + + + + Are you sure you want to reset the configuration? + Esteu segur que voleu reiniciar la configuració? + + + + Show help message + Mostra el missatge d'ajuda + + + Show the help message at the beginning in the capture mode. + Mostra el missatge d'ajuda en iniciar el mode de captura. + + + + Show the side panel button + + + + Show the side panel toggle button in the capture mode. + Mostra el botó del calaix lateral en el mode de captura. + + + + Show desktop notifications + Mostra les notificacions d'escriptori + + + + Show tray icon + Mostra la icona en la barra de tasques + + + Show the systemtray icon + Mostra la icona a la barra de tasques del sistema + + + + Confirmation required to delete screenshot from the latest uploads + + + + + Configuration File + Fitxer de Configuració + + + + Export + Exportar + + + + Reset + + + + + Automatic check for updates + + + + + Allow multiple flameshot GUI instances simultaneously + + + + This allows you to take screenshots of flameshot itself for example. + This allows you to take screenshots of flameshot itself for example. + + + Launch Flameshot + Inicia el Flameshot + + + + Show welcome message on launch + + + + + Use large predefined color palette + + + + + Copy URL after upload + + + + Copy URL and close window after upload + Copia la URL i tanca la finestra després de la càrrega + + + + Save image after copy + + + + Save image file after copying it + Desa el fitxer d'imatge després d'haver-lo copiat + + + + Show the help message at the beginning in the capture mode + + + + + Show the side panel toggle button in the capture mode + + + + + Enable desktop notifications + + + + + Show icon in the system tray + + + + + Ask for confirmation to delete screenshot from the latest uploads + + + + + Check for updates automatically + + + + + This allows you to take screenshots of Flameshot itself for example + + + + + Show the welcome message box in the middle of the screen while taking a screenshot + + + + + Use a large predefined color palette + + + + + Copy on double click + + + + + Use last region for GUI mode + + + + + Use the last region as the default selection for the next screenshot in GUI mode + + + + + Show abort notifications + + + + + Enable abort notifications + + + + + Use grim to capture screenshots + + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + + + + + Automatically unload from memory when it is not needed + + + + + Automatically close daemon (background process) when it is not needed + + + + + Launch in background at startup + + + + + Launch Flameshot daemon (background process) when computer is booted + + + + + Ask before quit capture + + + + + Show the confirmation prompt before ESC quit + + + + + Enable Copy to clipboard on Double Click + + + + + Copy URL after uploading was successful + + + + + After copying the screenshot, save it to a file as well + + + + + Save Path + + + + + Change... + + + + + Use fixed path for screenshots to save + + + + + Preferred save file extension: + + + + + Latest Uploads Max Size + + + + + Imgur Application Client ID + + + + + Undo limit + + + + + Use JPG format for clipboard (PNG default) + + + + + Use lossy JPG format for clipboard (lossless PNG default) + + + + + Copy file path after save + + + + + Copy the file path to clipboard after the file is saved + + + + + Anti-aliasing image when zoom the pinned image + + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + + + + + + Upload image without confirmation + + + + + Choose a Folder + + + + + Unable to write to directory. + + + + + Show magnifier + + + + + Enable a magnifier while selecting the screenshot area + + + + + Square shaped magnifier + + + + + Make the magnifier to be square-shaped + + + + + Milliseconds before geometry display hides; 0 means do not hide + + + + + Set geometry display timeout (ms) + + + + + Selection Geometry Display + + + + + Display Location + + + + + None + + + + + Top Left + + + + + Top Right + + + + + Bottom Left + + + + + Bottom Right + + + + + Center + + + + + Quality range of 0-100; Higher number is better quality and larger file size + + + + + JPEG Quality + + + + + Reverse arrow + + + + + Draw the arrow head first + + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + Últimes càrregues + + + Screenshots history is empty + L'historial de captures de pantalla és buit + + + Copy URL + Copia l'URL + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Open in browser + Obre al navegador + + + Confirm to delete + Confirmeu per esborrar + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Esteu segur de voler esborrar la captura de les últimes càrregues i del servidor? + + + + ImgS3Uploader + + Uploading Image + S'està pujant la imatge + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Error + Error + + + + ImgUploadDialog + + + Upload Confirmation + + + + + Do you want to upload this capture? + + + + + + Upload without confirmation + + + + + ImgUploader + + Uploading Image + S'està pujant la imatge + + + Delete image + Esborra la imatge + + + Unable to open the URL. + No es pot obrir l'URL. + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + Copy URL + Copia l'URL + + + Open URL + Obri l'URL + + + Image to Clipboard. + Imatge al porta-retalls. + + + + ImgUploaderBase + + + Upload image + + + + + Uploading Image + S'està pujant la imatge + + + + Copy URL + Copia l'URL + + + + Open URL + + + + + Delete image + Esborra la imatge + + + + Image to Clipboard. + Imatge al porta-retalls. + + + + Save image + + + + + Unable to open the URL. + No es pot obrir l'URL. + + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + + Unable to save the screenshot to disk. + + + + + Screenshot saved. + + + + + ImgUploaderTool + + + Image Uploader + Puja la imatge + + + + Upload the selection + + + + + ImgurUploader + + Upload to Imgur + Puja a Imgur + + + Uploading Image + S'està pujant la imatge + + + Copy URL + Copia l'URL + + + Open URL + Obre l'URL + + + Delete image + Esborra la imatge + + + Image to Clipboard. + Imatge al porta-retalls. + + + + Unable to open the URL. + No es pot obrir l'URL. + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + + ImgurUploaderTool + + Image Uploader + Puja la imatge + + + Upload the selection to Imgur + Puja la selecció a Imgur + + + + InfoWindow + + + + About + + + + + + Icon + + + + + + License + + + + + + GPLv3+ + + + + + + Version + + + + + + Flameshot v + + + + + + OS Info + + + + + + Copy Info + + + + Right Click + Clic dret + + + Mouse Wheel + Roda del ratolí + + + Move selection 1px + Mou la selecció 1 px + + + Resize selection 1px + Redimensiona la selecció 1 px + + + Quit capture + Ix de la captura + + + Copy to clipboard + Copia al porta-retalls + + + Save selection as a file + Guarda la selecció com a fitxer + + + Undo the last modification + Desfés l'última modificació + + + Show color picker + Mostra el selector de color + + + Change the tool's thickness + Canvia el gruix de l'eina + + + Key + Tecla + + + Description + Descripció + + + <u><b>License</b></u> + <u><b>Llicència</b></u> + + + <u><b>Version</b></u> + <u><b>Versió</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Dreceres</b></u> + + + Available shortcuts in the screen capture mode. + Dreceres disponibles en el mode de captura de pantalla. + + + + InvertTool + + + Invert + + + + + Set Inverter as the paint tool + + + + + LineTool + + + Line + + + + + Set the Line as the paint tool + + + + + MarkerTool + + + Marker + + + + + Set the Marker as the paint tool + + + + + MoveTool + + + Move + + + + + Move the selection area + + + + + PencilTool + + + Pencil + + + + + Set the Pencil as the paint tool + + + + + PinTool + + + Pin Tool + + + + + Pin image on the desktop + + + + + PinWidget + + + Context menu + + + + + Copy to clipboard + Copia al porta-retalls + + + + Save to file + + + + + Rotate Right + + + + + Rotate Left + + + + + Increase Opacity + + + + + Decrease Opacity + + + + + Close + + + + + PixelateTool + + + Pixelate + + + + + Set Pixelate as the paint tool. + + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QObject + + + + Capture saved to clipboard. + + + + + Error while saving to clipboard + + + + + Save screenshot + + + + + Path copied to clipboard as + + + + Saving canceled + Saving canceled + + + Save canceled + Save canceled + + + Capture is saved and copied to the clipboard as + La captura serà desada i copiada al porta-retalls com a + + + + Save Error + + + + + + Capture saved as + + + + + + Error trying to save as + + + + + Unable to connect via DBus + No s'ha pogut connectar mitjançant DBus + + + + Powerful yet simple to use screenshot software. + + + + + See + + + + + Open the capture launcher. + + + + + Start a manual capture in GUI mode. + + + + + Configure + + + + Path where the capture will be saved + Camí on es desarà la captura + + + + Capture screenshot of all monitors at the same time. + + + + + Capture a screenshot of the specified monitor. + + + + + Existing directory or new file to save to + + + + + Save the capture to the clipboard + + + + + Pin the capture to the screen + + + + + Upload screenshot + + + + + Delay time in milliseconds + + + + + Repeat screenshot with previously selected region + + + + + Screenshot region to select + + + + + Set the filename pattern + + + + + Accept capture as soon as a selection is made + + + + + Enable or disable the trayicon + + + + + Enable or disable run at startup + + + + + Enable or disable the notifications + + + + + Check the configuration for errors + + + + + Show the help message in the capture mode + + + + + Define the main UI color + + + + + Define the contrast UI color + + + + + Print raw PNG capture + + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + + + + + Define the screen to capture (starting from 0) + + + + + Invalid delay, it must be a number greater than 0 + + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + + + + + Invalid path, must be an existing directory or a new file in an existing directory + + + + Define the screen to capture + Define the screen to capture + + + + default: screen containing the cursor + + + + + Screen number + + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + + + + Invalid delay, it must be higher than 0 + Invalid delay, it must be higher than 0 + + + + Invalid screen number, it must be non negative + + + + Invalid path, it must be a real path in the system + Invalid path, it must be a real path in the system + + + + Invalid value, it must be defined as 'true' or 'false' + + + + + Error + Error + + + + Unable to write in + No es pot escriure a + + + + Requested screen exceeds screen count + + + + + Full screen screenshot pinned to screen + + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + + Options + + + + + Subcommands + + + + + subcommands + + + + + Usage + + + + + options + + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + + + + Toggle side panel + Toggle side panel + + + Resize selection left 1px + Resize selection left 1px + + + Resize selection right 1px + Resize selection right 1px + + + Resize selection up 1px + Resize selection up 1px + + + Resize selection down 1px + Resize selection down 1px + + + Select entire screen + Select entire screen + + + Move selection left 1px + Move selection left 1px + + + Move selection right 1px + Move selection right 1px + + + Move selection up 1px + Move selection up 1px + + + Move selection down 1px + Move selection down 1px + + + Commit text in text area + Commit text in text area + + + Delete current tool + Delete current tool + + + + Quit capture + Ix de la captura + + + + Screenshot history + Screenshot history + + + + Capture screen + Capture screen + + + + Show color picker + Mostra el selector de color + + + + Change the tool's size + + + + Change the tool's thickness + Canvia el gruix de l'eina + + + + RectangleTool + + + Rectangle + + + + + Set the Rectangle as the paint tool + + + + + RedoTool + + + Redo + + + + + Redo the next modification + + + + + SaveTool + + + Save + + + + + Save screenshot to a file + + + + Save the capture + Guarda la captura + + + + ScreenGrabber + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + + + + + Unable to capture screen + Imposible capturar la pantalla + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + + + + + Set Selection as the paint tool + + + + + SetShortcutDialog + + + Set Shortcut + + + + + Enter new shortcut to change + + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + + + + + + Flameshot must be restarted for changes to take effect. + + + + + ShortcutsWidget + + + Hot Keys + + + + + Available shortcuts in the screen capture mode. + Dreceres disponibles en el mode de captura de pantalla. + + + + Description + Descripció + + + + Key + Tecla + + + + Left Double-click + + + + + Toggle side panel + Toggle side panel + + + + Grab a color from the screen + + + + + Resize selection left 1px + Resize selection left 1px + + + + Resize selection right 1px + Resize selection right 1px + + + + Resize selection up 1px + Resize selection up 1px + + + + Resize selection down 1px + Resize selection down 1px + + + + Symmetrically decrease width by 2px + + + + + Symmetrically increase width by 2px + + + + + Symmetrically increase height by 2px + + + + + Symmetrically decrease height by 2px + + + + + Select entire screen + Select entire screen + + + + Move selection left 1px + Move selection left 1px + + + + Move selection right 1px + Move selection right 1px + + + + Move selection up 1px + Move selection up 1px + + + + Move selection down 1px + Move selection down 1px + + + + Commit text in text area + Commit text in text area + + + + Delete selected drawn object + + + + + Cancel current selection + + + + Delete current tool + Delete current tool + + + + Capture screen + Capture screen + + + + Screenshot history + Screenshot history + + + + SidePanelWidget + + Active thickness: + Active thickness: + + + Active color: + Active color: + + + Press ESC to cancel + Press ESC to cancel + + + + Active tool size: + + + + + Active Color: + + + + + Grab Color + + + + + Display grid + + + + + SizeDecreaseTool + + + Decrease Tool Size + + + + + Decrease the size of the other tools + + + + + SizeIncreaseTool + + + Increase Tool Size + + + + + Increase the size of the other tools + + + + + SizeIndicatorTool + + Show the dimensions of the selection (X Y) + Mostra les mides de la selecció (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + + + + + Year (00-99) + + + + + Year (2000) + + + + + Month Name (jan) + + + + + Month Name (january) + + + + + Month (01-12) + + + + + Week Day (1-7) + + + + + Week (01-53) + + + + + Day Name (mon) + + + + + Day Name (monday) + + + + + Day (01-31) + + + + + Day of Month (1-31) + + + + + Day (001-366) + + + + + Hour (00-23) + + + + + Hour (01-12) + + + + + Minute (00-59) + + + + + Second (00-59) + + + + + Full Date (%m/%d/%y) + + + + + Full Date (%Y-%m-%d) + + + + + Full Date (%d-%m-%Y) + + + + + Time (%H-%M-%S) + + + + + Time (%H-%M) + + + + + SystemNotification + + + Flameshot Info + + + + + TextConfig + + + StrikeOut + + + + + Underline + + + + + Bold + + + + + Italic + + + + + Left Align + + + + + Center Align + + + + + Right Align + + + + + TextTool + + + Text + + + + + Add text to your capture + + + + + TrayIcon + + + &Take Screenshot + &Captura + + + + &Open Launcher + &Obre el llançador d'aplicacions + + + + &Configuration + &Ajustaments + + + + &About + &Quant a + + + + Check for updates + Comprova si hi ha actualitzacions disponibles + + + + New version %1 is available + La nova versió %1 ja és disponible + + + + &Quit + &Surt + + + + &Latest Uploads + &Últimes càrregues + + + + &Open Save Path + + + + + UIcolorEditor + + UI Color Editor + Editor de color de la interfície + + + + Change the color moving the selectors and see the changes in the preview buttons. + + + + + Select a Button to modify it + + + + + Main Color + + + + + Click on this button to set the edition mode of the main color. + + + + + Contrast Color + + + + + Click on this button to set the edition mode of the contrast color. + + + + + UndoTool + + + Undo + + + + + Undo the last modification + Desfés l'última modificació + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + + + + + Ignore + + + + + Later + + + + + Update + Update + + + + UploadHistory + + + Upload History + + + + + Screenshots history is empty + L'historial de captures de pantalla és buit + + + + UploadLineItem + + + Form + + + + + TextLabel + + + + + Copy URL + Copia l'URL + + + + Open In Browser + + + + + Confirm to delete + Confirmeu per esborrar + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Esteu segur de voler esborrar la captura de les últimes càrregues i del servidor? + + + + UtilityPanel + + + Close + + + + + <Empty> + + + + + VisualsEditor + + + Opacity of area outside selection: + + + + + UI Color Editor + Editor de color de la interfície + + + + Colorpicker Editor + + + + + Button Selection + + + + + Select All + + + + + color_widgets::ColorDialog + + + Pick + + + + + color_widgets::ColorPalette + + + Unnamed + + + + + color_widgets::ColorPaletteModel + + + Unnamed + + + + + %1 (%2 colors) + + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + + + + + + Create a new palette + + + + + + Duplicate the current palette + + + + + + Delete the current palette + + + + + + Revert changes to the current palette + + + + + + Save changes to the current palette + + + + + + Add a color to the palette + + + + + + Remove the selected color from the palette + + + + + + New Palette + + + + + + Name + + + + + GIMP Palettes (*.gpl) + + + + + Palette Image (%1) + + + + + All Files (*) + + + + + + Open Palette + + + + + Failed to load the palette file +%1 + + + + + color_widgets::GradientEditor + + + Add Color + + + + + Remove Color + + + + + Edit Color... + + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + + + + + color_widgets::Swatch + + + Clear Color + + + + + %1 (%2) + + + + diff --git a/data/translations/Internationalization_ru.ts b/data/translations/Internationalization_ru.ts new file mode 100644 index 0000000..5643928 --- /dev/null +++ b/data/translations/Internationalization_ru.ts @@ -0,0 +1,3376 @@ + + + + + AbstractWidgetList + + + Add New + Добавить новый + + + + Move Up + Поднять + + + + Move Down + Опустить + + + + Remove + Убрать + + + + AcceptTool + + + Accept + Принять + + + + Accept the capture + Подтвердить захват + + + + AppLauncher + + + App Launcher + Запуск приложения + + + + Choose an app to open the capture + Выбрать приложение для открытия снимка + + + + AppLauncherWidget + + + Open With + Открыть с помощью + + + + Launch in terminal + Запустить в терминале + + + + Keep open after selection + Оставить запущенным после выбора + + + + + Error + Ошибка + + + + Unable to write in + Не удалось сохранить + + + + Unable to launch in terminal. + Не удалось запустить в терминале. + + + + ArrowTool + + + Arrow + Стрелка + + + + Set the Arrow as the paint tool + Выбрать инструмент «Стрелка» + + + + BlurTool + + Blur + Размытие + + + Set Blur as the paint tool + Выбрать «Размытие» инструментом для рисования + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Режим захвата</b> + + + + Rectangular Region + Прямоугольная область + + + + Full Screen (Current Display) + Весь экран (текущий дисплей) + + + + Full Screen (All Monitors) + Весь экран (все мониторы) + + + + No Delay + Без задержки + + + + second + секунда + + + + + + seconds + секунд(ы) + + + + + Take new screenshot + Сделать новый снимок + + + + + Area: + Область: + + + + + Capture Launcher + Запуск захвата + + + + + TextLabel + TextLabel + + + + + Capture Mode + Режим захвата + + + + + Delay: + Задержка: + + + + + WxH+x+y + Ш×В+x+y + + + + CaptureWidget + + + Unable to capture screen + Не удалось захватить экран + + + + Mouse + Мышь + + + + Select screenshot area + Выбрать область снимка + + + + Mouse Wheel + Колесо мыши + + + + Change tool size + Изменить размер инструмента + + + + Right Click + Правый щелчок мыши + + + + Show color picker + Показать палитру цветов + + + + Open side panel + Открыть боковую панель + + + + Esc + Esc + + + + Exit + Выход + + + + Quit Capture + Выйти из захвата + + + + Are you sure you want to quit capture? + Уверены, что хотите выйти из захвата? + + + + Do not show this again + Не показывать это снова + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot потерял фокус. Сочетания клавиш не будут работать, пока вы не нажмёте где-нибудь. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + Ошибка конфигурации устранена. Запустите `flameshot gui` снова, чтобы применить её. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Выберите область с помощью мыши, или нажмите Esc, чтобы выйти. +Нажмите Enter, чтобы захватить экран. +Нажмите правую кнопку мыши, чтобы показать выбор цвета. +Используйте колесо мыши, чтобы выбрать толщину текущего инструмента. +Нажмите Пробел, чтобы открыть боковую панель. + + + + Tool Settings + Настройки инструмента + + + + CircleCountTool + + + Circle Counter + Нумерация + + + + Add an autoincrementing counter bubble + Добавить круг-счётчик с автоприращением + + + + CircleTool + + + Circle + Окружность + + + + Set the Circle as the paint tool + Выбрать инструмент «Окружность» + + + + ColorDialog + + + + Select Color + Выбрать цвет + + + + + Saturation + Насыщенность + + + + + Hue + Оттенок + + + + + Hex + Шестнадцатеричный + + + + + Blue + Синий + + + + + Value + Значение + + + + + Green + Зелёный + + + + + Alpha + Альфа + + + + + Red + Красный + + + + ColorGrabWidget + + + Accept color + Применить цвет + + + + Enter or Left Click + Enter или нажмите левой кнопкой мыши + + + + Precisely select color + Точный выбор цвета + + + + Hold Left Click + Удерживайте левую кнопку мыши + + + + Toggle magnifier + Переключить лупу + + + + Space or Right Click + Пробел или нажмите правой кнопкой мыши + + + + Cancel + Отмена + + + + Esc + Esc + + + + ColorPickerEditor + + Select Preset: + Выберите шаблон: + + + Select preset using the spinbox + Выбрать шаблон с помощью счётчика + + + + Edit Preset: + Править предустановку: + + + + Enter color to update preset + Введите цвет для обновления предустановки + + + + Update + Обновить + + + + Press button to update the selected preset + Нажмите кнопку для обновления выбранной предустановки + + + + Delete + Удалить + + + + Press button to delete the selected preset + Нажмите кнопку для удаления выбранного шаблона + + + + Add Preset: + Добавить шаблон: + + + + Enter color manually or select it using the color-wheel + Введите цвет вручную или выберите его с помощью цветового круга + + + + Add + Добавить + + + + Press button to add preset + Нажмите кнопку для добавления шаблона + + + + + Error + Ошибка + + + + Unable to add preset. Maximum limit reached. + Не удаётся добавить шаблон. Достигнут максимальный предел. + + + + Unable to remove preset. Minimum limit reached. + Не удаётся удалить шаблон. Достигнут минимальный предел. + + + + ConfigErrorDetails + + + Configuration errors + Ошибки конфигурации + + + + ConfigHandler + + + Unrecognized setting: '%1' + + Неизвестная настройка: «%1» + + + + + Unrecognized shortcut name: '%1'. + + Неизвестное название сочетания клавиш: «%1». + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + Конфликт сочетания клавиш: «%1» и «%2» совпадают: %3 + + + + + Bad value in '%1'. Expected: %2 + + Неверное значение в «%1». Ожидалось: %2 + + + + + You have successfully resolved the configuration error. + Вы успешно устранили ошибку конфигурации. + + + + The configuration contains an error. Open configuration to resolve. + Конфигурация содержит ошибку. Откройте конфигурацию для решения. + + + The configuration contains an error. Falling back to default. + Конфигурация содержит ошибку. Возврат к умолчанию. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + Неверный ключ конфигурации '%1' в ConfigHandler. Пожалуйста, сообщите об этом как об ошибке. + + + + ConfigResolver + + + Resolve configuration errors + Устраните ошибки конфигурации + + + + <b>You must resolve all errors before continuing:</b> + <b>Вы должны устранить все ошибки, прежде чем продолжить:</b> + + + + Reset + Сброс + + + + Reset to the default value. + Сброс к значению по умолчанию. + + + + Remove + Убрать + + + + Remove this setting. + Удалить эту настройку. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + Некоторые сочетания клавиш конфликтуют. +Это НЕ помешает запуску Flameshot. +Пожалуйста, исправьте их вручную в файле конфигурации. + + + + Resolve all + Устранить все + + + + Resolve all listed errors. + Устранить все перечисленные ошибки. + + + + Details + Подробности + + + + ConfigWindow + + + Configuration + Настройки + + + + Interface + Интерфейс + + + + Filename Editor + Шаблон имён файлов + + + + General + Общие + + + + Shortcuts + Горячие клавиши + + + + Resolve + Решить + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>Файл конфигурации содержит ошибки. Исправьте их перед продолжением.</b> + + + Storage + Хранилище + + + + Controller + + New version %1 is available + Доступна новая версия %1 + + + You have the latest version + У вас самая последняя версия + + + Failed to get information about the latest version. + Не удалось получить информацию о последней версии. + + + Error + Ошибка + + + Unable to close active modal widgets + Невозможно закрыть активные модальные виджеты + + + &Take Screenshot + &Сделать снимок + + + &Open Launcher + &Приложение захвата + + + &Configuration + &Настройки + + + &About + &О программе + + + Check for updates + Проверить обновления + + + &Latest Uploads + &Последние загрузки + + + URL copied to clipboard. + Ссылка скопирована в буфер обмена. + + + &Information + &Информация + + + &Quit + &Выход + + + + CopyTool + + + Copy + Копировать + + + + Copy selection to clipboard + Копировать выделение в буфер обмена + + + Copy the selection into the clipboard + Скопировать выделение в буфер обмена + + + + DBusUtils + + Unable to connect via DBus + Не удалось подключиться через DBus + + + + ExitTool + + + Exit + Выход + + + + Leave the capture screen + Покинуть захват экрана + + + + FileNameEditor + + + Edit the name of your captures: + Правка имени ваших снимков: + + + + Edit: + Шаблон: + + + + Preview: + Предпросмотр: + + + + Save + Сохранить + + + + Saves the pattern + Сохранить шаблон + + + + Restore + Восстановить + + + Reset + Сбросить + + + + Restores the saved pattern + Восстанавливает сохранённый шаблон + + + + Clear + Очистить + + + + Deletes the name + Удаляет имя + + + + Flameshot + + + Error + Ошибка + + + + Unable to close active modal widgets + Не удаётся закрыть активные модальные виджеты + + + + URL copied to clipboard. + Ссылка скопирована в буфер обмена. + + + + FlameshotDaemon + + + New version %1 is available + Доступна новая версия: %1 + + + + You have the latest version + У вас самая последняя версия + + + + Failed to get information about the latest version. + Не удалось получить информацию о последней версии. + + + + Unable to connect via DBus + Не удалось подключиться по DBus + + + + GeneneralConf + + Import + Импорт + + + Error + Ошибка + + + Unable to read file. + Не удалось прочитать файл. + + + Unable to write file. + Не удалось записать файл. + + + Save File + Сохранить файл + + + Confirm Reset + Подтвердить сброс + + + Are you sure you want to reset the configuration? + Вы действительно хотите сбросить настройки? + + + Show help message + Показывать справочное сообщение + + + Show the help message at the beginning in the capture mode. + Показывать справочное сообщение перед началом захвата экрана. + + + Show the side panel button + Показывать кнопку боковой панели + + + Show the side panel toggle button in the capture mode. + Показывать кнопку открытия боковой панели в режиме захвата. + + + Show desktop notifications + Показывать уведомления + + + Show tray icon + Показывать значок в трее + + + Show the systemtray icon + Показать значок в системном трее + + + Configuration File + Файл конфигурации + + + Export + Экспорт + + + Reset + Сброс + + + Launch at startup + Запускать при старте системы + + + Launch Flameshot + Запустить Flameshot + + + Show welcome message on launch + Показывать приветствие при запуске + + + Close application after capture + Закрывать приложение после захвата экрана + + + Close after capture + Закрыть после снимка + + + Close after taking a screenshot + Закрыть после снимка + + + Copy URL after upload + Копировать ссылку после загрузки + + + Copy URL and close window after upload + Копировать ссылку и закрыть окно после загрузки + + + Save image after copy + Сохранять изображение после копирования + + + Save image file after copying it + Сохранять файл изображения после копирования + + + Save Path + Путь сохранения + + + Change... + Сменить… + + + Copy file path after save + Скопировать путь к файлу после сохранения + + + Select default path for Screenshots + Выберите путь по умолчанию для снимков экрана + + + Use fixed path for screenshots to save + Использовать фиксированный путь для сохранения снимков экрана + + + Choose a Folder + Выберите папку + + + Unable to write to directory. + Не удалось записать в папку. + + + + GeneralConf + + + + Import + Импорт + + + + + + + Error + Ошибка + + + + Unable to read file. + Не удалось прочитать файл. + + + + + Unable to write file. + Не удалось записать файл. + + + + Save File + Сохранить файл + + + + Confirm Reset + Подтвердить сброс + + + + Are you sure you want to reset the configuration? + Вы действительно хотите сбросить настройки? + + + + Show help message + Показывать справочное сообщение + + + Show the help message at the beginning in the capture mode. + Показывать справочное сообщение перед началом захвата экрана. + + + + Show the side panel button + Показывать кнопку боковой панели + + + Show the side panel toggle button in the capture mode. + Показывать кнопку открытия боковой панели в режиме захвата. + + + + Show desktop notifications + Показывать уведомления + + + + Show tray icon + Показывать значок в трее + + + Show the systemtray icon + Показать значок в системном трее + + + + Confirmation required to delete screenshot from the latest uploads + Подтверждать удаление снимка из последних отправок + + + + Configuration File + Файл конфигурации + + + + Export + Экспорт + + + + Reset + Сбросить + + + + Automatic check for updates + Автоматически проверять обновления + + + + Allow multiple flameshot GUI instances simultaneously + Разрешить несколько экземпляров графической оболочки Flameshot + + + This allows you to take screenshots of flameshot itself for example. + Это позволяет, например, делать скриншоты самой программы flameshot. + + + Automatically close daemon when it is not needed + Автоматически закрывать демона, когда он не требуется + + + Launch at startup + Запускать при старте системы + + + Launch Flameshot + Запустить Flameshot + + + + Show welcome message on launch + Показывать приветствие при запуске + + + + Use large predefined color palette + Использовать большую предопределённую палитру цветов + + + + Copy URL after upload + Копировать ссылку после отправки + + + Copy URL and close window after upload + Копировать ссылку и закрыть окно после загрузки + + + + Save image after copy + Сохранять изображение после копирования + + + Save image file after copying it + Сохранять файл изображения после копирования + + + + Show the help message at the beginning in the capture mode + Показывать справочное сообщение в начале режима захвата + + + + Use last region for GUI mode + Использовать последнюю область для графического режима + + + + Use the last region as the default selection for the next screenshot in GUI mode + Использовать последнюю область в качестве стандартной для следующего снимка в графическом режиме + + + + Show the side panel toggle button in the capture mode + Показать кнопку переключения боковой панели в режиме захвата + + + + Enable desktop notifications + Включить уведомления рабочего стола + + + + Show abort notifications + Показывать уведомления о прекращении + + + + Enable abort notifications + Включить уведомления о прекращении + + + + Show icon in the system tray + Показывать значок в системном трее + + + + Use grim to capture screenshots + Использовать Grim для захвата снимков + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + Grim — инструмент для снимков экрана исключительно в Wayland через протокол Screencopy. Предназначен для минималистичных оконных менеджеров, таких как Sway или Hyprland. + + + + Ask for confirmation to delete screenshot from the latest uploads + Запрашивать подтверждение при удалении снимков экрана из последних отправок + + + + Check for updates automatically + Автоматически проверять наличие обновлений + + + + This allows you to take screenshots of Flameshot itself for example + Это позволяет, например, делать снимки самого Flameshot + + + Launch Flameshot daemon when computer is booted + Запускать демон Flameshot при загрузке компьютера + + + + Show the welcome message box in the middle of the screen while taking a screenshot + Показывать окно приветствия в центре экрана при создании снимка экрана + + + + Use a large predefined color palette + Использовать большую предопределённую палитру цветов + + + + Copy on double click + Копировать двойным щелчком кнопки мыши + + + Enable Copy on Double Click + Включить копирование по двойному нажатию кнопки мыши + + + Copy URL and close window after uploading was successful + Копировать ссылку и закрывать окно после успешной отправки + + + + Automatically unload from memory when it is not needed + Автоматически выгружать из памяти, когда не используется + + + + Automatically close daemon (background process) when it is not needed + Автоматически закрывать демона (фоновый процесс), когда он не нужен + + + + Launch in background at startup + Запускать в фоне при старте + + + + Launch Flameshot daemon (background process) when computer is booted + Запускать демона Flameshot (фоновый процесс) при старте компьютера + + + + Ask before quit capture + Спрашивать при выходе из захвата + + + + Show the confirmation prompt before ESC quit + Показывать запрос на подтверждение перед выходом с помощью ESC + + + + Enable Copy to clipboard on Double Click + Включить копирование в буфер обмена двойным щелчком + + + + Copy URL after uploading was successful + Копировать ссылку после успешной загрузки + + + + After copying the screenshot, save it to a file as well + После копирования снимка экрана также сохранить его в файл + + + + Save Path + Путь сохранения + + + + Change... + Сменить… + + + + Use fixed path for screenshots to save + Использовать постоянный путь сохранения для снимков + + + + Preferred save file extension: + Базовое расширение файла сохранения: + + + + Latest Uploads Max Size + Максимальное число последних отправок + + + + Imgur Application Client ID + Ключ API Imgur + + + + Undo limit + Число действий в очереди отмены + + + + Use JPG format for clipboard (PNG default) + Использовать формат JPG для буфера обмена (по умолчанию PNG) + + + + Use lossy JPG format for clipboard (lossless PNG default) + Использовать формат JPG для буфера обмена (по умолчанию — PNG без потерь) + + + + Copy file path after save + Копировать путь к файлу после сохранения + + + + Copy the file path to clipboard after the file is saved + Копировать путь в буфер обмена после сохранения файла + + + + Anti-aliasing image when zoom the pinned image + Сглаживать закреплённый снимок при масштабировании + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + Должно ли изображение после масштабирования сглаживаться или оставаться пиксельным + + + + + Upload image without confirmation + Отправлять изображение без подтверждения + + + + Choose a Folder + Выберите папку + + + + Unable to write to directory. + Не удалось записать в папку. + + + + Show magnifier + Показывать лупу + + + + Enable a magnifier while selecting the screenshot area + Включить лупу при выборе области снимка экрана + + + + Square shaped magnifier + Квадратная лупа + + + + Make the magnifier to be square-shaped + Сделать лупу квадратной формы + + + + Milliseconds before geometry display hides; 0 means do not hide + Время в миллисекундах до скрытия панели геометрии; 0 — не скрывать + + + + Set geometry display timeout (ms) + Задать время показа панели геометрии (мс) + + + + Selection Geometry Display + Панель геометрии выделения + + + + Display Location + Расположение панели + + + + None + Нет + + + + Top Left + Сверху слева + + + + Top Right + Сверху справа + + + + Bottom Left + Снизу слева + + + + Bottom Right + Снизу справа + + + + Center + В центре + + + + Quality range of 0-100; Higher number is better quality and larger file size + Диапазон качества от 0 до 100; чем выше число, тем выше качество и размер файла + + + + JPEG Quality + Качество JPEG + + + + Reverse arrow + Обратить стрелку + + + + Draw the arrow head first + Сначала рисовать наконечник стрелы + + + + Insecure Pixelate + Небезопасное размытие + + + + Draw the pixelation effect in an insecure but more asethetic way. + Рисовать небезопасный, но более симпатичный эффект пиксельного размытия. + + + + HistoryWidget + + Latest Uploads + Последние загрузки + + + Screenshots history is empty + История снимков пуста + + + Copy URL + Копировать ссылку + + + URL copied to clipboard. + Ссылка скопирована в буфер обмена. + + + Open in browser + Открыть в браузере + + + Confirm to delete + Подтвердите удаление + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Вы уверены, что хотите удалить снимок экрана из последних загрузок и с сервера? + + + + ImgS3Uploader + + Upload image to S3 + Загрузка изображения в S3 + + + Uploading Image + Загрузка изображения + + + Uploading Image... + Выгрузка изображения… + + + Delete image from S3 + Удалить изображение из S3 + + + Deleting image... + Удаление изображения… + + + URL copied to clipboard. + Ссылка скопирована в буфер обмена. + + + Unable to remove screenshot from the remote storage. + Невозможно удалить снимок из удалённого хранилища. + + + Network error + Ошибка сети + + + Possibly it doesn't exist anymore + Возможно, его больше не существует + + + Do you want to remove screenshot from local history anyway? + Вы все равно хотите удалить снимок из локальной истории? + + + Remove screenshot from history? + Удалить снимок из истории? + + + Retrieving configuration file with s3 creds... + Получение конфигурационного файла с параметрами доступа к s3… + + + S3 Creds URL is not found in your configuration file + Адрес данных S3 не найден в вашем файле конфигурации + + + Error + Ошибка + + + Unable to upload screenshot, please check your internet connection and try again + Не удалось загрузить снимок экрана. Проверьте подключение к Интернету и повторите попытку + + + Unable to get s3 credentials, please check your VPN connection and try again + Не удалось получить данные S3, проверьте своё VPN-соединение и повторите попытку + + + + ImgS3UploaderTool + + Upload the selection to S3 bucket + Загрузить выделение в корзину S3 + + + + ImgUploadDialog + + + Upload Confirmation + Подтверждение отправки + + + + Do you want to upload this capture? + Хотите отправить этот снимок? + + + + + Upload without confirmation + Отправлять без подтверждения + + + + ImgUploader + + Upload image to S3 + Загрузить изображение в S3 + + + Uploading Image + Загрузка изображения + + + Upload image + Загрузить изображение + + + Unable to open the URL. + Не удалось открыть ссылку. + + + URL copied to clipboard. + Ссылка скопирована в буфер обмена. + + + Screenshot copied to clipboard. + Снимок скопирован в буфер обмена. + + + Deleting image... + Удаление изображения… + + + Uploading Image... + Выгрузка изображения… + + + Copy URL + Копировать ссылку + + + Open URL + Открыть ссылку + + + Delete image + Удалить изображение + + + Image to Clipboard. + Изображение в буфер обмена. + + + + ImgUploaderBase + + + Upload image + Отправить изображение + + + + Uploading Image + Изображение отправляется + + + + Copy URL + Копировать ссылку + + + + Open URL + Открыть ссылку + + + + Delete image + Удалить изображение + + + + Image to Clipboard. + Изображение в буфер + + + + Save image + Сохранить изображение + + + + Unable to open the URL. + Не удалось открыть ссылку. + + + + URL copied to clipboard. + Ссылка скопирована в буфер обмена. + + + + Screenshot copied to clipboard. + Снимок скопирован в буфер обмена. + + + + Unable to save the screenshot to disk. + Не удаётся сохранить снимок экрана на диск. + + + + Screenshot saved. + Снимок экрана сохранён. + + + + ImgUploaderTool + + Imgage uploader tool + Инструмент загрузки изображений + + + Image uploader tool + Инструмент загрузки изображений + + + + Image Uploader + Отправщик изображений + + + + Upload the selection + Отправить выделенное + + + + ImgurUploader + + Upload to Imgur + Загрузить в Imgur + + + Uploading Image + Загрузка изображения + + + Copy URL + Копировать ссылку + + + Open URL + Открыть ссылку + + + Delete image + Удалить изображение + + + Image to Clipboard. + Изображение в буфер обмена. + + + + Unable to open the URL. + Не удалось открыть ссылку. + + + URL copied to clipboard. + Ссылка скопирована в буфер обмена. + + + Screenshot copied to clipboard. + Снимок скопирован в буфер обмена. + + + + ImgurUploaderTool + + Image Uploader + Загрузка изображения + + + Upload the selection to Imgur + Загрузить выделение в Imgur + + + + InfoWindow + + + + About + О программе + + + + + Icon + Значок + + + + + License + Лицензия + + + + + GPLv3+ + GPLv3+ + + + + + Version + Версия + + + + + Flameshot v + Flameshot v + + + + + OS Info + Сведения об ОС + + + + + Copy Info + Копировать сведения + + + SPACEBAR + Пробел + + + Right Click + Правый клик + + + Mouse Wheel + Колесо мыши + + + Move selection 1px + Переместить выделение на 1px + + + Resize selection 1px + Изменить размер выделения на 1px + + + Quit capture + Выйти из захвата экрана + + + Copy to clipboard + Копировать в буфер обмена + + + Save selection as a file + Сохранить выделение в файл + + + Undo the last modification + Отменить последнее изменение + + + Toggle visibility of sidebar with options of the selected tool + Показать боковую панель с настройками инструмента + + + Show color picker + Показать выбор цвета + + + Change the tool's thickness + Изменить толщину инструмента + + + Available shortcuts in the screen capture mode. + Доступные горячие клавиши в режиме захвата экрана. + + + Key + Клавиша + + + Description + Описание + + + <u><b>License</b></u> + <u><b>Лицензия</b></u> + + + <u><b>Version</b></u> + <u><b>Версия</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Горячие клавиши</b></u> + + + + InvertTool + + + Invert + Инвертор + + + + Set Inverter as the paint tool + Выбрать инструмент «Инвертор» + + + + LineTool + + + Line + Линия + + + + Set the Line as the paint tool + Выбрать инструмент «Линия» + + + + MarkerTool + + + Marker + Маркер + + + + Set the Marker as the paint tool + Выбрать инструмент «Маркер» + + + + MoveTool + + + Move + Перемещение + + + + Move the selection area + Переместить выделенную область + + + + PencilTool + + + Pencil + Карандаш + + + + Set the Pencil as the paint tool + Выбрать инструмент «Карандаш» + + + + PinTool + + + Pin Tool + Булавка + + + + Pin image on the desktop + Закрепить снимок на рабочем столе + + + + PinWidget + + + Context menu + Контекстное меню + + + + Copy to clipboard + Копировать в буфер обмена + + + + Save to file + Сохранить в файл + + + + Rotate Right + Повернуть вправо + + + + Rotate Left + Повернуть влево + + + + Increase Opacity + Увеличить непрозрачность + + + + Decrease Opacity + Уменьшить непрозрачность + + + + Close + Закрыть + + + + PixelateTool + + + Pixelate + Размытие + + + + Set Pixelate as the paint tool. + Сделать размытие инструментом рисования + + + Set Pixelate as the paint tool + Выбрать инструмент «Размытие» + + + + PrimaryInstanceWidget + + + Primary instance + Первичный экземпляр + + + + <b>Primary instance.</b> Messages received from secondaries: + <b>Первичный экземпляр.</b> Сообщения полученные от вторичных: + + + + QHotkey + + Failed to register %1. Error: %2 + Не удалось зарегистрировать %1. Ошибка: %2 + + + Failed to unregister %1. Error: %2 + Не удалось отменить регистрацию %1. Ошибка: %2 + + + + QObject + + + Save Error + Ошибка сохранения + + + + + Capture saved as + Снимок сохранён в + + + + + Capture saved to clipboard. + Снимок скопирован в буфер обмена. + + + Capture saved to clipboard + Снимок скопирован в буфер обмена + + + + Error while saving to clipboard + Ошибка при сохранении в буфер обмена + + + + + Error trying to save as + Ошибка при попытке сохранить как + + + + Save screenshot + Сохранить снимок + + + + Path copied to clipboard as + Путь скопирован в буфер обмена как + + + Saving canceled + Сохранение отменено + + + Save canceled + Сохранение отменено + + + Capture is saved and copied to the clipboard as + Снимок сохранён на диск и скопирован в буфер обмена как + + + + Unable to connect via DBus + Не удалось подключиться по DBus + + + + Powerful yet simple to use screenshot software. + Продвинутый, но простой инструмент для создания снимков экрана. + + + + See + Посмотреть + + + Capture the entire desktop. + Захватить весь рабочий стол. + + + + Open the capture launcher. + Открыть средство запуска захвата. + + + + Start a manual capture in GUI mode. + Запустить ручной захват в режиме графического интерфейса. + + + + Configure + Настроить + + + Capture a single screen. + Захват одного экрана. + + + Path where the capture will be saved + Путь сохранения снимка + + + + Capture screenshot of all monitors at the same time. + Захватить снимок со всех мониторов одновременно. + + + + Capture a screenshot of the specified monitor. + Захватить снимок с указанного монитора. + + + + Existing directory or new file to save to + Существующая директория или новый файл для сохранения + + + + Save the capture to the clipboard + Сохранить снимок в буфер обмена + + + + Pin the capture to the screen + Закрепить захват на экране + + + + Upload screenshot + Отправить снимок экрана + + + + Delay time in milliseconds + Задержка в миллисекундах + + + + Repeat screenshot with previously selected region + Повторить снимок экрана с ранее выбранной областью + + + + Screenshot region to select + Выбор области снимка экрана + + + + Set the filename pattern + Установить шаблон имени файла + + + + Accept capture as soon as a selection is made + Принять захват, как только будет сделан выбор + + + + Enable or disable the trayicon + Включить или отключить значок в трее + + + + Enable or disable run at startup + Включение или отключение запуска при старте + + + + Enable or disable the notifications + Включить или отключить уведомления + + + + Check the configuration for errors + Проверить конфигурацию на наличие ошибок + + + + Show the help message in the capture mode + Показывать справочный сообщения в режиме захвата + + + + Define the main UI color + Задать основной цвет пользовательского интерфейса + + + + Define the contrast UI color + Определить цвет контраста пользовательского интерфейса + + + + Print raw PNG capture + Необработанное изображения PNG + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + Распечатать геометрию выделения в формате WxH+X+Y. Ничего не делает, если указано raw + + + + Define the screen to capture (starting from 0) + Укажите экран для захвата (начиная с 0) + + + + Invalid delay, it must be a number greater than 0 + Недопустимая задержка, должно быть больше 0 + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + Недопустимая область, используйте «WxH+X+Y» или «all» или «screen0/screen1/...». + + + + Invalid path, must be an existing directory or a new file in an existing directory + Недопустимый путь, укажите существующий каталог или новый файл в имеющемся каталоге + + + Define the screen to capture + Выберите экран для захвата + + + + default: screen containing the cursor + по умолчанию: экран, содержащий курсор мыши + + + + Screen number + Номер экрана + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Неверный цвет, этот флаг поддерживает следующие форматы: +- #RGB (каждый из R, G и B представляет собой одну шестнадцатеричную цифру) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Именованные цвета, такие как «синий» или «красный» +Возможно, вам потребуется экранировать знак «#», как в «\#FFF» + + + Invalid delay, it must be higher than 0 + Недействительная задержка, она должна быть больше 0 + + + + Invalid screen number, it must be non negative + Недействительный номер экрана, он должен быть неотрицательным + + + Invalid path, it must be a real path in the system + Неверный путь, это должен быть реальный путь в системе + + + + Invalid value, it must be defined as 'true' or 'false' + Недействительное значение, оно должно быть определено как «true» или «false» + + + + Error + Ошибка + + + + Unable to write in + Не удалось сохранить + + + + Requested screen exceeds screen count + Запрашиваемый экран превышает доступное число экранов + + + + Full screen screenshot pinned to screen + Полноэкранный снимок закреплён на экране + + + URL copied to clipboard. + Ссылка скопирована в буфер обмена. + + + + Options + Параметры + + + Arguments + Аргументы + + + arguments + аргументы + + + + Subcommands + Подкоманды + + + + subcommands + подкоманды + + + + Usage + Использование + + + + options + параметры + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + По умолчанию запускает Flameshot в фоновом режиме и добавляет значок в трее для настройки. + + + Hi, I'm already running! +You can find me in the system tray. + Привет, я уже работаю! +Вы можете найти меня в системном трее. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Привет! Для создания снимка нажмите на значок в трее. Чтобы увидеть больше функций, нажмите правой кнопки мыши. + + + Toggle side panel + Показать/скрыть боковую панель + + + Resize selection left 1px + Изменить размер выделения влево на 1 пиксель + + + Resize selection right 1px + Изменить размер выделения вправо на 1 пиксель + + + Resize selection up 1px + Изменить размер выделения вверх на 1 пиксель + + + Resize selection down 1px + Изменить размер выделения вниз на 1 пиксель + + + Select entire screen + Выбрать весь экран + + + Move selection left 1px + Переместить выделение влево на 1 пиксель + + + Move selection right 1px + Переместить выделение вправо на 1 пиксель + + + Move selection up 1px + Переместить выделение вверх на 1 пиксель + + + Move selection down 1px + Переместить выделение вниз на 1 пиксель + + + Commit text in text area + Подтвердить текст в текстовой области + + + Delete current tool + Удалить текущий инструмент + + + + Quit capture + Выйти из захвата экрана + + + + Screenshot history + История снимков + + + + Capture screen + Захватить экран + + + + Show color picker + Показать выбор цвета + + + + Change the tool's size + Изменить размер инструмента + + + Change the tool's thickness + Изменить толщину инструмента + + + + RectangleTool + + + Rectangle + Прямоугольник + + + + Set the Rectangle as the paint tool + Выбрать инструмент «Прямоугольник» + + + + RedoTool + + + Redo + Повторить + + + + Redo the next modification + Повторить последнее изменение + + + + SaveTool + + + Save + Сохранить + + + + Save screenshot to a file + Сохранить снимок экрана в файл + + + Save the capture + Сохранить снимок + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Не удаётся определить среду рабочего стола (GNOME? KDE? Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + Универсальный адаптер захвата экрана Wayland требует Grim в качестве компонента для захвата экрана Wayland. Если компонент для захвата экрана отсутствует, пожалуйста, установите его! + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + Если настройка useGrimAdapter не включена, будет использоваться протокол DBus. Следует отметить, что использование протокола DBus в Wayland не рекомендуется. Рекомендуется включить настройку useGrimAdapter в файле flameshot.ini, чтобы активировать общий адаптер снимков экрана Wayland на основе Grim + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + Компонент снимков экрана Grim реализован на основе Wlroots, поэтому его нельзя использовать в GNOME или в подобных средах рабочего стола + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + Не удаётся определить среду рабочего стола (GNOME? KDE? Qile? Sway?…) + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + Подсказка: попробуйте задать переменную среды XDG_CURRENT_DESKTOP. + + + + Unable to capture screen + Не удалось захватить экран + + + + SecondaryInstanceWidget + + + Secondary instance + Вторичный экземпляр + + + + <b>Secondary instance.</b> Send message to primary: + <b>Вторичный экземпляр.</b> Отправленное сообщение первичному: + + + + Type something here... + Напишите что-нибудь здесь… + + + + &Send + Отпра&вить + + + + Error sending message + Ошибка при отправке сообщения + + + + The message '%1' could not be sent to the primary. + Сообщение «%1» не удалось отправить первичному. + + + + SelectionTool + + + Rectangular Selection + Прямоугольная рамка + + + + Set Selection as the paint tool + Выбрать инструмент «Прямоугольная рамка» + + + + SetShortcutDialog + + + Set Shortcut + Назначение сочетания клавиш + + + + Enter new shortcut to change + Введите новое сочетание для замены + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Нажмите Esc для отмены или ⌘+Backspace для отключения сочетание клавиш. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Нажмите Esc для отмены или Backspace для отключения сочетание клавиш. + + + + + Flameshot must be restarted for changes to take effect. + Необходимо перезапустить Flameshot для применения изменений. + + + + ShortcutsWidget + + + Hot Keys + Горячие клавиши + + + + Available shortcuts in the screen capture mode. + Доступные горячие клавиши в режиме захвата экрана. + + + + Description + Описание + + + + Key + Сочетание клавиш + + + + Left Double-click + Левый двойной щелчок мыши + + + + Toggle side panel + Показать/скрыть боковую панель + + + + Grab a color from the screen + Взять цвет с экрана + + + + Resize selection left 1px + Изменить размер выделения влево на 1 пикс + + + + Resize selection right 1px + Изменить размер выделения вправо на 1 пикс + + + + Resize selection up 1px + Изменить размер выделения вверх на 1 пикс + + + + Resize selection down 1px + Изменить размер выделения вниз на 1 пикс + + + + Symmetrically decrease width by 2px + Симметрично уменьшить ширину на 2 пикс + + + + Symmetrically increase width by 2px + Симметрично увеличить ширину на 2 пикс + + + + Symmetrically increase height by 2px + Симметрично увеличить высоту на 2 пикс + + + + Symmetrically decrease height by 2px + Симметрично уменьшить высоту на 2 пикс + + + + Select entire screen + Выбрать весь экран + + + + Move selection left 1px + Сдвинуть выделение влево на 1 пикс + + + + Move selection right 1px + Сдвинуть выделение вправо на 1 пикс + + + + Move selection up 1px + Сдвинуть выделение вверх на 1 пикс + + + + Move selection down 1px + Сдвинуть выделение вниз на 1 пикс + + + + Commit text in text area + Подтвердить текст в текстовой области + + + + Delete selected drawn object + Удалить выбранный нарисованный объект + + + + Cancel current selection + Отменить текущее выделение + + + Delete current tool + Удалить текущий инструмент + + + + Capture screen + Захватить экран + + + + Screenshot history + История снимков + + + + SidePanelWidget + + Active thickness: + Активная толщина: + + + Active color: + Активный цвет: + + + Press ESC to cancel + Нажмите Esc для отмены + + + + Active tool size: + Размер активного инструмента: + + + + Active Color: + Активный цвет: + + + + Grab Color + Захватить цвет с экрана + + + + Display grid + Сетка дисплея + + + + SizeDecreaseTool + + + Decrease Tool Size + Уменьшить размер инструмента + + + + Decrease the size of the other tools + Уменьшить размер других инструментов + + + + SizeIncreaseTool + + + Increase Tool Size + Увеличить размер инструмента + + + + Increase the size of the other tools + Увеличить размер других инструментов + + + + SizeIndicatorTool + + Selection Size Indicator + Индикатор размера выделения + + + Show X and Y dimensions of the selection + Показать размеры X и Y выделения + + + Show the dimensions of the selection (X Y) + Показывает размер выделения (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + Век (00-99) + + + + Year (00-99) + Год (00-99) + + + + Year (2000) + Год (2000) + + + + Month Name (jan) + Название месяца (янв) + + + + Month Name (january) + Название месяца (январь) + + + + Month (01-12) + Месяц (01-12) + + + + Week Day (1-7) + День недели (1-7) + + + + Week (01-53) + Неделя (01-53) + + + + Day Name (mon) + День недели (пн) + + + + Day Name (monday) + День недели (понедельник) + + + + Day (01-31) + День (01-31) + + + + Day of Month (1-31) + День месяца (1-31) + + + + Day (001-366) + День (001-366) + + + + Time (%H-%M-%S) + Время (%H-%M-%S) + + + + Time (%H-%M) + Время (%H-%M) + + + + Hour (00-23) + Час (00-23) + + + + Hour (01-12) + Час (01-12) + + + + Minute (00-59) + Минуты (00-59) + + + + Second (00-59) + Секунды (00-59) + + + + Full Date (%m/%d/%y) + Полная дата (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + Полная дата (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + Полная дата (%d-%m-%Y) + + + + SystemNotification + + + Flameshot Info + Уведомление Flameshot + + + + TextConfig + + + StrikeOut + Зачёркнутый + + + + Underline + Подчёркнутый + + + + Bold + Полужирный + + + + Italic + Курсив + + + + Left Align + Выравнивание по левому краю + + + + Center Align + Выравнивание по центру + + + + Right Align + Выравнивание по правому краю + + + + TextTool + + + Text + Текст + + + + Add text to your capture + Добавить текст на снимок + + + + TrayIcon + + + &Take Screenshot + &Сделать снимок + + + + &Open Launcher + &Запуск захвата + + + + &Configuration + &Настройки + + + + &About + &О программе + + + + Check for updates + Проверить обновления + + + + New version %1 is available + Доступна новая версия %1 + + + + &Quit + &Выход + + + + &Latest Uploads + &Последние отправки + + + + &Open Save Path + &Открыть путь сохранения + + + + UIcolorEditor + + UI Color Editor + Редактор цвета интерфейса + + + + Change the color moving the selectors and see the changes in the preview buttons. + Цвет меняется перемещением селекторов, изменения отображаются на кнопках предпросмотра. + + + + Select a Button to modify it + Выберите кнопку, чтобы изменить её + + + + Main Color + Основной цвет + + + + Click on this button to set the edition mode of the main color. + Нажмите на эту кнопку, чтобы перейти в режим правки основного цвета. + + + + Contrast Color + Контрастный цвет + + + + Click on this button to set the edition mode of the contrast color. + Нажмите на эту кнопку, чтобы перейти в режим правки контрастного цвета. + + + + UndoTool + + + Undo + Отменить + + + + Undo the last modification + Отменить последнее изменение + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + Доступна новая версия Flameshot %1 + + + + Ignore + Игнорировать + + + + Later + Позже + + + + Update + Обновить + + + + UploadHistory + + + Upload History + История отправок + + + + Screenshots history is empty + История снимков экрана пуста + + + + UploadLineItem + + + Form + Форма + + + + TextLabel + TextLabel + + + + Copy URL + Копировать ссылку + + + + Open In Browser + Открыть в браузере + + + + Confirm to delete + Подтвердите удаление + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Вы уверены, что хотите удалить снимок экрана из последних загрузок и с сервера? + + + + UploadStorageConfig + + Upload storage + Хранилище загрузок + + + Imgur storage + Хранилище Imgur + + + S3 storage (require config.ini file with s3 credentials) + Хранилище S3 (требуется файл config.ini с учётными данными s3) + + + + UtilityPanel + + + Close + Закрыть + + + + <Empty> + <Пусто> + + + Hide + Скрыть + + + + VisualsEditor + + + Opacity of area outside selection: + Затенённость области вне выделения: + + + + UI Color Editor + Редактор цвета интерфейса + + + + Colorpicker Editor + Редактор палитры цветов + + + + Button Selection + Выбор кнопок + + + + Select All + Выбрать все + + + + color_widgets::ColorDialog + + + Pick + Выбрать + + + + color_widgets::ColorPalette + + + Unnamed + Безымянный + + + + color_widgets::ColorPaletteModel + + + Unnamed + Безымянный + + + + %1 (%2 colors) + %1 (%2 цвета) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + Открыть новую палитру из файла + + + + + Create a new palette + Создать новую палитру + + + + + Duplicate the current palette + Дублировать текущую палитру + + + + + Delete the current palette + Удалить текущую палитру + + + + + Revert changes to the current palette + Вернуть изменения к текущей палитре + + + + + Save changes to the current palette + Сохранить изменения в текущей палитре + + + + + Add a color to the palette + Добавить цвет в палитру + + + + + Remove the selected color from the palette + Удалить выбранный цвет из палитры + + + + + New Palette + Новая палитра + + + + + Name + Имя + + + + GIMP Palettes (*.gpl) + Палитры GIMP (*.gpl) + + + + Palette Image (%1) + Изображение палитры (%1) + + + + All Files (*) + Все файлы (*) + + + + + Open Palette + Открыть палитру + + + + Failed to load the palette file +%1 + Не удалось загрузить файл палитры +%1 + + + + color_widgets::GradientEditor + + + Add Color + Добавить цвет + + + + Remove Color + Удалить цвет + + + + Edit Color... + Изменить цвет... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 цвета) + + + + color_widgets::Swatch + + + Clear Color + Очистить цвет + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_sk.ts b/data/translations/Internationalization_sk.ts new file mode 100644 index 0000000..ae6f44d --- /dev/null +++ b/data/translations/Internationalization_sk.ts @@ -0,0 +1,3244 @@ + + + + + AbstractWidgetList + + + Add New + Pridať nové + + + + Move Up + Posunúť hore + + + + Move Down + Posunúť dole + + + + Remove + Odstrániť + + + + AcceptTool + + + Accept + Prijať + + + + Accept the capture + Prijať zachytenú obrazovku + + + + AppLauncher + + + App Launcher + Spúšťač aplikácií + + + + Choose an app to open the capture + Vybrať aplikáciu na otvorenie snímky obrazovky + + + + AppLauncherWidget + + + Open With + Otvoriť pomocou + + + + Launch in terminal + Otvoriť v termináli + + + + Keep open after selection + Nechať otvorené po výbere + + + + + Error + Chyba + + + + Unable to write in + Zlyhal zápis do + + + + Unable to launch in terminal. + Nepodarilo sa spustiť v termináli. + + + + ArrowTool + + + Arrow + Šípka + + + + Set the Arrow as the paint tool + Nastaviť Šípku ako nástroj na kreslenie + + + + BlurTool + + Blur + Rozmazanie + + + Set Blur as the paint tool + Nastaviť Rozmazanie ako nástroj pre úpravy + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Režim zachytávania</b> + + + + Rectangular Region + Pravouhlá oblasť + + + + Full Screen (Current Display) + Celá obrazovka (aktívny monitor) + + + + Full Screen (All Monitors) + Celá obrazovka (všetky monitory) + + + + No Delay + Bez oneskorenia + + + + second + sekunda + + + + + + seconds + sekundy + + + + + Take new screenshot + Zachytiť novú snímku + + + + + Area: + Oblasť: + + + + + Capture Launcher + Spúšťač zachytávania obrazovky + + + + + TextLabel + TextovýPopis + + + + + Capture Mode + Režim zachytávania + + + + + Delay: + Oneskorenie: + + + + + WxH+x+y + WxH+x+y + + + + CaptureWidget + + + Unable to capture screen + Nepodarilo sa zachytiť obrazovku + + + + Mouse + Myš + + + + Select screenshot area + Výber oblasti snímky obrazovky + + + + Mouse Wheel + Koliesko myši + + + + Change tool size + Zmeniť veľkosť nástroja + + + + Right Click + Klik pravým tlačidlom + + + + Show color picker + Zobrazenie okna na výber farby + + + + Open side panel + Otvorenie bočného panela + + + + Esc + Esc + + + + Exit + Ukončenie + + + + Quit Capture + Ukončiť snímanie + + + + Are you sure you want to quit capture? + Naozaj chcete ukončiť snímanie? + + + + Do not show this again + Ďalej už nezobrazovať + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot stratil pozornosť. Klávesové skratky nebudú fungovať, kým niekam nekliknete. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + Chyba konfigurácie vyriešená. Spustite znova `flameshot gui`, aby ste ju použili. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Vyberte oblasť snímania pomocou myši alebo stlačte Esc pre ukončenie. +Stlačte Enter pre zachytenie obrazovky. +Kliknite pravým tlačidlom pre zobrazenie nástroja pre výber farby. +Použite kolečko myši pre zmenu hrúbky vybraného nástroja. +Stlačte medzerník pre otvorenie postranného panelu. + + + + Tool Settings + Nastavenia nástrojov + + + + CircleCountTool + + + Circle Counter + Bodové počítadlo + + + + Add an autoincrementing counter bubble + Pridať bublinu s (automaticky rastúcim) číslom + + + + CircleTool + + + Circle + Kruh + + + + Set the Circle as the paint tool + Nastaviť Kruh ako nástroj na kreslenie + + + + ColorDialog + + + + Select Color + Vybrať farbu + + + + + Saturation + Nasýtenie + + + + + Hue + Odtieň + + + + + Hex + Hex + + + + + Blue + Blue + + + + + Value + Hodnota + + + + + Green + Green + + + + + Alpha + Alpha + + + + + Red + Red + + + + ColorGrabWidget + + + Accept color + Akceptovať farbu + + + + Enter or Left Click + Zadajte alebo kliknite na tlačidlo vľavo + + + + Precisely select color + Presne vyberte farbu + + + + Hold Left Click + Držte ľavé tlačidlo + + + + Toggle magnifier + Prepínanie lupy + + + + Space or Right Click + Priestor alebo pravý Click + + + + Cancel + Zrušiť + + + + Esc + Všeobecný + + + + ColorPickerEditor + + Select Preset: + Vyberte predvoľbu: + + + Select preset using the spinbox + Použite ruletu na výber predvoľby + + + + Edit Preset: + Edit Preset: + + + + Enter color to update preset + Zadajte farbu aktualizovať preset + + + + Update + Stiahnuť + + + + Press button to update the selected preset + Stlačte tlačidlo na odstránenie vybranej predvoľby + + + + Delete + Odstrániť + + + + Press button to delete the selected preset + Stlačte tlačidlo na odstránenie vybranej predvoľby + + + + Add Preset: + Pridať predvoľbu: + + + + Enter color manually or select it using the color-wheel + Zadajte farbu ručne alebo ju vyberte na palete + + + + Add + Pridať + + + + Press button to add preset + Stlačte tlačidlo na výber predvoľby + + + + + Error + Chyba + + + + Unable to add preset. Maximum limit reached. + Nedá sa pridať predvoľba. Dosiahli ste maximálny limit ich počtu. + + + + Unable to remove preset. Minimum limit reached. + Nepodarilo sa odstrániť predvoľbu. Dosiahli ste minimálny limit ich počtu. + + + + ConfigErrorDetails + + + Configuration errors + Chyby konfigurácie + + + + ConfigHandler + + + Unrecognized setting: '%1' + + Nerozpoznané nastavenie: '%1' + + + + + Unrecognized shortcut name: '%1'. + + Nerozpoznaný názov skratky: '%1'. + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + Konflikt skratiek: '%1' a '%2' majú rovnakú skratku: %3 + + + + + Bad value in '%1'. Expected: %2 + + Zlá hodnota v '%1'. Očakávaná hodnota: %2 + + + + + You have successfully resolved the configuration error. + Chybu konfigurácie ste úspešne vyriešili. + + + + The configuration contains an error. Open configuration to resolve. + Konfigurácia obsahuje chybu. Otvorte konfiguráciu a vyriešte ju. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + Zlý konfiguračný kľúč '%1' v ConfigHandler. Nahláste to ako chybu. + + + + ConfigResolver + + + Resolve configuration errors + Riešenie chýb konfigurácie + + + + <b>You must resolve all errors before continuing:</b> + <b>Pred pokračovaním musíte vyriešiť všetky chyby:</b> + + + + Reset + Resetovať + + + + Reset to the default value. + Obnovenie predvolenej hodnoty. + + + + Remove + Odstrániť + + + + Remove this setting. + Odstráňte toto nastavenie. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + Niektoré klávesové skratky sú konfliktné. +Toto NEBEZPEČÍ spustenie Flameshotu. +Riešte ich ručne v konfiguračnom súbore. + + + + Resolve all + Vyriešte všetky + + + + Resolve all listed errors. + Riešte všetky uvedené chyby. + + + + Details + Podrobnosti + + + + ConfigWindow + + + Configuration + Konfigurácia + + + + Interface + Používateľské rozhranie + + + + Filename Editor + Editor názvov súborov + + + + General + Všeobecné + + + + Shortcuts + Klávesové skratky + + + + Resolve + Vyriešiť + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>Konfiguračný súbor obsahuje chyby. Pred pokračovaním ich vyriešte.</b> + + + + Controller + + New version %1 is available + Je dostupná nová verzia: %1 + + + You have the latest version + Používate najnovšiu verziu + + + Failed to get information about the latest version. + Nepodarilo sa získať informácie o najnovšej verzii. + + + Error + Chyba + + + Unable to close active modal widgets + Nepodarilo sa zatvoriť aktívne modálne ovládacie prvky + + + &Take Screenshot + &Vytvoriť snímku + + + &Open Launcher + &Otvoriť Spúšťač + + + &Configuration + &Konfigurácia + + + &About + O &programe + + + Check for updates + Skontrolovať aktualizácie + + + &Latest Uploads + &Posledné nahratia + + + URL copied to clipboard. + URL skopírovaná do schránky. + + + &Information + &Informácie + + + &Quit + &Ukončiť + + + + CopyTool + + + Copy + Kopírovať + + + + Copy selection to clipboard + Kopírovať výber do schránky + + + Copy the selection into the clipboard + Kopírovať výber do schránky + + + + DBusUtils + + Unable to connect via DBus + Nie je možné pripojiť sa prostredníctvom DBus + + + + ExitTool + + + Exit + Ukončiť + + + + Leave the capture screen + Opustiť obrazovku so zachytávaním + + + + FileNameEditor + + + Edit the name of your captures: + Upraviť meno vašich snímok obrazovky: + + + + Edit: + Upraviť: + + + + Preview: + Ukážka: + + + + Save + Uložiť + + + + Saves the pattern + Uloží vzor + + + + Restore + Obnoviť + + + Reset + Resetovať + + + + Restores the saved pattern + Vráti zmeny + + + + Clear + Vyčistiť + + + + Deletes the name + Vymaže meno + + + + Flameshot + + + Error + Chybné + + + + Unable to close active modal widgets + Nemožno uzavrieť aktívne modal widgety + + + + URL copied to clipboard. + URL skopírovaná do schránky. + + + + FlameshotDaemon + + + New version %1 is available + Je dostupná nová verzia: %1 + + + + You have the latest version + Máte najnovšiu verziu + + + + Failed to get information about the latest version. + Zneužívanie informácií o najnovšej verzii. + + + + Unable to connect via DBus + Nie je možné pripojiť sa prostredníctvom DBus + + + + GeneneralConf + + Import + Importovať + + + Error + Chyba + + + Unable to read file. + Zlyhalo čítanie súboru. + + + Unable to write file. + Zlyhal zápis do súboru. + + + Save File + Uložiť súbor + + + Confirm Reset + Potvrdiť Reset + + + Are you sure you want to reset the configuration? + Naozaj si želáte resetovať aktuálnu konfiguráciu? + + + Show help message + Zobraziť nápovedu + + + Show the help message at the beginning in the capture mode. + Zobraziť nápovedu na začiatku počas režimu zachytávania obrazovky. + + + Show the side panel button + Zobraziť tlačidlo na postrannom paneli + + + Show the side panel toggle button in the capture mode. + V režime zachytávania zobrazovať tlačidlo na postrannom paneli. + + + Show desktop notifications + Zobraziť systémové upozornenia + + + Show tray icon + Zobraziť stavovú ikonu + + + Show the systemtray icon + Zobraziť ikonu v stavovej oblasti + + + Configuration File + Súbor s konfiguráciou + + + Export + Exportovať + + + Reset + Resetovať + + + Launch at startup + Spúšťať pri štarte + + + Launch Flameshot + Spustiť Flameshot + + + Close after capture + Zavrieť po vytvorení snímky + + + Close after taking a screenshot + Zatvoriť po vytvorení snímky obrazovky + + + Copy URL after upload + Kopírovať URL po uploade + + + Copy URL and close window after upload + Po nahratí skopírovať URL a zavrieť okno + + + Save image after copy + Uložiť obrázok po kopírovaní + + + Save image file after copying it + Uložiť obrázok so súborom po jeho skopírovaní + + + Save Path + Cesta pre ukladanie + + + Change... + Zmeniť... + + + Choose a Folder + Vyberte priečinok + + + Unable to write to directory. + Zápis do adresára nie je možný. + + + + GeneralConf + + + + Import + Importovať + + + + + + + Error + Chyba + + + + Unable to read file. + Zlyhalo čítanie súboru. + + + + + Unable to write file. + Zlyhal zápis do súboru. + + + + Save File + Uložiť súbor + + + + Confirm Reset + Potvrdiť Reset + + + + Are you sure you want to reset the configuration? + Naozaj si želáte resetovať aktuálnu konfiguráciu? + + + + Show help message + Zobraziť nápovedu + + + Show the help message at the beginning in the capture mode. + Zobraziť nápovedu na začiatku počas režimu zachytávania obrazovky. + + + + Show the side panel button + Zobraziť tlačidlo na postrannom paneli + + + Show the side panel toggle button in the capture mode. + V režime zachytávania zobrazovať tlačidlo na postrannom paneli. + + + + Show desktop notifications + Zobraziť systémové upozornenia + + + + Show tray icon + Zobraziť stavovú ikonu + + + Show the systemtray icon + Zobraziť ikonu v stavovej oblasti + + + + Confirmation required to delete screenshot from the latest uploads + Pri odstraňovaní snímky z posledných nahraní je vyžadované potvrdenie + + + + Configuration File + Súbor s konfiguráciou + + + + Export + Exportovať + + + + Reset + Resetovať + + + + Automatic check for updates + Automaticky kontrolovať aktualizácie + + + + Allow multiple flameshot GUI instances simultaneously + Povoliť viacero inštancií Flameshot GUI súčasne + + + This allows you to take screenshots of flameshot itself for example. + To vám umožní robiť napríklad snímky obrazovky samotného Flameshotu. + + + Automatically close daemon when it is not needed + Automatické zatvorenie démona, keď nie je potrebný + + + Launch at startup + Spustiť pri štarte + + + Launch Flameshot + Spustiť Flameshot + + + + Show welcome message on launch + Pri spustení zobraziť uvítaciu správu + + + + Use large predefined color palette + Používanie veľkej preddefinovanej palety farieb + + + + Copy URL after upload + Kopírovať URL po nahratí + + + Copy URL and close window after upload + Po nahratí skopírovať URL a zavrieť okno + + + + Save image after copy + Uložiť obrázok po kopírovaní + + + Save image file after copying it + Uložiť obrázok so súborom po jeho skopírovaní + + + + Show the help message at the beginning in the capture mode + V režime zachytávania zobraziť text pomocníka na začiatku + + + + Use last region for GUI mode + Použiť poslednú oblasť v režime GUI + + + + Use the last region as the default selection for the next screenshot in GUI mode + Použiť poslednú oblasť ako predvolený výber pre ďalší snímku obrazovky v režime GUI + + + + Show the side panel toggle button in the capture mode + Zobraziť bočný panel prepnúť tlačidlo v režime zachytenia + + + + Enable desktop notifications + Povoliť systémové upozornenia + + + + Show abort notifications + Zobrazovať notifikácie o zrušení + + + + Enable abort notifications + Povoliť notifikácie o zrušení + + + + Show icon in the system tray + Zobraziť ikonu v systémovej lište + + + + Use grim to capture screenshots + Použiť grim na zachytávanie obrazovky + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + Grim je nástroj pre Wayland (výhradne) na vytváranie snímok obrazovky založený na protokole screencopy. Vo všeobecnosti povoľte pre minimalistických správcov okien ako je sway, hyprland, atď. + + + + Ask for confirmation to delete screenshot from the latest uploads + Pred odstránením snímky z posledného nahrania sa opýtať + + + + Check for updates automatically + Kontrolovať aktualizácie automaticky + + + + This allows you to take screenshots of Flameshot itself for example + Toto vám umožní urobiť snímku obrazovky samotného Flameshot-u + + + Launch Flameshot daemon when computer is booted + Pri štarte počítača spúštať Flameshot démona + + + + Show the welcome message box in the middle of the screen while taking a screenshot + Pri vytváraní snímky zobraziť okno s privítaním v strede obrazovky + + + + Use a large predefined color palette + Použiť veľkú paletu s preddefinovanými farbami + + + + Copy on double click + Kopírovať pri dvojkliku + + + Enable Copy on Double Click + Povoliť kópiu na dvojité kliknite + + + Copy URL and close window after uploading was successful + Po úspešnom nahratí skopírovať adresu URL a zavrieť okno + + + + Automatically unload from memory when it is not needed + Automaticky uvoľniť z pamäte, ak nie je potrebný + + + + Automatically close daemon (background process) when it is not needed + Automaticky ukončiť démona (proces na pozadí), keď nie je potrebný + + + + Launch in background at startup + Spustiť na pozadí pri štarte + + + + Launch Flameshot daemon (background process) when computer is booted + Spustiť démona Flameshot (proces na pozadí) pri spustení počítača + + + + Ask before quit capture + Pred ukončením snímania sa spýtať + + + + Show the confirmation prompt before ESC quit + Zobraziť dialógové okno s potvrdením pred ukončením pomocou ESC + + + + Enable Copy to clipboard on Double Click + Povoliť Kopírovanie do schránky pri dvojitom kliknutí + + + + Copy URL after uploading was successful + Kopírovať adresu URL po úspešnom nahratí + + + + After copying the screenshot, save it to a file as well + Po skopírovaní snímky ho tiež uložiť do súboru + + + + Save Path + Cesta pre zápisy + + + + Change... + Zmeniť... + + + + Use fixed path for screenshots to save + Pre ukladanie snímok obrazovky používať rovnakú cestu + + + + Preferred save file extension: + Uprednostňovaná prípona uloženého súboru: + + + + Latest Uploads Max Size + Maximálna Veľkosť Posledných Uploadov + + + + Imgur Application Client ID + Imgur Aplikácia Klient ID + + + + Undo limit + Vrátiť limit + + + + Use JPG format for clipboard (PNG default) + Pre schránku používať JPG (štandardne PNG) + + + + Use lossy JPG format for clipboard (lossless PNG default) + Používať stratový formát JPG pre schránku (predvolene bezstratový PNG) + + + + Copy file path after save + Po uložení skopírovať cestu k súboru + + + + Copy the file path to clipboard after the file is saved + Skopírovať cestu k súboru do schránky po tom, ako je súbor uložený + + + + Anti-aliasing image when zoom the pinned image + Vyhladzovať obraz pri zväčšení pripnutého obrázka + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + Po priblížení pripnutého obrázka sa má obrázok vyhladiť alebo zostať pixelový + + + + + Upload image without confirmation + Nahrávanie obrázku bez potvrdenia + + + + Choose a Folder + Vyberte priečinok + + + + Unable to write to directory. + Zápis do adresára nie je možný. + + + + Show magnifier + Zobraziť lupu + + + + Enable a magnifier while selecting the screenshot area + Zapnúť lupu počas výberu oblasti na zosnímanie + + + + Square shaped magnifier + Hranatá lupa + + + + Make the magnifier to be square-shaped + Lupa bude v tvare štvorca + + + + Milliseconds before geometry display hides; 0 means do not hide + Počet milisekúnd, kým sa zobrazenie geometrie ukryje; 0 znamená, že sa ukrývať nebude + + + + Set geometry display timeout (ms) + Nastaviť časové obmedzenie zobrazenie geometrie (ms) + + + + Selection Geometry Display + Zobrazenie geometrie výberu + + + + Display Location + Umiestnenie displeja + + + + None + Žiadne + + + + Top Left + Vľavo hore + + + + Top Right + Vpravo hore + + + + Bottom Left + Vľavo dole + + + + Bottom Right + Vpravo dole + + + + Center + Stred + + + + Quality range of 0-100; Higher number is better quality and larger file size + Kvalita v rozsahu 0-100; vyššie číslo znamená lepšiu kvalitu a väčšiu veľkosť súboru + + + + JPEG Quality + Kvalita JPEG + + + + Reverse arrow + Otočiť šípku + + + + Draw the arrow head first + Najprv nakresliť hrot šípky + + + + Insecure Pixelate + Nezabezpečené rozštvorčekovanie + + + + Draw the pixelation effect in an insecure but more asethetic way. + Vykresliť efekt štvorčekov menej bezpečným alebo estetickejším spôsobom. + + + + HistoryWidget + + Latest Uploads + Posledné nahratia + + + Screenshots history is empty + História snímok obrazovky je prázdna + + + Copy URL + Kopírovať URL + + + URL copied to clipboard. + URL skopírovaná do schránky. + + + Open in browser + Otvoriť v prehliadači + + + Confirm to delete + Potvrďte odstránenie + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Naozaj chcete odstrániť snímku obrazovky zo zoznamu posledných nahratí a zo servera? + + + + ImgS3Uploader + + Uploading Image + Nahrávam obrázok + + + URL copied to clipboard. + URL skopírovaná do schránky. + + + Error + Chyba + + + + ImgUploadDialog + + + Upload Confirmation + Potvrdenie o nahratí + + + + Do you want to upload this capture? + Chcete nahrať toto zachytenie? + + + + + Upload without confirmation + Nahrávanie bez potvrdenia + + + + ImgUploader + + Uploading Image + Nahrávam obrázok + + + Unable to open the URL. + Nepodarilo sa otvoriť URL. + + + URL copied to clipboard. + URL skopírovaná do schránky. + + + Screenshot copied to clipboard. + Snímka obrazovky bola skopírovaná do schránky. + + + Copy URL + Kopírovať URL + + + Open URL + Otvoriť URL + + + Delete image + Vymazať obrázok + + + Image to Clipboard. + Obrázok do schránky. + + + + ImgUploaderBase + + + Upload image + Upload image + + + + Uploading Image + Nahrávam obrázok + + + + Copy URL + Kopírovať URL + + + + Open URL + Otvoriť URL + + + + Delete image + Vymazať obrázok + + + + Image to Clipboard. + Obrázok do schránky. + + + + Save image + Uložiť obrázok + + + + Unable to open the URL. + Nepodarilo sa otvoriť URL. + + + + URL copied to clipboard. + URL skopírovaná do schránky. + + + + Screenshot copied to clipboard. + Snímka obrazovky bola skopírovaná do schránky. + + + + Unable to save the screenshot to disk. + Nepodarilo sa uložiť snímku na disk. + + + + Screenshot saved. + Snímka bola uložená. + + + + ImgUploaderTool + + + Image Uploader + Uploader obrázkov + + + + Upload the selection + Nahrať výber + + + + ImgurUploader + + Upload to Imgur + Nahrať na Imgur + + + Uploading Image + Nahrávam obrázok + + + Copy URL + Kopírovať URL + + + Open URL + Otvoriť URL + + + Delete image + Vymazať obrázok + + + Image to Clipboard. + Obrázok do schránky. + + + + Unable to open the URL. + Nepodarilo sa otvoriť URL. + + + URL copied to clipboard. + URL skopírovaná do schránky. + + + Screenshot copied to clipboard. + Snímka obrazovky bola skopírovaná do schránky. + + + + ImgurUploaderTool + + Image Uploader + Uploader obrázkov + + + Upload the selection to Imgur + Nahrať výber na Imgur + + + + InfoWindow + + + + About + O programe + + + + + Icon + Ikona + + + + + License + Licencia + + + + + GPLv3+ + GPLv3+ + + + + + Version + Verzia + + + + + Flameshot v + Flameshot v + + + + + OS Info + Informácie o OS + + + + + Copy Info + Kopírovať informácie + + + SPACEBAR + MEDZERNÍK + + + Right Click + Kliknutie pravým tlačidlom + + + Mouse Wheel + Kolečko myši + + + Move selection 1px + Presunúť výber o 1 px + + + Resize selection 1px + Zmeniť rozmery výberu o 1 px + + + Quit capture + Ukončiť zachytávanie obrazovky + + + Copy to clipboard + Kopírovať do schránky + + + Save selection as a file + Zapísať výber do súboru + + + Undo the last modification + Vrátiť poslednú úpravu + + + Toggle visibility of sidebar with options of the selected tool + Prepnúť viditeľnosť bočnej lišty s možnosťami vybraného nástroja + + + Show color picker + Zobraziť dialóg na výber farby + + + Change the tool's thickness + Zmena hrúbky nástroja + + + Available shortcuts in the screen capture mode. + Dostupné klávesové skratky v režime zachytávania obrazovky. + + + Key + Kláves + + + Description + Popis + + + <u><b>License</b></u> + <u><b>Licencia</b></u> + + + <u><b>Version</b></u> + <u><b>Verzia</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Klávesové skratky</b></u> + + + + InvertTool + + + Invert + Inverzný + + + + Set Inverter as the paint tool + Nastaviť Obracač ako nástroj na kreslenie + + + + LineTool + + + Line + Čiara + + + + Set the Line as the paint tool + Nastaviť Čiaru ako nástroj na úpravy + + + + MarkerTool + + + Marker + Fixka + + + + Set the Marker as the paint tool + Nastaviť Fixku ako nástroj na kreslenie + + + + MoveTool + + + Move + Presun + + + + Move the selection area + Presunúť oblasť výberu + + + + PencilTool + + + Pencil + Ceruzka + + + + Set the Pencil as the paint tool + Nastaviť Ceruzku ako nástroj na kreslenie + + + + PinTool + + + Pin Tool + Pripínačik + + + + Pin image on the desktop + Pripnúť obrázok na plochu + + + + PinWidget + + + Context menu + Context menu + + + + Copy to clipboard + Kopíruje do schránky + + + + Save to file + Uložiť súbor + + + + Rotate Right + Otočiť doprava + + + + Rotate Left + Otočiť doľava + + + + Increase Opacity + Zvýšiť nepriehľadnosť + + + + Decrease Opacity + Znížiť nepriehľadnosť + + + + Close + Zavrieť + + + + PixelateTool + + + Pixelate + Rozštvorčekovanie + + + + Set Pixelate as the paint tool. + Nastaviť Rozštvorčekovanie ako kresliaci nástroj. + + + Set Pixelate as the paint tool + Nastaviť Rozštvorčekovanie ako nástroj pre úpravy + + + + PrimaryInstanceWidget + + + Primary instance + Primárna inštancia + + + + <b>Primary instance.</b> Messages received from secondaries: + <b>Primárna inštancia.</b> Správy prijaté zo sekundárnych: + + + + QHotkey + + Failed to register %1. Error: %2 + Nepodarilo sa zaregistrovať %1. Chyba: %2 + + + Failed to unregister %1. Error: %2 + Nepodarilo sa odregistrovať %1. Chyba: %2 + + + + QObject + + + Unable to connect via DBus + Nie je možné pripojiť sa prostredníctvom DBus + + + + Powerful yet simple to use screenshot software. + Mocný, no zároveň jednoduchý softvér na zachytávanie obrazovky. + + + + See + Pozrite + + + Capture the entire desktop. + Zachytiť celú plochu. + + + + Open the capture launcher. + Otvoriť spúšťač zachytávania. + + + + Start a manual capture in GUI mode. + Spustiť manuálne zachytávanie v režime GUI. + + + + Configure + Konfigurovať + + + Capture a single screen. + Zachytiť jeden monitor. + + + Path where the capture will be saved + Cesta, kam bude snímka uložená + + + + Capture screenshot of all monitors at the same time. + Urobiť naraz snímku obrazovky všetkých monitorov. + + + + Capture a screenshot of the specified monitor. + Urobiť snímku obrazovky konkrétneho monitora. + + + + Existing directory or new file to save to + Existujúci adresár alebo nový súbor na uloženie + + + + Save the capture to the clipboard + Uložiť snímku do schránky + + + + Pin the capture to the screen + Pripnúť zachytenú snímku k obrazovke + + + + Upload screenshot + Nahrať snímku obrazovky + + + + Delay time in milliseconds + Oneskorenie času v milisekundách + + + + Repeat screenshot with previously selected region + Opakovať snímku obrazovku s predtým vybranou oblasťou + + + + Screenshot region to select + Oblasť obrazovky na výber + + + + Set the filename pattern + Nastaviť masku pre pomenovanie súborov + + + + Accept capture as soon as a selection is made + Akceptovať zachytenie hneď po výbere + + + + Enable or disable the trayicon + Povoliť alebo zakázať ikonu v lište + + + + Enable or disable run at startup + Povoliť alebo zakázáť spustenie pri štarte systému + + + + Enable or disable the notifications + Povoliť alebo zakázať notifikácie + + + + Check the configuration for errors + Kontrola konfigurácie na chyby + + + + Show the help message in the capture mode + Ukazovať nápovedu v režime zachytávania + + + + Define the main UI color + Nastaviť farbu hlavného používateľského rozhrania + + + + Define the contrast UI color + Nastaviť kontrastnú farbu používateľského rozhrania + + + + Print raw PNG capture + Zobraziť surovú PNG snímku + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + Zobraziť geometriu výberu vo formáte Š D X Y. Neurobí nič pri nastavení raw + + + + Define the screen to capture (starting from 0) + Definujte obrazovku, ktorú chcete zachytiť (od 0) + + + + Invalid delay, it must be a number greater than 0 + Neplatné oneskorenie, musí to byť číslo väčšie ako 0 + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + Neplatná oblasť, použite 'WxH+X+Y' alebo 'all' alebo 'screen0/screen1/...'. + + + + Invalid path, must be an existing directory or a new file in an existing directory + Nesprávna cesta, musí to byť existujúci adresár alebo nový súbor v existujúcom adresári + + + Define the screen to capture + Nastaviť monitor, ktorý bude zachytávaný + + + + default: screen containing the cursor + predvolené: monitor, na ktorom je kurzor myši + + + + Screen number + Číslo monitora + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Neplatná farba, tento prepínač podporuje nasledovné formáty: +- #RGB (každá zo zložiek R, G a B je samostatným hexadecimálnym číslom) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- anglické mená farieb ako 'blue' alebo 'red' +Možno budete musieť napísať pred '#' opačnú lomku, teda '\#FFF' + + + Invalid delay, it must be higher than 0 + Neplatné oneskorenie, musí byť vyššie ako 0 + + + + Invalid screen number, it must be non negative + Neplatné číslo monitora, môže byť len kladné + + + Invalid path, it must be a real path in the system + Neplatná cesta, musí sa jednať o skutočnú cestu na systéme + + + + Invalid value, it must be defined as 'true' or 'false' + Neplatná hodnota, musí byť definovaná ako 'pravda' alebo 'nepravda' + + + + Error + Chyba + + + + Unable to write in + Zlyhal zápis do + + + + + Capture saved to clipboard. + Snímka uložená do schránky. + + + Capture saved to clipboard + Snímka uložená do schránky + + + + Error while saving to clipboard + Chyba pri ukladaní do schránky + + + + + Capture saved as + Snímka uložená ako + + + + + Error trying to save as + Chyba pri ukladaní do + + + + Save screenshot + Uložiť snímku + + + + Path copied to clipboard as + Incorrect path, must be an existing directory or a new file in an existing directory + + + Saving canceled + Ukladanie zrušené + + + Save canceled + Ukladanie zrušené + + + Capture is saved and copied to the clipboard as + Snímka je uložená a skopírovaná do schránky ako + + + + Save Error + Chyba pri ukladaní + + + + Requested screen exceeds screen count + Požadovaná obrazovka presahuje počet obrazov + + + + Full screen screenshot pinned to screen + Snímka celej obrazovky pripnutá na obrazovku + + + URL copied to clipboard. + URL skopírovaná do schránky. + + + + Options + Voľby + + + Arguments + Argumenty + + + arguments + argumenty + + + + Subcommands + Podpríkazy + + + + subcommands + podpríkazy + + + + Usage + Použitie + + + + options + voľby + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Štandardne sa spúšťa Flameshot na pozadí a nastavuje sa pomocou ikony v systémovej lište. + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Štandardne sa Flameshot spúšťa na pozadí a pridáva do lišty ikonu, ktorou je ho možné ovládať. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Ahoj, som tu! Pre vytvorenie snímky kliknite na ikonu v lište a k ďalším možnostiam sa dostanete kliknutím pravým tlačidlom. + + + Toggle side panel + Prepnúť zobrazenie postranného panelu + + + Resize selection left 1px + Zmeniť rozmery výberu o 1 pixel vľavo + + + Resize selection right 1px + Zmeniť rozmery výberu o 1 pixel vpravo + + + Resize selection up 1px + Zmeniť rozmery výberu o 1 pixel nahor + + + Resize selection down 1px + Zmeniť rozmery výberu o 1 pixel nadol + + + Select entire screen + Vybrať celú obrazovku + + + Move selection left 1px + Presunúť výber vľavo o 1 pixel + + + Move selection right 1px + Presunúť výber vpravo o 1 pixel + + + Move selection up 1px + Presunúť výber nahor o 1 pixel + + + Move selection down 1px + Presunúť výber nadol o 1 pixel + + + Commit text in text area + Potvrdiť pridanie textu + + + Delete current tool + Vymazať momentálny nástroj + + + + Quit capture + Ukončiť zachytávanie + + + + Screenshot history + História snímok + + + + Capture screen + Zachytiť obrazovku + + + + Show color picker + Zobraziť dialóg na výber farby + + + + Change the tool's size + Zmena veľkosti nástroja + + + Change the tool's thickness + Zmeniť hrúbku nástroja + + + + RectangleTool + + + Rectangle + Obdĺžnik + + + + Set the Rectangle as the paint tool + Nastaviť Obdĺžnik ako nástroj na kreslenie + + + + RedoTool + + + Redo + Znova + + + + Redo the next modification + Zopakovať úpravu + + + + SaveTool + + + Save + Uložiť + + + + Save screenshot to a file + Uložiť snímku obrazovky do súboru + + + Save the capture + Uložiť snímku obrazovky + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Nie je možné detekovať stolové prostredie (GNOME? KDE? Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + Univerzálny adaptér Wayland na snímanie obrazovky vyžaduje Grim ako komponent Waylandu na snímanie obrazovky. Ak tento komponent chýba, nainštalujte ho! + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + Ak nie je nastavenie useGrimAdapter povolené, použije sa protokol dbus. Treba poznamenať, že používanie protokolu dbus pod Waylandom sa neodporúča. Odporúča sa povoliť nastavenie useGrimAdapter v súbore flameshot.ini, aby sa aktivoval všeobecný adaptér na snímanie obrazovky Wayland založený na grime + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + komponent programu Grim na tvorbu snímok je postavený na wlroots, nedá sa použiť v prostredí GNOME ani v podobných prostrediach + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + Nepodarilo za zistiť pracovné prostredie (GNOME? KDE? Qile? Sway? ...) + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + Tip: skúste nastaviť XDG_CURRENT_DESKTOP prostredie premenné. + + + + Unable to capture screen + Nepodarilo sa zachytiť obrazovku + + + + SecondaryInstanceWidget + + + Secondary instance + Sekundárna inštancia + + + + <b>Secondary instance.</b> Send message to primary: + <b>Sekundárna inštancia.</b> Poslať správu primárnej: + + + + Type something here... + Sem niečo napíšte… + + + + &Send + O&doslať + + + + Error sending message + Chyba pri odosielaní správy + + + + The message '%1' could not be sent to the primary. + Správu „%1“ nebolo možné odoslať primárnej inštancii. + + + + SelectionTool + + + Rectangular Selection + Obdĺžnikový výber + + + + Set Selection as the paint tool + Nastaviť Výber ako nástroj na kreslenie + + + + SetShortcutDialog + + + Set Shortcut + Nastaviť klávesovú skratku + + + + Enter new shortcut to change + Pre zmenu zadajte novú klávesovú skratku + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Stlačte Esc pre zrušenie alebo ⌘+Backspace pre vypnutie klávesovej skratky. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Ak chcete zrušiť klávesovú skratku stlačte Esc alebo Backspace. + + + + + Flameshot must be restarted for changes to take effect. + Aby sa zmeny prejavili, musí sa Flameshot reštartovať. + + + + ShortcutsWidget + + + Hot Keys + Klávesové skratky + + + + Available shortcuts in the screen capture mode. + Dostupné klávesové skratky v režime zachytávania obrazovky. + + + + Description + Popis + + + + Key + Kláves + + + + Left Double-click + dvojklik ľavým + + + + Toggle side panel + Prepnúť zobrazenie postranného panelu + + + + Grab a color from the screen + Zachytiť farbu z obrazovky + + + + Resize selection left 1px + Zmeniť rozmery výberu o 1 pixel vľavo + + + + Resize selection right 1px + Zmeniť rozmery výberu o 1 pixel vpravo + + + + Resize selection up 1px + Zmeniť rozmery výberu o 1 pixel nahor + + + + Resize selection down 1px + Zmeniť rozmery výberu o 1 pixel nadol + + + + Symmetrically decrease width by 2px + Symetricky znížiť šírku o 2 pixely + + + + Symmetrically increase width by 2px + Symetricky zvýšiť šírku o 2 pixely + + + + Symmetrically increase height by 2px + Symetricky zvýšiť výšku o 2 pixely + + + + Symmetrically decrease height by 2px + Symetricky znížiť výšku o 2 pixely + + + + Select entire screen + Vybrať celú obrazovku + + + + Move selection left 1px + Presunúť výber vľavo o 1 pixel + + + + Move selection right 1px + Presunúť výber vpravo o 1 pixel + + + + Move selection up 1px + Presunúť výber nahor o 1 pixel + + + + Move selection down 1px + Presunúť výber nadol o 1 pixel + + + + Commit text in text area + Potvrdiť pridanie textu + + + + Delete selected drawn object + Odstrániť vybraný nakreslený objekt + + + + Cancel current selection + Zrušiť aktuálny výber + + + Delete current tool + Vymazať momentálny nástroj + + + + Capture screen + Zachytiť obrazovku + + + + Screenshot history + História snímok + + + + SidePanelWidget + + Active thickness: + Aktívna hrúbka: + + + Active color: + Aktívna farba: + + + Press ESC to cancel + Stlačte ESC pre zrušenie + + + + Active tool size: + Aktívna veľkosť nástroja: + + + + Active Color: + Active Color: + + + + Grab Color + Snímať farbu + + + + Display grid + Zobraziť mriežku + + + + SizeDecreaseTool + + + Decrease Tool Size + Zmenšiť veľkosť nástroja + + + + Decrease the size of the other tools + Zmenšiť veľkosť ostatných nástrojov + + + + SizeIncreaseTool + + + Increase Tool Size + Zväčšiť veľkosť nástroja + + + + Increase the size of the other tools + Zväčšiť ostatné nástroje + + + + SizeIndicatorTool + + Selection Size Indicator + Ukazovateľ veľkosti výberu + + + Show X and Y dimensions of the selection + Zobrazenie rozmerov X a Y výberu + + + Show the dimensions of the selection (X Y) + Zobraziť rozmery výberu (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + Storočie (00-99) + + + + Year (00-99) + Rok (00-99) + + + + Year (2000) + Rok (2000) + + + + Month Name (jan) + Meno mesiaca (jan) + + + + Month Name (january) + Meno mesiaca (január) + + + + Month (01-12) + Mesiac (01-12) + + + + Week Day (1-7) + Deň v týždni (1-7) + + + + Week (01-53) + Týždeň (01-53) + + + + Day Name (mon) + Meno dňa (pon) + + + + Day Name (monday) + Meno dňa (pondelok) + + + + Day (01-31) + Deň (01-31) + + + + Day of Month (1-31) + Deň v mesiaci (1-31) + + + + Day (001-366) + Deň (001-366) + + + + Time (%H-%M-%S) + Čas (%H-%M-%S) + + + + Time (%H-%M) + Čas (%H-%M) + + + + Hour (00-23) + Hodina (00-23) + + + + Hour (01-12) + Hodina (01-12) + + + + Minute (00-59) + Minúta (00-59) + + + + Second (00-59) + Sekunda (00-59) + + + + Full Date (%m/%d/%y) + Celý dátum (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + Celý dátum (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + Plný dátum (%d-%m-%Y) + + + + SystemNotification + + + Flameshot Info + Informácie o programe Flameshot + + + + TextConfig + + + StrikeOut + Preškrtnuté + + + + Underline + Podčiarknuté + + + + Bold + Tučné + + + + Italic + Kurzíva + + + + Left Align + Zarovnanie doľava + + + + Center Align + Zarovnanie na stred + + + + Right Align + Zarovnanie doprava + + + + TextTool + + + Text + Text + + + + Add text to your capture + Pridať text do snímky + + + + TrayIcon + + + &Take Screenshot + &Vytvoriť snímku + + + + &Open Launcher + &Otvoriť Spúšťač + + + + &Configuration + &Konfigurácia + + + + &About + O &programe + + + + Check for updates + Kontrola aktualizácií + + + + New version %1 is available + Je dostupná nová verzia: %1 + + + + &Quit + Ukonči&ť + + + + &Latest Uploads + &Posledné nahratia + + + + &Open Save Path + &Otvoriť cestu na ukladanie + + + + UIcolorEditor + + UI Color Editor + Editor farieb používateľského rozhrania + + + + Change the color moving the selectors and see the changes in the preview buttons. + Presunom bežcov nastavte farbu a sledujte tieto zmeny v náhľade. + + + + Select a Button to modify it + Kliknite na tlačidlo pre jeho úpravu + + + + Main Color + Hlavná farba + + + + Click on this button to set the edition mode of the main color. + Pre nastavenie hlavnej farby kliknite na toto tlačidlo. + + + + Contrast Color + Kontrastná farba + + + + Click on this button to set the edition mode of the contrast color. + Pre nastavenie kontrastnej farby kliknite na toto tlačidlo. + + + + UndoTool + + + Undo + Späť + + + + Undo the last modification + Vrátiť poslednú úpravu + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + Je dostupná nová verzia Flameshotu: %1 + + + + Ignore + Ignorovať + + + + Later + Neskôr + + + + Update + Aktualizovať + + + + UploadHistory + + + Upload History + História nahratí + + + + Screenshots history is empty + História snímok je prázdna + + + + UploadLineItem + + + Form + Formulár + + + + TextLabel + TextovýPopis + + + + Copy URL + Kopírovať URL + + + + Open In Browser + Otvoriť v prehliadači + + + + Confirm to delete + Potvrďte odstránenie + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Naozaj chcete odstrániť snímku obrazovky zo zoznamu posledných nahratí a zo servera? + + + + UtilityPanel + + + Close + Zavrieť + + + + <Empty> + <Empty> + + + + VisualsEditor + + + Opacity of area outside selection: + Priehľadnosť oblasti mimo výberu: + + + + UI Color Editor + Editor farieb používateľského rozhrania + + + + Colorpicker Editor + Editor výberu farieb + + + + Button Selection + Výber tlačidiel + + + + Select All + Vybrať všetky + + + + color_widgets::ColorDialog + + + Pick + Vyberte si + + + + color_widgets::ColorPalette + + + Unnamed + Neuvedené + + + + color_widgets::ColorPaletteModel + + + Unnamed + Neuvedené + + + + %1 (%2 colors) + %1 (%2 farby) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + Otvoriť novú paletu zo súboru + + + + + Create a new palette + Vytvorenie novej palety + + + + + Duplicate the current palette + Duplikovať aktuálnu paletu + + + + + Delete the current palette + Odstránenie aktuálnej palety + + + + + Revert changes to the current palette + Vrátenie zmien na aktuálnu paletu + + + + + Save changes to the current palette + Uloženie zmien na aktuálnu paletu + + + + + Add a color to the palette + Pridanie farby do palety + + + + + Remove the selected color from the palette + Odstránenie vybranej farby z palety + + + + + New Palette + Nová paleta + + + + + Name + Name + + + + GIMP Palettes (*.gpl) + Palety GIMP (*.gpl) + + + + Palette Image (%1) + Obrázok palety (%1) + + + + All Files (*) + Všetky súbory (*) + + + + + Open Palette + Otvoriť paletu + + + + Failed to load the palette file +%1 + Nepodarilo sa načítať súbor palety +%1 + + + + color_widgets::GradientEditor + + + Add Color + Add Color + + + + Remove Color + Odstrániť farbu + + + + Edit Color... + Upraviť farbu... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 farby) + + + + color_widgets::Swatch + + + Clear Color + Číra farba + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_sr_SP.ts b/data/translations/Internationalization_sr_SP.ts new file mode 100644 index 0000000..7e4155c --- /dev/null +++ b/data/translations/Internationalization_sr_SP.ts @@ -0,0 +1,3173 @@ + + + + + AbstractWidgetList + + + Add New + Add New + + + + Move Up + Move Up + + + + Move Down + Move Down + + + + Remove + Remove + + + + AcceptTool + + + Accept + Accept + + + + Accept the capture + Accept the capture + + + + AppLauncher + + + App Launcher + Покретач + + + + Choose an app to open the capture + Изаберите програм у ком желите да отворите снимак + + + + AppLauncherWidget + + + Open With + Отвори помоћу + + + + Launch in terminal + Покрени у терминалу + + + + Keep open after selection + Остави отворено након избора + + + + + Error + Грешка + + + + Unable to write in + Нисам успео да сачувам + + + + Unable to launch in terminal. + Нисам успео да покренем у терминалу. + + + + ArrowTool + + + Arrow + Стрелица + + + + Set the Arrow as the paint tool + Избор цртања стрелице + + + + BlurTool + + Blur + Замућење + + + Set Blur as the paint tool + Избор цртања замућене области + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Capture Mode</b> + + + + Rectangular Region + Rectangular Region + + + + Full Screen (Current Display) + Full Screen (Current Display) + + + + Full Screen (All Monitors) + Full Screen (All Monitors) + + + + No Delay + No Delay + + + + second + second + + + + + + seconds + seconds + + + + + Take new screenshot + Take new screenshot + + + + + Area: + Area: + + + + + Capture Launcher + Capture Launcher + + + + + TextLabel + TextLabel + + + + + Capture Mode + Capture Mode + + + + + Delay: + Delay: + + + + + WxH+x+y + WxH+x+y + + + + CaptureWidget + + + Unable to capture screen + Нисам успео да снимим екран + + + + Mouse + Mouse + + + + Select screenshot area + Select screenshot area + + + + Mouse Wheel + Точкић миша + + + + Change tool size + Change tool size + + + + Right Click + Десни клик + + + + Show color picker + Прикажи избор боје + + + + Open side panel + Open side panel + + + + Esc + Esc + + + + Exit + Излаз + + + + Quit Capture + + + + + Are you sure you want to quit capture? + + + + + Do not show this again + + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + Configuration error resolved. Launch `flameshot gui` again to apply it. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Изаберите област мишем или притисните Esc за излаз. +Притисните Enter за снимак целог екрана. +Десним кликом миша бирате боју. +Можете користити точкић миша за избор дебљине алатки. +Притисните размак на тастатури за приказ помоћног панела. + + + + Tool Settings + Tool Settings + + + + CircleCountTool + + + Circle Counter + Circle Counter + + + + Add an autoincrementing counter bubble + Add an autoincrementing counter bubble + + + + CircleTool + + + Circle + Круг + + + + Set the Circle as the paint tool + Избор цртања круга + + + + ColorDialog + + + + Select Color + Select Color + + + + + Saturation + Saturation + + + + + Hue + Hue + + + + + Hex + Hex + + + + + Blue + Blue + + + + + Value + Value + + + + + Green + Green + + + + + Alpha + Alpha + + + + + Red + Red + + + + ColorGrabWidget + + + Accept color + Accept color + + + + Enter or Left Click + Enter or Left Click + + + + Precisely select color + Precisely select color + + + + Hold Left Click + Hold Left Click + + + + Toggle magnifier + Toggle magnifier + + + + Space or Right Click + Space or Right Click + + + + Cancel + Cancel + + + + Esc + Esc + + + + ColorPickerEditor + + + Edit Preset: + Edit Preset: + + + + Enter color to update preset + Enter color to update preset + + + + Update + Update + + + + Press button to update the selected preset + Press button to update the selected preset + + + + Delete + Delete + + + + Press button to delete the selected preset + Press button to delete the selected preset + + + + Add Preset: + Add Preset: + + + + Enter color manually or select it using the color-wheel + Enter color manually or select it using the color-wheel + + + + Add + Add + + + + Press button to add preset + Press button to add preset + + + + + Error + Грешка + + + + Unable to add preset. Maximum limit reached. + Unable to add preset. Maximum limit reached. + + + + Unable to remove preset. Minimum limit reached. + Unable to remove preset. Minimum limit reached. + + + + ConfigErrorDetails + + + Configuration errors + Configuration errors + + + + ConfigHandler + + + Unrecognized setting: '%1' + + Unrecognized setting: '%1' + + + + + Unrecognized shortcut name: '%1'. + + Unrecognized shortcut name: '%1'. + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + + + + Bad value in '%1'. Expected: %2 + + Bad value in '%1'. Expected: %2 + + + + + You have successfully resolved the configuration error. + You have successfully resolved the configuration error. + + + + The configuration contains an error. Open configuration to resolve. + The configuration contains an error. Open configuration to resolve. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + Bad config key '%1' in ConfigHandler. Please report this as a bug. + + + + ConfigResolver + + + Resolve configuration errors + Resolve configuration errors + + + + <b>You must resolve all errors before continuing:</b> + <b>You must resolve all errors before continuing:</b> + + + + Reset + Reset + + + + Reset to the default value. + Reset to the default value. + + + + Remove + Remove + + + + Remove this setting. + Remove this setting. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + + + + Resolve all + Resolve all + + + + Resolve all listed errors. + Resolve all listed errors. + + + + Details + Details + + + + ConfigWindow + + + Configuration + Подешавања + + + + Interface + Изглед + + + + Filename Editor + Избор имена датотеке + + + + General + Опште + + + + Shortcuts + Shortcuts + + + + Resolve + Resolve + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>Configuration file has errors. Resolve them before continuing.</b> + + + + Controller + + New version %1 is available + New version %1 is available + + + You have the latest version + You have the latest version + + + Failed to get information about the latest version. + Failed to get information about the latest version. + + + Error + Грешка + + + Unable to close active modal widgets + Unable to close active modal widgets + + + &Take Screenshot + &Направи снимак екрана + + + &Open Launcher + &Open Launcher + + + &Configuration + &Подешавања + + + &About + &About + + + Check for updates + Check for updates + + + &Latest Uploads + &Latest Uploads + + + URL copied to clipboard. + Интернет адреса је сачувана у привременој меморији. + + + &Information + Ин&формације + + + &Quit + &Излаз + + + + CopyTool + + + Copy + Запамти + + + + Copy selection to clipboard + Copy selection to clipboard + + + Copy the selection into the clipboard + Копира избор у привремену оставу + + + + DBusUtils + + Unable to connect via DBus + Нисам успео да се повежем кроз DBus + + + + ExitTool + + + Exit + Излаз + + + + Leave the capture screen + Напусти екран за снимање + + + + FileNameEditor + + + Edit the name of your captures: + Уређивање имена снимака: + + + + Edit: + Уређивање: + + + + Preview: + Преглед: + + + + Save + Сачувај + + + + Saves the pattern + Сачувај шаблон + + + + Restore + Restore + + + Reset + Ресетуј + + + + Restores the saved pattern + Поврати сачувани шаблон + + + + Clear + Очисти + + + + Deletes the name + Брише име + + + + Flameshot + + + Error + Грешка + + + + Unable to close active modal widgets + Unable to close active modal widgets + + + + URL copied to clipboard. + Интернет адреса је сачувана у привременој меморији. + + + + FlameshotDaemon + + + New version %1 is available + New version %1 is available + + + + You have the latest version + You have the latest version + + + + Failed to get information about the latest version. + Failed to get information about the latest version. + + + + Unable to connect via DBus + Нисам успео да се повежем кроз DBus + + + + GeneneralConf + + Import + Увоз + + + Error + Грешка + + + Unable to read file. + Нисам успео да прочитам датотеку. + + + Unable to write file. + Нисам успео да сачувам датотеку. + + + Save File + Сачувај датотеку + + + Confirm Reset + Потврда поништавања + + + Are you sure you want to reset the configuration? + Да ли сте сигурни да желите да поништите сва прилагођена подешавања? + + + Show help message + Приказуј поруку са упутством + + + Show the help message at the beginning in the capture mode. + Приказуј поруку са кратким упутством на почетку снимања екрана. + + + Show desktop notifications + Користи системска обавештења + + + Show tray icon + Иконица на системској полици + + + Show the systemtray icon + Приказуј иконицу на системској полици + + + Configuration File + Датотека са подешавањима + + + Export + Извоз + + + Reset + Поништи + + + Launch at startup + Покрени на почетку + + + Launch Flameshot + Покрени Flameshot + + + + GeneralConf + + + + Import + Увоз + + + + + + + Error + Грешка + + + + Unable to read file. + Нисам успео да прочитам датотеку. + + + + + Unable to write file. + Нисам успео да сачувам датотеку. + + + + Save File + Сачувај датотеку + + + + Confirm Reset + Потврда поништавања + + + + Are you sure you want to reset the configuration? + Да ли сте сигурни да желите да поништите сва прилагођена подешавања? + + + + Show help message + Приказуј поруку са упутством + + + Show the help message at the beginning in the capture mode. + Приказуј поруку са кратким упутством на почетку снимања екрана. + + + + Show the side panel button + Show the side panel button + + + Show the side panel toggle button in the capture mode. + Show the side panel toggle button in the capture mode. + + + + Show desktop notifications + Користи системска обавештења + + + + Show tray icon + Иконица на системској полици + + + Show the systemtray icon + Приказуј иконицу на системској полици + + + + Confirmation required to delete screenshot from the latest uploads + Confirmation required to delete screenshot from the latest uploads + + + + Configuration File + Датотека са подешавањима + + + + Export + Извоз + + + + Reset + Reset + + + + Automatic check for updates + Automatic check for updates + + + + Allow multiple flameshot GUI instances simultaneously + Allow multiple flameshot GUI instances simultaneously + + + Automatically close daemon when it is not needed + Automatically close daemon when it is not needed + + + Launch at startup + Покрени на почетку + + + Launch Flameshot + Покрени Flameshot + + + + Show welcome message on launch + Show welcome message on launch + + + + Use large predefined color palette + Use large predefined color palette + + + + Copy URL after upload + Copy URL after upload + + + Copy URL and close window after upload + Copy URL and close window after upload + + + + Save image after copy + Save image after copy + + + Save image file after copying it + Save image file after copying it + + + + Show the help message at the beginning in the capture mode + Show the help message at the beginning in the capture mode + + + + Use last region for GUI mode + Use last region for GUI mode + + + + Use the last region as the default selection for the next screenshot in GUI mode + Use the last region as the default selection for the next screenshot in GUI mode + + + + Show the side panel toggle button in the capture mode + Show the side panel toggle button in the capture mode + + + + Enable desktop notifications + Enable desktop notifications + + + + Show abort notifications + + + + + Enable abort notifications + + + + + Show icon in the system tray + Show icon in the system tray + + + + Use grim to capture screenshots + + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + + + + + Ask for confirmation to delete screenshot from the latest uploads + Ask for confirmation to delete screenshot from the latest uploads + + + + Check for updates automatically + Check for updates automatically + + + + This allows you to take screenshots of Flameshot itself for example + This allows you to take screenshots of Flameshot itself for example + + + Launch Flameshot daemon when computer is booted + Launch Flameshot daemon when computer is booted + + + + Show the welcome message box in the middle of the screen while taking a screenshot + Show the welcome message box in the middle of the screen while taking a screenshot + + + + Use a large predefined color palette + Use a large predefined color palette + + + + Copy on double click + Copy on double click + + + Enable Copy on Double Click + Enable Copy on Double Click + + + Copy URL and close window after uploading was successful + Copy URL and close window after uploading was successful + + + + Automatically unload from memory when it is not needed + + + + + Automatically close daemon (background process) when it is not needed + + + + + Launch in background at startup + + + + + Launch Flameshot daemon (background process) when computer is booted + + + + + Ask before quit capture + + + + + Show the confirmation prompt before ESC quit + + + + + Enable Copy to clipboard on Double Click + + + + + Copy URL after uploading was successful + + + + + After copying the screenshot, save it to a file as well + After copying the screenshot, save it to a file as well + + + + Save Path + Save Path + + + + Change... + Change... + + + + Use fixed path for screenshots to save + Use fixed path for screenshots to save + + + + Preferred save file extension: + Preferred save file extension: + + + + Latest Uploads Max Size + Latest Uploads Max Size + + + + Imgur Application Client ID + Imgur Application Client ID + + + + Undo limit + Undo limit + + + + Use JPG format for clipboard (PNG default) + Use JPG format for clipboard (PNG default) + + + + Use lossy JPG format for clipboard (lossless PNG default) + + + + + Copy file path after save + Copy file path after save + + + + Copy the file path to clipboard after the file is saved + Copy the file path to clipboard after the file is saved + + + + Anti-aliasing image when zoom the pinned image + Anti-aliasing image when zoom the pinned image + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + After zooming the pinned image, should the image get smoothened or stay pixelated + + + + + Upload image without confirmation + Upload image without confirmation + + + + Choose a Folder + Choose a Folder + + + + Unable to write to directory. + Unable to write to directory. + + + + Show magnifier + Show magnifier + + + + Enable a magnifier while selecting the screenshot area + Enable a magnifier while selecting the screenshot area + + + + Square shaped magnifier + Square shaped magnifier + + + + Make the magnifier to be square-shaped + Make the magnifier to be square-shaped + + + + Milliseconds before geometry display hides; 0 means do not hide + + + + + Set geometry display timeout (ms) + + + + + Selection Geometry Display + + + + + Display Location + + + + + None + + + + + Top Left + + + + + Top Right + + + + + Bottom Left + + + + + Bottom Right + + + + + Center + + + + + Quality range of 0-100; Higher number is better quality and larger file size + + + + + JPEG Quality + + + + + Reverse arrow + + + + + Draw the arrow head first + + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + Latest Uploads + + + Screenshots history is empty + Screenshots history is empty + + + Copy URL + Запамти интернет адресу + + + URL copied to clipboard. + Интернет адреса је сачувана у привременој меморији. + + + Open in browser + Open in browser + + + Confirm to delete + Confirm to delete + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Are you sure you want to delete a screenshot from the latest uploads and server? + + + + ImgS3Uploader + + Uploading Image + Објављујем слику + + + URL copied to clipboard. + Интернет адреса је сачувана у привременој меморији. + + + Error + Грешка + + + + ImgUploadDialog + + + Upload Confirmation + Upload Confirmation + + + + Do you want to upload this capture? + Do you want to upload this capture? + + + + + Upload without confirmation + Upload without confirmation + + + + ImgUploader + + Uploading Image + Објављујем слику + + + Unable to open the URL. + Нисам успео да посетим интернет адресу. + + + URL copied to clipboard. + Интернет адреса је сачувана у привременој меморији. + + + Screenshot copied to clipboard. + Слика је сачувана у привременој меморији. + + + Copy URL + Запамти интернет адресу + + + Open URL + Посети интернет адресу + + + Delete image + Избриши слику + + + Image to Clipboard. + Сачувај у привремену меморију. + + + + ImgUploaderBase + + + Upload image + Upload image + + + + Uploading Image + Објављујем слику + + + + Copy URL + Запамти интернет адресу + + + + Open URL + Посети интернет адресу + + + + Delete image + Избриши слику + + + + Image to Clipboard. + Сачувај у привремену меморију. + + + + Save image + Save image + + + + Unable to open the URL. + Нисам успео да посетим интернет адресу. + + + + URL copied to clipboard. + Интернет адреса је сачувана у привременој меморији. + + + + Screenshot copied to clipboard. + Слика је сачувана у привременој меморији. + + + + Unable to save the screenshot to disk. + Unable to save the screenshot to disk. + + + + Screenshot saved. + Screenshot saved. + + + + ImgUploaderTool + + + Image Uploader + Објављивање слике + + + + Upload the selection + Upload the selection + + + + ImgurUploader + + Upload to Imgur + Објави на Imgur + + + Uploading Image + Објављујем слику + + + Copy URL + Запамти интернет адресу + + + Open URL + Посети интернет адресу + + + Delete image + Избриши слику + + + Image to Clipboard. + Сачувај у привремену меморију. + + + + Unable to open the URL. + Нисам успео да посетим интернет адресу. + + + URL copied to clipboard. + Интернет адреса је сачувана у привременој меморији. + + + Screenshot copied to clipboard. + Слика је сачувана у привременој меморији. + + + + ImgurUploaderTool + + Image Uploader + Објављивање слике + + + Upload the selection to Imgur + Објави избор на Imgur сајту + + + + InfoWindow + + + + About + О програму + + + + + Icon + Icon + + + + + License + License + + + + + GPLv3+ + GPLv3+ + + + + + Version + Version + + + + + Flameshot v + Flameshot v + + + + + OS Info + OS Info + + + + + Copy Info + Copy Info + + + Right Click + Десни клик + + + Mouse Wheel + Точкић миша + + + Move selection 1px + Помери избор за 1px + + + Resize selection 1px + Увећај избор за 1px + + + Quit capture + Излаз из снимача екрана + + + Copy to clipboard + Запамти у привременој меморији + + + Save selection as a file + Сачувај избор у датотеку + + + Undo the last modification + Поништи последње измене + + + Show color picker + Прикажи избор боје + + + Change the tool's thickness + Измени дебљину линије алата + + + Available shortcuts in the screen capture mode. + Доступне пречице у моду снимка екрана. + + + Key + Тастер + + + Description + Опис + + + <u><b>License</b></u> + <u><b>Лиценца</b></u> + + + <u><b>Version</b></u> + <u><b>Верзија</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Пречице</b></u> + + + + InvertTool + + + Invert + Invert + + + + Set Inverter as the paint tool + Set Inverter as the paint tool + + + + LineTool + + + Line + Линија + + + + Set the Line as the paint tool + Избор цртања линије + + + + MarkerTool + + + Marker + Маркер + + + + Set the Marker as the paint tool + Избор цртања маркером + + + + MoveTool + + + Move + Премештање + + + + Move the selection area + Премешта изабрану област + + + + PencilTool + + + Pencil + Оловка + + + + Set the Pencil as the paint tool + Избор цртања оловком + + + + PinTool + + + Pin Tool + Закачка + + + + Pin image on the desktop + Закачи слику за радну површину + + + + PinWidget + + + Context menu + Context menu + + + + Copy to clipboard + Запамти у привременој меморији + + + + Save to file + Save to file + + + + Rotate Right + + + + + Rotate Left + + + + + Increase Opacity + + + + + Decrease Opacity + + + + + Close + Close + + + + PixelateTool + + + Pixelate + Pixelate + + + + Set Pixelate as the paint tool. + + + + Set Pixelate as the paint tool + Set Pixelate as the paint tool + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QHotkey + + Failed to register %1. Error: %2 + Failed to register %1. Error: %2 + + + Failed to unregister %1. Error: %2 + Failed to unregister %1. Error: %2 + + + + QObject + + + Save Error + Грешка приликом упусивања + + + + + Capture saved as + Сачувај снимак као + + + + + Capture saved to clipboard. + Capture saved to clipboard. + + + Capture saved to clipboard + Снимак је сачуван у привремену меморију + + + + Error while saving to clipboard + Error while saving to clipboard + + + + + Error trying to save as + Грешка приликом уписивања као + + + + Save screenshot + Save screenshot + + + + Path copied to clipboard as + Path copied to clipboard as + + + Saving canceled + Saving canceled + + + Save canceled + Save canceled + + + Capture is saved and copied to the clipboard as + Capture is saved and copied to the clipboard as + + + + Unable to connect via DBus + Нисам успео да се повежем кроз DBus + + + + Powerful yet simple to use screenshot software. + Powerful yet simple to use screenshot software. + + + + See + See + + + Capture the entire desktop. + Capture the entire desktop. + + + + Open the capture launcher. + Open the capture launcher. + + + + Start a manual capture in GUI mode. + Start a manual capture in GUI mode. + + + + Configure + Configure + + + Capture a single screen. + Capture a single screen. + + + Path where the capture will be saved + Path where the capture will be saved + + + + Capture screenshot of all monitors at the same time. + + + + + Capture a screenshot of the specified monitor. + + + + + Existing directory or new file to save to + Existing directory or new file to save to + + + + Save the capture to the clipboard + Save the capture to the clipboard + + + + Pin the capture to the screen + Pin the capture to the screen + + + + Upload screenshot + Upload screenshot + + + + Delay time in milliseconds + Delay time in milliseconds + + + + Repeat screenshot with previously selected region + Repeat screenshot with previously selected region + + + + Screenshot region to select + Screenshot region to select + + + + Set the filename pattern + Set the filename pattern + + + + Accept capture as soon as a selection is made + Accept capture as soon as a selection is made + + + + Enable or disable the trayicon + Enable or disable the trayicon + + + + Enable or disable run at startup + Enable or disable run at startup + + + + Enable or disable the notifications + + + + + Check the configuration for errors + Check the configuration for errors + + + + Show the help message in the capture mode + Show the help message in the capture mode + + + + Define the main UI color + Define the main UI color + + + + Define the contrast UI color + Define the contrast UI color + + + + Print raw PNG capture + Print raw PNG capture + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + + + + Define the screen to capture (starting from 0) + Define the screen to capture (starting from 0) + + + + Invalid delay, it must be a number greater than 0 + Invalid delay, it must be a number greater than 0 + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + + + + Invalid path, must be an existing directory or a new file in an existing directory + Invalid path, must be an existing directory or a new file in an existing directory + + + Define the screen to capture + Define the screen to capture + + + + default: screen containing the cursor + default: screen containing the cursor + + + + Screen number + Screen number + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + + + Invalid delay, it must be higher than 0 + Invalid delay, it must be higher than 0 + + + + Invalid screen number, it must be non negative + Invalid screen number, it must be non negative + + + Invalid path, it must be a real path in the system + Invalid path, it must be a real path in the system + + + + Invalid value, it must be defined as 'true' or 'false' + Invalid value, it must be defined as 'true' or 'false' + + + + Error + Грешка + + + + Unable to write in + Нисам успео са сачувам + + + + Requested screen exceeds screen count + Requested screen exceeds screen count + + + + Full screen screenshot pinned to screen + Full screen screenshot pinned to screen + + + URL copied to clipboard. + Интернет адреса је сачувана у привременој меморији. + + + + Options + Options + + + Arguments + Arguments + + + arguments + arguments + + + + Subcommands + + + + + subcommands + + + + + Usage + Usage + + + + options + options + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Per default runs Flameshot in the background and adds a tray icon for configuration. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + + + Toggle side panel + Toggle side panel + + + Resize selection left 1px + Resize selection left 1px + + + Resize selection right 1px + Resize selection right 1px + + + Resize selection up 1px + Resize selection up 1px + + + Resize selection down 1px + Resize selection down 1px + + + Select entire screen + Select entire screen + + + Move selection left 1px + Move selection left 1px + + + Move selection right 1px + Move selection right 1px + + + Move selection up 1px + Move selection up 1px + + + Move selection down 1px + Move selection down 1px + + + Commit text in text area + Commit text in text area + + + Delete current tool + Delete current tool + + + + Quit capture + Излаз из снимача екрана + + + + Screenshot history + Screenshot history + + + + Capture screen + Capture screen + + + + Show color picker + Прикажи избор боје + + + + Change the tool's size + Change the tool's size + + + Change the tool's thickness + Измени дебљину линије алата + + + + RectangleTool + + + Rectangle + Правоугаоник + + + + Set the Rectangle as the paint tool + Избор цртања обојеног правоугаоника + + + + RedoTool + + + Redo + Понови + + + + Redo the next modification + Понови поништену измену + + + + SaveTool + + + Save + Сачувај + Сохранить + + + + Save screenshot to a file + Save screenshot to a file + + + Save the capture + Сачувај снимак + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + + + + Unable to capture screen + Нисам успео да снимим екран + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + Правоугаони оквир + + + + Set Selection as the paint tool + Избор цртања правоугаоног оквира + + + + SetShortcutDialog + + + Set Shortcut + Set Shortcut + + + + Enter new shortcut to change + Enter new shortcut to change + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Press Esc to cancel or Backspace to disable the keyboard shortcut. + + + + + Flameshot must be restarted for changes to take effect. + Flameshot must be restarted for changes to take effect. + + + + ShortcutsWidget + + + Hot Keys + Hot Keys + + + + Available shortcuts in the screen capture mode. + Доступне пречице у моду снимка екрана. + + + + Description + Опис + + + + Key + Тастер + + + + Left Double-click + Left Double-click + + + + Toggle side panel + Toggle side panel + + + + Grab a color from the screen + + + + + Resize selection left 1px + Resize selection left 1px + + + + Resize selection right 1px + Resize selection right 1px + + + + Resize selection up 1px + Resize selection up 1px + + + + Resize selection down 1px + Resize selection down 1px + + + + Symmetrically decrease width by 2px + + + + + Symmetrically increase width by 2px + + + + + Symmetrically increase height by 2px + + + + + Symmetrically decrease height by 2px + + + + + Select entire screen + Select entire screen + + + + Move selection left 1px + Move selection left 1px + + + + Move selection right 1px + Move selection right 1px + + + + Move selection up 1px + Move selection up 1px + + + + Move selection down 1px + Move selection down 1px + + + + Commit text in text area + Commit text in text area + + + + Delete selected drawn object + + + + + Cancel current selection + + + + Delete current tool + Delete current tool + + + + Capture screen + Capture screen + + + + Screenshot history + Screenshot history + + + + SidePanelWidget + + Active thickness: + Active thickness: + + + Active color: + Активна боја: + + + Press ESC to cancel + Притисните ESC за прекид + + + + Active tool size: + Active tool size: + + + + Active Color: + Active Color: + + + + Grab Color + Преузмите боју + + + + Display grid + + + + + SizeDecreaseTool + + + Decrease Tool Size + Decrease Tool Size + + + + Decrease the size of the other tools + Decrease the size of the other tools + + + + SizeIncreaseTool + + + Increase Tool Size + Increase Tool Size + + + + Increase the size of the other tools + Increase the size of the other tools + + + + SizeIndicatorTool + + Selection Size Indicator + Приказ величине избора + + + Show X and Y dimensions of the selection + Show X and Y dimensions of the selection + + + Show the dimensions of the selection (X Y) + Приказује величину избора (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + Век (00-99) + + + + Year (00-99) + Година (00-99) + + + + Year (2000) + Година (2000) + + + + Month Name (jan) + Име месеца (јан) + + + + Month Name (january) + Име месеца (јануар) + + + + Month (01-12) + Месец (01-12) + + + + Week Day (1-7) + Дани у недељи (1-7) + + + + Week (01-53) + Недеља (01-53) + + + + Day Name (mon) + Дан у недељи (пон) + + + + Day Name (monday) + Дан у недељи (понедељак) + + + + Day (01-31) + Дан (01-31) + + + + Day of Month (1-31) + Дан месеца (1-31) + + + + Day (001-366) + Дан (001-366) + + + + Time (%H-%M-%S) + Време (%H-%M-%S) + + + + Time (%H-%M) + Време (%H-%M) + + + + Hour (00-23) + Сат (00-23) + + + + Hour (01-12) + Сат (01-12) + + + + Minute (00-59) + Минута (00-59) + + + + Second (00-59) + Секунда (00-59) + + + + Full Date (%m/%d/%y) + Комплетан датум (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + Комплетан датум (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + + + + + SystemNotification + + + Flameshot Info + Информације о Flameshot-у + + + + TextConfig + + + StrikeOut + Прецртано + + + + Underline + Подвучено + + + + Bold + Задебљано + + + + Italic + Накошено + + + + Left Align + Left Align + + + + Center Align + Center Align + + + + Right Align + Right Align + + + + TextTool + + + Text + Текст + + + + Add text to your capture + Додаје текст на снимак + + + + TrayIcon + + + &Take Screenshot + &Направи снимак екрана + + + + &Open Launcher + &Open Launcher + + + + &Configuration + &Подешавања + + + + &About + &About + + + + Check for updates + Check for updates + + + + New version %1 is available + New version %1 is available + + + + &Quit + &Излаз + + + + &Latest Uploads + &Latest Uploads + + + + &Open Save Path + + + + + UIcolorEditor + + UI Color Editor + Уређивање боје сучеља + + + + Change the color moving the selectors and see the changes in the preview buttons. + Измените боју померањем изборника и видите резултат у прегледу дугмића. + + + + Select a Button to modify it + Изаберите дугме да би га изменили + + + + Main Color + Основна боја + + + + Click on this button to set the edition mode of the main color. + Кликните на дугме да би прешли у режим уређивања основне боје. + + + + Contrast Color + Боја контраста + + + + Click on this button to set the edition mode of the contrast color. + Кликните на дугме да би прешли у режим уређивања боје контраста. + + + + UndoTool + + + Undo + Поништи + + + + Undo the last modification + Поништи последњу измену + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + New Flameshot version %1 is available + + + + Ignore + Ignore + + + + Later + Later + + + + Update + Update + + + + UploadHistory + + + Upload History + Upload History + + + + Screenshots history is empty + Screenshots history is empty + + + + UploadLineItem + + + Form + Form + + + + TextLabel + TextLabel + + + + Copy URL + Запамти интернет адресу + + + + Open In Browser + Open In Browser + + + + Confirm to delete + Confirm to delete + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Are you sure you want to delete a screenshot from the latest uploads and server? + + + + UtilityPanel + + + Close + Close + + + + <Empty> + <Empty> + + + + VisualsEditor + + + Opacity of area outside selection: + Провидност подручја ван избора: + + + + UI Color Editor + Уређивање боје сучеља + + + + Colorpicker Editor + Colorpicker Editor + + + + Button Selection + Избор дугмића + + + + Select All + Изабери све + + + + color_widgets::ColorDialog + + + Pick + Pick + + + + color_widgets::ColorPalette + + + Unnamed + Unnamed + + + + color_widgets::ColorPaletteModel + + + Unnamed + Unnamed + + + + %1 (%2 colors) + %1 (%2 colors) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + Open a new palette from file + + + + + Create a new palette + Create a new palette + + + + + Duplicate the current palette + Duplicate the current palette + + + + + Delete the current palette + Delete the current palette + + + + + Revert changes to the current palette + Revert changes to the current palette + + + + + Save changes to the current palette + Save changes to the current palette + + + + + Add a color to the palette + Add a color to the palette + + + + + Remove the selected color from the palette + Remove the selected color from the palette + + + + + New Palette + New Palette + + + + + Name + Name + + + + GIMP Palettes (*.gpl) + GIMP Palettes (*.gpl) + + + + Palette Image (%1) + Palette Image (%1) + + + + All Files (*) + All Files (*) + + + + + Open Palette + Open Palette + + + + Failed to load the palette file +%1 + Failed to load the palette file +%1 + + + + color_widgets::GradientEditor + + + Add Color + Add Color + + + + Remove Color + Remove Color + + + + Edit Color... + Edit Color... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 colors) + + + + color_widgets::Swatch + + + Clear Color + Clear Color + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_sv_SE.ts b/data/translations/Internationalization_sv_SE.ts new file mode 100644 index 0000000..42351e6 --- /dev/null +++ b/data/translations/Internationalization_sv_SE.ts @@ -0,0 +1,3172 @@ + + + + + AbstractWidgetList + + + Add New + Add New + + + + Move Up + Move Up + + + + Move Down + Move Down + + + + Remove + Remove + + + + AcceptTool + + + Accept + Accept + + + + Accept the capture + Accept the capture + + + + AppLauncher + + + App Launcher + Programstartare + + + + Choose an app to open the capture + Välj ett program för att öppna skärmklippet + + + + AppLauncherWidget + + + Open With + Öppna med + + + + Launch in terminal + Öppna i terminal + + + + Keep open after selection + Håll öppen efter urval + + + + + Error + Fel + + + + Unable to write in + Kan inte skriva i + + + + Unable to launch in terminal. + Kunde inte öppna i terminal. + + + + ArrowTool + + + Arrow + Pil + + + + Set the Arrow as the paint tool + Välj pil som ritverktyg + + + + BlurTool + + Blur + Oskärpa + + + Set Blur as the paint tool + Välj Oskärpa som ritverktyg + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Capture Mode</b> + + + + Rectangular Region + Rectangular Region + + + + Full Screen (Current Display) + Full Screen (Current Display) + + + + Full Screen (All Monitors) + Full Screen (All Monitors) + + + + No Delay + No Delay + + + + second + second + + + + + + seconds + seconds + + + + + Take new screenshot + Take new screenshot + + + + + Area: + Area: + + + + + Capture Launcher + Capture Launcher + + + + + TextLabel + TextLabel + + + + + Capture Mode + Capture Mode + + + + + Delay: + Delay: + + + + + WxH+x+y + WxH+x+y + + + + CaptureWidget + + + Unable to capture screen + Kunde inte avbilda skärmen + + + + Mouse + Mouse + + + + Select screenshot area + Select screenshot area + + + + Mouse Wheel + Mushjul + + + + Change tool size + Change tool size + + + + Right Click + Högerklick + + + + Show color picker + Show color picker + + + + Open side panel + Open side panel + + + + Esc + Esc + + + + Exit + Avsluta + + + + Quit Capture + Avsluta inspelning + + + + Are you sure you want to quit capture? + Vill du verkligen sluta spela in? + + + + Do not show this again + Visa inte detta igen + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + Configuration error resolved. Launch `flameshot gui` again to apply it. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Välj ett område med muspekaren eller tryck ESC för att avbryta. +Tryck Enter för att fånga skärmklipp. +Högerklicka för att visa färgväljaren. +Använd Scrollhjulet för att ändra tjockleken på ditt verktyg. +Tryck Space för att öppna sidopanelen. + + + + Tool Settings + Tool Settings + + + + CircleCountTool + + + Circle Counter + Circle Counter + + + + Add an autoincrementing counter bubble + Add an autoincrementing counter bubble + + + + CircleTool + + + Circle + Cirkel + + + + Set the Circle as the paint tool + Välj cirkel som ritverktyg + + + + ColorDialog + + + + Select Color + Select Color + + + + + Saturation + Saturation + + + + + Hue + Hue + + + + + Hex + Hex + + + + + Blue + Blue + + + + + Value + Value + + + + + Green + Green + + + + + Alpha + Alpha + + + + + Red + Red + + + + ColorGrabWidget + + + Accept color + Accept color + + + + Enter or Left Click + Enter or Left Click + + + + Precisely select color + Precisely select color + + + + Hold Left Click + Hold Left Click + + + + Toggle magnifier + Toggle magnifier + + + + Space or Right Click + Space or Right Click + + + + Cancel + Cancel + + + + Esc + Esc + + + + ColorPickerEditor + + + Edit Preset: + Edit Preset: + + + + Enter color to update preset + Enter color to update preset + + + + Update + Uppdatera + + + + Press button to update the selected preset + Press button to update the selected preset + + + + Delete + Delete + + + + Press button to delete the selected preset + Press button to delete the selected preset + + + + Add Preset: + Add Preset: + + + + Enter color manually or select it using the color-wheel + Enter color manually or select it using the color-wheel + + + + Add + Add + + + + Press button to add preset + Press button to add preset + + + + + Error + Fel + + + + Unable to add preset. Maximum limit reached. + Unable to add preset. Maximum limit reached. + + + + Unable to remove preset. Minimum limit reached. + Unable to remove preset. Minimum limit reached. + + + + ConfigErrorDetails + + + Configuration errors + Configuration errors + + + + ConfigHandler + + + Unrecognized setting: '%1' + + Unrecognized setting: '%1' + + + + + Unrecognized shortcut name: '%1'. + + Unrecognized shortcut name: '%1'. + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + + + + Bad value in '%1'. Expected: %2 + + Bad value in '%1'. Expected: %2 + + + + + You have successfully resolved the configuration error. + You have successfully resolved the configuration error. + + + + The configuration contains an error. Open configuration to resolve. + The configuration contains an error. Open configuration to resolve. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + Bad config key '%1' in ConfigHandler. Please report this as a bug. + + + + ConfigResolver + + + Resolve configuration errors + Resolve configuration errors + + + + <b>You must resolve all errors before continuing:</b> + <b>You must resolve all errors before continuing:</b> + + + + Reset + Återställ + + + + Reset to the default value. + Reset to the default value. + + + + Remove + Remove + + + + Remove this setting. + Remove this setting. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + + + + Resolve all + Resolve all + + + + Resolve all listed errors. + Resolve all listed errors. + + + + Details + Details + + + + ConfigWindow + + + Configuration + Konfiguration + + + + Interface + Gränssnitt + + + + Filename Editor + Redigera filnamn + + + + General + Allmänt + + + + Shortcuts + Shortcuts + + + + Resolve + Resolve + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>Configuration file has errors. Resolve them before continuing.</b> + + + + Controller + + New version %1 is available + New version %1 is available + + + You have the latest version + You have the latest version + + + Failed to get information about the latest version. + Failed to get information about the latest version. + + + Error + Fel + + + Unable to close active modal widgets + Unable to close active modal widgets + + + &Take Screenshot + &Ta skärmdump + + + &Open Launcher + &Open Launcher + + + &Configuration + &Konfiguration + + + &About + &About + + + Check for updates + Check for updates + + + &Latest Uploads + &Latest Uploads + + + &Information + &Information + + + &Quit + &Avsluta + + + + CopyTool + + + Copy + Kopiera + + + + Copy selection to clipboard + Copy selection to clipboard + + + Copy the selection into the clipboard + Kopiera urval till klippbordet + + + + DBusUtils + + Unable to connect via DBus + Kunde inte ansluta via DBus + + + + ExitTool + + + Exit + Stäng + + + + Leave the capture screen + Lämna skärmklippsvy + + + + FileNameEditor + + + Edit the name of your captures: + Redigera namnet på dina skärmklipp: + + + + Edit: + Redigera: + + + + Preview: + Förhandsgranska: + + + + Save + Spara + + + + Saves the pattern + Sparar mönstret + + + + Restore + Restore + + + Reset + Återställ + + + + Restores the saved pattern + Återställer det sparade mönstret + + + + Clear + Rensa + + + + Deletes the name + Raderar namnet + + + + Flameshot + + + Error + Fel + + + + Unable to close active modal widgets + Kan stänga aktiva modalwidgetar + + + + URL copied to clipboard. + URL copied to clipboard. + + + + FlameshotDaemon + + + New version %1 is available + Ny version %1 är tillgänglig + + + + You have the latest version + Du har den senaste versionen + + + + Failed to get information about the latest version. + Kunde inte hämta information om den senaste versionen. + + + + Unable to connect via DBus + Kunde inte ansluta via DBus + + + + GeneneralConf + + Import + Importera + + + Error + Fel + + + Unable to read file. + Kunde inte läsa filen. + + + Unable to write file. + Kunde inte skriva till filen. + + + Save File + Spara fil + + + Confirm Reset + Bekräfta återställning + + + Are you sure you want to reset the configuration? + Är du säker på att du vill återställa konfigurationen? + + + Show help message + Visa hjälpmeddelande + + + Show the help message at the beginning in the capture mode. + Visa hjälpmeddelande vid början av skärmklippsläge. + + + Show desktop notifications + Visa skrivbordsnotifieringar + + + Show tray icon + Visa ikon i systemfältet + + + Show the systemtray icon + Visa ikon i systemfältet + + + Configuration File + Konfigurationsfil + + + Export + Exportera + + + Reset + Återställ + + + Launch at startup + Starta vid uppstart + + + Launch Flameshot + Starta Flameshot + + + + GeneralConf + + + + Import + Importera + + + + + + + Error + Fel + + + + Unable to read file. + Kunde inte läsa filen. + + + + + Unable to write file. + Kunde inte skriva till fil. + + + + Save File + Spara fil + + + + Confirm Reset + Bekräfta återställning + + + + Are you sure you want to reset the configuration? + Är du säker på att du vill återställa konfigurationen? + + + + Show help message + Visa hjälpmeddelande + + + Show the help message at the beginning in the capture mode. + Visa hjälpmeddelandet i början i fildelningsläget. + + + + Show the side panel button + Show the side panel button + + + Show the side panel toggle button in the capture mode. + Show the side panel toggle button in the capture mode. + + + + Show desktop notifications + Visa skrivbordsnotifieringar + + + + Show tray icon + Visa ikon i systemfältet + + + Show the systemtray icon + Visa ikon i systemfältet + + + + Confirmation required to delete screenshot from the latest uploads + Confirmation required to delete screenshot from the latest uploads + + + + Configuration File + Konfigurationsfil + + + + Export + Exportera + + + + Reset + Återställ + + + + Automatic check for updates + Automatic check for updates + + + + Allow multiple flameshot GUI instances simultaneously + Allow multiple flameshot GUI instances simultaneously + + + Automatically close daemon when it is not needed + Automatically close daemon when it is not needed + + + Launch at startup + Starta vid uppstart + + + Launch Flameshot + Starta Flameshot + + + + Show welcome message on launch + Show welcome message on launch + + + + Use large predefined color palette + Use large predefined color palette + + + + Copy URL after upload + Copy URL after upload + + + Copy URL and close window after upload + Copy URL and close window after upload + + + + Save image after copy + Save image after copy + + + Save image file after copying it + Save image file after copying it + + + + Show the help message at the beginning in the capture mode + Show the help message at the beginning in the capture mode + + + + Use last region for GUI mode + Använd senaste region för GUI-läge + + + + Use the last region as the default selection for the next screenshot in GUI mode + Use the last region as the default selection for the next screenshot in GUI mode + + + + Show the side panel toggle button in the capture mode + Show the side panel toggle button in the capture mode + + + + Enable desktop notifications + Enable desktop notifications + + + + Show abort notifications + + + + + Enable abort notifications + + + + + Show icon in the system tray + Show icon in the system tray + + + + Use grim to capture screenshots + + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + + + + + Ask for confirmation to delete screenshot from the latest uploads + Ask for confirmation to delete screenshot from the latest uploads + + + + Check for updates automatically + Check for updates automatically + + + + This allows you to take screenshots of Flameshot itself for example + This allows you to take screenshots of Flameshot itself for example + + + Launch Flameshot daemon when computer is booted + Launch Flameshot daemon when computer is booted + + + + Show the welcome message box in the middle of the screen while taking a screenshot + Show the welcome message box in the middle of the screen while taking a screenshot + + + + Use a large predefined color palette + Use a large predefined color palette + + + + Copy on double click + Copy on double click + + + Enable Copy on Double Click + Enable Copy on Double Click + + + Copy URL and close window after uploading was successful + Copy URL and close window after uploading was successful + + + + Automatically unload from memory when it is not needed + + + + + Automatically close daemon (background process) when it is not needed + + + + + Launch in background at startup + + + + + Launch Flameshot daemon (background process) when computer is booted + + + + + Ask before quit capture + + + + + Show the confirmation prompt before ESC quit + + + + + Enable Copy to clipboard on Double Click + + + + + Copy URL after uploading was successful + + + + + After copying the screenshot, save it to a file as well + After copying the screenshot, save it to a file as well + + + + Save Path + Save Path + + + + Change... + Change... + + + + Use fixed path for screenshots to save + Use fixed path for screenshots to save + + + + Preferred save file extension: + Preferred save file extension: + + + + Latest Uploads Max Size + Latest Uploads Max Size + + + + Imgur Application Client ID + Imgur Application Client ID + + + + Undo limit + Undo limit + + + + Use JPG format for clipboard (PNG default) + Use JPG format for clipboard (PNG default) + + + + Use lossy JPG format for clipboard (lossless PNG default) + + + + + Copy file path after save + Copy file path after save + + + + Copy the file path to clipboard after the file is saved + Copy the file path to clipboard after the file is saved + + + + Anti-aliasing image when zoom the pinned image + Anti-aliasing image when zoom the pinned image + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + After zooming the pinned image, should the image get smoothened or stay pixelated + + + + + Upload image without confirmation + Upload image without confirmation + + + + Choose a Folder + Choose a Folder + + + + Unable to write to directory. + Unable to write to directory. + + + + Show magnifier + Show magnifier + + + + Enable a magnifier while selecting the screenshot area + Enable a magnifier while selecting the screenshot area + + + + Square shaped magnifier + Square shaped magnifier + + + + Make the magnifier to be square-shaped + Make the magnifier to be square-shaped + + + + Milliseconds before geometry display hides; 0 means do not hide + + + + + Set geometry display timeout (ms) + + + + + Selection Geometry Display + + + + + Display Location + + + + + None + + + + + Top Left + + + + + Top Right + + + + + Bottom Left + + + + + Bottom Right + + + + + Center + + + + + Quality range of 0-100; Higher number is better quality and larger file size + + + + + JPEG Quality + + + + + Reverse arrow + + + + + Draw the arrow head first + + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + Latest Uploads + + + Screenshots history is empty + Screenshots history is empty + + + Copy URL + Kopiera URL + + + URL copied to clipboard. + URL kopierad till urklipp. + + + Open in browser + Open in browser + + + Confirm to delete + Confirm to delete + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Are you sure you want to delete a screenshot from the latest uploads and server? + + + + ImgS3Uploader + + Uploading Image + Laddar upp bild + + + URL copied to clipboard. + URL kopierad till klippbord. + + + Error + Fel + + + + ImgUploadDialog + + + Upload Confirmation + Upload Confirmation + + + + Do you want to upload this capture? + Do you want to upload this capture? + + + + + Upload without confirmation + Upload without confirmation + + + + ImgUploader + + Uploading Image + Laddar upp bild + + + Unable to open the URL. + Kunde inte öppna URL. + + + URL copied to clipboard. + URL kopierad till klippbord. + + + Screenshot copied to clipboard. + Skärmklipp kopierat till klippbord. + + + Copy URL + Kopiera URL + + + Open URL + Öppna URL + + + Delete image + Radera bild + + + Image to Clipboard. + Bild till klippbord. + + + + ImgUploaderBase + + + Upload image + Upload image + + + + Uploading Image + Laddar upp bild + + + + Copy URL + Kopiera URL + + + + Open URL + Öppna URL + + + + Delete image + Radera bild + + + + Image to Clipboard. + Bild till klippbord. + + + + Save image + Save image + + + + Unable to open the URL. + Kunde inte öppna URL. + + + + URL copied to clipboard. + URL copied to clipboard. + + + + Screenshot copied to clipboard. + Skärmklipp kopierat till klippbord. + + + + Unable to save the screenshot to disk. + Unable to save the screenshot to disk. + + + + Screenshot saved. + Screenshot saved. + + + + ImgUploaderTool + + + Image Uploader + Bilduppladdare + + + + Upload the selection + Upload the selection + + + + ImgurUploader + + Upload to Imgur + Ladda upp till Imgur + + + Uploading Image + Laddar upp bild + + + Copy URL + Kopiera URL + + + Open URL + Öppna URL + + + Delete image + Radera bild + + + Image to Clipboard. + Bild till klippbord. + + + + Unable to open the URL. + Kunde inte öppna URL. + + + URL copied to clipboard. + URL kopierad till klippbord. + + + Screenshot copied to clipboard. + Skärmklipp kopierat till klippbord. + + + + ImgurUploaderTool + + Image Uploader + Bilduppladdare + + + Upload the selection to Imgur + Ladda upp skärmklipp till Imgur + + + + InfoWindow + + + + About + Om + + + + + Icon + Icon + + + + + License + License + + + + + GPLv3+ + GPLv3+ + + + + + Version + Version + + + + + Flameshot v + Flameshot v + + + + + OS Info + OS Info + + + + + Copy Info + Copy Info + + + Right Click + Högerklick + + + Mouse Wheel + Scrollhjul + + + Move selection 1px + Flytta urval 1px + + + Resize selection 1px + Ändra storlek urval 1px + + + Quit capture + Stäng skärmavbildning + + + Copy to clipboard + Kopiera till klippbord + + + Save selection as a file + Spara urval som fil + + + Undo the last modification + Ångra senaste ändringen + + + Toggle visibility of sidebar with options of the selected tool + Ändra synlighet för sidomeny med alternativ för det valda verktyget + + + Show color picker + Visa färgväljare + + + Change the tool's thickness + Ändra verktygets tjocklek + + + Available shortcuts in the screen capture mode. + Tillgängliga kortkommandon i skärmklippsläge. + + + Key + Tangent + + + Description + Beskrivning + + + <u><b>License</b></u> + <u><b>Licens</b></u> + + + <u><b>Version</b></u> + <u><b>Version</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Genvägar</b></u> + + + + InvertTool + + + Invert + Invert + + + + Set Inverter as the paint tool + Set Inverter as the paint tool + + + + LineTool + + + Line + Linje + + + + Set the Line as the paint tool + Välj linje som ritverktyg + + + + MarkerTool + + + Marker + Överstrykningspenna + + + + Set the Marker as the paint tool + Välj Överstrykningspenna som ritverktyg + + + + MoveTool + + + Move + Flytta + + + + Move the selection area + Flytta urvalsområde + + + + PencilTool + + + Pencil + Penna + + + + Set the Pencil as the paint tool + Välj Penna som ritverktyg + + + + PinTool + + + Pin Tool + Fäst + + + + Pin image on the desktop + Fäst bilden på skrivbordet + + + + PinWidget + + + Context menu + Context menu + + + + Copy to clipboard + Kopiera till klippbord + + + + Save to file + Save to file + + + + Rotate Right + + + + + Rotate Left + + + + + Increase Opacity + + + + + Decrease Opacity + + + + + Close + Close + + + + PixelateTool + + + Pixelate + Pixelate + + + + Set Pixelate as the paint tool. + + + + Set Pixelate as the paint tool + Set Pixelate as the paint tool + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QHotkey + + Failed to register %1. Error: %2 + Failed to register %1. Error: %2 + + + Failed to unregister %1. Error: %2 + Failed to unregister %1. Error: %2 + + + + QObject + + + Save Error + Spara fel + + + + + Capture saved as + Urval sparad som + + + + + Capture saved to clipboard. + Capture saved to clipboard. + + + Capture saved to clipboard + Urval sparat till klippbord + + + + Error while saving to clipboard + Error while saving to clipboard + + + + + Error trying to save as + Fel vid spara som + + + + Save screenshot + Save screenshot + + + + Path copied to clipboard as + Path copied to clipboard as + + + Saving canceled + Saving canceled + + + Save canceled + Save canceled + + + Capture is saved and copied to the clipboard as + Capture is saved and copied to the clipboard as + + + + Unable to connect via DBus + Kunde inte ansluta via DBus + + + + Powerful yet simple to use screenshot software. + Powerful yet simple to use screenshot software. + + + + See + See + + + Capture the entire desktop. + Capture the entire desktop. + + + + Open the capture launcher. + Open the capture launcher. + + + + Start a manual capture in GUI mode. + Start a manual capture in GUI mode. + + + + Configure + Configure + + + Capture a single screen. + Capture a single screen. + + + Path where the capture will be saved + Path where the capture will be saved + + + + Capture screenshot of all monitors at the same time. + + + + + Capture a screenshot of the specified monitor. + + + + + Existing directory or new file to save to + Existing directory or new file to save to + + + + Save the capture to the clipboard + Save the capture to the clipboard + + + + Pin the capture to the screen + Pin the capture to the screen + + + + Upload screenshot + Upload screenshot + + + + Delay time in milliseconds + Delay time in milliseconds + + + + Repeat screenshot with previously selected region + Repeat screenshot with previously selected region + + + + Screenshot region to select + Screenshot region to select + + + + Set the filename pattern + Set the filename pattern + + + + Accept capture as soon as a selection is made + Accept capture as soon as a selection is made + + + + Enable or disable the trayicon + Enable or disable the trayicon + + + + Enable or disable run at startup + Enable or disable run at startup + + + + Enable or disable the notifications + + + + + Check the configuration for errors + Check the configuration for errors + + + + Show the help message in the capture mode + Show the help message in the capture mode + + + + Define the main UI color + Define the main UI color + + + + Define the contrast UI color + Define the contrast UI color + + + + Print raw PNG capture + Print raw PNG capture + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + + + + Define the screen to capture (starting from 0) + Define the screen to capture (starting from 0) + + + + Invalid delay, it must be a number greater than 0 + Invalid delay, it must be a number greater than 0 + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + + + + Invalid path, must be an existing directory or a new file in an existing directory + Invalid path, must be an existing directory or a new file in an existing directory + + + Define the screen to capture + Define the screen to capture + + + + default: screen containing the cursor + default: screen containing the cursor + + + + Screen number + Screen number + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + + + Invalid delay, it must be higher than 0 + Invalid delay, it must be higher than 0 + + + + Invalid screen number, it must be non negative + Invalid screen number, it must be non negative + + + Invalid path, it must be a real path in the system + Invalid path, it must be a real path in the system + + + + Invalid value, it must be defined as 'true' or 'false' + Invalid value, it must be defined as 'true' or 'false' + + + + Error + Fel + + + + Unable to write in + Kunde inte skriva i + + + + Options + Options + + + Arguments + Arguments + + + arguments + arguments + + + + Subcommands + + + + + subcommands + + + + + Usage + Usage + + + + options + options + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Per default runs Flameshot in the background and adds a tray icon for configuration. + + + + Requested screen exceeds screen count + Requested screen exceeds screen count + + + + Full screen screenshot pinned to screen + Full screen screenshot pinned to screen + + + URL copied to clipboard. + URL kopierad till urklipp. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + + + Toggle side panel + Toggle side panel + + + Resize selection left 1px + Resize selection left 1px + + + Resize selection right 1px + Resize selection right 1px + + + Resize selection up 1px + Resize selection up 1px + + + Resize selection down 1px + Resize selection down 1px + + + Select entire screen + Select entire screen + + + Move selection left 1px + Move selection left 1px + + + Move selection right 1px + Move selection right 1px + + + Move selection up 1px + Move selection up 1px + + + Move selection down 1px + Move selection down 1px + + + Commit text in text area + Commit text in text area + + + Delete current tool + Delete current tool + + + + Quit capture + Sluta fånga + + + + Screenshot history + Screenshot history + + + + Capture screen + Capture screen + + + + Show color picker + Visa färgväljaren + + + + Change the tool's size + Change the tool's size + + + Change the tool's thickness + Ändra verktygets tjocklek + + + + RectangleTool + + + Rectangle + Rektangel + + + + Set the Rectangle as the paint tool + Välj Rektangel som ritverktyg + + + + RedoTool + + + Redo + Upprepa + + + + Redo the next modification + Upprepa nästa ändring + + + + SaveTool + + + Save + Spara + + + + Save screenshot to a file + Save screenshot to a file + + + Save the capture + Spara skärmklippet + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + + + + Unable to capture screen + Kunde inte avbilda skärmen + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + Rektangulärt urval + + + + Set Selection as the paint tool + Välj Urval som ritverktyg + + + + SetShortcutDialog + + + Set Shortcut + Set Shortcut + + + + Enter new shortcut to change + Enter new shortcut to change + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Press Esc to cancel or Backspace to disable the keyboard shortcut. + + + + + Flameshot must be restarted for changes to take effect. + Flameshot must be restarted for changes to take effect. + + + + ShortcutsWidget + + + Hot Keys + Hot Keys + + + + Available shortcuts in the screen capture mode. + Tillgängliga genvägar i skärmklippningsläget. + + + + Description + Beskrivning + + + + Key + Tangent + + + + Left Double-click + Left Double-click + + + + Toggle side panel + Toggle side panel + + + + Grab a color from the screen + + + + + Resize selection left 1px + Resize selection left 1px + + + + Resize selection right 1px + Resize selection right 1px + + + + Resize selection up 1px + Resize selection up 1px + + + + Resize selection down 1px + Resize selection down 1px + + + + Symmetrically decrease width by 2px + + + + + Symmetrically increase width by 2px + + + + + Symmetrically increase height by 2px + + + + + Symmetrically decrease height by 2px + + + + + Select entire screen + Select entire screen + + + + Move selection left 1px + Move selection left 1px + + + + Move selection right 1px + Move selection right 1px + + + + Move selection up 1px + Move selection up 1px + + + + Move selection down 1px + Move selection down 1px + + + + Commit text in text area + Commit text in text area + + + + Delete selected drawn object + + + + + Cancel current selection + + + + Delete current tool + Delete current tool + + + + Capture screen + Capture screen + + + + Screenshot history + Screenshot history + + + + SidePanelWidget + + Active thickness: + Aktiv tjocklek: + + + Active color: + Aktiv färg: + + + Press ESC to cancel + Tryck ESC för att avbryta + + + + Active tool size: + Active tool size: + + + + Active Color: + Active Color: + + + + Grab Color + Hämta färg + + + + Display grid + + + + + SizeDecreaseTool + + + Decrease Tool Size + Decrease Tool Size + + + + Decrease the size of the other tools + Decrease the size of the other tools + + + + SizeIncreaseTool + + + Increase Tool Size + Increase Tool Size + + + + Increase the size of the other tools + Increase the size of the other tools + + + + SizeIndicatorTool + + Selection Size Indicator + Storleksindikator urval + + + Show X and Y dimensions of the selection + Show X and Y dimensions of the selection + + + Show the dimensions of the selection (X Y) + Visa dimensionerna av urval (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + Århundrade (00-99) + + + + Year (00-99) + År (00-99) + + + + Year (2000) + År (2000) + + + + Month Name (jan) + Månad namn (jan) + + + + Month Name (january) + Månad namn (januari) + + + + Month (01-12) + Månad (01-12) + + + + Week Day (1-7) + Veckodag (1-7) + + + + Week (01-53) + Vecka (1-53) + + + + Day Name (mon) + Dag namn (mån) + + + + Day Name (monday) + Dag namn (måndag) + + + + Day (01-31) + Dag (01-31) + + + + Day of Month (1-31) + Dag i månad (1-31) + + + + Day (001-366) + Dag (001-366) + + + + Time (%H-%M-%S) + Tid (%H-%M-%S) + + + + Time (%H-%M) + Tid (%H-%M) + + + + Hour (00-23) + Timme (00-23) + + + + Hour (01-12) + Timme (01-12) + + + + Minute (00-59) + Minut (00-59) + + + + Second (00-59) + Sekund (00-59) + + + + Full Date (%m/%d/%y) + Fullständingt datum (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + Fullständigt datum (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + + + + + SystemNotification + + + Flameshot Info + Flameshot information + + + + TextConfig + + + StrikeOut + Överstruken + + + + Underline + Understruken + + + + Bold + Fet + + + + Italic + Kursiv + + + + Left Align + Left Align + + + + Center Align + Center Align + + + + Right Align + Right Align + + + + TextTool + + + Text + Text + + + + Add text to your capture + Lägg till text på ditt skärmklipp + + + + TrayIcon + + + &Take Screenshot + &Ta skärmdump + + + + &Open Launcher + &Open Launcher + + + + &Configuration + &Konfiguration + + + + &About + &About + + + + Check for updates + Check for updates + + + + New version %1 is available + New version %1 is available + + + + &Quit + &Avsluta + + + + &Latest Uploads + &Latest Uploads + + + + &Open Save Path + + + + + UIcolorEditor + + UI Color Editor + UI färgeditor + + + + Change the color moving the selectors and see the changes in the preview buttons. + Ändra färgen genom att röra reglagen och se ändringarna på förhandsgranskningsknapparna. + + + + Select a Button to modify it + Välj en knapp för att redigera den + + + + Main Color + Huvudfärg + + + + Click on this button to set the edition mode of the main color. + Klicka här för att redigera huvudfärg. + + + + Contrast Color + Kontrastfärg + + + + Click on this button to set the edition mode of the contrast color. + Klicka här för att redigera kontrastfärg. + + + + UndoTool + + + Undo + Ångra + + + + Undo the last modification + Ångra senaste ändringen + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + New Flameshot version %1 is available + + + + Ignore + Ignore + + + + Later + Later + + + + Update + Update + + + + UploadHistory + + + Upload History + Upload History + + + + Screenshots history is empty + Screenshots history is empty + + + + UploadLineItem + + + Form + Form + + + + TextLabel + TextLabel + + + + Copy URL + Kopiera URL + + + + Open In Browser + Open In Browser + + + + Confirm to delete + Confirm to delete + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Are you sure you want to delete a screenshot from the latest uploads and server? + + + + UtilityPanel + + + Close + Close + + + + <Empty> + <Empty> + + + + VisualsEditor + + + Opacity of area outside selection: + Opacitet för område utanför urval: + + + + UI Color Editor + UI färgeditor + + + + Colorpicker Editor + Colorpicker Editor + + + + Button Selection + Knappval + + + + Select All + Välj alla + + + + color_widgets::ColorDialog + + + Pick + Pick + + + + color_widgets::ColorPalette + + + Unnamed + Unnamed + + + + color_widgets::ColorPaletteModel + + + Unnamed + Unnamed + + + + %1 (%2 colors) + %1 (%2 colors) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + Open a new palette from file + + + + + Create a new palette + Create a new palette + + + + + Duplicate the current palette + Duplicate the current palette + + + + + Delete the current palette + Delete the current palette + + + + + Revert changes to the current palette + Revert changes to the current palette + + + + + Save changes to the current palette + Save changes to the current palette + + + + + Add a color to the palette + Add a color to the palette + + + + + Remove the selected color from the palette + Remove the selected color from the palette + + + + + New Palette + New Palette + + + + + Name + Name + + + + GIMP Palettes (*.gpl) + GIMP Palettes (*.gpl) + + + + Palette Image (%1) + Palette Image (%1) + + + + All Files (*) + All Files (*) + + + + + Open Palette + Open Palette + + + + Failed to load the palette file +%1 + Failed to load the palette file +%1 + + + + color_widgets::GradientEditor + + + Add Color + Add Color + + + + Remove Color + Remove Color + + + + Edit Color... + Edit Color... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 colors) + + + + color_widgets::Swatch + + + Clear Color + Clear Color + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_sw.ts b/data/translations/Internationalization_sw.ts new file mode 100644 index 0000000..ea93223 --- /dev/null +++ b/data/translations/Internationalization_sw.ts @@ -0,0 +1,3089 @@ + + + + + AbstractWidgetList + + + Add New + Ongeza Mpya + + + + Move Up + Songa juu + + + + Move Down + Songa chini + + + + Remove + Ondoa + + + + AcceptTool + + + Accept + Kubali + + + + Accept the capture + Kubali picha ya skrini + + + + AppLauncher + + + App Launcher + Uzinduzi wa Programmu + + + + Choose an app to open the capture + Chagua programu ya kufungua picha ya skrini + + + + AppLauncherWidget + + + Open With + Fungua na + + + + Launch in terminal + Zindua kwa terminal + + + + Keep open after selection + Wacha wazi baada ya uteuzi + + + + + Error + Hitilafu + + + + Unable to launch in terminal. + + + + + Unable to write in + + + + + ArrowTool + + + Arrow + Mshale + + + + Set the Arrow as the paint tool + + + + + BlurTool + + Blur + Desenfocament + + + Set Blur as the paint tool + Estableix el desenfocament com a eina de dibuix + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Mode de captura</b> + + + + Rectangular Region + Sehemu Mstatili + + + + Full Screen (Current Display) + + + + + Full Screen (All Monitors) + + + + + No Delay + Hakuna Kuchelewa + + + + second + sekunde + + + + + + seconds + sekunde + + + + + Take new screenshot + Chukua picha mpya ya skrini + + + + + Area: + Sehemu: + + + + + Capture Launcher + + + + + + TextLabel + NakalaLebo + + + + + Capture Mode + Hali ya Kunasa + + + + + Delay: + Chelewesha: + + + + + WxH+x+y + WxH+x+y + + + + CaptureWidget + + + Unable to capture screen + Impossible capturar la pantalla + Kunasa skrini haiwezekani + + + + Mouse + Kipanya + + + + Select screenshot area + Chagua sehemu ya picha ya skrini + + + + Mouse Wheel + Gurudumu la kipanya + + + + Change tool size + Badili ukubwa wa chombo + + + + Right Click + Bonyeza Kulia + + + + Show color picker + Onyesha kichagua rangi + + + + Open side panel + Fungua paneli ya upande + + + + Esc + Esc + + + + Exit + Toka + + + + Quit Capture + + + + + Are you sure you want to quit capture? + + + + + Do not show this again + + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Escolliu una àrea amb el ratolí, o premeu Esc per sortir. +Premeu Entrar per capturar la pantalla. +Premeu clic dret per mostrar l'eina de selecció de color. +Gireu la rodeta del ratolí per canviar el gruix de l'eina de dibuix. +Premeu Espai per obrir el calaix lateral. + + + + Tool Settings + + + + + CircleCountTool + + + Circle Counter + + + + + Add an autoincrementing counter bubble + + + + + CircleTool + + + Circle + + + + + Set the Circle as the paint tool + + + + + ColorDialog + + + + Select Color + + + + + + Saturation + + + + + + Hue + + + + + + Hex + + + + + + Blue + + + + + + Value + + + + + + Green + + + + + + Alpha + + + + + + Red + + + + + ColorGrabWidget + + + Accept color + + + + + Enter or Left Click + Enter or Left Click + + + + Precisely select color + + + + + Hold Left Click + Hold Left Click + + + + Toggle magnifier + + + + + Space or Right Click + Space or Right Click + + + + Cancel + + + + + Esc + Esc + + + + ColorPickerEditor + + + Edit Preset: + + + + + Enter color to update preset + + + + + Update + + + + + Press button to update the selected preset + + + + + Delete + + + + + Press button to delete the selected preset + + + + + Add Preset: + + + + + Enter color manually or select it using the color-wheel + + + + + Add + + + + + Press button to add preset + + + + + + Error + + + + + Unable to add preset. Maximum limit reached. + + + + + Unable to remove preset. Minimum limit reached. + + + + + ConfigErrorDetails + + + Configuration errors + + + + + ConfigHandler + + + Unrecognized setting: '%1' + + + + + + Unrecognized shortcut name: '%1'. + + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + + + + + Bad value in '%1'. Expected: %2 + + + + + + You have successfully resolved the configuration error. + + + + + The configuration contains an error. Open configuration to resolve. + + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + + + + + ConfigResolver + + + Resolve configuration errors + + + + + <b>You must resolve all errors before continuing:</b> + + + + + Reset + + + + + Reset to the default value. + + + + + Remove + Ondoa + + + + Remove this setting. + + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + + + + + Resolve all + + + + + Resolve all listed errors. + + + + + Details + + + + + ConfigWindow + + + Configuration + + + + + Interface + + + + + Filename Editor + + + + + General + + + + + Shortcuts + + + + + Resolve + + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + + + + + Controller + + New version %1 is available + La nova versió %1 ja és disponible + + + You have the latest version + Teniu la versió més recent + + + Failed to get information about the latest version. + Error a l'intentar obtenir informació sobre actualitzacions. + + + Error + Error + + + Unable to close active modal widgets + No s'han pogut tancar els widgets modals actius + + + &Open Launcher + &Obre el llançador d'aplicacions + + + &Configuration + &Ajustaments + + + &About + &Quant a + + + Check for updates + Comprova si hi ha actualitzacions disponibles + + + &Latest Uploads + &Últimes càrregues + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + &Information + &Informació + + + &Quit + &Surt + + + &Take Screenshot + &Captura + + + + CopyTool + + + Copy + + + + + Copy selection to clipboard + + + + Copy the selection into the clipboard + Copia la selecció al porta-retalls + + + + DBusUtils + + Unable to connect via DBus + No s'ha pogut connectar mitjançant DBus + + + + ExitTool + + + Exit + Toka + + + + Leave the capture screen + + + + + FileNameEditor + + + Edit the name of your captures: + + + + + Edit: + + + + + Preview: + + + + + Save + + + + + Saves the pattern + + + + + Restore + + + + Reset + Reinicialitza + + + + Restores the saved pattern + + + + + Clear + + + + + Deletes the name + + + + + Flameshot + + + Error + + + + + Unable to close active modal widgets + No s'han pogut tancar els widgets modals actius + + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + + FlameshotDaemon + + + New version %1 is available + La nova versió %1 ja és disponible + + + + You have the latest version + Teniu la versió més recent + + + + Failed to get information about the latest version. + Error a l'intentar obtenir informació sobre actualitzacions. + + + + Unable to connect via DBus + No s'ha pogut connectar mitjançant DBus + + + + GeneneralConf + + Show help message + Mostra el missatge d'ajuda + + + Show the help message at the beginning in the capture mode. + Mostra el missatge d'ajuda en iniciar el mode de captura. + + + Show desktop notifications + Mostra les notificacions d'escriptori + + + Show tray icon + Mostra la icona en la barra de tasques + + + Show the systemtray icon + Mostra la icona en la barra de tasques + + + Import + Importar + + + Error + Error + + + Unable to read file. + Impossible llegir el fitxer. + + + Unable to write file. + Impossible escriure al fitxer. + + + Save File + Guardar Arxiu + + + Confirm Reset + Confirmar Reset + + + Are you sure you want to reset the configuration? + Esteu segur que voleu reiniciar la configuració? + + + Configuration File + Fitxer de Configuració + + + Export + Exportar + + + Reset + Reset + + + Launch at startup + Llançament a l'inici + + + + GeneralConf + + + + Import + Importar + + + + + + + Error + + + + + Unable to read file. + Impossible llegir el fitxer. + + + + + Unable to write file. + Impossible escriure al fitxer. + + + + Save File + Guardar Arxiu + + + + Confirm Reset + Confirmar Reset + + + + Are you sure you want to reset the configuration? + Esteu segur que voleu reiniciar la configuració? + + + + Show help message + Mostra el missatge d'ajuda + + + Show the help message at the beginning in the capture mode. + Mostra el missatge d'ajuda en iniciar el mode de captura. + + + + Show the side panel button + + + + Show the side panel toggle button in the capture mode. + Mostra el botó del calaix lateral en el mode de captura. + + + + Show desktop notifications + Mostra les notificacions d'escriptori + + + + Show tray icon + Mostra la icona en la barra de tasques + + + Show the systemtray icon + Mostra la icona a la barra de tasques del sistema + + + + Confirmation required to delete screenshot from the latest uploads + + + + + Configuration File + Fitxer de Configuració + + + + Export + Exportar + + + + Reset + + + + + Automatic check for updates + + + + + Allow multiple flameshot GUI instances simultaneously + + + + This allows you to take screenshots of flameshot itself for example. + This allows you to take screenshots of flameshot itself for example. + + + Launch Flameshot + Inicia el Flameshot + + + + Show welcome message on launch + + + + + Use large predefined color palette + + + + + Copy URL after upload + + + + Copy URL and close window after upload + Copia la URL i tanca la finestra després de la càrrega + + + + Save image after copy + + + + Save image file after copying it + Desa el fitxer d'imatge després d'haver-lo copiat + + + + Show the help message at the beginning in the capture mode + + + + + Use last region for GUI mode + Use last region for GUI mode + + + + Use the last region as the default selection for the next screenshot in GUI mode + Use the last region as the default selection for the next screenshot in GUI mode + + + + Show the side panel toggle button in the capture mode + + + + + Enable desktop notifications + + + + + Show abort notifications + + + + + Enable abort notifications + + + + + Show icon in the system tray + + + + + Use grim to capture screenshots + + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + + + + + Ask for confirmation to delete screenshot from the latest uploads + + + + + Check for updates automatically + + + + + This allows you to take screenshots of Flameshot itself for example + + + + + Show the welcome message box in the middle of the screen while taking a screenshot + + + + + Use a large predefined color palette + + + + + Copy on double click + + + + + Automatically unload from memory when it is not needed + + + + + Automatically close daemon (background process) when it is not needed + + + + + Launch in background at startup + + + + + Launch Flameshot daemon (background process) when computer is booted + + + + + Ask before quit capture + + + + + Show the confirmation prompt before ESC quit + + + + + Enable Copy to clipboard on Double Click + + + + + Copy URL after uploading was successful + + + + + After copying the screenshot, save it to a file as well + + + + + Save Path + + + + + Change... + + + + + Use fixed path for screenshots to save + + + + + Preferred save file extension: + + + + + Latest Uploads Max Size + + + + + Imgur Application Client ID + + + + + Undo limit + + + + + Use JPG format for clipboard (PNG default) + + + + + Use lossy JPG format for clipboard (lossless PNG default) + + + + + Copy file path after save + + + + + Copy the file path to clipboard after the file is saved + + + + + Anti-aliasing image when zoom the pinned image + + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + + + + + + Upload image without confirmation + + + + + Choose a Folder + + + + + Unable to write to directory. + + + + + Show magnifier + + + + + Enable a magnifier while selecting the screenshot area + + + + + Square shaped magnifier + + + + + Make the magnifier to be square-shaped + + + + + Milliseconds before geometry display hides; 0 means do not hide + + + + + Set geometry display timeout (ms) + + + + + Selection Geometry Display + + + + + Display Location + + + + + None + + + + + Top Left + + + + + Top Right + + + + + Bottom Left + + + + + Bottom Right + + + + + Center + + + + + Quality range of 0-100; Higher number is better quality and larger file size + + + + + JPEG Quality + + + + + Reverse arrow + + + + + Draw the arrow head first + + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + Últimes càrregues + + + Screenshots history is empty + L'historial de captures de pantalla és buit + + + Copy URL + Copia l'URL + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Open in browser + Obre al navegador + + + Confirm to delete + Confirmeu per esborrar + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Esteu segur de voler esborrar la captura de les últimes càrregues i del servidor? + + + + ImgS3Uploader + + Uploading Image + S'està pujant la imatge + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Error + Error + + + + ImgUploadDialog + + + Upload Confirmation + + + + + Do you want to upload this capture? + + + + + + Upload without confirmation + + + + + ImgUploader + + Uploading Image + S'està pujant la imatge + + + Delete image + Esborra la imatge + + + Unable to open the URL. + No es pot obrir l'URL. + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + Copy URL + Copia l'URL + + + Open URL + Obri l'URL + + + Image to Clipboard. + Imatge al porta-retalls. + + + + ImgUploaderBase + + + Upload image + + + + + Uploading Image + S'està pujant la imatge + + + + Copy URL + Copia l'URL + + + + Open URL + + + + + Delete image + Esborra la imatge + + + + Image to Clipboard. + Imatge al porta-retalls. + + + + Save image + + + + + Unable to open the URL. + No es pot obrir l'URL. + + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + + Unable to save the screenshot to disk. + + + + + Screenshot saved. + + + + + ImgUploaderTool + + + Image Uploader + Puja la imatge + + + + Upload the selection + + + + + ImgurUploader + + Upload to Imgur + Puja a Imgur + + + Uploading Image + S'està pujant la imatge + + + Copy URL + Copia l'URL + + + Open URL + Obre l'URL + + + Delete image + Esborra la imatge + + + Image to Clipboard. + Imatge al porta-retalls. + + + + Unable to open the URL. + No es pot obrir l'URL. + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + + ImgurUploaderTool + + Image Uploader + Puja la imatge + + + Upload the selection to Imgur + Puja la selecció a Imgur + + + + InfoWindow + + + + About + + + + + + Icon + + + + + + License + + + + + + GPLv3+ + + + + + + Version + + + + + + Flameshot v + + + + + + OS Info + + + + + + Copy Info + + + + Right Click + Clic dret + + + Mouse Wheel + Roda del ratolí + + + Move selection 1px + Mou la selecció 1 px + + + Resize selection 1px + Redimensiona la selecció 1 px + + + Quit capture + Ix de la captura + + + Copy to clipboard + Copia al porta-retalls + + + Save selection as a file + Guarda la selecció com a fitxer + + + Undo the last modification + Desfés l'última modificació + + + Show color picker + Mostra el selector de color + + + Change the tool's thickness + Canvia el gruix de l'eina + + + Key + Tecla + + + Description + Descripció + + + <u><b>License</b></u> + <u><b>Llicència</b></u> + + + <u><b>Version</b></u> + <u><b>Versió</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Dreceres</b></u> + + + Available shortcuts in the screen capture mode. + Dreceres disponibles en el mode de captura de pantalla. + + + + InvertTool + + + Invert + + + + + Set Inverter as the paint tool + + + + + LineTool + + + Line + + + + + Set the Line as the paint tool + + + + + MarkerTool + + + Marker + + + + + Set the Marker as the paint tool + + + + + MoveTool + + + Move + + + + + Move the selection area + + + + + PencilTool + + + Pencil + + + + + Set the Pencil as the paint tool + + + + + PinTool + + + Pin Tool + + + + + Pin image on the desktop + + + + + PinWidget + + + Context menu + + + + + Copy to clipboard + Copia al porta-retalls + + + + Save to file + + + + + Rotate Right + + + + + Rotate Left + + + + + Increase Opacity + + + + + Decrease Opacity + + + + + Close + + + + + PixelateTool + + + Pixelate + + + + + Set Pixelate as the paint tool. + + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QObject + + + + Capture saved to clipboard. + + + + + Error while saving to clipboard + + + + + Save screenshot + + + + + Path copied to clipboard as + + + + Saving canceled + Saving canceled + + + Save canceled + Save canceled + + + Capture is saved and copied to the clipboard as + La captura serà desada i copiada al porta-retalls com a + + + + Save Error + + + + + + Capture saved as + + + + + + Error trying to save as + + + + + Unable to connect via DBus + No s'ha pogut connectar mitjançant DBus + + + + Powerful yet simple to use screenshot software. + + + + + See + + + + + Open the capture launcher. + + + + + Start a manual capture in GUI mode. + + + + + Configure + + + + Path where the capture will be saved + Camí on es desarà la captura + + + + Capture screenshot of all monitors at the same time. + + + + + Capture a screenshot of the specified monitor. + + + + + Existing directory or new file to save to + + + + + Save the capture to the clipboard + + + + + Pin the capture to the screen + + + + + Upload screenshot + + + + + Delay time in milliseconds + + + + + Repeat screenshot with previously selected region + + + + + Screenshot region to select + + + + + Set the filename pattern + + + + + Accept capture as soon as a selection is made + + + + + Enable or disable the trayicon + + + + + Enable or disable run at startup + + + + + Enable or disable the notifications + + + + + Check the configuration for errors + + + + + Show the help message in the capture mode + + + + + Define the main UI color + + + + + Define the contrast UI color + + + + + Print raw PNG capture + + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + + + + + Define the screen to capture (starting from 0) + + + + + Invalid delay, it must be a number greater than 0 + + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + + + + + Invalid path, must be an existing directory or a new file in an existing directory + + + + Define the screen to capture + Define the screen to capture + + + + default: screen containing the cursor + + + + + Screen number + + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + + + + Invalid delay, it must be higher than 0 + Invalid delay, it must be higher than 0 + + + + Invalid screen number, it must be non negative + + + + Invalid path, it must be a real path in the system + Invalid path, it must be a real path in the system + + + + Invalid value, it must be defined as 'true' or 'false' + + + + + Error + + + + + Unable to write in + + + + + Requested screen exceeds screen count + + + + + Full screen screenshot pinned to screen + + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + + Options + + + + + Subcommands + + + + + subcommands + + + + + Usage + + + + + options + + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + + + + Toggle side panel + Toggle side panel + + + Resize selection left 1px + Resize selection left 1px + + + Resize selection right 1px + Resize selection right 1px + + + Resize selection up 1px + Resize selection up 1px + + + Resize selection down 1px + Resize selection down 1px + + + Select entire screen + Select entire screen + + + Move selection left 1px + Move selection left 1px + + + Move selection right 1px + Move selection right 1px + + + Move selection up 1px + Move selection up 1px + + + Move selection down 1px + Move selection down 1px + + + Commit text in text area + Commit text in text area + + + Delete current tool + Delete current tool + + + + Quit capture + Ix de la captura + + + + Screenshot history + + + + + Capture screen + + + + + Show color picker + + + + + Change the tool's size + + + + Change the tool's thickness + Canvia el gruix de l'eina + + + + RectangleTool + + + Rectangle + + + + + Set the Rectangle as the paint tool + + + + + RedoTool + + + Redo + + + + + Redo the next modification + + + + + SaveTool + + + Save + + + + + Save screenshot to a file + + + + Save the capture + Guarda la captura + + + + ScreenGrabber + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + + + + + Unable to capture screen + Kunasa skrini haiwezekani + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + + + + + Set Selection as the paint tool + + + + + SetShortcutDialog + + + Set Shortcut + + + + + Enter new shortcut to change + + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + + + + + + Flameshot must be restarted for changes to take effect. + + + + + ShortcutsWidget + + + Hot Keys + + + + + Available shortcuts in the screen capture mode. + Dreceres disponibles en el mode de captura de pantalla. + + + + Description + Descripció + + + + Key + Tecla + + + + Left Double-click + Left Double-click + + + + Toggle side panel + Toggle side panel + + + + Grab a color from the screen + + + + + Resize selection left 1px + Resize selection left 1px + + + + Resize selection right 1px + Resize selection right 1px + + + + Resize selection up 1px + Resize selection up 1px + + + + Resize selection down 1px + Resize selection down 1px + + + + Symmetrically decrease width by 2px + + + + + Symmetrically increase width by 2px + + + + + Symmetrically increase height by 2px + + + + + Symmetrically decrease height by 2px + + + + + Select entire screen + Select entire screen + + + + Move selection left 1px + Move selection left 1px + + + + Move selection right 1px + Move selection right 1px + + + + Move selection up 1px + Move selection up 1px + + + + Move selection down 1px + Move selection down 1px + + + + Commit text in text area + Commit text in text area + + + + Delete selected drawn object + + + + + Cancel current selection + + + + + Capture screen + + + + + Screenshot history + + + + + SidePanelWidget + + Active thickness: + Active thickness: + + + Active color: + Active color: + + + Press ESC to cancel + Press ESC to cancel + + + + Active tool size: + + + + + Active Color: + + + + + Grab Color + + + + + Display grid + + + + + SizeDecreaseTool + + + Decrease Tool Size + + + + + Decrease the size of the other tools + + + + + SizeIncreaseTool + + + Increase Tool Size + + + + + Increase the size of the other tools + + + + + SizeIndicatorTool + + Show the dimensions of the selection (X Y) + Mostra les mides de la selecció (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + + + + + Year (00-99) + + + + + Year (2000) + + + + + Month Name (jan) + + + + + Month Name (january) + + + + + Month (01-12) + + + + + Week Day (1-7) + + + + + Week (01-53) + + + + + Day Name (mon) + + + + + Day Name (monday) + + + + + Day (01-31) + + + + + Day of Month (1-31) + + + + + Day (001-366) + + + + + Hour (00-23) + + + + + Hour (01-12) + + + + + Minute (00-59) + + + + + Second (00-59) + + + + + Full Date (%m/%d/%y) + + + + + Full Date (%Y-%m-%d) + + + + + Full Date (%d-%m-%Y) + + + + + Time (%H-%M-%S) + + + + + Time (%H-%M) + + + + + SystemNotification + + + Flameshot Info + + + + + TextConfig + + + StrikeOut + + + + + Underline + + + + + Bold + + + + + Italic + + + + + Left Align + + + + + Center Align + + + + + Right Align + + + + + TextTool + + + Text + + + + + Add text to your capture + + + + + TrayIcon + + + &Take Screenshot + &Captura + + + + &Open Launcher + &Obre el llançador d'aplicacions + + + + &Configuration + &Ajustaments + + + + &About + &Quant a + + + + Check for updates + Comprova si hi ha actualitzacions disponibles + + + + New version %1 is available + La nova versió %1 ja és disponible + + + + &Quit + &Surt + + + + &Latest Uploads + &Últimes càrregues + + + + &Open Save Path + + + + + UIcolorEditor + + UI Color Editor + Editor de color de la interfície + + + + Change the color moving the selectors and see the changes in the preview buttons. + + + + + Select a Button to modify it + + + + + Main Color + + + + + Click on this button to set the edition mode of the main color. + + + + + Contrast Color + + + + + Click on this button to set the edition mode of the contrast color. + + + + + UndoTool + + + Undo + + + + + Undo the last modification + Desfés l'última modificació + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + + + + + Ignore + + + + + Later + + + + + Update + + + + + UploadHistory + + + Upload History + + + + + Screenshots history is empty + L'historial de captures de pantalla és buit + + + + UploadLineItem + + + Form + + + + + TextLabel + NakalaLebo + + + + Copy URL + Copia l'URL + + + + Open In Browser + + + + + Confirm to delete + Confirmeu per esborrar + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Esteu segur de voler esborrar la captura de les últimes càrregues i del servidor? + + + + UtilityPanel + + + Close + + + + + <Empty> + + + + + VisualsEditor + + + Opacity of area outside selection: + + + + + UI Color Editor + Editor de color de la interfície + + + + Colorpicker Editor + + + + + Button Selection + + + + + Select All + + + + + color_widgets::ColorDialog + + + Pick + + + + + color_widgets::ColorPalette + + + Unnamed + + + + + color_widgets::ColorPaletteModel + + + Unnamed + + + + + %1 (%2 colors) + + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + + + + + + Create a new palette + + + + + + Duplicate the current palette + + + + + + Delete the current palette + + + + + + Revert changes to the current palette + + + + + + Save changes to the current palette + + + + + + Add a color to the palette + + + + + + Remove the selected color from the palette + + + + + + New Palette + + + + + + Name + + + + + GIMP Palettes (*.gpl) + + + + + Palette Image (%1) + + + + + All Files (*) + + + + + + Open Palette + + + + + Failed to load the palette file +%1 + + + + + color_widgets::GradientEditor + + + Add Color + + + + + Remove Color + + + + + Edit Color... + + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + + + + + color_widgets::Swatch + + + Clear Color + + + + + %1 (%2) + + + + diff --git a/data/translations/Internationalization_ta.ts b/data/translations/Internationalization_ta.ts new file mode 100644 index 0000000..5144edd --- /dev/null +++ b/data/translations/Internationalization_ta.ts @@ -0,0 +1,3089 @@ + + + + + AbstractWidgetList + + + Add New + + + + + Move Up + + + + + Move Down + + + + + Remove + + + + + AcceptTool + + + Accept + + + + + Accept the capture + + + + + AppLauncher + + + App Launcher + + + + + Choose an app to open the capture + + + + + AppLauncherWidget + + + Open With + + + + + Launch in terminal + + + + + Keep open after selection + + + + + + Error + Error + + + + Unable to launch in terminal. + + + + + Unable to write in + + + + + ArrowTool + + + Arrow + + + + + Set the Arrow as the paint tool + + + + + BlurTool + + Blur + Desenfocament + + + Set Blur as the paint tool + Estableix el desenfocament com a eina de dibuix + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Mode de captura</b> + + + + Rectangular Region + + + + + Full Screen (Current Display) + + + + + Full Screen (All Monitors) + + + + + No Delay + + + + + second + + + + + + + seconds + + + + + + Take new screenshot + + + + + + Area: + + + + + + Capture Launcher + + + + + + TextLabel + + + + + + Capture Mode + + + + + + Delay: + + + + + + WxH+x+y + + + + + CaptureWidget + + + Unable to capture screen + Impossible capturar la pantalla + + + + + Mouse + + + + + Select screenshot area + + + + + Mouse Wheel + Roda del ratolí + + + + Change tool size + + + + + Right Click + Clic dret + + + + Show color picker + Mostra el selector de color + + + + Open side panel + + + + + Esc + + + + + Exit + + + + + Quit Capture + + + + + Are you sure you want to quit capture? + + + + + Do not show this again + + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Escolliu una àrea amb el ratolí, o premeu Esc per sortir. +Premeu Entrar per capturar la pantalla. +Premeu clic dret per mostrar l'eina de selecció de color. +Gireu la rodeta del ratolí per canviar el gruix de l'eina de dibuix. +Premeu Espai per obrir el calaix lateral. + + + + Tool Settings + + + + + CircleCountTool + + + Circle Counter + + + + + Add an autoincrementing counter bubble + + + + + CircleTool + + + Circle + + + + + Set the Circle as the paint tool + + + + + ColorDialog + + + + Select Color + + + + + + Saturation + + + + + + Hue + + + + + + Hex + + + + + + Blue + + + + + + Value + + + + + + Green + + + + + + Alpha + + + + + + Red + + + + + ColorGrabWidget + + + Accept color + + + + + Enter or Left Click + Enter or Left Click + + + + Precisely select color + + + + + Hold Left Click + Hold Left Click + + + + Toggle magnifier + + + + + Space or Right Click + Space or Right Click + + + + Cancel + + + + + Esc + + + + + ColorPickerEditor + + + Edit Preset: + + + + + Enter color to update preset + + + + + Update + + + + + Press button to update the selected preset + + + + + Delete + + + + + Press button to delete the selected preset + + + + + Add Preset: + + + + + Enter color manually or select it using the color-wheel + + + + + Add + + + + + Press button to add preset + + + + + + Error + Error + + + + Unable to add preset. Maximum limit reached. + + + + + Unable to remove preset. Minimum limit reached. + + + + + ConfigErrorDetails + + + Configuration errors + + + + + ConfigHandler + + + Unrecognized setting: '%1' + + + + + + Unrecognized shortcut name: '%1'. + + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + + + + + Bad value in '%1'. Expected: %2 + + + + + + You have successfully resolved the configuration error. + + + + + The configuration contains an error. Open configuration to resolve. + + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + + + + + ConfigResolver + + + Resolve configuration errors + + + + + <b>You must resolve all errors before continuing:</b> + + + + + Reset + + + + + Reset to the default value. + + + + + Remove + + + + + Remove this setting. + + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + + + + + Resolve all + + + + + Resolve all listed errors. + + + + + Details + + + + + ConfigWindow + + + Configuration + + + + + Interface + + + + + Filename Editor + + + + + General + + + + + Shortcuts + + + + + Resolve + + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + + + + + Controller + + New version %1 is available + La nova versió %1 ja és disponible + + + You have the latest version + Teniu la versió més recent + + + Failed to get information about the latest version. + Error a l'intentar obtenir informació sobre actualitzacions. + + + Error + Error + + + Unable to close active modal widgets + No s'han pogut tancar els widgets modals actius + + + &Open Launcher + &Obre el llançador d'aplicacions + + + &Configuration + &Ajustaments + + + &About + &Quant a + + + Check for updates + Comprova si hi ha actualitzacions disponibles + + + &Latest Uploads + &Últimes càrregues + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + &Information + &Informació + + + &Quit + &Surt + + + &Take Screenshot + &Captura + + + + CopyTool + + + Copy + + + + + Copy selection to clipboard + + + + Copy the selection into the clipboard + Copia la selecció al porta-retalls + + + + DBusUtils + + Unable to connect via DBus + No s'ha pogut connectar mitjançant DBus + + + + ExitTool + + + Exit + + + + + Leave the capture screen + + + + + FileNameEditor + + + Edit the name of your captures: + + + + + Edit: + + + + + Preview: + + + + + Save + + + + + Saves the pattern + + + + + Restore + + + + Reset + Reinicialitza + + + + Restores the saved pattern + + + + + Clear + + + + + Deletes the name + + + + + Flameshot + + + Error + Error + + + + Unable to close active modal widgets + No s'han pogut tancar els widgets modals actius + + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + + FlameshotDaemon + + + New version %1 is available + La nova versió %1 ja és disponible + + + + You have the latest version + Teniu la versió més recent + + + + Failed to get information about the latest version. + Error a l'intentar obtenir informació sobre actualitzacions. + + + + Unable to connect via DBus + No s'ha pogut connectar mitjançant DBus + + + + GeneneralConf + + Show help message + Mostra el missatge d'ajuda + + + Show the help message at the beginning in the capture mode. + Mostra el missatge d'ajuda en iniciar el mode de captura. + + + Show desktop notifications + Mostra les notificacions d'escriptori + + + Show tray icon + Mostra la icona en la barra de tasques + + + Show the systemtray icon + Mostra la icona en la barra de tasques + + + Import + Importar + + + Error + Error + + + Unable to read file. + Impossible llegir el fitxer. + + + Unable to write file. + Impossible escriure al fitxer. + + + Save File + Guardar Arxiu + + + Confirm Reset + Confirmar Reset + + + Are you sure you want to reset the configuration? + Esteu segur que voleu reiniciar la configuració? + + + Configuration File + Fitxer de Configuració + + + Export + Exportar + + + Reset + Reset + + + Launch at startup + Llançament a l'inici + + + + GeneralConf + + + + Import + Importar + + + + + + + Error + Error + + + + Unable to read file. + Impossible llegir el fitxer. + + + + + Unable to write file. + Impossible escriure al fitxer. + + + + Save File + Guardar Arxiu + + + + Confirm Reset + Confirmar Reset + + + + Are you sure you want to reset the configuration? + Esteu segur que voleu reiniciar la configuració? + + + + Show help message + Mostra el missatge d'ajuda + + + Show the help message at the beginning in the capture mode. + Mostra el missatge d'ajuda en iniciar el mode de captura. + + + + Show the side panel button + + + + Show the side panel toggle button in the capture mode. + Mostra el botó del calaix lateral en el mode de captura. + + + + Show desktop notifications + Mostra les notificacions d'escriptori + + + + Show tray icon + Mostra la icona en la barra de tasques + + + Show the systemtray icon + Mostra la icona a la barra de tasques del sistema + + + + Confirmation required to delete screenshot from the latest uploads + + + + + Configuration File + Fitxer de Configuració + + + + Export + Exportar + + + + Reset + + + + + Automatic check for updates + + + + + Allow multiple flameshot GUI instances simultaneously + + + + This allows you to take screenshots of flameshot itself for example. + This allows you to take screenshots of flameshot itself for example. + + + Launch Flameshot + Inicia el Flameshot + + + + Show welcome message on launch + + + + + Use large predefined color palette + + + + + Copy URL after upload + + + + Copy URL and close window after upload + Copia la URL i tanca la finestra després de la càrrega + + + + Save image after copy + + + + Save image file after copying it + Desa el fitxer d'imatge després d'haver-lo copiat + + + + Show the help message at the beginning in the capture mode + + + + + Use last region for GUI mode + Use last region for GUI mode + + + + Use the last region as the default selection for the next screenshot in GUI mode + Use the last region as the default selection for the next screenshot in GUI mode + + + + Show the side panel toggle button in the capture mode + + + + + Enable desktop notifications + + + + + Show abort notifications + + + + + Enable abort notifications + + + + + Show icon in the system tray + + + + + Use grim to capture screenshots + + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + + + + + Ask for confirmation to delete screenshot from the latest uploads + + + + + Check for updates automatically + + + + + This allows you to take screenshots of Flameshot itself for example + + + + + Show the welcome message box in the middle of the screen while taking a screenshot + + + + + Use a large predefined color palette + + + + + Copy on double click + + + + + Automatically unload from memory when it is not needed + + + + + Automatically close daemon (background process) when it is not needed + + + + + Launch in background at startup + + + + + Launch Flameshot daemon (background process) when computer is booted + + + + + Ask before quit capture + + + + + Show the confirmation prompt before ESC quit + + + + + Enable Copy to clipboard on Double Click + + + + + Copy URL after uploading was successful + + + + + After copying the screenshot, save it to a file as well + + + + + Save Path + + + + + Change... + + + + + Use fixed path for screenshots to save + + + + + Preferred save file extension: + + + + + Latest Uploads Max Size + + + + + Imgur Application Client ID + + + + + Undo limit + + + + + Use JPG format for clipboard (PNG default) + + + + + Use lossy JPG format for clipboard (lossless PNG default) + + + + + Copy file path after save + + + + + Copy the file path to clipboard after the file is saved + + + + + Anti-aliasing image when zoom the pinned image + + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + + + + + + Upload image without confirmation + + + + + Choose a Folder + + + + + Unable to write to directory. + + + + + Show magnifier + + + + + Enable a magnifier while selecting the screenshot area + + + + + Square shaped magnifier + + + + + Make the magnifier to be square-shaped + + + + + Milliseconds before geometry display hides; 0 means do not hide + + + + + Set geometry display timeout (ms) + + + + + Selection Geometry Display + + + + + Display Location + + + + + None + + + + + Top Left + + + + + Top Right + + + + + Bottom Left + + + + + Bottom Right + + + + + Center + + + + + Quality range of 0-100; Higher number is better quality and larger file size + + + + + JPEG Quality + + + + + Reverse arrow + + + + + Draw the arrow head first + + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + Últimes càrregues + + + Screenshots history is empty + L'historial de captures de pantalla és buit + + + Copy URL + Copia l'URL + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Open in browser + Obre al navegador + + + Confirm to delete + Confirmeu per esborrar + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Esteu segur de voler esborrar la captura de les últimes càrregues i del servidor? + + + + ImgS3Uploader + + Uploading Image + S'està pujant la imatge + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Error + Error + + + + ImgUploadDialog + + + Upload Confirmation + + + + + Do you want to upload this capture? + + + + + + Upload without confirmation + + + + + ImgUploader + + Uploading Image + S'està pujant la imatge + + + Delete image + Esborra la imatge + + + Unable to open the URL. + No es pot obrir l'URL. + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + Copy URL + Copia l'URL + + + Open URL + Obri l'URL + + + Image to Clipboard. + Imatge al porta-retalls. + + + + ImgUploaderBase + + + Upload image + + + + + Uploading Image + S'està pujant la imatge + + + + Copy URL + Copia l'URL + + + + Open URL + + + + + Delete image + Esborra la imatge + + + + Image to Clipboard. + Imatge al porta-retalls. + + + + Save image + + + + + Unable to open the URL. + No es pot obrir l'URL. + + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + + Unable to save the screenshot to disk. + + + + + Screenshot saved. + + + + + ImgUploaderTool + + + Image Uploader + Puja la imatge + + + + Upload the selection + + + + + ImgurUploader + + Upload to Imgur + Puja a Imgur + + + Uploading Image + S'està pujant la imatge + + + Copy URL + Copia l'URL + + + Open URL + Obre l'URL + + + Delete image + Esborra la imatge + + + Image to Clipboard. + Imatge al porta-retalls. + + + + Unable to open the URL. + No es pot obrir l'URL. + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + + ImgurUploaderTool + + Image Uploader + Puja la imatge + + + Upload the selection to Imgur + Puja la selecció a Imgur + + + + InfoWindow + + + + About + + + + + + Icon + + + + + + License + + + + + + GPLv3+ + + + + + + Version + + + + + + Flameshot v + + + + + + OS Info + + + + + + Copy Info + + + + Right Click + Clic dret + + + Mouse Wheel + Roda del ratolí + + + Move selection 1px + Mou la selecció 1 px + + + Resize selection 1px + Redimensiona la selecció 1 px + + + Quit capture + Ix de la captura + + + Copy to clipboard + Copia al porta-retalls + + + Save selection as a file + Guarda la selecció com a fitxer + + + Undo the last modification + Desfés l'última modificació + + + Show color picker + Mostra el selector de color + + + Change the tool's thickness + Canvia el gruix de l'eina + + + Key + Tecla + + + Description + Descripció + + + <u><b>License</b></u> + <u><b>Llicència</b></u> + + + <u><b>Version</b></u> + <u><b>Versió</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Dreceres</b></u> + + + Available shortcuts in the screen capture mode. + Dreceres disponibles en el mode de captura de pantalla. + + + + InvertTool + + + Invert + + + + + Set Inverter as the paint tool + + + + + LineTool + + + Line + + + + + Set the Line as the paint tool + + + + + MarkerTool + + + Marker + + + + + Set the Marker as the paint tool + + + + + MoveTool + + + Move + + + + + Move the selection area + + + + + PencilTool + + + Pencil + + + + + Set the Pencil as the paint tool + + + + + PinTool + + + Pin Tool + + + + + Pin image on the desktop + + + + + PinWidget + + + Context menu + + + + + Copy to clipboard + Copia al porta-retalls + + + + Save to file + + + + + Rotate Right + + + + + Rotate Left + + + + + Increase Opacity + + + + + Decrease Opacity + + + + + Close + + + + + PixelateTool + + + Pixelate + + + + + Set Pixelate as the paint tool. + + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QObject + + + + Capture saved to clipboard. + + + + + Error while saving to clipboard + + + + + Save screenshot + + + + + Path copied to clipboard as + + + + Saving canceled + Saving canceled + + + Save canceled + Save canceled + + + Capture is saved and copied to the clipboard as + La captura serà desada i copiada al porta-retalls com a + + + + Save Error + + + + + + Capture saved as + + + + + + Error trying to save as + + + + + Unable to connect via DBus + No s'ha pogut connectar mitjançant DBus + + + + Powerful yet simple to use screenshot software. + + + + + See + + + + + Open the capture launcher. + + + + + Start a manual capture in GUI mode. + + + + + Configure + + + + Path where the capture will be saved + Camí on es desarà la captura + + + + Capture screenshot of all monitors at the same time. + + + + + Capture a screenshot of the specified monitor. + + + + + Existing directory or new file to save to + + + + + Save the capture to the clipboard + + + + + Pin the capture to the screen + + + + + Upload screenshot + + + + + Delay time in milliseconds + + + + + Repeat screenshot with previously selected region + + + + + Screenshot region to select + + + + + Set the filename pattern + + + + + Accept capture as soon as a selection is made + + + + + Enable or disable the trayicon + + + + + Enable or disable run at startup + + + + + Enable or disable the notifications + + + + + Check the configuration for errors + + + + + Show the help message in the capture mode + + + + + Define the main UI color + + + + + Define the contrast UI color + + + + + Print raw PNG capture + + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + + + + + Define the screen to capture (starting from 0) + + + + + Invalid delay, it must be a number greater than 0 + + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + + + + + Invalid path, must be an existing directory or a new file in an existing directory + + + + Define the screen to capture + Define the screen to capture + + + + default: screen containing the cursor + + + + + Screen number + + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + + + + Invalid delay, it must be higher than 0 + Invalid delay, it must be higher than 0 + + + + Invalid screen number, it must be non negative + + + + Invalid path, it must be a real path in the system + Invalid path, it must be a real path in the system + + + + Invalid value, it must be defined as 'true' or 'false' + + + + + Error + Error + + + + Unable to write in + + + + + Requested screen exceeds screen count + + + + + Full screen screenshot pinned to screen + + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + + Options + + + + + Subcommands + + + + + subcommands + + + + + Usage + + + + + options + + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + + + + Toggle side panel + Toggle side panel + + + Resize selection left 1px + Resize selection left 1px + + + Resize selection right 1px + Resize selection right 1px + + + Resize selection up 1px + Resize selection up 1px + + + Resize selection down 1px + Resize selection down 1px + + + Select entire screen + Select entire screen + + + Move selection left 1px + Move selection left 1px + + + Move selection right 1px + Move selection right 1px + + + Move selection up 1px + Move selection up 1px + + + Move selection down 1px + Move selection down 1px + + + Commit text in text area + Commit text in text area + + + Delete current tool + Delete current tool + + + + Quit capture + Ix de la captura + + + + Screenshot history + + + + + Capture screen + + + + + Show color picker + Mostra el selector de color + + + + Change the tool's size + + + + Change the tool's thickness + Canvia el gruix de l'eina + + + + RectangleTool + + + Rectangle + + + + + Set the Rectangle as the paint tool + + + + + RedoTool + + + Redo + + + + + Redo the next modification + + + + + SaveTool + + + Save + + + + + Save screenshot to a file + + + + Save the capture + Guarda la captura + + + + ScreenGrabber + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + + + + + Unable to capture screen + + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + + + + + Set Selection as the paint tool + + + + + SetShortcutDialog + + + Set Shortcut + + + + + Enter new shortcut to change + + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + + + + + + Flameshot must be restarted for changes to take effect. + + + + + ShortcutsWidget + + + Hot Keys + + + + + Available shortcuts in the screen capture mode. + Dreceres disponibles en el mode de captura de pantalla. + + + + Description + Descripció + + + + Key + Tecla + + + + Left Double-click + Left Double-click + + + + Toggle side panel + Toggle side panel + + + + Grab a color from the screen + + + + + Resize selection left 1px + Resize selection left 1px + + + + Resize selection right 1px + Resize selection right 1px + + + + Resize selection up 1px + Resize selection up 1px + + + + Resize selection down 1px + Resize selection down 1px + + + + Symmetrically decrease width by 2px + + + + + Symmetrically increase width by 2px + + + + + Symmetrically increase height by 2px + + + + + Symmetrically decrease height by 2px + + + + + Select entire screen + Select entire screen + + + + Move selection left 1px + Move selection left 1px + + + + Move selection right 1px + Move selection right 1px + + + + Move selection up 1px + Move selection up 1px + + + + Move selection down 1px + Move selection down 1px + + + + Commit text in text area + Commit text in text area + + + + Delete selected drawn object + + + + + Cancel current selection + + + + + Capture screen + + + + + Screenshot history + + + + + SidePanelWidget + + Active thickness: + Active thickness: + + + Active color: + Active color: + + + Press ESC to cancel + Press ESC to cancel + + + + Active tool size: + + + + + Active Color: + + + + + Grab Color + + + + + Display grid + + + + + SizeDecreaseTool + + + Decrease Tool Size + + + + + Decrease the size of the other tools + + + + + SizeIncreaseTool + + + Increase Tool Size + + + + + Increase the size of the other tools + + + + + SizeIndicatorTool + + Show the dimensions of the selection (X Y) + Mostra les mides de la selecció (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + + + + + Year (00-99) + + + + + Year (2000) + + + + + Month Name (jan) + + + + + Month Name (january) + + + + + Month (01-12) + + + + + Week Day (1-7) + + + + + Week (01-53) + + + + + Day Name (mon) + + + + + Day Name (monday) + + + + + Day (01-31) + + + + + Day of Month (1-31) + + + + + Day (001-366) + + + + + Hour (00-23) + + + + + Hour (01-12) + + + + + Minute (00-59) + + + + + Second (00-59) + + + + + Full Date (%m/%d/%y) + + + + + Full Date (%Y-%m-%d) + + + + + Full Date (%d-%m-%Y) + + + + + Time (%H-%M-%S) + + + + + Time (%H-%M) + + + + + SystemNotification + + + Flameshot Info + + + + + TextConfig + + + StrikeOut + + + + + Underline + + + + + Bold + + + + + Italic + + + + + Left Align + + + + + Center Align + + + + + Right Align + + + + + TextTool + + + Text + + + + + Add text to your capture + + + + + TrayIcon + + + &Take Screenshot + &Captura + + + + &Open Launcher + &Obre el llançador d'aplicacions + + + + &Configuration + &Ajustaments + + + + &About + &Quant a + + + + Check for updates + Comprova si hi ha actualitzacions disponibles + + + + New version %1 is available + La nova versió %1 ja és disponible + + + + &Quit + &Surt + + + + &Latest Uploads + &Últimes càrregues + + + + &Open Save Path + + + + + UIcolorEditor + + UI Color Editor + Editor de color de la interfície + + + + Change the color moving the selectors and see the changes in the preview buttons. + + + + + Select a Button to modify it + + + + + Main Color + + + + + Click on this button to set the edition mode of the main color. + + + + + Contrast Color + + + + + Click on this button to set the edition mode of the contrast color. + + + + + UndoTool + + + Undo + + + + + Undo the last modification + Desfés l'última modificació + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + + + + + Ignore + + + + + Later + + + + + Update + + + + + UploadHistory + + + Upload History + + + + + Screenshots history is empty + L'historial de captures de pantalla és buit + + + + UploadLineItem + + + Form + + + + + TextLabel + + + + + Copy URL + Copia l'URL + + + + Open In Browser + + + + + Confirm to delete + Confirmeu per esborrar + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Esteu segur de voler esborrar la captura de les últimes càrregues i del servidor? + + + + UtilityPanel + + + Close + + + + + <Empty> + + + + + VisualsEditor + + + Opacity of area outside selection: + + + + + UI Color Editor + Editor de color de la interfície + + + + Colorpicker Editor + + + + + Button Selection + + + + + Select All + + + + + color_widgets::ColorDialog + + + Pick + + + + + color_widgets::ColorPalette + + + Unnamed + + + + + color_widgets::ColorPaletteModel + + + Unnamed + + + + + %1 (%2 colors) + + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + + + + + + Create a new palette + + + + + + Duplicate the current palette + + + + + + Delete the current palette + + + + + + Revert changes to the current palette + + + + + + Save changes to the current palette + + + + + + Add a color to the palette + + + + + + Remove the selected color from the palette + + + + + + New Palette + + + + + + Name + + + + + GIMP Palettes (*.gpl) + + + + + Palette Image (%1) + + + + + All Files (*) + + + + + + Open Palette + + + + + Failed to load the palette file +%1 + + + + + color_widgets::GradientEditor + + + Add Color + + + + + Remove Color + + + + + Edit Color... + + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + + + + + color_widgets::Swatch + + + Clear Color + + + + + %1 (%2) + + + + diff --git a/data/translations/Internationalization_th.ts b/data/translations/Internationalization_th.ts new file mode 100644 index 0000000..8fba5f4 --- /dev/null +++ b/data/translations/Internationalization_th.ts @@ -0,0 +1,3171 @@ + + + + + AbstractWidgetList + + + Add New + เพิ่มใหม่ + + + + Move Up + ย้ายขึ้น + + + + Move Down + ย้ายลง + + + + Remove + ลบ + + + + AcceptTool + + + Accept + ยอมรับ + + + + Accept the capture + ยอมรับการจับภาพ + + + + AppLauncher + + + App Launcher + ตัวเปิดแอป + + + + Choose an app to open the capture + เลือกแอปเพื่อเปิดการจับภาพ + + + + AppLauncherWidget + + + Open With + เปิดด้วย + + + + Launch in terminal + เปิดในเทอร์มินัล + + + + Keep open after selection + เปิดต่อไปหลังจากเลือกแล้ว + + + + + Error + ผิดพลาด + + + + Unable to launch in terminal. + ไม่สามารถเปิดในเทอร์มินัลได้ + + + + Unable to write in + ไม่สามารถเขียนได้ + + + + ArrowTool + + + Arrow + ลูกศร + + + + Set the Arrow as the paint tool + ตั้งค่าลูกศรเป็นเครื่องมือระบายสี + + + + BlurTool + + Blur + Desenfocament + + + Set Blur as the paint tool + Estableix el desenfocament com a eina de dibuix + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Mode de captura</b> + + + + Rectangular Region + บริเวณสี่เหลี่ยมผืนผ้า + + + + Full Screen (Current Display) + เต็มจอ (จอแสดงผลปัจจุบัน) + + + + Full Screen (All Monitors) + เต็มจอ (ทุกจอ) + + + + No Delay + หน่วงเวลา + + + + second + วินาที + + + + + + seconds + วินาที + + + + + Take new screenshot + ถ่ายภาพหน้าจอใหม่ + + + + + Area: + พื้นที่: + + + + + Capture Launcher + ตัวเรียกใช้การจับภาพ + + + + + TextLabel + ป้ายข้อความ + + + + + Capture Mode + โหมดจับภาพ + + + + + Delay: + หน่วงเวลา: + + + + + WxH+x+y + กว้าง×สูง×ลึก×ยาว + + + + CaptureWidget + + + Unable to capture screen + Impossible capturar la pantalla + ไม่สามารถจับภาพหน้าจอได้ + + + + Mouse + เม้าส์ + + + + Select screenshot area + เลือกพื้นที่จับภาพหน้าจอ + + + + Mouse Wheel + ล้อเลื่อนของเมาส์ + + + + Change tool size + เปลี่ยนขนาดเครื่องมือ + + + + Right Click + คลิกขวา + + + + Show color picker + แสดงตัวเลือกสี + + + + Open side panel + เปิดแผงด้านข้าง + + + + Esc + Esc + + + + Exit + ออก + + + + Quit Capture + + + + + Are you sure you want to quit capture? + + + + + Do not show this again + + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot เสียโฟกัส แป้นพิมพ์ลัดจะไม่ทำงานจนกว่าคุณจะคลิกที่ใดที่หนึ่ง + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + ผิดพลาดในการกำหนดค่าที่แก้ไขแล้ว เปิด `flameshot gui` อีกครั้งเพื่อใช้งาน + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Escolliu una àrea amb el ratolí, o premeu Esc per sortir. +Premeu Entrar per capturar la pantalla. +Premeu clic dret per mostrar l'eina de selecció de color. +Gireu la rodeta del ratolí per canviar el gruix de l'eina de dibuix. +Premeu Espai per obrir el calaix lateral. + + + + Tool Settings + ตั้งค่าเครื่องมือ + + + + CircleCountTool + + + Circle Counter + วงกลม + + + + Add an autoincrementing counter bubble + เพิ่มตัวนับฟองแบบเพิ่มอัตโนมัติ + + + + CircleTool + + + Circle + วงกลม + + + + Set the Circle as the paint tool + ตั้งวงกลมเป็นเครื่องมือระบายสี + + + + ColorDialog + + + + Select Color + เลือกสี + + + + + Saturation + ความอิ่มตัว + + + + + Hue + สีสัน + + + + + Hex + Hex + + + + + Blue + สีฟ้า + + + + + Value + ค่า + + + + + Green + สีเขียว + + + + + Alpha + อัลฟ่า + + + + + Red + สีแดง + + + + ColorGrabWidget + + + Accept color + ยอมรับสี + + + + Enter or Left Click + เข้าหรือคลิกซ้าย + + + + Precisely select color + เลือกสีได้อย่างแม่นยำ + + + + Hold Left Click + คลิกซ้ายค้างไว้ + + + + Toggle magnifier + สลับการขยาย + + + + Space or Right Click + วรรคหรือคลิกขวา + + + + Cancel + ยกเลิก + + + + Esc + Esc + + + + ColorPickerEditor + + + Edit Preset: + แก้ไขตั้งค่าล่วงหน้า: + + + + Enter color to update preset + ป้อนสีเพื่ออัปเดตค่าไว้ล่วงหน้า + + + + Update + อัปเดต + + + + Press button to update the selected preset + กดปุ่มเพื่ออัพเดตค่าที่เลือกไว้ล่วงหน้า + + + + Delete + ลบ + + + + Press button to delete the selected preset + กดปุ่มเพื่อเลือกลบค่าที่ตั้งไว้ล่วงหน้า + + + + Add Preset: + เพิ่มค่าที่ตั้งไว้ล่วงหน้า: + + + + Enter color manually or select it using the color-wheel + ป้อนสีด้วยตนเองหรือเลือกโดยใช้วงล้อสี + + + + Add + เพิ่ม + + + + Press button to add preset + กดปุ่มเพื่อเพิ่มค่าที่ตั้งไว้ล่วงหน้า + + + + + Error + ผิดพลาด + + + + Unable to add preset. Maximum limit reached. + ไม่สามารถเพิ่มค่าที่ตั้งล่วงหน้าได้ เนื่องจากถึงขีดจำกัดสูงสุดแล้ว + + + + Unable to remove preset. Minimum limit reached. + ไม่สามารถลบค่าที่ตั้งล่วงหน้าได้ ถึงขีดจำกัดขั้นต่ำแล้ว + + + + ConfigErrorDetails + + + Configuration errors + การกำหนดค่าผิดพลาด + + + + ConfigHandler + + + Unrecognized setting: '%1' + + ตั้งค่าที่ไม่รู้จัก: '%1' + + + + + Unrecognized shortcut name: '%1'. + + ชื่อทางลัดที่ไม่รู้จัก: '%1' + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + ทางลัด: '%1' และ '%2' มีทางลัดเดียวกัน: %3 + + + + + Bad value in '%1'. Expected: %2 + + ค่าไม่ถูกต้องใน '%1' คาดว่า: %2 + + + + + You have successfully resolved the configuration error. + คุณได้แก้ไขข้อผิดพลาดในการกำหนดค่าสำเร็จแล้ว + + + + The configuration contains an error. Open configuration to resolve. + กำหนดค่ามีข้อผิดพลาด เปิดกำหนดค่าเพื่อแก้ไข + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + คีย์การกำหนดค่า '%1' ใน ConfigHandler ไม่ถูกต้อง โปรดรายงานข้อผิดพลาด + + + + ConfigResolver + + + Resolve configuration errors + แก้ไขข้อผิดพลาดในการกำหนดค่า + + + + <b>You must resolve all errors before continuing:</b> + <b>คุณต้องแก้ไขข้อผิดพลาดทั้งหมดก่อนดำเนินการต่อ:</b> + + + + Reset + รีเซ็ต + + + + Reset to the default value. + รีเซ็ตเป็นค่าเริ่มต้น + + + + Remove + ลบ + + + + Remove this setting. + ลบการตั้งค่านี้ + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + แป้นลัดบางปุ่มอาจมีปัญหาขัดแย้งกัน การดำเนินการนี้จะไม่ป้องกันไม่ให้ Flameshot เริ่มทำงาน แก้ไขปัญหาในไฟล์กำหนดค่า + + + + Resolve all + แก้ไขทั้งหมด + + + + Resolve all listed errors. + แก้ไขข้อผิดพลาดทั้งหมดที่ระบุไว้ + + + + Details + รายละเอียด + + + + ConfigWindow + + + Configuration + การกำหนดค่า + + + + Interface + อินเทอร์เฟซ + + + + Filename Editor + แก้ไขชื่อไฟล์ + + + + General + ทั่วไป + + + + Shortcuts + ทางลัด + + + + Resolve + แก้ปัญหา + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>ไฟล์การกำหนดค่ามีข้อผิดพลาด โปรดแก้ไขก่อนดำเนินการต่อ</b> + + + + Controller + + New version %1 is available + La nova versió %1 ja és disponible + + + You have the latest version + Teniu la versió més recent + + + Failed to get information about the latest version. + Error a l'intentar obtenir informació sobre actualitzacions. + + + Error + Error + + + Unable to close active modal widgets + No s'han pogut tancar els widgets modals actius + + + &Open Launcher + &Obre el llançador d'aplicacions + + + &Configuration + &Ajustaments + + + &About + &Quant a + + + Check for updates + Comprova si hi ha actualitzacions disponibles + + + &Latest Uploads + &Últimes càrregues + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + &Information + &Informació + + + &Quit + &Surt + + + &Take Screenshot + &Captura + + + + CopyTool + + + Copy + คัดลอก + + + + Copy selection to clipboard + คัดลอกที่เลือกไปยังคลิปบอร์ด + + + Copy the selection into the clipboard + Copia la selecció al porta-retalls + + + + DBusUtils + + Unable to connect via DBus + No s'ha pogut connectar mitjançant DBus + + + + ExitTool + + + Exit + ออก + + + + Leave the capture screen + ออกจากหน้าจอจับภาพ + + + + FileNameEditor + + + Edit the name of your captures: + แก้ไขชื่อการจับภาพของคุณ: + + + + Edit: + แก้ไข: + + + + Preview: + ตัวอย่าง: + + + + Save + บันทึก + + + + Saves the pattern + บันทึกรูปแบบ + + + + Restore + คืนค่า + + + Reset + Reinicialitza + + + + Restores the saved pattern + คืนค่ารูปแบบที่บันทึกไว้ + + + + Clear + ล้าง + + + + Deletes the name + ลบชื่อ + + + + Flameshot + + + Error + ผิดพลาด + + + + Unable to close active modal widgets + ไม่สามารถปิดวิดเจ็ตโมดอลที่ใช้งานได้ + + + + URL copied to clipboard. + คัดลอก URL ไปยังคลิปบอร์ด + + + + FlameshotDaemon + + + New version %1 is available + เวอร์ชันใหม่ %1 พร้อมให้บริการแล้ว + + + + You have the latest version + คุณมีเวอร์ชั่นล่าสุด + + + + Failed to get information about the latest version. + ไม่สามารถรับข้อมูลเกี่ยวกับเวอร์ชั่นล่าสุดได้ + + + + Unable to connect via DBus + ไม่สามารถเชื่อมต่อผ่าน DBus ได้ + + + + GeneneralConf + + Show help message + Mostra el missatge d'ajuda + + + Show the help message at the beginning in the capture mode. + Mostra el missatge d'ajuda en iniciar el mode de captura. + + + Show desktop notifications + Mostra les notificacions d'escriptori + + + Show tray icon + Mostra la icona en la barra de tasques + + + Show the systemtray icon + Mostra la icona en la barra de tasques + + + Import + Importar + + + Error + Error + + + Unable to read file. + Impossible llegir el fitxer. + + + Unable to write file. + Impossible escriure al fitxer. + + + Save File + Guardar Arxiu + + + Confirm Reset + Confirmar Reset + + + Are you sure you want to reset the configuration? + Esteu segur que voleu reiniciar la configuració? + + + Configuration File + Fitxer de Configuració + + + Export + Exportar + + + Reset + Reset + + + Launch at startup + Llançament a l'inici + + + + GeneralConf + + + + Import + นำเข้า + + + + + + + Error + ผิดพลาด + + + + Unable to read file. + ไม่สามารถอ่านไฟล์ได้ + + + + + Unable to write file. + ไม่สามารถเขียนไฟล์ได้ + + + + Save File + บันทึกไฟล์ + + + + Confirm Reset + ยืนยันการรีเซ็ต + + + + Are you sure you want to reset the configuration? + คุณแน่ใจว่าต้องการรีเซ็ตการกำหนดค่าหรือไม่? + + + + Show help message + แสดงข้อความช่วยเหลือ + + + Show the help message at the beginning in the capture mode. + Mostra el missatge d'ajuda en iniciar el mode de captura. + + + + Show the side panel button + แสดงแผงปุ่มด้านข้าง + + + Show the side panel toggle button in the capture mode. + Mostra el botó del calaix lateral en el mode de captura. + + + + Show desktop notifications + แสดงแจ้งเตือนบนเดสก์ท็อป + + + + Show tray icon + แสดงถาดไอคอน + + + Show the systemtray icon + Mostra la icona a la barra de tasques del sistema + + + + Confirmation required to delete screenshot from the latest uploads + จำเป็นต้องมีการยืนยันลบภาพหน้าจอจากการอัพโหลดล่าสุด + + + + Configuration File + ไฟล์การกำหนดค่า + + + + Export + ส่งออก + + + + Reset + รีเซ็ต + + + + Automatic check for updates + ตรวจสอบการอัปเดตอัตโนมัติ + + + + Allow multiple flameshot GUI instances simultaneously + อนุญาตให้มีอินสแตนซ์ GUI ของ Flameshot หลายรายการพร้อมกัน + + + This allows you to take screenshots of flameshot itself for example. + This allows you to take screenshots of flameshot itself for example. + + + Automatically close daemon when it is not needed + ปิด Daemon โดยอัตโนมัติเมื่อไม่จำเป็น + + + Launch at startup + เปิดเมื่อเริ่มต้น + + + Launch Flameshot + Inicia el Flameshot + + + + Show welcome message on launch + แสดงข้อความต้อนรับเมื่อเปิดโปรแกรม + + + + Use large predefined color palette + ใช้จานสีที่กำหนดไว้ล่วงหน้าขนาดใหญ่ + + + + Copy URL after upload + คัดลอก URL หลังจากอัพโหลด + + + Copy URL and close window after upload + Copia la URL i tanca la finestra després de la càrrega + + + + Save image after copy + บันทึกภาพหลังการคัดลอก + + + Save image file after copying it + Desa el fitxer d'imatge després d'haver-lo copiat + + + + Show the help message at the beginning in the capture mode + แสดงข้อความช่วยเหลือในตอนเริ่มโปรแกรมในโหมดจับภาพ + + + + Use last region for GUI mode + ใช้ภูมิภาคสุดท้ายสำหรับโหมด GUI + + + + Use the last region as the default selection for the next screenshot in GUI mode + ใช้ภูมิภาคสุดท้ายเป็นตัวเลือกเริ่มต้นสำหรับภาพหน้าจอถัดไปในโหมด GUI + + + + Show the side panel toggle button in the capture mode + แสดงปุ่มสลับแผงด้านข้างในโหมดถ่ายภาพ + + + + Enable desktop notifications + เปิดใช้งานการแจ้งเตือนบนเดสก์ท็อป + + + + Show abort notifications + + + + + Enable abort notifications + + + + + Show icon in the system tray + แสดงไอคอนในถาดระบบ + + + + Use grim to capture screenshots + + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + + + + + Ask for confirmation to delete screenshot from the latest uploads + ขอคำยืนยันการลบภาพหน้าจอจากการอัพโหลดล่าสุด + + + + Check for updates automatically + ตรวจสอบการอัปเดตโดยอัตโนมัติ + + + + This allows you to take screenshots of Flameshot itself for example + สิ่งนี้ทำให้คุณสามารถจับภาพหน้าจอของ Flameshot ได้ ตัวอย่างเช่น + + + Launch Flameshot daemon when computer is booted + เปิดใช้งาน Daemon Flameshot เมื่อบูตคอมพิวเตอร์แล้ว + + + + Show the welcome message box in the middle of the screen while taking a screenshot + แสดงกล่องข้อความต้อนรับตรงกลางหน้าจอขณะทำการจับภาพหน้าจอ + + + + Use a large predefined color palette + ใช้สีที่กำหนดไว้ล่วงหน้าขนาดใหญ่ + + + + Copy on double click + คัดลอกเมื่อดับเบิลคลิก + + + Enable Copy on Double Click + เปิดใช้งานการคัดลอกเมื่อดับเบิลคลิก + + + Copy URL and close window after uploading was successful + คัดลอก URL และปิดหน้าต่างหลังจากการอัพโหลดสำเร็จ + + + + Automatically unload from memory when it is not needed + + + + + Automatically close daemon (background process) when it is not needed + + + + + Launch in background at startup + + + + + Launch Flameshot daemon (background process) when computer is booted + + + + + Ask before quit capture + + + + + Show the confirmation prompt before ESC quit + + + + + Enable Copy to clipboard on Double Click + + + + + Copy URL after uploading was successful + + + + + After copying the screenshot, save it to a file as well + หลังจากคัดลอกภาพหน้าจอแล้ว ให้บันทึกลงในไฟล์ด้วย + + + + Save Path + เส้นทางบันทึก + + + + Change... + เปลี่ยน... + + + + Use fixed path for screenshots to save + ใช้เส้นทางคงที่สำหรับบันทึกภาพหน้าจอ + + + + Preferred save file extension: + นามสกุลไฟล์ที่ต้องการบันทึก: + + + + Latest Uploads Max Size + ขนาดสูงสุดของการอัพโหลดล่าสุด + + + + Imgur Application Client ID + รหัสไคลเอนต์แอปพลิเคชัน Imgur + + + + Undo limit + ยกเลิกการจำกัด + + + + Use JPG format for clipboard (PNG default) + ใช้รูปแบบ JPG สำหรับคลิปบอร์ด (ค่าเริ่มต้นคือ PNG) + + + + Use lossy JPG format for clipboard (lossless PNG default) + + + + + Copy file path after save + คัดลอกเส้นทางไฟล์หลังจากบันทึก + + + + Copy the file path to clipboard after the file is saved + คัดลอกเส้นทางไฟล์ไปยังคลิปบอร์ดหลังจากบันทึกไฟล์แล้ว + + + + Anti-aliasing image when zoom the pinned image + ลดรอยหยักของภาพเมื่อซูมภาพที่ปักหมุดไว้ + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + หลังจากซูมภาพที่ปักหมุดแล้ว ภาพควรจะเรียบเนียนขึ้นหรือยังคงเป็นแบบพิกเซล + + + + + Upload image without confirmation + อัพโหลดรูปภาพโดยไม่ต้องยืนยัน + + + + Choose a Folder + เลือกโฟลเดอร์ + + + + Unable to write to directory. + ไม่สามารถเขียนลงไดเร็กทอรีได้ + + + + Show magnifier + แสดงแว่นขยาย + + + + Enable a magnifier while selecting the screenshot area + เปิดใช้งานแว่นขยายขณะเลือกพื้นที่ถ่ายภาพหน้าจอ + + + + Square shaped magnifier + แว่นขยายทรงสี่เหลี่ยม + + + + Make the magnifier to be square-shaped + ทำแว่นขยายให้เป็นรูปสี่เหลี่ยมจัตุรัส + + + + Milliseconds before geometry display hides; 0 means do not hide + + + + + Set geometry display timeout (ms) + + + + + Selection Geometry Display + + + + + Display Location + + + + + None + + + + + Top Left + + + + + Top Right + + + + + Bottom Left + + + + + Bottom Right + + + + + Center + + + + + Quality range of 0-100; Higher number is better quality and larger file size + + + + + JPEG Quality + + + + + Reverse arrow + + + + + Draw the arrow head first + + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + Últimes càrregues + + + Screenshots history is empty + L'historial de captures de pantalla és buit + + + Copy URL + Copia l'URL + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Open in browser + Obre al navegador + + + Confirm to delete + Confirmeu per esborrar + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Esteu segur de voler esborrar la captura de les últimes càrregues i del servidor? + + + + ImgS3Uploader + + Uploading Image + S'està pujant la imatge + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Error + Error + + + + ImgUploadDialog + + + Upload Confirmation + ยืนยันการอัพโหลด + + + + Do you want to upload this capture? + คุณต้องการอัพโหลดการถ่ายภาพนี้หรือไม่? + + + + + Upload without confirmation + อัพโหลดโดยไม่ต้องยืนยัน + + + + ImgUploader + + Uploading Image + S'està pujant la imatge + + + Delete image + Esborra la imatge + + + Unable to open the URL. + No es pot obrir l'URL. + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + Copy URL + Copia l'URL + + + Open URL + Obri l'URL + + + Image to Clipboard. + Imatge al porta-retalls. + + + + ImgUploaderBase + + + Upload image + อัพโหลดรูปภาพ + + + + Uploading Image + กำลังอัพโหลดรูปภาพ + + + + Copy URL + คัดลอก URL + + + + Open URL + เปิด URL + + + + Delete image + ลบรูปภาพ + + + + Image to Clipboard. + รูปภาพไปยังคลิปบอร์ด + + + + Save image + บันทึกภาพ + + + + Unable to open the URL. + ไม่สามารถเปิด URL ได้ + + + + URL copied to clipboard. + คัดลอก URL ไปยังคลิปบอร์ดแล้ว + + + + Screenshot copied to clipboard. + คัดลอกภาพหน้าจอไปยังคลิปบอร์ดแล้ว + + + + Unable to save the screenshot to disk. + ไม่สามารถบันทึกภาพหน้าจอลงดิสก์ได้ + + + + Screenshot saved. + บันทึกภาพหน้าจอแล้ว + + + + ImgUploaderTool + + + Image Uploader + อัพโหลดรูปภาพ + + + + Upload the selection + อัพโหลดที่เลือก + + + + ImgurUploader + + Upload to Imgur + Puja a Imgur + + + Uploading Image + S'està pujant la imatge + + + Copy URL + Copia l'URL + + + Open URL + Obre l'URL + + + Delete image + Esborra la imatge + + + Image to Clipboard. + Imatge al porta-retalls. + + + + Unable to open the URL. + ไม่สามารถเปิด URL ได้ + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + + ImgurUploaderTool + + Image Uploader + Puja la imatge + + + Upload the selection to Imgur + Puja la selecció a Imgur + + + + InfoWindow + + + + About + เกี่ยวกับ + + + + + Icon + ไอคอน + + + + + License + ใบอนุญาต + + + + + GPLv3+ + GPLv3+ + + + + + Version + เวอร์ชัน + + + + + Flameshot v + Flameshot v + + + + + OS Info + ข้อมูลระบบปฏิบัติการ + + + + + Copy Info + คัดลอกข้อมูล + + + Right Click + Clic dret + + + Mouse Wheel + Roda del ratolí + + + Move selection 1px + Mou la selecció 1 px + + + Resize selection 1px + Redimensiona la selecció 1 px + + + Quit capture + Ix de la captura + + + Copy to clipboard + Copia al porta-retalls + + + Save selection as a file + Guarda la selecció com a fitxer + + + Undo the last modification + Desfés l'última modificació + + + Show color picker + Mostra el selector de color + + + Change the tool's thickness + Canvia el gruix de l'eina + + + Key + Tecla + + + Description + Descripció + + + <u><b>License</b></u> + <u><b>Llicència</b></u> + + + <u><b>Version</b></u> + <u><b>Versió</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Dreceres</b></u> + + + Available shortcuts in the screen capture mode. + Dreceres disponibles en el mode de captura de pantalla. + + + + InvertTool + + + Invert + พลิกกลับ + + + + Set Inverter as the paint tool + ตั้งค่าอินเวอร์เตอร์เป็นเครื่องมือทาสี + + + + LineTool + + + Line + เส้น + + + + Set the Line as the paint tool + ตั้งค่าเส้นเป็นเครื่องมือระบายสี + + + + MarkerTool + + + Marker + เครื่องหมาย + + + + Set the Marker as the paint tool + ตั้งค่ามาร์กเกอร์เป็นเครื่องมือทาสี + + + + MoveTool + + + Move + ย้าย + + + + Move the selection area + ย้ายพื้นที่ที่เลือก + + + + PencilTool + + + Pencil + ดินสอ + + + + Set the Pencil as the paint tool + ตั้งดินสอเป็นเครื่องมือระบายสี + + + + PinTool + + + Pin Tool + ปักหมุด + + + + Pin image on the desktop + ปักหมุดภาพบนเดสก์ท็อป + + + + PinWidget + + + Context menu + เมนูบริบท + + + + Copy to clipboard + คัดลอกไปยังคลิปบอร์ด + + + + Save to file + บันทึกลงในไฟล์ + + + + Rotate Right + + + + + Rotate Left + + + + + Increase Opacity + + + + + Decrease Opacity + + + + + Close + ปิด + + + + PixelateTool + + + Pixelate + พิกเซล + + + + Set Pixelate as the paint tool. + + + + Set Pixelate as the paint tool + ตั้งค่า Pixelate เป็นเครื่องมือระบายสี + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QHotkey + + Failed to register %1. Error: %2 + ไม่สามารถลงทะเบียน %1 ได้ ผิดพลาด: %2 + + + Failed to unregister %1. Error: %2 + ไม่สามารถยกเลิกการลงทะเบียน %1 ได้ ผิดพลาด: %2 + + + + QObject + + + + Capture saved to clipboard. + บันทึกการจับภาพลงในคลิปบอร์ดแล้ว + + + + Error while saving to clipboard + เกิดข้อผิดพลาดขณะบันทึกลงในคลิปบอร์ด + + + + Save screenshot + บันทึกภาพหน้าจอ + + + + Path copied to clipboard as + เส้นทางที่คัดลอกไปยังคลิปบอร์ดเป็น + + + Saving canceled + Saving canceled + + + Save canceled + Save canceled + + + Capture is saved and copied to the clipboard as + La captura serà desada i copiada al porta-retalls com a + + + + Save Error + ผิดพลาดในการบันทึก + + + + + Capture saved as + จับภาพบันทึกไว้เป็น + + + + + Error trying to save as + เกิดข้อผิดพลาดขณะพยายามบันทึกเป็น + + + + Unable to connect via DBus + ไม่สามารถเชื่อมต่อผ่าน DBus ได + + + + Powerful yet simple to use screenshot software. + ซอฟต์แวร์จับภาพหน้าจออันทรงพลังและใช้งานง่าย + + + + See + ดู + + + Capture the entire desktop. + จับภาพเดสก์ท็อปทั้งหมด + + + + Open the capture launcher. + เปิดตัวเรียกใช้งานการจับภาพ + + + + Start a manual capture in GUI mode. + เริ่มการจับภาพด้วยตนเองในโหมด GUI + + + + Configure + กำหนดค่า + + + Capture a single screen. + จับภาพหน้าจอเดียว + + + Path where the capture will be saved + Camí on es desarà la captura + + + + Capture screenshot of all monitors at the same time. + + + + + Capture a screenshot of the specified monitor. + + + + + Existing directory or new file to save to + มีไดเร็กทอรีที่มีอยู่หรือไฟล์ใหม่ที่จะบันทึก + + + + Save the capture to the clipboard + บันทึกภาพที่จับภาพไปยังคลิปบอร์ด + + + + Pin the capture to the screen + ปักหมุดจับภาพลงบนหน้าจอ + + + + Upload screenshot + อัพโหลดภาพหน้าจอ + + + + Delay time in milliseconds + หน่วงเวลาเป็นมิลลิวินาที + + + + Repeat screenshot with previously selected region + ทำซ้ำภาพหน้าจอด้วยพื้นที่ที่เลือกไว้ก่อนหน้านี้ + + + + Screenshot region to select + ถ่ายภาพหน้าจอที่เลือก + + + + Set the filename pattern + ตั้งค่ารูปแบบชื่อไฟล์ + + + + Accept capture as soon as a selection is made + จับภาพทันทีเมื่อมีการเลือก + + + + Enable or disable the trayicon + เปิดใช้งานหรือปิดใช้งานไอคอนถาด + + + + Enable or disable run at startup + เปิดใช้งานหรือปิดใช้งานอัตโนมัติเมื่อเริ่มต้นระบบ + + + + Enable or disable the notifications + + + + + Check the configuration for errors + ตรวจสอบการกำหนดค่าเพื่อหาข้อผิดพลาด + + + + Show the help message in the capture mode + แสดงข้อความช่วยเหลือในโหมดจับภาพ + + + + Define the main UI color + กำหนดสี UI หลัก + + + + Define the contrast UI color + กำหนดสี UI คอนทราสต์ + + + + Print raw PNG capture + พิมพ์ภาพ PNG แบบ RAW + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + + + + Print geometry of the selection in the format W H X Y. Does nothing if raw is specified + พิมพ์รูปทรงเรขาคณิตของการเลือกในรูปแบบ W H X Y ไม่ดำเนินการใด ๆ หากระบุข้อมูลแบบ RAW + + + + Define the screen to capture (starting from 0) + กำหนดหน้าจอที่จะจับภาพ (เริ่มจาก 0) + + + + Invalid delay, it must be a number greater than 0 + การหน่วงเวลาไม่ถูกต้อง ควรเป็นตัวเลขที่มากกว่า 0 + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + บริเวณไม่ถูกต้อง ใช้ 'WxH+X+Y' หรือ 'all' หรือ 'screen0/screen1/...' + + + + Invalid path, must be an existing directory or a new file in an existing directory + เส้นทางไม่ถูกต้อง ต้องเป็นไดเร็กทอรีที่มีอยู่หรือไฟล์ใหม่ในไดเร็กทอรีที่มีอยู่ + + + Define the screen to capture + Define the screen to capture + + + + default: screen containing the cursor + ค่าเริ่มต้น: หน้าจอที่มีเคอร์เซอร์ + + + + Screen number + หมายเลขหน้าจอ + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + สีไม่ถูกต้อง แฟล็กรองรับรูปแบบต่อไปนี้: +- #RGB (R, G และ B แต่ละตัวเป็นเลขฐานสิบหกตัวเดียว) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- สีที่มีชื่อ เช่น 'สีน้ำเงิน' หรือ 'สีแดง' +คุณอาจต้องใช้เครื่องหมาย escape '#' เช่น '\#FFF' + + + Invalid delay, it must be higher than 0 + Invalid delay, it must be higher than 0 + + + + Invalid screen number, it must be non negative + หมายเลขหน้าจอไม่ถูกต้อง จะต้องไม่เป็นลบ + + + Invalid path, it must be a real path in the system + Invalid path, it must be a real path in the system + + + + Invalid value, it must be defined as 'true' or 'false' + ค่าไม่ถูกต้อง จะต้องกำหนดเป็น 'true' หรือ 'false' + + + + Error + ผิดพลาด + + + + Unable to write in + ไม่สามารถเขียนได้ + + + + Requested screen exceeds screen count + เกินจำนวนหน้าจอที่ร้องขอ + + + + Full screen screenshot pinned to screen + ภาพหน้าจอแบบเต็มจอถูกปักหมุดไว้บนหน้าจอ + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + + Options + ตัวเลือก + + + Arguments + ข้อโต้แย้ง + + + arguments + ข้อโต้แย้ง + + + + Subcommands + + + + + subcommands + + + + + Usage + ใช้ไป + + + + options + ตัวเลือก + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + ตามค่าเริ่มต้น Flameshot จะรันในพื้นหลังและเพิ่มไอคอนถาดสำหรับการกำหนดค่า + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + สวัสดี ฉันอยู่ที่นี่! คลิกไอคอนในถาดเพื่อจับภาพหน้าจอหรือคลิกปุ่มขวาเพื่อดูตัวเลือกเพิ่มเติม + + + Toggle side panel + Toggle side panel + + + Resize selection left 1px + Resize selection left 1px + + + Resize selection right 1px + Resize selection right 1px + + + Resize selection up 1px + Resize selection up 1px + + + Resize selection down 1px + Resize selection down 1px + + + Select entire screen + Select entire screen + + + Move selection left 1px + Move selection left 1px + + + Move selection right 1px + Move selection right 1px + + + Move selection up 1px + Move selection up 1px + + + Move selection down 1px + Move selection down 1px + + + Commit text in text area + Commit text in text area + + + Delete current tool + Delete current tool + + + + Quit capture + ออกจากการจับภาพ + + + + Screenshot history + ประวัติการจับภาพหน้าจอ + + + + Capture screen + จับภาพหน้าจอ + + + + Show color picker + แสดงตัวเลือกสี + + + + Change the tool's size + เปลี่ยนขนาดเครื่องมือ + + + Change the tool's thickness + Canvia el gruix de l'eina + + + + RectangleTool + + + Rectangle + สี่เหลี่ยมผืนผ้า + + + + Set the Rectangle as the paint tool + ตั้งค่าสี่เหลี่ยมผืนผ้าเป็นเครื่องมือระบายสี + + + + RedoTool + + + Redo + ทำซ้ำ + + + + Redo the next modification + ทำการแก้ไขครั้งต่อไปใหม่ + + + + SaveTool + + + Save + บันทึก + + + + Save screenshot to a file + บันทึกภาพหน้าจอลงในไฟล์ + + + Save the capture + Guarda la captura + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + ไม่สามารถตรวจจับสภาพแวดล้อมเดสก์ท็อปได้ (GNOME? KDE? Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + คำแนะนำ: ลองตั้งค่าตัวแปรสภาพแวดล้อม XDG_CURRENT_DESKTOP + + + + Unable to capture screen + ไม่สามารถจับภาพหน้าจอได้ + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + เลือกรูปสี่เหลี่ยมผืนผ้า + + + + Set Selection as the paint tool + ตั้งค่าเป็นเครื่องมือระบายสี + + + + SetShortcutDialog + + + Set Shortcut + ตั้งค่าทางลัด + + + + Enter new shortcut to change + ป้อนทางลัดใหม่เพื่อเปลี่ยนแปลง + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + กด Esc เพื่อยกเลิกหรือ ⌘+Backspace เพื่อปิดใช้งานแป้นพิมพ์ลัด + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + กด Esc เพื่อยกเลิกหรือ ⌘+Backspace เพื่อปิดใช้งานแป้นพิมพ์ลัด + + + + + Flameshot must be restarted for changes to take effect. + ต้องรีสตาร์ท Flameshot เพื่อให้มีผลการเปลี่ยนแปลง + + + + ShortcutsWidget + + + Hot Keys + คีย์ลัด + + + + Available shortcuts in the screen capture mode. + ปุ่มลัดที่สามารถใช้งานได้ในโหมดจับภาพหน้าจอ + + + + Description + คำอธิบาย + + + + Key + คีย์ + + + + Left Double-click + ดับเบิลคลิกซ้ายสองครั้ง + + + + Toggle side panel + สลับแผงด้านข้าง + + + + Grab a color from the screen + + + + + Resize selection left 1px + ปรับขนาดที่เลือกด้านซ้าย 1px + + + + Resize selection right 1px + ปรับขนาดการที่เลือกด้านขวา 1px + + + + Resize selection up 1px + ปรับขนาดการที่เลือกขึ้น 1px + + + + Resize selection down 1px + ปรับขนาดการที่เลือกลง 1px + + + + Symmetrically decrease width by 2px + + + + + Symmetrically increase width by 2px + + + + + Symmetrically increase height by 2px + + + + + Symmetrically decrease height by 2px + + + + + Select entire screen + เลือกหน้าจอทั้งหมด + + + + Move selection left 1px + เลื่อนที่เลือกไปทางซ้าย 1 พิกเซล + + + + Move selection right 1px + เลื่อนที่เลือกไปทางขวา 1 พิกเซล + + + + Move selection up 1px + เลื่อนที่เลือกขึ้น 1 พิกเซล + + + + Move selection down 1px + เลื่อนที่เลือกลง 1 พิกเซล + + + + Commit text in text area + ยืนยันข้อความในพื้นที่ข้อความ + + + + Delete selected drawn object + + + + + Cancel current selection + + + + Delete current tool + ลบเครื่องมือปัจจุบัน + + + + Capture screen + จับภาพหน้าจอ + + + + Screenshot history + ประวัติการจับภาพหน้าจอ + + + + SidePanelWidget + + Active thickness: + Active thickness: + + + Active color: + Active color: + + + Press ESC to cancel + Press ESC to cancel + + + + Active tool size: + ขนาดเครื่องมือที่ใช้งาน: + + + + Active Color: + สีที่ใช้งาน: + + + + Grab Color + จับสีต่าง ๆ + + + + Display grid + + + + + SizeDecreaseTool + + + Decrease Tool Size + ลดขนาดเครื่องมือ + + + + Decrease the size of the other tools + ลดขนาดของเครื่องมืออื่น ๆ + + + + SizeIncreaseTool + + + Increase Tool Size + เพิ่มขนาดเครื่องมือ + + + + Increase the size of the other tools + เพิ่มขนาดของเครื่องมืออื่น ๆ + + + + SizeIndicatorTool + + Selection Size Indicator + ตัวระบุขนาดการเลือก + + + Show X and Y dimensions of the selection + แสดงมิติ X และ Y ที่เลือก + + + Show the dimensions of the selection (X Y) + Mostra les mides de la selecció (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + ศตวรรษ (00-99) + + + + Year (00-99) + ปี (00-99) + + + + Year (2000) + ปี (2000) + + + + Month Name (jan) + ชื่อเดือน (ม.ค.) + + + + Month Name (january) + ชื่อเดือน (มกราคม) + + + + Month (01-12) + เดือน (01-12) + + + + Week Day (1-7) + วันธรรมดา (1-7) + + + + Week (01-53) + สัปดาห์ (01-53) + + + + Day Name (mon) + ชื่อวัน (จันทร์) + + + + Day Name (monday) + ชื่อวัน (วันจันทร์) + + + + Day (01-31) + วันที่ (01-31) + + + + Day of Month (1-31) + วันที่ (1-31) + + + + Day (001-366) + วัน (001-366) + + + + Hour (00-23) + ชั่วโมง (00-23) + + + + Hour (01-12) + ชั่วโมง (01-12) + + + + Minute (00-59) + นาที (00-59) + + + + Second (00-59) + วินาที (00-59) + + + + Full Date (%m/%d/%y) + วันที่แบบเต็ม (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + วันที่แบบเต็ม (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + + + + + Time (%H-%M-%S) + เวลา (%H-%M-%S) + + + + Time (%H-%M) + เวลา (%H-%M) + + + + SystemNotification + + + Flameshot Info + ข้อมูล Flameshot + + + + TextConfig + + + StrikeOut + สไตรค์เอาท์ + + + + Underline + ขีดเส้นใต้ + + + + Bold + ตัวหนา + + + + Italic + ตัวเอียง + + + + Left Align + ชิดซ้าย + + + + Center Align + จัดตำแหน่งให้ตรงกลาง + + + + Right Align + ชิดขวา + + + + TextTool + + + Text + ข้อความ + + + + Add text to your capture + เพิ่มข้อความลงในภาพของคุณ + + + + TrayIcon + + + &Take Screenshot + &ถ่ายภาพหน้าจอ + + + + &Open Launcher + &เปิดตัวเรียกใช้งาน + + + + &Configuration + &กำหนดค่า + + + + &About + &เกี่ยวกับ + + + + Check for updates + ตรวจสอบการอัปเดต + + + + New version %1 is available + เวอร์ชันใหม่ %1 พร้อมให้บริการแล้ว + + + + &Quit + &ออก + + + + &Latest Uploads + &อัพโหลดล่าสุด + + + + &Open Save Path + + + + + UIcolorEditor + + UI Color Editor + Editor de color de la interfície + + + + Change the color moving the selectors and see the changes in the preview buttons. + เปลี่ยนสีโดยการย้ายตัวเลือกและดูการเปลี่ยนแปลงในปุ่มแสดงตัวอย่าง + + + + Select a Button to modify it + เลือกปุ่มเพื่อแก้ไข + + + + Main Color + สีหลัก + + + + Click on this button to set the edition mode of the main color. + คลิกที่ปุ่มนี้เพื่อตั้งค่าสีหลัก + + + + Contrast Color + ความแตกต่างของสี + + + + Click on this button to set the edition mode of the contrast color. + คลิกที่ปุ่มนี้เพื่อแก้ไขสีคอนทราสต์ + + + + UndoTool + + + Undo + เลิกทำ + + + + Undo the last modification + ย้อนกลับการแก้ไขครั้งล่าสุด + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + Flameshot เวอร์ชันใหม่ %1 พร้อมให้บริการแล้ว + + + + Ignore + ข้าม + + + + Later + ภายหลัง + + + + Update + อัปเดต + + + + UploadHistory + + + Upload History + ประวัติการอัพโหลด + + + + Screenshots history is empty + ประวัติการจับภาพหน้าจอว่างเปล่า + + + + UploadLineItem + + + Form + ฟอร์ม + + + + TextLabel + ป้ายข้อความ + + + + Copy URL + คัดลอก URL + + + + Open In Browser + เปิดในเบราว์เซอร์ + + + + Confirm to delete + ยืนยันการลบ + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + คุณแน่ใจหรือไม่ว่าต้องการลบภาพหน้าจอจากการอัพโหลดล่าสุด? + + + + UtilityPanel + + + Close + ปิด + + + + <Empty> + <ว่าง> + + + + VisualsEditor + + + Opacity of area outside selection: + ความทึบของพื้นที่นอกส่วนที่เลือก: + + + + UI Color Editor + ตัวแก้ไขสี UI + + + + Colorpicker Editor + โปรแกรมแก้ไขตัวเลือกสี + + + + Button Selection + เลือกปุ่ม + + + + Select All + เลือกทั้งหมด + + + + color_widgets::ColorDialog + + + Pick + เลือก + + + + color_widgets::ColorPalette + + + Unnamed + ไม่มีชื่อ + + + + color_widgets::ColorPaletteModel + + + Unnamed + ไม่มีชื่อ + + + + %1 (%2 colors) + %1 (สี %2) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + เปิดจานสีใหม่จากไฟล์ + + + + + Create a new palette + สร้างจานสีใหม่ + + + + + Duplicate the current palette + ทำซ้ำจานสีปัจจุบัน + + + + + Delete the current palette + ลบจานสีปัจจุบัน + + + + + Revert changes to the current palette + ย้อนกลับการเปลี่ยนแปลงไปยังจานสีปัจจุบัน + + + + + Save changes to the current palette + บันทึกการเปลี่ยนแปลงไปยังจานสีปัจจุบัน + + + + + Add a color to the palette + เพิ่มสีให้กับจานสี + + + + + Remove the selected color from the palette + ลบสีที่เลือกออกจากจานสี + + + + + New Palette + จานสีใหม่ + + + + + Name + ชื่อ + + + + GIMP Palettes (*.gpl) + จานสี GIMP (*.gpl) + + + + Palette Image (%1) + ภาพพาเลท (%1) + + + + All Files (*) + ไฟล์ทั้งหมด (*) + + + + + Open Palette + เปิดจานสี + + + + Failed to load the palette file +%1 + ไม่สามารถโหลดไฟล์จานสีได้ +%1 + + + + color_widgets::GradientEditor + + + Add Color + เพิ่มสี + + + + Remove Color + ลบสี + + + + Edit Color... + แก้ไขสี... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (สี %2) + + + + color_widgets::Swatch + + + Clear Color + เคลียร์สี + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_tr.ts b/data/translations/Internationalization_tr.ts new file mode 100644 index 0000000..b223938 --- /dev/null +++ b/data/translations/Internationalization_tr.ts @@ -0,0 +1,3184 @@ + + + + + AbstractWidgetList + + + Add New + Yeni Ekle + + + + Move Up + Yukarı Taşı + + + + Move Down + Aşağı Taşı + + + + Remove + Kaldır + + + + AcceptTool + + + Accept + Kabul Et + + + + Accept the capture + Yakalamayı kabul et + + + + AppLauncher + + + App Launcher + Uygulama Başlatıcı + + + + Choose an app to open the capture + Yakalamayı açmak için bir uygulama seçin + + + + AppLauncherWidget + + + Open With + Birlikte aç + + + + Launch in terminal + Terminalde aç + + + + Keep open after selection + Seçimden sonra açık tut + + + + + Error + Hata + + + + Unable to write in + Yazılamadı + + + + Unable to launch in terminal. + Terminalde başlatılamadı. + + + + ArrowTool + + + Arrow + Ok + + + + Set the Arrow as the paint tool + Oku boyama aracı olarak ayarla + + + + BlurTool + + Blur + Bulanıklık + + + Set Blur as the paint tool + Bulnıklığı boyama aracı olarak ayarlar + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Yakalama Modu</b> + + + + Rectangular Region + Dikdörtgen Bölge + + + + Full Screen (Current Display) + Tam Ekran (Geçerli Ekran) + + + + Full Screen (All Monitors) + Tam Ekran (Tüm Monitörler) + + + + No Delay + Gecikme yok + + + + second + saniye + + + + + + seconds + saniye + + + + + Take new screenshot + Yeni ekran görüntüsü al + + + + + Area: + Alan: + + + + + Capture Launcher + Yakalama Başlatıcı + + + + + TextLabel + TextLabel + + + + + Capture Mode + Yakalama Modu + + + + + Delay: + Gecikme: + + + + + WxH+x+y + WxH+x+y + + + + CaptureWidget + + + Unable to capture screen + Ekran resmi alınamadı + + + + Mouse + Fare + + + + Select screenshot area + Ekran görüntüsü alanı seç + + + + Mouse Wheel + Fare Tekerleği + + + + Change tool size + Araç boyutunu değiştir + + + + Right Click + Sağ Tık + + + + Show color picker + Renk seçici göster + + + + Open side panel + Yan paneli aç + + + + Esc + Esc + + + + Exit + Çıkış + + + + Quit Capture + Yakalamayı bırak + + + + Are you sure you want to quit capture? + Yakalamayı bırakmak istediğinden emin misin? + + + + Do not show this again + Bir daha gösterme + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot odağı kaybetti. Klavye kısayolları, siz bir yere tıklayana kadar çalışmayacaktır. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + Yapılandırma hatası çözüldü. Uygulamak için `flameshot gui` yeniden başlatın. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Fareyle bir alan seçin veya çıkmak için Esc tuşuna basın. +Ekranı yakalamak için Enter tuşuna basın. +Renk seçiciyi göstermek için farenin sağ tuşuna tıklayın. +Aracınızın kalınlığını değiştirmek için Fare Tekerleğini kullanın. +Yan paneli açmak için Boşluk tuşuna basın. + + + + Tool Settings + Araç Ayarları + + + + CircleCountTool + + + Circle Counter + Daire Sayacı + + + + Add an autoincrementing counter bubble + Otomatik artan bir sayaç balonu ekleyin + + + + CircleTool + + + Circle + Çember + + + + Set the Circle as the paint tool + Çemberi boyama aracı olarak ayarla + + + + ColorDialog + + + + Select Color + Renk Seç + + + + + Saturation + Doygunluk + + + + + Hue + Ton + + + + + Hex + Hex + + + + + Blue + Mavi + + + + + Value + Değer + + + + + Green + Yeşil + + + + + Alpha + Alpha + + + + + Red + Kırmızı + + + + ColorGrabWidget + + + Accept color + Rengi kabul et + + + + Enter or Left Click + Enter veya Sol Tık + + + + Precisely select color + Rengi tam olarak seç + + + + Hold Left Click + Sol Tık Basılı Tut + + + + Toggle magnifier + Büyüteci aç/kapat + + + + Space or Right Click + Boşluk Tuşu veya Sağ Tık + + + + Cancel + İptal + + + + Esc + Esc + + + + ColorPickerEditor + + Select Preset: + ÖnAyar Seçin: + + + Select preset using the spinbox + Döndürme kutusunu kullanarak ön ayarı seçin + + + + Edit Preset: + Ön Ayarı Düzenle: + + + + Enter color to update preset + Ön ayarı güncellemek için renk girin + + + + Update + Güncelle + + + + Press button to update the selected preset + Seçilen ön ayarı güncellemek için düğmeye basın + + + + Delete + Sil + + + + Press button to delete the selected preset + Seçilen ön ayarı silmek için butona basın + + + + Add Preset: + Ön Ayar Ekle: + + + + Enter color manually or select it using the color-wheel + Rengi elle girin veya renk tekerleğini kullanarak seçin + + + + Add + Ekle + + + + Press button to add preset + Ön ayar eklemek için düğmeye basın + + + + + Error + Hata + + + + Unable to add preset. Maximum limit reached. + Ön ayar eklenemiyor. Azami sınıra ulaşıldı. + + + + Unable to remove preset. Minimum limit reached. + Ön ayar kaldırılamıyor. Asgari sınıra ulaşıldı. + + + + ConfigErrorDetails + + + Configuration errors + Yapılandırma hataları + + + + ConfigHandler + + + Unrecognized setting: '%1' + + Tanınmayan ayar: '%1' + + + + + Unrecognized shortcut name: '%1'. + + Tanınmayan kısayol adı: '%1'. + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + Kısayol çakışması: '%1' ve '%2' aynı kısayola sahip: %3 + + + + + Bad value in '%1'. Expected: %2 + + '%1' içinde hatalı değer. Beklenen: %2 + + + + + You have successfully resolved the configuration error. + Yapılandırma hatasını başarıyla çözdünüz. + + + + The configuration contains an error. Open configuration to resolve. + Yapılandırma bir hata içeriyor. Çözümlemek için yapılandırmayı açın. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + ConfigHandler'da hatalı yapılandırma anahtarı '%1'. Lütfen bunu bir hata olarak bildirin. + + + + ConfigResolver + + + Resolve configuration errors + Yapılandırma hatalarını çöz + + + + <b>You must resolve all errors before continuing:</b> + <b>Devam etmeden önce tüm hataları çözmelisiniz:</b> + + + + Reset + Sıfırla + + + + Reset to the default value. + Öntanımlı değere sıfırla. + + + + Remove + Kaldır + + + + Remove this setting. + Bu ayarı kaldır. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + Bazı klavye kısayollarında çakışmalar var. +Bu, flameshot'ın başlamasını ENGELLEMEYECEKTİR. +Lütfen bunları yapılandırma dosyasında elle çözün. + + + + Resolve all + Tümünü çöz + + + + Resolve all listed errors. + Listelenen tüm hataları çöz. + + + + Details + Ayrıntılar + + + + ConfigWindow + + + Configuration + Ayarlar + + + + Interface + Arayüz + + + + Filename Editor + Dosya Adı Düzenleyici + + + + General + Genel + + + + Shortcuts + Kısayollar + + + + Resolve + Çöz + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>Yapılandırma dosyasında hatalar var. Devam etmeden önce bunları çözün.</b> + + + + Controller + + New version %1 is available + Yeni %1 sürümü mevcut + + + You have the latest version + En son sürüme sahipsiniz + + + Failed to get information about the latest version. + En son sürüm hakkında bilgi alınamadı. + + + Error + Hata + + + Unable to close active modal widgets + Etkin modal widget'lar kapatılamıyor + + + &Take Screenshot + &Ekran Resmi Al + + + &Open Launcher + &Başlatıcı Aç + + + &Configuration + &Ayarlar + + + &About + &Hakkında + + + Check for updates + Güncellemeleri denetle + + + &Latest Uploads + &Son Yüklenenler + + + URL copied to clipboard. + URL panoya kopyalandı. + + + &Information + &Bilgi + + + &Quit + &Çıkış + + + + CopyTool + + + Copy + Kopyala + + + + Copy selection to clipboard + Seçimi panoya kopyala + + + Copy the selection into the clipboard + Seçimi panoya kopyala + + + + DBusUtils + + Unable to connect via DBus + DBus ile bağlanılamadı + + + + ExitTool + + + Exit + Çıkış + + + + Leave the capture screen + Yakalama ekranından ayrıl + + + + FileNameEditor + + + Edit the name of your captures: + Çekimlerinizin adını düzenleyin: + + + + Edit: + Düzenle: + + + + Preview: + Ön izleme: + + + + Save + Kaydet + + + + Saves the pattern + Desenini kaydeder + + + + Restore + Geri yükle + + + Reset + Sıfırla + + + + Restores the saved pattern + Kaydedilen deseni geri yükler + + + + Clear + Temizle + + + + Deletes the name + İsmi siler + + + + Flameshot + + + Error + Hata + + + + Unable to close active modal widgets + Etkin modal widget'lar kapatılamıyor + + + + URL copied to clipboard. + URL panoya kopyalandı. + + + + FlameshotDaemon + + + New version %1 is available + Yeni %1 sürümü var + + + + You have the latest version + En son sürümü kullanıyorsunuz + + + + Failed to get information about the latest version. + En son sürüm hakkında bilgi alınamadı. + + + + Unable to connect via DBus + DBus ile bağlanılamıyor + + + + GeneneralConf + + Import + Dışa aktar + + + Error + Hata + + + Unable to read file. + Dosya okunamıyor. + + + Unable to write file. + Dosya yazılamıyor. + + + Save File + Dosyayı Kaydet + + + Confirm Reset + Sıfırlamayı Onayla + + + Are you sure you want to reset the configuration? + Ayarları sıfırlamak istediğinizden emin misiniz? + + + Show help message + Yardım mesajını göster + + + Show the help message at the beginning in the capture mode. + Yakalama modunda başında yardım mesajını gösterin. + + + Show desktop notifications + Masaüstü bildirimlerini göster + + + Show tray icon + Tepsi simgesini göster + + + Show the systemtray icon + Sistem tepsisi simgesini göster + + + Configuration File + Yapılandırma Dosyası + + + Export + Dışa aktar + + + Reset + Sıfırla + + + Launch at startup + Başlangıçta başlatın + + + Launch Flameshot + Flameshot'ı başlat + + + + GeneralConf + + + + Import + İçe aktar + + + + + + + Error + Hata + + + + Unable to read file. + Dosya okunamıyor. + + + + + Unable to write file. + Dosya yazılamıyor. + + + + Save File + Dosyayı Kaydet + + + + Confirm Reset + Sıfırlamayı Onayla + + + + Are you sure you want to reset the configuration? + Ayarları sıfırlamak istediğinizden emin misiniz? + + + + Show help message + Yardım mesajını göster + + + Show the help message at the beginning in the capture mode. + Yakalama modunda başlangıçta yardım mesajını göster. + + + + Show the side panel button + Yan panel düğmesini göster + + + Show the side panel toggle button in the capture mode. + Çekim modunda yan panel geçiş düğmesini göster. + + + + Show desktop notifications + Masaüstü bildirimlerini göster + + + + Show tray icon + Tepsi simgesini göster + + + Show the systemtray icon + Sistem tepsisi simgesini göster + + + + Confirmation required to delete screenshot from the latest uploads + Son yüklenenlerden ekran görüntüsünü silmek için onay gerekli + + + + Configuration File + Yapılandırma Dosyası + + + + Export + Dışa aktar + + + + Reset + Sıfırla + + + + Automatic check for updates + Güncellemeleri otomatik denetle + + + + Allow multiple flameshot GUI instances simultaneously + Aynı anda birden fazla flameshot grafiksel arayüz örneğine izin ver + + + This allows you to take screenshots of flameshot itself for example. + Bu, örneğin flameshot'ın kendisinin ekran görüntülerini almanıza olanak tanır. + + + Automatically close daemon when it is not needed + Gerekli olmadığında arka plan programını otomatik olarak kapat + + + Launch at startup + Başlangıçta başlat + + + Launch Flameshot + Flameshot'ı başlat + + + + Show welcome message on launch + Açılışta karşılama mesajını göster + + + + Use large predefined color palette + Önceden tanımlanmış büyük renk paleti kullan + + + + Copy URL after upload + Yüklemeden sonra URL'yi kopyala + + + Copy URL and close window after upload + URL'yi kopyalayın ve yüklemeden sonra pencereyi kapatın + + + + Save image after copy + Kopyaladıktan sonra resmi kaydet + + + Save image file after copying it + Resim dosyasını kopyaladıktan sonra kaydedin + + + + Show the help message at the beginning in the capture mode + Yakalama modu başlangıcında ipucu göster + + + + Use last region for GUI mode + Son bölgeyi kullan + + + + Use the last region as the default selection for the next screenshot in GUI mode + Bir sonraki ekran görüntüsü için öntanımlı seçim olarak son bölgeyi kullanır + + + + Show the side panel toggle button in the capture mode + Yakalama modunda yan panelde geçiş düğmesi göster + + + + Enable desktop notifications + Masaüstü bildirimlerini etkinleştir + + + + Show abort notifications + + + + + Enable abort notifications + + + + + Show icon in the system tray + Simgeyi sistem tepsisinde göster + + + + Use grim to capture screenshots + + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + + + + + Ask for confirmation to delete screenshot from the latest uploads + En son yüklemelerdeki ekran görüntüsünü silmek için onay iste + + + + Check for updates automatically + Güncellemeleri otomatik olarak kontrol et + + + + This allows you to take screenshots of Flameshot itself for example + Bu, Flameshot'ın kendi ekran görüntülerini almanıza olanak tanır + + + Launch Flameshot daemon when computer is booted + Bilgisayar başlatıldığında Flameshot arka plan uygulamasını başlat + + + + Show the welcome message box in the middle of the screen while taking a screenshot + Ekran görüntüsü alırken ekranın ortasında karşılama mesajı kutusunu göster + + + + Use a large predefined color palette + Ön tanımlı geniş renk paletini kullan + + + + Copy on double click + Çift tıklandığında kopyala + + + Enable Copy on Double Click + Çift Tıklamada Kopyalamayı Etkinleştir + + + Copy URL and close window after uploading was successful + Yükleme başarılı olduktan sonra URL'yi kopyala ve pencereyi kapat + + + + Automatically unload from memory when it is not needed + + + + + Automatically close daemon (background process) when it is not needed + + + + + Launch in background at startup + + + + + Launch Flameshot daemon (background process) when computer is booted + + + + + Ask before quit capture + + + + + Show the confirmation prompt before ESC quit + + + + + Enable Copy to clipboard on Double Click + + + + + Copy URL after uploading was successful + + + + + After copying the screenshot, save it to a file as well + Ekran görüntüsünü kopyaladıktan sonra ayrıca bir resim olarak kaydedilsin + + + + Save Path + Kaydetme Yolu + + + + Change... + Değiştir... + + + + Use fixed path for screenshots to save + Kaydedilecek ekran görüntüleri için sabit yol kullan + + + + Preferred save file extension: + Tercih edilen kaydetme dosyası uzantısı: + + + + Latest Uploads Max Size + Son Yüklenenler Azami Boyutu + + + + Imgur Application Client ID + Imgur API Anahtarı + + + + Undo limit + Geri alma sınırı + + + + Use JPG format for clipboard (PNG default) + Pano için JPG biçimini kullan (öntanımlı: PNG) + + + + Use lossy JPG format for clipboard (lossless PNG default) + + + + + Copy file path after save + Kaydettikten sonra dosya yolunu kopyala + + + + Copy the file path to clipboard after the file is saved + Dosya kaydedildikten sonra dosya yolunu panoya kopyala + + + + Anti-aliasing image when zoom the pinned image + Sabitlenmiş görüntüye yakınlaştırırken kenar yumuşatma + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + Sabitlenmiş görüntüye yakınlaştırdıktan sonra, görüntü düzleştirilmeli veya pikselli kalmalı mı? + + + + + Upload image without confirmation + Onay almadan resimleri yükle + + + + Choose a Folder + Bir Klasör Seçin + + + + Unable to write to directory. + Dizine yazılamıyor. + + + + Show magnifier + Büyüteci göster + + + + Enable a magnifier while selecting the screenshot area + Ekran görüntüsü alanını seçerken büyüteci etkinleştir + + + + Square shaped magnifier + Kare şekilli büyüteç + + + + Make the magnifier to be square-shaped + Büyüteç kare şeklinde olsun + + + + Milliseconds before geometry display hides; 0 means do not hide + + + + + Set geometry display timeout (ms) + + + + + Selection Geometry Display + + + + + Display Location + + + + + None + + + + + Top Left + + + + + Top Right + + + + + Bottom Left + + + + + Bottom Right + + + + + Center + + + + + Quality range of 0-100; Higher number is better quality and larger file size + + + + + JPEG Quality + + + + + Reverse arrow + + + + + Draw the arrow head first + + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + Son Yüklenenler + + + Screenshots history is empty + Ekran görüntüsü geçmişi boş + + + Copy URL + URL Kopyala + + + URL copied to clipboard. + URL panoya kopyalandı. + + + Open in browser + Tarayıcıda aç + + + Confirm to delete + Silmeyi onayla + + + Are you sure you want to delete a screenshot from the latest uploads and server? + En son yüklemelerden ve sunucudan bir ekran görüntüsünü silmek istediğinizden emin misiniz? + + + + ImgS3Uploader + + Uploading Image + Resim Yükleniyor + + + URL copied to clipboard. + URL panoya kopyalandı. + + + Error + Hata + + + + ImgUploadDialog + + + Upload Confirmation + Yükleme Onayı + + + + Do you want to upload this capture? + Bu yakalamayı yüklemek istiyor musunuz? + + + + + Upload without confirmation + Onay almadan yükle + + + + ImgUploader + + Uploading Image + Resim Yükleniyor + + + Unable to open the URL. + URL açılamıyor. + + + URL copied to clipboard. + URL panoya kopyalandı. + + + Screenshot copied to clipboard. + Ekran görüntüsü panoya kopyalandı. + + + Copy URL + URL Kopyala + + + Open URL + URL Aç + + + Delete image + Resmi sil + + + Image to Clipboard. + Resim Pano'ya. + + + + ImgUploaderBase + + + Upload image + Upload image + + + + Uploading Image + Resim Karşıya Yükleniyor + + + + Copy URL + URL Kopyala + + + + Open URL + URL Aç + + + + Delete image + Resmi sil + + + + Image to Clipboard. + Resim Pano'ya. + + + + Save image + Resmi Kaydet + + + + Unable to open the URL. + URL açılamıyor. + + + + URL copied to clipboard. + URL panoya kopyalandı. + + + + Screenshot copied to clipboard. + Ekran görüntüsü panoya kopyalandı. + + + + Unable to save the screenshot to disk. + Ekran görüntüsü diske kaydedilemiyor. + + + + Screenshot saved. + Ekran görüntüsü kaydedildi. + + + + ImgUploaderTool + + + Image Uploader + Resim Karşıya Yükleme Aracı + + + + Upload the selection + Seçimi yükle + + + + ImgurUploader + + Upload to Imgur + Imgur'a yükle + + + Uploading Image + Resim Yükleniyor + + + Copy URL + URL Kopyala + + + Open URL + URL Aç + + + Delete image + Resmi sil + + + Image to Clipboard. + Resim Pano'ya. + + + + Unable to open the URL. + URL açılamıyor. + + + URL copied to clipboard. + URL panoya kopyalandı. + + + Screenshot copied to clipboard. + Ekran görüntüsü panoya kopyalandı. + + + + ImgurUploaderTool + + Image Uploader + Resim Yükleme Aracı + + + Upload the selection to Imgur + Seçimi Imgur'a yükle + + + + InfoWindow + + + + About + Hakkında + + + + + Icon + Simge + + + + + License + Lisans + + + + + GPLv3+ + GPLv3+ + + + + + Version + Sürüm + + + + + Flameshot v + Flameshot v + + + + + OS Info + İşletim Sistemi + + + + + Copy Info + Bilgileri Kopyala + + + Right Click + Sağ Tık + + + Mouse Wheel + Fare Tekerleği + + + Move selection 1px + 1px seçimini hareket ettir + + + Resize selection 1px + 1px seçimini yeniden boyutlandır + + + Quit capture + Çıkış + + + Copy to clipboard + Panoya kopyala + + + Save selection as a file + Seçimi dosya olarak kaydet + + + Undo the last modification + Son değişikliği geri al + + + Show color picker + Renk seçici göster + + + Change the tool's thickness + Araç kalınlığını değiştirin + + + Available shortcuts in the screen capture mode. + Ekran yakalama modunda kullanılabilir kısayollar. + + + Key + Anahtar + + + Description + Tanım + + + <u><b>License</b></u> + <u><b>Lisans</b></u> + + + <u><b>Version</b></u> + <u><b>Sürüm</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Kısayollar</b></u> + + + + InvertTool + + + Invert + Ters çevir + + + + Set Inverter as the paint tool + Boya aracı olarak Inverter'ı ayarla + + + + LineTool + + + Line + Çizgi + + + + Set the Line as the paint tool + Çizgiyi boyama aracı olarak ayarla + + + + MarkerTool + + + Marker + İşaretleyici + + + + Set the Marker as the paint tool + İşaretleyiciyi boyama aracı olarak ayarla + + + + MoveTool + + + Move + Oynat + + + + Move the selection area + Seçim alanını hareket ettir + + + + PencilTool + + + Pencil + Kurşun Kalem + + + + Set the Pencil as the paint tool + Kurşun Kalemi çizim aracı olarak ayarla + + + + PinTool + + + Pin Tool + Sabitleme Aracı + + + + Pin image on the desktop + Resmi masaüstüne sabitle + + + + PinWidget + + + Context menu + Context menu + + + + Copy to clipboard + Panoya kopyala + + + + Save to file + Dosyaya kaydet + + + + Rotate Right + + + + + Rotate Left + + + + + Increase Opacity + + + + + Decrease Opacity + + + + + Close + Kapat + + + + PixelateTool + + + Pixelate + Pikselleştir + + + + Set Pixelate as the paint tool. + + + + Set Pixelate as the paint tool + Piksellleştirmeyi boyama aracı olarak ayarla + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QHotkey + + Failed to register %1. Error: %2 + %1 kaydedilemedi. Hata:%2 + + + Failed to unregister %1. Error: %2 + %1 kaydı silinemedi. Hata:%2 + + + + QObject + + + Save Error + Kaydetme Hatası + + + + + Capture saved as + Yakalama farklı kaydedildi + + + + + Capture saved to clipboard. + Yakalama, panoya kaydedildi. + + + Capture saved to clipboard + Yakalama panoya kaydedildi + + + + Error while saving to clipboard + Panoya kaydederken hata oluştu + + + + + Error trying to save as + Farklı kaydetmeye çalışılırken hata oluştu + + + + Save screenshot + Ekran görüntüsünü kaydet + + + + Path copied to clipboard as + Dosya yolu, panoya şu şekilde kopyalandı: + + + Saving canceled + Kaydetme iptal edildi + + + Save canceled + Kaydetme iptal edildi + + + Capture is saved and copied to the clipboard as + Yakalama kaydedilir ve panoya şu adla kopyalanır + + + + Unable to connect via DBus + DBus ile bağlanılamıyor + + + + Powerful yet simple to use screenshot software. + Güçlü ve kullanımı kolay ekran görüntüsü yazılımı. + + + + See + Bak + + + Capture the entire desktop. + Masaüstünün tamamını yakalayın. + + + + Open the capture launcher. + Yakalama başlatıcısını açın. + + + + Start a manual capture in GUI mode. + GUI modunda elle yakalama başlatın. + + + + Configure + Yapılandır + + + Capture a single screen. + Tek bir ekran yakalayın. + + + Path where the capture will be saved + Yakalamanın kaydedileceği yol + + + + Capture screenshot of all monitors at the same time. + + + + + Capture a screenshot of the specified monitor. + + + + + Existing directory or new file to save to + Kaydedilecek mevcut dizin veya yeni dosya + + + + Save the capture to the clipboard + Yakalamayı panoya kaydedin + + + + Pin the capture to the screen + Yakalamayı ekrana sabitleyin + + + + Upload screenshot + Upload screenshot + + + + Delay time in milliseconds + Milisaniye cinsinden gecikme süresi + + + + Repeat screenshot with previously selected region + Ekran görüntüsünü önceden seçilen bölge ile tekrarlayın + + + + Screenshot region to select + Seçilecek ekran görüntüsü bölgesi + + + + Set the filename pattern + Dosya adı desenini ayarlayın + + + + Accept capture as soon as a selection is made + Seçim yapılır yapılmaz yakalamayı kabul et + + + + Enable or disable the trayicon + Tepsi simgesini etkinleştirin veya devre dışı bırakın + + + + Enable or disable run at startup + Başlangıçta çalışmayı etkinleştirin veya devre dışı bırakın + + + + Enable or disable the notifications + + + + + Check the configuration for errors + Yapılandırma hatalarını kontrol et + + + + Show the help message in the capture mode + Çekim modunda yardım mesajını göster + + + + Define the main UI color + Ana kullanıcı arayüzü rengini tanımlayın + + + + Define the contrast UI color + Kontrast kullanıcı arayüzü rengini tanımlayın + + + + Print raw PNG capture + Ham PNG yakalamayı yazdırın + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + Seçimin geometrisini WxH+X+Y biçiminde yazdırır. Raw belirtilirse hiçbir şey yapmaz + + + + Define the screen to capture (starting from 0) + Yakalanacak ekranı tanımla (0'dan başlayarak) + + + + Invalid delay, it must be a number greater than 0 + Geçersiz gecikme, 0'dan büyük bir sayı olmalıdır + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + Geçersiz bölge, 'WxH+X+Y' veya 'tümü' veya 'screen0/screen1/...' kullanın. + + + + Invalid path, must be an existing directory or a new file in an existing directory + Geçersiz yol, mevcut bir dizin veya mevcut bir dizinde yeni bir dosya olmalıdır + + + Define the screen to capture + Yakalanacak ekranı tanımlayın + + + + default: screen containing the cursor + öntanımlı: imleci içeren ekran + + + + Screen number + Ekran numarası + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Geçersiz renk, bu seçenek aşağıdaki biçimleri destekler: +- #RGB (R, G, ve B onaltılık tabanda rakamlardır) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- 'blue' veya 'red' gibi adlandırılmış renkler +'#' işaretini '\#FFF' şeklinde kaçırmanız gerekebilir + + + Invalid delay, it must be higher than 0 + Geçersiz gecikme, 0'dan yüksek olmalıdır + + + + Invalid screen number, it must be non negative + Geçersiz ekran numarası, negatif olmamalıdır + + + Invalid path, it must be a real path in the system + Geçersiz yol, sistemde gerçek bir yol olmalıdır + + + + Invalid value, it must be defined as 'true' or 'false' + Geçersiz değer, 'true' veya 'false' olarak tanımlanmalıdır + + + + Error + Hata + + + + Unable to write in + Yazılamadı + + + + Requested screen exceeds screen count + İstenen ekran, ekran sayısını aşıyor + + + + Full screen screenshot pinned to screen + Ekrana sabitlenmiş tam ekran ekran görüntüsü + + + URL copied to clipboard. + URL panoya kopyalandı. + + + + Options + Seçenekler + + + Arguments + Argümanlar + + + arguments + argümanlar + + + + Subcommands + + + + + subcommands + + + + + Usage + Kullanım + + + + options + seçenekler + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Öntanımlı olarak arka planda Flameshot çalıştırır ve yapılandırma için bir tepsi simgesi ekler. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Merhaba ben burdayım! Ekran görüntüsü almak için tepsideki simgeye tıklayın veya daha fazla seçenek görmek için sağ düğmeyle tıklayın. + + + Toggle side panel + Yan paneli aç / kapat + + + Resize selection left 1px + Seçimi sola 1 piksel yeniden boyutlandır + + + Resize selection right 1px + Seçimi sağa 1 piksel yeniden boyutlandır + + + Resize selection up 1px + Seçimi yukarı 1 piksel yeniden boyutlandır + + + Resize selection down 1px + Seçimi aşağı 1 piksel yeniden boyutlandır + + + Select entire screen + Tüm ekranı seçin + + + Move selection left 1px + Seçimi 1 piksel sola taşı + + + Move selection right 1px + Seçimi 1 piksel sağa taşı + + + Move selection up 1px + Seçimi 1 piksel yukarı taşı + + + Move selection down 1px + Seçimi 1 piksel aşağı taşı + + + Commit text in text area + Metin alanındaki metni kaydet + + + Delete current tool + Geçerli aracı sil + + + + Quit capture + Çıkış + + + + Screenshot history + Ekran görüntüsü geçmişi + + + + Capture screen + Ekran görüntüsü al + + + + Show color picker + Renk seçici göster + + + + Change the tool's size + Aracın boyutunu değiştir + + + Change the tool's thickness + Araç kalınlığını değiştir + + + + RectangleTool + + + Rectangle + Dikdörtgen + + + + Set the Rectangle as the paint tool + Dikdörtgeni boyama aracı olarak ayarla + + + + RedoTool + + + Redo + Tekrarla + + + + Redo the next modification + Sonraki değişikliği tekrarla + + + + SaveTool + + + Save + Kaydet + + + + Save screenshot to a file + Ekran görüntüsünü bir dosyaya kaydet + + + Save the capture + Yakalamayı kaydet + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Masaüstü ortamı algılanamıyor (GNOME? KDE? Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + İpucu: XDG_CURRENT_DESKTOP ortam değişkenini ayarlamayı deneyin. + + + + Unable to capture screen + Ekran resmi alınamadı + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + Dikdörtgen Seçim + + + + Set Selection as the paint tool + Seçimi boyama aracı olarak ayarla + + + + SetShortcutDialog + + + Set Shortcut + Kısayol Ayarla + + + + Enter new shortcut to change + Değiştirmek için yeni kısayolu girin + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + İptal etmek için Esc tuşuna veya klavye kısayolunu devre dışı bırakmak için ⌘+Backspace tuşuna basın. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + İptal etmek için Esc tuşuna veya klavye kısayolunu devre dışı bırakmak için Geri tuşuna basın. + + + + + Flameshot must be restarted for changes to take effect. + Değişikliklerin etkili olması için Flameshot yeniden başlatılmalıdır. + + + + ShortcutsWidget + + + Hot Keys + Kısayol Tuşları + + + + Available shortcuts in the screen capture mode. + Ekran yakalama modunda kullanılabilir kısayollar. + + + + Description + Açıklama + + + + Key + Tuş + + + + Left Double-click + Sol çift tıklama + + + + Toggle side panel + Yan paneli aç/kapat + + + + Grab a color from the screen + + + + + Resize selection left 1px + Seçimi sola 1 piksel yeniden boyutlandır + + + + Resize selection right 1px + Seçimi sağa 1 piksel yeniden boyutlandır + + + + Resize selection up 1px + Seçimi yukarı 1 piksel yeniden boyutlandır + + + + Resize selection down 1px + Seçimi aşağı 1 piksel yeniden boyutlandır + + + + Symmetrically decrease width by 2px + + + + + Symmetrically increase width by 2px + + + + + Symmetrically increase height by 2px + + + + + Symmetrically decrease height by 2px + + + + + Select entire screen + Tüm ekranı seç + + + + Move selection left 1px + Seçimi 1 piksel sola taşı + + + + Move selection right 1px + Seçimi 1 piksel sağa taşı + + + + Move selection up 1px + Seçimi 1 piksel yukarı taşı + + + + Move selection down 1px + Seçimi 1 piksel aşağı taşı + + + + Commit text in text area + Metin alanındaki metni kaydet + + + + Delete selected drawn object + + + + + Cancel current selection + + + + Delete current tool + Geçerli aracı sil + + + + Capture screen + Ekran görüntüsü al + + + + Screenshot history + Ekran görüntüsü geçmişi + + + + SidePanelWidget + + Active thickness: + Etkin kalınlık: + + + Active color: + Etkin renk: + + + Press ESC to cancel + İptal etmek için ESC'ye basın + + + + Active tool size: + Etkin araç boyutu: + + + + Active Color: + Active Color: + + + + Grab Color + Rengi Yakala + + + + Display grid + + + + + SizeDecreaseTool + + + Decrease Tool Size + Araç Boyutunu Küçült + + + + Decrease the size of the other tools + Diğer araçların boyutunu küçült + + + + SizeIncreaseTool + + + Increase Tool Size + Araç Boyutunu Büyüt + + + + Increase the size of the other tools + Diğer araçların boyutunu büyüt + + + + SizeIndicatorTool + + Selection Size Indicator + Seçim Boyutu Göstergesi + + + Show X and Y dimensions of the selection + Seçimin X ve Y boyutlarını göster + + + Show the dimensions of the selection (X Y) + Seçimin boyutlarını gösterir (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + Yüzyıl (00-99) + + + + Year (00-99) + Yıl (00-99) + + + + Year (2000) + Yıl (2000) + + + + Month Name (jan) + Ay Adı (oca) + + + + Month Name (january) + Ay Adı (ocak) + + + + Month (01-12) + Ay (01-12) + + + + Week Day (1-7) + Haftanın Günü (1-7) + + + + Week (01-53) + Hafta (01-53) + + + + Day Name (mon) + Gün Adı (pzt) + + + + Day Name (monday) + Gün Adı (pazartesi) + + + + Day (01-31) + Gün (01-31) + + + + Day of Month (1-31) + Ayın Günü (1-31) + + + + Day (001-366) + Gün (001-366) + + + + Time (%H-%M-%S) + Zaman (%H-%M-%S) + + + + Time (%H-%M) + Zaman (%H-%M) + + + + Hour (00-23) + Saat (00-23) + + + + Hour (01-12) + Saat (01-12) + + + + Minute (00-59) + Dakika (00-59) + + + + Second (00-59) + Saniye (00-59) + + + + Full Date (%m/%d/%y) + Tam Tarih (%d/%m/%y) + + + + Full Date (%Y-%m-%d) + Tam Tarih (%d-%m-%Y) + + + + Full Date (%d-%m-%Y) + + + + + SystemNotification + + + Flameshot Info + Flameshot Hakkında + + + + TextConfig + + + StrikeOut + Üstçizgi + + + + Underline + Altçizgi + + + + Bold + Kalın + + + + Italic + Eğik + + + + Left Align + Sola Hizala + + + + Center Align + Ortaya Hizala + + + + Right Align + Sağa Hizala + + + + TextTool + + + Text + Metin + + + + Add text to your capture + Bilgisayardan yazı ekle + + + + TrayIcon + + + &Take Screenshot + &Ekran Görüntüsü Al + + + + &Open Launcher + &Başlatıcıyı Aç + + + + &Configuration + &Ayarlar + + + + &About + &Hakkında + + + + Check for updates + Güncellemeleri denetle + + + + New version %1 is available + Yeni %1 sürümü var + + + + &Quit + &Çıkış + + + + &Latest Uploads + &Son Yüklenenler + + + + &Open Save Path + + + + + UIcolorEditor + + UI Color Editor + Kullanıcı Arayüzü Renk Düzenleyicisi + + + + Change the color moving the selectors and see the changes in the preview buttons. + Seçicileri hareket ettiren rengi değiştirin ve ön izleme düğmelerindeki değişiklikleri görün. + + + + Select a Button to modify it + Değiştirmek için bir düğme seçin + + + + Main Color + Ana Renk + + + + Click on this button to set the edition mode of the main color. + Ana rengin düzenleme modunu ayarlamak için bu düğmeye tıklayın. + + + + Contrast Color + Kontrast Renk + + + + Click on this button to set the edition mode of the contrast color. + Kontrast renginin düzenleme modunu ayarlamak için bu düğmeye tıklayın. + + + + UndoTool + + + Undo + Geri al + + + + Undo the last modification + Son değişikliği geri al + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + Yeni Flameshot %1 sürümü mevcut + + + + Ignore + Yok say + + + + Later + Sonra + + + + Update + Güncelle + + + + UploadHistory + + + Upload History + Yükleme Geçmişi + + + + Screenshots history is empty + Ekran görüntüsü geçmişi boş + + + + UploadLineItem + + + Form + Form + + + + TextLabel + TextLabel + + + + Copy URL + URL Kopyala + + + + Open In Browser + Tarayıcıda aç + + + + Confirm to delete + Silmeyi onayla + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + En son yüklemelerden ve sunucudan bir ekran görüntüsünü silmek istediğinizden emin misiniz? + + + + UtilityPanel + + + Close + Kapat + + + + <Empty> + <Boş> + + + + VisualsEditor + + + Opacity of area outside selection: + Seçimin dışındaki alanın opaklığı: + + + + UI Color Editor + Kullanıcı Arayüzü Renk Düzenleyicisi + + + + Colorpicker Editor + Renk Seçici Düzenleyici + + + + Button Selection + Düğme Seçimi + + + + Select All + Tümünü Seç + + + + color_widgets::ColorDialog + + + Pick + Seç + + + + color_widgets::ColorPalette + + + Unnamed + Adsız + + + + color_widgets::ColorPaletteModel + + + Unnamed + Adsız + + + + %1 (%2 colors) + %1 (%2 renk) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + Dosyadan yeni bir palet aç + + + + + Create a new palette + Yeni bir palet oluştur + + + + + Duplicate the current palette + Geçerli paleti kopyala + + + + + Delete the current palette + Geçerli paleti sil + + + + + Revert changes to the current palette + Geçerli palete yapılan değişiklikleri geri al + + + + + Save changes to the current palette + Değişiklikleri geçerli palete kaydet + + + + + Add a color to the palette + Palete bir renk ekle + + + + + Remove the selected color from the palette + Seçilen rengi paletten kaldır + + + + + New Palette + Yeni Palet + + + + + Name + Name + + + + GIMP Palettes (*.gpl) + GIMP Paletleri (*.gpl) + + + + Palette Image (%1) + Palet Resmi (%1) + + + + All Files (*) + Tüm Dosyalar (*) + + + + + Open Palette + Paleti Aç + + + + Failed to load the palette file +%1 + Palet dosyası yüklenemedi +%1 + + + + color_widgets::GradientEditor + + + Add Color + Renk Ekle + + + + Remove Color + Renk Kaldır + + + + Edit Color... + Rengi Düzenle... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 renk) + + + + color_widgets::Swatch + + + Clear Color + Rengi Temizle + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_uk.ts b/data/translations/Internationalization_uk.ts new file mode 100644 index 0000000..92fc5d8 --- /dev/null +++ b/data/translations/Internationalization_uk.ts @@ -0,0 +1,3376 @@ + + + + + AbstractWidgetList + + + Add New + Додати новий + + + + Move Up + Підняти + + + + Move Down + Опустити + + + + Remove + Вилучити + + + + AcceptTool + + + Accept + Застосувати + + + + Accept the capture + Застосувати вибір ділянки + + + + AppLauncher + + + App Launcher + Запуск застосунку + + + + Choose an app to open the capture + Виберіть застосунок, щоб відкрити знімок + + + + AppLauncherWidget + + + Open With + Відкрити в + + + + Launch in terminal + Запустити в терміналі + + + + Keep open after selection + Не закривати після вибору + + + + + Error + Помилка + + + + Unable to write in + Не вдалось записати + + + + Unable to launch in terminal. + Не вдалося запустити в терміналі. + + + + ArrowTool + + + Arrow + Стрілка + + + + Set the Arrow as the paint tool + Вибрати стрілку інструментом малювання + + + + BlurTool + + Blur + Розмиття + + + Set Blur as the paint tool + Вибрати розмиття інструментом малювання + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Режим захоплення</b> + + + + Rectangular Region + Прямокутна область + + + + Full Screen (Current Display) + Не весь екран (поточний дисплей) + + + + Full Screen (All Monitors) + На весь екран (усі монітори) + + + + No Delay + Без затримки + + + + second + секунда + + + + + + seconds + секунд + + + + + Take new screenshot + Зробити новий знімок + + + + + Area: + Область: + + + + + Capture Launcher + Запуск захоплення + + + + + TextLabel + TextLabel + + + + + Capture Mode + Режим захоплення + + + + + Delay: + Затримка: + + + + + WxH+x+y + WxH+x+y + + + + CaptureWidget + + + Unable to capture screen + Не вдалось захопити екран + + + + Mouse + Миша + + + + Select screenshot area + Виберіть ділянку знімання + + + + Mouse Wheel + Колесо миші + + + + Change tool size + Змінити розмір інструменту + + + + Right Click + Права кнопка миші + + + + Show color picker + Показати обирач кольору + + + + Open side panel + Відкрити бічну панель + + + + Esc + Esc + + + + Exit + Вийти + + + + Quit Capture + Вийти з режиму захоплення + + + + Are you sure you want to quit capture? + Ви впевнені, що хочете припинити захоплення? + + + + Do not show this again + Не показувати це знову + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot втратив фокус. Комбінації клавіш не працюватимуть, поки ви не клацнете десь. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + Помилку конфігурації усунуто. Повторно запустіть `flameshot gui`, щоб застосувати їх. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Виберіть область мишкою або натисніть Esc для виходу. +Натисніть Enter, щоб захопити екран. +Натисніть праву кнопку миші, щоб показати вибір кольору. +Використовуйте колесо миші для зміни товщини вибраного інструменту. +Натисніть Пробіл, щоб відкрити бічну панель. + + + + Tool Settings + Налаштування інструменту + + + + CircleCountTool + + + Circle Counter + Нумерація + + + + Add an autoincrementing counter bubble + Додати коло з автоінкрементованим лічильником + + + + CircleTool + + + Circle + Коло + + + + Set the Circle as the paint tool + Вибрати коло інструментом малювання + + + + ColorDialog + + + + Select Color + Вибрати колір + + + + + Saturation + Насиченість + + + + + Hue + Відтінок + + + + + Hex + Шістнадцятковий + + + + + Blue + Синій + + + + + Value + Значення + + + + + Green + Зелений + + + + + Alpha + Альфа + + + + + Red + Червоний + + + + ColorGrabWidget + + + Accept color + Застосувати колір + + + + Enter or Left Click + Натисніть Enter або клацніть лівою кнопкою миші + + + + Precisely select color + Точний підбір кольору + + + + Hold Left Click + Утримуйте ліву кнопку миші + + + + Toggle magnifier + Увімкнути лупу + + + + Space or Right Click + Натисніть Пробіл або клацніть правою кнопкою миші + + + + Cancel + Скасувати + + + + Esc + Esc + + + + ColorPickerEditor + + Select Preset: + Вибрати шаблон: + + + Select preset using the spinbox + Виберіть шаблон за допомогою обертача + + + + Edit Preset: + Змінити стиль: + + + + Enter color to update preset + Введіть колір для оновлення стилю + + + + Update + Оновити + + + + Press button to update the selected preset + Натисніть кнопку, щоб оновити вибраний стиль + + + + Delete + Видалити + + + + Press button to delete the selected preset + Натисніть кнопку, щоб видалити вибраний шаблон + + + + Add Preset: + Додати шаблон: + + + + Enter color manually or select it using the color-wheel + Введіть колір вручну або виберіть його за допомогою кола кольорів + + + + Add + Додати + + + + Press button to add preset + Натисніть кнопку, щоб додати шаблон + + + + + Error + Помилка + + + + Unable to add preset. Maximum limit reached. + Не вдалося додати шаблон. Досягнуто максимальної межі. + + + + Unable to remove preset. Minimum limit reached. + Не вдалося вилучити шаблон. Досягнуто мінімальної межі. + + + + ConfigErrorDetails + + + Configuration errors + Помилки конфігурації + + + + ConfigHandler + + + Unrecognized setting: '%1' + + Нерозпізнане налаштування: «%1» + + + + + Unrecognized shortcut name: '%1'. + + Нерозпізнана назва комбінації клавіш: «%1». + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + Конфлікт комбінацій клавіш: «%1» і «%2» мають однакову комбінацію клавіш: %3 + + + + + Bad value in '%1'. Expected: %2 + + Неправильне значення в «%1». Очікувалося: %2 + + + + + You have successfully resolved the configuration error. + Ви успішно усунули помилку конфігурації. + + + + The configuration contains an error. Open configuration to resolve. + Конфігурація містить помилку. Відкрийте конфігурацію для розвʼязання. + + + The configuration contains an error. Falling back to default. + Конфігурація містить помилку. Відновлення типової. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + Неправильний ключ конфігурації «%1» у ConfigHandler. Повідомте про це як про помилку. + + + + ConfigResolver + + + Resolve configuration errors + Усуньте помилки конфігурації + + + + <b>You must resolve all errors before continuing:</b> + <b>Ви повинні усунути всі помилки, перш ніж продовжити:</b> + + + + Reset + Скинути + + + + Reset to the default value. + Відновити типові значення. + + + + Remove + Вилучити + + + + Remove this setting. + Вилучити це налаштування. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + Деякі комбінації клавіш конфліктують. +Це НЕ заважатиме запуску flameshot. +Виправте їх вручну у файлі конфігурації. + + + + Resolve all + Виправити всі + + + + Resolve all listed errors. + Виправити всі перераховані помилки. + + + + Details + Подробиці + + + + ConfigWindow + + + Configuration + Налаштування + + + + Interface + Інтерфейс + + + + Filename Editor + Редактор назв файлів + + + + General + Загальне + + + + Shortcuts + Комбінації клавіш + + + + Resolve + Виправити + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>У файлі конфігурації є помилки. Розвʼяжіть їх, перш ніж продовжити.</b> + + + Storage + Сховище + + + + Controller + + New version %1 is available + Доступна нова версія %1 + + + You have the latest version + У вас найпізніша версія + + + Failed to get information about the latest version. + Не вдалося отримати інформацію про останню версію. + + + Error + Помилка + + + Unable to close active modal widgets + Не вдається закрити активні модальні віджети + + + &Take Screenshot + &Зробити знімок + + + &Open Launcher + &Відкрити запускач + + + &Configuration + &Налаштування + + + &About + &Про програму + + + Check for updates + Перевірити оновлення + + + &Latest Uploads + &Останні відвантаження + + + URL copied to clipboard. + URL-адресу скопійовано у буфер обміну. + + + &Information + &Інформація + + + &Quit + Ви&йти + + + + CopyTool + + + Copy + Копіювати + + + + Copy selection to clipboard + Копіювати вибране до буфера обміну + + + Copy the selection into the clipboard + Копіювати вибране до буфера обміну + + + + DBusUtils + + Unable to connect via DBus + Не вдалося підключитися через DBus + + + + ExitTool + + + Exit + Вийти + + + + Leave the capture screen + Вийти із захоплення екрану + + + + FileNameEditor + + + Edit the name of your captures: + Змініть назву ваших знімків: + + + + Edit: + Шаблон: + + + + Preview: + Перегляд: + + + + Save + Зберегти + + + + Saves the pattern + Зберегти шаблон + + + + Restore + Відновити + + + Reset + Скинути + + + + Restores the saved pattern + Відновлює збережений шаблон + + + + Clear + Очистити + + + + Deletes the name + Видаляє назву + + + + Flameshot + + + Error + Помилка + + + + Unable to close active modal widgets + Не вдалося закрити активні модальні віджети + + + + URL copied to clipboard. + URL-адресу скопійовано до буфера обміну. + + + + FlameshotDaemon + + + New version %1 is available + Доступна нова версія %1 + + + + You have the latest version + У вас найновіша версія + + + + Failed to get information about the latest version. + Не вдалося отримати відомості про останню версію. + + + + Unable to connect via DBus + Не вдалося підʼєднатися через DBus + + + + GeneneralConf + + Import + Імпорт + + + Error + Помилка + + + Unable to read file. + Не вдалось прочитати файл. + + + Unable to write file. + Не вдалось записати файл. + + + Save File + Зберегти файл + + + Confirm Reset + Підтвердити скидання + + + Are you sure you want to reset the configuration? + Ви дійсно хочете скинути налаштування? + + + Show help message + Показувати повідомлення довідки + + + Show the help message at the beginning in the capture mode. + Показувати повідомлення довідки на початку режиму захоплення. + + + Show the side panel button + Показувати кнопку бічній панелі + + + Show the side panel toggle button in the capture mode. + Показувати кнопку відкриття бічної панелі в режимі захоплення. + + + Show desktop notifications + Показувати повідомлення + + + Show tray icon + Показувати значок на панелі + + + Show the systemtray icon + Показувати значок на панелі повідомленнь + + + Configuration File + Файл налаштувань + + + Export + Експорт + + + Reset + Скинути + + + Launch at startup + Запускати при старті системи + + + Launch Flameshot + Запускати Flameshot + + + Show welcome message on launch + Показувати вітання під час запуску + + + Close application after capture + Закривати програму після захоплення екрану + + + Close after capture + Закрити після знімка + + + Close after taking a screenshot + Закрити після знімка + + + Copy URL after upload + Копіювати URL після завантаження + + + Copy URL and close window after upload + Копіювати URL і закрити вікно після завантаження + + + Save image after copy + Зберігати зображення після копіювання + + + Save image file after copying it + Зберігати файл зображення після копіювання + + + Save Path + Шлях збереження + + + Change... + Змінити... + + + Copy file path after save + Скопіювати шлях до файлу після збереження + + + Select default path for Screenshots + Виберіть шлях за замовчуванням для скріншотів + + + Use fixed path for screenshots to save + Використовувати фіксований шлях для знімків екрана для збереження + + + Choose a Folder + Обрати папку + + + Unable to write to directory. + Не вдалося записати в папку. + + + + GeneralConf + + + + Import + Імпорт + + + + + + + Error + Помилка + + + + Unable to read file. + Не вдалося прочитати файл. + + + + + Unable to write file. + Не вдалося записати файл. + + + + Save File + Зберегти файл + + + + Confirm Reset + Підтвердити скидання + + + + Are you sure you want to reset the configuration? + Ви дійсно хочете скинути налаштування? + + + + Show help message + Показувати повідомлення довідки + + + Show the help message at the beginning in the capture mode. + Показувати повідомлення довідки на початку режиму захоплення. + + + + Show the side panel button + Показувати кнопку бічної панелі + + + Show the side panel toggle button in the capture mode. + Показувати кнопку відкриття бічної панелі в режимі захоплення. + + + + Show desktop notifications + Показувати сповіщення + + + + Show tray icon + Показувати значок у лотку + + + Show the systemtray icon + Показувати значок у системному лотку + + + + Confirmation required to delete screenshot from the latest uploads + Потрібне підтвердження, щоб видалити знімок екрана з останніх завантажень + + + + Configuration File + Файл налаштувань + + + + Export + Експорт + + + + Reset + Скинути + + + + Automatic check for updates + Автоматична перевірка наявності оновлень + + + + Allow multiple flameshot GUI instances simultaneously + Дозволити відкривати кілька екземплярів графічного інтерфейсу flameshot одночасно + + + This allows you to take screenshots of flameshot itself for example. + Це дає змогу робити знімки екрана, наприклад, самого flameshot. + + + Automatically close daemon when it is not needed + Автоматично закривати фонову службу, коли вона не потрібна + + + Launch at startup + Запускати при старті системи + + + Launch Flameshot + Запускати Flameshot + + + + Show welcome message on launch + Показувати вітання під час запуску + + + + Use large predefined color palette + Використовувати велику попередньо визначену кольорову палітру + + + + Copy URL after upload + Копіювати URL після завантаження + + + Copy URL and close window after upload + Копіювати URL і закрити вікно після завантаження + + + + Save image after copy + Зберігати зображення після копіювання + + + Save image file after copying it + Зберігати файл зображення після копіювання + + + + Show the help message at the beginning in the capture mode + Показувати повідомлення довідки на початку режиму захоплення + + + + Use last region for GUI mode + Використовувати останню ділянку для графічного режиму + + + + Use the last region as the default selection for the next screenshot in GUI mode + Використовувати останню ділянку у якості стандартної для наступного знімка екрана у графічному режимі + + + + Show the side panel toggle button in the capture mode + Показати перемикач бічної панелі в режимі захоплення + + + + Enable desktop notifications + Увімкнути стільничні сповіщення + + + + Show abort notifications + Показувати сповіщення про переривання + + + + Enable abort notifications + Увімкнути сповіщення про переривання + + + + Show icon in the system tray + Показати піктограму в системному лотку + + + + Use grim to capture screenshots + Використовувати Grim для захоплення знімків + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + Grim — це утиліта, доступна лише в Wayland для захоплення скріншотів на основі протоколу screencopy. Зазвичай її вмикають лише на мінімальних віконних менеджерах Wayland, таких як Sway, Hyprland тощо. + + + + Ask for confirmation to delete screenshot from the latest uploads + Запитувати підтвердження, щоб видалити знімок екрана з останніх вивантажень + + + + Check for updates automatically + Автоматично перевіряти наявність оновлень + + + + This allows you to take screenshots of Flameshot itself for example + Це дозволяє робити знімки екрана самого Flameshot, наприклад + + + Launch Flameshot daemon when computer is booted + Запускати фонову службу Flameshot під час завантаження комп’ютера + + + + Show the welcome message box in the middle of the screen while taking a screenshot + Показ вікна вітального повідомлення у центрі екрана під час створення знімка екрана + + + + Use a large predefined color palette + Використовувати велику заздалегідь визначену палітру кольорів + + + + Copy on double click + Копіювати подвійним клацанням миші + + + Enable Copy on Double Click + Увімкнути копіювання подвійним клацанням миші + + + Copy URL and close window after uploading was successful + Копіювання URL-адреси та закриття вікна після завантаження було успішним + + + + Automatically unload from memory when it is not needed + Автоматично вивантажувати із пам'яті, коли не потрібне + + + + Automatically close daemon (background process) when it is not needed + Автоматично закривати демон (фоновий процес), коли він не потрібен + + + + Launch in background at startup + Запуск у фоновому режимі при старті + + + + Launch Flameshot daemon (background process) when computer is booted + Запуск демона Flameshot (фонового процесу) при старті комп'ютера + + + + Ask before quit capture + Запитувати при виході із захоплення + + + + Show the confirmation prompt before ESC quit + Показувати запит на підтвердження перед виходом за допомогою ESC + + + + Enable Copy to clipboard on Double Click + Увімкнути копіювання в буфер обміну подвійним клацанням + + + + Copy URL after uploading was successful + Копіювати URL-адресу після успішного завантаження + + + + After copying the screenshot, save it to a file as well + Після копіювання знімка екрана зберігати його до файлу + + + + Save Path + Шлях збереження + + + + Change... + Змінити... + + + + Use fixed path for screenshots to save + Використовувати фіксований шлях знімків екрана для збереження + + + + Preferred save file extension: + Бажане розширення файлу збереження: + + + + Latest Uploads Max Size + Максимальний розмір останніх завантажень + + + + Imgur Application Client ID + Ключ API Imgur + + + + Undo limit + Скасувати обмеження + + + + Use JPG format for clipboard (PNG default) + Використовуйте формат JPG для буфера обміну (типово PNG) + + + + Use lossy JPG format for clipboard (lossless PNG default) + Використовувати формат JPG з втратами для буфера обміну (за замовчуванням - PNG без втрат) + + + + Copy file path after save + Скопіювати шлях до файлу після збереження + + + + Copy the file path to clipboard after the file is saved + Копіювати шлях до буфера обміну після збереження файлу + + + + Anti-aliasing image when zoom the pinned image + Згладжування зображення під час масштабування закріпленого зображення + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + Після масштабування закріпленого зображення, якщо зображення згладжується або залишиться пікселізованим + + + + + Upload image without confirmation + Вивантажувати зображення без підтвердження + + + + Choose a Folder + Обрати теку + + + + Unable to write to directory. + Не вдалося записати в каталог. + + + + Show magnifier + Показати лупу + + + + Enable a magnifier while selecting the screenshot area + Увімкнути лупу, якщо вибрано ділянку знімка екрана + + + + Square shaped magnifier + Лупа квадратної форми + + + + Make the magnifier to be square-shaped + Зробити лупу квадратною + + + + Milliseconds before geometry display hides; 0 means do not hide + Мілісекунд до приховування відображення геометрії; 0 означає не приховувати + + + + Set geometry display timeout (ms) + Встановити час очікування відображення геометрії (мс) + + + + Selection Geometry Display + Відображення геометрії вибору + + + + Display Location + Розташування відображення + + + + None + Ні + + + + Top Left + Зверху ліворуч + + + + Top Right + Зверху праворуч + + + + Bottom Left + Внизу ліворуч + + + + Bottom Right + Внизу праворуч + + + + Center + У центрі + + + + Quality range of 0-100; Higher number is better quality and larger file size + Діапазон якості від 0 до 100; вище число означає кращу якість і більший розмір файлу + + + + JPEG Quality + Якість JPEG + + + + Reverse arrow + Зворотна стрілка + + + + Draw the arrow head first + Спочатку малювати головку стрілки + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + Останні відвантаження + + + Screenshots history is empty + Історія знімків екрана порожня + + + Copy URL + Копіювати URL + + + URL copied to clipboard. + URL скопійовано до буфера обміну. + + + Open in browser + Відкрити у вебоглядачі + + + Confirm to delete + Підтвердьте видалення + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Ви впевнені, що хочете видалити знімок екрана з останніх завантажень та сервера? + + + + ImgS3Uploader + + Upload image to S3 + Вивантаження зображення на S3 + + + Uploading Image + Вивантаження зображення + + + Uploading Image... + Вивантаження зображення... + + + Delete image from S3 + Видаліть зображення з S3 + + + Deleting image... + Видалення зображення... + + + URL copied to clipboard. + URL скопійовано до буферу обміну. + + + Unable to remove screenshot from the remote storage. + Не вдалося видалити знімок екрана з віддаленого сховища. + + + Network error + Помилка мережі + + + Possibly it doesn't exist anymore + Можливо, його вже не існує + + + Do you want to remove screenshot from local history anyway? + Ви все одно хочете видалити знімок екрана з місцевої історії? + + + Remove screenshot from history? + Видалити знімок екрана з історії? + + + Retrieving configuration file with s3 creds... + Отримання конфігураційного файлу з параметрами доступу до s3 ... + + + S3 Creds URL is not found in your configuration file + S3 Creds URL не знайдено у вашому файлі конфігурації + + + Error + Помилка + + + Unable to upload screenshot, please check your internet connection and try again + Не вдається завантажити знімок екрана, перевірте підключення до Інтернету та повторіть спробу + + + Unable to get s3 credentials, please check your VPN connection and try again + Не вдалося отримати конфігурацію для s3, перевірити своє з'єднання VPN і повторити спробу + + + + ImgS3UploaderTool + + Upload the selection to S3 bucket + Вивантажити виділення до S3 + + + + ImgUploadDialog + + + Upload Confirmation + Підтвердження вивантаження + + + + Do you want to upload this capture? + Вивантажити цей знімок? + + + + + Upload without confirmation + Вивантажити без підтвердження + + + + ImgUploader + + Upload image to S3 + Вивантажити зображення на S3 + + + Uploading Image + Вивантаження зображення + + + Upload image + Вивантажити зображення + + + Unable to open the URL. + Не вдалось відкрити URL. + + + URL copied to clipboard. + URL скопійовано до буферу обміну. + + + Screenshot copied to clipboard. + Знімок скопійовано до буферу обміну. + + + Deleting image... + Видалення зображення... + + + Uploading Image... + Вивантаження зображення... + + + Copy URL + Скопіювати URL + + + Open URL + Відкрити URL + + + Delete image + Видалити зображення + + + Image to Clipboard. + Зображення до буферу обміну. + + + + ImgUploaderBase + + + Upload image + Вивантажити зображення + + + + Uploading Image + Вивантаження зображення + + + + Copy URL + Копіювати URL-адресу + + + + Open URL + Відкрити URL-адресу + + + + Delete image + Видалити зображення + + + + Image to Clipboard. + Зображення до буфера обміну. + + + + Save image + Зберегти зображення + + + + Unable to open the URL. + Не вдалося відкрити URL-адресу. + + + + URL copied to clipboard. + URL-адресу скопійовано в буфер обміну. + + + + Screenshot copied to clipboard. + Знімок екрана скопійовано до буфера обміну. + + + + Unable to save the screenshot to disk. + Не вдалося зберегти знімок екрана на диск. + + + + Screenshot saved. + Знімок екрана збережено. + + + + ImgUploaderTool + + Imgage uploader tool + Інструмент вивантаження зображень + + + Image uploader tool + Інструмент вивантаження зображень + + + + Image Uploader + Вивантажувач зображень + + + + Upload the selection + Вивантажити виділений фрагмент + + + + ImgurUploader + + Upload to Imgur + Відвантажити на Imgur + + + Uploading Image + Відвантаження зображення + + + Copy URL + Копіювати URL + + + Open URL + Відкрити URL + + + Delete image + Видалити зображення + + + Image to Clipboard. + Зображення до буфера обміну. + + + + Unable to open the URL. + Не вдалось відкрити URL. + + + URL copied to clipboard. + URL скопійовано до буфера обміну. + + + Screenshot copied to clipboard. + Знімок скопійовано до буфера обміну. + + + + ImgurUploaderTool + + Image Uploader + Відвантаження зображень + + + Upload the selection to Imgur + Відвантажити вибране на Imgur + + + + InfoWindow + + + + About + Про програму + + + + + Icon + Піктограма + + + + + License + Ліцензія + + + + + GPLv3+ + GPLv3+ + + + + + Version + Версія + + + + + Flameshot v + Flameshot v + + + + + OS Info + Інформація про ОС + + + + + Copy Info + Копіювати інформацію + + + SPACEBAR + Пробіл + + + Right Click + Права кнопка миші + + + Mouse Wheel + Колесо миші + + + Move selection 1px + Перемістити виділення на 1px + + + Resize selection 1px + Змінити розмір виділення на 1px + + + Quit capture + Вийти із захоплення екрану + + + Copy to clipboard + Копіювати до буферу обміну + + + Save selection as a file + Зберегти вибране до файлу + + + Undo the last modification + Скасувати останню зміну + + + Toggle visibility of sidebar with options of the selected tool + Переключити видимість бічної панелі + + + Show color picker + Показати вибір кольору + + + Change the tool's thickness + Змінити товщину інструменту + + + Available shortcuts in the screen capture mode. + Доступні комбінації клавіш у режимі захоплення екрану. + + + Key + Клавіша + + + Description + Опис + + + <u><b>License</b></u> + <u><b>Ліцензія</b></u> + + + <u><b>Version</b></u> + <u><b>Версія</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Комбінації клавіш</b></u> + + + + InvertTool + + + Invert + Інвертувати + + + + Set Inverter as the paint tool + Установити Інвертор інструментом малювання + + + + LineTool + + + Line + Лінія + + + + Set the Line as the paint tool + Вибрати лінію інструментом малювання + + + + MarkerTool + + + Marker + Маркер + + + + Set the Marker as the paint tool + Вибрати маркер інструментом малювання + + + + MoveTool + + + Move + Переміщення + + + + Move the selection area + Перемістити вибір + + + + PencilTool + + + Pencil + Олівець + + + + Set the Pencil as the paint tool + Вибрати олівець інструментом малювання + + + + PinTool + + + Pin Tool + Прикріплення + + + + Pin image on the desktop + Прикріпити зображення до стільниці + + + + PinWidget + + + Context menu + Контекстне меню + + + + Copy to clipboard + Копіювати до буфера обміну + + + + Save to file + Зберегти у файл + + + + Rotate Right + Повернути вправо + + + + Rotate Left + Повернути вліво + + + + Increase Opacity + Збільшити непрозорість + + + + Decrease Opacity + Зменшити непрозорість + + + + Close + Закрити + + + + PixelateTool + + + Pixelate + Розмиття + + + + Set Pixelate as the paint tool. + Встановити розмивання як інструмент малювання. + + + Set Pixelate as the paint tool + Обрати Pixelate інструментом для малювання + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QHotkey + + Failed to register %1. Error: %2 + Не вдалося зареєструвати %1. Помилка: %2 + + + Failed to unregister %1. Error: %2 + Не вдалося скасувати реєстрацію %1. Помилка: %2 + + + + QObject + + + Save Error + Помилка збереження + + + + + Capture saved as + Знімок збережено як + + + + + Capture saved to clipboard. + Знімок збережено в буфер обміну. + + + Capture saved to clipboard + Знімок збережено до буфера обміну + + + + Error while saving to clipboard + Помилка під час збереження в буфер обміну + + + + + Error trying to save as + Помилка під час збереження як + + + + Save screenshot + Зберегти знімок екрана + + + + Path copied to clipboard as + Шлях скопійовано до буфера обміну як + + + Saving canceled + Збереження скасовано + + + Save canceled + Збереження скасовано + + + Capture is saved and copied to the clipboard as + Захоплення збережено і скопійовано в буфер обміну як + + + + Unable to connect via DBus + Не вдалось підключитися через DBus + + + + Powerful yet simple to use screenshot software. + Потужне, але просте у використанні програмне забезпечення для знімків екрана. + + + + See + Подивитись + + + Capture the entire desktop. + Захоплення всієї стільниці. + + + + Open the capture launcher. + Відкрити панель захоплення. + + + + Start a manual capture in GUI mode. + Запустити ручне захоплення в графічному режимі. + + + + Configure + Налаштувати + + + Capture a single screen. + Захоплення одного екрана. + + + Path where the capture will be saved + Шлях, куди збережеться знімок + + + + Capture screenshot of all monitors at the same time. + Зробити знімок екрана зі всіх моніторів одночасно. + + + + Capture a screenshot of the specified monitor. + Зробити знімок екрана зазначеного монітора. + + + + Existing directory or new file to save to + Наявний каталог або новий файл для збереження + + + + Save the capture to the clipboard + Зберегти знімок у буфер обміну + + + + Pin the capture to the screen + Закріпити вибрану ділянку на екрані + + + + Upload screenshot + Вивантажити знімок екрана + + + + Delay time in milliseconds + Час затримки в мілісекундах + + + + Repeat screenshot with previously selected region + Повторити знімок екрана з раніше вибраною ділянкою + + + + Screenshot region to select + Вибір ділянки знімка екрана + + + + Set the filename pattern + Задати шаблон назви файлу + + + + Accept capture as soon as a selection is made + Застосувати вибір ділянки, коли її обрано + + + + Enable or disable the trayicon + Увімкніть або вимкніть значок у лотку + + + + Enable or disable run at startup + Дозволити або заборонити запуск при завантаженні + + + + Enable or disable the notifications + Увімкнути або вимкнути сповіщення + + + + Check the configuration for errors + Перевірити налаштування для помилок + + + + Show the help message in the capture mode + Показувати довідкові повідомлення в режимі захоплення + + + + Define the main UI color + Визначте основний колір інтерфейсу користувача + + + + Define the contrast UI color + Визначте контрастний колір інтерфейсу + + + + Print raw PNG capture + Необроблене зображення PNG + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + Геометрія друку виділеного файлу у форматі WxH+X+Y. Якщо нічого не вказано, нічого не робиться + + + + Define the screen to capture (starting from 0) + Визначте екран для вибору ділянки (починаючи з 0) + + + + Invalid delay, it must be a number greater than 0 + Неприпустима затримка, вона має бути числом більшим за 0 + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + Неприпустима ділянка, використовуйте «WxH+X+Y» або «all» або «screen0/screen1/...». + + + + Invalid path, must be an existing directory or a new file in an existing directory + Неприпустимий шлях. Укажіть наявний каталог або новий файл у наявному каталозі + + + Define the screen to capture + Визначте екран для захоплення + + + + default: screen containing the cursor + типово: екран, що містить курсор миші + + + + Screen number + Номер екрана + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Недійсний колір, цей прапорець підтримує такі формати: +- #RGB (кожне з R, G і B — це одна шістнадцяткова цифра) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Такі кольори, як «синій» або «червоний» +Можливо, вам доведеться екранувати знак «#» отак «\ #FFF» + + + Invalid delay, it must be higher than 0 + Недійсна затримка, вона повинна бути вищою за 0 + + + + Invalid screen number, it must be non negative + Недійсний номер екрана, він має бути додатним + + + Invalid path, it must be a real path in the system + Недійсний шлях, він має бути наявним шляхом у системі + + + + Invalid value, it must be defined as 'true' or 'false' + Недійсне значення, воно має визначатися як «true» або «false» + + + + Error + Помилка + + + + Unable to write in + Не вдалось зберегти + + + + Requested screen exceeds screen count + Запитаний екран перевищує кількість екранів + + + + Full screen screenshot pinned to screen + Знімок усього екрана прикріплено на екран + + + URL copied to clipboard. + URL скопійовано до буфера обміну. + + + + Options + Параметри + + + Arguments + Аргументи + + + arguments + аргументи + + + + Subcommands + Підкоманди + + + + subcommands + підкоманди + + + + Usage + Використання + + + + options + параметри + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Flameshot типово запускається у фоновому режимі та додається піктограма лотка для конфігурації. + + + Hi, I'm already running! +You can find me in the system tray. + Привіт, я вже працюю! +Ви можете знайти мене в системному треї. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Привіт, я тут! Клацніть по значку в лотку, щоб зробити знімок екрана, або клацніть правою кнопкою, щоб побачити більше параметрів. + + + Toggle side panel + Показати/сховати бічну панель + + + Resize selection left 1px + Змінити розмір виділення ліворуч на 1 піксель + + + Resize selection right 1px + Змінити розмір виділення праворуч на 1 піксель + + + Resize selection up 1px + Змінити розмір виділення вгору на 1 піксель + + + Resize selection down 1px + Змінити розмір виділення вниз на 1 піксель + + + Select entire screen + Виберіть весь екран + + + Move selection left 1px + Перемістити виділення вліво на 1 піксель + + + Move selection right 1px + Перемістити виділення вправо на 1 піксель + + + Move selection up 1px + Перемістити виділення вгору на 1 піксель + + + Move selection down 1px + Перемістити виділення вниз на 1 піксель + + + Commit text in text area + Фіксувати текст у текстовій області + + + Delete current tool + Видалити поточний інструмент + + + + Quit capture + Вийти із захоплення екрана + + + + Screenshot history + Історія знімків екрана + + + + Capture screen + Захоплення екрана + + + + Show color picker + Показати вибір кольору + + + + Change the tool's size + Змінення розміру інструмента + + + Change the tool's thickness + Змінити товщину інструмента + + + + RectangleTool + + + Rectangle + Прямокутник + + + + Set the Rectangle as the paint tool + Вибрати прямокутник інструментом малювання + + + + RedoTool + + + Redo + Повторити + + + + Redo the next modification + Повторити наступну зміну + + + + SaveTool + + + Save + Зберегти + + + + Save screenshot to a file + Зберегти знімок екрана у файл + + + Save the capture + Зберегти знімок + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Не вдалося визначити стільничне середовище (GNOME? KDE? Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + Універсальний адаптер захоплення екрана Wayland вимагає Grim як компонент захоплення екрана Wayland. Якщо компонент захоплення екрана відсутній, будь ласка, встановіть його! + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + Якщо параметр useGrimAdapter не ввімкнено, буде використано протокол DBus. Слід зазначити, що використання протоколу DBus під керуванням Wayland не рекомендується. Рекомендується ввімкнути параметр useGrimAdapter у flameshot.ini, щоб активувати загальний адаптер скріншотів Wayland на основі Grim + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + Компонент скріншотів Grim реалізовано на основі Wlroots, його не можна використовувати в GNOME або подібних середовищах робочого столу + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + Не вдається визначити середовище робочого столу (GNOME? KDE? Qile? Sway? ...) + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + Підказка: спробуйте встановити змінну середовища XDG_CURRENT_DESKTOP. + + + + Unable to capture screen + Не вдалося захопити екран + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + Прямокутне виділення + + + + Set Selection as the paint tool + Вибрати прямокутне виділення інструментом малювання + + + + SetShortcutDialog + + + Set Shortcut + Встановити комбінацію клавіш + + + + Enter new shortcut to change + Введіть нову комбінацію + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Натисніть Esc, щоб скасувати, або ⌘+Backspace, щоб вимкнути комбінацію клавіш. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Натисніть Esc, щоб скасувати, або Backspace, щоб вимкнути комбінацію клавіш. + + + + + Flameshot must be restarted for changes to take effect. + Flameshot потрібно перезапустити, щоб застосувати зміни. + + + + ShortcutsWidget + + + Hot Keys + Гарячі клавіші + + + + Available shortcuts in the screen capture mode. + Доступні комбінації клавіш у режимі захоплення екрана. + + + + Description + Опис + + + + Key + Клавіша + + + + Left Double-click + Подвійне клацання лівою кнопкою миші + + + + Toggle side panel + Перемикання бічної панелі + + + + Grab a color from the screen + + + + + Resize selection left 1px + Змінити розмір виділення вліво на 1px + + + + Resize selection right 1px + Змінити розмір виділення праворуч на 1px + + + + Resize selection up 1px + Змінити розмір виділення вгору на 1px + + + + Resize selection down 1px + Змінити розмір виділення вниз на 1px + + + + Symmetrically decrease width by 2px + Симетрично зменшити ширину на 2 пікселі + + + + Symmetrically increase width by 2px + Симетрично збільшити ширину на 2 пікселі + + + + Symmetrically increase height by 2px + Симетрично збільшити висоту на 2 пікселі + + + + Symmetrically decrease height by 2px + Симетрично зменшити висоту на 2 пікселі + + + + Select entire screen + Вибрати весь екран + + + + Move selection left 1px + Перемістити виділення вліво на 1px + + + + Move selection right 1px + Перемістити виділення вправо на 1px + + + + Move selection up 1px + Перемістити виділення вгору на 1px + + + + Move selection down 1px + Перемістити виділення вниз на 1px + + + + Commit text in text area + Зафіксувати текст у текстовій області + + + + Delete selected drawn object + Видалити вибраний намальований об'єкт + + + + Cancel current selection + Скасувати поточний вибір + + + Delete current tool + Видалити поточний інструмент + + + + Capture screen + Захоплення екрана + + + + Screenshot history + Журнал знімків екрана + + + + SidePanelWidget + + Active thickness: + Активна товщина: + + + Active color: + Активний колір: + + + Press ESC to cancel + Натисніть Esc для скасування + + + + Active tool size: + Розмір активного інструмента: + + + + Active Color: + Активний колір: + + + + Grab Color + Визначити колір з екрана + + + + Display grid + Сітка відображення + + + + SizeDecreaseTool + + + Decrease Tool Size + Зменшити розмір інструменту + + + + Decrease the size of the other tools + Зменште розмір інших інструментів + + + + SizeIncreaseTool + + + Increase Tool Size + Збільшити розмір інструменту + + + + Increase the size of the other tools + Збільшити розмір інших інструментів + + + + SizeIndicatorTool + + Selection Size Indicator + Індикатор розміру виділення + + + Show X and Y dimensions of the selection + Показати розміри X і Y вибраного + + + Show the dimensions of the selection (X Y) + Показує розмір виділення (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + Століття (00-99) + + + + Year (00-99) + Рік (00-99) + + + + Year (2000) + Рік (2000) + + + + Month Name (jan) + Назва місяця (січ) + + + + Month Name (january) + Назва місяця (січень) + + + + Month (01-12) + Місяць (01-12) + + + + Week Day (1-7) + День тижня (1-7) + + + + Week (01-53) + Тиждень (01-53) + + + + Day Name (mon) + Назва дня тижня (пн) + + + + Day Name (monday) + Назва дня тижня (понеділок) + + + + Day (01-31) + День (01-31) + + + + Day of Month (1-31) + День місяця (1-31) + + + + Day (001-366) + День (001-366) + + + + Time (%H-%M-%S) + Час (%H-%M-%S) + + + + Time (%H-%M) + Час (%H-%M) + + + + Hour (00-23) + Година (00-23) + + + + Hour (01-12) + Година (01-12) + + + + Minute (00-59) + Хвилина (00-59) + + + + Second (00-59) + Секунда (00-59) + + + + Full Date (%m/%d/%y) + Повна дата (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + Повна дата (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + + + + + SystemNotification + + + Flameshot Info + Довідка Flameshot + + + + TextConfig + + + StrikeOut + Перекреслення + + + + Underline + Підкреслення + + + + Bold + Грубий + + + + Italic + Курсив + + + + Left Align + Вирівнювання за лівим краєм + + + + Center Align + Вирівнювання по центру + + + + Right Align + Вирівнювання за правим краєм + + + + TextTool + + + Text + Текст + + + + Add text to your capture + Додати текст на знімок + + + + TrayIcon + + + &Take Screenshot + &Зробити знімок + + + + &Open Launcher + &Відкрити панель запуску + + + + &Configuration + &Конфігурація + + + + &About + &Про застосунок + + + + Check for updates + Перевірити наявність оновлень + + + + New version %1 is available + Доступна нова версія %1 + + + + &Quit + Ви&йти + + + + &Latest Uploads + &Останні вивантаження + + + + &Open Save Path + &Відкрити шлях для збереження + + + + UIcolorEditor + + UI Color Editor + Редактор кольору інтерфейсу + + + + Change the color moving the selectors and see the changes in the preview buttons. + Змініть колір пересуваючи виділення та перегляньте зміни в кнопках перегляду. + + + + Select a Button to modify it + Виберіть кнопку, щоб змінити її + + + + Main Color + Основний колір + + + + Click on this button to set the edition mode of the main color. + Натисніть на цю кнопку, щоб включити режим редагування основного кольору. + + + + Contrast Color + Контрасний колір + + + + Click on this button to set the edition mode of the contrast color. + Натисніть на цю кнопку, щоб включити режим редагування контрасного кольору. + + + + UndoTool + + + Undo + Скасувати + + + + Undo the last modification + Скасувати останню зміну + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + Доступна нова версія Flameshot %1 + + + + Ignore + Нехтувати + + + + Later + Пізніше + + + + Update + Оновити + + + + UploadHistory + + + Upload History + Історія вивантажень + + + + Screenshots history is empty + Історія знімків екрана порожня + + + + UploadLineItem + + + Form + Форма + + + + TextLabel + TextLabel + + + + Copy URL + Копіювати URL-адресу + + + + Open In Browser + Відкрити у переглядачі + + + + Confirm to delete + Підтвердьте видалення + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Ви впевнені, що хочете видалити знімок екрана з останніх вивантажень та сервера? + + + + UploadStorageConfig + + Upload storage + Сховище завантажень + + + Imgur storage + Сховище Imgur + + + S3 storage (require config.ini file with s3 credentials) + Сховище S3 (потрібен файл config.ini з обліковими даними s3) + + + + UtilityPanel + + + Close + Закрити + + + + <Empty> + <Порожньо> + + + Hide + Сховати + + + + VisualsEditor + + + Opacity of area outside selection: + Непрозорість області за межами вибору: + + + + UI Color Editor + Редактор кольору інтерфейсу + + + + Colorpicker Editor + Редактор вибору кольорів + + + + Button Selection + Вибір кнопок + + + + Select All + Вибрати все + + + + color_widgets::ColorDialog + + + Pick + Вибрати + + + + color_widgets::ColorPalette + + + Unnamed + Без назви + + + + color_widgets::ColorPaletteModel + + + Unnamed + Без назви + + + + %1 (%2 colors) + %1 (%2 кольори) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + Відкрити нову палітру з файлу + + + + + Create a new palette + Створити нову палітру + + + + + Duplicate the current palette + Дублювати поточну палітру + + + + + Delete the current palette + Видалити поточну палітру + + + + + Revert changes to the current palette + Скасувати зміни поточної палітри + + + + + Save changes to the current palette + Зберегти зміни в поточну палітру + + + + + Add a color to the palette + Додати колір до палітри + + + + + Remove the selected color from the palette + Вилучити обраний колір з палітри + + + + + New Palette + Нова палітра + + + + + Name + Назва + + + + GIMP Palettes (*.gpl) + Палітри GIMP (*.gpl) + + + + Palette Image (%1) + Зображення палітри (%1) + + + + All Files (*) + Усі файли (*) + + + + + Open Palette + Відкрити палітру + + + + Failed to load the palette file +%1 + Не вдалося завантажити файл палітри +%1 + + + + color_widgets::GradientEditor + + + Add Color + Додати колір + + + + Remove Color + Вилучити колір + + + + Edit Color... + Змінити колір... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 кольорів) + + + + color_widgets::Swatch + + + Clear Color + Очистити колір + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_vi.ts b/data/translations/Internationalization_vi.ts new file mode 100644 index 0000000..c315618 --- /dev/null +++ b/data/translations/Internationalization_vi.ts @@ -0,0 +1,3161 @@ + + + + + AbstractWidgetList + + + Add New + Thêm mới + + + + Move Up + Di chuyển lên + + + + Move Down + Di chuyển xuống + + + + Remove + Gỡ bỏ + + + + AcceptTool + + + Accept + Chấp nhận + + + + Accept the capture + Chấp nhận tấm ảnh chụp + + + + AppLauncher + + + App Launcher + Mở ảnh bằng + + + + Choose an app to open the capture + Chọn ứng dụng để mở ảnh chụp màn hình + + + + AppLauncherWidget + + + Open With + Mở bằng + + + + Launch in terminal + Chạy trong Dấu nhắc lệnh + + + + Keep open after selection + Vẫn giữ sau khi chọn + + + + + Error + Lỗi + + + + Unable to launch in terminal. + Không mở khởi chạy dấu nhắc lệnh. + + + + Unable to write in + Không thể viết vào + + + + ArrowTool + + + Arrow + Mũi tên + + + + Set the Arrow as the paint tool + Chọn công cụ này để vẽ mũi tên + + + + BlurTool + + Blur + Desenfocament + + + Set Blur as the paint tool + Estableix el desenfocament com a eina de dibuix + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Capture Mode</b> + + + + Rectangular Region + Vùng hình chữ nhật + + + + Full Screen (Current Display) + Toàn màn hình (màn hình hiện tại) + + + + Full Screen (All Monitors) + Toàn màn hình (tất cả các màn hình) + + + + No Delay + Không độ trễ + + + + second + giây + + + + + + seconds + giây + + + + + Take new screenshot + Chụp ảnh màn hình mới + + + + + Area: + Khu vực: + + + + + Capture Launcher + Trình khởi chạy chụp màn hình + + + + + TextLabel + Nhãn văn bản + + + + + Capture Mode + Chế độ chụp + + + + + Delay: + Độ trễ: + + + + + WxH+x+y + WxH+x+y + + + + CaptureWidget + + + Unable to capture screen + Impossible capturar la pantalla + Không thể chụp màn hình :< + + + + Mouse + Chuột + + + + Select screenshot area + Chọn khu vực chụp màn hình + + + + Mouse Wheel + Con lăn chuột + + + + Change tool size + Thay đổi kích cỡ công cụ + + + + Right Click + Nhấp chuột phải + + + + Show color picker + Hiện trình chọn màu + + + + Open side panel + Mở bảng điều khiển bên + + + + Esc + Esc + + + + Exit + Thoát + + + + Quit Capture + Thoát trình chụp + + + + Are you sure you want to quit capture? + Bạn có chắc chắn muốn hủy chụp không? + + + + Do not show this again + Không bao giờ hiển thị nữa + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot đã mất tiêu điểm. Các phím tắt sẽ không hoạt động cho đến khi bạn nhấp vào đâu đó. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + Đã giải quyết lỗi cấu hình. Khởi chạy lại `flameshot gui` để áp dụng. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + + + + Tool Settings + Cài đặt công cụ + + + + CircleCountTool + + + Circle Counter + Bộ đếm vòng tròn + + + + Add an autoincrementing counter bubble + Thêm các vòng tròn có ghi số theo thứ tự nhấp chuột + + + + CircleTool + + + Circle + Hình tròn + + + + Set the Circle as the paint tool + Chọn công cụ này để vẽ hình tròn + + + + ColorDialog + + + + Select Color + Chọn màu + + + + + Saturation + Độ bão hòa + + + + + Hue + Sắc độ màu + + + + + Hex + Hex + + + + + Blue + Xanh dương + + + + + Value + Giá trị + + + + + Green + Xanh lá + + + + + Alpha + Độ trong suốt + + + + + Red + Đỏ + + + + ColorGrabWidget + + + Accept color + Chấp nhận màu + + + + Enter or Left Click + Nhấn Enter hoặc nhấp chuột trái + + + + Precisely select color + Trình chọn màu chuẩn + + + + Hold Left Click + Nhấn giữ chuột trái + + + + Toggle magnifier + Bật/tắt kính lúp + + + + Space or Right Click + Nhấn phím cách hoặc nhấp chuột phải + + + + Cancel + Hủy + + + + Esc + Esc + + + + ColorPickerEditor + + + Edit Preset: + Chỉnh sửa giá trị: + + + + Enter color to update preset + Nhập màu để cập nhật + + + + Update + Cập nhật + + + + Press button to update the selected preset + Nhấn nút này để cập nhật màu đã chọn + + + + Delete + Xóa + + + + Press button to delete the selected preset + Nhấn nút này để xóa màu đã chọn + + + + Add Preset: + Thêm màu: + + + + Enter color manually or select it using the color-wheel + Nhập màu theo cách thủ công hoặc điều chỉnh vòng màu + + + + Add + Thêm + + + + Press button to add preset + Nhấn nút này để thêm màu + + + + + Error + Lỗi + + + + Unable to add preset. Maximum limit reached. + Không thể thêm màu vì đã đạt đến giới hạn tối đa. + + + + Unable to remove preset. Minimum limit reached. + Không thể xóa bỏ màu vì đã đạt đến giới hạn tối thiếu. + + + + ConfigErrorDetails + + + Configuration errors + Lỗi cấu hình + + + + ConfigHandler + + + Unrecognized setting: '%1' + + Cài đặt không dược nhận dạng: '%1' + + + + + Unrecognized shortcut name: '%1'. + + Tên phím tắt không được nhận dạng: '%1'. + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + Xung đột phím tắt: '%1' vè '%2' có cùng phím tắt: %3 + + + + + Bad value in '%1'. Expected: %2 + + Giá trị không hợp lệ ở '%1'. Dự định: %2 + + + + + You have successfully resolved the configuration error. + Bạn đã giải quyết thành công được lỗi cấu hình. + + + + The configuration contains an error. Open configuration to resolve. + Cấu hình có lỗi. Mở cấu hình để giải quyết. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + Khóa cấu hình không hợp lệ '%1' trong ConfigHandler. Vui lòng báo lỗi này. + + + + ConfigResolver + + + Resolve configuration errors + Giải quyết lỗi cấu hình + + + + <b>You must resolve all errors before continuing:</b> + <b>Bạn phải giải quyết tất cả lỗi trước khi tiếp tục:</b> + + + + Reset + Đặt lại + + + + Reset to the default value. + Đặt lại thành giá trị mặc định. + + + + Remove + Gỡ bỏ + + + + Remove this setting. + Gỡ bỏ cài đặt này. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + Một vài phím tắt đã xảy ra xung đột. +Điều này KHÔNG ngăn Flameshot khởi động. +Vui lòng xử lí chúng thủ công trong tệp cấu hình. + + + + Resolve all + Giải quyết tất cả + + + + Resolve all listed errors. + Giải quyết tất cả các lỗi đã được liệt kê. + + + + Details + Chi tiết + + + + ConfigWindow + + + Configuration + Cấu hình + + + + Interface + Giao diện + + + + Filename Editor + Chỉnh sửa tên tệp + + + + General + Chung + + + + Shortcuts + Phím tắt + + + + Resolve + Giải quyết + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>Tệp cấu hình có lỗi. Vui lòng giải quyết chúng trước khi tiếp tục</b> + + + + Controller + + New version %1 is available + New version %1 is available + + + You have the latest version + You have the latest version + + + Failed to get information about the latest version. + Failed to get information about the latest version. + + + Error + Error + + + Unable to close active modal widgets + Unable to close active modal widgets + + + &Open Launcher + &Open Launcher + + + &Configuration + &Configuration + + + &About + &About + + + Check for updates + Check for updates + + + &Latest Uploads + &Latest Uploads + + + &Information + &Informació + + + &Quit + &Quit + + + &Take Screenshot + &Take Screenshot + + + + CopyTool + + + Copy + Sao chép + + + + Copy selection to clipboard + Sao chép vùng đã chọn vào bảng tạm + + + Copy the selection into the clipboard + Copy the selection into the clipboard + + + + DBusUtils + + Unable to connect via DBus + Unable to connect via DBus + + + + ExitTool + + + Exit + Thoát + + + + Leave the capture screen + Thoát khỏi màn hình trình chụp + + + + FileNameEditor + + + Edit the name of your captures: + Chỉnh sửa tên ảnh chụp của bạn: + + + + Edit: + Chỉnh sửa: + + + + Preview: + Xem trước: + + + + Save + Lưu + + + + Saves the pattern + Lưu lại mẫu + + + + Restore + Khôi phục lại + + + Reset + Reinicialitza + + + + Restores the saved pattern + Khôi phục lại mẫu đã lưu + + + + Clear + Làm trống + + + + Deletes the name + Xóa tên + + + + Flameshot + + + Error + Lỗi + + + + Unable to close active modal widgets + Không thể đóng các tiện ích dạng hộp thoại đang hoạt động + + + + URL copied to clipboard. + Đã sao chép URL vào bảng tạm. + + + + FlameshotDaemon + + + New version %1 is available + Phiên bản %1 đã phát hành 🥳 + + + + You have the latest version + Bạn đã dùng phiên bản mới nhất + + + + Failed to get information about the latest version. + Không thể lấy được thông tin về phiên bản mới. + + + + Unable to connect via DBus + Không thể kết nối thông qua DBus + + + + GeneneralConf + + Show help message + Mostra el missatge d'ajuda + + + Show the help message at the beginning in the capture mode. + Mostra el missatge d'ajuda en iniciar el mode de captura. + + + Show desktop notifications + Mostra les notificacions d'escriptori + + + Show tray icon + Mostra la icona en la barra de tasques + + + Show the systemtray icon + Mostra la icona en la barra de tasques + + + Import + Importar + + + Error + Error + + + Unable to read file. + Impossible llegir el fitxer. + + + Unable to write file. + Impossible escriure al fitxer. + + + Save File + Guardar Arxiu + + + Confirm Reset + Confirmar Reset + + + Are you sure you want to reset the configuration? + Esteu segur que voleu reiniciar la configuració? + + + Configuration File + Fitxer de Configuració + + + Export + Exportar + + + Reset + Reset + + + Launch at startup + Llançament a l'inici + + + + GeneralConf + + + + Import + Nhập vào + + + + + + + Error + Lỗi + + + + Unable to read file. + Không thể đọc tệp. + + + + + Unable to write file. + Không thể ghi tệp. + + + + Save File + Lưu tập tin + + + + Confirm Reset + Xác nhận đặt lại + + + + Are you sure you want to reset the configuration? + Bạn có chắc chắn muốn đặt lại cấu hình không? + + + + Show help message + Hiển thị bảng trợ giúp + + + Show the help message at the beginning in the capture mode. + Show the help message at the beginning in the capture mode. + + + + Show the side panel button + Hiển thị nút bảng điều khiển bên + + + Show the side panel toggle button in the capture mode. + Show the side panel toggle button in the capture mode. + + + + Show desktop notifications + Hiển thị thông báo máy tính + + + + Show tray icon + Hiển thị biểu tượng trong khay + + + Show the systemtray icon + Show the systemtray icon + + + + Confirmation required to delete screenshot from the latest uploads + Cần xác nhận để xóa ảnh chụp màn hình khỏi các lần tải lên gần đây + + + + Configuration File + Tệp cấu hình + + + + Export + Xuất ra + + + + Reset + Đặt lại + + + + Automatic check for updates + Tự động kiểm tra cập nhật mới + + + + Allow multiple flameshot GUI instances simultaneously + Cho phép nhiều phiên bản giao diện đồ họa Flameshot chạy đồng thời + + + Automatically close daemon when it is not needed + Automatically close daemon when it is not needed + + + Launch at startup + Launch at startup + + + Launch Flameshot + Launch Flameshot + + + + Show welcome message on launch + Hiện thông báo chào mừng khi khởi chạy + + + + Use large predefined color palette + Sử dụng bảng màu với nhiều màu hơn + + + + Copy URL after upload + Sao chép URL sau khi đăng tải + + + Copy URL and close window after upload + Copy URL and close window after upload + + + + Save image after copy + Lưu lại ảnh sau khi sao chép + + + Save image file after copying it + Save image file after copying it + + + + Show the help message at the beginning in the capture mode + Hiển thị ô hỗ trợ khi bắt đầu chế độ chụp + + + + Use last region for GUI mode + Giữ định dạng của trước đó khi chụp + + + + Use the last region as the default selection for the next screenshot in GUI mode + Sử dụng định dạng giao diện trước thành mặc định cho lần chụp tiếp theo + + + + Show the side panel toggle button in the capture mode + Hiển thị nút mở bảng điều khiển bên trong chế độ chụp + + + + Enable desktop notifications + Bật thông báo trên màn hình + + + + Show abort notifications + Hiện thông báo hủy + + + + Enable abort notifications + Hiện thông báo hủy + + + + Show icon in the system tray + Hiển thị biểu tượng trong khay + + + + Use grim to capture screenshots + Sử dụng grim để chụp ảnh màn hình + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + (Google dịch) Grim là tiện ích chỉ dành cho Wayland để chụp màn hình dựa trên giao thức screencopy. Nhìn chung, chỉ bật trên các trình quản lý cửa sổ Wayland tối thiểu như sway, hyprland, v.v. + + + + Ask for confirmation to delete screenshot from the latest uploads + Yêu cầu xác nhận để xóa ảnh chụp màn hình khỏi các lần tải lên gần đây nhất + + + + Check for updates automatically + Kiểm tra cập nhật mới một cách tự động + + + + This allows you to take screenshots of Flameshot itself for example + Cái này cho phép bạn chụp ảnh màn hình của Flameshot chẳng hạn + + + Launch Flameshot daemon when computer is booted + Launch Flameshot daemon when computer is booted + + + + Show the welcome message box in the middle of the screen while taking a screenshot + Hiển thị thông báo chào mừng ở giữa màn hình trong khi chụp ảnh + + + + Use a large predefined color palette + Sử dụng một bảng màu gồm nhiều màu sắc hơn + + + + Copy on double click + Sao chép khi nháy đúp chuột + + + Enable Copy on Double Click + Enable Copy on Double Click + + + Copy URL and close window after uploading was successful + Copy URL and close window after uploading was successful + + + + Automatically unload from memory when it is not needed + Giải phóng bộ nhớ tự động khi không cần thiết + + + + Automatically close daemon (background process) when it is not needed + Tự động đóng daemon (tác vụ nền) khi không cần thiết + + + + Launch in background at startup + Tự động chạy trong nền khi khởi động + + + + Launch Flameshot daemon (background process) when computer is booted + Khởi chạy Flameshot daemon (tác vụ nền) khi máy tính đang khởi động + + + + Ask before quit capture + Hỏi trước khi thoát trình chụp + + + + Show the confirmation prompt before ESC quit + Hiện thị lời nhắc xác nhận trước khi thoát bằng nút Esc + + + + Enable Copy to clipboard on Double Click + Cho phép sao chép vào bảng tạm bằng cách nháy đúp chuột 📋 + + + + Copy URL after uploading was successful + Sao chép URL sau khi đăng tải thành công + + + + After copying the screenshot, save it to a file as well + Sau khi sao chép ảnh chụp màn hình, ứng dụng sẽ tự động lưu nó thành tệp + + + + Save Path + Đường dẫn để lưu + + + + Change... + Thay đổi... + + + + Use fixed path for screenshots to save + Sử dụng đường dẫn cố định để lưu ảnh chụp màn hình + + + + Preferred save file extension: + Đuôi tệp cần ưu tiên: + + + + Latest Uploads Max Size + Giới hạn kích thước tối đa cho các tệp vừa tải lên + + + + Imgur Application Client ID + ID ứng dụng Imgur + + + + Undo limit + Giới hạn lần hoàn tác + + + + Use JPG format for clipboard (PNG default) + Sử dụng định dạng JPG cho bảng tạm (mặc định là PNG) + + + + Use lossy JPG format for clipboard (lossless PNG default) + Sử dụng định dạng JPG "chất lượng tệ hơn" cho bảng tạm (mặc định là định dạng PNG "chất lượng tốt hơn") + + + + Copy file path after save + Sao chép đường dẫn tệp sau khi lưu + + + + Copy the file path to clipboard after the file is saved + Sao chép đường dẫn tệp vào bảng tạm khi tệp đã được lưu + + + + Anti-aliasing image when zoom the pinned image + Làm mịn ảnh khi phóng to ảnh đang ghim + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + Sau khi phóng to ảnh đã ghim, ảnh sẽ trở nên mượt mà hơn thay vì nguyên dạng pixel + + + + + Upload image without confirmation + Đăng tải hình ảnh mà không cần xác nhận + + + + Choose a Folder + Chọn thư mục + + + + Unable to write to directory. + Không thể ghi vào thư mục. + + + + Show magnifier + Hiển thị kính lúp + + + + Enable a magnifier while selecting the screenshot area + Cho phép kính lúp khi chọn khu vực để chụp ảnh + + + + Square shaped magnifier + Kính lúp hình vuông + + + + Make the magnifier to be square-shaped + Làm cho kính lúp có hình vuông + + + + Milliseconds before geometry display hides; 0 means do not hide + Thời gian (ms) trước khi trình kích thước ẩn đi; giá trị 0 sẽ không ẩn + + + + Set geometry display timeout (ms) + Điều chỉnh thời gian chờ của trình kích thước (ms) + + + + Selection Geometry Display + Lựa chọn của Trình kích thước + + + + Display Location + Vị trí hiển thị + + + + None + Không có + + + + Top Left + ↖ Ở trên bên trái + + + + Top Right + Ở trên bên phải ↗ + + + + Bottom Left + ↙ Ở dưới bên trái + + + + Bottom Right + Ở dưới bên phải ↘ + + + + Center + Trung tâm + + + + Quality range of 0-100; Higher number is better quality and larger file size + Tùy chỉnh chất lượng với phạm vi từ 0 -100; Số càng cao thì chất lượng và dung lượng càng cao + + + + JPEG Quality + Chất lượng ảnh JPEG + + + + Reverse arrow + Mũi tên ngược + + + + Draw the arrow head first + Khi vẽ sẽ vẽ đầu của mũi tên trước + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + Latest Uploads + + + Screenshots history is empty + Screenshots history is empty + + + Copy URL + Copy URL + + + URL copied to clipboard. + URL copied to clipboard. + + + Open in browser + Open in browser + + + Confirm to delete + Confirm to delete + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Are you sure you want to delete a screenshot from the latest uploads and server? + + + + ImgS3Uploader + + Uploading Image + S'està pujant la imatge + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Error + Error + + + + ImgUploadDialog + + + Upload Confirmation + Xác nhận đăng tải + + + + Do you want to upload this capture? + Bạn có chắc chắn muốn đăng tấm ảnh chụp này không? + + + + + Upload without confirmation + Đăng tải mà không cần xác nhận + + + + ImgUploader + + Uploading Image + S'està pujant la imatge + + + Delete image + Esborra la imatge + + + Unable to open the URL. + No es pot obrir l'URL. + + + URL copied to clipboard. + L'URL s'ha copiat al porta-retalls. + + + Screenshot copied to clipboard. + La captura s'ha copiat al porta-retalls. + + + Copy URL + Copia l'URL + + + Open URL + Obri l'URL + + + Image to Clipboard. + Imatge al porta-retalls. + + + + ImgUploaderBase + + + Upload image + Đăng tải hình ảnh + + + + Uploading Image + Đang đăng tải hình ảnh + + + + Copy URL + Sao chép URL + + + + Open URL + Mở URL + + + + Delete image + Xóa hình ảnh + + + + Image to Clipboard. + Hình ảnh vào Bảng tạm. + + + + Save image + Lưu hình ảnh + + + + Unable to open the URL. + Không thể mở URL. + + + + URL copied to clipboard. + Đã sao chép URL vào bảng tạm. + + + + Screenshot copied to clipboard. + Đã sao chép ảnh chụp màn hình vào bảng tạm. + + + + Unable to save the screenshot to disk. + Không thể lưu ảnh chụp màn hình vào ổ đĩa. + + + + Screenshot saved. + Đã lưu ảnh chụp màn hình. + + + + ImgUploaderTool + + + Image Uploader + Trình tải ảnh + + + + Upload the selection + Đăng tải lựa chọn + + + + ImgurUploader + + Upload to Imgur + Upload to Imgur + + + Uploading Image + Uploading Image + + + Copy URL + Copy URL + + + Open URL + Open URL + + + Delete image + Delete image + + + Image to Clipboard. + Image to Clipboard. + + + + Unable to open the URL. + Không thể mở URL. + + + URL copied to clipboard. + URL copied to clipboard. + + + Screenshot copied to clipboard. + Screenshot copied to clipboard. + + + + ImgurUploaderTool + + Image Uploader + Image Uploader + + + Upload the selection to Imgur + Upload the selection to Imgur + + + + InfoWindow + + + + About + Về chúng tôi + + + + + Icon + Biểu tượng + + + + + License + Giấy phép + + + + + GPLv3+ + GPLv3+ + + + + + Version + Phiên bản + + + + + Flameshot v + Flameshot v + + + + + OS Info + Thông tin OS + + + + + Copy Info + Sao chép thông tin + + + Right Click + Clic dret + + + Mouse Wheel + Roda del ratolí + + + Move selection 1px + Mou la selecció 1 px + + + Resize selection 1px + Redimensiona la selecció 1 px + + + Quit capture + Ix de la captura + + + Copy to clipboard + Copia al porta-retalls + + + Save selection as a file + Guarda la selecció com a fitxer + + + Undo the last modification + Desfés l'última modificació + + + Show color picker + Mostra el selector de color + + + Change the tool's thickness + Canvia el gruix de l'eina + + + Key + Tecla + + + Description + Descripció + + + <u><b>License</b></u> + <u><b>License</b></u> + + + <u><b>Version</b></u> + <u><b>Version</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>Dreceres</b></u> + + + Available shortcuts in the screen capture mode. + Dreceres disponibles en el mode de captura de pantalla. + + + + InvertTool + + + Invert + Đảo màu + + + + Set Inverter as the paint tool + Sử dụng công cụ này để đảo màu ảnh + + + + LineTool + + + Line + Đường kẻ + + + + Set the Line as the paint tool + Sử dụng công cụ này để vẽ đường thẳng + + + + MarkerTool + + + Marker + Đánh dấu + + + + Set the Marker as the paint tool + Sử dụng công cụ này để đánh dấu (giống bút dạ quang) + + + + MoveTool + + + Move + Di chuyển + + + + Move the selection area + Để di chuyển khu vực đã chọn + + + + PencilTool + + + Pencil + Bút chì + + + + Set the Pencil as the paint tool + Sử dụng bút chì để vẽ + + + + PinTool + + + Pin Tool + Ghim + + + + Pin image on the desktop + Ghim ảnh lên màn hình + + + + PinWidget + + + Context menu + Menu ngữ cảnh + + + + Copy to clipboard + Sao chép vào bảng tạm + + + + Save to file + Lưu thành tệp tin + + + + Rotate Right + Xoay sang phải ↩ + + + + Rotate Left + Xoay sang trái ↪ + + + + Increase Opacity + Tăng độ mờ nhạt + + + + Decrease Opacity + Giảm độ mờ nhạt + + + + Close + Đóng + + + + PixelateTool + + + Pixelate + Làm mờ + + + + Set Pixelate as the paint tool. + Chọn công cụ này để làm mờ ảnh. + + + Set Pixelate as the paint tool + Set Pixelate as the paint tool + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QHotkey + + Failed to register %1. Error: %2 + Failed to register %1. Error: %2 + + + Failed to unregister %1. Error: %2 + Failed to unregister %1. Error: %2 + + + + QObject + + + + Capture saved to clipboard. + Đã lưu ảnh chụp vào bảng tạm. + + + + Error while saving to clipboard + Xảy ra lỗi khi lưu vào bảng tạm + + + + Save screenshot + Lưu ảnh chụp màn hình + + + + Path copied to clipboard as + Đường dẫn đã được sao chép vào bảng tạm dưới dạng + + + Saving canceled + Saving canceled + + + Save canceled + Save canceled + + + Capture is saved and copied to the clipboard as + Capture is saved and copied to the clipboard as + + + + Save Error + Lưu lỗi + + + + + Capture saved as + Đã lưu ảnh chụp dưới dạng + + + + + Error trying to save as + Lỗi khi thử lưu ảnh dưới dạng + + + + Unable to connect via DBus + Không thể kết nối thông qua DBus + + + + Powerful yet simple to use screenshot software. + Phần mềm chụp ảnh màn hình mạnh mẽ nhưng dễ sử dụng. + + + + See + Thấy + + + Capture the entire desktop. + Capture the entire desktop. + + + + Open the capture launcher. + Mở trình chụp. + + + + Start a manual capture in GUI mode. + Bắt đầu chụp thủ công ở chế độ giao diện. + + + + Configure + Cấu hình + + + Capture a single screen. + Capture a single screen. + + + Path where the capture will be saved + Path where the capture will be saved + + + + Capture screenshot of all monitors at the same time. + Chụp màn hình tất cả màn hình cùng lúc. + + + + Capture a screenshot of the specified monitor. + Chụp ảnh màn hình của màn hình được chỉ định. + + + + Existing directory or new file to save to + Thư mục hiện có hoặc tệp mới để lưu vào + + + + Save the capture to the clipboard + Lưu ảnh chụp vào bảng tạm + + + + Pin the capture to the screen + Ghim ảnh chụp vào màn hình + + + + Upload screenshot + Đăng tải ảnh chụp màn hình + + + + Delay time in milliseconds + Thời gian trễ tính bằng mili giây + + + + Repeat screenshot with previously selected region + Lặp lại ảnh chụp màn hình với vùng đã chọn trước đó + + + + Screenshot region to select + Vùng ảnh chụp để chọn + + + + Set the filename pattern + Đặt mẫu tên tệp + + + + Accept capture as soon as a selection is made + Chấp nhận chụp ngay khi lựa chọn được thực hiện + + + + Enable or disable the trayicon + Bật hoặc tắt biểu tượng trong khay + + + + Enable or disable run at startup + Bật hoặc tắt chạy khi khởi động + + + + Enable or disable the notifications + Bật hoạt tắt thông báo + + + + Check the configuration for errors + Kiểm tra cấu hình để tim lỗi + + + + Show the help message in the capture mode + Hiển thị ô trợ giúp khi ở chế độ chụp + + + + Define the main UI color + Chọn màu chính cho giao diện + + + + Define the contrast UI color + Chọn màu sắc tương phản cho giao diện + + + + Print raw PNG capture + In ảnh chụp PNG gốc + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + In thông số của vùng chọn theo định dạng WxH+X+Y. Không thực hiện gì nếu đã chọn chế độ raw + + + + Define the screen to capture (starting from 0) + Chọn màn hình cần chụp (bắt đầu từ 0) + + + + Invalid delay, it must be a number greater than 0 + Độ trễ không hợp lệ, nó cần phải là một con số lớn hơn 0 + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + Vùng không hợp lệ, sử dụng 'WxH+X+Y' hoặc 'all' hoặc 'screen0/screen1/...'. + + + + Invalid path, must be an existing directory or a new file in an existing directory + Đường dẫn không hợp lệ, phải là một thư mục hiện có hoặc một tệp mới trong một thư mục hiện có + + + Define the screen to capture + Define the screen to capture + + + + default: screen containing the cursor + mặc định: màn hình chứa con trỏ chuột + + + + Screen number + Số màn hình + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Màu không hợp lệ, cờ này hỗ trợ các định dạng sau: +- #RGB (mỗi R, G và B là một chữ số hex đơn) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Tên màu sắc như 'blue' (xanh dương) hay 'red' (đỏ) +Bạn có thẻ cần thoát kí tự # như '\#FFF' + + + Invalid delay, it must be higher than 0 + Invalid delay, it must be higher than 0 + + + + Invalid screen number, it must be non negative + Số màn hình không hợp lệ, nó cần phải là một số không âm + + + Invalid path, it must be a real path in the system + Invalid path, it must be a real path in the system + + + + Invalid value, it must be defined as 'true' or 'false' + Giá trị không hợp lệ, phải được định nghĩa là 'true' (đúng) hoặc 'false' (sai) + + + + Error + Lỗi + + + + Unable to write in + Không thể viết vào + + + URL copied to clipboard. + URL copied to clipboard. + + + + Options + Tùy chọn + + + Arguments + Arguments + + + arguments + arguments + + + + Subcommands + Các lệnh phụ + + + + subcommands + các lệnh phụ + + + + Usage + Sử dụng + + + + options + tùy chọn + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Mặc định, Flameshot sẽ chạy ngầm và hiển thị biểu tượng ở khay hệ thống để cấu hình. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Hello, tui ở đây nè :> Click vào icon trong khay để chụp màn hình hoặc chuột phải để nhìn thêm tùy chọn nhé. + + + + Requested screen exceeds screen count + Yêu cầu màn hình vượt quá số lượng hiện có + + + + Full screen screenshot pinned to screen + Ảnh chụp toàn màn hình đã ghim vào màn hình + + + Toggle side panel + Toggle side panel + + + Resize selection left 1px + Resize selection left 1px + + + Resize selection right 1px + Resize selection right 1px + + + Resize selection up 1px + Resize selection up 1px + + + Resize selection down 1px + Resize selection down 1px + + + Select entire screen + Select entire screen + + + Move selection left 1px + Move selection left 1px + + + Move selection right 1px + Move selection right 1px + + + Move selection up 1px + Move selection up 1px + + + Move selection down 1px + Move selection down 1px + + + Commit text in text area + Commit text in text area + + + Delete current tool + Delete current tool + + + + Quit capture + Thoát chụp + + + + Screenshot history + Lịch sử chụp màn hình + + + + Capture screen + Chụp màn hình + + + + Show color picker + Hiện trình chọn màu + + + + Change the tool's size + Thay đổi kích cỡ công cụ + + + Change the tool's thickness + Change the tool's thickness + + + + RectangleTool + + + Rectangle + Hình chữ nhật + + + + Set the Rectangle as the paint tool + Chọn công cụ này để vẽ hình chữ nhật + + + + RedoTool + + + Redo + Làm lại + + + + Redo the next modification + Làm lại sửa đổi tiếp theo + + + + SaveTool + + + Save + Lưu + + + + Save screenshot to a file + Lưu ảnh chụp màn hình thành một tập tin + + + Save the capture + Save the capture + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + Bộ điều hợp chụp màn hình phổ thông của Wayland yêu cầu Grim làm thành phần chụp màn hình. Nếu thiếu thành phần này, vui lòng cài đặt! + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + Nếu tùy chọn useGrimAdapter chưa được bật, giao thức dbus sẽ được sử dụng. Tuy nhiên, việc dùng dbus trên Wayland không được khuyến nghị. Bạn nên bật useGrimAdapter trong tập tin flameshot.ini để kích hoạt bộ điều hợp chụp màn hình Wayland dựa trên Grim + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + Thành phần chụp màn hình Grim được xây dựng dựa trên wlroots, nên có thể không sử dụng được trong GNOME hoặc các môi trường desktop tương tự + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + Không thể xác định được môi trường desktop (GNOME? KDE? Qile? Sway? ...) + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + Gợi ý: hãy thử thiết lập biến môi trường XDG_CURRENT_DESKTOP. + + + + Unable to capture screen + Không thể chụp màn hình :< + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + Viền hình chữ nhật + + + + Set Selection as the paint tool + Sử dụng công cụ này để vẽ hình chữ nhật chỉ có viền + + + + SetShortcutDialog + + + Set Shortcut + Đặt phím tắt + + + + Enter new shortcut to change + Hãy nhập phím tắt mới để đổi + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Nhấn Esc để hủy hoặc ⌘ + Phím cách để vô hiệu hóa phím tắt. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Nhấn Esc để hủy hoặc Phím cách để vô hiệu hóa phím tắt. + + + + + Flameshot must be restarted for changes to take effect. + Cần khởi động lại Flameshot để những thay đổi có hiệu lực. + + + + ShortcutsWidget + + + Hot Keys + Phím nóng + + + + Available shortcuts in the screen capture mode. + Các phím tắt có sẵn trong chế độ chụp màn hình. + + + + Description + Miêu tả + + + + Key + Phím + + + + Left Double-click + Nháy đúp chuột trái + + + + Toggle side panel + Bật/Tắt bảng điều khiển bên + + + + Grab a color from the screen + + + + + Resize selection left 1px + Kéo kích thước cạnh trái thêm 1px + + + + Resize selection right 1px + Kéo kích thước cạnh phải thêm 1px + + + + Resize selection up 1px + Kéo kích thước cạnh trên thêm 1px + + + + Resize selection down 1px + Kéo kích thước cạnh dưới thêm 1px + + + + Symmetrically decrease width by 2px + Giảm chiều rộng 2px + + + + Symmetrically increase width by 2px + Tăng chiều rộng 2px + + + + Symmetrically increase height by 2px + Tăng chiều cao 2px + + + + Symmetrically decrease height by 2px + Giảm chiều cao 2px + + + + Select entire screen + Chọn bao phủ toàn bộ màn hình + + + + Move selection left 1px + Di chuyển khu vực đã chọn sang trái 1px + + + + Move selection right 1px + Di chuyển khu vực đã chọn sang phải 1px + + + + Move selection up 1px + Di chuyển khu vực đã chọn lên trên 1px + + + + Move selection down 1px + Di chuyển khu vực đã chọn xuống dưới 1px + + + + Commit text in text area + Xác nhận nội dung văn bản đã nhập + + + + Delete selected drawn object + Xóa đối tượng đã chọn + + + + Cancel current selection + Hủy lựa chọn hiện tại + + + Delete current tool + Delete current tool + + + + Capture screen + Chụp màn hình + + + + Screenshot history + Lịch sử chụp màn hình + + + + SidePanelWidget + + Active thickness: + Active thickness: + + + Active color: + Active color: + + + Press ESC to cancel + Press ESC to cancel + + + + Active tool size: + Kích thước công cụ hiện tại: + + + + Active Color: + Màu đang dùng hiện tại: + + + + Grab Color + Lấy màu + + + + Display grid + Hiển thị lưới + + + + SizeDecreaseTool + + + Decrease Tool Size + Giảm kích thước công cụ + + + + Decrease the size of the other tools + Giảm kích thước của các công cụ + + + + SizeIncreaseTool + + + Increase Tool Size + Tăng kích thước công cụ + + + + Increase the size of the other tools + Tăng kích thước của các công cụ + + + + SizeIndicatorTool + + Selection Size Indicator + Selection Size Indicator + + + Show X and Y dimensions of the selection + Show X and Y dimensions of the selection + + + Show the dimensions of the selection (X Y) + Show the dimensions of the selection (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + Thế kỉ (00-99) + + + + Year (00-99) + Năm - ngắn gọn (00-99) + + + + Year (2000) + Năm - đầy đủ (2000) + + + + Month Name (jan) + Tên tháng - ngắn gọn (jan) + + + + Month Name (january) + Tên tháng - đầy đủ (january) + + + + Month (01-12) + Tháng (01-12) + + + + Week Day (1-7) + Ngày trong tuần (1-7) + + + + Week (01-53) + Tuần (01-53) + + + + Day Name (mon) + Thứ - ngắn gọn (mon) + + + + Day Name (monday) + Thứ - đầy đủ (monday) + + + + Day (01-31) + Ngày (01-31) + + + + Day of Month (1-31) + Day trong tháng (1-31) + + + + Day (001-366) + Ngày trong năm (001-366) + + + + Hour (00-23) + Giờ - định dạng 24h (00-23) + + + + Hour (01-12) + Giờ - định dạng 12h (01-12) + + + + Minute (00-59) + Phút (00-59) + + + + Second (00-59) + Giây (00-59) + + + + Full Date (%m/%d/%y) + Tháng/ngày/năm (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + Năm-tháng-ngày (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + + + + + Time (%H-%M-%S) + Giờ-phút-giây (%H-%M-%S) + + + + Time (%H-%M) + Giờ-phút (%H-%M) + + + + SystemNotification + + + Flameshot Info + Thông tin Flameshot + + + + TextConfig + + + StrikeOut + Đường gạch xóa + + + + Underline + Gạch chân + + + + Bold + Bôi đen + + + + Italic + In nghiêng + + + + Left Align + Căn trái + + + + Center Align + Căn giữa + + + + Right Align + Căn phải + + + + TextTool + + + Text + Văn Bản + + + + Add text to your capture + Thêm kí tự vào ảnh chụp của bạn + + + + TrayIcon + + + &Take Screenshot + &Chụp ảnh màn hình + + + + &Open Launcher + &Mở trình khởi chạy + + + + &Configuration + &Cấu hình + + + + &About + &Về chúng tôi + + + + Check for updates + Kiểm tra các bản cập nhật + + + + New version %1 is available + Phiên bản %1 đã phát hành 🥳 + + + + &Quit + &Thoát + + + + &Latest Uploads + &Đăng tải mới nhất + + + + &Open Save Path + &Mở vị trí lưu + + + + UIcolorEditor + + UI Color Editor + UI Color Editor + + + + Change the color moving the selectors and see the changes in the preview buttons. + Thay đổi màu sắc bằng cách di chuyển các thanh chọn và xem sự thay đổi trong các nút xem trước. + + + + Select a Button to modify it + Chọn nút cần sửa đổi + + + + Main Color + Màu chính + + + + Click on this button to set the edition mode of the main color. + Nhấn vào nút này để chỉnh sửa màu chính của giao diện. + + + + Contrast Color + Màu tương phản + + + + Click on this button to set the edition mode of the contrast color. + Nhấn vào nút này để thay đổi màu tương phản. + + + + UndoTool + + + Undo + Hoàn Tác + + + + Undo the last modification + Hoàn tác sửa đổi cuối cùng + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + Phiên bản %1 của Flameshot đã phát hành 🥳 + + + + Ignore + Không quan tâm + + + + Later + Sau + + + + Update + Cập Nhật + + + + UploadHistory + + + Upload History + Đăng tải lịch sử + + + + Screenshots history is empty + Lịch sử chụp màn hình trống + + + + UploadLineItem + + + Form + Hình thức + + + + TextLabel + Nhãn văn bản + + + + Copy URL + Sao chép URL + + + + Open In Browser + Mở bằng trình duyệt + + + + Confirm to delete + Xác nhận để xóa + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Bạn có chắc muốn xóa ảnh chụp màn hình khỏi mục tải lên gần đây và khỏi máy chủ không? + + + + UtilityPanel + + + Close + Đóng + + + + <Empty> + <trống> + + + + VisualsEditor + + + Opacity of area outside selection: + Độ mờ của vùng bên ngoài vùng chọn: + + + + UI Color Editor + Trình chỉnh sửa màu giao diện + + + + Colorpicker Editor + Trình chọn màu + + + + Button Selection + Lựa chọn nút + + + + Select All + Chọn tất cả + + + + color_widgets::ColorDialog + + + Pick + Chọn + + + + color_widgets::ColorPalette + + + Unnamed + Không tên + + + + color_widgets::ColorPaletteModel + + + Unnamed + Không tên + + + + %1 (%2 colors) + %1 (%2 màu) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + Mở một bảng màu mới từ tệp + + + + + Create a new palette + Tạo một bảng màu mới + + + + + Duplicate the current palette + Nhân đôi bảng màu hiện tại + + + + + Delete the current palette + Xóa bảng màu hiện tại + + + + + Revert changes to the current palette + Đặt lại các thay đổi của bảng màu hiện tại + + + + + Save changes to the current palette + Lưu lại thay đối của bảng màu hiện tại + + + + + Add a color to the palette + Thêm màu vào bảng màu + + + + + Remove the selected color from the palette + Gỡ bỏ màu đang chọn trong bảng màu + + + + + New Palette + Bảng màu mới + + + + + Name + Tên + + + + GIMP Palettes (*.gpl) + Bảng màu GIMP (*.gpl) + + + + Palette Image (%1) + Ảnh bảng màu (%1) + + + + All Files (*) + Mọi tập tin (*) + + + + + Open Palette + Mở bảng màu + + + + Failed to load the palette file +%1 + Không thể tải được tệp bảng màu +%1 + + + + color_widgets::GradientEditor + + + Add Color + Thêm màu + + + + Remove Color + Loại bỏ màu + + + + Edit Color... + Chỉnh sửa màu... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 màu) + + + + color_widgets::Swatch + + + Clear Color + Xóa màu + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_zh_CN.ts b/data/translations/Internationalization_zh_CN.ts new file mode 100644 index 0000000..f798a68 --- /dev/null +++ b/data/translations/Internationalization_zh_CN.ts @@ -0,0 +1,3241 @@ + + + + + AbstractWidgetList + + + Add New + 新增 + + + + Move Up + 上移 + + + + Move Down + 下移 + + + + Remove + 移除 + + + + AcceptTool + + + Accept + 接受 + + + + Accept the capture + 接受捕获的截图 + + + + AppLauncher + + + App Launcher + 应用启动器 + + + + Choose an app to open the capture + 选择一个应用打开此截图 + + + + AppLauncherWidget + + + Open With + 用...打开 + + + + Launch in terminal + 在终端中启动 + + + + Keep open after selection + 选择后保持此窗口打开 + + + + + Error + 错误 + + + + Unable to launch in terminal. + 无法在终端中启动。 + + + + Unable to write in + 无法写入 + + + + ArrowTool + + + Arrow + 箭头 + + + + Set the Arrow as the paint tool + 选择箭头作为绘画工具 + + + + BlurTool + + Blur + 模糊 + + + Set Blur as the paint tool + 选择模糊作为绘画工具 + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>捕获模式</b> + + + + Rectangular Region + 方形区域 + + + + Full Screen (Current Display) + 全屏(当前屏幕) + + + + Full Screen (All Monitors) + 全屏(所有显示器) + + + + No Delay + 无延迟 + + + + second + 秒 + + + + + + seconds + 秒 + + + + + Take new screenshot + 获取新屏幕截图 + + + + + Area: + 区域: + + + + + Capture Launcher + 捕获启动器 + + + + + TextLabel + 文本标签 + + + + + Capture Mode + 捕获模式 + + + + + Delay: + 延迟: + + + + + WxH+x+y + 宽x高+x+y + + + + CaptureWidget + + + Unable to capture screen + 无法捕获屏幕 + 无法捕获屏幕 + + + + Mouse + 鼠标 + + + + Select screenshot area + 选择截屏区域 + + + + Mouse Wheel + 鼠标滚轮 + + + + Change tool size + 改变工具大小 + + + + Right Click + 右键单击 + + + + Show color picker + 显示颜色选择器 + + + + Open side panel + 打开侧边栏 + + + + Esc + Esc + + + + Exit + 退出 + + + + Quit Capture + 退出截图 + + + + Are you sure you want to quit capture? + 确定要退出截屏吗? + + + + Do not show this again + 不再显示 + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + 火焰截图丢失了屏幕焦点。您需要点击一次屏幕才能正常使用键盘快捷键。 + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + 已解决配置文件错误。请再次运行 `flameshot gui` 命令以应用更改。 + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + 用鼠标选择一个区域,或按 Esc 退出。 +按 Enter 键捕捉屏幕。 +按住鼠标右键显示颜色选择器。 +使用鼠标滚轮来改变绘画工具的宽度。 +按下空格键以打开侧边面板。 + + + + Tool Settings + 工具设置 + + + + CircleCountTool + + + Circle Counter + 圆圈计数 + + + + Add an autoincrementing counter bubble + 添加数字自动递增的计数圆圈 + + + + CircleTool + + + Circle + 圆环 + + + + Set the Circle as the paint tool + 选择圆环作为绘画工具 + + + + ColorDialog + + + + Select Color + 选择颜色 + + + + + Saturation + 饱和度 + + + + + Hue + 色相 + + + + + Hex + Hex + + + + + Blue + 蓝 + + + + + Value + 值 + + + + + Green + 绿 + + + + + Alpha + 透明 + + + + + Red + 红 + + + + ColorGrabWidget + + + Accept color + 接受颜色 + + + + Enter or Left Click + 回车或左键单击 + + + + Precisely select color + 精确选择颜色 + + + + Hold Left Click + 按住左键 + + + + Toggle magnifier + 切换放大镜 + + + + Space or Right Click + 空格键或右键单击 + + + + Cancel + 取消 + + + + Esc + Esc + + + + ColorPickerEditor + + Select Preset: + 选择预设: + + + Select preset using the spinbox + 使用spinbox选择预设 + + + + Edit Preset: + 编辑预设: + + + + Enter color to update preset + 输入颜色以更新预设 + + + + Update + 更新 + + + + Press button to update the selected preset + 点击按钮以更新选中的预设 + + + + Delete + 刪除 + + + + Press button to delete the selected preset + 按下按钮删除选定的预设 + + + + Add Preset: + 添加预设: + + + + Enter color manually or select it using the color-wheel + 手动输入颜色或使用色轮选择颜色 + + + + Add + 添加 + + + + Press button to add preset + 按下按钮添加预设 + + + + + Error + 错误 + + + + Unable to add preset. Maximum limit reached. + 无法添加预设。达到最大限度。 + + + + Unable to remove preset. Minimum limit reached. + 无法删除预设。已达到最低限制。 + + + + ConfigErrorDetails + + + Configuration errors + 配置错误 + + + + ConfigHandler + + + Unrecognized setting: '%1' + + 无法识别的设置:“%1” + + + + + Unrecognized shortcut name: '%1'. + + 无法识别的快捷键名称:“%1” + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + 快捷键冲突:“%1”和“%2”有同样的快捷键:%3 + + + + + Bad value in '%1'. Expected: %2 + + “%1”使用了不正确的值,期望为:%2 + + + + + You have successfully resolved the configuration error. + 您已成功解决配置文件错误。 + + + + The configuration contains an error. Open configuration to resolve. + 配置文件存在错误。请打开配置界面进行处理。 + + + The configuration contains an error. Falling back to default. + 配置文件存在错误。已回退到使用默认配置。 + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + ConfigHandler 中存在错误的配置键“%1”。请向我们报告这个问题。 + + + + ConfigResolver + + + Resolve configuration errors + 处理配置文件错误 + + + + <b>You must resolve all errors before continuing:</b> + <b>您必须解决所有错误才能继续:</b> + + + + Reset + 重置 + + + + Reset to the default value. + 重置为默认值。 + + + + Remove + 移除 + + + + Remove this setting. + 移除此项设置。 + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + 一些键盘快捷键存在冲突。 +这不会阻碍火焰截图程序的启动。 +请在配置文件中手动解决这些问题。 + + + + Resolve all + 处理全部 + + + + Resolve all listed errors. + 处理全部列出的错误。 + + + + Details + 细节 + + + + ConfigWindow + + + Configuration + 配置 + + + + Interface + 界面 + + + + Filename Editor + 文件名编辑器 + + + + General + 常规 + + + + Shortcuts + 快捷键 + + + + Resolve + 处理 + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>配置文件存在错误。请在继续操作前进行处理。</b> + + + + Controller + + New version %1 is available + 新版本 %1 已经可用 + + + You have the latest version + 您正在运行最新版本 + + + Failed to get information about the latest version. + 获取最新版本信息时失败。 + + + Error + 错误 + + + Unable to close active modal widgets + 无法关闭活动模态组件 + + + &Take Screenshot + 进行截图(&T) + + + &Open Launcher + 打开启动器(&O) + + + &Configuration + 配置(&C) + + + &About + 关于(&A) + + + Check for updates + 检查更新 + + + &Latest Uploads + 最近的上传(&L) + + + URL copied to clipboard. + 链接已复制到剪贴板。 + + + &Information + 信息(&I) + + + &Quit + 退出(&Q) + + + + CopyTool + + + Copy + 复制 + + + + Copy selection to clipboard + 将选区复制到剪贴板 + + + Copy the selection into the clipboard + 复制选择到剪贴板 + + + + DBusUtils + + Unable to connect via DBus + 无法通过 DBus 进行连接 + + + + ExitTool + + + Exit + 退出 + + + + Leave the capture screen + 离开屏幕捕获 + + + + FileNameEditor + + + Edit the name of your captures: + 编辑您的截图名称: + + + + Edit: + 编辑器: + + + + Preview: + 预览: + + + + Save + 保存 + + + + Saves the pattern + 保存样式 + + + + Restore + 恢复 + + + Reset + 恢复 + + + + Restores the saved pattern + 恢复保存的样式 + + + + Clear + 清空 + + + + Deletes the name + 删除这个名字 + + + + Flameshot + + + Error + 错误 + + + + Unable to close active modal widgets + 无法关闭活动模态微件 + + + + URL copied to clipboard. + 链接已复制至剪贴板。 + + + + FlameshotDaemon + + + New version %1 is available + 新版本 %1 可用 + + + + You have the latest version + 你正在运行最新版本 + + + + Failed to get information about the latest version. + 未能获取最新版本信息。 + + + + Unable to connect via DBus + 无法使用 DBus 连接 + + + + GeneneralConf + + Show help message + 显示帮助文档 + + + Show the help message at the beginning in the capture mode. + 在捕获之前显示帮助信息。 + + + Show desktop notifications + 显示桌面通知 + + + Show tray icon + 显示托盘图标 + + + Show the systemtray icon + 显示任务栏图标 + + + Import + 导入 + + + Error + 错误 + + + Unable to read file. + 无法读取文件。 + + + Unable to write file. + 无法写入文件。 + + + Save File + 保存到文件 + + + Confirm Reset + 确定重置 + + + Are you sure you want to reset the configuration? + 你确定你想要重置配置? + + + Show the side panel button + 显示侧边栏按钮 + + + Show the side panel toggle button in the capture mode. + 在捕获模式下显示侧边栏切换按钮。 + + + Configuration File + 配置文件 + + + Export + 导出 + + + Reset + 重置 + + + Launch at startup + 开机时启动 + + + Launch Flameshot + 启动 Flameshot + + + Close after capture + 捕获后关闭 + + + Close after taking a screenshot + 获取屏幕截图后关闭 + + + Copy URL after upload + 上传后复制 URL + + + Copy URL and close window after upload + 上传后复制 URL 并关闭窗口 + + + Save image after copy + 复制后保存图像 + + + Save image file after copying it + 复制到剪贴板后保存图像文件 + + + Save Path + 保存路径 + + + Change... + 变更… + + + Choose a Folder + 选择文件夹 + + + Unable to write to directory. + 无法写入目录。 + + + + GeneralConf + + + + Import + 导入 + + + + + + + Error + 错误 + + + + Unable to read file. + 无法读取文件。 + + + + + Unable to write file. + 无法写入文件。 + + + + Save File + 保存到文件 + + + + Confirm Reset + 确定重置 + + + + Are you sure you want to reset the configuration? + 你确定你想要重置配置? + + + + Show help message + 显示帮助信息 + + + Show the help message at the beginning in the capture mode. + 在捕获之前显示帮助信息。 + + + + Show the side panel button + 显示侧边栏按钮 + + + Show the side panel toggle button in the capture mode. + 在捕获模式下显示侧边栏切换按钮。 + + + + Show desktop notifications + 显示桌面通知 + + + + Show tray icon + 显示托盘图标 + + + Show the systemtray icon + 显示任务栏图标 + + + + Confirmation required to delete screenshot from the latest uploads + 从最近的上传历史中删除屏幕截图需要进行确认 + + + + Configuration File + 配置文件 + + + + Export + 导出 + + + + Reset + 重置 + + + + Automatic check for updates + 自动检查更新 + + + + Allow multiple flameshot GUI instances simultaneously + 允许同时运行多个 flameshot GUI 实例 + + + This allows you to take screenshots of flameshot itself for example. + 这样能允许您获取火焰截图自身的截图。 + + + Automatically close daemon when it is not needed + 不需要时自动关闭守护程序 + + + Launch at startup + 开机时启动 + + + Launch Flameshot + 启动火焰截图 + + + + Show welcome message on launch + 启动时显示欢迎消息 + + + + Use large predefined color palette + 使用大型预定义调色盘 + + + + Copy URL after upload + 上传后复制 URL + + + Copy URL and close window after upload + 上传后复制 URL 并关闭窗口 + + + + Save image after copy + 复制后保存图像 + + + Save image file after copying it + 复制到剪贴板后保存图像文件 + + + + Show the help message at the beginning in the capture mode + 在捕获之前显示帮助信息 + + + + Use last region for GUI mode + 在图形用户界面模式下使用最后一个区域 + + + + Use the last region as the default selection for the next screenshot in GUI mode + 在图形界面模式下,将最后一个区域作为下次截图的默认选择 + + + + Show the side panel toggle button in the capture mode + 在捕获模式下显示侧边栏切换按钮 + + + + Enable desktop notifications + 启用桌面通知 + + + + Show abort notifications + 显示中断提示 + + + + Enable abort notifications + 启用中断通知 + + + + Show icon in the system tray + 在系统托盘中显示图标 + + + + Use grim to capture screenshots + 用grim 截图 + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + Grim是一个只用于wayland的截图工具,基于screencopy protocol, 通常仅在最小化的wayland合成器中启用,如sway,hyprland等. + + + + Ask for confirmation to delete screenshot from the latest uploads + 从最近的上传历史中删除屏幕截图需要进行确认 + + + + Check for updates automatically + 自动检查更新 + + + + This allows you to take screenshots of Flameshot itself for example + 例如,这允许您截取 Flameshot 本身作为屏幕截图 + + + Launch Flameshot daemon when computer is booted + 开机自启动 + + + + Show the welcome message box in the middle of the screen while taking a screenshot + 在截取屏幕截图时在屏幕中间显示欢迎消息框 + + + + Use a large predefined color palette + 使用一个大的预定义调色板 + + + + Copy on double click + 双击以复制 + + + Enable Copy on Double Click + 启用双击时复制 + + + Copy URL and close window after uploading was successful + 上传成功后复制 URL 并关闭窗口 + + + + Automatically unload from memory when it is not needed + 在不需要时自动从内存中卸载 + + + + Automatically close daemon (background process) when it is not needed + 在不需要时自动关闭守护程序(后台进程) + + + + Launch in background at startup + 在启动时在后台启动 + + + + Launch Flameshot daemon (background process) when computer is booted + 当计算机启动时启动 Flameshot 守护进程(后台进程) + + + + Ask before quit capture + 退出截图前请询问 + + + + Show the confirmation prompt before ESC quit + 在退出时显示确认提示 + + + + Enable Copy to clipboard on Double Click + 在双击时启用复制到剪贴板 + + + + Copy URL after uploading was successful + 上传成功后复制网址 + + + + After copying the screenshot, save it to a file as well + 复制屏幕截图后,也将其保存到文件中 + + + + Save Path + 保存路径 + + + + Change... + 变更… + + + + Use fixed path for screenshots to save + 使用固定的屏幕截图保存路径 + + + + Preferred save file extension: + 偏好的保存文件扩展名: + + + + Latest Uploads Max Size + 之前的上传最大数量 + + + + Imgur Application Client ID + Imgur 应用程序客户端 ID + + + + Undo limit + 撤销次数限制 + + + + Use JPG format for clipboard (PNG default) + 剪贴板使用 JPG 格式(默认为 PNG) + + + + Use lossy JPG format for clipboard (lossless PNG default) + 对剪贴板使用有损JPG格式(默认无损PNG) + + + + Copy file path after save + 保存文件后复制文件路径 + + + + Copy the file path to clipboard after the file is saved + 文件保存后将文件路径复制到剪贴板上 + + + + Anti-aliasing image when zoom the pinned image + 缩放贴图时应用反锯齿 + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + 对贴图进行缩放后,对图像进行平滑处理还是维持像素化状态 + + + + + Upload image without confirmation + 上传图像无需确认 + + + + Choose a Folder + 选择文件夹 + + + + Unable to write to directory. + 无法写入目录。 + + + + Show magnifier + 显示放大镜 + + + + Enable a magnifier while selecting the screenshot area + 选择屏幕截图区域时启用放大镜 + + + + Square shaped magnifier + 方形放大镜 + + + + Make the magnifier to be square-shaped + 使放大镜呈方形 + + + + Milliseconds before geometry display hides; 0 means do not hide + 几何显示隐藏前的毫秒数;设为0则不隐藏 + + + + Set geometry display timeout (ms) + 设置几何显示时间(毫秒) + + + + Selection Geometry Display + 选取几何显示 + + + + Display Location + 显示位置 + + + + None + 无 + + + + Top Left + 左上 + + + + Top Right + 右上 + + + + Bottom Left + 左下 + + + + Bottom Right + 右下 + + + + Center + 中心 + + + + Quality range of 0-100; Higher number is better quality and larger file size + 质量范围为0-100;数字越大,质量越好,文件大小也越大 + + + + JPEG Quality + JPEG质量 + + + + Reverse arrow + 反向箭头 + + + + Draw the arrow head first + 先画箭头 + + + + Insecure Pixelate + 不安全Pixelate + + + + Draw the pixelation effect in an insecure but more asethetic way. + 用一种不安全但更美观的方式画出像素效果。 + + + + HistoryWidget + + Latest Uploads + 最近的上传 + + + Screenshots history is empty + 屏幕截图历史为空 + + + Copy URL + 复制链接 + + + URL copied to clipboard. + 链接已复制到剪贴板。 + + + Open in browser + 在浏览器中打开 + + + Confirm to delete + 确认进行删除 + + + Are you sure you want to delete a screenshot from the latest uploads and server? + 您确认要从最近的上传历史和服务器上删除该屏幕截图吗? + + + + ImgS3Uploader + + Uploading Image + 正在上传 + + + Error + 错误 + + + + ImgUploadDialog + + + Upload Confirmation + 上传确认 + + + + Do you want to upload this capture? + 您是否想要上传该捕获图像? + + + + + Upload without confirmation + 上传无需确认 + + + + ImgUploader + + Uploading Image + 正在上传 + + + Unable to open the URL. + 无法打开此链接。 + + + Screenshot copied to clipboard. + 截图复制到剪贴板。 + + + Copy URL + 复制链接 + + + Open URL + 打开链接 + + + Delete image + 删除图像 + + + Image to Clipboard. + 保存文件到剪贴板。 + + + + ImgUploaderBase + + + Upload image + 上传图像 + + + + Uploading Image + 正在上传图像 + + + + Copy URL + 复制链接 + + + + Open URL + 打开链接 + + + + Delete image + 删除图像 + + + + Image to Clipboard. + 图像到剪贴板。 + + + + Save image + 保存图片 + + + + Unable to open the URL. + 无法打开链接。 + + + + URL copied to clipboard. + 链接已复制到剪贴板。 + + + + Screenshot copied to clipboard. + 截图已复制到剪贴板。 + + + + Unable to save the screenshot to disk. + 无法将屏幕截图保存到磁盘。 + + + + Screenshot saved. + 截图已保存。 + + + + ImgUploaderTool + + + Image Uploader + 图像上传工具 + + + + Upload the selection + 上传选中区域 + + + + ImgurUploader + + Upload to Imgur + 上传到Imgur + + + Uploading Image + 正在上传 + + + Copy URL + 复制链接 + + + Open URL + 打开链接 + + + Delete image + 删除图像 + + + Image to Clipboard. + 保存文件到剪贴板。 + + + + Unable to open the URL. + 无法打开此链接。 + + + URL copied to clipboard. + 复制链接到剪贴板。 + + + Screenshot copied to clipboard. + 截图复制到剪贴板。 + + + + ImgurUploaderTool + + Image Uploader + 上传图片 + + + Upload the selection to Imgur + 上传选择到 Imgur + + + + InfoWindow + + + + About + 关于 + + + + + Icon + 图标 + + + + + License + 许可证 + + + + + GPLv3+ + GPLv3+ + + + + + Version + 版本 + + + + + Flameshot v + Flameshot v + + + + + OS Info + 操作系统信息 + + + + + Copy Info + 复制信息 + + + SPACEBAR + 空格 + + + Right Click + 右键 + + + Mouse Wheel + 鼠标滑轮 + + + Move selection 1px + 移动选择 1 px + + + Resize selection 1px + 调整选择大小 1 px + + + Quit capture + 退出捕获 + + + Copy to clipboard + 复制到剪贴板 + + + Save selection as a file + 将选择保存为文件 + + + Undo the last modification + 撤消上次修改 + + + Toggle visibility of sidebar with options of the selected tool + 切换侧边栏可见性 + + + Show color picker + 显示颜色选择器 + + + Change the tool's thickness + 改变工具的厚度 + + + Key + 键 + + + Description + 描述 + + + <u><b>License</b></u> + <u><b>许可证</b></u> + + + <u><b>Version</b></u> + <u><b>版本</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>快捷键</b></u> + + + Available shortcuts in the screen capture mode. + 屏幕捕捉模式中的可用快捷键。 + + + + InvertTool + + + Invert + 反色 + + + + Set Inverter as the paint tool + 将反色设置为绘画工具 + + + + LineTool + + + Line + 直线 + + + + Set the Line as the paint tool + 将直线设置为绘画工具 + + + + MarkerTool + + + Marker + 标记 + + + + Set the Marker as the paint tool + 将标记设置为绘画工具 + + + + MoveTool + + + Move + 移动 + + + + Move the selection area + 移动选择区域 + + + + PencilTool + + + Pencil + 铅笔 + + + + Set the Pencil as the paint tool + 将铅笔设置为绘画工具 + + + + PinTool + + + Pin Tool + 贴图工具 + + + + Pin image on the desktop + 在桌面上固定图像 + + + + PinWidget + + + Context menu + 上下文菜单 + + + + Copy to clipboard + 复制到剪贴板 + + + + Save to file + 保存到文件 + + + + Rotate Right + 向右旋转 + + + + Rotate Left + 向左旋转 + + + + Increase Opacity + 增加不透明度 + + + + Decrease Opacity + 降低不透明度 + + + + Close + 关闭 + + + + PixelateTool + + + Pixelate + 像素化 + + + + Set Pixelate as the paint tool. + 将像素化设置为绘画工具。 + + + Set Pixelate as the paint tool + 将像素化设置为绘画工具 + + + + PrimaryInstanceWidget + + + Primary instance + 主实例 + + + + <b>Primary instance.</b> Messages received from secondaries: + <b>主要实例。</b>从secondary收到的消息: + + + + QHotkey + + Failed to register %1. Error: %2 + 注册 %1 失败。错误:%2 + + + Failed to unregister %1. Error: %2 + 取消注册 %1 失败。错误:%2 + + + + QObject + + + Save Error + 保存错误 + + + + + Capture saved as + 捕获已保存为 + + + + + Capture saved to clipboard. + 捕获已保存至剪贴板。 + + + Capture saved to clipboard + 捕获已保存至剪贴板 + + + + Error while saving to clipboard + 保存到剪贴板时出错 + + + + + Error trying to save as + 尝试另存为时出错 + + + + Save screenshot + 保存屏幕截图 + + + + Path copied to clipboard as + 路径已复制到剪贴板 + + + Saving canceled + 已取消保存 + + + Save canceled + 已取消保存 + + + Capture is saved and copied to the clipboard as + 捕获已保存并复制到剪贴板,作为 + + + + Unable to connect via DBus + 无法通过DBus进行连接 + + + + Powerful yet simple to use screenshot software. + 强大又易用的屏幕截图软件。 + + + + See + 参见 + + + Capture the entire desktop. + 捕获整个桌面。 + + + + Open the capture launcher. + 打开截图启动器。 + + + + Start a manual capture in GUI mode. + 以图形界面模式进行手动截图。 + + + + Configure + 配置 + + + Capture a single screen. + 捕获单个屏幕。 + + + Path where the capture will be saved + 截图保存路径 + + + + Capture screenshot of all monitors at the same time. + 同时截取所有显示器的屏幕截图。 + + + + Capture a screenshot of the specified monitor. + 截取指定显示器的屏幕截图。 + + + + Existing directory or new file to save to + 要保存的目标目录路径或新文件 + + + + Save the capture to the clipboard + 将截图保存至剪贴板 + + + + Pin the capture to the screen + 将捕获图像作为贴图放置在屏幕上 + + + + Upload screenshot + 上传截图 + + + + Delay time in milliseconds + 延迟时间,以毫秒计 + + + + Repeat screenshot with previously selected region + 使用之前的选区重复截图 + + + + Screenshot region to select + 要选择的屏幕区域 + + + + Set the filename pattern + 设置文件名模式 + + + + Accept capture as soon as a selection is made + 在选中选区后立刻接受捕获图像 + + + + Enable or disable the trayicon + 启用或禁用托盘图标 + + + + Enable or disable run at startup + 启用或禁用开机启动 + + + + Enable or disable the notifications + 启用或禁用通知 + + + + Check the configuration for errors + 检查配置文件错误 + + + + Show the help message in the capture mode + 在捕获模式中显示帮助信息 + + + + Define the main UI color + 定义用户界面主颜色 + + + + Define the contrast UI color + 定义用户界面对比色 + + + + Print raw PNG capture + 输出原始 PNG 图像 + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + 使用 WxH+X+Y 的格式输出选区几何参数。如果指定了 raw 参数则什么也不做 + + + + Define the screen to capture (starting from 0) + 定义要捕获的屏幕(从 0 开始) + + + + Invalid delay, it must be a number greater than 0 + 无效的延时,必须提供大于零的数值 + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + 无效的区域,请使用“WxH+X+Y”或“all”或“screen0/screen1/...”。 + + + + Invalid path, must be an existing directory or a new file in an existing directory + 无效的路径,必须为已有目录或者已有目录中的一个新文件 + + + Define the screen to capture + 定义要捕获的屏幕 + + + + default: screen containing the cursor + 默认:包含鼠标指针的屏幕 + + + + Screen number + 屏幕编号 + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + 颜色无效,该选项支持以下格式: +- #RGB(R、G、B 每项均为单个十六进制数字) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- 常用英文颜色名称,如“blue”或“red” +您可能需要对 # 字符进行转义,如“\#FFF” + + + Invalid delay, it must be higher than 0 + 无效的延迟时间,数字必须大于0 + + + + Invalid screen number, it must be non negative + 无效的屏幕编号,编号不能为负数 + + + Invalid path, it must be a real path in the system + 无效的路径,必须为系统中真实存在的路径 + + + + Invalid value, it must be defined as 'true' or 'false' + 无效的值,必须指定“true”或“false” + + + + Error + 错误 + + + + Unable to write in + 无法写入 + + + + Requested screen exceeds screen count + 请求的屏幕超出了屏幕编号 + + + + Full screen screenshot pinned to screen + 已将全屏截图作为贴图固定到屏幕 + + + URL copied to clipboard. + URL 已复制到剪贴板。 + + + + Options + 选项 + + + Arguments + 参数 + + + arguments + 参数 + + + + Subcommands + 子命令 + + + + subcommands + 子命令 + + + + Usage + 用法 + + + + options + 选项 + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + 默认情况下火焰截图将在后台持续运行并显示一个托盘图标以方便用户控制。 + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + 默认情况下,火焰截图启动后将在后台运行,并在托盘显示一个图标。 + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + 我已启动并在后台运行!点击托盘图标即可进行屏幕截图,右键点击托盘图标可查看更多选项。 + + + Toggle side panel + 切换侧面板 + + + Resize selection left 1px + 向左改变选区大小1像素 + + + Resize selection right 1px + 向右改变选区大小1像素 + + + Resize selection up 1px + 向上改变选区大小1像素 + + + Resize selection down 1px + 向下改变选区大小1像素 + + + Select entire screen + 选择整个屏幕 + + + Move selection left 1px + 向左移动选区1像素 + + + Move selection right 1px + 向右移动选区1像素 + + + Move selection up 1px + 向上移动选区1像素 + + + Move selection down 1px + 向下移动选区1像素 + + + Commit text in text area + 在文本区域提交文本 + + + Delete current tool + 删除当前工具 + + + + Quit capture + 退出捕获 + + + + Screenshot history + 屏幕截图历史 + + + + Capture screen + 捕获屏幕 + + + + Show color picker + 显示颜色选择器 + + + + Change the tool's size + 更改工具大小 + + + Change the tool's thickness + 改变工具的厚度 + + + + RectangleTool + + + Rectangle + 实心矩形 + + + + Set the Rectangle as the paint tool + 将实心矩形设置为绘画工具 + + + + RedoTool + + + Redo + 重做 + + + + Redo the next modification + 重做上次修改 + + + + SaveTool + + + Save + 保存 + + + + Save screenshot to a file + 保存屏幕截图到文件 + + + Save the capture + 保存捕获 + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + 无法探测当前桌面环境(GNOME?KDE?Sway?……) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + 通用的 Wayland 屏幕捕获适配器需要 Grim 作为 Wayland 的屏幕捕获组件。如果缺少屏幕捕获组件,请安装它! + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + 如果未启用 useGrimAdapter 设置,将使用 dbus 协议。需要注意的是,在 wayland 下使用 dbus 协议并不推荐。建议在 flameshot.ini 中启用 useGrimAdapter 设置,以激活基于 grim 的通用 wayland 屏幕截图适配器 + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + grim 的截图组件是基于 wlroots 实现的,可能无法在 GNOME 或类似的桌面环境中使用 + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + 无法检测桌面环境(GNOME? KDE? Qile? Sway? …) + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + 提示:请尝试设置 XDG_CURRENT_DESKTOP 环境变量。 + + + + Unable to capture screen + 无法捕获屏幕 + + + + SecondaryInstanceWidget + + + Secondary instance + 次级实例 + + + + <b>Secondary instance.</b> Send message to primary: + <b>第二个例子。</b>发送消息到主服务器: + + + + Type something here... + 在这里输入一些东西… + + + + &Send + 发送(& S) + + + + Error sending message + 发送消息时出错 + + + + The message '%1' could not be sent to the primary. + 无法将邮件'%1'发送到主服务器。 + + + + SelectionTool + + + Rectangular Selection + 矩形选择 + + + + Set Selection as the paint tool + 将矩形选择设置为绘画工具 + + + + SetShortcutDialog + + + Set Shortcut + 设置快捷键 + + + + Enter new shortcut to change + 键入新的快捷键以进行修改 + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + 按下 Esc 键以取消,或使用 ⌘+Backspace 来禁用键盘快捷键。 + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + 按下 Esc 键以取消或按下退格键以禁用键盘快捷键。 + + + + + Flameshot must be restarted for changes to take effect. + 火焰截图必须重新启动以使修改生效。 + + + + ShortcutsWidget + + + Hot Keys + 热键 + + + + Available shortcuts in the screen capture mode. + 屏幕捕捉模式中的可用快捷键。 + + + + Description + 描述 + + + + Key + 键 + + + + Left Double-click + 左键双击 + + + + Toggle side panel + 切换侧面板 + + + + Grab a color from the screen + 从屏幕上抓取颜色 + + + + Resize selection left 1px + 将选区大小向左调整 1px + + + + Resize selection right 1px + 将选区大小向右调整 1px + + + + Resize selection up 1px + 将选区大小向上调整 1px + + + + Resize selection down 1px + 将选区大小向下调整 1px + + + + Symmetrically decrease width by 2px + 对称地将宽度减少2px + + + + Symmetrically increase width by 2px + 对称地增加宽度 2 px + + + + Symmetrically increase height by 2px + 对称地增加高度 2 px + + + + Symmetrically decrease height by 2px + 对称地减少高度 2 px + + + + Select entire screen + 选择整个屏幕 + + + + Move selection left 1px + 将选区向左调整 1px + + + + Move selection right 1px + 将选区向右移动 1px + + + + Move selection up 1px + 将选区向上移动 1px + + + + Move selection down 1px + 将选区向下移动 1px + + + + Commit text in text area + 在文本区域提交文本 + + + + Delete selected drawn object + 删除选定的绘制对象 + + + + Cancel current selection + 取消当前选择 + + + Delete current tool + 删除当前工具 + + + + Capture screen + 捕获屏幕 + + + + Screenshot history + 屏幕截图历史 + + + + SidePanelWidget + + Active thickness: + 当前宽度: + + + Active color: + 活动颜色: + + + Press ESC to cancel + 按下 ESC 键以取消 + + + + Active tool size: + 当前工具大小: + + + + Active Color: + 当前颜色: + + + + Grab Color + 获取颜色 + + + + Display grid + 显示网格 + + + + SizeDecreaseTool + + + Decrease Tool Size + 减小工具尺寸 + + + + Decrease the size of the other tools + 减小其它工具的尺寸 + + + + SizeIncreaseTool + + + Increase Tool Size + 增大工具尺寸 + + + + Increase the size of the other tools + 增大其它工具的尺寸 + + + + SizeIndicatorTool + + Selection Size Indicator + 选择尺寸指示 + + + Show X and Y dimensions of the selection + 显示选区的横纵尺寸 + + + Show the dimensions of the selection (X Y) + 显示选择的尺寸 (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + 世纪(00-99) + + + + Year (00-99) + 年(00-99) + + + + Year (2000) + 年(2000) + + + + Month Name (jan) + 月(1月 - 12月) + + + + Month Name (january) + 月(一月 - 十二月) + + + + Month (01-12) + 月 (01-12) + + + + Week Day (1-7) + 周内的日(1-7) + + + + Week (01-53) + 周(01-53) + + + + Day Name (mon) + 星期(一 - 七) + + + + Day Name (monday) + 星期(星期一 - 星期日) + + + + Day (01-31) + 天(01-31) + + + + Day of Month (1-31) + 一月中的某天(1-31) + + + + Day (001-366) + 天(001-366) + + + + Time (%H-%M-%S) + 时间(%H-%M-%S) + + + + Time (%H-%M) + 时间(%H-%M) + + + + Hour (00-23) + 小时(00-23) + + + + Hour (01-12) + 小时(01-12) + + + + Minute (00-59) + 分钟(00-59) + + + + Second (00-59) + 秒(00-59) + + + + Full Date (%m/%d/%y) + 完整日期(%m/%d/%y) + + + + Full Date (%Y-%m-%d) + 完整日期(%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + 完整日期(% d—% m—%Y) + + + + SystemNotification + + + Flameshot Info + 火焰截图消息 + + + + TextConfig + + + StrikeOut + 删除线 + + + + Underline + 下划线 + + + + Bold + 粗体 + + + + Italic + 斜体 + + + + Left Align + 左对齐 + + + + Center Align + 中心对齐 + + + + Right Align + 右对齐 + + + + TextTool + + + Text + 文本 + + + + Add text to your capture + 在您的捕获中添加文本 + + + + TrayIcon + + + &Take Screenshot + 进行截图(&T) + + + + &Open Launcher + 打开启动器(&O) + + + + &Configuration + 配置(&C) + + + + &About + 关于(&A) + + + + Check for updates + 检查更新 + + + + New version %1 is available + 新版本 %1 可用 + + + + &Quit + 退出(&Q) + + + + &Latest Uploads + 最近的上传(&L) + + + + &Open Save Path + 打开保存路径(&O) + + + + UIcolorEditor + + UI Color Editor + 用户界面颜色编辑器 + + + + Change the color moving the selectors and see the changes in the preview buttons. + 移动颜色选择并在预览按钮查看。 + + + + Select a Button to modify it + 选择一个按钮以进行修改 + + + + Main Color + 主色 + + + + Click on this button to set the edition mode of the main color. + 点击按钮设置主色。 + + + + Contrast Color + 对比色 + + + + Click on this button to set the edition mode of the contrast color. + 点击按钮设置对比色。 + + + + UndoTool + + + Undo + 撤消 + + + + Undo the last modification + 撤消上次修改 + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + 新的 Flameshot %1 版已经可用 + + + + Ignore + 忽略 + + + + Later + 稍后 + + + + Update + 更新 + + + + UploadHistory + + + Upload History + 上传历史记录 + + + + Screenshots history is empty + 屏幕截图历史为空 + + + + UploadLineItem + + + Form + 表单 + + + + TextLabel + 文本标签 + + + + Copy URL + 复制链接 + + + + Open In Browser + 在浏览器中打开 + + + + Confirm to delete + 确认进行删除 + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + 您确认要从最近的上传和服务器上删除该屏幕截图吗? + + + + UtilityPanel + + + Close + 关闭 + + + + <Empty> + <空> + + + + VisualsEditor + + + Opacity of area outside selection: + 选中区域之外的不透明度: + + + + UI Color Editor + 用户界面颜色编辑器 + + + + Colorpicker Editor + 拾色器编辑器 + + + + Button Selection + 按钮选择 + + + + Select All + 全选 + + + + color_widgets::ColorDialog + + + Pick + 选取 + + + + color_widgets::ColorPalette + + + Unnamed + 未命名 + + + + color_widgets::ColorPaletteModel + + + Unnamed + 未命名 + + + + %1 (%2 colors) + %1(%2 个颜色) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + 从文件打开新调色板 + + + + + Create a new palette + 创建新调色板 + + + + + Duplicate the current palette + 制作当前调色板的副本 + + + + + Delete the current palette + 删除当前调色板 + + + + + Revert changes to the current palette + 将修改回退到当前调色板 + + + + + Save changes to the current palette + 将修改保存到当前调色板 + + + + + Add a color to the palette + 向调色板添加颜色 + + + + + Remove the selected color from the palette + 从调色板移除选中的颜色 + + + + + New Palette + 新建调色板 + + + + + Name + 名称 + + + + GIMP Palettes (*.gpl) + GIMP 调色板 (*.gpl) + + + + Palette Image (%1) + 调色板图像 (%1) + + + + All Files (*) + 所有文件 (*) + + + + + Open Palette + 打开调色盘 + + + + Failed to load the palette file +%1 + 加载调色板文件失败 +%1 + + + + color_widgets::GradientEditor + + + Add Color + 添加颜色 + + + + Remove Color + 移除颜色 + + + + Edit Color... + 编辑颜色…… + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1(%2 个颜色) + + + + color_widgets::Swatch + + + Clear Color + 清除颜色 + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_zh_HK.ts b/data/translations/Internationalization_zh_HK.ts new file mode 100644 index 0000000..8c5454c --- /dev/null +++ b/data/translations/Internationalization_zh_HK.ts @@ -0,0 +1,3204 @@ + + + + + AbstractWidgetList + + + Add New + Add New + + + + Move Up + Move Up + + + + Move Down + Move Down + + + + Remove + Remove + + + + AcceptTool + + + Accept + Accept + + + + Accept the capture + Accept the capture + + + + AppLauncher + + + App Launcher + 應用程式啟動器 + + + + Choose an app to open the capture + 選擇一個程式打開此截圖 + + + + AppLauncherWidget + + + Open With + 打開方式 + + + + Launch in terminal + 從終端啟動 + + + + Keep open after selection + 選擇後保持開啟 + + + + + Error + 錯誤 + + + + Unable to launch in terminal. + 無法從終端啟動。 + + + + Unable to write in + 無法寫入 + + + + ArrowTool + + + Arrow + 指針 + + + + Set the Arrow as the paint tool + 選取指針作為繪製工具 + + + + BlurTool + + Blur + 模糊 + + + Set Blur as the paint tool + 選擇模糊作為繪製工具 + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>Capture Mode</b> + + + + Rectangular Region + 矩形區域 + + + + Full Screen (Current Display) + Full Screen (Current Display) + + + + Full Screen (All Monitors) + 滿屏(所有顯示器) + + + + No Delay + 無時延 + + + + second + second + + + + + + seconds + seconds + + + + + Take new screenshot + 捕獲新截圖 + + + + + Area: + Area: + + + + + Capture Launcher + Capture Launcher + + + + + TextLabel + TextLabel + + + + + Capture Mode + Capture Mode + + + + + Delay: + Delay: + + + + + WxH+x+y + WxH+x+y + + + + CaptureWidget + + + Unable to capture screen + 無法捕獲屏幕 + + + + Mouse + Mouse + + + + Select screenshot area + Select screenshot area + + + + Mouse Wheel + 滑鼠滑輪 + + + + Change tool size + Change tool size + + + + Right Click + 右鍵 + + + + Show color picker + 顯示顏色選擇器 + + + + Open side panel + Open side panel + + + + Esc + Esc + + + + Exit + 離開 + + + + Quit Capture + + + + + Are you sure you want to quit capture? + + + + + Do not show this again + + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + Configuration error resolved. Launch `flameshot gui` again to apply it. + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + 使用鼠標選擇一片區域,或按Esc退出。 +按Enter以捕獲屏幕。 +點擊右鍵顯示拾色器。 +使用鼠標滾輪以較工具寬度。 +按Space以打開側方面板。 + + + + Tool Settings + 工具選項 + + + + CircleCountTool + + + Circle Counter + 環狀計數器 + + + + Add an autoincrementing counter bubble + 添加自增計數器 + + + + CircleTool + + + Circle + 環形 + + + + Set the Circle as the paint tool + 選取環形作為繪畫工具 + + + + ColorDialog + + + + Select Color + Select Color + + + + + Saturation + Saturation + + + + + Hue + Hue + + + + + Hex + Hex + + + + + Blue + Blue + + + + + Value + Value + + + + + Green + Green + + + + + Alpha + Alpha + + + + + Red + Red + + + + ColorGrabWidget + + + Accept color + Accept color + + + + Enter or Left Click + Enter or Left Click + + + + Precisely select color + Precisely select color + + + + Hold Left Click + Hold Left Click + + + + Toggle magnifier + Toggle magnifier + + + + Space or Right Click + Space or Right Click + + + + Cancel + Cancel + + + + Esc + Esc + + + + ColorPickerEditor + + + Edit Preset: + Edit Preset: + + + + Enter color to update preset + Enter color to update preset + + + + Update + Update + + + + Press button to update the selected preset + Press button to update the selected preset + + + + Delete + Delete + + + + Press button to delete the selected preset + Press button to delete the selected preset + + + + Add Preset: + Add Preset: + + + + Enter color manually or select it using the color-wheel + Enter color manually or select it using the color-wheel + + + + Add + Add + + + + Press button to add preset + Press button to add preset + + + + + Error + 錯誤 + + + + Unable to add preset. Maximum limit reached. + Unable to add preset. Maximum limit reached. + + + + Unable to remove preset. Minimum limit reached. + Unable to remove preset. Minimum limit reached. + + + + ConfigErrorDetails + + + Configuration errors + Configuration errors + + + + ConfigHandler + + + Unrecognized setting: '%1' + + Unrecognized setting: '%1' + + + + + Unrecognized shortcut name: '%1'. + + Unrecognized shortcut name: '%1'. + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + + + + Bad value in '%1'. Expected: %2 + + Bad value in '%1'. Expected: %2 + + + + + You have successfully resolved the configuration error. + You have successfully resolved the configuration error. + + + + The configuration contains an error. Open configuration to resolve. + The configuration contains an error. Open configuration to resolve. + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + Bad config key '%1' in ConfigHandler. Please report this as a bug. + + + + ConfigResolver + + + Resolve configuration errors + Resolve configuration errors + + + + <b>You must resolve all errors before continuing:</b> + <b>You must resolve all errors before continuing:</b> + + + + Reset + 重設 + + + + Reset to the default value. + Reset to the default value. + + + + Remove + Remove + + + + Remove this setting. + Remove this setting. + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + + + + Resolve all + Resolve all + + + + Resolve all listed errors. + Resolve all listed errors. + + + + Details + Details + + + + ConfigWindow + + + Configuration + 設定 + + + + Interface + 接口 + + + + Filename Editor + 文檔名稱編輯器 + + + + General + 一般 + + + + Shortcuts + 捷徑 + + + + Resolve + Resolve + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>Configuration file has errors. Resolve them before continuing.</b> + + + + Controller + + New version %1 is available + 新版本 %1 現在可用 + + + You have the latest version + 你已有最新版本 + + + Failed to get information about the latest version. + 無法獲取最新版本的資訊 + + + Error + 錯誤 + + + Unable to close active modal widgets + Unable to close active modal widgets + + + &Take Screenshot + &捕獲截圖 + + + &Open Launcher + &開啓啓動器 + + + &Configuration + &設定 + + + &About + &關於 + + + Check for updates + 更新檢查 + + + &Latest Uploads + &最新上載 + + + &Information + &資訊 + + + &Quit + &結束 + + + + CopyTool + + + Copy + 複製 + + + + Copy selection to clipboard + Copy selection to clipboard + + + Copy the selection into the clipboard + 複製選項到剪貼板 + + + + DBusUtils + + Unable to connect via DBus + 無法通過 DBus 連接 + + + + ExitTool + + + Exit + 離開 + + + + Leave the capture screen + 離開螢幕擷取 + + + + FileNameEditor + + + Edit the name of your captures: + 編輯您的截圖名稱: + + + + Edit: + 編輯器: + + + + Preview: + 預覽: + + + + Save + 存檔 + + + + Saves the pattern + 儲存樣式 + + + + Restore + 復原 + + + Reset + 重設 + + + + Restores the saved pattern + 恢復儲存的樣式 + + + + Clear + 清除 + + + + Deletes the name + 刪除這個名稱 + + + + Flameshot + + + Error + 錯誤 + + + + Unable to close active modal widgets + Unable to close active modal widgets + + + + URL copied to clipboard. + URL copied to clipboard. + + + + FlameshotDaemon + + + New version %1 is available + 新版本 %1 現在可用 + + + + You have the latest version + 你已有最新版本 + + + + Failed to get information about the latest version. + 無法獲取最新版本的資訊 + + + + Unable to connect via DBus + Unable to connect via DBus + + + + GeneneralConf + + Show help message + 顯示説明資訊 + + + Show the help message at the beginning in the capture mode. + 在擷取之前顯示説明資訊。 + + + Show desktop notifications + 顯示桌面通知 + + + Show tray icon + 顯示託盤圖標 + + + Show the systemtray icon + 顯示工作列圖標 + + + Import + 導入 + + + Error + 錯誤 + + + Unable to read file. + 無法讀取檔案。 + + + Unable to write file. + 無法寫入檔案。 + + + Save File + 存檔 + + + Confirm Reset + 確認重設 + + + Are you sure you want to reset the configuration? + 你確定想要重設? + + + Show the side panel button + 顯示側邊欄按鈕 + + + Show the side panel toggle button in the capture mode. + 在截圖模式下顯示側邊欄切換按鈕。 + + + Configuration File + 設定文檔 + + + Export + 導出 + + + Reset + 重設 + + + Launch at startup + 自動啟動 + + + Launch Flameshot + 啓動Flameshot + + + Close after capture + 捕獲截圖后關閉 + + + Close after taking a screenshot + 進行截屏后關閉 + + + Copy URL after upload + 上載后複製URL + + + Copy URL and close window after upload + 上載后複製URL並關閉窗口 + + + Save image after copy + 複製後保存圖像 + + + Save image file after copying it + 複製圖像檔案后保存 + + + Save Path + 保存路徑 + + + Change... + 變更... + + + Choose a Folder + 選取檔案集 + + + Unable to write to directory. + 無法寫入目錄。 + + + + GeneralConf + + + + Import + 導入 + + + + + + + Error + 錯誤 + + + + Unable to read file. + 無法讀取檔案。 + + + + + Unable to write file. + 無法寫入檔案。 + + + + Save File + 存檔 + + + + Confirm Reset + 確認重設 + + + + Are you sure you want to reset the configuration? + 你確定想要重設? + + + + Show help message + 顯示説明資訊 + + + Show the help message at the beginning in the capture mode. + 在擷取之前顯示説明資訊。 + + + + Show the side panel button + 顯示側邊欄按鈕 + + + Show the side panel toggle button in the capture mode. + 在截圖模式下顯示側邊欄切換按鈕。 + + + + Show desktop notifications + 顯示桌面通知 + + + + Show tray icon + 顯示託盤圖標 + + + Show the systemtray icon + 顯示工作列圖標 + + + + Confirmation required to delete screenshot from the latest uploads + Confirmation required to delete screenshot from the latest uploads + + + + Configuration File + 設定文檔 + + + + Export + 導出 + + + + Reset + 重設 + + + + Automatic check for updates + Automatic check for updates + + + + Allow multiple flameshot GUI instances simultaneously + Allow multiple flameshot GUI instances simultaneously + + + Automatically close daemon when it is not needed + Automatically close daemon when it is not needed + + + Launch at startup + 自動啟動 + + + Launch Flameshot + 啓動Flameshot + + + + Show welcome message on launch + Show welcome message on launch + + + + Use large predefined color palette + Use large predefined color palette + + + + Copy URL after upload + 上載后複製URL + + + Copy URL and close window after upload + 上載后複製URL並關閉窗口 + + + + Save image after copy + 複製後保存圖像 + + + Save image file after copying it + 複製圖像檔案后保存 + + + + Show the help message at the beginning in the capture mode + Show the help message at the beginning in the capture mode + + + + Use last region for GUI mode + Use last region for GUI mode + + + + Use the last region as the default selection for the next screenshot in GUI mode + Use the last region as the default selection for the next screenshot in GUI mode + + + + Show the side panel toggle button in the capture mode + Show the side panel toggle button in the capture mode + + + + Enable desktop notifications + Enable desktop notifications + + + + Show abort notifications + + + + + Enable abort notifications + + + + + Show icon in the system tray + Show icon in the system tray + + + + Use grim to capture screenshots + + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + + + + + Ask for confirmation to delete screenshot from the latest uploads + Ask for confirmation to delete screenshot from the latest uploads + + + + Check for updates automatically + Check for updates automatically + + + + This allows you to take screenshots of Flameshot itself for example + This allows you to take screenshots of Flameshot itself for example + + + Launch Flameshot daemon when computer is booted + Launch Flameshot daemon when computer is booted + + + + Show the welcome message box in the middle of the screen while taking a screenshot + Show the welcome message box in the middle of the screen while taking a screenshot + + + + Use a large predefined color palette + Use a large predefined color palette + + + + Copy on double click + Copy on double click + + + Enable Copy on Double Click + Enable Copy on Double Click + + + Copy URL and close window after uploading was successful + Copy URL and close window after uploading was successful + + + + Automatically unload from memory when it is not needed + + + + + Automatically close daemon (background process) when it is not needed + + + + + Launch in background at startup + + + + + Launch Flameshot daemon (background process) when computer is booted + + + + + Ask before quit capture + + + + + Show the confirmation prompt before ESC quit + + + + + Enable Copy to clipboard on Double Click + + + + + Copy URL after uploading was successful + + + + + After copying the screenshot, save it to a file as well + After copying the screenshot, save it to a file as well + + + + Save Path + 保存路徑 + + + + Change... + 變更... + + + + Use fixed path for screenshots to save + Use fixed path for screenshots to save + + + + Preferred save file extension: + Preferred save file extension: + + + + Latest Uploads Max Size + Latest Uploads Max Size + + + + Imgur Application Client ID + Imgur Application Client ID + + + + Undo limit + Undo limit + + + + Use JPG format for clipboard (PNG default) + Use JPG format for clipboard (PNG default) + + + + Use lossy JPG format for clipboard (lossless PNG default) + + + + + Copy file path after save + Copy file path after save + + + + Copy the file path to clipboard after the file is saved + Copy the file path to clipboard after the file is saved + + + + Anti-aliasing image when zoom the pinned image + Anti-aliasing image when zoom the pinned image + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + After zooming the pinned image, should the image get smoothened or stay pixelated + + + + + Upload image without confirmation + Upload image without confirmation + + + + Choose a Folder + 選取檔案集 + + + + Unable to write to directory. + 無法寫入目錄。 + + + + Show magnifier + Show magnifier + + + + Enable a magnifier while selecting the screenshot area + Enable a magnifier while selecting the screenshot area + + + + Square shaped magnifier + Square shaped magnifier + + + + Make the magnifier to be square-shaped + Make the magnifier to be square-shaped + + + + Milliseconds before geometry display hides; 0 means do not hide + + + + + Set geometry display timeout (ms) + + + + + Selection Geometry Display + + + + + Display Location + + + + + None + + + + + Top Left + + + + + Top Right + + + + + Bottom Left + + + + + Bottom Right + + + + + Center + + + + + Quality range of 0-100; Higher number is better quality and larger file size + + + + + JPEG Quality + + + + + Reverse arrow + + + + + Draw the arrow head first + + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + Latest Uploads + + + Screenshots history is empty + Screenshots history is empty + + + Copy URL + 複製連結 + + + URL copied to clipboard. + URL copied to clipboard. + + + Open in browser + Open in browser + + + Confirm to delete + Confirm to delete + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Are you sure you want to delete a screenshot from the latest uploads and server? + + + + ImgS3Uploader + + Error + 錯誤 + + + + ImgUploadDialog + + + Upload Confirmation + Upload Confirmation + + + + Do you want to upload this capture? + Do you want to upload this capture? + + + + + Upload without confirmation + Upload without confirmation + + + + ImgUploader + + Delete image + 刪除圖像 + + + Unable to open the URL. + 無法打開該URL。 + + + Screenshot copied to clipboard. + 截圖已複製到剪貼板。 + + + Copy URL + 複製連結 + + + Open URL + 打開連結 + + + Image to Clipboard. + 將檔案複製到剪貼簿。 + + + + ImgUploaderBase + + + Upload image + Upload image + + + + Uploading Image + 正在上傳 + + + + Copy URL + 複製連結 + + + + Open URL + 打開連結 + + + + Delete image + 刪除圖像 + + + + Image to Clipboard. + 將檔案複製到剪貼簿。 + + + + Save image + Save image + + + + Unable to open the URL. + 無法打開該URL。 + + + + URL copied to clipboard. + URL copied to clipboard. + + + + Screenshot copied to clipboard. + 截圖已複製到剪貼板。 + + + + Unable to save the screenshot to disk. + Unable to save the screenshot to disk. + + + + Screenshot saved. + Screenshot saved. + + + + ImgUploaderTool + + + Image Uploader + 上傳圖片 + + + + Upload the selection + Upload the selection + + + + ImgurUploader + + Upload to Imgur + 上傳到 Imgur + + + Uploading Image + 正在上傳 + + + Copy URL + 複製連結 + + + Open URL + 打開連結 + + + Delete image + 刪除圖像 + + + Image to Clipboard. + 將檔案複製到剪貼簿。 + + + + Unable to open the URL. + 無法打開該URL。 + + + URL copied to clipboard. + URL已複製到剪貼板。 + + + Screenshot copied to clipboard. + 截圖已複製到剪貼板。 + + + + ImgurUploaderTool + + Image Uploader + 上傳圖片 + + + Upload the selection to Imgur + 上載到 Imgur + + + + InfoWindow + + + + About + 關於 + + + + + Icon + Icon + + + + + License + License + + + + + GPLv3+ + GPLv3+ + + + + + Version + Version + + + + + Flameshot v + Flameshot v + + + + + OS Info + OS Info + + + + + Copy Info + Copy Info + + + Right Click + 右鍵 + + + Mouse Wheel + 滑鼠滑輪 + + + Move selection 1px + 移動 1px + + + Resize selection 1px + 調整大小 1px + + + Quit capture + 結束擷取 + + + Copy to clipboard + 複製到剪貼簿 + + + Save selection as a file + 將選擇範圍另存新檔 + + + Undo the last modification + 復原上次修改 + + + Toggle visibility of sidebar with options of the selected tool + 使用所選工具選項切換側邊欄可見性 + + + Show color picker + 顯示顏色選擇器 + + + Change the tool's thickness + 改變工具的寬度 + + + Key + 鍵 + + + Description + 描述 + + + <u><b>License</b></u> + <u><b>授權條款</b></u> + + + <u><b>Version</b></u> + <u><b>版本</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>快速鍵</b></u> + + + Available shortcuts in the screen capture mode. + 螢幕捕獲模式中的可用快捷鍵。 + + + + InvertTool + + + Invert + Invert + + + + Set Inverter as the paint tool + Set Inverter as the paint tool + + + + LineTool + + + Line + 直綫 + + + + Set the Line as the paint tool + 將直綫設定為繪畫工具 + + + + MarkerTool + + + Marker + 標記 + + + + Set the Marker as the paint tool + 將標記設定為繪畫工具 + + + + MoveTool + + + Move + 移動 + + + + Move the selection area + 移動選擇區域 + + + + PencilTool + + + Pencil + 鉛筆 + + + + Set the Pencil as the paint tool + 將鉛筆設定為繪畫工具 + + + + PinTool + + + Pin Tool + 固定工具 + + + + Pin image on the desktop + 將圖像固定到桌面 + + + + PinWidget + + + Context menu + Context menu + + + + Copy to clipboard + 複製到剪貼簿 + + + + Save to file + Save to file + + + + Rotate Right + + + + + Rotate Left + + + + + Increase Opacity + + + + + Decrease Opacity + + + + + Close + 關閉 + + + + PixelateTool + + + Pixelate + 馬賽克工具 + + + + Set Pixelate as the paint tool. + + + + Set Pixelate as the paint tool + 將馬賽克工具設定為繪畫工具 + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QHotkey + + Failed to register %1. Error: %2 + Failed to register %1. Error: %2 + + + Failed to unregister %1. Error: %2 + Failed to unregister %1. Error: %2 + + + + QObject + + + Save Error + 存檔錯誤 + + + + + Capture saved as + 截圖已另存為 + + + + + Capture saved to clipboard. + 熒幕捕獲已存儲到剪貼板。 + + + Capture saved to clipboard + 螢幕捕獲已存儲到剪貼板 + + + + Error while saving to clipboard + Error while saving to clipboard + + + + + Error trying to save as + 嘗試另存新檔時發生錯誤 + + + + Save screenshot + Save screenshot + + + + Path copied to clipboard as + Path copied to clipboard as + + + Saving canceled + Saving canceled + + + Save canceled + Save canceled + + + Capture is saved and copied to the clipboard as + Capture is saved and copied to the clipboard as + + + + Unable to connect via DBus + 無法透過 DBus 進行連接 + + + + Powerful yet simple to use screenshot software. + Powerful yet simple to use screenshot software. + + + + See + See + + + Capture the entire desktop. + 捕獲整個桌面。 + + + + Open the capture launcher. + 開啓捕獲啓動器。 + + + + Start a manual capture in GUI mode. + 在GUi模式下開啓手動捕獲。 + + + + Configure + Configure + + + Capture a single screen. + 捕獲單一熒幕。 + + + Path where the capture will be saved + Path where the capture will be saved + + + + Capture screenshot of all monitors at the same time. + + + + + Capture a screenshot of the specified monitor. + + + + + Existing directory or new file to save to + Existing directory or new file to save to + + + + Save the capture to the clipboard + Save the capture to the clipboard + + + + Pin the capture to the screen + Pin the capture to the screen + + + + Upload screenshot + Upload screenshot + + + + Delay time in milliseconds + Delay time in milliseconds + + + + Repeat screenshot with previously selected region + Repeat screenshot with previously selected region + + + + Screenshot region to select + Screenshot region to select + + + + Set the filename pattern + Set the filename pattern + + + + Accept capture as soon as a selection is made + Accept capture as soon as a selection is made + + + + Enable or disable the trayicon + Enable or disable the trayicon + + + + Enable or disable run at startup + Enable or disable run at startup + + + + Enable or disable the notifications + + + + + Check the configuration for errors + Check the configuration for errors + + + + Show the help message in the capture mode + Show the help message in the capture mode + + + + Define the main UI color + Define the main UI color + + + + Define the contrast UI color + Define the contrast UI color + + + + Print raw PNG capture + Print raw PNG capture + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + + + + Define the screen to capture (starting from 0) + Define the screen to capture (starting from 0) + + + + Invalid delay, it must be a number greater than 0 + Invalid delay, it must be a number greater than 0 + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + + + + Invalid path, must be an existing directory or a new file in an existing directory + Invalid path, must be an existing directory or a new file in an existing directory + + + Define the screen to capture + Define the screen to capture + + + + default: screen containing the cursor + default: screen containing the cursor + + + + Screen number + Screen number + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + + + Invalid delay, it must be higher than 0 + Invalid delay, it must be higher than 0 + + + + Invalid screen number, it must be non negative + Invalid screen number, it must be non negative + + + Invalid path, it must be a real path in the system + Invalid path, it must be a real path in the system + + + + Invalid value, it must be defined as 'true' or 'false' + Invalid value, it must be defined as 'true' or 'false' + + + + Error + 錯誤 + + + + Unable to write in + 無法寫入 + + + + Requested screen exceeds screen count + Requested screen exceeds screen count + + + + Full screen screenshot pinned to screen + Full screen screenshot pinned to screen + + + URL copied to clipboard. + 連結已複製到剪貼板。 + + + + Options + 選項 + + + Arguments + Arguments + + + arguments + arguments + + + + Subcommands + + + + + subcommands + + + + + Usage + 使用 + + + + options + 選項 + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + Per default runs Flameshot in the background and adds a tray icon for configuration. + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + + + Toggle side panel + Toggle side panel + + + Resize selection left 1px + Resize selection left 1px + + + Resize selection right 1px + Resize selection right 1px + + + Resize selection up 1px + Resize selection up 1px + + + Resize selection down 1px + Resize selection down 1px + + + Select entire screen + Select entire screen + + + Move selection left 1px + Move selection left 1px + + + Move selection right 1px + Move selection right 1px + + + Move selection up 1px + Move selection up 1px + + + Move selection down 1px + Move selection down 1px + + + Commit text in text area + Commit text in text area + + + Delete current tool + Delete current tool + + + + Quit capture + 結束擷取 + + + + Screenshot history + Screenshot history + + + + Capture screen + Capture screen + + + + Show color picker + 顯示顏色選擇器 + + + + Change the tool's size + Change the tool's size + + + Change the tool's thickness + 改變工具的寬度 + + + + RectangleTool + + + Rectangle + 矩形 + + + + Set the Rectangle as the paint tool + 將矩形設定為繪畫工具 + + + + RedoTool + + + Redo + 重做 + + + + Redo the next modification + 重做下一次修改 + + + + SaveTool + + + Save + 儲存 + + + + Save screenshot to a file + Save screenshot to a file + + + Save the capture + 儲存螢幕捕獲 + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + + + + Unable to capture screen + 無法捕獲螢幕 + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + 矩形選擇 + + + + Set Selection as the paint tool + 將矩形選擇設定為繪畫工具 + + + + SetShortcutDialog + + + Set Shortcut + Set Shortcut + + + + Enter new shortcut to change + Enter new shortcut to change + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + Press Esc to cancel or Backspace to disable the keyboard shortcut. + + + + + Flameshot must be restarted for changes to take effect. + Flameshot must be restarted for changes to take effect. + + + + ShortcutsWidget + + + Hot Keys + Hot Keys + + + + Available shortcuts in the screen capture mode. + 螢幕捕獲模式中的可用快捷鍵。 + + + + Description + 描述 + + + + Key + 鍵 + + + + Left Double-click + Left Double-click + + + + Toggle side panel + Toggle side panel + + + + Grab a color from the screen + + + + + Resize selection left 1px + Resize selection left 1px + + + + Resize selection right 1px + Resize selection right 1px + + + + Resize selection up 1px + Resize selection up 1px + + + + Resize selection down 1px + Resize selection down 1px + + + + Symmetrically decrease width by 2px + + + + + Symmetrically increase width by 2px + + + + + Symmetrically increase height by 2px + + + + + Symmetrically decrease height by 2px + + + + + Select entire screen + Select entire screen + + + + Move selection left 1px + Move selection left 1px + + + + Move selection right 1px + Move selection right 1px + + + + Move selection up 1px + Move selection up 1px + + + + Move selection down 1px + Move selection down 1px + + + + Commit text in text area + Commit text in text area + + + + Delete selected drawn object + + + + + Cancel current selection + + + + Delete current tool + Delete current tool + + + + Capture screen + Capture screen + + + + Screenshot history + Screenshot history + + + + SidePanelWidget + + Active thickness: + 動態寬度: + + + Active color: + 動態顔色: + + + Press ESC to cancel + 按ESC以取消 + + + + Active tool size: + Active tool size: + + + + Active Color: + Active Color: + + + + Grab Color + 選取顔色 + + + + Display grid + + + + + SizeDecreaseTool + + + Decrease Tool Size + Decrease Tool Size + + + + Decrease the size of the other tools + Decrease the size of the other tools + + + + SizeIncreaseTool + + + Increase Tool Size + Increase Tool Size + + + + Increase the size of the other tools + Increase the size of the other tools + + + + SizeIndicatorTool + + Selection Size Indicator + 選擇尺寸指示 + + + Show X and Y dimensions of the selection + Show X and Y dimensions of the selection + + + Show the dimensions of the selection (X Y) + 顯示選擇的尺寸 (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + 世紀(00-99) + + + + Year (00-99) + 年(00-99) + + + + Year (2000) + 年(2000) + + + + Month Name (jan) + 月(jan) + + + + Month Name (january) + 月(january) + + + + Month (01-12) + 月(01-12) + + + + Week Day (1-7) + 工作日(1-7) + + + + Week (01-53) + 周(01-53) + + + + Day Name (mon) + 星期(mon) + + + + Day Name (monday) + 星期(diumenge) + + + + Day (01-31) + 日(01-31) + + + + Day of Month (1-31) + 一月中的某日(1-31) + + + + Day (001-366) + 日(001-366) + + + + Time (%H-%M-%S) + 時間(%H-%M-%S) + + + + Time (%H-%M) + 時間(%H-%M) + + + + Hour (00-23) + 小時(00-23) + + + + Hour (01-12) + 小時(01-12) + + + + Minute (00-59) + 分(00-59) + + + + Second (00-59) + 秒(00-59) + + + + Full Date (%m/%d/%y) + 日期(%m/%d/%y) + + + + Full Date (%Y-%m-%d) + 日期(%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + + + + + SystemNotification + + + Flameshot Info + Flameshot相關資訊 + + + + TextConfig + + + StrikeOut + 劃去 + + + + Underline + 下劃綫 + + + + Bold + 加粗 + + + + Italic + 斜體 + + + + Left Align + Left Align + + + + Center Align + Center Align + + + + Right Align + Right Align + + + + TextTool + + + Text + 文本工具 + + + + Add text to your capture + 往您捕獲的截圖中添加文本 + + + + TrayIcon + + + &Take Screenshot + &捕獲截圖 + + + + &Open Launcher + &開啓啓動器 + + + + &Configuration + &設定 + + + + &About + &關於 + + + + Check for updates + 更新檢查 + + + + New version %1 is available + 新版本 %1 現在可用 + + + + &Quit + &結束 + + + + &Latest Uploads + &最新上載 + + + + &Open Save Path + + + + + UIcolorEditor + + UI Color Editor + UI 顏色編輯器 + + + + Change the color moving the selectors and see the changes in the preview buttons. + 移動顏色選擇並在預覽按鈕檢視。 + + + + Select a Button to modify it + 選擇一個按鈕以修改 + + + + Main Color + 主色 + + + + Click on this button to set the edition mode of the main color. + 點選按鈕設定主色。 + + + + Contrast Color + 對比色 + + + + Click on this button to set the edition mode of the contrast color. + 點選按鈕設定對比色。 + + + + UndoTool + + + Undo + 撤銷 + + + + Undo the last modification + 撤銷上次修改 + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + New Flameshot version %1 is available + + + + Ignore + Ignore + + + + Later + Later + + + + Update + Update + + + + UploadHistory + + + Upload History + Upload History + + + + Screenshots history is empty + Screenshots history is empty + + + + UploadLineItem + + + Form + Form + + + + TextLabel + TextLabel + + + + Copy URL + 複製連結 + + + + Open In Browser + Open In Browser + + + + Confirm to delete + Confirm to delete + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Are you sure you want to delete a screenshot from the latest uploads and server? + + + + UtilityPanel + + + Close + 關閉 + + + + <Empty> + <Empty> + + + + VisualsEditor + + + Opacity of area outside selection: + 選取區域以外的不透明度: + + + + UI Color Editor + UI 顏色編輯器 + + + + Colorpicker Editor + Colorpicker Editor + + + + Button Selection + 按鈕選取 + + + + Select All + 全選 + + + + color_widgets::ColorDialog + + + Pick + Pick + + + + color_widgets::ColorPalette + + + Unnamed + Unnamed + + + + color_widgets::ColorPaletteModel + + + Unnamed + Unnamed + + + + %1 (%2 colors) + %1 (%2 colors) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + Open a new palette from file + + + + + Create a new palette + Create a new palette + + + + + Duplicate the current palette + Duplicate the current palette + + + + + Delete the current palette + Delete the current palette + + + + + Revert changes to the current palette + Revert changes to the current palette + + + + + Save changes to the current palette + Save changes to the current palette + + + + + Add a color to the palette + Add a color to the palette + + + + + Remove the selected color from the palette + Remove the selected color from the palette + + + + + New Palette + New Palette + + + + + Name + Name + + + + GIMP Palettes (*.gpl) + GIMP Palettes (*.gpl) + + + + Palette Image (%1) + Palette Image (%1) + + + + All Files (*) + All Files (*) + + + + + Open Palette + Open Palette + + + + Failed to load the palette file +%1 + Failed to load the palette file +%1 + + + + color_widgets::GradientEditor + + + Add Color + Add Color + + + + Remove Color + Remove Color + + + + Edit Color... + Edit Color... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 colors) + + + + color_widgets::Swatch + + + Clear Color + Clear Color + + + + %1 (%2) + %1 (%2) + + + diff --git a/data/translations/Internationalization_zh_TW.ts b/data/translations/Internationalization_zh_TW.ts new file mode 100644 index 0000000..f3caa7c --- /dev/null +++ b/data/translations/Internationalization_zh_TW.ts @@ -0,0 +1,3160 @@ + + + + + AbstractWidgetList + + + Add New + 新增 + + + + Move Up + 上移 + + + + Move Down + 下移 + + + + Remove + 移除 + + + + AcceptTool + + + Accept + 接受 + + + + Accept the capture + 接受截圖 + + + + AppLauncher + + + App Launcher + 應用程式啟動器 + + + + Choose an app to open the capture + 選擇一個程式打開此截圖 + + + + AppLauncherWidget + + + Open With + 開啟方式 + + + + Launch in terminal + 在終端機中啟動 + + + + Keep open after selection + 選擇後維持此視窗開啟 + + + + + Error + 錯誤 + + + + Unable to launch in terminal. + 無法在終端機中啟動。 + + + + Unable to write in + 無法寫入 + + + + ArrowTool + + + Arrow + 箭頭 + + + + Set the Arrow as the paint tool + 選擇箭頭作為繪製工具 + + + + BlurTool + + Blur + 模糊 + + + Set Blur as the paint tool + 選擇模糊作為繪製工具 + + + + CaptureLauncher + + <b>Capture Mode</b> + <b>擷取模式</b> + + + + Rectangular Region + 矩形區域 + + + + Full Screen (Current Display) + 全螢幕(目前螢幕) + + + + Full Screen (All Monitors) + 全螢幕(所有螢幕) + + + + No Delay + 無延遲 + + + + second + 秒 + + + + + + seconds + 秒 + + + + + Take new screenshot + 擷取新的螢幕截圖 + + + + + Area: + 區域: + + + + + Capture Launcher + 截圖啟動器 + + + + + TextLabel + 文字標籤 + + + + + Capture Mode + 截圖模式 + + + + + Delay: + 延遲: + + + + + WxH+x+y + WxH+x+y + + + + CaptureWidget + + + Unable to capture screen + 無法擷取螢幕 + + + + Mouse + 滑鼠 + + + + Select screenshot area + 選擇截圖區域 + + + + Mouse Wheel + 滑鼠滾輪 + + + + Change tool size + 變更工具大小 + + + + Right Click + 右鍵點選 + + + + Show color picker + 顯示顏色選擇器 + + + + Open side panel + 開啟側邊欄 + + + + Esc + Esc + + + + Exit + 離開 + + + + Quit Capture + + + + + Are you sure you want to quit capture? + + + + + Do not show this again + 不要再顯示此訊息 + + + + Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere. + Flameshot 已失去焦點。鍵盤快捷鍵將不會起作用,除非你點選某處。 + + + + Configuration error resolved. Launch `flameshot gui` again to apply it. + 設定錯誤已排除。再次啟動 `flameshot gui` 以套用。 + + + Select an area with the mouse, or press Esc to exit. +Press Enter to capture the screen. +Press Right Click to show the color picker. +Use the Mouse Wheel to change the thickness of your tool. +Press Space to open the side panel. + 使用滑鼠選擇一片區域,或按Esc退出。 +按Enter以擷取螢幕。 +點擊滑鼠右鍵顯示拾色器。 +使用滑鼠滾輪來調整工具寬度。 +按Space打開側面板。 + + + + Tool Settings + 工具設定 + + + + CircleCountTool + + + Circle Counter + 圓形計數器 + + + + Add an autoincrementing counter bubble + 新增一個自動遞增的計數氣泡 + + + + CircleTool + + + Circle + 圓形 + + + + Set the Circle as the paint tool + 選擇圓形為繪圖工具 + + + + ColorDialog + + + + Select Color + 選擇顏色 + + + + + Saturation + 飽和度 + + + + + Hue + 色調 + + + + + Hex + Hex + + + + + Blue + 藍色 + + + + + Value + 數值 + + + + + Green + 綠色 + + + + + Alpha + 透明度 + + + + + Red + 紅色 + + + + ColorGrabWidget + + + Accept color + 接受顏色 + + + + Enter or Left Click + Enter 或 左鍵點選 + + + + Precisely select color + 精確選擇顏色 + + + + Hold Left Click + 按住左鍵 + + + + Toggle magnifier + 切換放大鏡 + + + + Space or Right Click + 空白鍵或右鍵點選 + + + + Cancel + 取消 + + + + Esc + Esc + + + + ColorPickerEditor + + + Edit Preset: + 編輯預設: + + + + Enter color to update preset + 輸入顏色以更新預設 + + + + Update + 更新 + + + + Press button to update the selected preset + 按下按鈕以更新選擇的預設 + + + + Delete + 刪除 + + + + Press button to delete the selected preset + 按下按鈕以刪除選擇的預設 + + + + Add Preset: + 新增預設: + + + + Enter color manually or select it using the color-wheel + 手動輸入顏色或使用色輪選擇 + + + + Add + 新增 + + + + Press button to add preset + 按下按鈕以新增預設 + + + + + Error + 錯誤 + + + + Unable to add preset. Maximum limit reached. + 無法新增預設。已達到最大限制。 + + + + Unable to remove preset. Minimum limit reached. + 無法移除預設。已達到最小限制。 + + + + ConfigErrorDetails + + + Configuration errors + 設定錯誤 + + + + ConfigHandler + + + Unrecognized setting: '%1' + + 無法識別的設定:'%1' + + + + + Unrecognized shortcut name: '%1'. + + 無法識別的快捷鍵名稱:'%1'. + + + + + Shortcut conflict: '%1' and '%2' have the same shortcut: %3 + + 快捷鍵衝突:'%1' 和 '%2' 有相同的快捷鍵:%3 + + + + + Bad value in '%1'. Expected: %2 + + '%1' 中的數值不正確。預期應為:%2 + + + + + You have successfully resolved the configuration error. + 您已成功排除設定錯誤。 + + + + The configuration contains an error. Open configuration to resolve. + 設定中包含錯誤。開啟設定以排除。 + + + + Bad config key '%1' in ConfigHandler. Please report this as a bug. + 在 ConfigHandler 中的錯誤設定鍵 '%1'。請將此報告為錯誤。 + + + + ConfigResolver + + + Resolve configuration errors + 排除設定錯誤 + + + + <b>You must resolve all errors before continuing:</b> + <b>您必須在繼續之前排除所有錯誤:</b> + + + + Reset + 重設 + + + + Reset to the default value. + 重設為預設值。 + + + + Remove + 移除 + + + + Remove this setting. + 移除此設定。 + + + + Some keyboard shortcuts have conflicts. +This will NOT prevent flameshot from starting. +Please solve them manually in the configuration file. + 部份鍵盤快捷鍵有衝突。 +這不會妨礙 flameshot 啟動。 +請在設定檔中手動排除它們。 + + + + Resolve all + 全部排除 + + + + Resolve all listed errors. + 排除所有列出的錯誤。 + + + + Details + 詳細資訊 + + + + ConfigWindow + + + Configuration + 設定 + + + + Interface + 介面 + + + + Filename Editor + 檔名編輯器 + + + + General + 一般 + + + + Shortcuts + 捷徑 + + + + Resolve + 排除 + + + + <b>Configuration file has errors. Resolve them before continuing.</b> + <b>設定檔有錯誤。在繼續之前排除它們。</b> + + + + Controller + + New version %1 is available + 已有新版本 %1 可取得 + + + You have the latest version + 您已安裝最新版本 + + + Failed to get information about the latest version. + 無法取得最新版本的資訊。 + + + Error + 錯誤 + + + Unable to close active modal widgets + Unable to close active modal widgets + + + &Take Screenshot + &進行截圖 + + + &Open Launcher + &打開啟動器 + + + &Configuration + &設定 + + + &About + &關於 + + + Check for updates + 檢查更新 + + + &Latest Uploads + &最近上傳 + + + &Information + &資訊 + + + &Quit + &結束 + + + + CopyTool + + + Copy + 複製 + + + + Copy selection to clipboard + 將選擇的部分複製到剪貼簿 + + + Copy the selection into the clipboard + 把截圖複製到剪貼簿 + + + + DBusUtils + + Unable to connect via DBus + 無法透過 DBus 進行連接 + + + + ExitTool + + + Exit + 離開 + + + + Leave the capture screen + 離開截圖畫面 + + + + FileNameEditor + + + Edit the name of your captures: + 編輯您的截圖名稱: + + + + Edit: + 編輯: + + + + Preview: + 預覽: + + + + Save + 存檔 + + + + Saves the pattern + 儲存模式 + + + + Restore + 還原 + + + Reset + 重設 + + + + Restores the saved pattern + 還原儲存的模式 + + + + Clear + 清除 + + + + Deletes the name + 刪除這個名稱 + + + + Flameshot + + + Error + 錯誤 + + + + Unable to close active modal widgets + 無法關閉正在使用中的小工具 + + + + URL copied to clipboard. + 網址已複製到剪貼簿。 + + + + FlameshotDaemon + + + New version %1 is available + 已有新版本 %1 可使用 + + + + You have the latest version + 您已安裝最新版本 + + + + Failed to get information about the latest version. + 無法取得最新版本的資訊。 + + + + Unable to connect via DBus + 無法透過 DBus 進行連接 + + + + GeneneralConf + + Show help message + 顯示説明資訊 + + + Show the help message at the beginning in the capture mode. + 在擷取之前顯示説明資訊 + + + Show desktop notifications + 顯示桌面通知 + + + Show tray icon + 顯示託盤圖示 + + + Show the systemtray icon + 顯示工作列圖示 + + + Import + 匯入 + + + Error + 錯誤 + + + Unable to read file. + 無法讀取檔案 + + + Unable to write file. + 無法寫入檔案 + + + Save File + 存檔 + + + Confirm Reset + 確認重設 + + + Are you sure you want to reset the configuration? + 你確定你想要重設? + + + Configuration File + 設定檔 + + + Export + 匯出 + + + Reset + 重設 + + + Launch at startup + 自動啟動 + + + + GeneralConf + + + + Import + 匯入 + + + + + + + Error + 錯誤 + + + + Unable to read file. + 無法讀取檔案。 + + + + + Unable to write file. + 無法寫入檔案。 + + + + Save File + 儲存檔案 + + + + Confirm Reset + 確認重設 + + + + Are you sure you want to reset the configuration? + 您確定要重設設定嗎? + + + + Show help message + 顯示説明顯示説明 + + + Show the help message at the beginning in the capture mode. + 在擷取之前顯示説明資訊。 + + + + Show the side panel button + 顯示側邊欄按鈕 + + + Show the side panel toggle button in the capture mode. + 在擷取模式下顯示側面板按鈕。 + + + + Show desktop notifications + 顯示桌面通知 + + + + Show tray icon + 顯示工具列圖示 + + + Show the systemtray icon + 顯示工作列圖示 + + + + Confirmation required to delete screenshot from the latest uploads + 從最近上傳刪除截圖時需要確認 + + + + Configuration File + 設定檔 + + + + Export + 匯出 + + + + Reset + 重設 + + + + Automatic check for updates + 自動檢查更新 + + + + Allow multiple flameshot GUI instances simultaneously + 允許同時執行多個 flameshot GUI 程式 + + + Automatically close daemon when it is not needed + 當不需要常駐程式時自動關閉 + + + Launch at startup + 開機自動啟動 + + + Launch Flameshot + 啟動 Flameshot + + + + Show welcome message on launch + 啟動時顯示歡迎訊息 + + + + Use large predefined color palette + 使用大型預定義的顏色調色盤 + + + + Copy URL after upload + 上傳後自動複製網址 + + + Copy URL and close window after upload + 上傳後自動複製網址並關閉視窗 + + + + Save image after copy + 複製圖片後自動儲存 + + + Save image file after copying it + 複製圖片後自動儲存 + + + + Show the help message at the beginning in the capture mode + 在擷取模式開始時顯示説明訊息 + + + + Use last region for GUI mode + 使用上次的區域 + + + + Use the last region as the default selection for the next screenshot in GUI mode + 將上次的區域作為下一次截圖的預設選擇 + + + + Show the side panel toggle button in the capture mode + 在擷取模式中顯示側邊欄切換按鈕 + + + + Enable desktop notifications + 啟用桌面通知 + + + + Show abort notifications + + + + + Enable abort notifications + + + + + Show icon in the system tray + 在系統工具列中顯示圖示 + + + + Use grim to capture screenshots + + + + + Grim is a wayland only utility to capture screens based on the screencopy protocol. Generally only enable on minimal wayland window managers like sway, hyprland, etc. + + + + + Ask for confirmation to delete screenshot from the latest uploads + 從最近上傳刪除截圖時詢問確認 + + + + Check for updates automatically + 自動檢查更新 + + + + This allows you to take screenshots of Flameshot itself for example + 例如,這允許您對 Flameshot 本身進行截圖 + + + Launch Flameshot daemon when computer is booted + 電腦開機時啟動 Flameshot 常駐程式 + + + + Show the welcome message box in the middle of the screen while taking a screenshot + 擷取截圖時在螢幕中間顯示歡迎訊息框 + + + + Use a large predefined color palette + 使用大型預定義的顏色調色盤 + + + + Copy on double click + 點選兩下複製 + + + Enable Copy on Double Click + 啟用點選兩下複製 + + + Copy URL and close window after uploading was successful + 上傳成功後複製網址並關閉視窗 + + + + Automatically unload from memory when it is not needed + + + + + Automatically close daemon (background process) when it is not needed + + + + + Launch in background at startup + + + + + Launch Flameshot daemon (background process) when computer is booted + + + + + Ask before quit capture + + + + + Show the confirmation prompt before ESC quit + + + + + Enable Copy to clipboard on Double Click + + + + + Copy URL after uploading was successful + + + + + After copying the screenshot, save it to a file as well + 複製截圖後,也將其儲存為檔案 + + + + Save Path + 儲存路徑 + + + + Change... + 變更... + + + + Use fixed path for screenshots to save + 使用固定的路徑來儲存螢幕截圖 + + + + Preferred save file extension: + 偏好的副檔名: + + + + Latest Uploads Max Size + 最近上傳的最大大小 + + + + Imgur Application Client ID + Imgur 應用程式客戶端 ID + + + + Undo limit + 復原限制 + + + + Use JPG format for clipboard (PNG default) + 複製到剪貼簿時使用 JPG 格式(預設為 PNG) + + + + Use lossy JPG format for clipboard (lossless PNG default) + + + + + Copy file path after save + 儲存後複製檔案路徑 + + + + Copy the file path to clipboard after the file is saved + 檔案儲存後將檔案路徑複製到剪貼簿 + + + + Anti-aliasing image when zoom the pinned image + 放大釘選的圖片時進行反鋸齒處理 + + + + After zooming the pinned image, should the image get smoothened or stay pixelated + 放大釘選的圖片後,圖片應該進行平滑處理還是保持像素化 + + + + + Upload image without confirmation + 上傳圖片無需確認 + + + + Choose a Folder + 選擇一個資料夾 + + + + Unable to write to directory. + 無法寫入資料夾。 + + + + Show magnifier + 顯示放大鏡 + + + + Enable a magnifier while selecting the screenshot area + 選擇截圖區域時啟用放大鏡 + + + + Square shaped magnifier + 方形放大鏡 + + + + Make the magnifier to be square-shaped + 將放大鏡變成方形 + + + + Milliseconds before geometry display hides; 0 means do not hide + + + + + Set geometry display timeout (ms) + + + + + Selection Geometry Display + + + + + Display Location + + + + + None + 無 + + + + Top Left + + + + + Top Right + + + + + Bottom Left + + + + + Bottom Right + + + + + Center + + + + + Quality range of 0-100; Higher number is better quality and larger file size + + + + + JPEG Quality + + + + + Reverse arrow + 反向箭頭 + + + + Draw the arrow head first + + + + + Insecure Pixelate + + + + + Draw the pixelation effect in an insecure but more asethetic way. + + + + + HistoryWidget + + Latest Uploads + 最近上傳 + + + Screenshots history is empty + 無螢幕截圖歷史紀錄 + + + Copy URL + 複製網址 + + + URL copied to clipboard. + 網址已複製到剪貼簿。 + + + Open in browser + 在瀏覽器開啟 + + + Confirm to delete + 確認刪除 + + + Are you sure you want to delete a screenshot from the latest uploads and server? + Are you sure you want to delete a screenshot from the latest uploads and server? + + + + ImgS3Uploader + + Uploading Image + 正在上傳 + + + URL copied to clipboard. + 連結已複製到剪貼簿 + + + Error + 錯誤 + + + + ImgUploadDialog + + + Upload Confirmation + 上傳確認 + + + + Do you want to upload this capture? + 您要上傳這個截圖嗎? + + + + + Upload without confirmation + 上傳無需確認 + + + + ImgUploader + + Uploading Image + 正在上傳 + + + Unable to open the URL. + 無法打開此連結 + + + URL copied to clipboard. + 連結已複製到剪貼簿 + + + Screenshot copied to clipboard. + 截圖已複製到剪貼簿 + + + Copy URL + 複製連結 + + + Open URL + 打開連結 + + + Image to Clipboard. + 將檔案複製到剪貼簿 + + + + ImgUploaderBase + + + Upload image + 上傳圖片 + + + + Uploading Image + 正在上傳圖片 + + + + Copy URL + 複製網址 + + + + Open URL + 開啟連結 + + + + Delete image + 刪除圖片 + + + + Image to Clipboard. + 圖片到剪貼簿。 + + + + Save image + 儲存圖片 + + + + Unable to open the URL. + 無法打開此連結。 + + + + URL copied to clipboard. + 網址已複製到剪貼簿。 + + + + Screenshot copied to clipboard. + 截圖已複製到剪貼簿。 + + + + Unable to save the screenshot to disk. + 無法將截圖儲存到磁碟。 + + + + Screenshot saved. + 截圖已儲存。 + + + + ImgUploaderTool + + + Image Uploader + 圖片上傳器 + + + + Upload the selection + 上傳選擇的部分 + + + + ImgurUploader + + Upload to Imgur + 上傳到 Imgur + + + Uploading Image + 正在上傳 + + + Copy URL + 複製連結 + + + Open URL + 打開連結 + + + Delete image + 刪除圖片 + + + Image to Clipboard. + 將檔案複製到剪貼簿。 + + + + Unable to open the URL. + 無法打開此連結。 + + + URL copied to clipboard. + 連結已複製到剪貼簿。 + + + Screenshot copied to clipboard. + 截圖已複製到剪貼簿。 + + + + ImgurUploaderTool + + Image Uploader + 上傳圖片 + + + Upload the selection to Imgur + 上傳到 Imgur + + + + InfoWindow + + + + About + 關於 + + + + + Icon + 圖示 + + + + + License + 授權 + + + + + GPLv3+ + GPLv3+ + + + + + Version + 版本 + + + + + Flameshot v + Flameshot v + + + + + OS Info + 作業系統資訊 + + + + + Copy Info + 複製資訊 + + + Right Click + 右鍵 + + + Mouse Wheel + 滑鼠滑輪 + + + Move selection 1px + 移動 1px + + + Resize selection 1px + 調整大小 1px + + + Quit capture + 結束擷取 + + + Copy to clipboard + 複製到剪貼簿 + + + Save selection as a file + 將選擇範圍另存新檔 + + + Undo the last modification + 復原上次修改 + + + Show color picker + 顯示顏色選擇器 + + + Change the tool's thickness + 改變工具的寬度 + + + Key + 鍵 + + + Description + 描述 + + + <u><b>License</b></u> + <u><b>授權條款</b></u> + + + <u><b>Version</b></u> + <u><b>版本</b></u> + + + <u><b>Shortcuts</b></u> + <u><b>快速鍵</b></u> + + + Available shortcuts in the screen capture mode. + 螢幕擷取模式中的可用快速鍵 + + + + InvertTool + + + Invert + 反轉 + + + + Set Inverter as the paint tool + 選擇反轉為繪圖工具 + + + + LineTool + + + Line + 直線 + + + + Set the Line as the paint tool + 選擇直線為繪圖工具 + + + + MarkerTool + + + Marker + 標記 + + + + Set the Marker as the paint tool + 選擇標記為繪圖工具 + + + + MoveTool + + + Move + 移動 + + + + Move the selection area + 移動選擇區域 + + + + PencilTool + + + Pencil + 鉛筆 + + + + Set the Pencil as the paint tool + 選擇鉛筆為繪圖工具 + + + + PinTool + + + Pin Tool + 釘選工具 + + + + Pin image on the desktop + 將圖片釘選在桌面上 + + + + PinWidget + + + Context menu + 內文選單 + + + + Copy to clipboard + 複製到剪貼簿 + + + + Save to file + 儲存到檔案 + + + + Rotate Right + 向右旋轉 + + + + Rotate Left + 向左旋轉 + + + + Increase Opacity + + + + + Decrease Opacity + + + + + Close + 關閉 + + + + PixelateTool + + + Pixelate + 馬賽克 + + + + Set Pixelate as the paint tool. + + + + Set Pixelate as the paint tool + 選擇馬賽克為繪圖工具 + + + + PrimaryInstanceWidget + + + Primary instance + + + + + <b>Primary instance.</b> Messages received from secondaries: + + + + + QHotkey + + Failed to register %1. Error: %2 + 無法註冊 %1。錯誤:%2 + + + Failed to unregister %1. Error: %2 + 無法取消註冊 %1。錯誤:%2 + + + + QObject + + + Save Error + 存檔錯誤 + + + + + Capture saved as + 截圖已另存為 + + + + + Capture saved to clipboard. + 截圖已複製到剪貼簿。 + + + Capture saved to clipboard + 已將截圖複製到剪貼簿 + + + + Error while saving to clipboard + 複製到剪貼簿時發生錯誤 + + + + + Error trying to save as + 嘗試另存發生錯誤 + + + + Save screenshot + 儲存截圖 + + + + Path copied to clipboard as + 路徑已複製到剪貼簿為 + + + Saving canceled + 已取消儲存 + + + Save canceled + 已取消儲存 + + + Capture is saved and copied to the clipboard as + Capture is saved and copied to the clipboard as + + + + Unable to connect via DBus + 無法透過 DBus 進行連接 + + + + Powerful yet simple to use screenshot software. + 強大且易於使用的截圖軟體。 + + + + See + 查看 + + + Capture the entire desktop. + 擷取整個桌面。 + + + + Open the capture launcher. + 開啟截圖啟動器。 + + + + Start a manual capture in GUI mode. + 在 GUI 模式下開始手動截圖。 + + + + Configure + 設定 + + + Capture a single screen. + 擷取單一螢幕。 + + + Path where the capture will be saved + Path where the capture will be saved + + + + Capture screenshot of all monitors at the same time. + + + + + Capture a screenshot of the specified monitor. + + + + + Existing directory or new file to save to + 儲存到的現有目錄或另存新檔 + + + + Save the capture to the clipboard + 將截圖複製到剪貼簿 + + + + Pin the capture to the screen + 將截圖釘選到螢幕上 + + + + Upload screenshot + 上傳截圖 + + + + Delay time in milliseconds + 延遲時間(毫秒) + + + + Repeat screenshot with previously selected region + 使用先前選擇的區域重複截圖 + + + + Screenshot region to select + 要選擇的截圖區域 + + + + Set the filename pattern + 設定檔名格式 + + + + Accept capture as soon as a selection is made + 一選擇就接受截圖 + + + + Enable or disable the trayicon + 啟用或停用工具列圖示 + + + + Enable or disable run at startup + 啟用或停用開機啟動 + + + + Enable or disable the notifications + + + + + Check the configuration for errors + 檢查設定是否有錯誤 + + + + Show the help message in the capture mode + 在擷取模式中顯示説明資訊 + + + + Define the main UI color + 定義主要 UI 顏色 + + + + Define the contrast UI color + 定義對比 UI 顏色 + + + + Print raw PNG capture + 列印原始 PNG 截圖 + + + + Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified + 以 WxH+X+Y 格式列印選擇的幾何形狀。若指定了「原始」模式,則不進行任何動作 + + + + Define the screen to capture (starting from 0) + 定義要擷取的螢幕(從 0 開始) + + + + Invalid delay, it must be a number greater than 0 + 無效的延遲時間,它必須是大於 0 的數字 + + + + Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'. + 無效的區域,使用 'WxH+X+Y' 或 'all' 或 'screen0/screen1/...' 等格式。 + + + + Invalid path, must be an existing directory or a new file in an existing directory + 無效的路徑,必須是現有的目錄或現有目錄中的新檔案 + + + Define the screen to capture + Define the screen to capture + + + + default: screen containing the cursor + 預設:包含游標的螢幕 + + + + Screen number + 螢幕編號 + + + + Invalid color, this flag supports the following formats: +- #RGB (each of R, G, and B is a single hex digit) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- Named colors like 'blue' or 'red' +You may need to escape the '#' sign as in '\#FFF' + 無效的顏色,此標誌支援以下格式: +- #RGB (R、G 和 B 的每一個都是單個十六進位制數字) +- #RRGGBB +- #RRRGGGBBB +- #RRRRGGGGBBBB +- 像 'blue' 或 'red' 這樣的命名顏色 +您可能需要像 '\#FFF' 這樣跳脫 '#' 符號 + + + Invalid delay, it must be higher than 0 + 延遲秒數無效,必須大於 0 + + + + Invalid screen number, it must be non negative + 無效的螢幕編號,它必須是一個正整數 + + + Invalid path, it must be a real path in the system + Invalid path, it must be a real path in the system + + + + Invalid value, it must be defined as 'true' or 'false' + 無效的值,它必須被定義為 'true' 或 'false' + + + + Error + 錯誤 + + + + Unable to write in + 無法寫入 + + + + Requested screen exceeds screen count + 請求的螢幕超過螢幕數量 + + + + Full screen screenshot pinned to screen + 全螢幕截圖已釘選到螢幕上 + + + URL copied to clipboard. + 連結已複製到剪貼簿。 + + + + Options + 選項 + + + Arguments + 參數 + + + arguments + 參數 + + + + Subcommands + + + + + subcommands + + + + + Usage + 使用方法 + + + + options + 選項 + + + + Per default runs Flameshot in the background and adds a tray icon for configuration. + 預設情況下,Flameshot 在背景中執行並新增一個工具列圖示以進行設定。 + + + + Hello, I'm here! Click icon in the tray to take a screenshot or click with a right button to see more options. + 嗨,我在這裡!左鍵點選工具列的圖示來進行截圖,或者右鍵點選以檢視更多選項。 + + + Toggle side panel + 開關側邊欄 + + + Resize selection left 1px + Resize selection left 1px + + + Resize selection right 1px + Resize selection right 1px + + + Resize selection up 1px + Resize selection up 1px + + + Resize selection down 1px + Resize selection down 1px + + + Select entire screen + 選取整個畫面 + + + Move selection left 1px + Move selection left 1px + + + Move selection right 1px + Move selection right 1px + + + Move selection up 1px + Move selection up 1px + + + Move selection down 1px + Move selection down 1px + + + Commit text in text area + Commit text in text area + + + Delete current tool + 刪除目前工具 + + + + Quit capture + 結束擷取 + + + + Screenshot history + 截圖紀錄 + + + + Capture screen + 擷取螢幕 + + + + Show color picker + 顯示顏色選擇器 + + + + Change the tool's size + 變更工具的大小 + + + Change the tool's thickness + 改變工具的寬度 + + + + RectangleTool + + + Rectangle + 實心矩形 + + + + Set the Rectangle as the paint tool + 選擇實心矩形為繪圖工具 + + + + RedoTool + + + Redo + 重做 + + + + Redo the next modification + 重做下一個修改 + + + + SaveTool + + + Save + 儲存 + + + + Save screenshot to a file + 將截圖儲存到檔案 + + + Save the capture + 儲存擷取 + + + + ScreenGrabber + + Unable to detect desktop environment (GNOME? KDE? Sway? ...) + 無法偵測桌面環境 (GNOME? KDE? Sway? ...) + + + + The universal wayland screen capture adapter requires Grim as the screen capture component of wayland. If the screen capture component is missing, please install it! + + + + + If the useGrimAdapter setting is not enabled, the dbus protocol will be used. It should be noted that using the dbus protocol under wayland is not recommended. It is recommended to enable the useGrimAdapter setting in flameshot.ini to activate the grim-based general wayland screenshot adapter + + + + + grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments + + + + + Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...) + 無法偵測桌面環境(GNOME?KDE?Qile?Sway?……) + + + + Hint: try setting the XDG_CURRENT_DESKTOP environment variable. + 提示:嘗試設定 XDG_CURRENT_DESKTOP 環境變數。 + + + + Unable to capture screen + 無法擷取螢幕 + + + + SecondaryInstanceWidget + + + Secondary instance + + + + + <b>Secondary instance.</b> Send message to primary: + + + + + Type something here... + + + + + &Send + + + + + Error sending message + + + + + The message '%1' could not be sent to the primary. + + + + + SelectionTool + + + Rectangular Selection + 矩形選擇 + + + + Set Selection as the paint tool + 選擇選取為繪圖工具 + + + + SetShortcutDialog + + + Set Shortcut + 設定快捷鍵 + + + + Enter new shortcut to change + 輸入新的快捷鍵以進行變更 + + + + Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut. + 按下 Esc 以取消或按下 ⌘+Backspace 來停用鍵盤快捷鍵。 + + + + Press Esc to cancel or Backspace to disable the keyboard shortcut. + 按下 Esc 以取消或按下 Backspace 來停用鍵盤快捷鍵。 + + + + + Flameshot must be restarted for changes to take effect. + 必須重新啟動 Flameshot 以使變更生效。 + + + + ShortcutsWidget + + + Hot Keys + 熱鍵 + + + + Available shortcuts in the screen capture mode. + 螢幕擷取模式中的可用快捷鍵。 + + + + Description + 描述 + + + + Key + 鍵 + + + + Left Double-click + 左鍵點選兩下 + + + + Toggle side panel + 切換側邊欄 + + + + Grab a color from the screen + + + + + Resize selection left 1px + 將選擇區域向左調整 1px + + + + Resize selection right 1px + 將選擇區域向右調整 1px + + + + Resize selection up 1px + 將選擇區域向上調整 1px + + + + Resize selection down 1px + 將選擇區域向下調整 1px + + + + Symmetrically decrease width by 2px + + + + + Symmetrically increase width by 2px + + + + + Symmetrically increase height by 2px + + + + + Symmetrically decrease height by 2px + + + + + Select entire screen + 選取整個螢幕 + + + + Move selection left 1px + 將選擇區域向左移動 1px + + + + Move selection right 1px + 將選擇區域向右移動 1px + + + + Move selection up 1px + 將選擇區域向上移動 1px + + + + Move selection down 1px + 將選擇區域向下移動 1px + + + + Commit text in text area + 在文字區域提交文字 + + + + Delete selected drawn object + + + + + Cancel current selection + + + + Delete current tool + 刪除目前工具 + + + + Capture screen + 擷取畫面 + + + + Screenshot history + 截圖記錄 + + + + SidePanelWidget + + Active thickness: + Active thickness: + + + Active color: + Active color: + + + Press ESC to cancel + 按下 Esc 以取消 + + + + Active tool size: + 使用中的工具大小: + + + + Active Color: + 使用中的顏色: + + + + Grab Color + 取得顏色 + + + + Display grid + 顯示格線 + + + + SizeDecreaseTool + + + Decrease Tool Size + 縮小工具大小 + + + + Decrease the size of the other tools + 縮小其他工具的大小 + + + + SizeIncreaseTool + + + Increase Tool Size + 增加工具大小 + + + + Increase the size of the other tools + 增加其他工具的大小 + + + + SizeIndicatorTool + + Selection Size Indicator + 選擇尺寸指示器 + + + Show X and Y dimensions of the selection + 顯示選擇的 X 和 Y 尺寸 + + + Show the dimensions of the selection (X Y) + 顯示選擇的尺寸 (X Y) + + + + StrftimeChooserWidget + + + Century (00-99) + 世紀 (00-99) + + + + Year (00-99) + 年 (00-99) + + + + Year (2000) + 年 (2000) + + + + Month Name (jan) + 月 (一) + + + + Month Name (january) + 月 (一月) + + + + Month (01-12) + 月 (01-12) + + + + Week Day (1-7) + 星期 (1-7) + + + + Week (01-53) + 週 (01-53) + + + + Day Name (mon) + 星期 (一) + + + + Day Name (monday) + 星期 (星期一) + + + + Day (01-31) + 天 (01-31) + + + + Day of Month (1-31) + 一月中的某天 (1-31) + + + + Day (001-366) + 天 (001-366) + + + + Time (%H-%M-%S) + 時間 (%H-%M-%S) + + + + Time (%H-%M) + 時間 (%H-%M) + + + + Hour (00-23) + 小時 (00-23) + + + + Hour (01-12) + 小時 (01-12) + + + + Minute (00-59) + 分鐘 (00-59) + + + + Second (00-59) + 秒 (00-59) + + + + Full Date (%m/%d/%y) + 完整日期 (%m/%d/%y) + + + + Full Date (%Y-%m-%d) + 完整日期 (%Y-%m-%d) + + + + Full Date (%d-%m-%Y) + + + + + SystemNotification + + + Flameshot Info + Flameshot 資訊 + + + + TextConfig + + + StrikeOut + 刪除線 + + + + Underline + 底線 + + + + Bold + 粗體 + + + + Italic + 斜體 + + + + Left Align + 靠左對齊 + + + + Center Align + 置中對齊 + + + + Right Align + 靠右對齊 + + + + TextTool + + + Text + 文字 + + + + Add text to your capture + 在你的截圖中新增文字 + + + + TrayIcon + + + &Take Screenshot + &進行截圖 + + + + &Open Launcher + &開啟啟動器 + + + + &Configuration + &設定 + + + + &About + &關於 + + + + Check for updates + 檢查更新 + + + + New version %1 is available + 已有新版本 %1 可用 + + + + &Quit + &結束 + + + + &Latest Uploads + &最近上傳 + + + + &Open Save Path + + + + + UIcolorEditor + + UI Color Editor + UI 顏色編輯器 + + + + Change the color moving the selectors and see the changes in the preview buttons. + 移動選擇器來變更顏色,並在預覽按鈕中檢視變更。 + + + + Select a Button to modify it + 選擇一個按鈕來修改它 + + + + Main Color + 主色 + + + + Click on this button to set the edition mode of the main color. + 點選此按鈕以設定主色的編輯模式。 + + + + Contrast Color + 對比色 + + + + Click on this button to set the edition mode of the contrast color. + 點選此按鈕以設定對比色的編輯模式。 + + + + UndoTool + + + Undo + 復原 + + + + Undo the last modification + 復原上次的修改 + + + + UpdateNotificationWidget + + + New Flameshot version %1 is available + Flameshot 有新版本 %1 可供使用 + + + + Ignore + 忽略 + + + + Later + 之後再說 + + + + Update + 更新 + + + + UploadHistory + + + Upload History + 上傳歷史紀錄 + + + + Screenshots history is empty + 無螢幕截圖歷史紀錄 + + + + UploadLineItem + + + Form + 表單 + + + + TextLabel + 文字標籤 + + + + Copy URL + 複製網址 + + + + Open In Browser + 在瀏覽器中開啟 + + + + Confirm to delete + 確認刪除 + + + + Are you sure you want to delete a screenshot from the latest uploads and server? + 您確定要從最近的上傳和伺服器中刪除截圖嗎? + + + + UtilityPanel + + + Close + 關閉 + + + + <Empty> + <空> + + + + VisualsEditor + + + Opacity of area outside selection: + 選擇區域以外的不透明度: + + + + UI Color Editor + UI 顏色編輯器 + + + + Colorpicker Editor + 顏色挑選編輯器 + + + + Button Selection + 按鈕選擇 + + + + Select All + 全選 + + + + color_widgets::ColorDialog + + + Pick + 選擇 + + + + color_widgets::ColorPalette + + + Unnamed + 未命名 + + + + color_widgets::ColorPaletteModel + + + Unnamed + 未命名 + + + + %1 (%2 colors) + %1 (%2 顏色) + + + + color_widgets::ColorPaletteWidget + + + + Open a new palette from file + 從檔案開啟新的調色盤 + + + + + Create a new palette + 建立新的調色盤 + + + + + Duplicate the current palette + 複製目前的調色盤 + + + + + Delete the current palette + 刪除目前的調色盤 + + + + + Revert changes to the current palette + 還原目前調色盤的變更 + + + + + Save changes to the current palette + 儲存目前調色盤的變更 + + + + + Add a color to the palette + 新增顏色到調色盤 + + + + + Remove the selected color from the palette + 從調色盤移除選擇的顏色 + + + + + New Palette + 新調色盤 + + + + + Name + 名稱 + + + + GIMP Palettes (*.gpl) + GIMP 調色盤 (*.gpl) + + + + Palette Image (%1) + 調色盤圖片 (%1) + + + + All Files (*) + 所有檔案 (*) + + + + + Open Palette + 開啟調色盤 + + + + Failed to load the palette file +%1 + 無法載入調色盤檔案 +%1 + + + + color_widgets::GradientEditor + + + Add Color + 新增顏色 + + + + Remove Color + 移除顏色 + + + + Edit Color... + 編輯顏色... + + + + color_widgets::GradientListModel + + + %1 (%2 colors) + %1 (%2 顏色) + + + + color_widgets::Swatch + + + Clear Color + 清除顏色 + + + + %1 (%2) + %1 (%2) + + + diff --git a/docs/0000-template.md b/docs/0000-template.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md new file mode 100644 index 0000000..a586282 --- /dev/null +++ b/docs/CONTRIBUTING.md @@ -0,0 +1,47 @@ +# Contributing + +Contributions are welcome! Here's how you can help: + +- [Translating](#translations) +- [Contributing code](#code) +- [Reporting issues](#issues) +- [Donating](#donations) + +## Translations + +See [translation instructions](https://github.com/flameshot-org/translation-instruction). + +## Code + +For small fixes or incremental improvements simply fork the repo and follow the process below. For larger changes submit an [RFC:](RFC.md) +1. [Fork](https://help.github.com/articles/fork-a-repo/) the repository and [clone](https://help.github.com/articles/cloning-a-repository/) your fork. + +2. Start coding! + - Implement your feature. + - Check your code works as expected. + - Run the code formatter: `clang-format -i $(git ls-files "*.cpp" "*.h")` + +3. Commit your changes to a new branch (not `master`, one change per branch) and push it: + - Commit messages should: + - Header line: explain the commit in one line (use the imperative) + - Be descriptive. + - Have a first line with less than *80 characters* and have a second line that is *empty* if you want to add a description. + +4. Once you are happy with your changes, submit a pull request. + - Open the pull-request. + - Add a short description explaining briefly what you've done (or if it's a work-in-progress - what you need to do) + +## Issues + +1. Do a quick search on GitHub to check if the issue has already been reported. +2. [Open an issue](https://github.com/flameshot-org/flameshot/issues/new) and describe the issue you are having - you could include: + - Screenshots + - Ways to reproduce the issue. + - Your Flameshot version. + - Your platform (e.g. Windows 10 or Ubuntu 15.04 x64) + +After reporting you should aim to answer questions or clarifications as this helps pinpoint the cause of the issue. + +## Donations + +The best way to fund Flameshot is to create a bounty here: https://rysolv.com/issues diff --git a/docs/RFC.md b/docs/RFC.md new file mode 100644 index 0000000..4e022c4 --- /dev/null +++ b/docs/RFC.md @@ -0,0 +1,233 @@ +# Flameshot RFCs + +[Flameshot RFCs]: #flameshot-rfcs + +Many changes, including bug fixes and documentation improvements can be +implemented and reviewed via the normal GitHub pull request workflow. + +Some changes though are "substantial", and we ask that these be put through a +bit of a design process and produce a consensus among the Flameshot community and development team. + +The "RFC" (request for comments) process is intended to provide a consistent +and controlled path for new features to enter the language and standard +libraries, so that all stakeholders can be confident about the direction the +project is evolving in. + +## Table of Contents + +[Table of Contents]: #table-of-contents + + + [Opening](#flameshot-rfcs) + + [Table of Contents] + + [When you need to follow this process] + + [Before creating an RFC] + + [What the process is] + + [The RFC life-cycle] + + [Reviewing RFCs] + + [Implementing an RFC] + + [RFC Postponement] + + [Help this is all too informal!] + +## When you need to follow this process + +[When you need to follow this process]: #when-you-need-to-follow-this-process + +You need to follow this process if you intend to make "substantial" changes to +Flameshot or the RFC process itself. What constitutes a +"substantial" change is evolving based on community norms and varies depending +on what part of the ecosystem you are proposing to change, but may include the +following. + + + Any changes breaking compatibility to command line flags or config files. + + Any major changes to the UI + + Substantial new features like new tools. + +Some changes do not require an RFC: + + + Rephrasing, reorganizing, refactoring, or otherwise "changing shape does + + not change meaning". + + + Improving translations. + + Additions that strictly improve objective, numerical quality criteria + + (warning removal, speedup, better platform coverage, etc.) + + + Additions only likely to be _noticed by_ other developers-of-flameshot, + + invisible to users-of-flameshot. + +If you submit a pull request to implement a new feature without going through +the RFC process, it may be closed with a polite request to submit an RFC first. + +## Before creating an RFC + +[Before creating an RFC]: #before-creating-an-rfc + +A hastily-proposed RFC can hurt its chances of acceptance. Low quality +proposals, proposals for previously-rejected features, or those that don't fit +into the near-term roadmap, may be quickly rejected, which can be demotivating +for the unprepared contributor. Laying some groundwork ahead of the RFC can +make the process smoother. + +Although there is no single way to prepare for submitting an RFC, it is +generally a good idea to pursue feedback from other project developers +beforehand, to ascertain that the RFC may be desirable; having a consistent +impact on the project requires concerted effort toward consensus-building. + +The most common preparations for writing and submitting an RFC include talking +the idea over on our [official Matrix Space](https://matrix.to/#/#flameshot-org:matrix.org) in the [Developers](https://matrix.to/#/!AYbNXDGTDwApLwzkNg:feneas.org?via=kde.org&via=matrix.org&via=ryan77627.xyz), or opening an issue on [Github Discussions](https://github.com/flameshot-org/flameshot/discussions). + +## What the process is + +[What the process is]: #what-the-process-is + +In short, to get a major feature added to Flameshot, one must first get the RFC +merged into the RFC repository as a markdown file. At that point the RFC is +"active" and may be implemented with the goal of eventual inclusion into Flameshot. + + + Fork the Flameshot repo + + Copy `docs/0000-template.md` to `docs/RFC/0000-my-feature.md` (where "my-feature" is + + descriptive). Don't assign an RFC number yet; This is going to be the PR + number and we'll rename the file accordingly if the RFC is accepted. + + + Fill in the RFC. Put care into the details: RFCs that do not present + + convincing motivation, demonstrate lack of understanding of the design's + impact, or are disingenuous about the drawbacks or alternatives tend to + be poorly-received. + + + Submit a pull request. As a pull request the RFC will receive design + + feedback from the larger community, and the author should be prepared to + revise it in response. + + + Build consensus and integrate feedback. RFCs that have broad support are + + much more likely to make progress than those that don't receive any + comments. Feel free to reach out to the RFC assignee in particular to get + help identifying stakeholders and obstacles. + + + The team will discuss the RFC pull request, as much as possible in the + + comment thread of the pull request itself. Offline discussion will be + summarized on the pull request comment thread. + + + RFCs rarely go through this process unchanged, especially as alternatives + + and drawbacks are shown. You can make edits, big and small, to the RFC to + clarify or change the design, but make changes as new commits to the pull + request, and leave a comment on the pull request explaining your changes. + Specifically, do not squash or rebase commits after they are visible on the + pull request. + + + At some point, a member of the development team will propose a "motion for final + + comment period" (FCP), along with a *disposition* for the RFC (merge, close, + or postpone). + + - This step is taken when enough of the tradeoffs have been discussed that + + the development is in a position to make a decision. That does not require + consensus amongst all participants in the RFC thread (which is usually + impossible). However, the argument supporting the disposition on the RFC + needs to have already been clearly articulated, and there should not be a + strong consensus *against* that position outside of the development team. Team + members use their best judgment in taking this step, and the FCP itself + ensures there is ample time and notification for stakeholders to push back + if it is made prematurely. + + + In most cases, the FCP period is quiet, and the RFC is either merged or + + closed. However, sometimes substantial new arguments or ideas are raised, + the FCP is canceled, and the RFC goes back into development mode. + +## The RFC life-cycle + +[The RFC life-cycle]: #the-rfc-life-cycle + +Once an RFC becomes "active" then authors may implement it and submit the +feature as a pull request to the Flameshot repo. Being "active" is not a rubber +stamp, and in particular still does not mean the feature will ultimately be +merged; it does mean that in principle all the major stakeholders have agreed +to the feature and are amenable to merging it. + +Furthermore, the fact that a given RFC has been accepted and is "active" +implies nothing about what priority is assigned to its implementation, nor does +it imply anything about whether a developer has been assigned the task of +implementing the feature. While it is not *necessary* that the author of the +RFC also write the implementation, it is by far the most effective way to see +an RFC through to completion: authors should not expect that other project +developers will take on responsibility for implementing their accepted feature. + +Modifications to "active" RFCs can be done in follow-up pull requests. We +strive to write each RFC in a manner that it will reflect the final design of +the feature; but the nature of the process means that we cannot expect every +merged RFC to actually reflect what the end result will be at the time of the +next major release. + +In general, once accepted, RFCs should not be substantially changed. Only very +minor changes should be submitted as amendments. More substantial changes +should be new RFCs, with a note added to the original RFC. Exactly what counts +as a "very minor change" is up to the development team. + + + +## Reviewing RFCs + +[Reviewing RFCs]: #reviewing-rfcs + +The preferred method of discussing RFC's is the Github issue. However, the development team may schedule meetings with the +author and/or relevant stakeholders to discuss the issues in greater detail. In either +case a summary from the meeting will be posted back to the RFC pull request. + +The development team makes final decisions about RFCs after the benefits and drawbacks +are well understood. These decisions can be made at any time, but the sub-team +will regularly issue decisions. When a decision is made, the RFC pull request +will either be merged or closed. In either case, if the reasoning is not clear +from the discussion in thread, the sub-team will add a comment describing the +rationale for the decision. + +## Implementing an RFC + +[Implementing an RFC]: #implementing-an-rfc + +Some accepted RFCs represent vital features that need to be implemented right +away. Other accepted RFCs can represent features that can wait until some +arbitrary developer feels like doing the work. Every accepted RFC has an +associated issue tracking its implementation in the Flameshot repository; thus that +associated issue can be assigned a priority via the triage process that the +team uses for all issues in the Flameshot repository. + +The author of an RFC is not obligated to implement it. Of course, the RFC +author (like any other developer) is welcome to post an implementation for +review after the RFC has been accepted. + +If you are interested in working on the implementation for an "active" RFC, but +cannot determine if someone else is already working on it, feel free to ask +(e.g. by leaving a comment on the associated issue). + +## RFC Postponement + +[RFC Postponement]: #rfc-postponement + +Some RFC pull requests are tagged with the "postponed" label when they are +closed (as part of the rejection process). An RFC closed with "postponed" is +marked as such because we want neither to think about evaluating the proposal +nor about implementing the described feature until some time in the future, and +we believe that we can afford to wait until then to do so. + +Usually an RFC pull request marked as "postponed" has already passed an +informal first round of evaluation, namely the round of "do we think we would +ever possibly consider making this change, as outlined in the RFC pull request, +or some semi-obvious variation of it." (When the answer to the latter question +is "no", then the appropriate response is to close the RFC, not postpone it.) + +### Help this is all too informal! + +[Help this is all too informal!]: #help-this-is-all-too-informal + +The process is intended to be as lightweight as reasonable for the present +circumstances. As usual, we are trying to let the process be driven by +consensus and community norms, not impose more structure than necessary. diff --git a/docs/RFC/0000-Add-Opacity-slider.md b/docs/RFC/0000-Add-Opacity-slider.md new file mode 100644 index 0000000..d5a5998 --- /dev/null +++ b/docs/RFC/0000-Add-Opacity-slider.md @@ -0,0 +1,144 @@ +# Add an opacity slider to the Tool Settings + +### To be Reviewed By + +* borgmanJeremy +* mmahmoudian +* Flameshot developers + +
+ +### Authors + +* Pr. Sunflower + + +
+ +### Status: Draft ~~| Discussion | Active | Dropped | Superseded~~ + +[Pr. Sunflower] This is the first time the authors are redacting a document of this sort and they kindly request to double-check their writings and to assist them in missing parts. + + +
+ +### Superseded by + +N/A + +
+ +### Related + +* Issue #249 +* Issue #1085 + + + +
+ +## Problem + +Currently the drawing and marking tools in Flameshot only have one, non-customisable opacity setting. This current setting is bad for highlighting text because the Marker tool looks very pale. To compensate the user often has to highlight multiple times which is not convenient and time-consuming. + +Here is a comparison of Flameshot's Marker tool with Microsoft's **Snip & Sketch** Highlighter tool: + +### Black text on light background + +**Flameshot:** +![Flameshot_WHITE](https://user-images.githubusercontent.com/59576952/96623357-8c0a8600-130b-11eb-82e9-05ebbd95a7d9.png) + +**Snip & Sketch:** +![Snip_and_Sketch_WHITE](https://user-images.githubusercontent.com/59576952/96623397-9a58a200-130b-11eb-9d27-9a85f4fad504.png) + +
+ +### White text on dark background + +**Flameshot:** +![Flameshot_BLACK](https://user-images.githubusercontent.com/59576952/96623470-b8260700-130b-11eb-88ff-ff34ea69294c.png) + +**Snip & Sketch:** +![Snip_and_Sketch_BLACK](https://user-images.githubusercontent.com/59576952/96623478-bbb98e00-130b-11eb-9e26-59f72cc936a4.png) + + + + + +
+ +
+ +## Anti-Goals + +Flameshot's Marker tool does a very good job at keeping the text readable so this is not linked to this request. + +![image](https://user-images.githubusercontent.com/59576952/96624043-806b8f00-130c-11eb-9eb3-ce01d19234df.png) + +![image](https://user-images.githubusercontent.com/59576952/96624227-bf99e000-130c-11eb-92e7-d9c6087f110c.png) + + + + +
+ +
+ +## Solution + +**Add a way to control opacity, like an opacity slider in the Tool Settings.** + +Add an opacity slider under "Active thickness". + +![Screenshot from 2021-04-25 17-22-06](https://user-images.githubusercontent.com/59576952/115998533-ba3d8b00-a5f8-11eb-8464-da15b42ce9b1.png) + + + + + +
+ +
+ +## Performance Impact + +[Pr. Sunflower:] *I need help for this part.* + +Do you anticipate the proposed changes to impact performance in any way? Are there plans to measure and/or mitigate the impact? + + +
+ +## Backwards Compatibility and Upgrade Path + +[Pr. Sunflower:] *I need help for this part.* + +Will the regular rolling upgrade process work with these changes? + +How do the proposed changes impact backwards-compatibility? Are message or file formats changing? + +Is there a need for a deprecation process to provide an upgrade path to users who will need to adjust their applications? + +
+ +## Prior Art + +[Pr. Sunflower:] *I don't think this part is useful.* + +What would be the alternatives to the proposed solution? What would happen if we don’t solve the problem? Why should this proposal be preferred? + +
+ +## FAQ + +[Pr. Sunflower:] *I need help for this part.* + +Answers to questions you’ve commonly been asked after requesting comments for this proposal. + +
+ +## Errata + +[Pr. Sunflower:] *I need help for this part.* + +What are minor adjustments that had to be made to the proposal since it was approved? diff --git a/docs/ReleaseNote_12.1.md b/docs/ReleaseNote_12.1.md new file mode 100644 index 0000000..982638c --- /dev/null +++ b/docs/ReleaseNote_12.1.md @@ -0,0 +1,19 @@ +## V12.1.0 +This is a minor release that fixed some bugs introduced in the v12 release. + +## What's Changed +* Fix typos by @luzpaz in https://github.com/flameshot-org/flameshot/pull/2705 +* rename Imgur API Key to Imgur Application Client ID by @thehunmonkgroup in https://github.com/flameshot-org/flameshot/pull/2719 +* fix issue about externalWidget launchapp by @Alaskra in https://github.com/flameshot-org/flameshot/pull/2698 +* Fix size not appearing on size tool when started from launcher by @borgmanJeremy in https://github.com/flameshot-org/flameshot/pull/2734 +* Added option to pin menu to close pin by @borgmanJeremy in https://github.com/flameshot-org/flameshot/pull/2736 +* disable option to launch on start by default by @borgmanJeremy in https://github.com/flameshot-org/flameshot/pull/2735 +* Fix magnify windows by @borgmanJeremy in https://github.com/flameshot-org/flameshot/pull/2746 +* DesktopFileParser only reads .desktop files @wd5gnr https://github.com/flameshot-org/flameshot/pull/2742 + +## New Contributors +* @cliffcoffee made their first contribution in https://github.com/flameshot-org/flameshot/pull/2726 +* @thehunmonkgroup made their first contribution in https://github.com/flameshot-org/flameshot/pull/2719 +* @wd5gnr made their first contribution in https://github.com/flameshot-org/flameshot/pull/2742 + +**Full Changelog**: https://github.com/flameshot-org/flameshot/compare/v12.0.0...v12.1.0 \ No newline at end of file diff --git a/docs/ReleaseNotes_0.8.md b/docs/ReleaseNotes_0.8.md new file mode 100644 index 0000000..cfd3bc5 --- /dev/null +++ b/docs/ReleaseNotes_0.8.md @@ -0,0 +1,63 @@ +# 0.8 Release Notes +Thanks to all the testers and contributors that helped make version 0.8! We are very excited to have improved many bugs and added new features in version 0.8. + +## Known Issues +* Wayland support is experimental. In generic packages (Snap, Flatpak, AppImage) there may be extra issues with Wayland. +* In generic packages(Snap, Flatpak, AppImage) due to confinement "Open With External Application" does not work. +* If "close after capture" is enabled, and a user copies the image to clipboard, the image may not actually be in the clipboard. We recommend using the "Save" feature with close after capture. + + +## New Features +* Fix capture after pressing ctrl + S during textarea input (#311) +* Add translation: + - Japanese (#361) + - Brazilian Portuguese (#364) + - Serbian (#376) + - Dutch (#440) + - Ukrainian (#464) + - German (#467) + - Slovak (#525) + - Basque + - Czech + - Swedish + - Italian + - Korean + - Dutch +* Allow enter key to copy image to clipboard (#362) +* side panel: Add thickness slider (#374) +* Add support for saving as JPG and BMP files. (#436) +* Allow 45 degree adjustment for some tools (#439) +* Add option to close after capture (WARNING: this function is buggy! It may not work well if you are going to copy the image to clipboard! If you encounter problems related to clipboard, please disable this feature in the configuration and try again. This is a known bug, see #557 and #569 .) +* Add a basic launcher panel. +* Add option to auto copy URL after upload (#553) +* Add a circle counter tool. +* Replace the blur tool with pixelate tool. +* Convert buildsystem from QMake to CMake. +* Add launcher action into .desktop file. +* Added Generic Packages (Snap, Flatpak, AppImage) +* Improved Windows support + + +## Preview of New Features + +### Pixelate +The behavior of the blur tool has been modified so if the "thickness" is 0 or 1, the old blur behavior is preserved. If the thickness is increased past 1 the image will pixelate by the thickness: +![](images/pixelate.gif) + +### Countertool +A popular request has been to add a tool that counts upward. This can be helpful when creating directions. +![](images/counter.gif) + + +### Sidebar +A button has been added to open the sidebar. This tool was previously only accessible by hitting "Spacebar" which made usage on tablets difficult. This sidebar allows advanced modifications for many tools. + +![](images/sidebar.gif) + + +## Fixes +* Exit non-zero when aborting with --raw. (#424) +* Enable Pin and Text tool by default. (#443) +* Fix the problem that moving or resizing does not affect screenshot. (#459) +* Fix problem with re-enabling disabled tray icon (#495) +* Fix compilation problem against Qt 5.15. diff --git a/docs/ReleaseNotes_0.9.md b/docs/ReleaseNotes_0.9.md new file mode 100644 index 0000000..8073059 --- /dev/null +++ b/docs/ReleaseNotes_0.9.md @@ -0,0 +1,40 @@ +# 0.9 Release Notes +Thanks to all the testers and contributors that helped make version 0.9! We are very excited to have improved many +bugs and added new features in version 0.9. + + +## Known Issues +- Fractional scaling issues are not resolved. We are working with Qt upstream on this issue. + + +## New Features +- Improved MacOS support. MacOS is now officially supported and we will resolve any reported issues on this platform. + +- Thanks to SignPath we are able to offer digitally signed windows releases. +- Improved Wayland support + - Behind the scenes we configure flameshot to automatically run on xcb. This significantly improves the + wayland experience. This resolves issues with multimonitor setups and copying to the clipboard + +- New option to allow the clipboard image to be a jpeg instead of a png. This may reduce bandwidth when pasting the +image into chat or email clients + +- New global shortcut menu. All actions hotkeys are fully customizable. + +- Ability to take "symmetric" selections by holding down the Shift key while resizing the selection. + +- The rectangle tool will now round the corners of the rectangles based on the current thickness + +- All imgur uploads are now tracked in the "Upload History" menu. This makes it much easier to delete of images off imgur +or find the upload link later. + +- Added "check for new release" feature. This allows users on MacOS / Windows / and AppImages to easily check for updated versions. + +- New option for setting a "fixed save path". When this is enabled a user will no longer need to set the path for images +that are saved. + + +## Fixes +- Under certain circumstance the circle count could get set to the wrong number with large numbers of undo / redo. This +has been fixed. + +- Close after capture has been removed. This feature was not well implemented and lead to numerous bugs. diff --git a/docs/ReleaseNotes_11.0.md b/docs/ReleaseNotes_11.0.md new file mode 100644 index 0000000..802725e --- /dev/null +++ b/docs/ReleaseNotes_11.0.md @@ -0,0 +1,121 @@ +# V11.0 Beta + +This is the BETA release for version 11. As you will see below there were major refactorings to the internals of Flameshot. We did our best internal testing, but this particular beta is more likely to have issues than most. + +We will be in beta for 1-2 weeks depending on what kind of issues are found and then do the official release. + + +## New Features +- The on-screen help menu has been clarified and dynamically updates the hotkeys based on user defined hotkeys. + +

+ +- DBus is no longer required for CLI options. + +- Flameshot can now be run in "one off" mode which means the background systray component is now optional. See the CLI details below. + +- The CLI has been completely refactored. With the new architecture we added the following: + - The man page has been rewritten to reflect all the new options. The best place to learn about these new features is the man page or flameshot --help, but some notable new features will be outlined here. + - CLI is now callable from MacOS. + - CLI options are unified wherever possible. This means if an argument is added to "flameshot gui" it is also likely to be supported in "flameshot full". + - `--region` is a new flag that allows users to specify the exact region to screenshot. It uses the same syntax as xrandr: `WxH+x+y`. + - This is likely to be added to the launcher in the next release. + - `--accept-on-select` This flag will save the image as soon as the mouse is released when selecting a region. + - The CLI now supports pinning (`--pin`), uploading (`--upload`), and copying to clipboard (`--clipboard`). + Note that in case one of these options (or `--path`, `--raw` also) is used, an *Accept* button is shown and the *Save*, *Copy*, *Upload*, *Pin*, *Open With* buttons are hidden. + + +- MacOS now uses monochrome icon to match the system theme better. + +

+ +- The sidebar now shows the hexadecimal color value when the color picker is used: +

+ +- The about screen lists system information and allows you to copy this for easy access in bug submission forms. + +- Every file format supported by your underlying system is now an option for file format when saving. + +- New tool added to invert a region: + +

+ +- Thickness of tools can now be set with the keyboard. Simply type a numerical value like "15" and you will see the indicator in the upper left. + +- New zoom capability has been added to the color picker to more precisely select a color. +

+ +- Text alignment can now be set in the side bar. +

+ +- File names can now contain '.' + +- Even if a button is hidden from the toolbar, it can still be activated via hotkey. + +- The uploader now gives users a confirmation box before uploading. This can be disabled. **If you disable this and accidentally upload sensitive information, there is nothing we can do. It's recommended to leave the confirmation enabled.** Also, a keyboard shortcut for upload has been enabled (`Ctrl+U` by default) + +- MacOS users can now bind a custom hotkey for taking a screenshot. + +- The config file parser has been reworked. It will now alert users if there is an error in their config. If a repair is possible, Flameshot attempts to repair the file. + - We do our best not to break existing configs, but sometimes adding new features or removing old ones force this to change. + +- Double clicking can be used to copy the screenshot to the clipboard. + +- Added an option to enable anti-aliasing when zooming in on a pinned image. + +- Added completions for the fish shell + +## Bug Fixes +- The border that indicates an object is moveable is no longer saved or copied with the underlying image. + +- The edit buttons no longer fall in the editable region when there are strange multi monitor geometries. + +- Optimizations to reduce lag on 8k and 4k screens. + +- All Qt5 deprecations are fixed in preparation for Qt6. + +- Many small UI improvements (ie oversized scrollbars fixed, checkboxes occluded, etc). + +- Path handling has been improved. + +- Fixed an issue where running Flameshot for the first time on NixOS would fail to create the config file. + +- Fixed a problem with some window managers where Flameshot would lose focus and shortcuts would stop working. + +## Known Issues +- Fractional scaling on linux is still not resolved. (But we have identified a workaround finally. Hope to merge soon.) + +## Contributors +I want to give special shout outs to some team members that made this release possible. +- @veracioux for doing most of the refactoring that made this release possible +- @mmahmoudian for tirelessly doing triage and community management +- @Correct-Syntax for the [redesigned website](https://flameshot.org) + +We are very excited by the many first time contributors that helped with this release. We are always looking for more people to contribute to Flameshot and are happy to provide mentorship if needed: + +* @johnjago made their first contribution in https://github.com/flameshot-org/flameshot/pull/1779 +* @veracioux made their first contribution in https://github.com/flameshot-org/flameshot/pull/1782 +* @etircopyh made their first contribution in https://github.com/flameshot-org/flameshot/pull/1799 +* @uncomfyhalomacro made their first contribution in https://github.com/flameshot-org/flameshot/pull/1832 +* @karlhorky made their first contribution in https://github.com/flameshot-org/flameshot/pull/1845 +* @Cr4ckC4t made their first contribution in https://github.com/flameshot-org/flameshot/pull/1849 +* @j-tai made their first contribution in https://github.com/flameshot-org/flameshot/pull/1856 +* @CrystalSage made their first contribution in https://github.com/flameshot-org/flameshot/pull/1926 +* @a1346054 made their first contribution in https://github.com/flameshot-org/flameshot/pull/1918 +* @PrSunflower made their first contribution in https://github.com/flameshot-org/flameshot/pull/1582 +* @mgalgs made their first contribution in https://github.com/flameshot-org/flameshot/pull/1940 +* @GongHeng2017 made their first contribution in https://github.com/flameshot-org/flameshot/pull/1812 +* @gVirtu made their first contribution in https://github.com/flameshot-org/flameshot/pull/1981 +* @YizhePKU made their first contribution in https://github.com/flameshot-org/flameshot/pull/1979 +* @Lyqst made their first contribution in https://github.com/flameshot-org/flameshot/pull/1995 +* @AdavisSnakes made their first contribution in https://github.com/flameshot-org/flameshot/pull/1992 +* @deo002 made their first contribution in https://github.com/flameshot-org/flameshot/pull/2008 +* @Michael-F-Bryan made their first contribution in https://github.com/flameshot-org/flameshot/pull/2012 +* @sryze made their first contribution in https://github.com/flameshot-org/flameshot/pull/2026 +* @meesha7 made their first contribution in https://github.com/flameshot-org/flameshot/pull/2042 +* @majkinetor made their first contribution in https://github.com/flameshot-org/flameshot/pull/2056 +* @claytron5000 made their first contribution in https://github.com/flameshot-org/flameshot/pull/2068 +* @LHBosssss made their first contribution in https://github.com/flameshot-org/flameshot/pull/2098 +* @ffabss made their first contribution in https://github.com/flameshot-org/flameshot/pull/2140 +* @reggermont made their first contribution in https://github.com/flameshot-org/flameshot/pull/2150 +* @RiedleroD made their first contribution in https://github.com/flameshot-org/flameshot/pull/2130 diff --git a/docs/ReleaseNotes_12.0.md b/docs/ReleaseNotes_12.0.md new file mode 100644 index 0000000..88a83dd --- /dev/null +++ b/docs/ReleaseNotes_12.0.md @@ -0,0 +1,90 @@ +# Version 12.0.rc1 Beta +This is the beta for the version 12.0 release. We will be in beta for about a week unless major issues are discovered. + +## New Features +- Created basic layer movement functionality (up, down) by @affirVega in https://github.com/flameshot-org/flameshot/pull/2108 +

+ +- Added a new widget to allow the colorwheel to be more easily customized by https://github.com/flameshot-org/flameshot/pull/2202 +

+ + +- Added magnifier for more precise selections by @SilasDo in https://github.com/flameshot-org/flameshot/pull/2219 + - The new magnifier can be enabled in ```Configuration > General > Show Magnifier``` + - There is an option to make the magnifier a square or circle +

+ +- Incremental markers can now have a point if you drag when placing them. @vozdeckyl in https://github.com/flameshot-org/flameshot/pull/2638 +

+ +- Added the ability to cache the last region by @borgmanJeremy in https://github.com/flameshot-org/flameshot/pull/2615 + - The launcher tool will automatically populate the coordinates for the last selection region + - If ```Configuration > General > Use last region``` is selected, Flameshot will always initialize with the last successfully captured region +

+ +- Pinned screenshots can now be copied to the clipboard or saved to a file if a user right clicks on the pinned image by @zhangfuwen in https://github.com/flameshot-org/flameshot/pull/2519 + +- Users can now specify their own Imgur API Key from ```Configuration > General > Imgur API Key```. This is encouraged because as Flameshot has gotten more popular we have started exceeding the upload limit of the default API key by@borgmanJeremy in https://github.com/flameshot-org/flameshot/pull/2503 + +- Added 'Save to disk' button when uploading to imgur by @AndreaMarangoni in https://github.com/flameshot-org/flameshot/pull/2237 + +- Pinned screenshots can now be zoomed with a pinch gesture by @AndreaMarangoni in https://github.com/flameshot-org/flameshot/pull/2447 + +- The SVG's have been optimized by @RiedleroD in https://github.com/flameshot-org/flameshot/pull/2318 + +- Make KDE use Freedesktop portal by @greenfoo in https://github.com/flameshot-org/flameshot/pull/2495 + +- Allow final actions when printing geometry when invoke by CLI by @borgmanJeremy in https://github.com/flameshot-org/flameshot/pull/2444 + +- Many Flameshot widgets have been reworked to use .ui XML files and Qt Designer. This has been done to allow non C++ developers to more easily contribute to the graphical side of Flameshot. +

+ +- Updated Translations + +# Bug Fixes +- Pinned images can now be moved partially offscreen on linux by @zhangfuwen in https://github.com/flameshot-org/flameshot/pull/2520 +- Wayland builds now use KF Gui (KDE Framework tools) to fix some issues by @borgmanJeremy in https://github.com/flameshot-org/flameshot/pull/2305 +- Fix Flameshot crashes with GB locale by @AndreaMarangoni in https://github.com/flameshot-org/flameshot/pull/2304 +- Add alternative shortcuts file for KDE Flatpak installs by @Proton-459 in https://github.com/flameshot-org/flameshot/pull/2357 +- fixed freeze with copy URL to clipboard by @borgmanJeremy in https://github.com/flameshot-org/flameshot/pull/2348 +- Fixed crash selecting texttool by @AndreaMarangoni in https://github.com/flameshot-org/flameshot/pull/2369 +- Improve tooltips texts by @mmahmoudian in https://github.com/flameshot-org/flameshot/pull/2377 +- better zsh code completion by @mmahmoudian in https://github.com/flameshot-org/flameshot/pull/2382 +- Print info messages to stdout instead of stderr by @borgmanJeremy in https://github.com/flameshot-org/flameshot/pull/2639 +- Fix CloseOnLastWindow caused by tool change by @veracioux in https://github.com/flameshot-org/flameshot/pull/2645 +- fix unexpected close when launch external app by @Alaskra in https://github.com/flameshot-org/flameshot/pull/2617 +- Fix sidebar slider not resizing by @borgmanJeremy in https://github.com/flameshot-org/flameshot/pull/2530 +- fixed segfault when screen number exceeds screen count by @borgmanJeremy in https://github.com/flameshot-org/flameshot/pull/2534 +- Remove extra timer shots when moving selection with keyboard by @veracioux in https://github.com/flameshot-org/flameshot/pull/2545 +- Fix pinwidget save by @Alaskra in https://github.com/flameshot-org/flameshot/pull/2549 +- Config error fix by @vozdeckyl in https://github.com/flameshot-org/flameshot/pull/2552 +- Fix missing icon on snap by @vozdeckyl in https://github.com/flameshot-org/flameshot/pull/2616 +- Fix selection offset by @veracioux in https://github.com/flameshot-org/flameshot/pull/2630 +- Suggest setting XDG_CURRENT_DESKTOP if DE cannot be detected by @greenfoo in https://github.com/flameshot-org/flameshot/pull/2634 +- Fix saveAsFileExtension in example config by @veracioux in https://github.com/flameshot-org/flameshot/pull/2414 +- fixed high CPU usage on pin by @borgmanJeremy in https://github.com/flameshot-org/flameshot/pull/2502 +- Fix alignment bug and applied many clang format warnings by @borgmanJeremy in https://github.com/flameshot-org/flameshot/pull/2448 +- fix the --print-geometry for zsh by @mmahmoudian in https://github.com/flameshot-org/flameshot/pull/2437 +- fix bug on macos with save dialog by @borgmanJeremy in https://github.com/flameshot-org/flameshot/pull/2379 +- allow numpad numbers to resize and fix text artifacting on large resize by @borgmanJeremy in https://github.com/flameshot-org/flameshot/pull/2386 +- Zooming in/out happens at different speed by @AndreaMarangoni in https://github.com/flameshot-org/flameshot/pull/2378 +- fix: arrow tool glitches by @UnkwUsr in https://github.com/flameshot-org/flameshot/pull/2395 +- Fix double click by @borgmanJeremy in https://github.com/flameshot-org/flameshot/pull/2432 +- Improve Colorpicker by @deo002 in https://github.com/flameshot-org/flameshot/pull/2403 + +## New Contributors +* @AndreaMarangoni made their first contribution in https://github.com/flameshot-org/flameshot/pull/2304 +* @samrocketman made their first contribution in https://github.com/flameshot-org/flameshot/pull/2311 +* @affirVega made their first contribution in https://github.com/flameshot-org/flameshot/pull/2108 +* @Proton-459 made their first contribution in https://github.com/flameshot-org/flameshot/pull/2357 +* @SilasDo made their first contribution in https://github.com/flameshot-org/flameshot/pull/2219 +* @UnkwUsr made their first contribution in https://github.com/flameshot-org/flameshot/pull/2395 +* @ricardovsilva made their first contribution in https://github.com/flameshot-org/flameshot/pull/2518 +* @greenfoo made their first contribution in https://github.com/flameshot-org/flameshot/pull/2495 +* @zhangfuwen made their first contribution in https://github.com/flameshot-org/flameshot/pull/2520 +* @dzg made their first contribution in https://github.com/flameshot-org/flameshot/pull/2566 +* @Alaskra made their first contribution in https://github.com/flameshot-org/flameshot/pull/2549 +* @vozdeckyl made their first contribution in https://github.com/flameshot-org/flameshot/pull/2552 +* @henetiriki made their first contribution in https://github.com/flameshot-org/flameshot/pull/2609 + +**Full Changelog**: https://github.com/flameshot-org/flameshot/compare/v11.0.0...v12.0.rc1 diff --git a/docs/Releasing.md b/docs/Releasing.md new file mode 100644 index 0000000..130860d --- /dev/null +++ b/docs/Releasing.md @@ -0,0 +1,23 @@ +# Checklist for making a new release + +These are the code changes that need to take place: +- [ ] Update version in `CMakeLists.txt` +- [ ] Update version and changelog at `packaging/debian/changelog` +- [ ] Update version and changelog at `packaging/rpm/flameshot.spec` +- [ ] Update `data/appdata/flameshot.metainfo.xml` +- [ ] Update macOS version in `cmake/modules/MacOSXBundleInfo.plist.in` +- [ ] Commit and push to a PR +- [ ] Merge PR to main +- [ ] Create and push git tag on main +- [ ] Manually retrigger the Github actions so it uses the latest git tag + +These are the steps for actually making the release: +- [ ] Download all binaries from CI run started from PR related to code changes shown above +- [ ] Create sha256 for each binary and compare against sha256 shown in the CI to verify there was no corruption or inserted malware +- [ ] Create a new "New Release" in Github and explain changes in release notes +- [ ] Upload all binaries and sha's +- [ ] Update flatpak manifest for Flathub: https://github.com/flathub/org.flameshot.Flameshot +- [ ] Push snapcraft edge release to stable +- [ ] If this is a major release coordinate with sign path on signed windows binaries +- [ ] Update change log on [website](https://github.com/flameshot-org/flameshot-org.github.io/) `data/changelog.md` +- [ ] Update version on [website](https://github.com/flameshot-org/flameshot-org.github.io/blob/master/_coverpage.md) diff --git a/docs/Sway and wlroots support.md b/docs/Sway and wlroots support.md new file mode 100644 index 0000000..413287e --- /dev/null +++ b/docs/Sway and wlroots support.md @@ -0,0 +1,94 @@ +# Sway and wlroots support +Flameshot currently supports Sway and other wlroots based Wayland compositors through [xdg-desktop-portal-wlr](https://github.com/emersion/xdg-desktop-portal-wlr). However, due to the way dbus works, there may be some extra steps required for the integration to work properly. + +## Basic steps +The following packages need to be installed: `xdg-desktop-portal xdg-desktop-portal-wlr grim`. Please ensure your distro packages these, or install them manually. + +Ensure that environment variables are set properly. If your distro does not set them automatically, use a launch script to export `XDG_CURRENT_DESKTOP=sway` or `XDG_CURRENT_DESKTOP=river` **before** Sway or River is launched. +```sh +#!/bin/bash +export SDL_VIDEODRIVER=wayland +export _JAVA_AWT_WM_NONREPARENTING=1 +export QT_QPA_PLATFORM=wayland +export XDG_CURRENT_DESKTOP=sway +export XDG_SESSION_DESKTOP=sway +exec sway +``` + +or + + +```sh +#!/bin/bash +export SDL_VIDEODRIVER=wayland +export _JAVA_AWT_WM_NONREPARENTING=1 +export QT_QPA_PLATFORM=wayland +export XDG_CURRENT_DESKTOP=river +export XDG_SESSION_DESKTOP=river +exec river +``` + +You will also need to ensure that systemd/dbus is aware of these environment variables; this should be done **in your sway or river config** so that the DISPLAY and WAYLAND_DISPLAY variables are defined. + +(taken from [Sway wiki](https://github.com/swaywm/sway/wiki#gtk-applications-take-20-seconds-to-start)): +```sh +exec systemctl --user import-environment DISPLAY WAYLAND_DISPLAY SWAYSOCK +exec hash dbus-update-activation-environment 2>/dev/null && \ + dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY SWAYSOCK +``` + +To ensure that Flameshot is correctly positioned on multiple outputs (monitors) add this rule to your Sway config: +``` +for_window [app_id="flameshot"] border pixel 0, floating enable, fullscreen disable, move absolute position 0 0 +``` + +and add the following on your River config: + +``` +riverctl rule-add -app-id "flameshot" float +``` + +Otherwise, flameshot will not take all of the screen and tiles its window instead like a normal application. Note however, that some clipboard stuff is broken so it might be good to save your screenshot as a file while having it copied to a clipboard in case if clipboard does some weird stuff like not pasting the overall screenshot. + + +Starting from 0.17.0 xdg-desktop-portal requires a configuration file (e.g. in ~/.config/xdg-desktop-portal/sway-portals.conf): + +(take from [issues#3363](https://github.com/flameshot-org/flameshot/issues/3363)) +```sh +[preferred] +# use xdg-desktop-portal-gtk for every portal interface +default=gtk +# except for the xdg-desktop-portal-wlr supplied interfaces +org.freedesktop.impl.portal.Screencast=wlr +org.freedesktop.impl.portal.Screenshot=wlr +``` + +## Troubleshooting + +Q) Flameshot doesn't take a screenshot, it just hangs! + +A) Please ensure that the packages are installed, and that the variables are exported. +This is usually caused by Flameshot receiving no response from the desktop portal. This can be verified by running `dbus-monitor --session sender=org.freedesktop.portal.Desktop destination=org.freedesktop.portal.Desktop`. + +Q) Flameshot takes one screenshot, then won't take anymore! + +A) There is a bug in xdg-desktop-portal-wlr and Flameshot causing calls with the same token to fail. If you see a sdbus vtable error in the xdpw logs, either used the [patched version](https://github.com/nullobsi/xdg-desktop-portal-wlr/tree/improve-screenshot) or update Flameshot to the latest master. + +# River wlroots support + +Like mentioned above, Flameshot now works on wlroots based Wayland compositors, however, there is a weird problem with river and that is when setting `XDG_CURRENT_DESKTOP=river`, Flameshot won't work. The fix is you need to trick Flameshot that you are on `sway`. Hence, you need to run river like so: + +```sh +XDG_CURRENT_DESKTOP=sway dbus-run-session river +``` + +and add the following on your config such as in `$HOME/.config/river/init` + +``` +riverctl float-filter-add "flameshot" +``` + +Otherwise, Flameshot will not take all of the screen and tiles its window instead like a normal application. + +#### For more information, please refer to https://github.com/emersion/xdg-desktop-portal-wlr/wiki/%22It-doesn't-work%22-Troubleshooting-Checklist + diff --git a/docs/dev/.gitignore b/docs/dev/.gitignore new file mode 100644 index 0000000..90551e8 --- /dev/null +++ b/docs/dev/.gitignore @@ -0,0 +1,2 @@ +output +mkdoxy-generated diff --git a/docs/dev/Makefile b/docs/dev/Makefile new file mode 100644 index 0000000..f44e432 --- /dev/null +++ b/docs/dev/Makefile @@ -0,0 +1,9 @@ +serve: + mkdocs serve --dev-addr localhost:8080 --watch ../../src +build: + mkdocs build + @echo "Post-processing..." + @bash post-process.sh + @echo "DONE." +clean: + rm -rf mkdoxy-generated output diff --git a/docs/dev/mkdocs.yml b/docs/dev/mkdocs.yml new file mode 100644 index 0000000..ad98154 --- /dev/null +++ b/docs/dev/mkdocs.yml @@ -0,0 +1,47 @@ +site_name: Flameshot Developer Docs +site_url: https://flameshot.org/docs/dev/ +repo_url: https://github.com/flameshot-org/flameshot/ +edit_uri: tree/master/docs/dev/src +docs_dir: src +site_dir: output +markdown_extensions: + - admonition + - attr_list + - toc: + permalink: "#" + - pymdownx.emoji: + emoji_index: !!python/name:materialx.emoji.twemoji + emoji_generator: !!python/name:materialx.emoji.to_svg + +plugins: + - search + - mkdoxy: + projects: + flameshot: + src-dirs: ../../src/ + full-doc: True + doxy-cfg: + FILE_PATTERNS: "*.cpp *.h" + # #TODO for some reason this causes an exception + EXCLUDE_PATTERNS: "*/capturetool.h" + FULL_PATH_NAMES: "NO" + SHOW_USED_FILES: "NO" + RECURSIVE: True + + save-api: mkdoxy-generated + debug: True + ignore-errors: False + +theme: + name: material + logo: https://flameshot.org/flameshot-icon.svg + +nav: + - Overview: index.md + - Debugging: debugging.md + - FAQ: faq.md + - 'Maintaining the documentation': docs.md + - API: + - Classes: flameshot/classes.md + - 'Class Hierarchy': flameshot/hierarchy.md + - Files: flameshot/files.md diff --git a/docs/dev/post-process.sh b/docs/dev/post-process.sh new file mode 100644 index 0000000..b9c5edb --- /dev/null +++ b/docs/dev/post-process.sh @@ -0,0 +1,19 @@ +# Only run this script from the Makefile + +shopt -s globstar +cd output + +# Classes backlink to the ClassList in their breadcrumbs. We use the ClassIndex +# instead. +rm -rf flameshot/annotated +ln -sf classes flameshot/annotated + +# Hide 'Edit this page button' from the auto-generated docs pages +# It would be better to change the button to link to the file on github, but +# it seems like too much work right now. +sed -i 's|title="Edit this page"|& style="display: none !important"|' flameshot/*/*.html + +# MkDoxy adds Qt classes into the class hierarchy. We don't want that. +sed -i 's|
  • class Q[^<]*
  • ||' flameshot/*/*.html + +# vim: filetype=bash diff --git a/docs/dev/src/debugging.md b/docs/dev/src/debugging.md new file mode 100644 index 0000000..2556697 --- /dev/null +++ b/docs/dev/src/debugging.md @@ -0,0 +1,16 @@ +# Debugging + +## `FLAMESHOT_DEBUG_CAPTURE` + +With this cmake variable set to `ON`, the flameshot capture GUI window won't bypass the +window manager. This allows you to manipulate the capture GUI window like any +other window while debugging. + +This can be useful if a debugging breakpoint is triggered while flameshot is in +full screen mode. Without this variable, you might have trouble inspecting the +code due to a frozen full-screen window. + +Usage: +```shell +cmake -DFLAMESHOT_DEBUG_CAPTURE=ON ... +``` diff --git a/docs/dev/src/docs.md b/docs/dev/src/docs.md new file mode 100644 index 0000000..c8d4c41 --- /dev/null +++ b/docs/dev/src/docs.md @@ -0,0 +1,141 @@ +# Maintaining the documentation + +The narrative documentation is written in markdown and built into HTML using +[MkDocs][mkdocs], particularly the [MkDocs material theme][mkdocs-material]. The +source code documentation is generated using Doxygen and adapted for MkDocs +using [MkDoxy][mkdoxy] (a tweaked custom fork of the original). The source code +of this documentation can be found [here][doc-source]. + +!!! tip + + In order to edit a page from the documentation, click the :material-pencil: + button in the top right corner of the page. Please note that this button + won't work within the API section of the documentation - the button is + removed from there during [post-processing][], but it will still be visible + when [serving the website locally][serving-locally]. + +## Serving locally +To serve the documentation locally, run the `make serve` target in the +`docs/dev` directory. The server is available at the port designated in the +output of the command. + +## Notes and conventions +- When you add new files or rename existing files or section names, be sure to + edit the `nav` property of [mkdocs.yml][mkdocs.yml]. +- Always insert links as [reference style + links][markdown:reference-style-links]. This will make the docs source code + more readable and make broken links more easily detectable and replaceable. + +### Post-processing +There are some tweaks we make to the generated HTML documentation. We do that in +the `make build` target, by running the [post-process.sh][post-process.sh] +script. To see what post-processing we do, see that file. + +For this reason, the version of the documentation served locally using `make +serve` will not match the generated HTML documentation 100%. But those +inconsistencies are few and minor. + +## Dependencies +```shell +pip install \ + mkdocs \ + mkdocs-material \ + git+https://github.com/veracioux/mkdoxy@v1.0.0 +``` + +!!! note + + We use a forked version of [mkdoxy][mkdoxy-original] that can be found + [here][mkdoxy], that fixes some annoying things from the original. + +## Deployment + +The developer documentation is served from the official Flameshot website +[flameshot.org][website]. Here's how. + +The official website itself is served from this [repo][website-repo]. That repo +contains the user documentation. It's deployed using GitHub pages -- the served +files can be found on the [gh-pages][] branch of that repo. This branch is +automatically created by the [build][website-build] workflow on master. + +To make the developer docs available on the official site, we use a custom +GitHub action called [deploy-dev-docs][] in the [flameshot][] repo. This action +will build and deploy this documentation into the `docs/dev` subdirectory of the +[gh-pages][] branch. + +### The deploy-dev-docs GitHub workflow + +This workflow checks out the flameshot website [repo][website-repo] and does the following: + +- Creates a clean [dev-docs-staging][] branch (we'll explain why, below). +- Generates the developer docs under `docs/dev` there and makes a commit +- Checks out the [gh-pages][] branch and makes the same commit there +- Force-pushes the dev-docs-staging branch to the website repo +- Pushes the gh-pages branch to the website repo + +Since the [gh-pages][] branch is re-created from scratch by the [website +deployment workflow][website-build], the commit that added the developer +documentation will be lost. That's why we have to re-apply the commit during the +[website deployment workflow][website-build] as well. **That is the reason why +we created the** [**dev-docs-staging**][dev-docs-staging] **branch in the first +place.** + +!!! note + + The deploy-dev-docs workflow is set to run on the `docs` branch as well as `master`. + This branch is used for debugging the developer docs and its associated + workflows, without polluting the `master` branch with unnecessary commits. + +#### Access tokens +In order to make changes to the [website repo][website-repo] from within a +workflow in the [flameshot repo][flameshot], the workflow needs to use an access +token, which it obtains from the `TOKEN_PUSH_TO_WEBSITE_REPO` secret. + +The following process was used to set it up: + +1. A flameshot organization member with write access must create a personal + access token (PAT) [here][PAT] with write access to the [website repo][website-repo]. +2. A secret named `TOKEN_PUSH_TO_WEBSITE_REPO` must be added to the + [flameshot][] repo and its value must be set to the PAT. This can be done + [here][action-secrets]. + +For best security practice, the token should be set to expire after some time +(currently ~6 months). The token can be regenerated without the need to recreate +it. After regeneration you will need to update the `TOKEN_PUSH_TO_WEBSITE_REPO` +secret, which can be done [here][edit-secret]. + +!!! tip + + The currently active PAT is owned by [veracioux][] and is set to expire on July + 31 2024. If you notice the token has expired, ask him to re-generate it. + + +[post-processing]: #post-processing +[serving-locally]: #serving-locally + + +[flameshot]: https://github.com/flameshot-org/flameshot +[website]: https://flameshot.org +[doc-source]: https://github.com/flameshot-org/flameshot/tree/master/docs/dev +[website-repo]: https://github.com/flameshot-org/flameshot-org.github.io +[gh-pages]: https://github.com/flameshot-org/flameshot-org.github.io/tree/gh-pages +[dev-docs-staging]: https://github.com/flameshot-org/flameshot-org.github.io/tree/dev-docs-staging +[action-secrets]: https://github.com/flameshot-org/flameshot/settings/secrets/actions +[edit-secret]: https://github.com/flameshot-org/flameshot/settings/secrets/actions/TOKEN_PUSH_TO_WEBSITE_REPO + + +[mkdocs.yml]: https://github.com/flameshot-org/flameshot/blob/master/docs/dev/mkdocs.yml +[post-process.sh]: https://github.com/flameshot-org/flameshot/blob/master/docs/dev/post-process.sh +[deploy-dev-docs]: https://github.com/flameshot-org/flameshot/blob/master/.github/workflows/deploy-dev-docs.yml + + +[website-build]: https://github.com/flameshot-org/flameshot-org.github.io/blob/master/.github/workflows/build.yml + + +[markdown:reference-style-links]: https://www.markdownguide.org/basic-syntax/#reference-style-links +[mkdocs]: https://www.mkdocs.org/ +[mkdocs-material]: https://squidfunk.github.io/mkdocs-material +[mkdoxy-original]: https://github.com/JakubAndrysek/mkdoxy +[mkdoxy]: https://github.com/veracioux/mkdoxy +[PAT]: https://github.com/settings/tokens?type=beta +[veracioux]: https://github.com/veracioux diff --git a/docs/dev/src/faq.md b/docs/dev/src/faq.md new file mode 100644 index 0000000..07f4c59 --- /dev/null +++ b/docs/dev/src/faq.md @@ -0,0 +1,47 @@ + +# FAQ + +!!! todo + + Incomplete page. + +### How do I create a new subcommand? + +### How do I add a new tool? + +### How do I add a new config setting? + +There are currently two groups of settings: `General` and `Shortcuts`. +The necessary steps are usually the following: + +- Determine a name for the setting - for a general setting, it must be a valid + C++ identifier, for a shortcut it must be the name of a tool type from TODO. +- Add a getter and a setter for the setting in [`ConfigHandler`][ConfigHandler]. + For most settings you should use the + [`CONFIG_GETTER_SETTER`][CONFIG_GETTER_SETTER] macro. If your setting is + unusual enough you may need to use [`CONFIG_GETTER`][CONFIG_GETTER] or + [`CONFIG_SETTER`][CONFIG_SETTER] individually, or even need to create the + methods manually. +- If you need custom validation or conversion for the value, you must create a + subclass of [`ValueHandler`][ValueHandler]. Otherwise you can use one of the + existing ones in [valuehandler.h][]. +- If you want to make your setting available in the configuration GUI (usually + you do), you should add the appropriate widgets into one of the tabs of + [`ConfigWindow`][ConfigWindow]. If your setting doesn't fit into any of the + existing tabs, you can add a new one, but please discuss it with us first. + +To get a deeper understanding of how the configuration works, please see +[Configuration][config]. + +### How do I add a new export action? (@borgmanJeremy @mehrad This is my preferred terminology over final action, need consensus) + +[config]: index.md#configuration +[confighandler.h]: flameshot/confighandler_8h +[confighandler.cpp]: flameshot/confighandler_8cpp +[valuehandler.h]: flameshot/valuehandler_8h +[ValueHandler]: flameshot/classValueHandler +[ConfigHandler]: flameshot/classConfigHandler +[ConfigWindow]: flameshot/classConfigWindow +[CONFIG_GETTER_SETTER]: flameshot/confighandler_8h/#define-config_getter_setter +[CONFIG_GETTER]: flameshot/confighandler_8h/#define-config_getter +[CONFIG_SETTER]: flameshot/confighandler_8h/#define-config_setter diff --git a/docs/dev/src/index.md b/docs/dev/src/index.md new file mode 100644 index 0000000..0a3aa03 --- /dev/null +++ b/docs/dev/src/index.md @@ -0,0 +1,127 @@ +# Flameshot developer docs + +Thank you for your interest in developing flameshot. This developer +documentation (hopefully) has an intuitive structure. It tries to describe what +code is run when a user performs an action in Flameshot. + +!!! important + + **Please read this entire page. It will make your life a whole lot easier when + contributing to Flameshot. If you know exactly what you want to work on, you + should look at [FAQ](./faq) ** + +## Project structure + +Flameshot is built on C++/Qt5 with CMake as its build system. The source code is +located under `src/`. The entrypoint is `src/main.cpp`. + +### `main.cpp` + +Flameshot provides both a GUI and a CLI (the latter currently works only on +Linux and macOS). + +### Build system + +The main cmake file is `CMakeLists.txt` in the project root. It `include`s some +files from the `cmake/` directory as well. These files together control some +more general aspects of the build process, like project information, packaging, +caching etc. + +There is also the file `src/CMakeLists.txt`. It mostly defines how the source +files are compiled into targets and how the external libraries are linked. It +does some other stuff too. Currently, there isn't a clear separation of concerns +between `CMakeLists.txt` and `src/CMakeLists.txt`. In the future we should +refactor these files to make it more clear why each of them exists. + +## What happens when I launch flameshot? +There are two ways to launch flameshot: daemon mode and single-action mode. In +both modes, an instance of [`Flameshot`][Flameshot] is created via +[`Flameshot::start()`][Flameshot::start]. [`Flameshot`][Flameshot] provides the +high level API for interacting with flameshot; and its methods mimic the CLI +subcommands a great deal. This object is a singleton, so it can only be created +once. It is accessed as [`Flameshot::instance()`][Flameshot::instance]. + +!!! note + + On Windows, only daemon mode is currently supported. + +### Single-action mode (via command line interface) +Single-action mode (also called one-off mode) is triggered when flameshot is +launched with a command line argument - for example as `flameshot gui`. As its +name implies, it performs a single action, such as "take a screenshot +interactively by opening a GUI" or "take a screenshot of the entire screen", +etc. Afterwards, Flameshot quits. + +### Daemon mode +This mode is triggered when the `flameshot` command is launched. In this mode, a +flameshot process is started in the background. A system tray is displayed if +the user hasn't disabled it in the config. In addition to [`Flameshot::start()`][Flameshot::start], +if the current process is the daemon, it also calls [`FlameshotDaemon::start()`][FlameshotDaemon::start] +during initialization. + +The daemon has the following purposes: + +- Run in the background, wait for the user to press a hotkey, and perform + corresponding action. + + This is true for **Windows** and **macOS**, but not for **Linux**. On Linux, hotkeys + are meant to be handled by the desktop environment or equivalent. + +- Provide a system tray that the user can click to initiate actions via context + menu + +- Periodically check for updates and notify the user + +- Act as a host for persistent phenomena. Example: On X11 (linux), when a program + inserts content into the clipboard, it must keep running so the content + persists in the clipboard. + +!!! note + + All of the above are user-configurable. + +#### `FlameshotDaemon` +The class [`FlameshotDaemon`][FlameshotDaemon] handles all communication with +the daemon. The class provides public static methods that are designed so that +the caller does not need to know if the current process is a flameshot daemon or +a single-action invocation of Flameshot. If the current process is the daemon, +then the static methods of [`FlameshotDaemon`][FlameshotDaemon] will call the +corresponding instance methods of the singleton. If not, the current process +will communicate with the daemon process via D-Bus. Then, within the daemon +process, those D-Bus calls will be translated into +[`FlameshotDaemon`][FlameshotDaemon] instance method calls. + +## Configuration +The configuration is handled by [`ConfigHandler`][ConfigHandler]. It is +decoupled from any user interface, so it serves the configuration for both the +GUI and CLI. All configuration settings recognized by the config files are +defined as getters in this class. There are also setters for each setting, named +as per the usual convention. For example, the setting `savePath` has a getter +named `savePath` and a setter named `setSavePath`. Before working on a new +config setting for flameshot, please read [this FAQ +entry][faq:add-config-setting]. + +### Interesting notes + +- [`ConfigHandler`][ConfigHandler] is based on `QSettings` +- The configuration uses the `ini` format +- The configuration is automatically reloaded when the config file changes + +## Conventions + +- Always use `&Class::signal` and `&Class::slot` instead of `SIGNAL(signal())` + and `SLOT(slot())`. This usually provides better code introspection and makes + refactoring easier and less error-prone. + +[Flameshot]: flameshot/classFlameshot +[Flameshot::instance]: flameshot/classFlameshot#function-instance +[Flameshot::start]: flameshot/classFlameshot#function-start +[ConfigHandler]: flameshot/classConfigHandler +[FlameshotDaemon]: flameshot/classFlameshotDaemon +[FlameshotDaemon::start]: flameshot/classFlameshotDaemon#function-start +[confighandler.h]: flameshot/confighandler_8h +[confighandler.cpp]: flameshot/confighandler_8cpp + +[faq:add-config-setting]: faq/#how-do-i-add-a-new-config-setting + +[matrix-room]: https://matrix.to/#/#flameshot-org:matrix.org diff --git a/docs/flameshot-documentation.pdf b/docs/flameshot-documentation.pdf new file mode 100644 index 0000000..2a1ea68 Binary files /dev/null and b/docs/flameshot-documentation.pdf differ diff --git a/docs/images/alignment.png b/docs/images/alignment.png new file mode 100644 index 0000000..112cbed Binary files /dev/null and b/docs/images/alignment.png differ diff --git a/docs/images/colorwheel.png b/docs/images/colorwheel.png new file mode 100644 index 0000000..a9adb9b Binary files /dev/null and b/docs/images/colorwheel.png differ diff --git a/docs/images/config_interface.png b/docs/images/config_interface.png new file mode 100644 index 0000000..bfa0b95 Binary files /dev/null and b/docs/images/config_interface.png differ diff --git a/docs/images/config_shortcuts.png b/docs/images/config_shortcuts.png new file mode 100644 index 0000000..04435cc Binary files /dev/null and b/docs/images/config_shortcuts.png differ diff --git a/docs/images/counter.gif b/docs/images/counter.gif new file mode 100644 index 0000000..01b5264 Binary files /dev/null and b/docs/images/counter.gif differ diff --git a/docs/images/help_screen.png b/docs/images/help_screen.png new file mode 100644 index 0000000..18b752e Binary files /dev/null and b/docs/images/help_screen.png differ diff --git a/docs/images/hex.png b/docs/images/hex.png new file mode 100644 index 0000000..6e7cdf1 Binary files /dev/null and b/docs/images/hex.png differ diff --git a/docs/images/invert.gif b/docs/images/invert.gif new file mode 100644 index 0000000..56aea5f Binary files /dev/null and b/docs/images/invert.gif differ diff --git a/docs/images/large_demo.png b/docs/images/large_demo.png new file mode 100644 index 0000000..1b8f99d Binary files /dev/null and b/docs/images/large_demo.png differ diff --git a/docs/images/launcher.png b/docs/images/launcher.png new file mode 100644 index 0000000..2cc1dd9 Binary files /dev/null and b/docs/images/launcher.png differ diff --git a/docs/images/layer.gif b/docs/images/layer.gif new file mode 100644 index 0000000..f3268c8 Binary files /dev/null and b/docs/images/layer.gif differ diff --git a/docs/images/magnifer.gif b/docs/images/magnifer.gif new file mode 100644 index 0000000..aca69e7 Binary files /dev/null and b/docs/images/magnifer.gif differ diff --git a/docs/images/magnify.gif b/docs/images/magnify.gif new file mode 100644 index 0000000..b1930a0 Binary files /dev/null and b/docs/images/magnify.gif differ diff --git a/docs/images/monochrome.png b/docs/images/monochrome.png new file mode 100644 index 0000000..0e96dd5 Binary files /dev/null and b/docs/images/monochrome.png differ diff --git a/docs/images/number_pointer.png b/docs/images/number_pointer.png new file mode 100644 index 0000000..4b2e95a Binary files /dev/null and b/docs/images/number_pointer.png differ diff --git a/docs/images/pixelate.gif b/docs/images/pixelate.gif new file mode 100644 index 0000000..4b880bd Binary files /dev/null and b/docs/images/pixelate.gif differ diff --git a/docs/images/region_launcher.png b/docs/images/region_launcher.png new file mode 100644 index 0000000..7945fdd Binary files /dev/null and b/docs/images/region_launcher.png differ diff --git a/docs/images/sidebar.gif b/docs/images/sidebar.gif new file mode 100644 index 0000000..03bda70 Binary files /dev/null and b/docs/images/sidebar.gif differ diff --git a/docs/images/small_demo.png b/docs/images/small_demo.png new file mode 100644 index 0000000..64338d8 Binary files /dev/null and b/docs/images/small_demo.png differ diff --git a/docs/images/ui_file.png b/docs/images/ui_file.png new file mode 100644 index 0000000..8e28024 Binary files /dev/null and b/docs/images/ui_file.png differ diff --git a/docs/shortcuts-config/flameshot-shortcuts-kde.khotkeys b/docs/shortcuts-config/flameshot-shortcuts-kde.khotkeys new file mode 100644 index 0000000..5f4b2b5 --- /dev/null +++ b/docs/shortcuts-config/flameshot-shortcuts-kde.khotkeys @@ -0,0 +1,149 @@ +[Data] +DataCount=1 + +[Data_1] +Comment=Shortcuts for taking screenshots with Flameshot +DataCount=5 +Enabled=true +Name=Flameshot +SystemGroup=0 +Type=ACTION_DATA_GROUP + +[Data_1Conditions] +Comment= +ConditionsCount=0 + +[Data_1_1] +Comment=Start the Flameshot screenshot tool and take a screenshot +Enabled=true +Name=Take screenshot +Type=SIMPLE_ACTION_DATA + +[Data_1_1Actions] +ActionsCount=1 + +[Data_1_1Actions0] +CommandURL=flameshot gui +Type=COMMAND_URL + +[Data_1_1Conditions] +Comment= +ConditionsCount=0 + +[Data_1_1Triggers] +Comment=Simple_action +TriggersCount=1 + +[Data_1_1Triggers0] +Key=Print +Type=SHORTCUT +Uuid={550679a7-6038-4d71-9d70-045dee9e7ad0} + +[Data_1_2] +Comment=Wait for 3 seconds, then start the Flameshot screenshot tool and take a screenshot +Enabled=true +Name=Take screenshot with delay +Type=SIMPLE_ACTION_DATA + +[Data_1_2Actions] +ActionsCount=1 + +[Data_1_2Actions0] +CommandURL=flameshot gui --delay 3000 +Type=COMMAND_URL + +[Data_1_2Conditions] +Comment= +ConditionsCount=0 + +[Data_1_2Triggers] +Comment=Simple_action +TriggersCount=1 + +[Data_1_2Triggers0] +Key=Ctrl+Print +Type=SHORTCUT +Uuid={13cf7a93-9bae-4864-b6f6-dbe09e1b548a} + +[Data_1_3] +Comment=Take a full-screen (all monitors) screenshot and save it +Enabled=true +Name=Take full-screen screenshot and save +Type=SIMPLE_ACTION_DATA + +[Data_1_3Actions] +ActionsCount=1 + +[Data_1_3Actions0] +CommandURL=flameshot full +Type=COMMAND_URL + +[Data_1_3Conditions] +Comment= +ConditionsCount=0 + +[Data_1_3Triggers] +Comment=Simple_action +TriggersCount=1 + +[Data_1_3Triggers0] +Key=Shift+Print +Type=SHORTCUT +Uuid={32eeef66-9df9-4ff0-8bca-9c80941d74b2} + +[Data_1_4] +Comment=Take a full-screen (all monitors) screenshot and copy it to the clipboard and ask where to save +Enabled=true +Name=Take full-screen screenshot and copy it to clipboard +Type=SIMPLE_ACTION_DATA + +[Data_1_4Actions] +ActionsCount=1 + +[Data_1_4Actions0] +CommandURL=flameshot full --clipboard +Type=COMMAND_URL + +[Data_1_4Conditions] +Comment= +ConditionsCount=0 + +[Data_1_4Triggers] +Comment=Simple_action +TriggersCount=1 + +[Data_1_4Triggers0] +Key=Ctrl+Shift+Print +Type=SHORTCUT +Uuid={7a4033b1-f641-4dab-9c4e-78bf3fa0ea8c} + +[Data_1_5] +Comment=Open the Flameshot Launcher +Enabled=false +Name=Open Flameshot Launcher +Type=SIMPLE_ACTION_DATA + +[Data_1_5Actions] +ActionsCount=1 + +[Data_1_5Actions0] +CommandURL=flameshot launcher +Type=COMMAND_URL + +[Data_1_5Conditions] +Comment= +ConditionsCount=0 + +[Data_1_5Triggers] +Comment=Simple_action +TriggersCount=1 + +[Data_1_5Triggers0] +Key= +Type=SHORTCUT +Uuid={b0f9c859-bf84-42c6-8ae0-94da1a616cf1} + +[Main] +AllowMerge=false +ImportId=Flameshot +Version=2 diff --git a/flameshot.example.ini b/flameshot.example.ini new file mode 100644 index 0000000..8430bcd --- /dev/null +++ b/flameshot.example.ini @@ -0,0 +1,160 @@ +;[General] +;; Configure which buttons to show after drawing a selection +;; Not easy to set by hand +;buttons=@Variant(\0\0\0\x7f\0\0\0\vQList\0\0\0\0\x14\0\0\0\0\0\0\0\x1\0\0\0\x2\0\0\0\x3\0\0\0\x4\0\0\0\x5\0\0\0\x6\0\0\0\x12\0\0\0\xf\0\0\0\x13\0\0\0\a\0\0\0\b\0\0\0\t\0\0\0\x10\0\0\0\n\0\0\0\v\0\0\0\f\0\0\0\r\0\0\0\xe\0\0\0\x11) +; +;; List of colors for color picker +;; The colors are arranged counter-clockwise with the first being set to the right of the cursor +;; Colors are any valid hex code or W3C color name +;; "picker" adds a custom color picker +;userColors=picker, #800000, #ff0000, #ffff00, #00ff00, #008000, #00ffff, #0000ff, #ff00ff, #800080 +; +;; Image Save Path +;savePath=/tmp +; +;; Whether the savePath is a fixed path (bool) +;savePathFixed=false +; +;; Default file extension for screenshots +;saveAsFileExtension=.png +; +;; UI language (auto = detected system language) +; uiLanguage=auto +; +;; Main UI color +;; Color is any valid hex code or W3C color name +;uiColor=#740096 +; +;; Contrast UI color +;; Color is any valid hex code or W3C color name +;contrastUiColor=#270032 +; +;; Last used color +;; Color is any valid hex code or W3C color name +;drawColor=#ff0000 +; +;; Show the help screen on startup (bool) +;showHelp=true +; +;; Show the side panel button (bool) +;showSidePanelButton=true +; +;; Ignore updates to versions less than this value +;ignoreUpdateToVersion= +; +;; Show desktop notifications (bool) +;showDesktopNotification=true +; +;; Show abort notifications (bool) +;showAbortNotification=true +; +;; Filename pattern using C++ strftime formatting +;filenamePattern=%F_%H-%M +; +;; Whether the tray icon is disabled (bool) +;disabledTrayIcon=false +; +;; Use grim-based wayland universal screenshot adapter +;useGrimAdapter=false +; +;; Disable Grim Warning notification +;disabledGrimWarning=true +; +;; Automatically close daemon when it's not needed (not available on Windows) +;autoCloseIdleDaemon=false +; +;; Allow multiple instances of `flameshot gui` to run at the same time +;allowMultipleGuiInstances=false +; +;; Last used tool thickness; same thickness shared by Pencil, Line, Arrow, Rectangular Selection, Circle (int) +;drawThickness=3 +; +;; Last used font size (int) +;drawFontSize=8 +; +;; Last used Circle Counter size (int) +;drawCircleCounterSize=1 +; +;; Last used Pixelate pixel size (int) +;drawPixelateSize=2 +; +;; Last used size for Rectangle rounded corners (int) +;drawRectangleSize=1 +; +;; Last used Marker size (int) +;drawMarkerSize=5 +; +;; Keep the App Launcher open after selecting an app (bool) +;keepOpenAppLauncher=false +; +;; Launch at startup (bool) +;startupLaunch=true +; +;; Show greeting message on startup (bool) +;showStartupLaunchMessage=true +; +;; Opacity of area outside selection (int in range 0-255) +;contrastOpacity=190 +; +;; Save image after copy (bool) +;saveAfterCopy=false +; +;; Copy path to image after save (bool) +;copyPathAfterSave=false +; +;; On successful upload, close the dialog and copy URL to clipboard. +;copyAndCloseAfterUpload=true +; +;; Anti-aliasing image when zoom the pinned image (bool) +;antialiasingPinZoom=true +; +;; Use JPG format instead of PNG (bool) +;useJpgForClipboard=false +; +;; Upload to imgur without confirmation (bool) +;uploadWithoutConfirmation=false +; +;; Use larger color palette as the default one +; predefinedColorPaletteLarge=false +; +;; Set JPEG Quality (int in range 0-100) +; jpegQuality=75 +; +;; Shortcut Settings for all tools +;[Shortcuts] +;TYPE_ARROW=A +;TYPE_CANCEL=Ctrl+Backspace +;TYPE_CIRCLE=C +;TYPE_CIRCLECOUNT= +;TYPE_COMMIT_CURRENT_TOOL=Ctrl+Return +;TYPE_COPY=Ctrl+C +;TYPE_DRAWER=D +;TYPE_EXIT=Ctrl+Q +;TYPE_IMAGEUPLOADER=Return +;TYPE_MARKER=M +;TYPE_MOVESELECTION=Ctrl+M +;TYPE_MOVE_DOWN=Down +;TYPE_MOVE_LEFT=Left +;TYPE_MOVE_RIGHT=Right +;TYPE_MOVE_UP=Up +;TYPE_OPEN_APP=Ctrl+O +;TYPE_PENCIL=P +;TYPE_PIN= +;TYPE_PIXELATE=B +;TYPE_RECTANGLE=R +;TYPE_REDO=Ctrl+Shift+Z +;TYPE_RESIZE_DOWN=Shift+Down +;TYPE_RESIZE_LEFT=Shift+Left +;TYPE_RESIZE_RIGHT=Shift+Right +;TYPE_RESIZE_UP=Shift+Up +;TYPE_SYM_RESIZE_DOWN=Ctrl+Shift+Down +;TYPE_SYM_RESIZE_LEFT=Ctrl+Shift+Left +;TYPE_SYM_RESIZE_RIGHT=Ctrl+Shift+Right +;TYPE_SYM_RESIZE_UP=Ctrl+Shift+Up +;TYPE_SAVE=Ctrl+S +;TYPE_SELECTION=S +;TYPE_SELECT_ALL=Ctrl+A +;TYPE_TEXT=T +;TYPE_TOGGLE_PANEL=Space +;TYPE_GRAB_COLOR=G +;TYPE_UNDO=Ctrl+Z diff --git a/packaging/debian/changelog b/packaging/debian/changelog new file mode 100644 index 0000000..e7f173e --- /dev/null +++ b/packaging/debian/changelog @@ -0,0 +1,5 @@ +flameshot (13.2.0-1) unstable; urgency=medium + + * Release for v13.3.0 + + -- Jeremy Borgman Fri, 24 Oct 2025 18:24:29 -0600 diff --git a/packaging/debian/compat b/packaging/debian/compat new file mode 100644 index 0000000..b4de394 --- /dev/null +++ b/packaging/debian/compat @@ -0,0 +1 @@ +11 diff --git a/packaging/debian/control b/packaging/debian/control new file mode 100644 index 0000000..3f07475 --- /dev/null +++ b/packaging/debian/control @@ -0,0 +1,38 @@ +Source: flameshot +Section: graphics +Priority: optional +Maintainer: Boyuan Yang +Build-Depends: + cmake (>= 3.13~), + debhelper (>= 11), + qt6-base-dev (>= 6.2.0~), + qt6-tools-dev (>= 6.2.0~), + qt6-tools-dev-tools (>= 6.2.0~), + qt6-svg-dev (>= 6.2.0~) | libqt6svg6-dev (>= 6.2.0~), + qt6-l10n-tools, + libgl-dev, +Standards-Version: 4.5.0 +Homepage: https://github.com/flameshot-org/flameshot +Vcs-Browser: https://github.com/flameshot-org/flameshot +Vcs-Git: https://github.com/flameshot-org/flameshot.git + +Package: flameshot +Architecture: any +Depends: + hicolor-icon-theme, + libqt6svg6 (>= 6.2.0~), + qt6-qpa-plugins (>= 6.2.0~), + ${shlibs:Depends}, + ${misc:Depends}, +Recommends: + xdg-desktop-portal-gtk | xdg-desktop-portal-gnome | xdg-desktop-portal-kde | xdg-desktop-portal-wlr, + grim, +Suggests: + ca-certificates, + openssl, + qt6-image-formats-plugins, +Description: Powerful yet simple-to-use screenshot software + Flameshot is a powerful yet simple-to-use screenshot software. + Notable features include customizable appearance, in-app screenshot editing, + D-Bus interface, experimental GNOME/KDE Wayland support, integration with + Imgur and support for both GUI and CLI interface. diff --git a/packaging/debian/copyright b/packaging/debian/copyright new file mode 100644 index 0000000..00f524e --- /dev/null +++ b/packaging/debian/copyright @@ -0,0 +1,390 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: flameshot +Source: https://github.com/flameshot-org/flameshot/ + +Files: * +Copyright: 2016-2019 lupoDharkael +License: GPL-3+ +Comment: + The author copied a few lines of code from KSnapshot regiongrabber.cpp + revision 796531 (LGPL). + +Files: debian/* +Copyright: 2017 Juanma Navarro Mañez + 2018 Boyuan Yang +License: GPL-3+ + +Files: + data/img/app/flameshot.* + data/img/hicolor/* +Copyright: 2017 lupoDharkael +License: Free-Art-License-1.3 + +Files: + docs/appdata/flameshot.metainfo.xml +Copyright: 2017-2019 lupoDharkael +License: CC0-1.0 + +Files: + data/img/material/black/* + data/img/material/white/* +Copyright: Google Inc. +License: Apache-2.0 + +Files: src/widgets/capture/capturewidget.* +Copyright: 2017 Alejandro Sirgo Rica + 2017 Christian Kaiser + 2007 Luca Gugelmann +License: GPL-3+ +Comment: + Relicensed under GPL-3+ under flameshot project. + . + Originally based on Lightscreen areadialog.h, + Copyright 2017 Christian Kaiser + released under the GNU GPL2 + . + Originally based on KDE's KSnapshot regiongrabber.cpp, revision 796531, + Copyright 2007 Luca Gugelmann + released under the GNU LGPL + +Files: build/_deps/kdsingleapplication-src/* +Copyright: 2019 Klarälvdalens Datakonsult AB +License: Expat + +Files: build/_deps/qtcolorwidgets-src/* +Copyright: 2013-2017 Mattia Basaglia +License: LGPL-3+ +Comment: + As a special exception, this library can be included in any project under the + terms of any of the GNU licenses, distributing the whole project under a + different GNU license, see LICENSE-EXCEPTION for details. + . + Linking this library statically or dynamically with other modules is making a + combined work based on this library. Thus, the terms and conditions of the + GNU Lesser General Public License version 3 cover the whole combination. + . + As a special exception, the copyright holders of this library give you + permission to combine this library with independent + modules to produce an executable, and to copy and distribute the resulting + executable under terms of any of the GNU General Public licenses, as published + by the Free Software Foundation, provided that you also meet, + for each linked independent module, the terms and conditions of the license of + that module. An independent module is a module which is not derived from or + based on this library. If you modify this library, you may extend this + exception to your version of the library, but you are not obliged to do so. + If you do not wish to do so, delete this exception statement from your version. + +License: LGPL-3+ + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Lesser Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + . + This package is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + . + You should have received a copy of the GNU General Lesser Public License + along with this program. If not, see . + . + On Debian systems, the complete text of the GNU Lesser General Public + License version 3 can be found in "/usr/share/common-licenses/LGPL-3". + +License: Expat + The MIT License (MIT) + . + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + . + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +License: Apache-2.0 + Google Material Design Icons are licensed under Apache License 2.0. + . + On Debian systems, the complete text of Apache License 2.0 can be + found in "/usr/share/common-licenses/Apache-2.0". + +License: Free-Art-License-1.3 + Free Art License 1.3 (FAL 1.3) + . + Preamble + . + The Free Art License grants the right to freely copy, distribute, and + transform creative works without infringing the author's rights. + . + The Free Art License recognizes and protects these rights. Their + implementation has been reformulated in order to allow everyone to use + creations of the human mind in a creative manner, regardless of their + types and ways of expression. + . + While the public's access to creations of the human mind usually is + restricted by the implementation of copyright law, it is favoured by + the Free Art License. This license intends to allow the use of a + work’s resources; to establish new conditions for creating in order to + increase creation opportunities. The Free Art License grants the right + to use a work, and acknowledges the right holder’s and the user’s + rights and responsibility. + . + The invention and development of digital technologies, Internet and + Free Software have changed creation methods: creations of the human + mind can obviously be distributed, exchanged, and transformed. They + allow to produce common works to which everyone can contribute to the + benefit of all. + . + The main rationale for this Free Art License is to promote and protect + these creations of the human mind according to the principles of + copyleft: freedom to use, copy, distribute, transform, and prohibition + of exclusive appropriation. + . + Definitions + . + “work” either means the initial work, the subsequent works or the + common work as defined hereafter: + . + “common work” means a work composed of the initial work and all + subsequent contributions to it (originals and copies). The initial + author is the one who, by choosing this license, defines the + conditions under which contributions are made. + . + “Initial work” means the work created by the initiator of the common + work (as defined above), the copies of which can be modified by + whoever wants to + . + “Subsequent works” means the contributions made by authors who + participate in the evolution of the common work by exercising the + rights to reproduce, distribute, and modify that are granted by the + license. + . + “Originals” (sources or resources of the work) means all copies of + either the initial work or any subsequent work mentioning a date and + used by their author(s) as references for any subsequent updates, + interpretations, copies or reproductions. + . + “Copy” means any reproduction of an original as defined by this + license. + . + 1. OBJECT + . + The aim of this license is to define the conditions under which one + can use this work freely. + . + 2. SCOPE + . + This work is subject to copyright law. Through this license its author + specifies the extent to which you can copy, distribute, and modify it. + . + 2.1 FREEDOM TO COPY (OR TO MAKE REPRODUCTIONS) + . + You have the right to copy this work for yourself, your friends or any + other person, whatever the technique used. + . + 2.2 FREEDOM TO DISTRIBUTE, TO PERFORM IN PUBLIC + . + You have the right to distribute copies of this work; whether modified + or not, whatever the medium and the place, with or without any charge, + provided that you: attach this license without any modification to the + copies of this work or indicate precisely where the license can be + found, specify to the recipient the names of the author(s) of the + originals, including yours if you have modified the work, specify to + the recipient where to access the originals (either initial or + subsequent). + . + The authors of the originals may, if they wish to, give you the right + to distribute the originals under the same conditions as the copies. + . + 2.3 FREEDOM TO MODIFY + . + You have the right to modify copies of the originals (whether initial + or subsequent) provided you comply with the following conditions: all + conditions in article 2.2 above, if you distribute modified copies; + indicate that the work has been modified and, if it is possible, what + kind of modifications have been made; distribute the subsequent work + under the same license or any compatible license. + . + The author(s) of the original work may give you the right to modify it + under the same conditions as the copies. + . + 3. RELATED RIGHTS + . + Activities giving rise to author’s rights and related rights shall not + challenge the rights granted by this license. + . + For example, this is the reason why performances must be subject to + the same license or a compatible license. Similarly, integrating the + work in a database, a compilation or an anthology shall not prevent + anyone from using the work under the same conditions as those defined + in this license. + . + 4. INCORPORATION OF THE WORK + . + Incorporating this work into a larger work that is not subject to the + Free Art License shall not challenge the rights granted by this + license. + . + If the work can no longer be accessed apart from the larger work in + which it is incorporated, then incorporation shall only be allowed + under the condition that the larger work is subject either to the Free + Art License or a compatible license. + . + 5. COMPATIBILITY + . + A license is compatible with the Free Art License provided: it gives + the right to copy, distribute, and modify copies of the work including + for commercial purposes and without any other restrictions than those + required by the respect of the other compatibility criteria; it + ensures proper attribution of the work to its authors and access to + previous versions of the work when possible; it recognizes the Free + Art License as compatible (reciprocity); it requires that changes made + to the work be subject to the same license or to a license which also + meets these compatibility criteria. + . + 6. YOUR INTELLECTUAL RIGHTS + . + This license does not aim at denying your author's rights in your + contribution or any related right. By choosing to contribute to the + development of this common work, you only agree to grant others the + same rights with regard to your contribution as those you were granted + by this license. Conferring these rights does not mean you have to + give up your intellectual rights. + . + 7. YOUR RESPONSIBILITIES + . + The freedom to use the work as defined by the Free Art License (right + to copy, distribute, modify) implies that everyone is responsible for + their own actions. + . + 8. DURATION OF THE LICENSE + . + This license takes effect as of your acceptance of its terms. The act + of copying, distributing, or modifying the work constitutes a tacit + agreement. This license will remain in effect for as long as the + copyright which is attached to the work. If you do not respect the + terms of this license, you automatically lose the rights that it + confers. + . + If the legal status or legislation to which you are subject makes it + impossible for you to respect the terms of this license, you may not + make use of the rights which it confers. + . + 9. VARIOUS VERSIONS OF THE LICENSE + . + This license may undergo periodic modifications to incorporate + improvements by its authors (instigators of the “Copyleft Attitude” + movement) by way of new, numbered versions. + . + You will always have the choice of accepting the terms contained in + the version under which the copy of the work was distributed to you, + or alternatively, to use the provisions of one of the subsequent + versions. + . + 10. SUB-LICENSING + . + Sub-licenses are not authorized by this license. Any person wishing to + make use of the rights that it confers will be directly bound to the + authors of the common work. + . + 11. LEGAL FRAMEWORK + . + This license is written with respect to both French law and the Berne + Convention for the Protection of Literary and Artistic Works. + . + USER GUIDE + . + - How to use the Free Art License? + . + To benefit from the Free Art License, you only need to mention the + following elements on your work: + . + [Name of the author, title, date of the work. When applicable, names + of authors of the common work and, if possible, where to find the + originals]. + . + Copyleft: This is a free work, you can copy, distribute, and modify it + under the terms of the Free Art License + http://artlibre.org/licence/lal/en/ + . + - Why to use the Free Art License? + . + 1.To give the greatest number of people access to your work. + . + 2.To allow it to be distributed freely. + . + 3.To allow it to evolve by allowing its copy, distribution, and + transformation by others. + . + 4.So that you benefit from the resources of a work when it is under + the Free Art License: to be able to copy, distribute or transform + it freely. + . + 5.But also, because the Free Art License offers a legal framework to + disallow any misappropriation. It is forbidden to take hold of + your work and bypass the creative process for one's exclusive + possession. + . + . + - When to use the Free Art License? + . + Any time you want to benefit and make others benefit from the right to + copy, distribute and transform creative works without any exclusive + appropriation, you should use the Free Art License. You can for + example use it for scientific, artistic or educational projects. + . + - What kinds of works can be subject to the Free Art License? + . + The Free Art License can be applied to digital as well as physical + works. You can choose to apply the Free Art License on any text, + picture, sound, gesture, or whatever sort of stuff on which you have + sufficient author's rights. + . + - Historical background of this license: + . + It is the result of observing, using and creating digital + technologies, free software, the Internet and art. It arose from the + “Copyleft Attitude” meetings which took place in Paris in 2000. For + the first time, these meetings brought together members of the Free + Software community, artists, and members of the art world. The goal + was to adapt the principles of Copyleft and free software to all sorts + of creations. http://www.artlibre.org + . + Copyleft Attitude, 2007. + . + You can make reproductions and distribute this license verbatim + (without any changes). + . + Translation : Jonathan Clarke, Benjamin Jean, Griselda Jung, Fanny + Mourguet, Antoine Pitrou. Thanks to framalang.org + +License: GPL-3+ + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + . + This package is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + . + You should have received a copy of the GNU General Public License + along with this program. If not, see . + . + On Debian systems, the complete text of the GNU General + Public License version 3 can be found in "/usr/share/common-licenses/GPL-3". + +License: CC0-1.0 + On Debian systems, the complete text of the Creative Commons Zero v1.0 + Universal License can be found in "/usr/share/common-licenses/CC0-1.0". diff --git a/packaging/debian/docs b/packaging/debian/docs new file mode 100644 index 0000000..b43bf86 --- /dev/null +++ b/packaging/debian/docs @@ -0,0 +1 @@ +README.md diff --git a/packaging/debian/rules b/packaging/debian/rules new file mode 100755 index 0000000..55caf3d --- /dev/null +++ b/packaging/debian/rules @@ -0,0 +1,30 @@ +#!/usr/bin/make -f +# See debhelper(7) (uncomment to enable) +# output every command that modifies files on the build system. +#export DH_VERBOSE = 1 + + +# see FEATURE AREAS in dpkg-buildflags(1) +export DEB_BUILD_MAINT_OPTIONS = hardening=+all + +# see ENVIRONMENT in dpkg-buildflags(1) +# package maintainers to append CFLAGS +#export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic +# package maintainers to append LDFLAGS +export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed + +%: + dh $@ + +override_dh_auto_configure: + # The existence of an empty .git directory triggers syncqt. + mkdir .git || true + # This is required to use Cmake FetchContent + dh_auto_configure -- \ + -DFETCHCONTENT_FULLY_DISCONNECTED=OFF + +override_dh_auto_install: + dh_auto_install + # Remove not required headers, etc. + rm -rf debian/flameshot/usr/include + rm -rf debian/flameshot/usr/lib diff --git a/packaging/debian/source/format b/packaging/debian/source/format new file mode 100644 index 0000000..89ae9db --- /dev/null +++ b/packaging/debian/source/format @@ -0,0 +1 @@ +3.0 (native) diff --git a/packaging/flatpak/org.flameshot.Flameshot.yml b/packaging/flatpak/org.flameshot.Flameshot.yml new file mode 100644 index 0000000..4282337 --- /dev/null +++ b/packaging/flatpak/org.flameshot.Flameshot.yml @@ -0,0 +1,48 @@ +app-id: org.flameshot.Flameshot +runtime: org.kde.Platform +runtime-version: '6.9' +sdk: org.kde.Sdk +command: flameshot +finish-args: + # X11 + XShm access + - --share=ipc + - --socket=fallback-x11 + # Wayland access + - --socket=wayland + - --device=dri + # Connectivity + - --share=network + # QtSingleApplication, allow other instances to see log files + - --env=TMPDIR=/var/tmp + # Allow loading/saving files from anywhere + - --filesystem=xdg-pictures + # Notification access + - --talk-name=org.freedesktop.Notifications + # System Tray Icon + - --talk-name=org.kde.StatusNotifierWatcher +modules: + - name: flameshot + buildsystem: cmake-ninja + config-opts: + - -DCMAKE_BUILD_TYPE=Release + - -DUSE_WAYLAND_CLIPBOARD=1 + sources: + - type: git + url: https://gitlab.com/mattbas/Qt-Color-Widgets.git + commit: 352bc8f99bf2174d5724ee70623427aa31ddc26a + dest: external/Qt-Color-Widgets + + - type: git + url: https://github.com/KDAB/KDSingleApplication.git + tag: v1.2.0 + dest: external/KDSingleApplication + + - type: git + url: https://github.com/flameshot-org/flameshot.git + branch: master + #tag: v13.0.0 + + cleanup: + - /share/bash-completion + - /share/man + - /share/zsh \ No newline at end of file diff --git a/packaging/macos/Info.plist.in b/packaging/macos/Info.plist.in new file mode 100644 index 0000000..c1f165f --- /dev/null +++ b/packaging/macos/Info.plist.in @@ -0,0 +1,32 @@ + + + + + CFBundleExecutable + ${MACOSX_BUNDLE_EXECUTABLE_NAME} + CFBundleIconFile + flameshot + CFBundleIdentifier + ${MACOSX_BUNDLE_GUI_IDENTIFIER} + CFBundleName + ${MACOSX_BUNDLE_BUNDLE_NAME} + CFBundleDisplayName + ${MACOSX_BUNDLE_BUNDLE_NAME} + CFBundleVersion + ${MACOSX_BUNDLE_BUNDLE_VERSION} + CFBundleShortVersionString + ${MACOSX_BUNDLE_SHORT_VERSION_STRING} + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleInfoDictionaryVersion + 6.0 + LSMinimumSystemVersion + ${CMAKE_OSX_DEPLOYMENT_TARGET} + NSHighResolutionCapable + + LSUIElement + + + \ No newline at end of file diff --git a/packaging/macos/create_dmg.sh b/packaging/macos/create_dmg.sh new file mode 100755 index 0000000..3c53eb2 --- /dev/null +++ b/packaging/macos/create_dmg.sh @@ -0,0 +1,96 @@ +#!/bin/bash + +# Script to create and optionally sign a DMG file +# Usage: create_dmg.sh +# If signing identities are empty, DMG will be created unsigned + +APP_PATH="$1" +DMG_PATH="$2" +APP_SIGN_IDENTITY="$3" +DMG_SIGN_IDENTITY="$4" + +if [ $# -ne 4 ]; then + echo "Usage: create_dmg.sh " + echo "Note: Leave signing identities empty to create unsigned DMG" + exit 1 +fi + +echo "Creating DMG from: $APP_PATH" +echo "Output DMG: $DMG_PATH" + +rm -f "$DMG_PATH" + +TEMP_DIR=$(mktemp -d) +echo "Using temp directory: $TEMP_DIR" + +cp -R "$APP_PATH" "$TEMP_DIR/" + +# Create Applications symlink +ln -s /Applications "$TEMP_DIR/Applications" + +# Calculate size needed for DMG (in KB) +SIZE=$(du -sk "$TEMP_DIR" | cut -f1) +SIZE=$((SIZE + 1000)) # Add some padding + +echo "Creating DMG with size: ${SIZE}k" + +# Create DMG +hdiutil create -srcfolder "$TEMP_DIR" \ + -volname "Flameshot" \ + -fs HFS+ \ + -fsargs "-c c=64,a=16,e=16" \ + -format UDZO \ + -size ${SIZE}k \ + "$DMG_PATH" + +if [ $? -ne 0 ]; then + echo "Failed to create DMG" + rm -rf "$TEMP_DIR" + exit 1 +fi + +echo "DMG created successfully" + +# Sign the DMG (either with identity or ad hoc) +if [ -n "$DMG_SIGN_IDENTITY" ] && [ "$DMG_SIGN_IDENTITY" != "" ]; then + echo "Signing DMG with identity: $DMG_SIGN_IDENTITY" + codesign --force --sign "$DMG_SIGN_IDENTITY" --timestamp "$DMG_PATH" + + if [ $? -eq 0 ]; then + echo "DMG signed with Developer ID" + # Verify signature + echo "Verifying DMG signature..." + codesign --verify --verbose "$DMG_PATH" + else + echo "Failed to sign DMG with identity" + rm -rf "$TEMP_DIR" + exit 1 + fi +else + echo "Signing DMG with ad hoc signature (no identity required)" + codesign --force --sign - "$DMG_PATH" + + if [ $? -eq 0 ]; then + echo "DMG signed with ad hoc signature" + else + echo "Failed to ad hoc sign DMG" + rm -rf "$TEMP_DIR" + exit 1 + fi +fi + +# Clean up +rm -rf "$TEMP_DIR" + +echo "DMG creation complete: $DMG_PATH" + +if [ -z "$DMG_SIGN_IDENTITY" ] || [ "$DMG_SIGN_IDENTITY" = "" ]; then + echo "" + echo "NOTE: This DMG uses ad hoc signing (no Developer ID required)." + echo "Users will see a security warning but can still run the app by:" + echo "1. Right-clicking the app and selecting 'Open'" + echo "2. Or going to System Preferences > Security & Privacy and clicking 'Open Anyway'" + echo "3. The warning only appears on first launch" + echo "" + echo "The app and DMG are properly signed for Apple Silicon requirements." +fi diff --git a/packaging/macos/flameshot.icns b/packaging/macos/flameshot.icns new file mode 100644 index 0000000..b8db080 Binary files /dev/null and b/packaging/macos/flameshot.icns differ diff --git a/packaging/rpm/fedora/flameshot.spec b/packaging/rpm/fedora/flameshot.spec new file mode 100644 index 0000000..8694b71 --- /dev/null +++ b/packaging/rpm/fedora/flameshot.spec @@ -0,0 +1,163 @@ +# +# spec file for package flameshot on fedora, rhel +# +Name: flameshot +Version: 13.1.0 +Release: 2%{?dist} +License: GPLv3+ and ASL 2.0 and GPLv2 and LGPLv3 and Free Art +Summary: Powerful yet simple to use screenshot software +URL: https://github.com/flameshot-org/flameshot +Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz +Vendor: Flameshot + +BuildRequires: cmake >= 3.13.0 +BuildRequires: gcc-c++ >= 7 +BuildRequires: fdupes +BuildRequires: libappstream-glib +BuildRequires: ninja-build +BuildRequires: desktop-file-utils + +BuildRequires: cmake(Qt6Core) >= 6.0.0 +BuildRequires: cmake(KF6GuiAddons) >= 6.7.0 +BuildRequires: cmake(Qt6DBus) >= 6.0.0 +BuildRequires: cmake(Qt6Gui) >= 6.0.0 +BuildRequires: cmake(Qt6LinguistTools) >= 6.0.0 +BuildRequires: cmake(Qt6Network) >= 6.0.0 +BuildRequires: cmake(Qt6Svg) >= 6.0.0 +BuildRequires: cmake(Qt6Widgets) >= 6.0.0 + +Requires: hicolor-icon-theme +Requires: qt6-qtbase >= 6.0.0 +Requires: qt6-qttools >= 6.0.0 +Requires: qt6-qtsvg >= 6.0.0 + +Recommends: qt6-qtimageformats +Recommends: xdg-desktop-portal%{?_isa} +Recommends: (xdg-desktop-portal-gnome%{?_isa} if gnome-shell%{?_isa}) +Recommends: (xdg-desktop-portal-kde%{?_isa} if plasma-workspace-wayland%{?_isa}) +Recommends: (xdg-desktop-portal-wlr%{?_isa} if wlroots%{?_isa}) + +%description +Powerful and simple to use screenshot software with built-in +editor with advanced features. + +Features: + + * Customizable appearance. + * Easy to use. + * In-app screenshot edition. + * DBus interface. + +%prep +%autosetup -p1 + +%build +%cmake -G Ninja \ + -DCMAKE_BUILD_TYPE=Release \ + -DUSE_WAYLAND_CLIPBOARD:BOOL=ON \ + -DBUILD_SHARED_LIBS:BOOL=OFF +%cmake_build + +%install +%cmake_install +rm -rf %{buildroot}%{_includedir}/QtColorWidgets +rm -rf %{buildroot}%{_libdir}/cmake/QtColorWidgets +rm -f %{buildroot}%{_libdir}/libQtColorWidgets.* +rm -f %{buildroot}%{_libdir}/pkgconfig/QtColorWidgets.pc +rm -rf %{buildroot}%{_includedir}/kdsingleapplication-qt6 +rm -rf %{buildroot}%{_libdir}/cmake/KDSingleApplication-qt6 +rm -f %{buildroot}%{_libdir}/libkdsingleapplication-qt6.* +# https://fedoraproject.org/wiki/PackagingDrafts/find_lang +%find_lang Internationalization --with-qt +%fdupes %{buildroot}%{_datadir}/icons + +%check +appstream-util validate-relax --nonet %{buildroot}%{_metainfodir}/*.metainfo.xml +desktop-file-validate %{buildroot}%{_datadir}/applications/*.desktop + +%files -f Internationalization.lang +%{_datadir}/%{name}/translations/Internationalization_grc.qm +%doc README.md +%license LICENSE +%dir %{_datadir}/%{name} +%dir %{_datadir}/%{name}/translations +%dir %{_datadir}/bash-completion/completions +%dir %{_datadir}/zsh/site-functions +%{_bindir}/%{name} +%{_datadir}/applications/org.flameshot.Flameshot.desktop +%{_metainfodir}/org.flameshot.Flameshot.metainfo.xml +%{_datadir}/bash-completion/completions/%{name} +%{_datadir}/zsh/site-functions/_%{name} +%{_datadir}/fish/vendor_completions.d/%{name}.fish +%{_datadir}/dbus-1/interfaces/org.flameshot.Flameshot.xml +%{_datadir}/dbus-1/services/org.flameshot.Flameshot.service +%{_datadir}/icons/hicolor/*/apps/*.png +%{_datadir}/icons/hicolor/scalable/apps/*.svg +%{_mandir}/man1/%{name}.1* + +%changelog +* Sat Oct 28 2025 Jeremy Borgman - 13.3.0 +- Updated for v13.3.0 release + +* Sat Oct 24 2025 Jeremy Borgman - 13.2.0 +- Updated for v13.2.0 release + +* Sat Aug 16 2025 Elliott Tallis - 13.1.0-2 +- Minor spec file tweaks + +* Sun Aug 13 2025 Jeremy Borgman - 13.1.0 +- Update for v13.1.0 release + +* Sun Aug 06 2025 Jeremy Borgman - 13.0.1 +- Update for v13.0.1 release + +* Sun Aug 03 2025 Jeremy Borgman - 13.0.0 +- Update for v13 release + +* Sun Jul 17 2025 Jeremy Borgman - 13.0.rc2 +- Beta for 13 release. + +* Sun Jul 12 2025 Jeremy Borgman - 13.0.rc1 +- Beta for 13 release. + +* Sun Jul 03 2022 Jeremy Borgman - 12.1.0-1 +- Update for 12.1 release. + +* Wed Jun 21 2022 Jeremy Borgman - 12.0.0-1 +- Update for 12.0 release. + +* Fri Jan 14 2022 Jeremy Borgman - 11.0.0-1 +- Update for 11.0 release. + +* Sun Aug 29 2021 Zetao Yang - 0.10.1-2 +- Minor SPEC fixes. + +* Sun Jul 25 2021 Jeremy Borgman - 0.10.1-1 +- Updated for flameshot 0.10.1 + +* Mon May 17 2021 Jeremy Borgman - 0.10.0-1 +- Updated for flameshot 0.10.0 + +* Sat Feb 27 2021 Jeremy Borgman - 0.9.0-1 +- Updated for flameshot 0.9.0 + +* Wed Oct 14 2020 Jeremy Borgman - 0.8.5-1 +- Updated for flameshot 0.8.5 + +* Sat Oct 10 2020 Jeremy Borgman - 0.8.4-1 +- Updated for flameshot 0.8.4 + +* Sat Sep 19 2020 Jeremy Borgman - 0.8.3-1 +- Updated for flameshot 0.8.3 + +* Mon Sep 07 2020 Zetao Yang - 0.8.0-1 +- Updated for flameshot 0.8.0 +- More details, please see https://flameshot.org/changelog/#v080 + +* Sat Aug 18 2018 Zetao Yang - 0.6.0-1 +- Updated for flameshot 0.6.0 +- More details, please see https://flameshot.org/changelog/#v060 + +* Tue Jan 09 2018 Zetao Yang - 0.5.0-1 +- Initial package for flameshot 0.5.0 +- More details, please see https://flameshot.org/changelog/#v050 diff --git a/packaging/rpm/opensuse/flameshot.spec b/packaging/rpm/opensuse/flameshot.spec new file mode 100644 index 0000000..2c70ec3 --- /dev/null +++ b/packaging/rpm/opensuse/flameshot.spec @@ -0,0 +1,161 @@ +# +# spec file for package flameshot on opensuse leap 15.x +# +Name: flameshot +Version: 13.1.0 +Release: 2 +License: GPLv3+ and ASL 2.0 and GPLv2 and LGPLv3 and Free Art +Summary: Powerful yet simple to use screenshot software +URL: https://github.com/flameshot-org/flameshot +Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz +Vendor: Flameshot + +BuildRequires: cmake >= 3.13.0 +BuildRequires: gcc-c++ >= 7 +BuildRequires: fdupes +BuildRequires: update-desktop-files +BuildRequires: appstream-glib +BuildRequires: desktop-file-utils + +BuildRequires: cmake(Qt6Core) >= 6.0.0 +BuildRequires: cmake(Qt6DBus) >= 6.0.0 +BuildRequires: cmake(Qt6Gui) >= 6.0.0 +BuildRequires: cmake(Qt6LinguistTools) >= 6.0.0 +BuildRequires: cmake(Qt6Network) >= 6.0.0 +BuildRequires: cmake(Qt6Svg) >= 6.0.0 +BuildRequires: cmake(Qt6Widgets) >= 6.0.0 + +Requires: hicolor-icon-theme +Requires: qt6-base >= 6.0.0 +Requires: qt6-tools >= 6.0.0 +Requires: qt6-svg >= 6.0.0 + +Recommends: qt6-imageformats +Recommends: xdg-desktop-portal%{?_isa} +Recommends: (xdg-desktop-portal-gnome%{?_isa} if gnome-shell%{?_isa}) +Recommends: (xdg-desktop-portal-kde%{?_isa} if plasma-workspace-wayland%{?_isa}) +Recommends: (xdg-desktop-portal-wlr%{?_isa} if wlroots%{?_isa}) + +%description +Powerful and simple to use screenshot software with built-in +editor with advanced features. + +Features: + + * Customizable appearance. + * Easy to use. + * In-app screenshot edition. + * DBus interface. + +%prep +%autosetup -p1 + +%build +%cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS:BOOL=OFF + +%cmake_build + +%install +%cmake_install +rm -rf %{buildroot}%{_includedir}/QtColorWidgets +rm -rf %{buildroot}%{_libdir}/cmake/QtColorWidgets +rm -f %{buildroot}%{_libdir}/libQtColorWidgets.* +rm -f %{buildroot}%{_libdir}/pkgconfig/QtColorWidgets.pc +rm -rf %{buildroot}%{_includedir}/kdsingleapplication-qt6 +rm -rf %{buildroot}%{_libdir}/cmake/KDSingleApplication-qt6 +rm -f %{buildroot}%{_libdir}/libkdsingleapplication-qt6.* +# https://fedoraproject.org/wiki/PackagingDrafts/find_lang +%find_lang Internationalization --with-qt +%suse_update_desktop_file -r org.flameshot.Flameshot Utility X-SuSE-DesktopUtility +%fdupes %{buildroot}%{_datadir}/icons + +%check +appstream-util validate-relax --nonet %{buildroot}%{_datadir}/metainfo/*.metainfo.xml +desktop-file-validate %{buildroot}%{_datadir}/applications/*.desktop + +%files -f Internationalization.lang +%{_datadir}/%{name}/translations/Internationalization_grc.qm +%doc README.md +%license LICENSE +%dir %{_datadir}/%{name} +%dir %{_datadir}/%{name}/translations +%dir %{_datadir}/bash-completion/completions +%dir %{_datadir}/zsh/site-functions +%{_bindir}/%{name} +%{_datadir}/applications/org.flameshot.Flameshot.desktop +%{_datadir}/metainfo/org.flameshot.Flameshot.metainfo.xml +%{_datadir}/bash-completion/completions/%{name} +%{_datadir}/zsh/site-functions/_%{name} +%{_datadir}/fish/vendor_completions.d/%{name}.fish +%{_datadir}/dbus-1/interfaces/org.flameshot.Flameshot.xml +%{_datadir}/dbus-1/services/org.flameshot.Flameshot.service +%{_datadir}/icons/hicolor/*/apps/*.png +%{_datadir}/icons/hicolor/scalable/apps/*.svg +%{_mandir}/man1/%{name}.1* + +%changelog +* Sat Oct 28 2025 Jeremy Borgman - 13.3.0 +- Updated for v13.3.0 release + +* Sat Oct 24 2025 Jeremy Borgman - 13.2.0 +- Updated for v13.2.0 release + +* Sat Aug 16 2025 Elliott Tallis - 13.1.0-2 +- Minor spec file tweaks + +* Sun Aug 15 2025 Jeremy Borgman - 13.1.0 +- Update for v13.1.0 release + +* Sun Aug 06 2025 Jeremy Borgman - 13.0.1 +- Update for v13.0.1 release + +* Sun Aug 03 2025 Jeremy Borgman - 13.0.0 +- Update for v13 release + +* Sun Jul 27 2025 Jeremy Borgman - 13.0.rc2 +- Beta for 13 release. + +* Sun Jul 12 2025 Jeremy Borgman - 13.0.rc1 +- Beta for 13 release. + +* Sun Jul 03 2022 Jeremy Borgman - 12.1.0-1 +- Update for 12.1 release. + +* Wed Jun 21 2022 Jeremy Borgman - 12.0.0-1 +- Update for 12.0 release. + +* Fri Jan 14 2022 Jeremy Borgman - 11.0.0-1 +- Update for 11.0 release. + +* Sun Aug 29 2021 Zetao Yang - 0.10.1-2 +- Minor SPEC fixes. + +* Sun Jul 25 2021 Jeremy Borgman - 0.10.1-1 +- Updated for flameshot 0.10.1 + +* Mon May 17 2021 Jeremy Borgman - 0.10.0-1 +- Updated for flameshot 0.10.0 + +* Sat Feb 27 2021 Jeremy Borgman - 0.9.0-1 +- Updated for flameshot 0.9.0 + +* Wed Oct 14 2020 Jeremy Borgman - 0.8.5-1 +- Updated for flameshot 0.8.5 + +* Sat Oct 10 2020 Jeremy Borgman - 0.8.4-1 +- Updated for flameshot 0.8.4 + +* Sat Sep 19 2020 Jeremy Borgman - 0.8.3-1 +- Updated for flameshot 0.8.3 + +* Mon Sep 07 2020 Zetao Yang - 0.8.0-1 +- Updated for flameshot 0.8.0 +- More details, please see https://flameshot.org/changelog/#v080 + +* Sat Aug 18 2018 Zetao Yang - 0.6.0-1 +- Updated for flameshot 0.6.0 +- More details, please see https://flameshot.org/changelog/#v060 + +* Tue Jan 09 2018 Zetao Yang - 0.5.0-1 +- Initial package for flameshot 0.5.0 +- More details, please see https://flameshot.org/changelog/#v050 diff --git a/packaging/win-installer/Bitmaps/CPACK_WIX_UI_BANNER.BMP b/packaging/win-installer/Bitmaps/CPACK_WIX_UI_BANNER.BMP new file mode 100644 index 0000000..e65e8b4 Binary files /dev/null and b/packaging/win-installer/Bitmaps/CPACK_WIX_UI_BANNER.BMP differ diff --git a/packaging/win-installer/Bitmaps/CPACK_WIX_UI_DIALOG.BMP b/packaging/win-installer/Bitmaps/CPACK_WIX_UI_DIALOG.BMP new file mode 100644 index 0000000..5322703 Binary files /dev/null and b/packaging/win-installer/Bitmaps/CPACK_WIX_UI_DIALOG.BMP differ diff --git a/packaging/win-installer/LICENSE/GPL-3.0.txt b/packaging/win-installer/LICENSE/GPL-3.0.txt new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/packaging/win-installer/LICENSE/GPL-3.0.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/scripts/.gitkeep b/scripts/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..976ad45 --- /dev/null +++ b/shell.nix @@ -0,0 +1,10 @@ +{ pkgs ? import { } }: + +pkgs.mkShell { + nativeBuildInputs = with pkgs; [ + cmake + kdePackages.qtsvg + kdePackages.qttools + ]; + buildInputs = with pkgs; [ kdePackages.qtbase kdePackages.kguiaddons ]; +} diff --git a/snapcraft.yaml b/snapcraft.yaml new file mode 100644 index 0000000..e9bd44c --- /dev/null +++ b/snapcraft.yaml @@ -0,0 +1,76 @@ +--- + +name: flameshot +adopt-info: flameshot +base: core24 +summary: Powerful yet simple to use screenshot software +description: | + A powerful open source screenshot and annotation tool for Linux, Flameshot + has a varied set of markup tools available, which include Freehand drawing, + Lines, Arrows, Boxes, Circles, Highlighting, Blur. Additionally, you can + customise the color, size and/or thickness of many of these image annotation + tools. +grade: stable +confinement: strict +compression: lzo +platforms: + amd64: + build-on: amd64 + build-for: amd64 + + +apps: + flameshot: + command: usr/bin/flameshot + desktop: usr/share/applications/org.flameshot.Flameshot.desktop + extensions: + - kde-neon-6 + environment: + XDG_DATA_DIRS: $SNAP/share:$XDG_DATA_DIRS + slots: [dbus-flameshot] + plugs: + - home + - desktop + - wayland + - gsettings + - removable-media + - network + - network-bind + +parts: + flameshot: + #source: ./ + source: https://github.com/flameshot-org/flameshot.git + plugin: cmake + build-packages: + - git + cmake-parameters: + - -DFLAMESHOT_ICON=/snap/flameshot/current/usr/share/icons/hicolor/scalable/apps/flameshot.svg + - -DCMAKE_INSTALL_PREFIX=/usr + - -DUSE_WAYLAND_CLIPBOARD=1 + source-type: git + override-pull: | + craftctl default + # remove release candidates + last_committed_tag="$(git tag -l --sort=-v:refname | grep -v rc | head -1)" + git_revno="$(git rev-list $(git describe --tags --abbrev=0)..HEAD --count)" + git_hash="$(git rev-parse --short HEAD)" + snapcraftctl set-version "${last_committed_tag}+git${git_revno}.${git_hash}" + override-build: | + craftctl default + # Correct the Icon path + sed -i 's|^Icon=.*|Icon=${SNAP}/usr/share/icons/hicolor/scalable/apps/org.flameshot.Flameshot.svg|' ${CRAFT_PART_INSTALL}/usr/share/applications/org.flameshot.Flameshot.desktop + sed -i 's/^\(Name\(\[.\+\]\)\?=.*\)$/\1 (Snap Edition)/g' ${CRAFT_PART_INSTALL}/usr/share/applications/org.flameshot.Flameshot.desktop + +slots: + # Depending on in which environment we're running we either need + # to use the system or session DBus so we also need to have one + # slot for each. + dbus-flameshot: + interface: dbus + bus: session + name: org.flameshot.Flameshot + +layout: + /usr/share/flameshot/translations: + symlink: $SNAP/usr/share/flameshot/translations diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..04c4c0c --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,541 @@ +find_package( + Qt${QT_VERSION_MAJOR} + CONFIG + REQUIRED + Core + Gui + Widgets + Network + Svg + LinguistTools +) + +if (UNIX) +find_package( + Qt${QT_VERSION_MAJOR} + CONFIG + REQUIRED + DBus +) +endif() + +if (USE_WAYLAND_CLIPBOARD) + find_package(KF6GuiAddons) +endif() + +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) +set(CMAKE_AUTOUIC ON) + +# set application icon +if (APPLE) + set(FLAMESHOT_ICONSET ${CMAKE_BINARY_DIR}/flameshot.iconset) + set(FLAMESHOT_ICNS ${CMAKE_BINARY_DIR}/flameshot.icns) + + # generate iconset + execute_process( + COMMAND bash "-c" "mkdir -p \"${FLAMESHOT_ICONSET}\"" + ) + + execute_process( + COMMAND bash "-c" "sips -z 16 16 \"${CMAKE_SOURCE_DIR}\"/data/img/app/flameshot.monochrome.png --out \"${FLAMESHOT_ICONSET}\"/icon_16x16.png" + COMMAND bash "-c" "sips -z 32 32 \"${CMAKE_SOURCE_DIR}\"/data/img/app/flameshot.monochrome.png --out \"${FLAMESHOT_ICONSET}\"/icon_16x16@2x.png" + COMMAND bash "-c" "sips -z 32 32 \"${CMAKE_SOURCE_DIR}\"/data/img/app/flameshot.monochrome.png --out \"${FLAMESHOT_ICONSET}\"/icon_32x32.png" + COMMAND bash "-c" "sips -z 64 64 \"${CMAKE_SOURCE_DIR}\"/data/img/app/flameshot.monochrome.png --out \"${FLAMESHOT_ICONSET}\"/icon_32x32@2x.png" + COMMAND bash "-c" "sips -z 64 64 \"${CMAKE_SOURCE_DIR}\"/data/img/app/flameshot.monochrome.png --out \"${FLAMESHOT_ICONSET}\"/icon_64x64x.png" + COMMAND bash "-c" "sips -z 128 128 \"${CMAKE_SOURCE_DIR}\"/data/img/app/flameshot.monochrome.png --out \"${FLAMESHOT_ICONSET}\"/icon_64x64@2.png" + COMMAND bash "-c" "sips -z 128 128 \"${CMAKE_SOURCE_DIR}\"/data/img/app/flameshot.monochrome-1024.png --out \"${FLAMESHOT_ICONSET}\"/icon_128x128.png" + COMMAND bash "-c" "sips -z 256 256 \"${CMAKE_SOURCE_DIR}\"/data/img/app/flameshot.monochrome-1024.png --out \"${FLAMESHOT_ICONSET}\"/icon_128x128@2x.png" + COMMAND bash "-c" "sips -z 256 256 \"${CMAKE_SOURCE_DIR}\"/data/img/app/flameshot.monochrome-1024.png --out \"${FLAMESHOT_ICONSET}\"/icon_256x256.png" + COMMAND bash "-c" "sips -z 512 512 \"${CMAKE_SOURCE_DIR}\"/data/img/app/flameshot.monochrome-1024.png --out \"${FLAMESHOT_ICONSET}\"/icon_256x256@2x.png" + COMMAND bash "-c" "sips -z 512 512 \"${CMAKE_SOURCE_DIR}\"/data/img/app/flameshot.monochrome-1024.png --out \"${FLAMESHOT_ICONSET}\"/icon_512x512.png" + COMMAND bash "-c" "sips -z 1024 1024 \"${CMAKE_SOURCE_DIR}\"/data/img/app/flameshot.monochrome-1024.png --out \"${FLAMESHOT_ICONSET}\"/icon_512x512@2x.png" + + COMMAND bash "-c" "iconutil -o \"${FLAMESHOT_ICNS}\" -c icns \"${FLAMESHOT_ICONSET}\"" + ) + + execute_process( + COMMAND bash "-c" "rm -R \"${FLAMESHOT_ICONSET}\"" + ) + + execute_process( + # copy icon from cache generated on the localhost if generation on CI failed + COMMAND bash "-c" "[[ -r '\"${FLAMESHOT_ICNS}\"' ]] || cp \"${CMAKE_SOURCE_DIR}\"/packaging/macos/flameshot.icns \"${FLAMESHOT_ICNS}\"" + ) + + # Set application icon + set(MACOSX_BUNDLE_ICON_FILE flameshot.icns) + + # And this part tells CMake where to find and install the file itself + set(APP_ICON_MACOSX ${FLAMESHOT_ICNS}) + set_source_files_properties(${APP_ICON_MACOSX} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") + + add_executable(flameshot MACOSX_BUNDLE main.cpp ${APP_ICON_MACOSX}) +else () + add_executable(flameshot) +endif () + +add_executable(Flameshot::flameshot ALIAS flameshot) + +if(FLAMESHOT_ICON) + target_compile_definitions(flameshot PUBLIC FLAMESHOT_ICON="${FLAMESHOT_ICON}") +endif() + +if (WIN32) + add_executable(flameshot-cli) + target_sources( + flameshot-cli + PRIVATE + windows-cli.cpp) + set_target_properties(flameshot-cli PROPERTIES OUTPUT_NAME "flameshot-cli") + target_link_options(flameshot-cli PRIVATE /SUBSYSTEM:CONSOLE) + set_property(TARGET flameshot PROPERTY WIN32_EXECUTABLE true) + # Getting error D8016 - /utf-8 automatically set by current cmake/msvc ? + #if (MSVC) + # target_compile_options(flameshot PRIVATE /source-charset:utf-8) + #endif () +endif () + +if(MSVC) + OPTION(USE_MP "use multiple" ON) + OPTION(ProjectConfig_Global_COMPILE_FLAGS_WITH_MP + "Set The Global Option COMPILE_FLAGS /MP to target." ON) + if(ProjectConfig_Global_COMPILE_FLAGS_WITH_MP OR USE_MP) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MP") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") + endif() +endif() + +add_subdirectory(cli) +add_subdirectory(config) +add_subdirectory(core) +add_subdirectory(utils) +add_subdirectory(widgets) +add_subdirectory(tools) + + +set(FLAMESHOT_TS_FILES + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_bg.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_ca.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_cs.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_da.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_de_DE.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_el.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_en.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_es.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_et.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_eu.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_fa.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_fi.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_fr.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_ga.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_gl.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_grc.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_he.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_hu.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_id.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_it_IT.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_ja.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_ka.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_ko.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_nb_NO.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_nl_NL.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_nl.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_pt.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_pl.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_pt_BR.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_ro.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_ru.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_sk.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_sr_SP.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_sv_SE.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_sw.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_ta.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_th.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_tr.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_uk.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_vi.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_zh_CN.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_zh_HK.ts + ${CMAKE_SOURCE_DIR}/data/translations/Internationalization_zh_TW.ts + ) + +if (GENERATE_TS) + qt6_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${FLAMESHOT_TS_FILES}) +else () + qt6_add_translation(QM_FILES ${FLAMESHOT_TS_FILES}) +endif () + +target_sources( + flameshot + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/../data/graphics.qrc + ${CMAKE_CURRENT_SOURCE_DIR}/../data/flameshot.rc # windows binary icon resource file + ${QM_FILES} + main.cpp) + +target_include_directories( + flameshot + PUBLIC $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + if(ENABLE_IMGUR) + $ + endif() + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $ + $) +target_include_directories( + flameshot + PUBLIC + $ + ) + +target_link_libraries( + flameshot + project_warnings + project_options + Qt${QT_VERSION_MAJOR}::Svg + Qt${QT_VERSION_MAJOR}::Network + Qt${QT_VERSION_MAJOR}::Widgets + QtColorWidgets +) +if (UNIX) +target_link_libraries( + flameshot + Qt${QT_VERSION_MAJOR}::DBus +) +endif() + +if (USE_KDSINGLEAPPLICATION) + message(STATUS "KDSingleApplication is used!") + add_compile_definitions(USE_KDSINGLEAPPLICATION=1) + + if (USE_BUNDLED_KDSINGLEAPPLICATION) + target_include_directories(flameshot PRIVATE ${kdsingleapplication_SOURCE_DIR} ${kdsingleapplication_BINARY_DIR}) + endif() + + target_link_libraries( + flameshot + KDAB::kdsingleapplication + ) +endif() + +if (USE_WAYLAND_CLIPBOARD) + target_compile_definitions(flameshot PRIVATE USE_WAYLAND_CLIPBOARD=1) + target_link_libraries(flameshot KF6::GuiAddons) +endif() + +if (APPLE) + set_target_properties(flameshot PROPERTIES + MACOSX_BUNDLE TRUE + MACOSX_BUNDLE_BUNDLE_NAME "Flameshot" + MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} + MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION} + MACOSX_BUNDLE_IDENTIFIER "org.flameshot.Flameshot" + MACOSX_BUNDLE_GUI_IDENTIFIER "org.flameshot.Flameshot" + ) + set_property(TARGET flameshot PROPERTY + MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/packaging/macos/Info.plist.in + ) + target_link_libraries( + flameshot + qhotkey + ) +endif () + + +set(_src_root_path ${CMAKE_CURRENT_SOURCE_DIR}) +file(GLOB_RECURSE _source_list LIST_DIRECTORIES false + "${_src_root_path}/*.cpp" + "${_src_root_path}/*.h") + +# will be organized according to the actual directory structure, .h.cpp is put together +source_group(TREE ${_src_root_path} FILES ${_source_list}) + +if (WIN32) + set(USE_OPENSSL FALSE) + if (ENABLE_OPENSSL) + find_package(OpenSSL) + if (OPENSSL_FOUND) + message(STATUS "OpenSSL support enabled.") + set(USE_OPENSSL TRUE) + endif () + else () + mark_as_advanced(CLEAR OPENSSL_LIBRARIES OPENSSL_INCLUDE_DIR) + endif () + + if (NOT USE_OPENSSL) + message(WARNING "OpenSSL is required to upload screenshots") + endif () +endif () + +# Choose default color palette (small or large) +if($ENV{FLAMESHOT_PREDEFINED_COLOR_PALETTE_LARGE}) + set(FLAMESHOT_PREDEFINED_COLOR_PALETTE_LARGE true) +else() + set(FLAMESHOT_PREDEFINED_COLOR_PALETTE_LARGE false) +endif() +message("Flameshot predefined color palette large: " ${FLAMESHOT_PREDEFINED_COLOR_PALETTE_LARGE}) +target_compile_definitions(flameshot PRIVATE PREDEFINED_COLOR_PALETTE_LARGE=${FLAMESHOT_PREDEFINED_COLOR_PALETTE_LARGE}) + + +find_package (Git) +if( DEFINED ENV{GIT_HASH}) + message("Using provided git_commit_hash: $ENV{GIT_HASH}") + set(FLAMESHOT_GIT_HASH $ENV{GIT_HASH}) + target_compile_definitions(flameshot PRIVATE FLAMESHOT_GIT_HASH="${FLAMESHOT_GIT_HASH}") +elseif (GIT_FOUND) + message("git found: ${GIT_EXECUTABLE} in version ${GIT_VERSION_STRING}") + execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD OUTPUT_VARIABLE FLAMESHOT_GIT_HASH) + string(REGEX REPLACE "\r*\n$" "" FLAMESHOT_GIT_HASH "${FLAMESHOT_GIT_HASH}") + target_compile_definitions(flameshot PRIVATE FLAMESHOT_GIT_HASH="${FLAMESHOT_GIT_HASH}") + message("FLAMESHOT_GIT_HASH: ${FLAMESHOT_GIT_HASH}") +else() + target_compile_definitions(flameshot PRIVATE FLAMESHOT_GIT_HASH="-") + message(WARNING "Compiling without git commit hash") +endif () + +target_compile_definitions(flameshot PRIVATE APP_PREFIX="${CMAKE_INSTALL_PREFIX}") +target_compile_definitions(flameshot PRIVATE APP_VERSION="v${PROJECT_VERSION}") +#target_compile_definitions(flameshot PRIVATE QAPPLICATION_CLASS=QApplication) +target_compile_definitions(flameshot PRIVATE FLAMESHOT_APP_VERSION_URL="${GIT_API_URL}") +# Enable easier debugging of screenshot capture mode +if (FLAMESHOT_DEBUG_CAPTURE) + target_compile_definitions(flameshot PRIVATE FLAMESHOT_DEBUG_CAPTURE) +endif () + +if (USE_MONOCHROME_ICON) + target_compile_definitions(flameshot PRIVATE USE_MONOCHROME_ICON) +endif () + +foreach (FILE ${QM_FILES}) + get_filename_component(F_NAME ${FILE} NAME) + add_custom_command( + TARGET flameshot + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/${F_NAME} + ${CMAKE_CURRENT_BINARY_DIR}/translations/${F_NAME}) +endforeach () + +# ###################################################################################################################### +# Installation instructions + +include(GNUInstallDirs) +set(INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/Flameshot) + +if(USE_LAUNCHER_ABSOLUTE_PATH) + set(LAUNCHER_EXECUTABLE "${CMAKE_INSTALL_FULL_BINDIR}/flameshot") +else() + set(LAUNCHER_EXECUTABLE "flameshot") +endif() + +# Install binary +install(TARGETS flameshot + EXPORT flameshot-targets + BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) +if (WIN32) + install(TARGETS flameshot-cli + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) +endif () + +if (UNIX) + # Install desktop files, completion and dbus files + configure_file(${CMAKE_SOURCE_DIR}/data/desktopEntry/package/org.flameshot.Flameshot.desktop + ${CMAKE_CURRENT_BINARY_DIR}/share/applications/org.flameshot.Flameshot.desktop @ONLY) + + configure_file(${CMAKE_SOURCE_DIR}/data/appdata/org.flameshot.Flameshot.metainfo.xml + ${CMAKE_CURRENT_BINARY_DIR}/share/metainfo/org.flameshot.Flameshot.metainfo.xml COPYONLY) + + configure_file(${CMAKE_SOURCE_DIR}/data/shell-completion/flameshot.bash + ${CMAKE_CURRENT_BINARY_DIR}/share/bash-completion/completions/flameshot COPYONLY) + + configure_file(${CMAKE_SOURCE_DIR}/data/shell-completion/flameshot.zsh + ${CMAKE_CURRENT_BINARY_DIR}/share/zsh/site-functions/_flameshot COPYONLY) + + configure_file(${CMAKE_SOURCE_DIR}/data/shell-completion/flameshot.fish + ${CMAKE_CURRENT_BINARY_DIR}/share/fish/vendor_completions.d/flameshot.fish COPYONLY) + + configure_file(${CMAKE_SOURCE_DIR}/data/dbus/org.flameshot.Flameshot.xml + ${CMAKE_CURRENT_BINARY_DIR}/share/dbus-1/interfaces/org.flameshot.Flameshot.xml COPYONLY) + + configure_file(${CMAKE_SOURCE_DIR}/data/dbus/org.flameshot.Flameshot.service.in + ${CMAKE_CURRENT_BINARY_DIR}/share/dbus-1/services/org.flameshot.Flameshot.service) + + # Install man pages + configure_file(${CMAKE_SOURCE_DIR}/data/man/man1/flameshot.1 + ${CMAKE_CURRENT_BINARY_DIR}/share/man/man1/flameshot.1 COPYONLY) + + # Install Icons + configure_file(${CMAKE_SOURCE_DIR}/data/img/hicolor/48x48/apps/org.flameshot.Flameshot.png + ${CMAKE_CURRENT_BINARY_DIR}/share/icons/hicolor/48x48/apps/org.flameshot.Flameshot.png COPYONLY) + + configure_file(${CMAKE_SOURCE_DIR}/data/img/hicolor/128x128/apps/org.flameshot.Flameshot.png + ${CMAKE_CURRENT_BINARY_DIR}/share/icons/hicolor/128x128/apps/org.flameshot.Flameshot.png COPYONLY) + + configure_file(${CMAKE_SOURCE_DIR}/data/img/hicolor/scalable/apps/org.flameshot.Flameshot.svg + ${CMAKE_CURRENT_BINARY_DIR}/share/icons/hicolor/scalable/apps/org.flameshot.Flameshot.svg COPYONLY) + + # Install icon with both names + configure_file(${CMAKE_SOURCE_DIR}/data/img/hicolor/48x48/apps/flameshot.png + ${CMAKE_CURRENT_BINARY_DIR}/share/icons/hicolor/48x48/apps/flameshot.png COPYONLY) + + configure_file(${CMAKE_SOURCE_DIR}/data/img/hicolor/128x128/apps/flameshot.png + ${CMAKE_CURRENT_BINARY_DIR}/share/icons/hicolor/128x128/apps/flameshot.png COPYONLY) + + configure_file(${CMAKE_SOURCE_DIR}/data/img/hicolor/scalable/apps/flameshot.svg + ${CMAKE_CURRENT_BINARY_DIR}/share/icons/hicolor/scalable/apps/flameshot.svg COPYONLY) + + # Install assets + install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/share/ DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}) + + # Install Translations + install(FILES ${QM_FILES} DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/flameshot/translations) +endif () + +# windeployqt +if (WIN32) + # Add CMAKE_PREFIX_PATH to search paths + foreach(prefix ${CMAKE_PREFIX_PATH}) + list(APPEND WINDEPLOYQT_SEARCH_PATHS "${prefix}/bin") + endforeach() + list(APPEND WINDEPLOYQT_SEARCH_PATHS "$ENV{QTDIR}/bin") + + find_program(WINDEPLOYQT_EXE windeployqt.exe + PATHS ${WINDEPLOYQT_SEARCH_PATHS} + ) + + if(WINDEPLOYQT_EXE) + message(STATUS "windeployqt found: ${WINDEPLOYQT_EXE}") + + if (CMAKE_BUILD_TYPE MATCHES Release) + set(BINARIES_TYPE --release) + else () + set(BINARIES_TYPE --debug) + endif () + + add_custom_command( + TARGET flameshot + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_BINARY_DIR}/windeployqt_stuff + COMMAND + ${WINDEPLOYQT_EXE} ${BINARIES_TYPE} --no-translations --compiler-runtime --no-system-d3d-compiler + --no-quick-import --dir ${CMAKE_BINARY_DIR}/windeployqt_stuff $ + # copy translations manually QM_FILES + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/windeployqt_stuff/translations + COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_BINARY_DIR}/src/translations + ${CMAKE_BINARY_DIR}/windeployqt_stuff/translations) + + install(DIRECTORY ${CMAKE_BINARY_DIR}/windeployqt_stuff/ DESTINATION bin) + + + STRING(REGEX REPLACE "\\\\" "/" OPENSSL_ROOT_DIR "$ENV{OPENSSL_ROOT_DIR}" ) + + if (ENABLE_OPENSSL) + if (EXISTS ${OPENSSL_ROOT_DIR}/bin) + + install( + DIRECTORY ${OPENSSL_ROOT_DIR}/bin/ + DESTINATION bin + FILES_MATCHING + PATTERN "*.dll") + else () + message(WARNING "Unable to find OpenSSL dlls.") + endif () + endif () + + else () + message(WARNING "Unable to find executable windeployqt.") + endif () +endif () + +# macdeployqt +if (APPLE) +# Code signing settings - optional, set to empty string to skip signing + set(CODE_SIGN_IDENTITY "" CACHE STRING "Code signing identity (leave empty to skip signing)") + set(DMG_SIGN_IDENTITY "" CACHE STRING "DMG signing identity (leave empty to skip signing)") + # Custom target to create DMG (signed or unsigned) + add_custom_target(create_dmg + COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/../packaging/macos/create_dmg.sh + "${CMAKE_CURRENT_BINARY_DIR}/Flameshot.app" + "${CMAKE_CURRENT_BINARY_DIR}/Flameshot-${PROJECT_VERSION}.dmg" + "${CODE_SIGN_IDENTITY}" + "${DMG_SIGN_IDENTITY}" + DEPENDS flameshot + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Creating DMG" + VERBATIM + ) + +# Always sign the app bundle (either with identity or ad hoc) + if(CODE_SIGN_IDENTITY AND NOT CODE_SIGN_IDENTITY STREQUAL "") + # Identity-based signing (requires Developer ID) + add_custom_command(TARGET flameshot POST_BUILD + COMMAND codesign --force --deep --sign "${CODE_SIGN_IDENTITY}" + --options runtime --timestamp "$" + COMMENT "Code signing app bundle with ${CODE_SIGN_IDENTITY}" + ) + else() + # Ad hoc signing + add_custom_command(TARGET flameshot POST_BUILD + COMMAND codesign --force --deep --sign - "$" + COMMENT "Ad hoc code signing app bundle (no identity required)" + ) + endif() + # Deploy Qt libraries and dependencies + find_program(MACDEPLOYQT_EXECUTABLE macdeployqt HINTS ${Qt6_DIR}/../../../bin) + + if(MACDEPLOYQT_EXECUTABLE) + add_custom_command(TARGET flameshot POST_BUILD + COMMAND ${MACDEPLOYQT_EXECUTABLE} "$" -verbose=2 + COMMENT "Deploying Qt libraries" + ) + + # Re-sign after macdeployqt (it modifies the bundle) + if(CODE_SIGN_IDENTITY AND NOT CODE_SIGN_IDENTITY STREQUAL "") + add_custom_command(TARGET flameshot POST_BUILD + COMMAND codesign --force --deep --sign "${CODE_SIGN_IDENTITY}" + --options runtime --timestamp "$" + COMMENT "Re-signing app bundle after Qt deployment" + ) + else() + add_custom_command(TARGET flameshot POST_BUILD + COMMAND codesign --force --deep --sign - "$" + COMMENT "Re-signing app bundle after Qt deployment (ad hoc)" + ) + endif() + else() + message(WARNING "macdeployqt not found. App may not run on systems without Qt installed.") + endif() + + +endif () diff --git a/src/cli/CMakeLists.txt b/src/cli/CMakeLists.txt new file mode 100644 index 0000000..5be613a --- /dev/null +++ b/src/cli/CMakeLists.txt @@ -0,0 +1 @@ +target_sources(flameshot PRIVATE commandlineparser.cpp commandoption.cpp commandargument.cpp) diff --git a/src/cli/commandargument.cpp b/src/cli/commandargument.cpp new file mode 100644 index 0000000..dd79198 --- /dev/null +++ b/src/cli/commandargument.cpp @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "commandargument.h" + +#include + +CommandArgument::CommandArgument() = default; + +CommandArgument::CommandArgument(QString name, QString description) + : m_name(std::move(name)) + , m_description(std::move(description)) +{} + +void CommandArgument::setName(const QString& name) +{ + m_name = name; +} + +QString CommandArgument::name() const +{ + return m_name; +} + +void CommandArgument::setDescription(const QString& description) +{ + m_description = description; +} + +QString CommandArgument::description() const +{ + return m_description; +} + +bool CommandArgument::isRoot() const +{ + return m_name.isEmpty() && m_description.isEmpty(); +} + +bool CommandArgument::operator==(const CommandArgument& arg) const +{ + return m_description == arg.m_description && m_name == arg.m_name; +} diff --git a/src/cli/commandargument.h b/src/cli/commandargument.h new file mode 100644 index 0000000..14f1f90 --- /dev/null +++ b/src/cli/commandargument.h @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include + +class CommandArgument +{ +public: + CommandArgument(); + explicit CommandArgument(QString name, QString description); + + void setName(const QString& name); + QString name() const; + + void setDescription(const QString& description); + QString description() const; + + bool isRoot() const; + + bool operator==(const CommandArgument& arg) const; + +private: + QString m_name; + QString m_description; +}; diff --git a/src/cli/commandlineparser.cpp b/src/cli/commandlineparser.cpp new file mode 100644 index 0000000..c48908e --- /dev/null +++ b/src/cli/commandlineparser.cpp @@ -0,0 +1,409 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "commandlineparser.h" +#include "abstractlogger.h" +#include "src/utils/globalvalues.h" +#include +#include + +CommandLineParser::CommandLineParser() + : m_description(qApp->applicationName()) +{} + +namespace { + +AbstractLogger out = + AbstractLogger::info(AbstractLogger::Stdout).enableMessageHeader(false); +AbstractLogger err = AbstractLogger::error(AbstractLogger::Stderr); + +auto versionOption = + CommandOption({ "v", "version" }, + QStringLiteral("Displays version information")); +auto helpOption = + CommandOption({ "h", "help" }, QStringLiteral("Displays this help")); + +QString optionsToString(const QList& options, + const QList& subcommands) +{ + int size = 0; // track the largest size + QStringList dashedOptionList; + // save the dashed options and its size in order to print the description + // of every option at the same horizontal character position. + for (auto const& option : options) { + QStringList dashedOptions = option.dashedNames(); + QString joinedDashedOptions = dashedOptions.join(QStringLiteral(", ")); + if (!option.valueName().isEmpty()) { + joinedDashedOptions += + QStringLiteral(" <%1>").arg(option.valueName()); + } + if (joinedDashedOptions.length() > size) { + size = joinedDashedOptions.length(); + } + dashedOptionList << joinedDashedOptions; + } + // check the length of the subcommands + for (auto const& subcommand : subcommands) { + if (subcommand.name().length() > size) { + size = subcommand.name().length(); + } + } + // generate the text + QString result; + if (!dashedOptionList.isEmpty()) { + result += QObject::tr("Options") + ":\n"; + QString linePadding = + QStringLiteral(" ").repeated(size + 4).prepend("\n"); + for (int i = 0; i < options.length(); ++i) { + result += QStringLiteral(" %1 %2\n") + .arg(dashedOptionList.at(i).leftJustified(size, ' '), + options.at(i).description().replace( + QLatin1String("\n"), linePadding)); + } + if (!subcommands.isEmpty()) { + result += QLatin1String("\n"); + } + } + if (!subcommands.isEmpty()) { + result += QObject::tr("Subcommands") + ":\n"; + } + for (const auto& subcommand : subcommands) { + result += QStringLiteral(" %1 %2\n") + .arg(subcommand.name().leftJustified(size, ' '), + subcommand.description()); + } + return result; +} + +} // unnamed namespace + +bool CommandLineParser::processArgs(const QStringList& args, + QStringList::const_iterator& actualIt, + Node*& actualNode) +{ + QString argument = *actualIt; + bool ok = true; + bool isValidArg = false; + for (Node& n : actualNode->subNodes) { + if (n.argument.name() == argument) { + actualNode = &n; + isValidArg = true; + break; + } + } + if (isValidArg) { + auto nextArg = actualNode->argument; + m_foundArgs.append(nextArg); + // check next is help + ++actualIt; + ok = processIfOptionIsHelp(args, actualIt, actualNode); + --actualIt; + } else { + ok = false; + err << QStringLiteral("'%1' is not a valid argument.").arg(argument); + } + return ok; +} + +bool CommandLineParser::processOptions(const QStringList& args, + QStringList::const_iterator& actualIt, + Node* const actualNode) +{ + QString arg = *actualIt; + bool ok = true; + // track values + int equalsPos = arg.indexOf(QLatin1String("=")); + QString valueStr; + if (equalsPos != -1) { + valueStr = arg.mid(equalsPos + 1); // right + arg = arg.mid(0, equalsPos); // left + } + // check format -x --xx... + bool isDoubleDashed = arg.startsWith(QLatin1String("--")); + ok = isDoubleDashed ? arg.length() > 3 : arg.length() == 2; + if (!ok) { + err << QStringLiteral("the option %1 has a wrong format.").arg(arg); + return ok; + } + arg = isDoubleDashed ? arg.remove(0, 2) : arg.remove(0, 1); + // get option + auto endIt = actualNode->options.cend(); + auto optionIt = endIt; + for (auto i = actualNode->options.cbegin(); i != endIt; ++i) { + if ((*i).names().contains(arg)) { + optionIt = i; + break; + } + } + if (optionIt == endIt) { + QString argName = actualNode->argument.name(); + if (argName.isEmpty()) { + argName = qApp->applicationName(); + } + err << QStringLiteral("the option '%1' is not a valid option " + "for the argument '%2'.") + .arg(arg, argName); + ok = false; + return ok; + } + // check presence of values + CommandOption option = *optionIt; + bool requiresValue = !(option.valueName().isEmpty()); + if (!requiresValue && equalsPos != -1) { + err << QStringLiteral("the option '%1' contains a '=' and it doesn't " + "require a value.") + .arg(arg); + ok = false; + return ok; + } else if (requiresValue && valueStr.isEmpty()) { + // find in the next + if (actualIt + 1 != args.cend()) { + ++actualIt; + } else { + err << QStringLiteral("Expected value after the option '%1'.") + .arg(arg); + ok = false; + return ok; + } + valueStr = *actualIt; + } + // check the value correctness + if (requiresValue) { + ok = option.checkValue(valueStr); + if (!ok) { + QString msg = option.errorMsg(); + if (!msg.endsWith(QLatin1String("."))) { + msg += QLatin1String("."); + } + err << msg; + return ok; + } + option.setValue(valueStr); + } + m_foundOptions.append(option); + return ok; +} + +bool CommandLineParser::parse(const QStringList& args) +{ + m_foundArgs.clear(); + m_foundOptions.clear(); + bool ok = true; + Node* actualNode = &m_parseTree; + auto it = ++args.cbegin(); + // check version option + QStringList dashedVersion = versionOption.dashedNames(); + if (m_withVersion && args.length() > 1 && + dashedVersion.contains(args.at(1))) { + if (args.length() == 2) { + printVersion(); + m_foundOptions << versionOption; + } else { + err << "Invalid arguments after the version option."; + ok = false; + } + return ok; + } + // check help option + ok = processIfOptionIsHelp(args, it, actualNode); + // process the other args + for (; it != args.cend() && ok; ++it) { + const QString& val = *it; + if (val.startsWith(QLatin1String("-"))) { + ok = processOptions(args, it, actualNode); + + } else { + ok = processArgs(args, it, actualNode); + } + } + if (!ok && !m_generalErrorMessage.isEmpty()) { + err.enableMessageHeader(false); + err << m_generalErrorMessage; + err.enableMessageHeader(true); + } + return ok; +} + +CommandOption CommandLineParser::addVersionOption() +{ + m_withVersion = true; + return versionOption; +} + +CommandOption CommandLineParser::addHelpOption() +{ + m_withHelp = true; + return helpOption; +} + +bool CommandLineParser::AddArgument(const CommandArgument& arg, + const CommandArgument& parent) +{ + bool res = true; + Node* n = findParent(parent); + if (n == nullptr) { + res = false; + } else { + Node child; + child.argument = arg; + n->subNodes.append(child); + } + return res; +} + +bool CommandLineParser::AddOption(const CommandOption& option, + const CommandArgument& parent) +{ + bool res = true; + Node* n = findParent(parent); + if (n == nullptr) { + res = false; + } else { + n->options.append(option); + } + return res; +} + +bool CommandLineParser::AddOptions(const QList& options, + const CommandArgument& parent) +{ + bool res = true; + for (auto const& option : options) { + if (!AddOption(option, parent)) { + res = false; + break; + } + } + return res; +} + +void CommandLineParser::setGeneralErrorMessage(const QString& msg) +{ + m_generalErrorMessage = msg; +} + +void CommandLineParser::setDescription(const QString& description) +{ + m_description = description; +} + +bool CommandLineParser::isSet(const CommandArgument& arg) const +{ + return m_foundArgs.contains(arg); +} + +bool CommandLineParser::isSet(const CommandOption& option) const +{ + return m_foundOptions.contains(option); +} + +QString CommandLineParser::value(const CommandOption& option) const +{ + QString value = option.value(); + for (const CommandOption& fOption : m_foundOptions) { + if (option == fOption) { + value = fOption.value(); + break; + } + } + return value; +} + +void CommandLineParser::printVersion() +{ + out << GlobalValues::versionInfo(); +} + +void CommandLineParser::printHelp(QStringList args, const Node* node) +{ + args.removeLast(); // remove the help, it's always the last + QString helpText; + + // add usage info + QString argName = node->argument.name(); + if (argName.isEmpty()) { + argName = qApp->applicationName(); + } + QString argText = + node->subNodes.isEmpty() ? "" : "[" + QObject::tr("subcommands") + "]"; + helpText += (QObject::tr("Usage") + ": %1 [%2-" + QObject::tr("options") + + QStringLiteral("] %3\n\n")) + .arg(args.join(QStringLiteral(" ")), argName, argText); + + // short section about default behavior + helpText += QObject::tr("Per default runs Flameshot in the background and " + "adds a tray icon for configuration."); + helpText += "\n\n"; + + // add command options and subarguments + QList subcommands; + for (const Node& n : node->subNodes) { + subcommands.append(n.argument); + } + auto modifiedOptions = node->options; + if (m_withHelp) { + modifiedOptions << helpOption; + } + if (m_withVersion && node == &m_parseTree) { + modifiedOptions << versionOption; + } + helpText += optionsToString(modifiedOptions, subcommands); + // print it + out << helpText; +} + +CommandLineParser::Node* CommandLineParser::findParent( + const CommandArgument& parent) +{ + if (parent == CommandArgument()) { + return &m_parseTree; + } + // find the parent in the subNodes recursively + Node* res = nullptr; + for (auto& subNode : m_parseTree.subNodes) { + res = recursiveParentSearch(parent, subNode); + if (res != nullptr) { + break; + } + } + return res; +} + +CommandLineParser::Node* CommandLineParser::recursiveParentSearch( + const CommandArgument& parent, + Node& node) const +{ + Node* res = nullptr; + if (node.argument == parent) { + res = &node; + } else { + for (auto& subNode : node.subNodes) { + res = recursiveParentSearch(parent, subNode); + if (res != nullptr) { + break; + } + } + } + return res; +} + +bool CommandLineParser::processIfOptionIsHelp( + const QStringList& args, + QStringList::const_iterator& actualIt, + Node*& actualNode) +{ + bool ok = true; + auto dashedHelpNames = helpOption.dashedNames(); + if (m_withHelp && actualIt != args.cend() && + dashedHelpNames.contains(*actualIt)) { + if (actualIt + 1 == args.cend()) { + m_foundOptions << helpOption; + printHelp(args, actualNode); + actualIt++; + } else { + err << "Invalid arguments after the help option."; + ok = false; + } + } + return ok; +} diff --git a/src/cli/commandlineparser.h b/src/cli/commandlineparser.h new file mode 100644 index 0000000..9e13f8e --- /dev/null +++ b/src/cli/commandlineparser.h @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/cli/commandargument.h" +#include "src/cli/commandoption.h" +#include + +class CommandLineParser +{ +public: + CommandLineParser(); + + bool parse(const QStringList& args); + + CommandArgument rootArgument() const { return CommandArgument(); } + + CommandOption addVersionOption(); + CommandOption addHelpOption(); + + bool AddArgument(const CommandArgument& arg, + const CommandArgument& parent = CommandArgument()); + + bool AddOption(const CommandOption& option, + const CommandArgument& parent = CommandArgument()); + + bool AddOptions(const QList& options, + const CommandArgument& parent = CommandArgument()); + + void setGeneralErrorMessage(const QString& msg); + void setDescription(const QString& description); + + bool isSet(const CommandArgument& arg) const; + bool isSet(const CommandOption& option) const; + QString value(const CommandOption& option) const; + +private: + bool m_withHelp = false; + bool m_withVersion = false; + QString m_description; + QString m_generalErrorMessage; + + struct Node + { + explicit Node(const CommandArgument& arg) + : argument(arg) + {} + Node() {} + bool operator==(const Node& n) const + { + return argument == n.argument && options == n.options && + subNodes == n.subNodes; + } + CommandArgument argument; + QList options; + QList subNodes; + }; + + Node m_parseTree; + QList m_foundOptions; + QList m_foundArgs; + + // helper functions + void printVersion(); + void printHelp(QStringList args, const Node* node); + Node* findParent(const CommandArgument& parent); + Node* recursiveParentSearch(const CommandArgument& parent, + Node& node) const; + bool processIfOptionIsHelp(const QStringList& args, + QStringList::const_iterator& actualIt, + Node*& actualNode); + bool processArgs(const QStringList& args, + QStringList::const_iterator& actualIt, + Node*& actualNode); + bool processOptions(const QStringList& args, + QStringList::const_iterator& actualIt, + Node* const actualNode); +}; diff --git a/src/cli/commandoption.cpp b/src/cli/commandoption.cpp new file mode 100644 index 0000000..d990ef1 --- /dev/null +++ b/src/cli/commandoption.cpp @@ -0,0 +1,114 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "commandoption.h" + +#include + +CommandOption::CommandOption(const QString& name, + QString description, + QString valueName, + QString defaultValue) + : m_names(name) + , m_description(std::move(description)) + , m_valueName(std::move(valueName)) + , m_value(std::move(defaultValue)) +{ + m_checker = [](QString const&) { return true; }; +} + +CommandOption::CommandOption(QStringList names, + QString description, + QString valueName, + QString defaultValue) + : m_names(std::move(names)) + , m_description(std::move(description)) + , m_valueName(std::move(valueName)) + , m_value(std::move(defaultValue)) +{ + m_checker = [](QString const&) -> bool { return true; }; +} + +void CommandOption::setName(const QString& name) +{ + m_names = QStringList() << name; +} + +void CommandOption::setNames(const QStringList& names) +{ + m_names = names; +} + +QStringList CommandOption::names() const +{ + return m_names; +} + +QStringList CommandOption::dashedNames() const +{ + QStringList dashedNames; + for (const QString& name : m_names) { + // prepend "-" to single character options, and "--" to the others + QString dashedName = (name.length() == 1) + ? QStringLiteral("-%1").arg(name) + : QStringLiteral("--%1").arg(name); + dashedNames << dashedName; + } + return dashedNames; +} + +void CommandOption::setValueName(const QString& name) +{ + m_valueName = name; +} + +QString CommandOption::valueName() const +{ + return m_valueName; +} + +void CommandOption::setValue(const QString& value) +{ + if (m_valueName.isEmpty()) { + m_valueName = QLatin1String("value"); + } + m_value = value; +} + +QString CommandOption::value() const +{ + return m_value; +} + +void CommandOption::addChecker(const function checker, + const QString& errMsg) +{ + m_checker = checker; + m_errorMsg = errMsg; +} + +bool CommandOption::checkValue(const QString& value) const +{ + return m_checker(value); +} + +QString CommandOption::description() const +{ + return m_description; +} + +void CommandOption::setDescription(const QString& description) +{ + m_description = description; +} + +QString CommandOption::errorMsg() const +{ + return m_errorMsg; +} + +bool CommandOption::operator==(const CommandOption& option) const +{ + return m_description == option.m_description && m_names == option.m_names && + m_valueName == option.m_valueName; +} diff --git a/src/cli/commandoption.h b/src/cli/commandoption.h new file mode 100644 index 0000000..990ddde --- /dev/null +++ b/src/cli/commandoption.h @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include +#include + +using std::function; + +class CommandOption +{ +public: + CommandOption(const QString& name, + QString description, + QString valueName = QString(), + QString defaultValue = QString()); + + CommandOption(QStringList names, + QString description, + QString valueName = QString(), + QString defaultValue = QString()); + + void setName(const QString& name); + void setNames(const QStringList& names); + QStringList names() const; + QStringList dashedNames() const; + + void setValueName(const QString& name); + QString valueName() const; + + void setValue(const QString& value); + QString value() const; + + void addChecker(const function checker, + const QString& errMsg); + bool checkValue(const QString& value) const; + + QString description() const; + void setDescription(const QString& description); + + QString errorMsg() const; + + bool operator==(const CommandOption& option) const; + +private: + QStringList m_names; + QString m_description; + QString m_valueName; + QString m_value; + + function m_checker; + QString m_errorMsg; +}; diff --git a/src/config/CMakeLists.txt b/src/config/CMakeLists.txt new file mode 100644 index 0000000..eb9ae90 --- /dev/null +++ b/src/config/CMakeLists.txt @@ -0,0 +1,20 @@ +target_sources( + flameshot + PRIVATE buttonlistview.cpp + cacheutils.cpp + clickablelabel.cpp + colorpickereditmode.cpp + colorpickereditor.cpp + configerrordetails.cpp + configresolver.cpp + configwindow.cpp + extendedslider.cpp + filenameeditor.cpp + generalconf.cpp + setshortcutwidget.cpp + shortcutswidget.cpp + strftimechooserwidget.cpp + styleoverride.cpp + uicoloreditor.cpp + visualseditor.cpp +) diff --git a/src/config/buttonlistview.cpp b/src/config/buttonlistview.cpp new file mode 100644 index 0000000..6d042f0 --- /dev/null +++ b/src/config/buttonlistview.cpp @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "buttonlistview.h" +#include "src/tools/toolfactory.h" +#include "src/utils/confighandler.h" +#include +#include + +ButtonListView::ButtonListView(QWidget* parent) + : QListWidget(parent) +{ + setMouseTracking(true); + setFlow(QListWidget::TopToBottom); + initButtonList(); + updateComponents(); + connect( + this, &QListWidget::itemClicked, this, &ButtonListView::reverseItemCheck); +} + +void ButtonListView::initButtonList() +{ + ToolFactory factory; + auto listTypes = CaptureToolButton::getIterableButtonTypes(); + + for (const CaptureTool::Type t : listTypes) { + CaptureTool* tool = factory.CreateTool(t); + + // add element to the local map + m_buttonTypeByName.insert(tool->name(), t); + + // init the menu option + auto* m_buttonItem = new QListWidgetItem(this); + + // when the background is lighter than gray, it uses the white icons + QColor bgColor = this->palette().color(QWidget::backgroundRole()); + m_buttonItem->setIcon(tool->icon(bgColor, false)); + + m_buttonItem->setFlags(Qt::ItemIsUserCheckable); + QColor foregroundColor = + this->palette().color(QWidget::foregroundRole()); + m_buttonItem->setForeground(foregroundColor); + + m_buttonItem->setText(tool->name()); + m_buttonItem->setToolTip(tool->description()); + tool->deleteLater(); + } +} + +void ButtonListView::updateActiveButtons(QListWidgetItem* item) +{ + CaptureTool::Type bType = m_buttonTypeByName[item->text()]; + if (item->checkState() == Qt::Checked) { + m_listButtons.append(bType); + // TODO refactor so we don't need external sorts + using bt = CaptureTool::Type; + std::sort(m_listButtons.begin(), m_listButtons.end(), [](bt a, bt b) { + return CaptureToolButton::getPriorityByButton(a) < + CaptureToolButton::getPriorityByButton(b); + }); + } else { + m_listButtons.removeOne(bType); + } + ConfigHandler().setButtons(m_listButtons); +} + +void ButtonListView::reverseItemCheck(QListWidgetItem* item) +{ + if (item->checkState() == Qt::Checked) { + item->setCheckState(Qt::Unchecked); + } else { + item->setCheckState(Qt::Checked); + } + updateActiveButtons(item); +} + +void ButtonListView::selectAll() +{ + ConfigHandler().setAllTheButtons(); + for (int i = 0; i < this->count(); ++i) { + QListWidgetItem* item = this->item(i); + item->setCheckState(Qt::Checked); + } +} + +void ButtonListView::updateComponents() +{ + m_listButtons = ConfigHandler().buttons(); + auto listTypes = CaptureToolButton::getIterableButtonTypes(); + for (int i = 0; i < this->count(); ++i) { + QListWidgetItem* item = this->item(i); + auto elem = static_cast(listTypes.at(i)); + if (m_listButtons.contains(elem)) { + item->setCheckState(Qt::Checked); + } else { + item->setCheckState(Qt::Unchecked); + } + } +} diff --git a/src/config/buttonlistview.h b/src/config/buttonlistview.h new file mode 100644 index 0000000..f7b47bb --- /dev/null +++ b/src/config/buttonlistview.h @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/widgets/capture/capturetoolbutton.h" +#include + +class ButtonListView : public QListWidget +{ +public: + explicit ButtonListView(QWidget* parent = nullptr); + +public slots: + void selectAll(); + void updateComponents(); + +private slots: + void reverseItemCheck(QListWidgetItem*); + +protected: + void initButtonList(); + +private: + QList m_listButtons; + QMap m_buttonTypeByName; + + void updateActiveButtons(QListWidgetItem*); +}; diff --git a/src/config/cacheutils.cpp b/src/config/cacheutils.cpp new file mode 100644 index 0000000..a5a60ef --- /dev/null +++ b/src/config/cacheutils.cpp @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2021 Jeremy Borgman + +#include "cacheutils.h" +#include +#include +#include +#include +#include +#include + +QString getCachePath() +{ + auto cachePath = + QStandardPaths::writableLocation(QStandardPaths::CacheLocation); + if (!QDir(cachePath).exists()) { + QDir().mkpath(cachePath); + } + return cachePath; +} + +void setLastRegion(QRect const& newRegion) +{ + auto cachePath = getCachePath() + "/region.txt"; + + QFile file(cachePath); + if (file.open(QIODevice::WriteOnly)) { + QDataStream out(&file); + out << newRegion; + file.close(); + } +} + +QRect getLastRegion() +{ + auto cachePath = getCachePath() + "/region.txt"; + QFile file(cachePath); + + QRect lastRegion; + if (file.open(QIODevice::ReadOnly)) { + QDataStream input(&file); + input >> lastRegion; + file.close(); + } else { + lastRegion = QRect(0, 0, 0, 0); + } + + return lastRegion; +} diff --git a/src/config/cacheutils.h b/src/config/cacheutils.h new file mode 100644 index 0000000..96413a2 --- /dev/null +++ b/src/config/cacheutils.h @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2021 Jeremy Borgman + +#ifndef FLAMESHOT_CACHEUTILS_H +#define FLAMESHOT_CACHEUTILS_H + +class QString; +class QRect; + +QString getCachePath(); +QRect getLastRegion(); +void setLastRegion(QRect const& newRegion); + +#endif // FLAMESHOT_CACHEUTILS_H diff --git a/src/config/clickablelabel.cpp b/src/config/clickablelabel.cpp new file mode 100644 index 0000000..be82764 --- /dev/null +++ b/src/config/clickablelabel.cpp @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "clickablelabel.h" + +ClickableLabel::ClickableLabel(QWidget* parent) + : QLabel(parent) +{} + +ClickableLabel::ClickableLabel(const QString& s, QWidget* parent) + : QLabel(parent) +{ + setText(s); +} + +void ClickableLabel::mousePressEvent(QMouseEvent*) +{ + emit clicked(); +} diff --git a/src/config/clickablelabel.h b/src/config/clickablelabel.h new file mode 100644 index 0000000..c5e6f33 --- /dev/null +++ b/src/config/clickablelabel.h @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include + +class ClickableLabel : public QLabel +{ + Q_OBJECT +public: + explicit ClickableLabel(QWidget* parent = nullptr); + ClickableLabel(const QString& s, QWidget* parent = nullptr); + +signals: + void clicked(); + +private: + void mousePressEvent(QMouseEvent*); +}; diff --git a/src/config/colorpickereditmode.cpp b/src/config/colorpickereditmode.cpp new file mode 100644 index 0000000..3a39382 --- /dev/null +++ b/src/config/colorpickereditmode.cpp @@ -0,0 +1,106 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2022 Dearsh Oberoi + +#include "colorpickereditmode.h" + +#include +#include + +ColorPickerEditMode::ColorPickerEditMode(QWidget* parent) + : ColorPickerWidget(parent) +{ + m_isPressing = false; + m_isDragging = false; + installEventFilter(this); +} + +bool ColorPickerEditMode::eventFilter(QObject* obj, QEvent* event) +{ + auto widget = static_cast(obj); + + switch (event->type()) { + case QEvent::MouseButtonPress: { + auto mouseEvent = static_cast(event); + + if (mouseEvent->button() == Qt::LeftButton) { + m_mousePressPos = mouseEvent->pos(); + m_mouseMovePos = m_mousePressPos; + + for (int i = 1; i < m_colorList.size(); ++i) { + if (m_colorAreaList.at(i).contains(m_mousePressPos)) { + m_isPressing = true; + m_draggedPresetInitialPos = + m_colorAreaList[i].topLeft(); + m_selectedIndex = i; + update(m_colorAreaList.at(i) + + QMargins(10, 10, 10, 10)); + update(m_colorAreaList.at(m_lastIndex) + + QMargins(10, 10, 10, 10)); + m_lastIndex = i; + emit colorSelected(m_selectedIndex); + break; + } + } + } + } break; + case QEvent::MouseMove: { + auto mouseEvent = static_cast(event); + + if (m_isPressing) { + QPoint eventPos = mouseEvent->pos(); + QPoint diff = eventPos - m_mouseMovePos; + m_colorAreaList[m_selectedIndex].translate(diff); + widget->update(); + + if (!m_isDragging) { + QPoint totalMovedDiff = eventPos - m_mousePressPos; + if (totalMovedDiff.manhattanLength() > 3) { + m_isDragging = true; + } + } + + m_mouseMovePos = eventPos; + } + } break; + case QEvent::MouseButtonRelease: { + m_isPressing = false; + if (m_isDragging) { + QPoint draggedPresetCenter = + m_colorAreaList[m_selectedIndex].center(); + m_isDragging = false; + + bool swapped = false; + + for (int i = 1; i < m_colorList.size(); ++i) { + if (i != m_selectedIndex && + m_colorAreaList.at(i).contains(draggedPresetCenter)) { + // swap colors + QColor temp = m_colorList[i]; + m_colorList[i] = m_colorList[m_selectedIndex]; + m_colorList[m_selectedIndex] = temp; + m_config.setUserColors(m_colorList); + + m_colorAreaList[m_selectedIndex].moveTo( + m_draggedPresetInitialPos); + m_selectedIndex = i; + widget->update(); + m_lastIndex = i; + emit presetsSwapped(m_selectedIndex); + swapped = true; + break; + } + } + + if (!swapped) { + m_colorAreaList[m_selectedIndex].moveTo( + m_draggedPresetInitialPos); + widget->update(); + } + } + } break; + default: + break; + } + + return QObject::eventFilter(obj, event); +} diff --git a/src/config/colorpickereditmode.h b/src/config/colorpickereditmode.h new file mode 100644 index 0000000..9d53e9c --- /dev/null +++ b/src/config/colorpickereditmode.h @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2022 Dearsh Oberoi + +#pragma once + +#include "src/utils/confighandler.h" +#include "src/widgets/colorpickerwidget.h" + +class ColorPickerEditMode : public ColorPickerWidget +{ + Q_OBJECT +public: + explicit ColorPickerEditMode(QWidget* parent = nullptr); + +signals: + void colorSelected(int index); + void presetsSwapped(int index); + +private: + bool eventFilter(QObject* obj, QEvent* event) override; + + bool m_isPressing = false; + bool m_isDragging = false; + QPoint m_mouseMovePos; + QPoint m_mousePressPos; + QPoint m_draggedPresetInitialPos; + ConfigHandler m_config; +}; diff --git a/src/config/colorpickereditor.cpp b/src/config/colorpickereditor.cpp new file mode 100644 index 0000000..217d277 --- /dev/null +++ b/src/config/colorpickereditor.cpp @@ -0,0 +1,217 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2022 Dearsh Oberoi + +#include "colorpickereditor.h" +#include "colorpickereditmode.h" +#include "src/utils/globalvalues.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +ColorPickerEditor::ColorPickerEditor(QWidget* parent) + : QWidget(parent) + , m_selectedIndex(1) +{ + m_color = m_config.drawColor(); + m_colorList = m_config.userColors(); + + m_gLayout = new QGridLayout(this); + + m_colorpicker = new ColorPickerEditMode(this); + m_gLayout->addWidget(m_colorpicker, 0, 0); + + m_colorWheel = new color_widgets::ColorWheel(this); + m_colorWheel->setColor(m_color); + const int size = GlobalValues::buttonBaseSize() * 3.5; + m_colorWheel->setMinimumSize(size, size); + m_gLayout->addWidget(m_colorWheel, 1, 0); + + auto* m_vLocalLayout1 = new QVBoxLayout(); + m_vLocalLayout1->addStretch(); + + m_colorEditLabel = new QLabel(tr("Edit Preset:"), this); + m_vLocalLayout1->addWidget(m_colorEditLabel); + + m_colorEdit = new QLineEdit(this); + m_colorEdit->setText(m_colorList[m_selectedIndex].name(QColor::HexRgb)); + m_colorEdit->setToolTip(tr("Enter color to update preset")); + connect(m_colorpicker, + &ColorPickerEditMode::colorSelected, + this, + [this](int index) { + m_selectedIndex = index; + m_colorEdit->setText( + m_colorList[m_selectedIndex].name(QColor::HexRgb)); + }); + connect(m_colorpicker, + &ColorPickerEditMode::presetsSwapped, + this, + [this](int index) { + m_selectedIndex = index; + m_colorList = m_config.userColors(); + m_colorEdit->setText( + m_colorList[m_selectedIndex].name(QColor::HexRgb)); + }); + m_vLocalLayout1->addWidget(m_colorEdit); + + m_updatePresetButton = new QPushButton(tr("Update"), this); + m_updatePresetButton->setToolTip( + tr("Press button to update the selected preset")); + connect(m_updatePresetButton, + &QPushButton::pressed, + this, + &ColorPickerEditor::onUpdatePreset); + m_vLocalLayout1->addWidget(m_updatePresetButton); + + m_deletePresetButton = new QPushButton(tr("Delete"), this); + m_deletePresetButton->setToolTip( + tr("Press button to delete the selected preset")); + connect(m_deletePresetButton, + &QPushButton::pressed, + this, + &ColorPickerEditor::onDeletePreset); + m_vLocalLayout1->addWidget(m_deletePresetButton); + + m_vLocalLayout1->addStretch(); + + m_gLayout->addLayout(m_vLocalLayout1, 0, 1); + + auto* m_vLocalLayout2 = new QVBoxLayout(); + m_vLocalLayout2->addStretch(); + + m_addPresetLabel = new QLabel(tr("Add Preset:"), this); + m_vLocalLayout2->addWidget(m_addPresetLabel); + + m_colorInput = new QLineEdit(this); + m_colorInput->setText(m_color.name(QColor::HexRgb)); + m_colorInput->setToolTip( + tr("Enter color manually or select it using the color-wheel")); + connect(m_colorWheel, + &color_widgets::ColorWheel::colorSelected, + this, + [=, this](QColor c) { + m_color = c; + m_colorInput->setText(m_color.name(QColor::HexRgb)); + }); + m_vLocalLayout2->addWidget(m_colorInput); + + m_addPresetButton = new QPushButton(tr("Add"), this); + m_addPresetButton->setToolTip(tr("Press button to add preset")); + connect(m_addPresetButton, + &QPushButton::pressed, + this, + &ColorPickerEditor::onAddPreset); + m_vLocalLayout2->addWidget(m_addPresetButton); + + m_vLocalLayout2->addStretch(); + + m_gLayout->addLayout(m_vLocalLayout2, 1, 1); +} + +void ColorPickerEditor::addPreset() +{ + if (m_colorList.contains(m_color)) { + return; + } + + const int maxPresetsAllowed = 17; + + if (m_colorList.size() >= maxPresetsAllowed) { + QMessageBox::critical( + this, + tr("Error"), + tr("Unable to add preset. Maximum limit reached.")); + return; + } + + m_colorList << m_color; + + m_config.setUserColors(m_colorList); +} + +void ColorPickerEditor::deletePreset() +{ + const int minPresetsAllowed = 3; + + if (m_colorList.size() <= minPresetsAllowed) { + QMessageBox::critical( + this, + tr("Error"), + tr("Unable to remove preset. Minimum limit reached.")); + return; + } + + m_colorList.remove(m_selectedIndex); + + m_config.setUserColors(m_colorList); +} + +void ColorPickerEditor::updatePreset() +{ + QColor c = QColor(m_colorEdit->text()); + + if (m_colorList.contains(c)) { + m_colorEdit->setText(m_colorList[m_selectedIndex].name(QColor::HexRgb)); + return; + } + + m_colorList[m_selectedIndex] = c; + + m_config.setUserColors(m_colorList); +} + +void ColorPickerEditor::onAddPreset() +{ +#if QT_VERSION < QT_VERSION_CHECK(6, 4, 0) + if (QColor::isValidColor(m_colorInput->text())) { +#else + if (QColor::isValidColorName(m_colorInput->text())) { +#endif + m_color = QColor(m_colorInput->text()); + m_colorInput->setText(m_color.name(QColor::HexRgb)); + } else { + m_colorInput->setText(m_color.name(QColor::HexRgb)); + return; + } + + addPreset(); + m_colorpicker->updateWidget(); + m_selectedIndex = 1; + m_colorpicker->updateSelection(m_selectedIndex); + m_colorEdit->setText(m_colorList[m_selectedIndex].name(QColor::HexRgb)); +} + +void ColorPickerEditor::onDeletePreset() +{ + deletePreset(); + m_colorpicker->updateWidget(); + m_selectedIndex = 1; + m_colorpicker->updateSelection(m_selectedIndex); + m_colorEdit->setText(m_colorList[m_selectedIndex].name(QColor::HexRgb)); +} + +void ColorPickerEditor::onUpdatePreset() +{ +#if QT_VERSION < QT_VERSION_CHECK(6, 4, 0) + if (QColor::isValidColor(m_colorEdit->text())) { +#else + if (QColor::isValidColorName(m_colorEdit->text())) { +#endif + QColor c = QColor(m_colorEdit->text()); + m_colorEdit->setText(c.name(QColor::HexRgb)); + } else { + m_colorEdit->setText(m_colorList[m_selectedIndex].name(QColor::HexRgb)); + return; + } + + updatePreset(); + m_colorpicker->updateWidget(); +} diff --git a/src/config/colorpickereditor.h b/src/config/colorpickereditor.h new file mode 100644 index 0000000..6a20558 --- /dev/null +++ b/src/config/colorpickereditor.h @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2022 Dearsh Oberoi + +#pragma once + +#include "QtColorWidgets/color_wheel.hpp" +#include "src/utils/confighandler.h" + +#include + +class ColorPickerEditMode; +class QLabel; +class QPushButton; +class QLineEdit; +class QColor; +class QGridLayout; + +class ColorPickerEditor : public QWidget +{ + Q_OBJECT +public: + explicit ColorPickerEditor(QWidget* parent = nullptr); + +private slots: + void onAddPreset(); + void onDeletePreset(); + void onUpdatePreset(); + +private: + void addPreset(); + void deletePreset(); + void updatePreset(); + + ColorPickerEditMode* m_colorpicker; + color_widgets::ColorWheel* m_colorWheel; + + QLabel* m_colorEditLabel; + QLineEdit* m_colorEdit; + QPushButton* m_deletePresetButton; + QPushButton* m_updatePresetButton; + + QLineEdit* m_colorInput; + QLabel* m_addPresetLabel; + QPushButton* m_addPresetButton; + + QColor m_color; + int m_selectedIndex; + QVector m_colorList; + ConfigHandler m_config; + + QGridLayout* m_gLayout; +}; diff --git a/src/config/configerrordetails.cpp b/src/config/configerrordetails.cpp new file mode 100644 index 0000000..db1a07a --- /dev/null +++ b/src/config/configerrordetails.cpp @@ -0,0 +1,42 @@ +#include "src/config/configerrordetails.h" + +#include "src/utils/abstractlogger.h" +#include "src/utils/confighandler.h" + +#include +#include +#include +#include + +ConfigErrorDetails::ConfigErrorDetails(QWidget* parent) + : QDialog(parent) +{ + // Generate error log message + QString str; + AbstractLogger stream(str, AbstractLogger::Error); + ConfigHandler().checkForErrors(&stream); + + // Set up dialog + setWindowTitle(tr("Configuration errors")); + setLayout(new QVBoxLayout(this)); + + // Add text display + auto* textDisplay = new QTextEdit(this); + textDisplay->setPlainText(str); + textDisplay->setReadOnly(true); + layout()->addWidget(textDisplay); + + // Add Ok button + using BBox = QDialogButtonBox; + BBox* buttons = new BBox(BBox::Ok); + layout()->addWidget(buttons); + connect(buttons, &BBox::clicked, this, [this]() { close(); }); + + show(); + + qApp->processEvents(); + QPoint center = geometry().center(); + QRect dialogRect(0, 0, 600, 400); + dialogRect.moveCenter(center); + setGeometry(dialogRect); +} diff --git a/src/config/configerrordetails.h b/src/config/configerrordetails.h new file mode 100644 index 0000000..cfdb490 --- /dev/null +++ b/src/config/configerrordetails.h @@ -0,0 +1,9 @@ +#include + +#pragma once + +class ConfigErrorDetails : public QDialog +{ +public: + ConfigErrorDetails(QWidget* parent = nullptr); +}; diff --git a/src/config/configresolver.cpp b/src/config/configresolver.cpp new file mode 100644 index 0000000..15c12ab --- /dev/null +++ b/src/config/configresolver.cpp @@ -0,0 +1,144 @@ +#include "src/config/configresolver.h" +#include "src/config/configerrordetails.h" +#include "src/utils/confighandler.h" + +#include "src/utils/valuehandler.h" +#include +#include +#include +#include + +ConfigResolver::ConfigResolver(QWidget* parent) + : QDialog(parent) +{ + setWindowTitle(tr("Resolve configuration errors")); + setMinimumSize({ 250, 200 }); + setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); + populate(); + connect(ConfigHandler::getInstance(), + &ConfigHandler::fileChanged, + this, + [this]() { populate(); }); +} + +QGridLayout* ConfigResolver::layout() +{ + return dynamic_cast(QDialog::layout()); +} + +void ConfigResolver::populate() +{ + ConfigHandler config; + QList unrecognized; + QList semanticallyWrong; + + config.checkUnrecognizedSettings(nullptr, &unrecognized); + config.checkSemantics(nullptr, &semanticallyWrong); + + // Remove previous layout and children, if any + resetLayout(); + + bool anyErrors = !semanticallyWrong.isEmpty() || !unrecognized.isEmpty(); + int row = 0; + + // No errors detected + if (!anyErrors) { + accept(); + } else { + layout()->addWidget( + new QLabel( + tr("You must resolve all errors before continuing:")), + 0, + 0, + 1, + 2); + ++row; + } + + // List semantically incorrect settings with a "Reset" button + for (const auto& key : semanticallyWrong) { + auto* label = new QLabel(key); + auto* reset = new QPushButton(tr("Reset")); + label->setToolTip("This setting has a bad value."); + reset->setToolTip(tr("Reset to the default value.")); + layout()->addWidget(label, row, 0); + layout()->addWidget(reset, row, 1); + reset->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + + connect(reset, &QPushButton::clicked, this, [key]() { + ConfigHandler().resetValue(key); + }); + + ++row; + } + // List unrecognized settings with a "Remove" button + for (const auto& key : unrecognized) { + auto* label = new QLabel(key); + auto* remove = new QPushButton(tr("Remove")); + label->setToolTip("This setting is unrecognized."); + remove->setToolTip(tr("Remove this setting.")); + layout()->addWidget(label, row, 0); + layout()->addWidget(remove, row, 1); + connect(remove, &QPushButton::clicked, this, [key]() { + ConfigHandler().remove(key); + }); + ++row; + } + + if (!config.checkShortcutConflicts()) { + auto* conflicts = new QLabel( + tr("Some keyboard shortcuts have conflicts.\n" + "This will NOT prevent flameshot from starting.\n" + "Please solve them manually in the configuration file.")); + conflicts->setWordWrap(true); + conflicts->setMaximumWidth(geometry().width()); + conflicts->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Maximum); + layout()->addWidget(conflicts, row, 0, 1, 2, Qt::AlignCenter); + ++row; + } + + auto* separator = new QFrame(this); + separator->setFrameShape(QFrame::HLine); + separator->setFrameShadow(QFrame::Sunken); + layout()->addWidget(separator, row, 0, 1, 2); + ++row; + + using BBox = QDialogButtonBox; + + // Add button box at the bottom + auto* buttons = new BBox(this); + layout()->addWidget(buttons, row, 0, 1, 2, Qt::AlignCenter); + if (anyErrors) { + auto* resolveAll = new QPushButton(tr("Resolve all")); + resolveAll->setToolTip(tr("Resolve all listed errors.")); + buttons->addButton(resolveAll, BBox::ResetRole); + connect(resolveAll, &QPushButton::clicked, this, [=, this]() { + for (const auto& key : semanticallyWrong) { + ConfigHandler().resetValue(key); + } + for (const auto& key : unrecognized) { + ConfigHandler().remove(key); + } + }); + } + + auto* details = new QPushButton(tr("Details")); + buttons->addButton(details, BBox::HelpRole); + connect(details, &QPushButton::clicked, this, [this]() { + (new ConfigErrorDetails(this))->exec(); + }); + + buttons->addButton(BBox::Cancel); + + connect(buttons, &BBox::rejected, this, [this]() { reject(); }); +} + +void ConfigResolver::resetLayout() +{ + for (auto* child : children()) { + child->deleteLater(); + } + delete layout(); + setLayout(new QGridLayout()); + layout()->setSizeConstraint(QLayout::SetFixedSize); +} diff --git a/src/config/configresolver.h b/src/config/configresolver.h new file mode 100644 index 0000000..a162ae5 --- /dev/null +++ b/src/config/configresolver.h @@ -0,0 +1,17 @@ +#pragma once + +#include + +class QGridLayout; + +class ConfigResolver : public QDialog +{ +public: + ConfigResolver(QWidget* parent = nullptr); + + QGridLayout* layout(); + +private: + void populate(); + void resetLayout(); +}; diff --git a/src/config/configwindow.cpp b/src/config/configwindow.cpp new file mode 100644 index 0000000..adec15d --- /dev/null +++ b/src/config/configwindow.cpp @@ -0,0 +1,165 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "configwindow.h" +#include "abstractlogger.h" +#include "src/config/configresolver.h" +#include "src/config/filenameeditor.h" +#include "src/config/generalconf.h" +#include "src/config/shortcutswidget.h" +#include "src/config/strftimechooserwidget.h" +#include "src/config/visualseditor.h" +#include "src/utils/colorutils.h" +#include "src/utils/confighandler.h" +#include "src/utils/globalvalues.h" +#include "src/utils/pathinfo.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// ConfigWindow contains the menus where you can configure the application + +ConfigWindow::ConfigWindow(QWidget* parent) + : QWidget(parent) +{ + // We wrap QTabWidget in a QWidget because of a Qt bug + auto* layout = new QVBoxLayout(this); + m_tabWidget = new QTabWidget(this); + m_tabWidget->tabBar()->setUsesScrollButtons(false); + layout->addWidget(m_tabWidget); + + setAttribute(Qt::WA_DeleteOnClose); + setWindowIcon(QIcon(GlobalValues::iconPath())); + setWindowTitle(tr("Configuration")); + + connect(ConfigHandler::getInstance(), + &ConfigHandler::fileChanged, + this, + &ConfigWindow::updateChildren); + + QColor background = this->palette().window().color(); + bool isDark = ColorUtils::colorIsDark(background); + QString modifier = + isDark ? PathInfo::whiteIconPath() : PathInfo::blackIconPath(); + + // general + m_generalConfig = new GeneralConf(); + m_generalConfigTab = new QWidget(); + auto* generalConfigLayout = new QVBoxLayout(m_generalConfigTab); + m_generalConfigTab->setLayout(generalConfigLayout); + generalConfigLayout->addWidget(m_generalConfig); + m_tabWidget->addTab( + m_generalConfigTab, QIcon(modifier + "config.svg"), tr("General")); + + // visuals + m_visuals = new VisualsEditor(); + m_visualsTab = new QWidget(); + auto* visualsLayout = new QVBoxLayout(m_visualsTab); + m_visualsTab->setLayout(visualsLayout); + visualsLayout->addWidget(m_visuals); + m_tabWidget->addTab( + m_visualsTab, QIcon(modifier + "graphics.svg"), tr("Interface")); + + // filename + m_filenameEditor = new FileNameEditor(); + m_filenameEditorTab = new QWidget(); + auto* filenameEditorLayout = new QVBoxLayout(m_filenameEditorTab); + m_filenameEditorTab->setLayout(filenameEditorLayout); + filenameEditorLayout->addWidget(m_filenameEditor); + m_tabWidget->addTab(m_filenameEditorTab, + QIcon(modifier + "name_edition.svg"), + tr("Filename Editor")); + + // shortcuts + m_shortcuts = new ShortcutsWidget(); + m_shortcutsTab = new QWidget(); + auto* shortcutsLayout = new QVBoxLayout(m_shortcutsTab); + m_shortcutsTab->setLayout(shortcutsLayout); + shortcutsLayout->addWidget(m_shortcuts); + m_tabWidget->addTab( + m_shortcutsTab, QIcon(modifier + "shortcut.svg"), tr("Shortcuts")); + + // connect update sigslots + connect(this, + &ConfigWindow::updateChildren, + m_filenameEditor, + &FileNameEditor::updateComponents); + connect(this, + &ConfigWindow::updateChildren, + m_visuals, + &VisualsEditor::updateComponents); + connect(this, + &ConfigWindow::updateChildren, + m_generalConfig, + &GeneralConf::updateComponents); + + // Error indicator (this must come last) + initErrorIndicator(m_visualsTab, m_visuals); + initErrorIndicator(m_filenameEditorTab, m_filenameEditor); + initErrorIndicator(m_generalConfigTab, m_generalConfig); + initErrorIndicator(m_shortcutsTab, m_shortcuts); +} + +void ConfigWindow::keyPressEvent(QKeyEvent* e) +{ + if (e->key() == Qt::Key_Escape) { + close(); + } +} + +void ConfigWindow::initErrorIndicator(QWidget* tab, QWidget* widget) +{ + auto* label = new QLabel(tab); + auto* btnResolve = new QPushButton(tr("Resolve"), tab); + auto* btnLayout = new QHBoxLayout(); + + // Set up label + label->setText(tr( + "Configuration file has errors. Resolve them before continuing.")); + label->setStyleSheet(QStringLiteral(":disabled { color: %1; }") + .arg(qApp->palette().color(QPalette::Text).name())); + label->setVisible(ConfigHandler().hasError()); + + // Set up "Show errors" button + btnResolve->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed); + btnLayout->addWidget(btnResolve); + btnResolve->setVisible(ConfigHandler().hasError()); + + widget->setEnabled(!ConfigHandler().hasError()); + + // Add label and button to the parent widget's layout + auto* layout = static_cast(tab->layout()); + if (layout != nullptr) { + layout->insertWidget(0, label); + layout->insertLayout(1, btnLayout); + } else { + widget->layout()->addWidget(label); + widget->layout()->addWidget(btnResolve); + } + + // Sigslots + connect( + ConfigHandler::getInstance(), &ConfigHandler::error, widget, [=, this]() { + widget->setEnabled(false); + label->show(); + btnResolve->show(); + }); + connect(ConfigHandler::getInstance(), + &ConfigHandler::errorResolved, + widget, + [=]() { + widget->setEnabled(true); + label->hide(); + btnResolve->hide(); + }); + connect(btnResolve, &QPushButton::clicked, this, [this]() { + ConfigResolver().exec(); + }); +} diff --git a/src/config/configwindow.h b/src/config/configwindow.h new file mode 100644 index 0000000..53b2e98 --- /dev/null +++ b/src/config/configwindow.h @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include + +class FileNameEditor; +class ShortcutsWidget; +class GeneralConf; +class QFileSystemWatcher; +class VisualsEditor; +class QWidget; + +class ConfigWindow : public QWidget +{ + Q_OBJECT +public: + explicit ConfigWindow(QWidget* parent = nullptr); + +signals: + void updateChildren(); + +protected: + void keyPressEvent(QKeyEvent*); + +private: + QTabWidget* m_tabWidget; + + FileNameEditor* m_filenameEditor; + QWidget* m_filenameEditorTab; + + ShortcutsWidget* m_shortcuts; + QWidget* m_shortcutsTab; + + GeneralConf* m_generalConfig; + QWidget* m_generalConfigTab; + + VisualsEditor* m_visuals; + QWidget* m_visualsTab; + + void initErrorIndicator(QWidget* tab, QWidget* widget); +}; diff --git a/src/config/extendedslider.cpp b/src/config/extendedslider.cpp new file mode 100644 index 0000000..8328d86 --- /dev/null +++ b/src/config/extendedslider.cpp @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "extendedslider.h" + +ExtendedSlider::ExtendedSlider(QWidget* parent) + : QSlider(parent) +{ + connect(this, + &ExtendedSlider::valueChanged, + this, + &ExtendedSlider::updateTooltip); + connect( + this, &ExtendedSlider::sliderMoved, this, &ExtendedSlider::fireTimer); + m_timer.setSingleShot(true); + connect( + &m_timer, &QTimer::timeout, this, &ExtendedSlider::modificationsEnded); +} + +int ExtendedSlider::mappedValue(int min, int max) +{ + qreal progress = + ((value() - minimum())) / static_cast(maximum() - minimum()); + return min + (max - min) * progress; +} + +void ExtendedSlider::setMapedValue(int min, int val, int max) +{ + qreal progress = ((val - min) + 1) / static_cast(max - min); + int value = minimum() + (maximum() - minimum()) * progress; + setValue(value); +} + +void ExtendedSlider::updateTooltip() +{ + setToolTip(QString::number(value()) + "%"); +} + +void ExtendedSlider::fireTimer() +{ + m_timer.start(500); +} diff --git a/src/config/extendedslider.h b/src/config/extendedslider.h new file mode 100644 index 0000000..ee4c2dc --- /dev/null +++ b/src/config/extendedslider.h @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include +#include + +class ExtendedSlider : public QSlider +{ + Q_OBJECT +public: + explicit ExtendedSlider(QWidget* parent = nullptr); + + int mappedValue(int min, int max); + void setMapedValue(int min, int val, int max); + +signals: + void modificationsEnded(); + +private slots: + void updateTooltip(); + void fireTimer(); + +private: + QTimer m_timer; +}; diff --git a/src/config/filenameeditor.cpp b/src/config/filenameeditor.cpp new file mode 100644 index 0000000..027b04e --- /dev/null +++ b/src/config/filenameeditor.cpp @@ -0,0 +1,119 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "filenameeditor.h" +#include "src/config/strftimechooserwidget.h" +#include "src/utils/confighandler.h" +#include "src/utils/filenamehandler.h" +#include +#include +#include +#include +#include + +FileNameEditor::FileNameEditor(QWidget* parent) + : QWidget(parent) +{ + initWidgets(); + initLayout(); +} + +void FileNameEditor::initLayout() +{ + m_layout = new QVBoxLayout(this); + auto* infoLabel = new QLabel(tr("Edit the name of your captures:"), this); + infoLabel->setFixedHeight(20); + m_layout->addWidget(infoLabel); + m_layout->addWidget(m_helperButtons); + m_layout->addWidget(new QLabel(tr("Edit:"))); + m_layout->addWidget(m_nameEditor); + m_layout->addWidget(new QLabel(tr("Preview:"))); + m_layout->addWidget(m_outputLabel); + + auto* horizLayout = new QHBoxLayout(); + horizLayout->addWidget(m_saveButton); + horizLayout->addWidget(m_resetButton); + horizLayout->addWidget(m_clearButton); + m_layout->addLayout(horizLayout); +} + +void FileNameEditor::initWidgets() +{ + m_nameHandler = new FileNameHandler(this); + + // editor + m_nameEditor = new QLineEdit(this); + m_nameEditor->setMaxLength(FileNameHandler::MAX_CHARACTERS); + + // preview + m_outputLabel = new QLineEdit(this); + m_outputLabel->setDisabled(true); + QString foreground = this->palette().windowText().color().name(); + m_outputLabel->setStyleSheet(QStringLiteral("color: %1").arg(foreground)); + QPalette pal = m_outputLabel->palette(); + QColor color = + pal.color(QPalette::Disabled, m_outputLabel->backgroundRole()); + pal.setColor(QPalette::Active, m_outputLabel->backgroundRole(), color); + m_outputLabel->setPalette(pal); + + connect(m_nameEditor, + &QLineEdit::textChanged, + this, + &FileNameEditor::showParsedPattern); + updateComponents(); + + // helper buttons + m_helperButtons = new StrftimeChooserWidget(this); + connect(m_helperButtons, + &StrftimeChooserWidget::variableEmitted, + this, + &FileNameEditor::addToNameEditor); + + // save + m_saveButton = new QPushButton(tr("Save"), this); + connect( + m_saveButton, &QPushButton::clicked, this, &FileNameEditor::savePattern); + m_saveButton->setToolTip(tr("Saves the pattern")); + // restore previous saved values + m_resetButton = new QPushButton(tr("Restore"), this); + connect( + m_resetButton, &QPushButton::clicked, this, &FileNameEditor::resetName); + m_resetButton->setToolTip(tr("Restores the saved pattern")); + // clear + m_clearButton = new QPushButton(tr("Clear"), this); + connect(m_clearButton, &QPushButton::clicked, this, [this]() { + m_nameEditor->setText(ConfigHandler().filenamePatternDefault()); + m_nameEditor->selectAll(); + m_nameEditor->setFocus(); + }); + m_clearButton->setToolTip(tr("Deletes the name")); +} + +void FileNameEditor::savePattern() +{ + QString pattern = m_nameEditor->text(); + ConfigHandler().setFilenamePattern(pattern); +} + +void FileNameEditor::showParsedPattern(const QString& p) +{ + QString output = m_nameHandler->parseFilename(p); + m_outputLabel->setText(output); +} + +void FileNameEditor::resetName() +{ + m_nameEditor->setText(ConfigHandler().filenamePattern()); +} + +void FileNameEditor::addToNameEditor(const QString& s) +{ + m_nameEditor->setText(m_nameEditor->text() + s); + m_nameEditor->setFocus(); +} + +void FileNameEditor::updateComponents() +{ + m_nameEditor->setText(ConfigHandler().filenamePattern()); + m_outputLabel->setText(m_nameHandler->parsedPattern()); +} diff --git a/src/config/filenameeditor.h b/src/config/filenameeditor.h new file mode 100644 index 0000000..04697ab --- /dev/null +++ b/src/config/filenameeditor.h @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include +#include + +class QVBoxLayout; +class QLineEdit; +class FileNameHandler; +class QPushButton; +class StrftimeChooserWidget; + +class FileNameEditor : public QWidget +{ + Q_OBJECT +public: + explicit FileNameEditor(QWidget* parent = nullptr); + +private: + QVBoxLayout* m_layout; + QLineEdit* m_outputLabel; + QLineEdit* m_nameEditor; + FileNameHandler* m_nameHandler; + StrftimeChooserWidget* m_helperButtons; + QPushButton* m_saveButton; + QPushButton* m_resetButton; + QPushButton* m_clearButton; + + void initLayout(); + void initWidgets(); + +public slots: + void addToNameEditor(const QString& s); + void updateComponents(); + +private slots: + void savePattern(); + void showParsedPattern(const QString&); + void resetName(); +}; diff --git a/src/config/generalconf.cpp b/src/config/generalconf.cpp new file mode 100644 index 0000000..91bf8c9 --- /dev/null +++ b/src/config/generalconf.cpp @@ -0,0 +1,932 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors +#include "generalconf.h" +#include "src/core/flameshot.h" +#include "src/utils/confighandler.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +GeneralConf::GeneralConf(QWidget* parent) + : QWidget(parent) + , m_historyConfirmationToDelete(nullptr) + , m_undoLimit(nullptr) +{ + m_layout = new QVBoxLayout(this); + m_layout->setAlignment(Qt::AlignTop); + + // Scroll area adapts the size of the content on small screens. + // It must be initialized before the checkboxes. + initScrollArea(); + + initAutostart(); +#if !defined(Q_OS_WIN) + initAutoCloseIdleDaemon(); +#endif + initShowTrayIcon(); + initUseGrimAdapter(); + initShowDesktopNotification(); + initShowAbortNotification(); +#if !defined(DISABLE_UPDATE_CHECKER) + initCheckForUpdates(); +#endif + initShowStartupLaunchMessage(); + initShowQuitPrompt(); + initAllowMultipleGuiInstances(); + initSaveLastRegion(); + initShowHelp(); + initShowSidePanelButton(); + initUseJpgForClipboard(); + initCopyOnDoubleClick(); + initSaveAfterCopy(); + initCopyPathAfterSave(); + initAntialiasingPinZoom(); + initUndoLimit(); + initInsecurePixelate(); +#ifdef ENABLE_IMGUR + initCopyAndCloseAfterUpload(); + initUploadWithoutConfirmation(); + initHistoryConfirmationToDelete(); + initUploadHistoryMax(); + initUploadClientSecret(); +#endif + initPredefinedColorPaletteLarge(); + initShowSelectionGeometry(); + + m_layout->addStretch(); + + initShowMagnifier(); + initSquareMagnifier(); + initJpegQuality(); + initReverseArrow(); + // this has to be at the end + initConfigButtons(); + updateComponents(); +} + +void GeneralConf::_updateComponents(bool allowEmptySavePath) +{ + ConfigHandler config; + m_helpMessage->setChecked(config.showHelp()); + m_sidePanelButton->setChecked(config.showSidePanelButton()); + m_sysNotifications->setChecked(config.showDesktopNotification()); + m_abortNotifications->setChecked(config.showAbortNotification()); + m_autostart->setChecked(config.startupLaunch()); + m_saveAfterCopy->setChecked(config.saveAfterCopy()); + m_copyPathAfterSave->setChecked(config.copyPathAfterSave()); + m_antialiasingPinZoom->setChecked(config.antialiasingPinZoom()); + m_useJpgForClipboard->setChecked(config.useJpgForClipboard()); + m_copyOnDoubleClick->setChecked(config.copyOnDoubleClick()); +#ifdef ENABLE_IMGUR + m_uploadWithoutConfirmation->setChecked(config.uploadWithoutConfirmation()); + m_copyURLAfterUpload->setChecked(config.copyURLAfterUpload()); + m_historyConfirmationToDelete->setChecked( + config.historyConfirmationToDelete()); + + m_uploadHistoryMax->setValue(config.uploadHistoryMax()); +#endif +#if !defined(DISABLE_UPDATE_CHECKER) + m_checkForUpdates->setChecked(config.checkForUpdates()); +#endif + m_allowMultipleGuiInstances->setChecked(config.allowMultipleGuiInstances()); + m_showMagnifier->setChecked(config.showMagnifier()); + m_squareMagnifier->setChecked(config.squareMagnifier()); + m_saveLastRegion->setChecked(config.saveLastRegion()); + m_reverseArrow->setChecked(config.reverseArrow()); + +#if !defined(Q_OS_WIN) + m_autoCloseIdleDaemon->setChecked(config.autoCloseIdleDaemon()); +#endif + + m_predefinedColorPaletteLarge->setChecked( + config.predefinedColorPaletteLarge()); + m_showStartupLaunchMessage->setChecked(config.showStartupLaunchMessage()); + m_showQuitPrompt->setChecked(config.showQuitPrompt()); + m_screenshotPathFixedCheck->setChecked(config.savePathFixed()); + m_undoLimit->setValue(config.undoLimit()); + + if (allowEmptySavePath || !config.savePath().isEmpty()) { + m_savePath->setText(config.savePath()); + } +#if defined(Q_OS_LINUX) || defined(Q_OS_UNIX) + m_showTray->setChecked(!config.disabledTrayIcon()); +#endif + +#if defined(Q_OS_LINUX) + m_useGrimAdapter->setChecked(config.useGrimAdapter()); +#endif +} + +void GeneralConf::updateComponents() +{ + _updateComponents(false); +} + +void GeneralConf::saveLastRegion(bool checked) +{ + ConfigHandler().setSaveLastRegion(checked); +} + +void GeneralConf::showHelpChanged(bool checked) +{ + ConfigHandler().setShowHelp(checked); +} + +void GeneralConf::showSidePanelButtonChanged(bool checked) +{ + ConfigHandler().setShowSidePanelButton(checked); +} + +void GeneralConf::showDesktopNotificationChanged(bool checked) +{ + ConfigHandler().setShowDesktopNotification(checked); +} + +void GeneralConf::showAbortNotificationChanged(bool checked) +{ + ConfigHandler().setShowAbortNotification(checked); +} + +void GeneralConf::useGrimAdapter(bool checked) +{ + ConfigHandler().useGrimAdapter(checked); +} + +#if !defined(DISABLE_UPDATE_CHECKER) +void GeneralConf::checkForUpdatesChanged(bool checked) +{ + ConfigHandler().setCheckForUpdates(checked); +} +#endif + +void GeneralConf::allowMultipleGuiInstancesChanged(bool checked) +{ + ConfigHandler().setAllowMultipleGuiInstances(checked); +} + +void GeneralConf::autoCloseIdleDaemonChanged(bool checked) +{ + ConfigHandler().setAutoCloseIdleDaemon(checked); +} + +void GeneralConf::autostartChanged(bool checked) +{ + ConfigHandler().setStartupLaunch(checked); +} + +void GeneralConf::importConfiguration() +{ + QString fileName = QFileDialog::getOpenFileName(this, tr("Import")); + if (fileName.isEmpty()) { + return; + } + QFile file(fileName); + if (!file.open(QFile::ReadOnly)) { + QMessageBox::about(this, tr("Error"), tr("Unable to read file.")); + return; + } + QStringDecoder decoder(QStringDecoder::System); + QString text = decoder(file.readAll()); + file.close(); + + QFile config(ConfigHandler().configFilePath()); + if (!config.open(QFile::WriteOnly)) { + QMessageBox::about(this, tr("Error"), tr("Unable to write file.")); + return; + } + QStringEncoder encoder(QStringEncoder::System); + config.write(encoder(text)); + config.close(); +} + +void GeneralConf::exportFileConfiguration() +{ + QString defaultFileName = QSettings().fileName(); + QString fileName = + QFileDialog::getSaveFileName(this, tr("Save File"), defaultFileName); + + // Cancel button or target same as source + if (fileName.isNull() || fileName == defaultFileName) { + return; + } + + QFile targetFile(fileName); + if (targetFile.exists()) { + targetFile.remove(); + } + bool ok = QFile::copy(ConfigHandler().configFilePath(), fileName); + if (!ok) { + QMessageBox::about(this, tr("Error"), tr("Unable to write file.")); + } +} + +void GeneralConf::resetConfiguration() +{ + QMessageBox::StandardButton reply; + reply = QMessageBox::question( + this, + tr("Confirm Reset"), + tr("Are you sure you want to reset the configuration?"), + QMessageBox::Yes | QMessageBox::No); + if (reply == QMessageBox::Yes) { + m_savePath->setText( + QStandardPaths::writableLocation(QStandardPaths::PicturesLocation)); + ConfigHandler().setDefaultSettings(); + _updateComponents(true); + } +} + +void GeneralConf::initScrollArea() +{ + m_scrollArea = new QScrollArea(this); + m_layout->addWidget(m_scrollArea); + + auto* content = new QWidget(m_scrollArea); + m_scrollArea->setWidget(content); + m_scrollArea->setWidgetResizable(true); + m_scrollArea->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Maximum); + m_scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + + content->setObjectName("content"); + m_scrollArea->setObjectName("scrollArea"); + m_scrollArea->setStyleSheet( + "#content, #scrollArea { background: transparent; border: 0px; }"); + m_scrollAreaLayout = new QVBoxLayout(content); + m_scrollAreaLayout->setContentsMargins(0, 0, 20, 0); +} + +void GeneralConf::initShowHelp() +{ + m_helpMessage = new QCheckBox(tr("Show help message"), this); + m_helpMessage->setToolTip(tr("Show the help message at the beginning " + "in the capture mode")); + m_scrollAreaLayout->addWidget(m_helpMessage); + + connect( + m_helpMessage, &QCheckBox::clicked, this, &GeneralConf::showHelpChanged); +} + +void GeneralConf::initSaveLastRegion() +{ + m_saveLastRegion = new QCheckBox(tr("Use last region for GUI mode"), this); + m_saveLastRegion->setToolTip( + tr("Use the last region as the default selection for the next screenshot " + "in GUI mode")); + m_scrollAreaLayout->addWidget(m_saveLastRegion); + + connect(m_saveLastRegion, + &QCheckBox::clicked, + this, + &GeneralConf::saveLastRegion); +} + +void GeneralConf::initShowSidePanelButton() +{ + m_sidePanelButton = new QCheckBox(tr("Show the side panel button"), this); + m_sidePanelButton->setToolTip( + tr("Show the side panel toggle button in the capture mode")); + m_scrollAreaLayout->addWidget(m_sidePanelButton); + + connect(m_sidePanelButton, + &QCheckBox::clicked, + this, + &GeneralConf::showSidePanelButtonChanged); +} + +void GeneralConf::initShowDesktopNotification() +{ + m_sysNotifications = new QCheckBox(tr("Show desktop notifications"), this); + m_sysNotifications->setToolTip(tr("Enable desktop notifications")); + m_scrollAreaLayout->addWidget(m_sysNotifications); + + connect(m_sysNotifications, + &QCheckBox::clicked, + this, + &GeneralConf::showDesktopNotificationChanged); +} + +void GeneralConf::initShowAbortNotification() +{ + m_abortNotifications = new QCheckBox(tr("Show abort notifications"), this); + m_abortNotifications->setToolTip(tr("Enable abort notifications")); + m_scrollAreaLayout->addWidget(m_abortNotifications); + + connect(m_abortNotifications, + &QCheckBox::clicked, + this, + &GeneralConf::showAbortNotificationChanged); +} + +void GeneralConf::initShowTrayIcon() +{ +#if defined(Q_OS_LINUX) || defined(Q_OS_UNIX) + m_showTray = new QCheckBox(tr("Show tray icon"), this); + m_showTray->setToolTip(tr("Show icon in the system tray")); + m_scrollAreaLayout->addWidget(m_showTray); + + connect(m_showTray, &QCheckBox::clicked, this, [](bool checked) { + ConfigHandler().setDisabledTrayIcon(!checked); + }); +#endif +} + +void GeneralConf::initUseGrimAdapter() +{ +#if defined(Q_OS_LINUX) + m_useGrimAdapter = + new QCheckBox(tr("Use grim to capture screenshots"), this); + m_useGrimAdapter->setToolTip( + tr("Grim is a wayland only utility to capture screens based on the " + "screencopy protocol. Generally only enable on minimal wayland window " + "managers like sway, hyprland, etc.")); + m_scrollAreaLayout->addWidget(m_useGrimAdapter); + + connect(m_useGrimAdapter, + &QCheckBox::clicked, + this, + &GeneralConf::useGrimAdapter); +#endif +} + +void GeneralConf::initHistoryConfirmationToDelete() +{ + m_historyConfirmationToDelete = new QCheckBox( + tr("Confirmation required to delete screenshot from the latest uploads"), + this); + m_historyConfirmationToDelete->setToolTip( + tr("Ask for confirmation to delete screenshot from the latest uploads")); + m_scrollAreaLayout->addWidget(m_historyConfirmationToDelete); + + connect(m_historyConfirmationToDelete, + &QCheckBox::clicked, + this, + &GeneralConf::historyConfirmationToDelete); +} + +void GeneralConf::initConfigButtons() +{ + auto* buttonLayout = new QHBoxLayout(); + auto* box = new QGroupBox(tr("Configuration File")); + box->setFlat(true); + box->setLayout(buttonLayout); + m_layout->addWidget(box); + + m_exportButton = new QPushButton(tr("Export")); + buttonLayout->addWidget(m_exportButton); + connect(m_exportButton, + &QPushButton::clicked, + this, + &GeneralConf::exportFileConfiguration); + + m_importButton = new QPushButton(tr("Import")); + buttonLayout->addWidget(m_importButton); + connect(m_importButton, + &QPushButton::clicked, + this, + &GeneralConf::importConfiguration); + + m_resetButton = new QPushButton(tr("Reset")); + buttonLayout->addWidget(m_resetButton); + connect(m_resetButton, + &QPushButton::clicked, + this, + &GeneralConf::resetConfiguration); +} + +#if !defined(DISABLE_UPDATE_CHECKER) +void GeneralConf::initCheckForUpdates() +{ + m_checkForUpdates = new QCheckBox(tr("Automatic check for updates"), this); + m_checkForUpdates->setToolTip(tr("Check for updates automatically")); + m_scrollAreaLayout->addWidget(m_checkForUpdates); + + connect(m_checkForUpdates, + &QCheckBox::clicked, + this, + &GeneralConf::checkForUpdatesChanged); +} +#endif + +void GeneralConf::initAllowMultipleGuiInstances() +{ + m_allowMultipleGuiInstances = new QCheckBox( + tr("Allow multiple flameshot GUI instances simultaneously"), this); + m_allowMultipleGuiInstances->setToolTip(tr( + "This allows you to take screenshots of Flameshot itself for example")); + m_scrollAreaLayout->addWidget(m_allowMultipleGuiInstances); + connect(m_allowMultipleGuiInstances, + &QCheckBox::clicked, + this, + &GeneralConf::allowMultipleGuiInstancesChanged); +} + +void GeneralConf::initAutoCloseIdleDaemon() +{ + m_autoCloseIdleDaemon = new QCheckBox( + tr("Automatically unload from memory when it is not needed"), this); + m_autoCloseIdleDaemon->setToolTip(tr( + "Automatically close daemon (background process) when it is not needed")); + m_scrollAreaLayout->addWidget(m_autoCloseIdleDaemon); + connect(m_autoCloseIdleDaemon, + &QCheckBox::clicked, + this, + &GeneralConf::autoCloseIdleDaemonChanged); +} + +void GeneralConf::initAutostart() +{ + m_autostart = new QCheckBox(tr("Launch in background at startup"), this); + m_autostart->setToolTip(tr( + "Launch Flameshot daemon (background process) when computer is booted")); + m_scrollAreaLayout->addWidget(m_autostart); + + connect( + m_autostart, &QCheckBox::clicked, this, &GeneralConf::autostartChanged); +} + +void GeneralConf::initShowStartupLaunchMessage() +{ + m_showStartupLaunchMessage = + new QCheckBox(tr("Show welcome message on launch"), this); + ConfigHandler config; + m_showStartupLaunchMessage->setToolTip( + tr("Show the welcome message box in the middle of the screen while " + "taking a screenshot")); + m_scrollAreaLayout->addWidget(m_showStartupLaunchMessage); + + connect(m_showStartupLaunchMessage, &QCheckBox::clicked, [](bool checked) { + ConfigHandler().setShowStartupLaunchMessage(checked); + }); +} + +void GeneralConf::initShowQuitPrompt() +{ + m_showQuitPrompt = new QCheckBox(tr("Ask before quit capture"), this); + ConfigHandler config; + m_showQuitPrompt->setToolTip( + tr("Show the confirmation prompt before ESC quit")); + m_scrollAreaLayout->addWidget(m_showQuitPrompt); + + connect(m_showQuitPrompt, &QCheckBox::clicked, [](bool checked) { + ConfigHandler().setShowQuitPrompt(checked); + }); +} + +void GeneralConf::initPredefinedColorPaletteLarge() +{ + m_predefinedColorPaletteLarge = + new QCheckBox(tr("Use large predefined color palette"), this); + m_predefinedColorPaletteLarge->setToolTip( + tr("Use a large predefined color palette")); + m_scrollAreaLayout->addWidget(m_predefinedColorPaletteLarge); + + connect( + m_predefinedColorPaletteLarge, &QCheckBox::clicked, [](bool checked) { + ConfigHandler().setPredefinedColorPaletteLarge(checked); + }); +} +void GeneralConf::initCopyOnDoubleClick() +{ + m_copyOnDoubleClick = new QCheckBox(tr("Copy on double click"), this); + m_copyOnDoubleClick->setToolTip( + tr("Enable Copy to clipboard on Double Click")); + m_scrollAreaLayout->addWidget(m_copyOnDoubleClick); + + connect(m_copyOnDoubleClick, &QCheckBox::clicked, [](bool checked) { + ConfigHandler().setCopyOnDoubleClick(checked); + }); +} + +void GeneralConf::initCopyAndCloseAfterUpload() +{ + m_copyURLAfterUpload = new QCheckBox(tr("Copy URL after upload"), this); + m_copyURLAfterUpload->setToolTip( + tr("Copy URL after uploading was successful")); + m_scrollAreaLayout->addWidget(m_copyURLAfterUpload); + + connect(m_copyURLAfterUpload, &QCheckBox::clicked, [](bool checked) { + ConfigHandler().setCopyURLAfterUpload(checked); + }); +} + +void GeneralConf::initSaveAfterCopy() +{ + m_saveAfterCopy = new QCheckBox(tr("Save image after copy"), this); + m_saveAfterCopy->setToolTip( + tr("After copying the screenshot, save it to a file as well")); + m_scrollAreaLayout->addWidget(m_saveAfterCopy); + connect(m_saveAfterCopy, + &QCheckBox::clicked, + this, + &GeneralConf::saveAfterCopyChanged); + + auto* box = new QGroupBox(tr("Save Path")); + box->setFlat(true); + m_layout->addWidget(box); + + auto* vboxLayout = new QVBoxLayout(); + box->setLayout(vboxLayout); + + auto* pathLayout = new QHBoxLayout(); + + QString path = ConfigHandler().savePath(); + m_savePath = new QLineEdit(path, this); + m_savePath->setDisabled(true); + QString foreground = this->palette().windowText().color().name(); + m_savePath->setStyleSheet(QStringLiteral("color: %1").arg(foreground)); + pathLayout->addWidget(m_savePath); + + m_changeSaveButton = new QPushButton(tr("Change..."), this); + pathLayout->addWidget(m_changeSaveButton); + connect(m_changeSaveButton, + &QPushButton::clicked, + this, + &GeneralConf::changeSavePath); + + m_screenshotPathFixedCheck = + new QCheckBox(tr("Use fixed path for screenshots to save"), this); + connect(m_screenshotPathFixedCheck, + &QCheckBox::toggled, + this, + &GeneralConf::togglePathFixed); + + vboxLayout->addLayout(pathLayout); + vboxLayout->addWidget(m_screenshotPathFixedCheck); + + auto* extensionLayout = new QHBoxLayout(); + + extensionLayout->addWidget( + new QLabel(tr("Preferred save file extension:"))); + m_setSaveAsFileExtension = new QComboBox(this); + + QStringList imageFormatList; + for (const auto& mimeType : QImageWriter::supportedImageFormats()) + imageFormatList.append(mimeType); + + m_setSaveAsFileExtension->addItems(imageFormatList); + + int currentIndex = + m_setSaveAsFileExtension->findText(ConfigHandler().saveAsFileExtension()); + m_setSaveAsFileExtension->setCurrentIndex(currentIndex); + + connect(m_setSaveAsFileExtension, + &QComboBox::currentTextChanged, + this, + &GeneralConf::setSaveAsFileExtension); + + extensionLayout->addWidget(m_setSaveAsFileExtension); + vboxLayout->addLayout(extensionLayout); +} + +void GeneralConf::historyConfirmationToDelete(bool checked) +{ + ConfigHandler().setHistoryConfirmationToDelete(checked); +} + +void GeneralConf::initUploadHistoryMax() +{ + auto* box = new QGroupBox(tr("Latest Uploads Max Size")); + box->setFlat(true); + m_layout->addWidget(box); + + auto* vboxLayout = new QVBoxLayout(); + box->setLayout(vboxLayout); + + m_uploadHistoryMax = new QSpinBox(this); + m_uploadHistoryMax->setMaximum(50); + QString foreground = this->palette().windowText().color().name(); + m_uploadHistoryMax->setStyleSheet( + QStringLiteral("color: %1").arg(foreground)); + + connect(m_uploadHistoryMax, + static_cast(&QSpinBox::valueChanged), + this, + &GeneralConf::uploadHistoryMaxChanged); + vboxLayout->addWidget(m_uploadHistoryMax); +} + +void GeneralConf::initUploadClientSecret() +{ + auto* box = new QGroupBox(tr("Imgur Application Client ID")); + box->setFlat(true); + m_layout->addWidget(box); + + auto* vboxLayout = new QVBoxLayout(); + box->setLayout(vboxLayout); + + m_uploadClientKey = new QLineEdit(this); + QString foreground = this->palette().windowText().color().name(); + m_uploadClientKey->setStyleSheet( + QStringLiteral("color: %1").arg(foreground)); + m_uploadClientKey->setText(ConfigHandler().uploadClientSecret()); + connect(m_uploadClientKey, + &QLineEdit::editingFinished, + this, + &GeneralConf::uploadClientKeyEdited); + vboxLayout->addWidget(m_uploadClientKey); +} + +void GeneralConf::uploadClientKeyEdited() +{ + ConfigHandler().setUploadClientSecret(m_uploadClientKey->text()); +} + +void GeneralConf::uploadHistoryMaxChanged(int max) +{ + ConfigHandler().setUploadHistoryMax(max); +} + +void GeneralConf::initUndoLimit() +{ + auto* box = new QGroupBox(tr("Undo limit")); + box->setFlat(true); + m_layout->addWidget(box); + + auto* vboxLayout = new QVBoxLayout(); + box->setLayout(vboxLayout); + + m_undoLimit = new QSpinBox(this); + m_undoLimit->setMinimum(1); + m_undoLimit->setMaximum(999); + QString foreground = this->palette().windowText().color().name(); + m_undoLimit->setStyleSheet(QStringLiteral("color: %1").arg(foreground)); + + connect(m_undoLimit, + static_cast(&QSpinBox::valueChanged), + this, + &GeneralConf::undoLimit); + + vboxLayout->addWidget(m_undoLimit); +} + +void GeneralConf::undoLimit(int limit) +{ + ConfigHandler().setUndoLimit(limit); +} + +void GeneralConf::initUseJpgForClipboard() +{ + m_useJpgForClipboard = + new QCheckBox(tr("Use JPG format for clipboard (PNG default)"), this); + m_useJpgForClipboard->setToolTip( + tr("Use lossy JPG format for clipboard (lossless PNG default)")); + m_scrollAreaLayout->addWidget(m_useJpgForClipboard); + + connect(m_useJpgForClipboard, + &QCheckBox::clicked, + this, + &GeneralConf::useJpgForClipboardChanged); +} + +void GeneralConf::saveAfterCopyChanged(bool checked) +{ + ConfigHandler().setSaveAfterCopy(checked); +} + +void GeneralConf::changeSavePath() +{ + QString path = ConfigHandler().savePath(); + path = chooseFolder(path); + if (!path.isEmpty()) { + m_savePath->setText(path); + ConfigHandler().setSavePath(path); + } +} + +void GeneralConf::initCopyPathAfterSave() +{ + m_copyPathAfterSave = new QCheckBox(tr("Copy file path after save"), this); + m_copyPathAfterSave->setToolTip(tr("Copy the file path to clipboard after " + "the file is saved")); + m_scrollAreaLayout->addWidget(m_copyPathAfterSave); + connect(m_copyPathAfterSave, &QCheckBox::clicked, [](bool checked) { + ConfigHandler().setCopyPathAfterSave(checked); + }); +} + +void GeneralConf::initAntialiasingPinZoom() +{ + m_antialiasingPinZoom = + new QCheckBox(tr("Anti-aliasing image when zoom the pinned image"), this); + m_antialiasingPinZoom->setToolTip( + tr("After zooming the pinned image, should the image get smoothened or " + "stay pixelated")); + m_scrollAreaLayout->addWidget(m_antialiasingPinZoom); + connect(m_antialiasingPinZoom, &QCheckBox::clicked, [](bool checked) { + ConfigHandler().setAntialiasingPinZoom(checked); + }); +} + +void GeneralConf::initUploadWithoutConfirmation() +{ + m_uploadWithoutConfirmation = + new QCheckBox(tr("Upload image without confirmation"), this); + m_uploadWithoutConfirmation->setToolTip( + tr("Upload image without confirmation")); + m_scrollAreaLayout->addWidget(m_uploadWithoutConfirmation); + connect(m_uploadWithoutConfirmation, &QCheckBox::clicked, [](bool checked) { + ConfigHandler().setUploadWithoutConfirmation(checked); + }); +} + +const QString GeneralConf::chooseFolder(const QString& pathDefault) +{ + QString path; + if (pathDefault.isEmpty()) { + path = + QStandardPaths::writableLocation(QStandardPaths::PicturesLocation); + } + path = QFileDialog::getExistingDirectory( + this, + tr("Choose a Folder"), + path, + QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); + if (path.isEmpty()) { + return path; + } + + if (!QFileInfo(path).isWritable()) { + QMessageBox::about( + this, tr("Error"), tr("Unable to write to directory.")); + return QString(); + } + + return path; +} + +void GeneralConf::initShowMagnifier() +{ + m_showMagnifier = new QCheckBox(tr("Show magnifier"), this); + m_showMagnifier->setToolTip(tr("Enable a magnifier while selecting the " + "screenshot area")); + + m_scrollAreaLayout->addWidget(m_showMagnifier); + connect(m_showMagnifier, &QCheckBox::clicked, [](bool checked) { + ConfigHandler().setShowMagnifier(checked); + }); +} + +void GeneralConf::initSquareMagnifier() +{ + m_squareMagnifier = new QCheckBox(tr("Square shaped magnifier"), this); + m_squareMagnifier->setToolTip(tr("Make the magnifier to be square-shaped")); + m_scrollAreaLayout->addWidget(m_squareMagnifier); + connect(m_squareMagnifier, &QCheckBox::clicked, [](bool checked) { + ConfigHandler().setSquareMagnifier(checked); + }); +} + +void GeneralConf::initShowSelectionGeometry() +{ + auto* tobox = new QHBoxLayout(); + + int timeout = + ConfigHandler().value("showSelectionGeometryHideTime").toInt(); + m_xywhTimeout = new QSpinBox(); + m_xywhTimeout->setRange(0, INT_MAX); + m_xywhTimeout->setToolTip( + tr("Milliseconds before geometry display hides; 0 means do not hide")); + m_xywhTimeout->setValue(timeout); + tobox->addWidget(m_xywhTimeout); + tobox->addWidget(new QLabel(tr("Set geometry display timeout (ms)"))); + + m_scrollAreaLayout->addLayout(tobox); + connect(m_xywhTimeout, + static_cast(&QSpinBox::valueChanged), + this, + &GeneralConf::setSelGeoHideTime); + + auto* box = new QGroupBox(tr("Selection Geometry Display")); + box->setFlat(true); + m_layout->addWidget(box); + + auto* vboxLayout = new QVBoxLayout(); + box->setLayout(vboxLayout); + auto* selGeoLayout = new QHBoxLayout(); + selGeoLayout->addWidget(new QLabel(tr("Display Location"))); + m_selectGeometryLocation = new QComboBox(this); + + m_selectGeometryLocation->addItem(tr("None"), GeneralConf::xywh_none); + m_selectGeometryLocation->addItem(tr("Top Left"), + GeneralConf::xywh_top_left); + m_selectGeometryLocation->addItem(tr("Top Right"), + GeneralConf::xywh_top_right); + m_selectGeometryLocation->addItem(tr("Bottom Left"), + GeneralConf::xywh_bottom_left); + m_selectGeometryLocation->addItem(tr("Bottom Right"), + GeneralConf::xywh_bottom_right); + m_selectGeometryLocation->addItem(tr("Center"), GeneralConf::xywh_center); + + // pick up int from config and use findData + int pos = ConfigHandler().value("showSelectionGeometry").toInt(); + m_selectGeometryLocation->setCurrentIndex( + m_selectGeometryLocation->findData(pos)); + + connect( + m_selectGeometryLocation, + static_cast(&QComboBox::currentIndexChanged), + this, + &GeneralConf::setGeometryLocation); + + selGeoLayout->addWidget(m_selectGeometryLocation); + vboxLayout->addLayout(selGeoLayout); + vboxLayout->addStretch(); +} + +void GeneralConf::initJpegQuality() +{ + auto* tobox = new QHBoxLayout(); + + int quality = ConfigHandler().value("jpegQuality").toInt(); + m_jpegQuality = new QSpinBox(); + m_jpegQuality->setRange(0, 100); + m_jpegQuality->setToolTip(tr("Quality range of 0-100; Higher number is " + "better quality and larger file size")); + m_jpegQuality->setValue(quality); + tobox->addWidget(m_jpegQuality); + tobox->addWidget(new QLabel(tr("JPEG Quality"))); + + m_scrollAreaLayout->addLayout(tobox); + connect(m_jpegQuality, + static_cast(&QSpinBox::valueChanged), + this, + &GeneralConf::setJpegQuality); +} + +void GeneralConf::initReverseArrow() +{ + m_reverseArrow = new QCheckBox(tr("Reverse arrow"), this); + m_reverseArrow->setToolTip(tr("Draw the arrow head first")); + m_scrollAreaLayout->addWidget(m_reverseArrow); + + connect( + m_reverseArrow, &QCheckBox::clicked, this, &GeneralConf::setReverseArrow); +} + +void GeneralConf::initInsecurePixelate() +{ + m_insecurePixelate = new QCheckBox(tr("Insecure Pixelate"), this); + m_insecurePixelate->setToolTip( + tr("Draw the pixelation effect in an insecure but more asethetic way.")); + m_insecurePixelate->setChecked(ConfigHandler().insecurePixelate()); + m_scrollAreaLayout->addWidget(m_insecurePixelate); + + connect(m_insecurePixelate, + &QCheckBox::clicked, + this, + &GeneralConf::setInsecurePixelate); +} + +void GeneralConf::setSelGeoHideTime(int v) +{ + ConfigHandler().setValue("showSelectionGeometryHideTime", v); +} + +void GeneralConf::setJpegQuality(int v) +{ + ConfigHandler().setJpegQuality(v); +} + +void GeneralConf::setGeometryLocation(int index) +{ + ConfigHandler().setValue("showSelectionGeometry", + m_selectGeometryLocation->itemData(index)); +} + +void GeneralConf::togglePathFixed() +{ + ConfigHandler().setSavePathFixed(m_screenshotPathFixedCheck->isChecked()); +} + +void GeneralConf::setSaveAsFileExtension(const QString& extension) +{ + ConfigHandler().setSaveAsFileExtension(extension); +} + +void GeneralConf::useJpgForClipboardChanged(bool checked) +{ + ConfigHandler().setUseJpgForClipboard(checked); +} + +void GeneralConf::setReverseArrow(bool checked) +{ + ConfigHandler().setReverseArrow(checked); +} + +void GeneralConf::setInsecurePixelate(bool checked) +{ + ConfigHandler().setInsecurePixelate(checked); +} \ No newline at end of file diff --git a/src/config/generalconf.h b/src/config/generalconf.h new file mode 100644 index 0000000..9bf09b2 --- /dev/null +++ b/src/config/generalconf.h @@ -0,0 +1,153 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include +#include + +class QVBoxLayout; +class QCheckBox; +class QPushButton; +class QLabel; +class QLineEdit; +class QSpinBox; +class QComboBox; + +class GeneralConf : public QWidget +{ + Q_OBJECT +public: + explicit GeneralConf(QWidget* parent = nullptr); + enum xywh_position + { + xywh_none = 0, + xywh_top_left = 1, + xywh_bottom_left = 2, + xywh_top_right = 3, + xywh_bottom_right = 4, + xywh_center = 5 + }; + +public slots: + void updateComponents(); + +private slots: + void showHelpChanged(bool checked); + void saveLastRegion(bool checked); + void showSidePanelButtonChanged(bool checked); + void showDesktopNotificationChanged(bool checked); + void showAbortNotificationChanged(bool checked); + void useGrimAdapter(bool checked); +#if !defined(DISABLE_UPDATE_CHECKER) + void checkForUpdatesChanged(bool checked); +#endif + void allowMultipleGuiInstancesChanged(bool checked); + void autoCloseIdleDaemonChanged(bool checked); + void autostartChanged(bool checked); + void historyConfirmationToDelete(bool checked); + void uploadHistoryMaxChanged(int max); + void undoLimit(int limit); + void saveAfterCopyChanged(bool checked); + void changeSavePath(); + void importConfiguration(); + void exportFileConfiguration(); + void resetConfiguration(); + void togglePathFixed(); + void uploadClientKeyEdited(); + void useJpgForClipboardChanged(bool checked); + void setSaveAsFileExtension(const QString& extension); + void setGeometryLocation(int index); + void setSelGeoHideTime(int v); + void setJpegQuality(int v); + void setReverseArrow(bool checked); + void setInsecurePixelate(bool checked); + +private: + const QString chooseFolder(const QString& currentPath = ""); + + void initAllowMultipleGuiInstances(); + void initAntialiasingPinZoom(); + void initAutoCloseIdleDaemon(); + void initAutostart(); +#if !defined(DISABLE_UPDATE_CHECKER) + void initCheckForUpdates(); +#endif + void initConfigButtons(); + void initCopyAndCloseAfterUpload(); + void initCopyOnDoubleClick(); + void initCopyPathAfterSave(); + void initHistoryConfirmationToDelete(); + void initPredefinedColorPaletteLarge(); + void initSaveAfterCopy(); + void initScrollArea(); + void initShowDesktopNotification(); + void initShowAbortNotification(); + void initShowHelp(); + void initShowMagnifier(); + void initShowQuitPrompt(); + void initShowSidePanelButton(); + void initShowStartupLaunchMessage(); + void initShowTrayIcon(); + void initUseGrimAdapter(); + void initSquareMagnifier(); + void initUndoLimit(); + void initUploadWithoutConfirmation(); + void initUseJpgForClipboard(); + void initUploadHistoryMax(); + void initUploadClientSecret(); + void initSaveLastRegion(); + void initShowSelectionGeometry(); + void initJpegQuality(); + void initReverseArrow(); + void initInsecurePixelate(); + + void _updateComponents(bool allowEmptySavePath); + + // class members + QVBoxLayout* m_layout; + QVBoxLayout* m_scrollAreaLayout; + QScrollArea* m_scrollArea; + QCheckBox* m_sysNotifications; + QCheckBox* m_abortNotifications; + QCheckBox* m_showTray; + QCheckBox* m_useGrimAdapter; + QCheckBox* m_helpMessage; + QCheckBox* m_sidePanelButton; +#if !defined(DISABLE_UPDATE_CHECKER) + QCheckBox* m_checkForUpdates; +#endif + QCheckBox* m_allowMultipleGuiInstances; + QCheckBox* m_autoCloseIdleDaemon; + QCheckBox* m_autostart; + QCheckBox* m_showStartupLaunchMessage; + QCheckBox* m_showQuitPrompt; + QCheckBox* m_copyURLAfterUpload; + QCheckBox* m_copyPathAfterSave; + QCheckBox* m_antialiasingPinZoom; + QCheckBox* m_saveLastRegion; + QCheckBox* m_uploadWithoutConfirmation; + QPushButton* m_importButton; + QPushButton* m_exportButton; + QPushButton* m_resetButton; + QCheckBox* m_saveAfterCopy; + QLineEdit* m_savePath; + QLineEdit* m_uploadClientKey; + QPushButton* m_changeSaveButton; + QCheckBox* m_screenshotPathFixedCheck; + QCheckBox* m_historyConfirmationToDelete; + QCheckBox* m_useJpgForClipboard; + QSpinBox* m_uploadHistoryMax; + QSpinBox* m_undoLimit; + QComboBox* m_setSaveAsFileExtension; + QCheckBox* m_predefinedColorPaletteLarge; + QCheckBox* m_showMagnifier; + QCheckBox* m_squareMagnifier; + QCheckBox* m_copyOnDoubleClick; + QCheckBox* m_showSelectionGeometry; + QComboBox* m_selectGeometryLocation; + QSpinBox* m_xywhTimeout; + QSpinBox* m_jpegQuality; + QCheckBox* m_reverseArrow; + QCheckBox* m_insecurePixelate; +}; diff --git a/src/config/setshortcutwidget.cpp b/src/config/setshortcutwidget.cpp new file mode 100644 index 0000000..af9318f --- /dev/null +++ b/src/config/setshortcutwidget.cpp @@ -0,0 +1,93 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2020 Yurii Puchkov at Namecheap & Contributors + +#include "setshortcutwidget.h" +#include "src/utils/globalvalues.h" +#include +#include +#include +#include +#include + +SetShortcutDialog::SetShortcutDialog(QDialog* parent, + const QString& shortcutName) + : QDialog(parent) +{ + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + setWindowIcon(QIcon(GlobalValues::iconPath())); + setWindowTitle(tr("Set Shortcut")); + m_ks = QKeySequence(); + + m_layout = new QVBoxLayout(this); + m_layout->setAlignment(Qt::AlignHCenter); + + auto* infoTop = new QLabel(tr("Enter new shortcut to change ")); + infoTop->setMargin(10); + infoTop->setAlignment(Qt::AlignCenter); + m_layout->addWidget(infoTop); + + auto* infoIcon = new QLabel(); + infoIcon->setAlignment(Qt::AlignCenter); + infoIcon->setPixmap(QPixmap(":/img/app/keyboard.svg")); + m_layout->addWidget(infoIcon); + + m_layout->addWidget(infoIcon); + + QString msg = ""; +#if defined(Q_OS_MAC) + msg = tr( + "Press Esc to cancel or ⌘+Backspace to disable the keyboard shortcut."); +#else + msg = + tr("Press Esc to cancel or Backspace to disable the keyboard shortcut."); +#endif + + auto restartMessageAdded = false; + if (shortcutName == "TAKE_SCREENSHOT" && restartMessageAdded == false) { + msg += + "\n" + tr("Flameshot must be restarted for changes to take effect."); + restartMessageAdded = true; + } + if (shortcutName == "SCREENSHOT_HISTORY" && restartMessageAdded == false) { + msg += + "\n" + tr("Flameshot must be restarted for changes to take effect."); + restartMessageAdded = true; + } + + auto* infoBottom = new QLabel(msg); + infoBottom->setMargin(10); + infoBottom->setAlignment(Qt::AlignCenter); + m_layout->addWidget(infoBottom); +} + +const QKeySequence& SetShortcutDialog::shortcut() +{ + return m_ks; +} + +void SetShortcutDialog::keyPressEvent(QKeyEvent* ke) +{ + if (ke->modifiers() & Qt::ShiftModifier) { + m_modifier += "Shift+"; + } + if (ke->modifiers() & Qt::ControlModifier) { + m_modifier += "Ctrl+"; + } + if (ke->modifiers() & Qt::AltModifier) { + m_modifier += "Alt+"; + } + if (ke->modifiers() & Qt::MetaModifier) { + m_modifier += "Meta+"; + } + + QString key = QKeySequence(ke->key()).toString(); + m_ks = QKeySequence(m_modifier + key); +} + +void SetShortcutDialog::keyReleaseEvent(QKeyEvent* event) +{ + if (m_ks == QKeySequence(Qt::Key_Escape)) { + reject(); + } + accept(); +} diff --git a/src/config/setshortcutwidget.h b/src/config/setshortcutwidget.h new file mode 100644 index 0000000..1232461 --- /dev/null +++ b/src/config/setshortcutwidget.h @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2020 Yurii Puchkov at Namecheap & Contributors + +#ifndef SETSHORTCUTWIDGET_H +#define SETSHORTCUTWIDGET_H + +#include +#include +#include + +class QVBoxLayout; + +class SetShortcutDialog : public QDialog +{ + Q_OBJECT +public: + explicit SetShortcutDialog(QDialog* parent = nullptr, + const QString& shortcutName = ""); + const QKeySequence& shortcut(); + +public: + void keyPressEvent(QKeyEvent*); + void keyReleaseEvent(QKeyEvent* event); + +signals: + +private: + QVBoxLayout* m_layout; + QString m_modifier; + QKeySequence m_ks; +}; + +#endif // SETSHORTCUTWIDGET_H diff --git a/src/config/shortcutswidget.cpp b/src/config/shortcutswidget.cpp new file mode 100644 index 0000000..5117e94 --- /dev/null +++ b/src/config/shortcutswidget.cpp @@ -0,0 +1,243 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2020 Yurii Puchkov at Namecheap & Contributors + +#include "shortcutswidget.h" +#include "capturetool.h" +#include "setshortcutwidget.h" +#include "src/core/qguiappcurrentscreen.h" +#include "src/utils/globalvalues.h" +#include "toolfactory.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +ShortcutsWidget::ShortcutsWidget(QWidget* parent) + : QWidget(parent) +{ + setAttribute(Qt::WA_DeleteOnClose); + setWindowIcon(QIcon(GlobalValues::iconPath())); + setWindowTitle(tr("Hot Keys")); + + QRect position = frameGeometry(); + QScreen* screen = QGuiAppCurrentScreen().currentScreen(); + position.moveCenter(screen->availableGeometry().center()); + move(position.topLeft()); + + m_layout = new QVBoxLayout(this); + m_layout->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); + + initInfoTable(); + connect(ConfigHandler::getInstance(), + &ConfigHandler::fileChanged, + this, + &ShortcutsWidget::populateInfoTable); + show(); +} + +void ShortcutsWidget::initInfoTable() +{ + m_table = new QTableWidget(this); + m_table->setToolTip(tr("Available shortcuts in the screen capture mode.")); + + m_layout->addWidget(m_table); + + m_table->setColumnCount(2); + m_table->setSelectionMode(QAbstractItemView::NoSelection); + m_table->setFocusPolicy(Qt::NoFocus); + m_table->verticalHeader()->hide(); + + // header creation + QStringList names; + names << tr("Description") << tr("Key"); + m_table->setHorizontalHeaderLabels(names); + connect(m_table, + &QTableWidget::cellClicked, + this, + &ShortcutsWidget::onShortcutCellClicked); + + // populate with dynamic data + populateInfoTable(); + + // adjust size + m_table->horizontalHeader()->setMinimumSectionSize(200); + m_table->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); + m_table->horizontalHeader()->setSizePolicy(QSizePolicy::Expanding, + QSizePolicy::Expanding); + m_table->resizeColumnsToContents(); + m_table->resizeRowsToContents(); +} + +void ShortcutsWidget::populateInfoTable() +{ + loadShortcuts(); + m_table->setRowCount(m_shortcuts.size()); + + // add content + for (int i = 0; i < m_shortcuts.size(); ++i) { + const auto current_shortcut = m_shortcuts.at(i); + const auto identifier = current_shortcut.at(0); + const auto description = current_shortcut.at(1); + const auto key_sequence = current_shortcut.at(2); + m_table->setItem(i, 0, new QTableWidgetItem(description)); + +#if defined(Q_OS_MACOS) + auto* item = new QTableWidgetItem(nativeOSHotKeyText(key_sequence)); +#else + QTableWidgetItem* item = new QTableWidgetItem(key_sequence); +#endif + item->setTextAlignment(Qt::AlignCenter); + m_table->setItem(i, 1, item); + + if (identifier.isEmpty()) { + QFont font; + font.setBold(true); + item->setFont(font); + item->setFlags(item->flags() ^ Qt::ItemIsEnabled); + m_table->item(i, 1)->setFont(font); + } + } + + // Read-only table items + for (int x = 0; x < m_table->rowCount(); ++x) { + for (int y = 0; y < m_table->columnCount(); ++y) { + QTableWidgetItem* item = m_table->item(x, y); + item->setFlags(item->flags() ^ Qt::ItemIsEditable); + } + } +} + +void ShortcutsWidget::onShortcutCellClicked(int row, int col) +{ + if (col == 1) { + // Ignore non-changable shortcuts + if (Qt::ItemIsEnabled != + (Qt::ItemIsEnabled & m_table->item(row, col)->flags())) { + return; + } + + QString shortcutName = m_shortcuts.at(row).at(0); + auto* setShortcutDialog = new SetShortcutDialog(nullptr, shortcutName); + if (0 != setShortcutDialog->exec()) { + QKeySequence shortcutValue = setShortcutDialog->shortcut(); + + // set no shortcut is Backspace +#if defined(Q_OS_MACOS) + if (shortcutValue == QKeySequence(Qt::CTRL | Qt::Key_Backspace)) { + shortcutValue = QKeySequence(""); + } +#else + if (shortcutValue == QKeySequence(Qt::Key_Backspace)) { + shortcutValue = QKeySequence(""); + } +#endif + if (m_config.setShortcut(shortcutName, shortcutValue.toString())) { + populateInfoTable(); + } + } + delete setShortcutDialog; + } +} + +void ShortcutsWidget::loadShortcuts() +{ + m_shortcuts.clear(); + auto buttonTypes = CaptureToolButton::getIterableButtonTypes(); + + // get shortcuts names from capture buttons + for (const CaptureTool::Type& t : buttonTypes) { + CaptureTool* tool = ToolFactory().CreateTool(t); + QString shortcutName = QVariant::fromValue(t).toString(); + appendShortcut(shortcutName, tool->description()); + if (shortcutName == "TYPE_COPY") { + if (m_config.copyOnDoubleClick()) { + m_shortcuts << (QStringList() << "" << tool->description() + << tr("Left Double-click")); + } + } + delete tool; + } + + // additional tools that don't have their own buttons + appendShortcut("TYPE_TOGGLE_PANEL", tr("Toggle side panel")); + appendShortcut("TYPE_GRAB_COLOR", tr("Grab a color from the screen")); + appendShortcut("TYPE_RESIZE_LEFT", tr("Resize selection left 1px")); + appendShortcut("TYPE_RESIZE_RIGHT", tr("Resize selection right 1px")); + appendShortcut("TYPE_RESIZE_UP", tr("Resize selection up 1px")); + appendShortcut("TYPE_RESIZE_DOWN", tr("Resize selection down 1px")); + appendShortcut("TYPE_SYM_RESIZE_LEFT", + tr("Symmetrically decrease width by 2px")); + appendShortcut("TYPE_SYM_RESIZE_RIGHT", + tr("Symmetrically increase width by 2px")); + appendShortcut("TYPE_SYM_RESIZE_UP", + tr("Symmetrically increase height by 2px")); + appendShortcut("TYPE_SYM_RESIZE_DOWN", + tr("Symmetrically decrease height by 2px")); + appendShortcut("TYPE_SELECT_ALL", tr("Select entire screen")); + appendShortcut("TYPE_MOVE_LEFT", tr("Move selection left 1px")); + appendShortcut("TYPE_MOVE_RIGHT", tr("Move selection right 1px")); + appendShortcut("TYPE_MOVE_UP", tr("Move selection up 1px")); + appendShortcut("TYPE_MOVE_DOWN", tr("Move selection down 1px")); + appendShortcut("TYPE_COMMIT_CURRENT_TOOL", tr("Commit text in text area")); + appendShortcut("TYPE_DELETE_CURRENT_TOOL", + tr("Delete selected drawn object")); + appendShortcut("TYPE_CANCEL", tr("Cancel current selection")); + + // non-editable shortcuts have an empty shortcut name + + m_shortcuts << (QStringList() << "" << QObject::tr("Quit capture") + << QKeySequence(Qt::Key_Escape).toString()); + + // Global hotkeys +#if defined(Q_OS_MACOS) + appendShortcut("TAKE_SCREENSHOT", tr("Capture screen")); +#ifdef ENABLE_IMGUR + appendShortcut("SCREENSHOT_HISTORY", tr("Screenshot history")); +#endif +#elif defined(Q_OS_WIN) + +#ifdef ENABLE_IMGUR + m_shortcuts << (QStringList() << "" << QObject::tr("Screenshot history") + << "Shift+Print Screen"); +#endif + m_shortcuts << (QStringList() + << "" << QObject::tr("Capture screen") << "Print Screen"); +#else + // TODO - Linux doesn't support global shortcuts for (XServer and Wayland), + // possibly it will be solved in the QHotKey library later. So it is + // disabled for now. +#endif + m_shortcuts << (QStringList() + << "" << QObject::tr("Show color picker") << "Right Click"); + m_shortcuts << (QStringList() << "" << QObject::tr("Change the tool's size") + << "Mouse Wheel"); +} + +void ShortcutsWidget::appendShortcut(const QString& shortcutName, + const QString& description) +{ + QString shortcut = ConfigHandler().shortcut(shortcutName); + m_shortcuts << (QStringList() + << shortcutName + << QObject::tr(description.toStdString().c_str()) + << shortcut.replace("Return", "Enter")); +} + +#if defined(Q_OS_MACOS) +const QString& ShortcutsWidget::nativeOSHotKeyText(const QString& text) +{ + m_res = text; + m_res.replace("Ctrl+", "⌘"); + m_res.replace("Alt+", "⌥"); + m_res.replace("Meta+", "⌃"); + m_res.replace("Shift+", "⇧"); + return m_res; +} +#endif diff --git a/src/config/shortcutswidget.h b/src/config/shortcutswidget.h new file mode 100644 index 0000000..63c1fa9 --- /dev/null +++ b/src/config/shortcutswidget.h @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2020 Yurii Puchkov at Namecheap & Contributors + +#ifndef HOTKEYSCONFIG_H +#define HOTKEYSCONFIG_H + +#include "src/utils/confighandler.h" +#include +#include +#include + +class SetShortcutDialog; +class QTableWidget; +class QVBoxLayout; + +class ShortcutsWidget : public QWidget +{ + Q_OBJECT +public: + explicit ShortcutsWidget(QWidget* parent = nullptr); + +private: + void initInfoTable(); +#if (defined(Q_OS_MAC) || defined(Q_OS_MACOS)) + const QString& nativeOSHotKeyText(const QString& text); +#endif + +private slots: + void populateInfoTable(); + void onShortcutCellClicked(int, int); + +private: +#if (defined(Q_OS_MAC) || defined(Q_OS_MACOS)) + QString m_res; +#endif + ConfigHandler m_config; + QTableWidget* m_table; + QVBoxLayout* m_layout; + QList m_shortcuts; + + void loadShortcuts(); + void appendShortcut(const QString& shortcutName, + const QString& description); +}; + +#endif // HOTKEYSCONFIG_H diff --git a/src/config/strftimechooserwidget.cpp b/src/config/strftimechooserwidget.cpp new file mode 100644 index 0000000..5ab0a83 --- /dev/null +++ b/src/config/strftimechooserwidget.cpp @@ -0,0 +1,78 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "strftimechooserwidget.h" +#include +#include +#include + +StrftimeChooserWidget::StrftimeChooserWidget(QWidget* parent) + : QWidget(parent) +{ + const quint8 MAXCOLUMNS = 2; + auto* layout = new QGridLayout(this); + quint8 row = 0; + quint8 col = 0; + QMapIterator iterator(m_buttonData); + + while (iterator.hasNext()) { + iterator.next(); + + QString variable = iterator.value(); + auto* button = new QPushButton(this); + button->setText(tr(iterator.key().toStdString().data())); + button->setToolTip(variable); + button->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + button->setMinimumHeight(25); + layout->addWidget(button, row, col); + connect(button, &QPushButton::clicked, this, [variable, this]() { + emit variableEmitted(variable); + }); + + col++; + if (col >= MAXCOLUMNS) { + row++; + col = 0; + } + } + + setLayout(layout); +} + +QMap StrftimeChooserWidget::m_buttonData{ + { QT_TR_NOOP("Century (00-99)"), "%C" }, + { QT_TR_NOOP("Year (00-99)"), "%y" }, + { QT_TR_NOOP("Year (2000)"), "%Y" }, +#ifndef Q_OS_WIN + // TODO - fix localized names on windows (ex. Cyrillic) + { QT_TR_NOOP("Month Name (jan)"), "%b" }, + { QT_TR_NOOP("Month Name (january)"), "%B" }, +#endif + { QT_TR_NOOP("Month (01-12)"), "%m" }, + { QT_TR_NOOP("Week Day (1-7)"), "%u" }, + { QT_TR_NOOP("Week (01-53)"), "%V" }, +#ifndef Q_OS_WIN + // TODO - fix localized names on windows (ex. Cyrillic) + { QT_TR_NOOP("Day Name (mon)"), "%a" }, + { QT_TR_NOOP("Day Name (monday)"), "%A" }, +#endif + { QT_TR_NOOP("Day (01-31)"), "%d" }, + { QT_TR_NOOP("Day of Month (1-31)"), "%e" }, + { QT_TR_NOOP("Day (001-366)"), "%j" }, +#ifndef Q_OS_WIN + // TODO - fix localized names on windows (ex. Cyrillic) + { QT_TR_NOOP("Time (%H-%M-%S)"), "%T" }, + { QT_TR_NOOP("Time (%H-%M)"), "%R" }, +#endif + { QT_TR_NOOP("Hour (00-23)"), "%H" }, + { QT_TR_NOOP("Hour (01-12)"), "%I" }, + { QT_TR_NOOP("Minute (00-59)"), "%M" }, + { QT_TR_NOOP("Second (00-59)"), "%S" }, +#ifndef Q_OS_WIN + // TODO - fix localized names on windows (ex. Cyrillic) + { QT_TR_NOOP("Full Date (%m/%d/%y)"), "%D" }, +#endif + { QT_TR_NOOP("Full Date (%Y-%m-%d)"), "%F" }, + { QT_TR_NOOP("Full Date (%d-%m-%Y)"), "%d-%m-%Y" }, + +}; diff --git a/src/config/strftimechooserwidget.h b/src/config/strftimechooserwidget.h new file mode 100644 index 0000000..c8dc398 --- /dev/null +++ b/src/config/strftimechooserwidget.h @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include + +class StrftimeChooserWidget : public QWidget +{ + Q_OBJECT +public: + explicit StrftimeChooserWidget(QWidget* parent = nullptr); + +signals: + void variableEmitted(const QString&); + +private: + static QMap m_buttonData; +}; diff --git a/src/config/styleoverride.cpp b/src/config/styleoverride.cpp new file mode 100644 index 0000000..7b04580 --- /dev/null +++ b/src/config/styleoverride.cpp @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2020 Jeremy Borgman +// +// Created by jeremy on 9/24/20. + +#include "styleoverride.h" + +int StyleOverride::styleHint(StyleHint hint, + const QStyleOption* option, + const QWidget* widget, + QStyleHintReturn* returnData) const +{ + if (hint == SH_ToolTip_WakeUpDelay) { + return 600; + } else { + return baseStyle()->styleHint(hint, option, widget, returnData); + } +} diff --git a/src/config/styleoverride.h b/src/config/styleoverride.h new file mode 100644 index 0000000..6353a15 --- /dev/null +++ b/src/config/styleoverride.h @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2020 Jeremy Borgman +// +// Created by jeremy on 9/24/20. + +#ifndef FLAMESHOT_STYLEOVERRIDE_H +#define FLAMESHOT_STYLEOVERRIDE_H + +#include +#include + +class StyleOverride : public QProxyStyle +{ + Q_OBJECT +public: + int styleHint(StyleHint hint, + const QStyleOption* option = Q_NULLPTR, + const QWidget* widget = Q_NULLPTR, + QStyleHintReturn* returnData = Q_NULLPTR) const; +}; + +#endif // FLAMESHOT_STYLEOVERRIDE_H diff --git a/src/config/uicoloreditor.cpp b/src/config/uicoloreditor.cpp new file mode 100644 index 0000000..7309b2b --- /dev/null +++ b/src/config/uicoloreditor.cpp @@ -0,0 +1,169 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "uicoloreditor.h" +#include "clickablelabel.h" +#include "src/utils/confighandler.h" +#include "src/utils/globalvalues.h" +#include +#include +#include +#include +#include +#include + +UIcolorEditor::UIcolorEditor(QWidget* parent) + : QWidget(parent) +{ + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + m_hLayout = new QHBoxLayout; + m_vLayout = new QVBoxLayout; + + const int space = QFontMetrics(qApp->font()).lineSpacing(); + m_hLayout->addItem(new QSpacerItem(space, space, QSizePolicy::Expanding)); + m_vLayout->setAlignment(Qt::AlignVCenter); + + initButtons(); + initColorWheel(); + + m_vLayout->addSpacing(space); + m_hLayout->addLayout(m_vLayout); + m_hLayout->addItem(new QSpacerItem(space, space, QSizePolicy::Expanding)); + setLayout(m_hLayout); + updateComponents(); +} + +void UIcolorEditor::updateComponents() +{ + ConfigHandler config; + m_uiColor = config.uiColor(); + m_contrastColor = config.contrastUiColor(); + m_buttonContrast->setColor(m_contrastColor); + m_buttonMainColor->setColor(m_uiColor); + if (m_lastButtonPressed == m_buttonMainColor) { + m_colorWheel->setColor(m_uiColor); + } else { + m_colorWheel->setColor(m_contrastColor); + } +} + +// updateUIcolor updates the appearance of the buttons +void UIcolorEditor::updateUIcolor() +{ + ConfigHandler config; + if (m_lastButtonPressed == m_buttonMainColor) { + config.setUiColor(m_uiColor); + } else { + config.setContrastUiColor(m_contrastColor); + } +} + +// updateLocalColor updates the local button +void UIcolorEditor::updateLocalColor(const QColor c) +{ + if (m_lastButtonPressed == m_buttonMainColor) { + m_uiColor = c; + } else { + m_contrastColor = c; + } + m_lastButtonPressed->setColor(c); +} + +void UIcolorEditor::initColorWheel() +{ + m_colorWheel = new color_widgets::ColorWheel(this); + connect(m_colorWheel, + &color_widgets::ColorWheel::colorSelected, + this, + &UIcolorEditor::updateUIcolor); + connect(m_colorWheel, + &color_widgets::ColorWheel::colorChanged, + this, + &UIcolorEditor::updateLocalColor); + + const int size = GlobalValues::buttonBaseSize() * 3; + m_colorWheel->setMinimumSize(size, size); + m_colorWheel->setMaximumSize(size * 2, size * 2); + m_colorWheel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + m_colorWheel->setToolTip(tr("Change the color moving the selectors and see" + " the changes in the preview buttons.")); + + m_hLayout->addWidget(m_colorWheel); +} + +void UIcolorEditor::initButtons() +{ + const int extraSize = GlobalValues::buttonBaseSize() / 3; + int frameSize = GlobalValues::buttonBaseSize() + extraSize; + + m_vLayout->addWidget(new QLabel(tr("Select a Button to modify it"), this)); + + auto* frame = new QGroupBox(); + frame->setFixedSize(frameSize, frameSize); + + m_buttonMainColor = new CaptureToolButton(m_buttonIconType, frame); + m_buttonMainColor->move(m_buttonMainColor->x() + extraSize / 2, + m_buttonMainColor->y() + extraSize / 2); + auto* h1 = new QHBoxLayout(); + h1->addWidget(frame); + m_labelMain = new ClickableLabel(tr("Main Color"), this); + h1->addWidget(m_labelMain); + m_vLayout->addLayout(h1); + + m_buttonMainColor->setToolTip(tr("Click on this button to set the edition" + " mode of the main color.")); + + auto* frame2 = new QGroupBox(); + m_buttonContrast = new CaptureToolButton(m_buttonIconType, frame2); + m_buttonContrast->move(m_buttonContrast->x() + extraSize / 2, + m_buttonContrast->y() + extraSize / 2); + + auto* h2 = new QHBoxLayout(); + h2->addWidget(frame2); + frame2->setFixedSize(frameSize, frameSize); + m_labelContrast = new ClickableLabel(tr("Contrast Color"), this); + m_labelContrast->setStyleSheet(QStringLiteral("color : gray")); + h2->addWidget(m_labelContrast); + m_vLayout->addLayout(h2); + + m_buttonContrast->setToolTip(tr("Click on this button to set the edition" + " mode of the contrast color.")); + + connect(m_buttonMainColor, + &CaptureToolButton::pressedButtonLeftClick, + this, + &UIcolorEditor::changeLastButton); + connect(m_buttonContrast, + &CaptureToolButton::pressedButtonLeftClick, + this, + &UIcolorEditor::changeLastButton); + // clicking the labels changes the button too + connect(m_labelMain, &ClickableLabel::clicked, this, [this] { + changeLastButton(m_buttonMainColor); + }); + connect(m_labelContrast, &ClickableLabel::clicked, this, [this] { + changeLastButton(m_buttonContrast); + }); + m_lastButtonPressed = m_buttonMainColor; +} + +// visual update for the selected button +void UIcolorEditor::changeLastButton(CaptureToolButton* b) +{ + if (m_lastButtonPressed != b) { + m_lastButtonPressed = b; + + QString offStyle(QStringLiteral("QLabel { color : gray; }")); + + if (b == m_buttonMainColor) { + m_colorWheel->setColor(m_uiColor); + m_labelContrast->setStyleSheet(offStyle); + m_labelMain->setStyleSheet(styleSheet()); + } else { + m_colorWheel->setColor(m_contrastColor); + m_labelContrast->setStyleSheet(styleSheet()); + m_labelMain->setStyleSheet(offStyle); + } + b->setIcon(b->icon()); + } +} diff --git a/src/config/uicoloreditor.h b/src/config/uicoloreditor.h new file mode 100644 index 0000000..58a172b --- /dev/null +++ b/src/config/uicoloreditor.h @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "QtColorWidgets/color_wheel.hpp" +#include "src/widgets/capture/capturetoolbutton.h" +#include + +class QVBoxLayout; +class QHBoxLayout; +class CaptureToolButton; +class ClickableLabel; + +class UIcolorEditor : public QWidget +{ + Q_OBJECT +public: + explicit UIcolorEditor(QWidget* parent = nullptr); + +public slots: + void updateComponents(); + +private slots: + void updateUIcolor(); + void updateLocalColor(const QColor); + void changeLastButton(CaptureToolButton*); + +private: + QColor m_uiColor, m_contrastColor; + CaptureToolButton* m_buttonMainColor; + ClickableLabel* m_labelMain; + CaptureToolButton* m_buttonContrast; + ClickableLabel* m_labelContrast; + CaptureToolButton* m_lastButtonPressed; + color_widgets::ColorWheel* m_colorWheel; + + static const CaptureTool::Type m_buttonIconType = CaptureTool::TYPE_CIRCLE; + + QHBoxLayout* m_hLayout; + QVBoxLayout* m_vLayout; + + void initColorWheel(); + void initButtons(); +}; diff --git a/src/config/visualseditor.cpp b/src/config/visualseditor.cpp new file mode 100644 index 0000000..5252123 --- /dev/null +++ b/src/config/visualseditor.cpp @@ -0,0 +1,147 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "visualseditor.h" +#include "src/config/buttonlistview.h" +#include "src/config/colorpickereditor.h" +#include "src/config/extendedslider.h" +#include "src/config/uicoloreditor.h" +#include "src/utils/confighandler.h" +#include +#include +#include +#include + +VisualsEditor::VisualsEditor(QWidget* parent) + : QWidget(parent) +{ + m_layout = new QVBoxLayout(); + setLayout(m_layout); + initWidgets(); +} + +void VisualsEditor::updateComponents() +{ + m_buttonList->updateComponents(); + m_colorEditor->updateComponents(); + int opacity = ConfigHandler().contrastOpacity(); + m_opacitySlider->setMapedValue(0, opacity, 255); +} + +void VisualsEditor::initOpacitySlider() +{ + m_opacitySlider = new ExtendedSlider(); + m_opacitySlider->setFocusPolicy(Qt::NoFocus); + m_opacitySlider->setOrientation(Qt::Horizontal); + m_opacitySlider->setRange(0, 100); + auto* localLayout = new QHBoxLayout(); + localLayout->addWidget(new QLabel(QStringLiteral("0%"))); + localLayout->addWidget(m_opacitySlider); + localLayout->addWidget(new QLabel(QStringLiteral("100%"))); + + auto* label = new QLabel(); + QString labelMsg = tr("Opacity of area outside selection:") + " %1%"; + ExtendedSlider* opacitySlider = m_opacitySlider; + connect(m_opacitySlider, + &ExtendedSlider::valueChanged, + this, + [labelMsg, label, opacitySlider](int val) { + label->setText(labelMsg.arg(val)); + ConfigHandler().setContrastOpacity( + opacitySlider->mappedValue(0, 255)); + }); + m_layout->addWidget(label); + m_layout->addLayout(localLayout); + + int opacity = ConfigHandler().contrastOpacity(); + m_opacitySlider->setMapedValue(0, opacity, 255); +} + +void VisualsEditor::initWidgets() +{ + initTranslations(); + + m_tabWidget = new QTabWidget(); + m_layout->addWidget(m_tabWidget); + + m_colorEditor = new UIcolorEditor(); + m_colorEditorTab = new QWidget(); + auto* colorEditorLayout = new QVBoxLayout(m_colorEditorTab); + m_colorEditorTab->setLayout(colorEditorLayout); + colorEditorLayout->addWidget(m_colorEditor); + m_tabWidget->addTab(m_colorEditorTab, tr("UI Color Editor")); + + m_colorpickerEditor = new ColorPickerEditor(); + m_colorpickerEditorTab = new QWidget(); + auto* colorpickerEditorLayout = new QVBoxLayout(m_colorpickerEditorTab); + colorpickerEditorLayout->addWidget(m_colorpickerEditor); + m_tabWidget->addTab(m_colorpickerEditorTab, tr("Colorpicker Editor")); + + initOpacitySlider(); + + auto* boxButtons = new QGroupBox(); + boxButtons->setTitle(tr("Button Selection")); + auto* listLayout = new QVBoxLayout(boxButtons); + m_buttonList = new ButtonListView(); + m_layout->addWidget(boxButtons); + listLayout->addWidget(m_buttonList); + + auto* setAllButtons = new QPushButton(tr("Select All")); + connect(setAllButtons, + &QPushButton::clicked, + m_buttonList, + &ButtonListView::selectAll); + listLayout->addWidget(setAllButtons); +} + +void VisualsEditor::initTranslations() +{ + auto* localLayout = new QHBoxLayout(); + localLayout->addWidget(new QLabel(tr("UI language"))); + m_selectTranslation = new QComboBox(this); + + QStringList translations; + QString tmpFilename; + for (const QString& path : PathInfo::translationsPaths()) { + QDirIterator it(path, + QStringList() << QStringLiteral("*.qm"), + QDir::NoDotAndDotDot | QDir::Files); + while (it.hasNext()) { + it.next(); + tmpFilename = it.fileName(); + + if (tmpFilename.startsWith( + QStringLiteral("Internationalization_"))) { + tmpFilename = + tmpFilename.remove(QStringLiteral("Internationalization_")) + .remove(QStringLiteral(".qm")); + if (!translations.contains(tmpFilename)) { + translations << tmpFilename; + } + } + } + } + translations.sort(); + translations.push_front(QStringLiteral("auto")); + m_selectTranslation->addItems(translations); + + QString language = ConfigHandler().value("uiLanguage").toString(); + m_selectTranslation->setCurrentIndex( + m_selectTranslation->findText(language)); + + connect(m_selectTranslation, + &QComboBox::currentTextChanged, + this, + [this](const QString& text) { + ConfigHandler().setUiLanguage(text); + // TODO: Retranslate UI without restart + QMessageBox::information( + this, + tr("Configuration"), + tr("Flameshot must be restarted to apply these changes!")); + }); + + localLayout->addWidget(m_selectTranslation); + localLayout->addStretch(); + m_layout->addLayout(localLayout); +} diff --git a/src/config/visualseditor.h b/src/config/visualseditor.h new file mode 100644 index 0000000..aa73e60 --- /dev/null +++ b/src/config/visualseditor.h @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include +#include +#include + +class ExtendedSlider; +class QVBoxLayout; +class ButtonListView; +class UIcolorEditor; +class ColorPickerEditor; + +class VisualsEditor : public QWidget +{ + Q_OBJECT +public: + explicit VisualsEditor(QWidget* parent = nullptr); + +public slots: + void updateComponents(); + +private: + QVBoxLayout* m_layout; + + QTabWidget* m_tabWidget; + + UIcolorEditor* m_colorEditor; + QWidget* m_colorEditorTab; + + ColorPickerEditor* m_colorpickerEditor; + QWidget* m_colorpickerEditorTab; + + ButtonListView* m_buttonList; + ExtendedSlider* m_opacitySlider; + + QComboBox* m_selectTranslation; + + void initWidgets(); + void initOpacitySlider(); + void initTranslations(); +}; diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt new file mode 100644 index 0000000..77b8dc8 --- /dev/null +++ b/src/core/CMakeLists.txt @@ -0,0 +1,32 @@ +target_sources(flameshot PRIVATE + flameshot.h + flameshotdaemon.h + qguiappcurrentscreen.h +) + +target_sources(flameshot PRIVATE + capturerequest.cpp + flameshot.cpp + flameshotdaemon.cpp + qguiappcurrentscreen.cpp +) + +if (UNIX AND NOT APPLE) +target_sources(flameshot PRIVATE + flameshotdbusadapter.h + flameshotdbusadapter.cpp +) +endif () + +if (USE_KDSINGLEAPPLICATION) +if (NOT WIN32) +target_sources(flameshot PRIVATE + signaldaemon.h + signaldaemon.cpp +) +endif () +endif () + +if (WIN32) + target_sources(flameshot PRIVATE globalshortcutfilter.h globalshortcutfilter.cpp) +endif () diff --git a/src/core/capturerequest.cpp b/src/core/capturerequest.cpp new file mode 100644 index 0000000..6fc7684 --- /dev/null +++ b/src/core/capturerequest.cpp @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "capturerequest.h" +#include "confighandler.h" +#include "src/config/cacheutils.h" +#include +#include +#include +#include +#include + +CaptureRequest::CaptureRequest(CaptureRequest::CaptureMode mode, + const uint delay, + QVariant data, + CaptureRequest::ExportTask tasks) + : m_mode(mode) + , m_delay(delay) + , m_tasks(tasks) + , m_data(std::move(data)) +{ + + ConfigHandler config; + if (m_mode == CaptureRequest::CaptureMode::GRAPHICAL_MODE && + config.saveLastRegion()) { + setInitialSelection(getLastRegion()); + } +} + +CaptureRequest::CaptureMode CaptureRequest::captureMode() const +{ + return m_mode; +} + +uint CaptureRequest::delay() const +{ + return m_delay; +} + +QString CaptureRequest::path() const +{ + return m_path; +} + +QVariant CaptureRequest::data() const +{ + return m_data; +} + +CaptureRequest::ExportTask CaptureRequest::tasks() const +{ + return m_tasks; +} + +QRect CaptureRequest::initialSelection() const +{ + return m_initialSelection; +} + +void CaptureRequest::addTask(CaptureRequest::ExportTask task) +{ + if (task == SAVE) { + throw std::logic_error("SAVE task must be added using addSaveTask"); + } + m_tasks |= task; +} + +void CaptureRequest::removeTask(ExportTask task) +{ + ((int&)m_tasks) &= ~task; +} + +void CaptureRequest::addSaveTask(const QString& path) +{ + m_tasks |= SAVE; + m_path = path; +} + +void CaptureRequest::addPinTask(const QRect& pinWindowGeometry) +{ + m_tasks |= PIN; + m_pinWindowGeometry = pinWindowGeometry; +} + +void CaptureRequest::setInitialSelection(const QRect& selection) +{ + m_initialSelection = selection; +} diff --git a/src/core/capturerequest.h b/src/core/capturerequest.h new file mode 100644 index 0000000..ac8f885 --- /dev/null +++ b/src/core/capturerequest.h @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include +#include +#include + +class CaptureRequest +{ +public: + enum CaptureMode + { + FULLSCREEN_MODE, + GRAPHICAL_MODE, + SCREEN_MODE, + }; + + enum ExportTask + { + NO_TASK = 0, + COPY = 1, + SAVE = 2, + PRINT_RAW = 4, + PRINT_GEOMETRY = 8, + PIN = 16, + UPLOAD = 32, + ACCEPT_ON_SELECT = 64, + }; + + CaptureRequest(CaptureMode mode, + const uint delay = 0, + QVariant data = QVariant(), + ExportTask tasks = NO_TASK); + + void setStaticID(uint id); + + uint id() const; + uint delay() const; + QString path() const; + QVariant data() const; + CaptureMode captureMode() const; + ExportTask tasks() const; + QRect initialSelection() const; + + void addTask(ExportTask task); + void removeTask(ExportTask task); + void addSaveTask(const QString& path = QString()); + void addPinTask(const QRect& pinWindowGeometry); + void setInitialSelection(const QRect& selection); + +private: + CaptureMode m_mode; + uint m_delay; + QString m_path; + ExportTask m_tasks; + QVariant m_data; + QRect m_pinWindowGeometry, m_initialSelection; + + CaptureRequest() {} +}; + +using eTask = CaptureRequest::ExportTask; + +inline eTask operator|(const eTask& a, const eTask& b) +{ + return static_cast(static_cast(a) | static_cast(b)); +} + +inline eTask operator&(const eTask& a, const eTask& b) +{ + return static_cast(static_cast(a) & static_cast(b)); +} + +inline eTask& operator|=(eTask& a, const eTask& b) +{ + a = static_cast(static_cast(a) | static_cast(b)); + return a; +} diff --git a/src/core/flameshot.cpp b/src/core/flameshot.cpp new file mode 100644 index 0000000..3eb1432 --- /dev/null +++ b/src/core/flameshot.cpp @@ -0,0 +1,454 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "flameshot.h" +#include "flameshotdaemon.h" +#if defined(Q_OS_MACOS) +#include "qhotkey.h" +#endif + +#include "abstractlogger.h" +#include "screenshotsaver.h" +#include "src/config/configresolver.h" +#include "src/config/configwindow.h" +#include "src/core/qguiappcurrentscreen.h" + +#ifdef ENABLE_IMGUR +#include "src/tools/imgupload/imguploadermanager.h" +#include "src/tools/imgupload/storages/imguploaderbase.h" +#include "src/widgets/imguploaddialog.h" +#include "src/widgets/uploadhistory.h" +#endif + +#include "src/utils/confighandler.h" +#include "src/utils/screengrabber.h" +#include "src/widgets/capture/capturewidget.h" +#include "src/widgets/capturelauncher.h" +#include "src/widgets/infowindow.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(Q_OS_MACOS) +#include +#endif + +Flameshot::Flameshot() + : m_haveExternalWidget(false) + , m_captureWindow(nullptr) +#if defined(Q_OS_MACOS) + , m_HotkeyScreenshotCapture(nullptr) + , m_HotkeyScreenshotHistory(nullptr) +#endif +{ + QString StyleSheet = CaptureButton::globalStyleSheet(); + qApp->setStyleSheet(StyleSheet); + +#if defined(Q_OS_MACOS) + // Try to take a test screenshot, MacOS will request a "Screen Recording" + // permissions on the first run. Otherwise it will be hidden under the + // CaptureWidget + QScreen* currentScreen = QGuiAppCurrentScreen().currentScreen(); + currentScreen->grabWindow(0, 0, 0, 1, 1); + + // set global shortcuts for MacOS + m_HotkeyScreenshotCapture = new QHotkey( + QKeySequence(ConfigHandler().shortcut("TAKE_SCREENSHOT")), true, this); + QObject::connect(m_HotkeyScreenshotCapture, + &QHotkey::activated, + qApp, + [this]() { gui(); }); +#ifdef ENABLE_IMGUR + m_HotkeyScreenshotHistory = new QHotkey( + QKeySequence(ConfigHandler().shortcut("SCREENSHOT_HISTORY")), true, this); + QObject::connect(m_HotkeyScreenshotHistory, + &QHotkey::activated, + qApp, + [this]() { history(); }); +#endif +#endif +} + +Flameshot* Flameshot::instance() +{ + static Flameshot c; + return &c; +} + +CaptureWidget* Flameshot::gui(const CaptureRequest& req) +{ + if (!resolveAnyConfigErrors()) { + return nullptr; + } + +#if defined(Q_OS_MACOS) + // This is required on MacOS because of Mission Control. If you'll switch to + // another Desktop you cannot take a new screenshot from the tray, you have + // to switch back to the Flameshot Desktop manually. It is not obvious and a + // large number of users are confused and report a bug. + if (m_captureWindow != nullptr) { + m_captureWindow->close(); + delete m_captureWindow; + m_captureWindow = nullptr; + } +#endif + + if (nullptr == m_captureWindow) { + // TODO is this unnecessary now? + int timeout = 5000; // 5 seconds + const int delay = 100; + QWidget* modalWidget = nullptr; + for (; timeout >= 0; timeout -= delay) { + modalWidget = qApp->activeModalWidget(); + if (nullptr == modalWidget) { + break; + } + modalWidget->close(); + modalWidget->deleteLater(); + QThread::msleep(delay); + } + if (0 == timeout) { + QMessageBox::warning( + nullptr, tr("Error"), tr("Unable to close active modal widgets")); + return nullptr; + } + + m_captureWindow = new CaptureWidget(req); + +#ifdef Q_OS_WIN + m_captureWindow->show(); +#elif defined(Q_OS_MACOS) + // In "Emulate fullscreen mode" + m_captureWindow->showFullScreen(); + m_captureWindow->activateWindow(); + m_captureWindow->raise(); +#else + m_captureWindow->showFullScreen(); +// m_captureWindow->show(); // For CaptureWidget Debugging under Linux +#endif + return m_captureWindow; + } else { + emit captureFailed(); + return nullptr; + } +} + +void Flameshot::screen(CaptureRequest req, const int screenNumber) +{ + if (!resolveAnyConfigErrors()) { + return; + } + + bool ok = true; + QScreen* screen; + + if (screenNumber < 0) { + QPoint globalCursorPos = QCursor::pos(); + screen = qApp->screenAt(globalCursorPos); + } else if (screenNumber >= qApp->screens().count()) { + AbstractLogger() << QObject::tr( + "Requested screen exceeds screen count"); + emit captureFailed(); + return; + } else { + screen = qApp->screens()[screenNumber]; + } + QPixmap p(ScreenGrabber().grabScreen(screen, ok)); + if (ok) { + QRect geometry = ScreenGrabber().screenGeometry(screen); + QRect region = req.initialSelection(); + if (region.isNull()) { + region = ScreenGrabber().screenGeometry(screen); + } else { + QRect screenGeom = ScreenGrabber().screenGeometry(screen); + screenGeom.moveTopLeft({ 0, 0 }); + region = region.intersected(screenGeom); + p = p.copy(region); + } + if (req.tasks() & CaptureRequest::PIN) { + // change geometry for pin task + req.addPinTask(region); + } + exportCapture(p, geometry, req); + } else { + emit captureFailed(); + } +} + +void Flameshot::full(const CaptureRequest& req) +{ + if (!resolveAnyConfigErrors()) { + return; + } + + bool ok = true; + QPixmap p(ScreenGrabber().grabEntireDesktop(ok)); + QRect region = req.initialSelection(); + if (!region.isNull()) { + p = p.copy(region); + } + if (ok) { + QRect selection; // `flameshot full` does not support --selection + exportCapture(p, selection, req); + } else { + emit captureFailed(); + } +} + +void Flameshot::launcher() +{ + if (!resolveAnyConfigErrors()) { + return; + } + + if (m_launcherWindow == nullptr) { + m_launcherWindow = new CaptureLauncher(); + } + m_launcherWindow->show(); +#if defined(Q_OS_MACOS) + m_launcherWindow->activateWindow(); + m_launcherWindow->raise(); +#endif +} + +void Flameshot::config() +{ + if (!resolveAnyConfigErrors()) { + return; + } + + if (m_configWindow == nullptr) { + m_configWindow = new ConfigWindow(); + m_configWindow->show(); + // Call show() first, otherwise the correct geometry cannot be fetched + // for centering the window on the screen + QRect position = m_configWindow->frameGeometry(); + QScreen* currentScreen = QGuiAppCurrentScreen().currentScreen(); + position.moveCenter(currentScreen->availableGeometry().center()); + m_configWindow->move(position.topLeft()); +#if defined(Q_OS_MACOS) + m_configWindow->activateWindow(); + m_configWindow->raise(); +#endif + } +} + +void Flameshot::info() +{ + if (m_infoWindow == nullptr) { + m_infoWindow = new InfoWindow(); +#if defined(Q_OS_MACOS) + m_infoWindow->activateWindow(); + m_infoWindow->raise(); +#endif + } +} + +#ifdef ENABLE_IMGUR +void Flameshot::history() +{ + static UploadHistory* historyWidget = nullptr; + if (historyWidget == nullptr) { + historyWidget = new UploadHistory; + historyWidget->loadHistory(); + connect(historyWidget, &QObject::destroyed, this, []() { + historyWidget = nullptr; + }); + } + + historyWidget->show(); + // Call show() first, otherwise the correct geometry cannot be fetched + // for centering the window on the screen + QRect position = historyWidget->frameGeometry(); + QScreen* currentScreen = QGuiAppCurrentScreen().currentScreen(); + position.moveCenter(currentScreen->availableGeometry().center()); + historyWidget->move(position.topLeft()); + +#if defined(Q_OS_MACOS) + historyWidget->activateWindow(); + historyWidget->raise(); +#endif +} +#endif + +void Flameshot::openSavePath() +{ + QString savePath = ConfigHandler().savePath(); + if (!savePath.isEmpty()) { + QDesktopServices::openUrl(QUrl::fromLocalFile(savePath)); + } +} + +QVersionNumber Flameshot::getVersion() +{ + return QVersionNumber::fromString( + QStringLiteral(APP_VERSION).replace("v", "")); +} + +void Flameshot::setOrigin(Origin origin) +{ + m_origin = origin; +} + +Flameshot::Origin Flameshot::origin() +{ + return m_origin; +} + +/** + * @brief Prompt the user to resolve config errors if necessary. + * @return Whether errors were resolved. + */ +bool Flameshot::resolveAnyConfigErrors() +{ + bool resolved = true; + ConfigHandler confighandler; + if (!confighandler.checkUnrecognizedSettings() || + !confighandler.checkSemantics()) { + auto* resolver = new ConfigResolver(); + QObject::connect( + resolver, &ConfigResolver::rejected, [resolver, &resolved]() { + resolved = false; + resolver->deleteLater(); + if (origin() == CLI) { + exit(1); + } + }); + QObject::connect( + resolver, &ConfigResolver::accepted, [resolver, &resolved]() { + resolved = true; + resolver->close(); + resolver->deleteLater(); + // Ensure that the dialog is closed before starting capture + qApp->processEvents(); + }); + resolver->exec(); + qApp->processEvents(); + } + return resolved; +} + +void Flameshot::requestCapture(const CaptureRequest& request) +{ + if (!resolveAnyConfigErrors()) { + return; + } + + switch (request.captureMode()) { + case CaptureRequest::FULLSCREEN_MODE: + QTimer::singleShot(request.delay(), + [this, request] { full(request); }); + break; + case CaptureRequest::SCREEN_MODE: { + int&& number = request.data().toInt(); + QTimer::singleShot(request.delay(), [this, request, number]() { + screen(request, number); + }); + break; + } + case CaptureRequest::GRAPHICAL_MODE: { + QTimer::singleShot( + request.delay(), this, [this, request]() { gui(request); }); + break; + } + default: + emit captureFailed(); + break; + } +} + +void Flameshot::exportCapture(const QPixmap& capture, + QRect& selection, + const CaptureRequest& req) +{ + using CR = CaptureRequest; + int tasks = req.tasks(), mode = req.captureMode(); + QString path = req.path(); + + if (tasks & CR::PRINT_GEOMETRY) { + QTextStream(stdout) + << selection.width() << "x" << selection.height() << "+" + << selection.x() << "+" << selection.y() << "\n"; + } + + if (tasks & CR::PRINT_RAW) { + QByteArray byteArray; + QBuffer buffer(&byteArray); + capture.save(&buffer, "PNG"); + QFile file; + file.open(stdout, QIODevice::WriteOnly); + + file.write(byteArray); + file.close(); + } + + if (tasks & CR::SAVE) { + if (req.path().isEmpty()) { + saveToFilesystemGUI(capture); + } else { + saveToFilesystem(capture, path); + } + } + + if (tasks & CR::COPY) { + FlameshotDaemon::copyToClipboard(capture); + } + + if (tasks & CR::PIN) { + FlameshotDaemon::createPin(capture, selection); + if (mode == CR::SCREEN_MODE || mode == CR::FULLSCREEN_MODE) { + AbstractLogger::info() + << QObject::tr("Full screen screenshot pinned to screen"); + } + } + +#ifdef ENABLE_IMGUR + if (tasks & CR::UPLOAD) { + if (!ConfigHandler().uploadWithoutConfirmation()) { + auto* dialog = new ImgUploadDialog(); + if (dialog->exec() == QDialog::Rejected) { + return; + } + } + + ImgUploaderBase* widget = ImgUploaderManager().uploader(capture); + widget->show(); + widget->activateWindow(); + // NOTE: lambda can't capture 'this' because it might be destroyed later + CR::ExportTask tasks = tasks; + QObject::connect( + widget, &ImgUploaderBase::uploadOk, [=, this](const QUrl& url) { + if (ConfigHandler().copyURLAfterUpload()) { + if (!(tasks & CR::COPY)) { + FlameshotDaemon::copyToClipboard( + url.toString(), tr("URL copied to clipboard.")); + } + widget->showPostUploadDialog(); + } + }); + } +#endif + + if (!(tasks & CR::UPLOAD)) { + emit captureTaken(capture); + } +} + +void Flameshot::setExternalWidget(bool b) +{ + m_haveExternalWidget = b; +} +bool Flameshot::haveExternalWidget() +{ + return m_haveExternalWidget; +} + +// STATIC ATTRIBUTES +Flameshot::Origin Flameshot::m_origin = Flameshot::DAEMON; diff --git a/src/core/flameshot.h b/src/core/flameshot.h new file mode 100644 index 0000000..a9a80ab --- /dev/null +++ b/src/core/flameshot.h @@ -0,0 +1,97 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/core/capturerequest.h" +#include +#include +#include + +class CaptureWidget; +class ConfigWindow; +class InfoWindow; +class CaptureLauncher; +#ifdef ENABLE_IMGUR +class UploadHistory; +#endif +#if (defined(Q_OS_MAC) || defined(Q_OS_MACOS)) +class QHotkey; +#endif + +enum ErrCode : uint8_t +{ + E_OK = 0, + E_GENERAL, + E_ABORTED, + E_DBUSCONN, + E_SIG_BASE = 128, + E_SIGINT = E_SIG_BASE + 2, + E_SIGTERM = E_SIG_BASE + 15, +}; + +class Flameshot : public QObject +{ + Q_OBJECT + +public: + enum Origin + { + CLI, + DAEMON + }; + + static Flameshot* instance(); + +public slots: + CaptureWidget* gui( + const CaptureRequest& req = CaptureRequest::GRAPHICAL_MODE); + void screen(CaptureRequest req, int const screenNumber = -1); + void full(const CaptureRequest& req); + void launcher(); + void config(); + + void info(); + +#ifdef ENABLE_IMGUR + void history(); +#endif + + void openSavePath(); + + QVersionNumber getVersion(); + +public: + static void setOrigin(Origin origin); + static Origin origin(); + void setExternalWidget(bool b); + bool haveExternalWidget(); + +signals: + void captureTaken(QPixmap p); + void captureFailed(); + +public slots: + void requestCapture(const CaptureRequest& request); + void exportCapture(const QPixmap& p, + QRect& selection, + const CaptureRequest& req); + +private: + Flameshot(); + bool resolveAnyConfigErrors(); + + // class members + static Origin m_origin; + bool m_haveExternalWidget; + + QPointer m_captureWindow; + QPointer m_infoWindow; + QPointer m_launcherWindow; + QPointer m_configWindow; + +#if (defined(Q_OS_MAC) || defined(Q_OS_MACOS)) + QHotkey* m_HotkeyScreenshotCapture; + QHotkey* m_HotkeyScreenshotHistory; +#endif +}; diff --git a/src/core/flameshotdaemon.cpp b/src/core/flameshotdaemon.cpp new file mode 100644 index 0000000..5274b60 --- /dev/null +++ b/src/core/flameshotdaemon.cpp @@ -0,0 +1,513 @@ +#include "flameshotdaemon.h" + +#include "abstractlogger.h" +#include "confighandler.h" +#include "flameshot.h" +#include "pinwidget.h" +#include "screenshotsaver.h" +#include "src/utils/globalvalues.h" +#include "src/widgets/capture/capturewidget.h" +#include "src/widgets/trayicon.h" +#include +#include +#include +#include +#include + +#if !(defined(Q_OS_MACOS) || defined(Q_OS_WIN)) +#include +#include +#endif + +#if !defined(DISABLE_UPDATE_CHECKER) +#include +#include +#include +#include +#include +#include +#include +#endif + +#if defined(USE_KDSINGLEAPPLICATION) && \ + (defined(Q_OS_MACOS) || defined(Q_OS_WIN)) +#include +#include +#endif + +#ifdef Q_OS_WIN +#include "src/core/globalshortcutfilter.h" +#endif + +/** + * @brief A way of accessing the flameshot daemon both from the daemon itself, + * and from subcommands. + * + * The daemon is necessary in order to: + * - Host the system tray, + * - Listen for hotkey events that will trigger captures, + * - Host pinned screenshot widgets, + * - Host the clipboard on X11, where the clipboard gets lost once flameshot + * quits. + * + * If the `autoCloseIdleDaemon` option is true, the daemon will close as soon as + * it is not needed to host pinned screenshots and the clipboard. On Windows, + * this option is disabled and the daemon always persists, because the system + * tray is currently the only way to interact with flameshot there. + * + * Both the daemon and non-daemon flameshot processes use the same public API, + * which is implemented as static methods. In the daemon process, this class is + * also instantiated as a singleton, so it can listen to D-Bus calls via the + * sigslot mechanism. The instantiation is done by calling `start` (this must be + * done only in the daemon process). Any instance (as opposed to static) members + * can only be used if the current process is a daemon. + * + * @note The daemon will be automatically launched where necessary, via D-Bus. + * This applies only to Linux. + */ +FlameshotDaemon::FlameshotDaemon() + : m_persist(false) + , m_hostingClipboard(false) + , m_clipboardSignalBlocked(false) + , m_trayIcon(nullptr) +#if !defined(DISABLE_UPDATE_CHECKER) + , m_appLatestVersion(QStringLiteral(APP_VERSION).replace("v", "")) + , m_showCheckAppUpdateStatus(false) + , m_networkCheckUpdates(nullptr) +#endif +{ + connect( + QApplication::clipboard(), &QClipboard::dataChanged, this, [this]() { + if (!m_hostingClipboard || m_clipboardSignalBlocked) { + m_clipboardSignalBlocked = false; + return; + } + m_hostingClipboard = false; + quitIfIdle(); + }); +#ifdef Q_OS_WIN + m_persist = true; +#else + m_persist = !ConfigHandler().autoCloseIdleDaemon(); + connect(ConfigHandler::getInstance(), + &ConfigHandler::fileChanged, + this, + [this]() { + ConfigHandler config; + enableTrayIcon(!config.disabledTrayIcon()); + m_persist = !config.autoCloseIdleDaemon(); + }); +#endif + +#if !defined(DISABLE_UPDATE_CHECKER) + if (ConfigHandler().checkForUpdates()) { + getLatestAvailableVersion(); + } +#endif +} + +void FlameshotDaemon::start() +{ + if (!m_instance) { + m_instance = new FlameshotDaemon(); + // Tray icon needs FlameshotDaemon::instance() to be non-null + m_instance->initTrayIcon(); + qApp->setQuitOnLastWindowClosed(false); + } +} + +void FlameshotDaemon::createPin(const QPixmap& capture, QRect geometry) +{ + if (instance()) { + instance()->attachPin(capture, geometry); + return; + } + + QByteArray data; + QDataStream stream(&data, QIODevice::WriteOnly); + +#if defined(USE_KDSINGLEAPPLICATION) && \ + (defined(Q_OS_MACOS) || defined(Q_OS_WIN)) + auto kdsa = KDSingleApplication(QStringLiteral("org.flameshot.Flameshot")); + stream << QStringLiteral("attachPin") << capture << geometry; + kdsa.sendMessage(data); +#else + stream << capture << geometry; + QDBusMessage m = createMethodCall(QStringLiteral("attachPin")); + m << data; + call(m); +#endif +} + +void FlameshotDaemon::copyToClipboard(const QPixmap& capture) +{ + if (instance()) { + instance()->attachScreenshotToClipboard(capture); + return; + } + + QByteArray data; + QDataStream stream(&data, QIODevice::WriteOnly); + +#if defined(USE_KDSINGLEAPPLICATION) && \ + (defined(Q_OS_MACOS) || defined(Q_OS_WIN)) + auto kdsa = KDSingleApplication(QStringLiteral("org.flameshot.Flameshot")); + stream << QStringLiteral("attachScreenshotToClipboard") << capture; + kdsa.sendMessage(data); +#else + stream << capture; + QDBusMessage m = + createMethodCall(QStringLiteral("attachScreenshotToClipboard")); + + m << data; + call(m); +#endif +} + +void FlameshotDaemon::copyToClipboard(const QString& text, + const QString& notification) +{ + if (instance()) { + instance()->attachTextToClipboard(text, notification); + return; + } + +#if defined(USE_KDSINGLEAPPLICATION) && \ + (defined(Q_OS_MACOS) || defined(Q_OS_WIN)) + auto kdsa = KDSingleApplication(QStringLiteral("org.flameshot.Flameshot")); + QByteArray data; + QDataStream stream(&data, QIODevice::WriteOnly); + stream << QStringLiteral("attachTextToClipboard") << text << notification; + kdsa.sendMessage(data); +#else + auto m = createMethodCall(QStringLiteral("attachTextToClipboard")); + m << text << notification; + call(m); +#endif +} + +/** + * @brief Is this instance of flameshot hosting any windows as a daemon? + */ +bool FlameshotDaemon::isThisInstanceHostingWidgets() +{ + return instance() && !instance()->m_widgets.isEmpty(); +} + +void FlameshotDaemon::sendTrayNotification(const QString& text, + const QString& title, + const int timeout) +{ + if (m_trayIcon) { + m_trayIcon->showMessage( + title, text, QIcon(GlobalValues::iconPath()), timeout); + } +} + +#if !defined(DISABLE_UPDATE_CHECKER) +void FlameshotDaemon::showUpdateNotificationIfAvailable(CaptureWidget* widget) +{ + if (!m_appLatestUrl.isEmpty() && + ConfigHandler().ignoreUpdateToVersion().compare(m_appLatestVersion) < + 0) { + widget->showAppUpdateNotification(m_appLatestVersion, m_appLatestUrl); + } +} + +void FlameshotDaemon::getLatestAvailableVersion() +{ + // This features is required for MacOS and Windows user and for Linux users + // who installed Flameshot not from the repository. + QNetworkRequest requestCheckUpdates(QUrl(FLAMESHOT_APP_VERSION_URL)); + if (nullptr == m_networkCheckUpdates) { + m_networkCheckUpdates = new QNetworkAccessManager(this); + connect(m_networkCheckUpdates, + &QNetworkAccessManager::finished, + this, + &FlameshotDaemon::handleReplyCheckUpdates); + } + m_networkCheckUpdates->get(requestCheckUpdates); + + // check for updates each 24 hours + QTimer::singleShot(1000 * 60 * 60 * 24, [this]() { + if (ConfigHandler().checkForUpdates()) { + this->getLatestAvailableVersion(); + } + }); +} + +void FlameshotDaemon::checkForUpdates() +{ + if (m_appLatestUrl.isEmpty()) { + m_showCheckAppUpdateStatus = true; + getLatestAvailableVersion(); + } else { + QDesktopServices::openUrl(QUrl(m_appLatestUrl)); + } +} +#endif + +/** + * @brief Return the daemon instance. + * + * If this instance of flameshot is the daemon, a singleton instance of + * `FlameshotDaemon` is returned. As a side effect`start` will called if it + * wasn't called earlier. If this instance of flameshot is not the daemon, + * `nullptr` is returned. + * + * This strategy is used because the daemon needs to receive signals from D-Bus, + * for which an instance of a `QObject` is required. The singleton serves as + * that object. + */ +FlameshotDaemon* FlameshotDaemon::instance() +{ + // Because we don't use DBus on MacOS, each instance of flameshot is its own + // mini-daemon, responsible for hosting its own persistent widgets (e.g. + // pins). +#if defined(Q_OS_MACOS) + start(); +#endif + return m_instance; +} + +/** + * @brief Quit the daemon if it has nothing to do and the 'persist' flag is not + * set. + */ +void FlameshotDaemon::quitIfIdle() +{ + if (m_persist) { + return; + } + if (!m_hostingClipboard && m_widgets.isEmpty()) { + qApp->exit(E_OK); + } +} + +// SERVICE METHODS + +void FlameshotDaemon::attachPin(const QPixmap& pixmap, QRect geometry) +{ + auto* pinWidget = new PinWidget(pixmap, geometry); + m_widgets.append(pinWidget); + connect(pinWidget, &QObject::destroyed, this, [=, this]() { + m_widgets.removeOne(pinWidget); + quitIfIdle(); + }); + + pinWidget->show(); + pinWidget->activateWindow(); +} + +void FlameshotDaemon::attachScreenshotToClipboard(const QPixmap& pixmap) +{ + m_hostingClipboard = true; + QClipboard* clipboard = QApplication::clipboard(); + clipboard->blockSignals(true); + // This variable is necessary because the signal doesn't get blocked on + // windows for some reason + m_clipboardSignalBlocked = true; + saveToClipboard(pixmap); + clipboard->blockSignals(false); +} + +// D-BUS / KDSingleApplication METHODS + +void FlameshotDaemon::attachPin(const QByteArray& data) +{ + QDataStream stream(data); + QPixmap pixmap; + QRect geometry; + + stream >> pixmap; + stream >> geometry; + + attachPin(pixmap, geometry); +} + +void FlameshotDaemon::attachScreenshotToClipboard(const QByteArray& screenshot) +{ + QDataStream stream(screenshot); + QPixmap p; + stream >> p; + + attachScreenshotToClipboard(p); +} + +void FlameshotDaemon::attachTextToClipboard(const QString& text, + const QString& notification) +{ + // Must send notification before clipboard modification on linux + if (!notification.isEmpty()) { + AbstractLogger::info() << notification; + } + + m_hostingClipboard = true; + QClipboard* clipboard = QApplication::clipboard(); + + clipboard->blockSignals(true); + // This variable is necessary because the signal doesn't get blocked on + // windows for some reason + m_clipboardSignalBlocked = true; + clipboard->setText(text); + clipboard->blockSignals(false); +} + +void FlameshotDaemon::initTrayIcon() +{ +#if defined(Q_OS_LINUX) || defined(Q_OS_UNIX) + if (!ConfigHandler().disabledTrayIcon()) { + enableTrayIcon(true); + } +#elif defined(Q_OS_WIN) + enableTrayIcon(true); + + GlobalShortcutFilter* nativeFilter = new GlobalShortcutFilter(this); + qApp->installNativeEventFilter(nativeFilter); + connect(nativeFilter, &GlobalShortcutFilter::printPressed, this, [this]() { + Flameshot::instance()->gui(); + }); +#endif +} + +void FlameshotDaemon::enableTrayIcon(bool enable) +{ + if (enable) { + if (m_trayIcon == nullptr) { + m_trayIcon = new TrayIcon(); + } else { + m_trayIcon->show(); + return; + } + } else if (m_trayIcon) { + m_trayIcon->hide(); + } +} + +#if !defined(DISABLE_UPDATE_CHECKER) +void FlameshotDaemon::handleReplyCheckUpdates(QNetworkReply* reply) +{ + if (!ConfigHandler().checkForUpdates()) { + return; + } + if (reply->error() == QNetworkReply::NoError) { + QJsonDocument response = QJsonDocument::fromJson(reply->readAll()); + QJsonObject json = response.object(); + m_appLatestVersion = json["tag_name"].toString().replace("v", ""); + + QVersionNumber appLatestVersion = + QVersionNumber::fromString(m_appLatestVersion); + if (Flameshot::instance()->getVersion() < appLatestVersion) { + emit newVersionAvailable(appLatestVersion); + m_appLatestUrl = json["html_url"].toString(); + QString newVersion = + tr("New version %1 is available").arg(m_appLatestVersion); + if (m_showCheckAppUpdateStatus) { + sendTrayNotification(newVersion, "Flameshot"); + QDesktopServices::openUrl(QUrl(m_appLatestUrl)); + } + } else if (m_showCheckAppUpdateStatus) { + sendTrayNotification(tr("You have the latest version"), + "Flameshot"); + } + } else { + qWarning() << "Failed to get information about the latest version. " + << reply->errorString(); + if (m_showCheckAppUpdateStatus) { + if (FlameshotDaemon::instance()) { + FlameshotDaemon::instance()->sendTrayNotification( + tr("Failed to get information about the latest version."), + "Flameshot"); + } + } + } + m_showCheckAppUpdateStatus = false; +} +#endif + +#if !(defined(Q_OS_MACOS) || defined(Q_OS_WIN)) +QDBusMessage FlameshotDaemon::createMethodCall(const QString& method) +{ + QDBusMessage m = + QDBusMessage::createMethodCall(QStringLiteral("org.flameshot.Flameshot"), + QStringLiteral("/"), + QLatin1String(""), + method); + return m; +} + +void FlameshotDaemon::checkDBusConnection(const QDBusConnection& connection) +{ + if (!connection.isConnected()) { + AbstractLogger::error() << tr("Unable to connect via DBus"); + qApp->exit(E_DBUSCONN); + } +} + +void FlameshotDaemon::call(const QDBusMessage& m) +{ + QDBusConnection sessionBus = QDBusConnection::sessionBus(); + checkDBusConnection(sessionBus); + sessionBus.call(m); +} +#endif + +#if defined(USE_KDSINGLEAPPLICATION) && \ + (defined(Q_OS_MACOS) || defined(Q_OS_WIN)) +void FlameshotDaemon::messageReceivedFromSecondaryInstance( + const QByteArray& message) +{ + // qDebug() << "Received message from second instance:" << message; + + QByteArray messageCopy = message; + QBuffer buffer(&messageCopy); + buffer.open(QIODevice::ReadOnly); + QDataStream stream(&buffer); + QString methodCall; + stream >> methodCall; + // qDebug() << "Method:" << methodCall; + + if (methodCall == QStringLiteral("attachPin")) { + QPixmap capture; + QRect geometry; + stream >> capture >> geometry; + // qDebug() << "Pixmap:" << capture; + // qDebug() << "Geometry:" << geometry; + if (!capture.isNull()) { + FlameshotDaemon::instance()->attachPin(capture, geometry); + } else { + qWarning() << "Received \"attachPin\" from second instance, but " + "pixmap is empty!"; + } + } else if (methodCall == QStringLiteral("attachScreenshotToClipboard")) { + QPixmap capture; + stream >> capture; + // qDebug() << "Pixmap:" << capture; + if (!capture.isNull()) { + FlameshotDaemon::instance()->attachScreenshotToClipboard(capture); + } else { + qWarning() << "Received \"attachScreenshotToClipboard\" from " + "second instance, but pixmap is empty!"; + } + } else if (methodCall == (QStringLiteral("attachTextToClipboard"))) { + QString text; + QString notification; + stream >> text >> notification; + // qDebug() << "Text:" << text; + // qDebug() << "Notification:" << notification; + if (!text.isEmpty()) { + FlameshotDaemon::instance()->attachTextToClipboard(text, + notification); + } else { + qWarning() << "Received \"attachTextToClipboard\" from second " + "instance, but text is empty!"; + } + } else { + qWarning() << "Received unknown message from second instance:" + << message; + } +} +#endif + +// STATIC ATTRIBUTES +FlameshotDaemon* FlameshotDaemon::m_instance = nullptr; diff --git a/src/core/flameshotdaemon.h b/src/core/flameshotdaemon.h new file mode 100644 index 0000000..2aa7ca5 --- /dev/null +++ b/src/core/flameshotdaemon.h @@ -0,0 +1,99 @@ +#pragma once + +#include +#include + +#if !(defined(Q_OS_MACOS) || defined(Q_OS_WIN)) +#include +#endif + +class QPixmap; +class QRect; +class QDBusMessage; +class QDBusConnection; +class TrayIcon; +class CaptureWidget; + +#if !defined(DISABLE_UPDATE_CHECKER) +class QNetworkAccessManager; +class QNetworkReply; +class QVersionNumber; +#endif + +class FlameshotDaemon : public QObject +{ + Q_OBJECT +public: + static void start(); + static FlameshotDaemon* instance(); + static void createPin(const QPixmap& capture, QRect geometry); + static void copyToClipboard(const QPixmap& capture); + static void copyToClipboard(const QString& text, + const QString& notification = ""); + static bool isThisInstanceHostingWidgets(); + + void sendTrayNotification( + const QString& text, + const QString& title = QStringLiteral("Flameshot Info"), + const int timeout = 5000); + +#if defined(USE_KDSINGLEAPPLICATION) && \ + (defined(Q_OS_MACOS) || defined(Q_OS_WIN)) +public slots: + void messageReceivedFromSecondaryInstance(const QByteArray& message); +#endif + +#if !defined(DISABLE_UPDATE_CHECKER) +public: + void showUpdateNotificationIfAvailable(CaptureWidget* widget); + +public slots: + void checkForUpdates(); + void getLatestAvailableVersion(); + +private slots: + void handleReplyCheckUpdates(QNetworkReply* reply); + +signals: + void newVersionAvailable(QVersionNumber version); +#endif + +private: + FlameshotDaemon(); + void quitIfIdle(); + void attachPin(const QPixmap& pixmap, QRect geometry); + void attachScreenshotToClipboard(const QPixmap& pixmap); + + void attachPin(const QByteArray& data); + void attachScreenshotToClipboard(const QByteArray& screenshot); + void attachTextToClipboard(const QString& text, + const QString& notification); + + void initTrayIcon(); + void enableTrayIcon(bool enable); + +#if !(defined(Q_OS_MACOS) || defined(Q_OS_WIN)) + static QDBusMessage createMethodCall(const QString& method); + static void checkDBusConnection(const QDBusConnection& connection); + static void call(const QDBusMessage& m); +#endif + + bool m_persist; + bool m_hostingClipboard; + bool m_clipboardSignalBlocked; + QList m_widgets; + TrayIcon* m_trayIcon; + +#if !defined(DISABLE_UPDATE_CHECKER) + QString m_appLatestUrl; + QString m_appLatestVersion; + bool m_showCheckAppUpdateStatus; + QNetworkAccessManager* m_networkCheckUpdates; +#endif + + static FlameshotDaemon* m_instance; + +#if !(defined(Q_OS_MACOS) || defined(Q_OS_WIN)) + friend class FlameshotDBusAdapter; +#endif +}; diff --git a/src/core/flameshotdbusadapter.cpp b/src/core/flameshotdbusadapter.cpp new file mode 100644 index 0000000..fc48b15 --- /dev/null +++ b/src/core/flameshotdbusadapter.cpp @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "flameshotdbusadapter.h" +#include "src/core/flameshotdaemon.h" + +FlameshotDBusAdapter::FlameshotDBusAdapter(QObject* parent) + : QDBusAbstractAdaptor(parent) +{} + +FlameshotDBusAdapter::~FlameshotDBusAdapter() = default; + +void FlameshotDBusAdapter::attachScreenshotToClipboard(const QByteArray& data) +{ + FlameshotDaemon::instance()->attachScreenshotToClipboard(data); +} + +void FlameshotDBusAdapter::attachTextToClipboard(const QString& text, + const QString& notification) +{ + FlameshotDaemon::instance()->attachTextToClipboard(text, notification); +} + +void FlameshotDBusAdapter::attachPin(const QByteArray& data) +{ + FlameshotDaemon::instance()->attachPin(data); +} diff --git a/src/core/flameshotdbusadapter.h b/src/core/flameshotdbusadapter.h new file mode 100644 index 0000000..eb46d1d --- /dev/null +++ b/src/core/flameshotdbusadapter.h @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include + +class FlameshotDBusAdapter : public QDBusAbstractAdaptor +{ + Q_OBJECT + Q_CLASSINFO("D-Bus Interface", "org.flameshot.Flameshot") + +public: + explicit FlameshotDBusAdapter(QObject* parent = nullptr); + virtual ~FlameshotDBusAdapter(); + +public slots: + Q_NOREPLY void attachScreenshotToClipboard(const QByteArray& data); + Q_NOREPLY void attachTextToClipboard(const QString& text, + const QString& notification); + Q_NOREPLY void attachPin(const QByteArray& data); +}; diff --git a/src/core/globalshortcutfilter.cpp b/src/core/globalshortcutfilter.cpp new file mode 100644 index 0000000..949fde9 --- /dev/null +++ b/src/core/globalshortcutfilter.cpp @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "globalshortcutfilter.h" +#include "src/core/flameshot.h" +#include + +GlobalShortcutFilter::GlobalShortcutFilter(QObject* parent) + : QObject(parent) +{ + // Forced Print Screen + if (RegisterHotKey(NULL, 1, 0, VK_SNAPSHOT)) { + // ok - capture screen + } + + if (RegisterHotKey(NULL, 2, MOD_SHIFT, VK_SNAPSHOT)) { + // ok - show screenshots history + } +} + +bool GlobalShortcutFilter::nativeEventFilter(const QByteArray& eventType, + void* message, + qintptr* result) +{ + Q_UNUSED(eventType) + Q_UNUSED(result) + + MSG* msg = static_cast(message); + if (msg->message == WM_HOTKEY) { + // TODO: this is just a temporary workaround; proper global + // support would need custom shortcuts defined by the user. + const quint32 keycode = HIWORD(msg->lParam); + const quint32 modifiers = LOWORD(msg->lParam); +#ifdef ENABLE_IMGUR + // Show screenshots history + if (VK_SNAPSHOT == keycode && MOD_SHIFT == modifiers) { + Flameshot::instance()->history(); + } +#endif + // Capture screen + if (VK_SNAPSHOT == keycode && 0 == modifiers) { + Flameshot::instance()->requestCapture( + CaptureRequest(CaptureRequest::GRAPHICAL_MODE)); + } + + return true; + } + return false; +} diff --git a/src/core/globalshortcutfilter.h b/src/core/globalshortcutfilter.h new file mode 100644 index 0000000..e6dbc9d --- /dev/null +++ b/src/core/globalshortcutfilter.h @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include +#include + +class GlobalShortcutFilter + : public QObject + , public QAbstractNativeEventFilter +{ + Q_OBJECT +public: + explicit GlobalShortcutFilter(QObject* parent = nullptr); + + bool nativeEventFilter(const QByteArray& eventType, + void* message, + qintptr* result); + +signals: + void printPressed(); + +private: + quint32 getNativeModifier(Qt::KeyboardModifiers modifiers); + quint32 nativeKeycode(Qt::Key key); + bool registerShortcut(quint32 nativeKey, quint32 nativeMods); + bool unregisterShortcut(quint32 nativeKey, quint32 nativeMods); +}; diff --git a/src/core/qguiappcurrentscreen.cpp b/src/core/qguiappcurrentscreen.cpp new file mode 100644 index 0000000..6bd0633 --- /dev/null +++ b/src/core/qguiappcurrentscreen.cpp @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2021 Yuriy Puchkov + +#include "qguiappcurrentscreen.h" +#include +#include +#include +#include + +QGuiAppCurrentScreen::QGuiAppCurrentScreen() +{ + m_currentScreen = nullptr; +} + +QScreen* QGuiAppCurrentScreen::currentScreen() +{ + return currentScreen(QCursor::pos()); +} + +QScreen* QGuiAppCurrentScreen::currentScreen(const QPoint& pos) +{ + m_currentScreen = screenAt(pos); +#if defined(Q_OS_MACOS) + // On the MacOS if mouse position is at the edge of bottom or right sides + // qGuiApp->screenAt will return nullptr, so we need to try to find current + // screen by moving 1 pixel inside to the current desktop area + if (!m_currentScreen && pos.x() > 0) { + QPoint posCorrected(pos.x() - 1, pos.y()); + m_currentScreen = screenAt(posCorrected); + } + if (!m_currentScreen && pos.y() > 0) { + QPoint posCorrected(pos.x(), pos.y() - 1); + m_currentScreen = screenAt(posCorrected); + } + if (!m_currentScreen && pos.x() > 0 && pos.y() > 0) { + QPoint posCorrected(pos.x() - 1, pos.y() - 1); + m_currentScreen = screenAt(posCorrected); + } +#endif + if (!m_currentScreen) { + qCritical("Unable to get current screen, starting to use primary " + "screen. It may be a cause of logical error and working with " + "a wrong screen."); + m_currentScreen = qGuiApp->primaryScreen(); + } + return m_currentScreen; +} + +QScreen* QGuiAppCurrentScreen::screenAt(const QPoint& pos) +{ + m_currentScreen = qGuiApp->screenAt(pos); + return m_currentScreen; +} diff --git a/src/core/qguiappcurrentscreen.h b/src/core/qguiappcurrentscreen.h new file mode 100644 index 0000000..dc5e06a --- /dev/null +++ b/src/core/qguiappcurrentscreen.h @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2021 Yuriy Puchkov + +#ifndef FLAMESHOT_QGUIAPPCURRENTSCREEN_H +#define FLAMESHOT_QGUIAPPCURRENTSCREEN_H + +#include + +class QScreen; + +class QGuiAppCurrentScreen +{ +public: + explicit QGuiAppCurrentScreen(); + QScreen* currentScreen(); + QScreen* currentScreen(const QPoint& pos); + +private: + QScreen* screenAt(const QPoint& pos); + + // class members +private: + QScreen* m_currentScreen; +}; + +#endif // FLAMESHOT_QGUIAPPCURRENTSCREEN_H diff --git a/src/core/signaldaemon.cpp b/src/core/signaldaemon.cpp new file mode 100644 index 0000000..c5ad06c --- /dev/null +++ b/src/core/signaldaemon.cpp @@ -0,0 +1,63 @@ +#include "signaldaemon.h" +#include "flameshot.h" +#include +#include +#include +#include +#include +#include + +int SignalDaemon::sigintFd[2]; +int SignalDaemon::sigtermFd[2]; + +SignalDaemon::SignalDaemon(QObject* parent) + : QObject(parent) +{ + if (::socketpair(AF_UNIX, SOCK_STREAM, 0, sigintFd)) + qFatal("Couldn't create INT socketpair"); + + if (::socketpair(AF_UNIX, SOCK_STREAM, 0, sigtermFd)) + qFatal("Couldn't create TERM socketpair"); + snInt = new QSocketNotifier(sigintFd[1], QSocketNotifier::Read, this); + connect( + snInt, SIGNAL(activated(QSocketDescriptor)), this, SLOT(handleSigInt())); + snTerm = new QSocketNotifier(sigtermFd[1], QSocketNotifier::Read, this); + connect(snTerm, + SIGNAL(activated(QSocketDescriptor)), + this, + SLOT(handleSigTerm())); +} + +void SignalDaemon::intSignalHandler(int) +{ + char msg = 1; + ::write(sigintFd[0], &msg, sizeof(msg)); +} + +void SignalDaemon::termSignalHandler(int) +{ + char msg = 1; + ::write(sigtermFd[0], &msg, sizeof(msg)); +} + +void SignalDaemon::handleSigTerm() +{ + snTerm->setEnabled(false); + char tmp = 0; + ::read(sigtermFd[1], &tmp, sizeof(tmp)); + + QApplication::exit(E_SIGTERM); + snTerm->setEnabled(true); +} + +void SignalDaemon::handleSigInt() +{ + snInt->setEnabled(false); + + char tmp = 0; + ::read(sigintFd[1], &tmp, sizeof(tmp)); + + QApplication::exit(E_SIGINT); + + snInt->setEnabled(true); +} diff --git a/src/core/signaldaemon.h b/src/core/signaldaemon.h new file mode 100644 index 0000000..4411674 --- /dev/null +++ b/src/core/signaldaemon.h @@ -0,0 +1,27 @@ +#include +#include + +class SignalDaemon : public QObject +{ + Q_OBJECT + +public: + SignalDaemon(QObject* parent = 0); + ~SignalDaemon() = default; + + // Unix signal handlers. + static void intSignalHandler(int unused); + static void termSignalHandler(int unused); + +public slots: + // Qt signal handlers. + void handleSigInt(); + void handleSigTerm(); + +private: + static int sigintFd[2]; + static int sigtermFd[2]; + + QSocketNotifier* snInt; + QSocketNotifier* snTerm; +}; \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..953c69e --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,685 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#ifdef USE_KDSINGLEAPPLICATION +#include +#ifdef Q_OS_UNIX +#include "core/signaldaemon.h" +#include "csignal" +#endif +#endif + +#include "abstractlogger.h" +#include "src/cli/commandlineparser.h" +#include "src/config/cacheutils.h" +#include "src/config/styleoverride.h" +#include "src/core/capturerequest.h" +#include "src/core/flameshot.h" +#include "src/core/flameshotdaemon.h" +#include "src/utils/confighandler.h" +#include "src/utils/filenamehandler.h" +#include "src/utils/pathinfo.h" +#include "src/utils/valuehandler.h" +#include +#include +#include +#include +#include +#include +#if !(defined(Q_OS_MACOS) || defined(Q_OS_WIN)) +#include "src/core/flameshotdbusadapter.h" +#include +#include +#include +#endif + +// Required for saving button list QList +Q_DECLARE_METATYPE(QList) + +#if defined(USE_KDSINGLEAPPLICATION) && defined(Q_OS_UNIX) +static int setup_unix_signal_handlers() +{ + struct sigaction sint, term; + + sint.sa_handler = SignalDaemon::intSignalHandler; + sigemptyset(&sint.sa_mask); + sint.sa_flags = 0; + sint.sa_flags |= SA_RESTART; + + if (sigaction(SIGINT, &sint, 0)) + return 1; + + term.sa_handler = SignalDaemon::termSignalHandler; + sigemptyset(&term.sa_mask); + term.sa_flags = 0; + term.sa_flags |= SA_RESTART; + + if (sigaction(SIGTERM, &term, 0)) + return 2; + + return 0; +} +#endif + +int requestCaptureAndWait(const CaptureRequest& req) +{ + Flameshot* flameshot = Flameshot::instance(); + flameshot->requestCapture(req); + QObject::connect(flameshot, &Flameshot::captureTaken, [&](const QPixmap&) { +#if defined(Q_OS_MACOS) + // Only useful on MacOS because each instance hosts its own widgets + if (!FlameshotDaemon::isThisInstanceHostingWidgets()) { + qApp->exit(0); + } +#else + // if this instance is not daemon, make sure it exit after caputre finish + if (FlameshotDaemon::instance() == nullptr && !Flameshot::instance()->haveExternalWidget()) { + qApp->exit(E_OK); + } +#endif + }); + QObject::connect(flameshot, &Flameshot::captureFailed, []() { + AbstractLogger::Target logTarget = static_cast( + ConfigHandler().showAbortNotification() + ? AbstractLogger::Target::Default + : AbstractLogger::Target::Default & + ~AbstractLogger::Target::Notification); + AbstractLogger::info(logTarget) << "Screenshot aborted."; + qApp->exit(E_ABORTED); + }); + return qApp->exec(); +} + +QSharedMemory* guiMutexLock() +{ + QString key = "org.flameshot.Flameshot-" APP_VERSION; + auto* shm = new QSharedMemory(key); +#ifdef Q_OS_UNIX + // Destroy shared memory if the last instance crashed on Unix + shm->attach(); + delete shm; + shm = new QSharedMemory(key); +#endif + if (!shm->create(1)) { + delete shm; + return nullptr; + } + return shm; +} + +void configureTranslation(QTranslator& translator, QTranslator& qtTranslator) +{ + bool foundTranslation; + // Configure translations + for (const QString& path : PathInfo::translationsPaths()) { + if (ConfigHandler().uiLanguage() == QStringLiteral("auto")) { + // Load language, which was detected from the system + foundTranslation = + translator.load(QLocale(), + QStringLiteral("Internationalization"), + QStringLiteral("_"), + path); + } else { + // Load language from settings + foundTranslation = + translator.load(QStringLiteral("Internationalization_") + + ConfigHandler().uiLanguage(), + path); + } + if (foundTranslation) { + break; + } + } + if (!foundTranslation) { + if (ConfigHandler().uiLanguage() == QStringLiteral("auto")) { + QLocale l; + qWarning() << QStringLiteral( + "No Flameshot translation found for %1") + .arg(l.uiLanguages().join(", ")); + } else { + qWarning() << QStringLiteral( + "No Flameshot translation found for %1") + .arg(ConfigHandler().uiLanguage()); + } + } + + if (ConfigHandler().uiLanguage() == QStringLiteral("auto")) { + foundTranslation = + qtTranslator.load(QLocale::system(), + "qt", + "_", + QLibraryInfo::path(QLibraryInfo::TranslationsPath)); + } else { + foundTranslation = qtTranslator.load( + QStringLiteral("qt_") + ConfigHandler().uiLanguage(), + + QLibraryInfo::path(QLibraryInfo::TranslationsPath)); + } + if (!foundTranslation) { + if (ConfigHandler().uiLanguage() == QStringLiteral("auto")) { + qWarning() << QStringLiteral("No Qt translation found for %1") + .arg(QLocale::languageToString( + QLocale::system().language())); + } else { + qWarning() << QStringLiteral("No Qt translation found for %1") + .arg(ConfigHandler().uiLanguage()); + } + } + + qApp->installTranslator(&translator); + qApp->installTranslator(&qtTranslator); +} + +void configureApp(bool gui, QTranslator& translator, QTranslator& qtTranslator) +{ + if (gui) { +#if defined(Q_OS_WIN) && QT_VERSION >= QT_VERSION_CHECK(6, 5, 0) + QApplication::setStyle("Fusion"); // Supports dark scheme on Win 10/11 +#else + QApplication::setStyle(new StyleOverride); +#endif + } + + auto app = QCoreApplication::instance(); + app->setAttribute(Qt::AA_DontCreateNativeWidgetSiblings, true); + configureTranslation(translator, qtTranslator); +} + +// TODO find a way so we don't have to do this +/// Recreate the application as a QApplication +void reinitializeAsQApplication(int& argc, + char* argv[], + QTranslator& translator, + QTranslator& qtTranslator) +{ + delete QCoreApplication::instance(); + new QApplication(argc, argv); + configureApp(true, translator, qtTranslator); +} + +int main(int argc, char* argv[]) +{ + + QTranslator translator, qtTranslator; + + // Required for saving button list QList + qRegisterMetaType>(); + + QCoreApplication::setApplicationVersion(APP_VERSION); + QCoreApplication::setApplicationName(QStringLiteral("flameshot")); + QCoreApplication::setOrganizationName(QStringLiteral("flameshot")); + + // no arguments, just launch Flameshot + if (argc == 1) { + QApplication app(argc, argv); + configureTranslation(translator, qtTranslator); + +#ifdef USE_KDSINGLEAPPLICATION +#ifdef Q_OS_UNIX + setup_unix_signal_handlers(); + auto signalDaemon = SignalDaemon(); +#endif + auto kdsa = + KDSingleApplication(QStringLiteral("org.flameshot.Flameshot")); + + if (!kdsa.isPrimaryInstance()) { + return 0; // Quit + } +#endif + + configureApp(true, translator, qtTranslator); + auto c = Flameshot::instance(); + FlameshotDaemon::start(); + +#if defined(USE_KDSINGLEAPPLICATION) && \ + (defined(Q_OS_MACOS) || defined(Q_OS_WIN)) + if (kdsa.isPrimaryInstance()) { + QObject::connect( + &kdsa, + &KDSingleApplication::messageReceived, + FlameshotDaemon::instance(), + &FlameshotDaemon::messageReceivedFromSecondaryInstance); + } +#endif + +#if !(defined(Q_OS_MACOS) || defined(Q_OS_WIN)) + new FlameshotDBusAdapter(c); + QDBusConnection dbus = QDBusConnection::sessionBus(); + if (!dbus.isConnected()) { + AbstractLogger::error() + << QObject::tr("Unable to connect via DBus"); + } + dbus.registerObject(QStringLiteral("/"), c); + dbus.registerService(QStringLiteral("org.flameshot.Flameshot")); +#endif + return qApp->exec(); + } + + /*--------------| + * CLI parsing | + * ------------*/ + new QCoreApplication(argc, argv); + configureApp(false, translator, qtTranslator); + + CommandLineParser parser; + // Add description + parser.setDescription( + QObject::tr("Powerful yet simple to use screenshot software.")); + parser.setGeneralErrorMessage(QObject::tr("See") + " flameshot --help."); + // Arguments + CommandArgument fullArgument( + QStringLiteral("full"), + QObject::tr("Capture screenshot of all monitors at the same time.")); + CommandArgument launcherArgument(QStringLiteral("launcher"), + QObject::tr("Open the capture launcher.")); + CommandArgument guiArgument( + QStringLiteral("gui"), + QObject::tr("Start a manual capture in GUI mode.")); + CommandArgument configArgument(QStringLiteral("config"), + QObject::tr("Configure") + " flameshot."); + CommandArgument screenArgument( + QStringLiteral("screen"), + QObject::tr("Capture a screenshot of the specified monitor.")); + + // Options + CommandOption pathOption( + { "p", "path" }, + QObject::tr("Existing directory or new file to save to"), + QStringLiteral("path")); + CommandOption clipboardOption( + { "c", "clipboard" }, QObject::tr("Save the capture to the clipboard")); + CommandOption pinOption("pin", + QObject::tr("Pin the capture to the screen")); + CommandOption uploadOption({ "u", "upload" }, + QObject::tr("Upload screenshot")); + CommandOption delayOption({ "d", "delay" }, + QObject::tr("Delay time in milliseconds"), + QStringLiteral("milliseconds")); + + CommandOption useLastRegionOption( + "last-region", + QObject::tr("Repeat screenshot with previously selected region")); + + CommandOption regionOption("region", + QObject::tr("Screenshot region to select"), + QStringLiteral("WxH+X+Y or string")); + CommandOption filenameOption({ "f", "filename" }, + QObject::tr("Set the filename pattern"), + QStringLiteral("pattern")); + CommandOption acceptOnSelectOption( + { "s", "accept-on-select" }, + QObject::tr("Accept capture as soon as a selection is made")); + CommandOption trayOption({ "t", "trayicon" }, + QObject::tr("Enable or disable the trayicon"), + QStringLiteral("bool")); + CommandOption autostartOption( + { "a", "autostart" }, + QObject::tr("Enable or disable run at startup"), + QStringLiteral("bool")); + CommandOption notificationOption( + { "n", "notifications" }, + QObject::tr("Enable or disable the notifications"), + QStringLiteral("bool")); + CommandOption checkOption( + "check", QObject::tr("Check the configuration for errors")); + CommandOption showHelpOption( + { "s", "showhelp" }, + QObject::tr("Show the help message in the capture mode"), + QStringLiteral("bool")); + CommandOption mainColorOption({ "m", "maincolor" }, + QObject::tr("Define the main UI color"), + QStringLiteral("color-code")); + CommandOption contrastColorOption( + { "k", "contrastcolor" }, + QObject::tr("Define the contrast UI color"), + QStringLiteral("color-code")); + CommandOption rawImageOption({ "r", "raw" }, + QObject::tr("Print raw PNG capture")); + CommandOption selectionOption( + { "g", "print-geometry" }, + QObject::tr("Print geometry of the selection in the format WxH+X+Y. Does " + "nothing if raw is specified")); + CommandOption screenNumberOption( + { "n", "number" }, + QObject::tr("Define the screen to capture (starting from 0)") + ",\n" + + QObject::tr("default: screen containing the cursor"), + QObject::tr("Screen number"), + QStringLiteral("-1")); + + // Add checkers + auto colorChecker = [](const QString& colorCode) -> bool { + QColor parsedColor(colorCode); + return parsedColor.isValid() && parsedColor.alphaF() == 1.0; + }; + QString colorErr = + QObject::tr("Invalid color, " + "this flag supports the following formats:\n" + "- #RGB (each of R, G, and B is a single hex digit)\n" + "- #RRGGBB\n- #RRRGGGBBB\n" + "- #RRRRGGGGBBBB\n" + "- Named colors like 'blue' or 'red'\n" + "You may need to escape the '#' sign as in '\\#FFF'"); + + const QString delayErr = + QObject::tr("Invalid delay, it must be a number greater than 0"); + const QString numberErr = + QObject::tr("Invalid screen number, it must be non negative"); + const QString regionErr = QObject::tr( + "Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'."); + auto numericChecker = [](const QString& delayValue) -> bool { + bool ok; + int value = delayValue.toInt(&ok); + return ok && value >= 0; + }; + auto regionChecker = [](const QString& region) -> bool { + Region valueHandler; + return valueHandler.check(region); + }; + + const QString pathErr = + QObject::tr("Invalid path, must be an existing directory or a new file " + "in an existing directory"); + auto pathChecker = [pathErr](const QString& pathValue) -> bool { + QFileInfo fileInfo(pathValue); + if (fileInfo.isDir() || fileInfo.dir().exists()) { + return true; + } else { + AbstractLogger::error() << QObject::tr(pathErr.toLatin1().data()); + return false; + } + }; + + const QString booleanErr = + QObject::tr("Invalid value, it must be defined as 'true' or 'false'"); + auto booleanChecker = [](const QString& value) -> bool { + return value == QLatin1String("true") || + value == QLatin1String("false"); + }; + + contrastColorOption.addChecker(colorChecker, colorErr); + mainColorOption.addChecker(colorChecker, colorErr); + delayOption.addChecker(numericChecker, delayErr); + regionOption.addChecker(regionChecker, regionErr); + useLastRegionOption.addChecker(booleanChecker, booleanErr); + pathOption.addChecker(pathChecker, pathErr); + trayOption.addChecker(booleanChecker, booleanErr); + autostartOption.addChecker(booleanChecker, booleanErr); + notificationOption.addChecker(booleanChecker, booleanErr); + showHelpOption.addChecker(booleanChecker, booleanErr); + screenNumberOption.addChecker(numericChecker, numberErr); + + // Relationships + parser.AddArgument(guiArgument); + parser.AddArgument(screenArgument); + parser.AddArgument(fullArgument); + parser.AddArgument(launcherArgument); + parser.AddArgument(configArgument); + auto helpOption = parser.addHelpOption(); + auto versionOption = parser.addVersionOption(); + parser.AddOptions({ pathOption, + clipboardOption, + delayOption, + regionOption, + useLastRegionOption, + rawImageOption, + selectionOption, + uploadOption, + pinOption, + acceptOnSelectOption }, + guiArgument); + parser.AddOptions({ screenNumberOption, + clipboardOption, + pathOption, + delayOption, + regionOption, + rawImageOption, + uploadOption, + pinOption }, + screenArgument); + parser.AddOptions({ pathOption, + clipboardOption, + delayOption, + regionOption, + rawImageOption, + uploadOption }, + fullArgument); + parser.AddOptions({ autostartOption, + notificationOption, + filenameOption, + trayOption, + showHelpOption, + mainColorOption, + contrastColorOption, + checkOption }, + configArgument); + // Parse + if (!parser.parse(qApp->arguments())) { + goto finish; + } + + // PROCESS DATA + //-------------- + Flameshot::setOrigin(Flameshot::CLI); + if (parser.isSet(helpOption) || parser.isSet(versionOption)) { + } else if (parser.isSet(launcherArgument)) { // LAUNCHER + reinitializeAsQApplication(argc, argv, translator, qtTranslator); + Flameshot* flameshot = Flameshot::instance(); + flameshot->launcher(); + qApp->exec(); + } else if (parser.isSet(guiArgument)) { // GUI + reinitializeAsQApplication(argc, argv, translator, qtTranslator); + + // Prevent multiple instances of 'flameshot gui' from running if not + // configured to do so. + if (!ConfigHandler().allowMultipleGuiInstances()) { + auto* mutex = guiMutexLock(); + if (!mutex) { + return 1; + } + QObject::connect( + qApp, &QCoreApplication::aboutToQuit, qApp, [mutex]() { + mutex->detach(); + delete mutex; + }); + } + + // Option values + QString path = parser.value(pathOption); + if (!path.isEmpty()) { + path = QDir(path).absolutePath(); + } + int delay = parser.value(delayOption).toInt(); + QString region = parser.value(regionOption); + bool useLastRegion = parser.isSet(useLastRegionOption); + bool clipboard = parser.isSet(clipboardOption); + bool raw = parser.isSet(rawImageOption); + bool printGeometry = parser.isSet(selectionOption); + bool pin = parser.isSet(pinOption); + bool upload = parser.isSet(uploadOption); + bool acceptOnSelect = parser.isSet(acceptOnSelectOption); + CaptureRequest req(CaptureRequest::GRAPHICAL_MODE, delay, path); + if (!region.isEmpty()) { + auto selectionRegion = Region().value(region).toRect(); + req.setInitialSelection(selectionRegion); + } else if (useLastRegion) { + req.setInitialSelection(getLastRegion()); + } + if (clipboard) { + req.addTask(CaptureRequest::COPY); + } + if (raw) { + req.addTask(CaptureRequest::PRINT_RAW); + } + if (!path.isEmpty()) { + req.addSaveTask(path); + } + if (printGeometry) { + req.addTask(CaptureRequest::PRINT_GEOMETRY); + } + if (pin) { + req.addTask(CaptureRequest::PIN); + } + if (upload) { + req.addTask(CaptureRequest::UPLOAD); + } + if (acceptOnSelect) { + req.addTask(CaptureRequest::ACCEPT_ON_SELECT); + if (!clipboard && !raw && path.isEmpty() && !printGeometry && + !pin && !upload) { + req.addSaveTask(); + } + } + return requestCaptureAndWait(req); + } else if (parser.isSet(fullArgument)) { // FULL + reinitializeAsQApplication(argc, argv, translator, qtTranslator); + + // Option values + QString path = parser.value(pathOption); + if (!path.isEmpty()) { + path = QDir(path).absolutePath(); + } + int delay = parser.value(delayOption).toInt(); + QString region = parser.value(regionOption); + bool clipboard = parser.isSet(clipboardOption); + bool raw = parser.isSet(rawImageOption); + bool upload = parser.isSet(uploadOption); + // Not a valid command + + CaptureRequest req(CaptureRequest::FULLSCREEN_MODE, delay); + if (!region.isEmpty()) { + req.setInitialSelection(Region().value(region).toRect()); + } + if (clipboard) { + req.addTask(CaptureRequest::COPY); + } + if (!path.isEmpty()) { + req.addSaveTask(path); + } + if (raw) { + req.addTask(CaptureRequest::PRINT_RAW); + } + if (upload) { + req.addTask(CaptureRequest::UPLOAD); + } + if (!clipboard && path.isEmpty() && !raw && !upload) { + req.addSaveTask(); + } + return requestCaptureAndWait(req); + } else if (parser.isSet(screenArgument)) { // SCREEN + reinitializeAsQApplication(argc, argv, translator, qtTranslator); + + QString numberStr = parser.value(screenNumberOption); + // Option values + int screenNumber = + numberStr.startsWith(QLatin1String("-")) ? -1 : numberStr.toInt(); + QString path = parser.value(pathOption); + if (!path.isEmpty()) { + path = QDir(path).absolutePath(); + } + int delay = parser.value(delayOption).toInt(); + QString region = parser.value(regionOption); + bool clipboard = parser.isSet(clipboardOption); + bool raw = parser.isSet(rawImageOption); + bool pin = parser.isSet(pinOption); + bool upload = parser.isSet(uploadOption); + + CaptureRequest req(CaptureRequest::SCREEN_MODE, delay, screenNumber); + if (!region.isEmpty()) { + if (region.startsWith("screen")) { + AbstractLogger::error() + << "The 'screen' command does not support " + "'--region screen'.\n" + "See flameshot --help.\n"; + exit(1); + } + req.setInitialSelection(Region().value(region).toRect()); + } + if (clipboard) { + req.addTask(CaptureRequest::COPY); + } + if (raw) { + req.addTask(CaptureRequest::PRINT_RAW); + } + if (!path.isEmpty()) { + req.addSaveTask(path); + } + if (pin) { + req.addTask(CaptureRequest::PIN); + } + if (upload) { + req.addTask(CaptureRequest::UPLOAD); + } + + if (!clipboard && !raw && path.isEmpty() && !pin && !upload) { + req.addSaveTask(); + } + + return requestCaptureAndWait(req); + } else if (parser.isSet(configArgument)) { // CONFIG + bool autostart = parser.isSet(autostartOption); + bool notification = parser.isSet(notificationOption); + bool filename = parser.isSet(filenameOption); + bool tray = parser.isSet(trayOption); + bool mainColor = parser.isSet(mainColorOption); + bool contrastColor = parser.isSet(contrastColorOption); + bool check = parser.isSet(checkOption); + bool someFlagSet = (autostart || notification || filename || tray || + mainColor || contrastColor || check); + if (check) { + AbstractLogger err = AbstractLogger::error(AbstractLogger::Stderr); + bool ok = ConfigHandler().checkForErrors(&err); + if (ok) { + AbstractLogger::info() + << QStringLiteral("No errors detected.\n"); + goto finish; + } else { + return 1; + } + } + if (!someFlagSet) { + // Open gui when no options are given + reinitializeAsQApplication(argc, argv, translator, qtTranslator); + QObject::connect( + qApp, &QApplication::lastWindowClosed, qApp, &QApplication::quit); + Flameshot::instance()->config(); + qApp->exec(); + } else { + ConfigHandler config; + + if (autostart) { + config.setStartupLaunch(parser.value(autostartOption) == + "true"); + } + if (notification) { + config.setShowDesktopNotification( + parser.value(notificationOption) == "true"); + } + if (filename) { + QString newFilename(parser.value(filenameOption)); + config.setFilenamePattern(newFilename); + FileNameHandler fh; + QTextStream(stdout) + << QStringLiteral("The new pattern is '%1'\n" + "Parsed pattern example: %2\n") + .arg(newFilename, fh.parsedPattern()); + } + if (tray) { + config.setDisabledTrayIcon(parser.value(trayOption) == "false"); + } + if (mainColor) { + // TODO use value handler + QString colorCode = parser.value(mainColorOption); + QColor parsedColor(colorCode); + config.setUiColor(parsedColor); + } + if (contrastColor) { + QString colorCode = parser.value(contrastColorOption); + QColor parsedColor(colorCode); + config.setContrastUiColor(parsedColor); + } + } + } +finish: + + return 0; +} diff --git a/src/tools/CMakeLists.txt b/src/tools/CMakeLists.txt new file mode 100644 index 0000000..ed8de18 --- /dev/null +++ b/src/tools/CMakeLists.txt @@ -0,0 +1,71 @@ +target_sources(flameshot PRIVATE arrow/arrowtool.h arrow/arrowtool.cpp) +target_sources(flameshot PRIVATE pixelate/pixelatetool.h pixelate/pixelatetool.cpp) +target_sources(flameshot PRIVATE circle/circletool.h circle/circletool.cpp) +target_sources(flameshot PRIVATE circlecount/circlecounttool.h circlecount/circlecounttool.cpp) +target_sources(flameshot PRIVATE copy/copytool.h copy/copytool.cpp) +target_sources(flameshot PRIVATE exit/exittool.h exit/exittool.cpp) +target_sources(flameshot PRIVATE sizeincrease/sizeincreasetool.h sizeincrease/sizeincreasetool.cpp) +target_sources(flameshot PRIVATE sizedecrease/sizedecreasetool.h sizedecrease/sizedecreasetool.cpp) + +if (ENABLE_IMGUR) +target_sources( + flameshot + PRIVATE imgupload/storages/imgur/imguruploader.h + imgupload/storages/imgur/imguruploader.cpp + imgupload/storages/imguploaderbase.h + imgupload/storages/imguploaderbase.cpp + imgupload/imguploadertool.h + imgupload/imguploadertool.cpp + imgupload/imguploadermanager.h + imgupload/imguploadermanager.cpp +) +endif() +target_sources( + flameshot + PRIVATE launcher/applaunchertool.h + launcher/applauncherwidget.h + launcher/launcheritemdelegate.h + launcher/terminallauncher.h + launcher/applaunchertool.cpp + launcher/applauncherwidget.cpp + launcher/launcheritemdelegate.cpp + launcher/openwithprogram.cpp + launcher/terminallauncher.cpp) +target_sources(flameshot PRIVATE line/linetool.h line/linetool.cpp) +target_sources(flameshot PRIVATE marker/markertool.h marker/markertool.cpp) +target_sources(flameshot PRIVATE move/movetool.h move/movetool.cpp) +target_sources(flameshot PRIVATE pencil/penciltool.h pencil/penciltool.cpp) +target_sources( + flameshot + PRIVATE pin/pintool.h + pin/pinwidget.h + pin/pintool.cpp + pin/pinwidget.cpp) +target_sources(flameshot PRIVATE rectangle/rectangletool.h rectangle/rectangletool.cpp) +target_sources(flameshot PRIVATE redo/redotool.h redo/redotool.cpp) +target_sources(flameshot PRIVATE save/savetool.h save/savetool.cpp) +target_sources(flameshot PRIVATE accept/accepttool.h accept/accepttool.cpp) +target_sources(flameshot PRIVATE invert/inverttool.h invert/inverttool.cpp) +target_sources(flameshot PRIVATE selection/selectiontool.h selection/selectiontool.cpp) +target_sources( + flameshot + PRIVATE text/textconfig.h + text/texttool.h + text/textwidget.h + text/textconfig.cpp + text/texttool.cpp + text/textwidget.cpp) +target_sources(flameshot PRIVATE undo/undotool.h undo/undotool.cpp) + +target_sources( + flameshot + PRIVATE abstractactiontool.cpp + abstractpathtool.cpp + abstracttwopointtool.cpp + capturecontext.cpp + toolfactory.cpp + abstractactiontool.h + abstractpathtool.h + abstracttwopointtool.h + capturetool.h + toolfactory.h) diff --git a/src/tools/abstractactiontool.cpp b/src/tools/abstractactiontool.cpp new file mode 100644 index 0000000..0a61b38 --- /dev/null +++ b/src/tools/abstractactiontool.cpp @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "abstractactiontool.h" + +AbstractActionTool::AbstractActionTool(QObject* parent) + : CaptureTool(parent) +{} + +bool AbstractActionTool::isValid() const +{ + return true; +} + +bool AbstractActionTool::isSelectable() const +{ + return false; +} + +bool AbstractActionTool::showMousePreview() const +{ + return false; +} + +QRect AbstractActionTool::boundingRect() const +{ + return {}; +} + +void AbstractActionTool::process(QPainter& painter, const QPixmap& pixmap) +{ + Q_UNUSED(painter) + Q_UNUSED(pixmap) +} + +void AbstractActionTool::paintMousePreview(QPainter& painter, + const CaptureContext& context) +{ + Q_UNUSED(painter) + Q_UNUSED(context) +} + +void AbstractActionTool::drawEnd(const QPoint& p) +{ + Q_UNUSED(p) +} + +void AbstractActionTool::drawMove(const QPoint& p) +{ + Q_UNUSED(p) +} + +void AbstractActionTool::drawStart(const CaptureContext& context) +{ + Q_UNUSED(context) +} + +void AbstractActionTool::onColorChanged(const QColor& c) +{ + Q_UNUSED(c) +} + +void AbstractActionTool::onSizeChanged(int size) +{ + Q_UNUSED(size) +} diff --git a/src/tools/abstractactiontool.h b/src/tools/abstractactiontool.h new file mode 100644 index 0000000..18b90fb --- /dev/null +++ b/src/tools/abstractactiontool.h @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "capturetool.h" + +class AbstractActionTool : public CaptureTool +{ + Q_OBJECT +public: + explicit AbstractActionTool(QObject* parent = nullptr); + + bool isValid() const override; + bool isSelectable() const override; + bool showMousePreview() const override; + QRect boundingRect() const override; + + void process(QPainter& painter, const QPixmap& pixmap) override; + void paintMousePreview(QPainter& painter, + const CaptureContext& context) override; + +public slots: + void drawEnd(const QPoint& p) override; + void drawMove(const QPoint& p) override; + void drawStart(const CaptureContext& context) override; + void onColorChanged(const QColor& c) override; + void onSizeChanged(int size) override; +}; diff --git a/src/tools/abstractpathtool.cpp b/src/tools/abstractpathtool.cpp new file mode 100644 index 0000000..14aee43 --- /dev/null +++ b/src/tools/abstractpathtool.cpp @@ -0,0 +1,153 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "abstractpathtool.h" +#include + +AbstractPathTool::AbstractPathTool(QObject* parent) + : CaptureTool(parent) + , m_thickness(1) + , m_padding(0) +{} + +void AbstractPathTool::copyParams(const AbstractPathTool* from, + AbstractPathTool* to) +{ + to->m_color = from->m_color; + to->m_thickness = from->m_thickness; + to->m_padding = from->m_padding; + to->m_pos = from->m_pos; + + to->m_points.clear(); + for (auto point : from->m_points) { + to->m_points.append(point); + } +} + +bool AbstractPathTool::isValid() const +{ + return m_points.length() > 1; +} + +bool AbstractPathTool::closeOnButtonPressed() const +{ + return false; +} + +bool AbstractPathTool::isSelectable() const +{ + return true; +} + +bool AbstractPathTool::showMousePreview() const +{ + return true; +} + +QRect AbstractPathTool::mousePreviewRect(const CaptureContext& context) const +{ + QRect rect(0, 0, context.toolSize + 2, context.toolSize + 2); + rect.moveCenter(context.mousePos); + return rect; +} + +QRect AbstractPathTool::boundingRect() const +{ + if (m_points.isEmpty()) { + return {}; + } + int min_x = m_points.at(0).x(); + int min_y = m_points.at(0).y(); + int max_x = m_points.at(0).x(); + int max_y = m_points.at(0).y(); + for (auto point : m_points) { + if (point.x() < min_x) { + min_x = point.x(); + } + if (point.y() < min_y) { + min_y = point.y(); + } + if (point.x() > max_x) { + max_x = point.x(); + } + if (point.y() > max_y) { + max_y = point.y(); + } + } + + int offset = + m_thickness <= 1 ? 1 : static_cast(round(m_thickness * 0.7 + 0.5)); + return QRect(min_x - offset, + min_y - offset, + std::abs(min_x - max_x) + offset * 2, + std::abs(min_y - max_y) + offset * 2) + .normalized(); +} + +void AbstractPathTool::drawEnd(const QPoint& p) +{ + Q_UNUSED(p) +} + +void AbstractPathTool::drawMove(const QPoint& p) +{ + addPoint(p); +} + +void AbstractPathTool::onColorChanged(const QColor& c) +{ + m_color = c; +} + +void AbstractPathTool::onSizeChanged(int size) +{ + m_thickness = size; +} + +void AbstractPathTool::addPoint(const QPoint& point) +{ + if (m_pathArea.left() > point.x()) { + m_pathArea.setLeft(point.x()); + } else if (m_pathArea.right() < point.x()) { + m_pathArea.setRight(point.x()); + } + if (m_pathArea.top() > point.y()) { + m_pathArea.setTop(point.y()); + } else if (m_pathArea.bottom() < point.y()) { + m_pathArea.setBottom(point.y()); + } + m_points.append(point); +} + +void AbstractPathTool::move(const QPoint& mousePos) +{ + if (m_points.empty()) { + return; + } + QPoint basePos = *pos(); + QPoint offset = mousePos - basePos; + for (auto& m_point : m_points) { + m_point += offset; + } +} + +const QPoint* AbstractPathTool::pos() +{ + if (m_points.empty()) { + m_pos = QPoint(); + return &m_pos; + } + int x = m_points.at(0).x(); + int y = m_points.at(0).y(); + for (auto point : m_points) { + if (point.x() < x) { + x = point.x(); + } + if (point.y() < y) { + y = point.y(); + } + } + m_pos.setX(x); + m_pos.setY(y); + return &m_pos; +} diff --git a/src/tools/abstractpathtool.h b/src/tools/abstractpathtool.h new file mode 100644 index 0000000..831cd9b --- /dev/null +++ b/src/tools/abstractpathtool.h @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "capturetool.h" + +class AbstractPathTool : public CaptureTool +{ + Q_OBJECT +public: + explicit AbstractPathTool(QObject* parent = nullptr); + + bool isValid() const override; + bool closeOnButtonPressed() const override; + bool isSelectable() const override; + bool showMousePreview() const override; + QRect mousePreviewRect(const CaptureContext& context) const override; + QRect boundingRect() const override; + void move(const QPoint& mousePos) override; + const QPoint* pos() override; + int size() const override { return m_thickness; }; + +public slots: + void drawEnd(const QPoint& p) override; + void drawMove(const QPoint& p) override; + void onColorChanged(const QColor& c) override; + void onSizeChanged(int size) override; + +protected: + void copyParams(const AbstractPathTool* from, AbstractPathTool* to); + void addPoint(const QPoint& point); + + // class members + QRect m_pathArea; + QColor m_color; + QVector m_points; + // use m_padding to extend the area of the backup + int m_padding; + QPoint m_pos; + +private: + int m_thickness; +}; diff --git a/src/tools/abstracttwopointtool.cpp b/src/tools/abstracttwopointtool.cpp new file mode 100644 index 0000000..58dfa7f --- /dev/null +++ b/src/tools/abstracttwopointtool.cpp @@ -0,0 +1,186 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "abstracttwopointtool.h" +#include +#include +#include + +namespace { + +const double ADJ_UNIT = std::atan(1.0); +const int DIRS_NUMBER = 4; + +enum UNIT +{ + HORIZ_DIR = 0, + DIAG1_DIR = 1, + VERT_DIR = 2 +}; + +const double ADJ_DIAG_UNIT = 2 * ADJ_UNIT; +const int DIAG_DIRS_NUMBER = 2; + +enum DIAG_UNIT +{ + DIR1 = 0 +}; + +} + +AbstractTwoPointTool::AbstractTwoPointTool(QObject* parent) + : CaptureTool(parent) + , m_thickness(1) + , m_padding(0) +{} + +void AbstractTwoPointTool::copyParams(const AbstractTwoPointTool* from, + AbstractTwoPointTool* to) +{ + CaptureTool::copyParams(from, to); + to->m_points.first = from->m_points.first; + to->m_points.second = from->m_points.second; + to->m_color = from->m_color; + to->m_thickness = from->m_thickness; + to->m_padding = from->m_padding; + to->m_supportsOrthogonalAdj = from->m_supportsOrthogonalAdj; + to->m_supportsDiagonalAdj = from->m_supportsDiagonalAdj; +} + +bool AbstractTwoPointTool::isValid() const +{ + return (m_points.first != m_points.second); +} + +bool AbstractTwoPointTool::closeOnButtonPressed() const +{ + return false; +} + +bool AbstractTwoPointTool::isSelectable() const +{ + return true; +} + +bool AbstractTwoPointTool::showMousePreview() const +{ + return true; +} + +QRect AbstractTwoPointTool::mousePreviewRect( + const CaptureContext& context) const +{ + QRect rect(0, 0, context.toolSize + 2, context.toolSize + 2); + rect.moveCenter(context.mousePos); + return rect; +} + +QRect AbstractTwoPointTool::boundingRect() const +{ + if (!isValid()) { + return {}; + } + int offset = + m_thickness <= 1 ? 1 : static_cast(round(m_thickness * 0.7 + 0.5)); + QRect rect = + QRect(std::min(m_points.first.x(), m_points.second.x()) - offset, + std::min(m_points.first.y(), m_points.second.y()) - offset, + std::abs(m_points.first.x() - m_points.second.x()) + offset * 2, + std::abs(m_points.first.y() - m_points.second.y()) + offset * 2); + + return rect.normalized(); +} + +void AbstractTwoPointTool::drawEnd(const QPoint& p) +{ + Q_UNUSED(p) +} + +void AbstractTwoPointTool::drawMove(const QPoint& p) +{ + m_points.second = p; +} + +void AbstractTwoPointTool::drawMoveWithAdjustment(const QPoint& p) +{ + m_points.second = m_points.first + adjustedVector(p - m_points.first); +} + +void AbstractTwoPointTool::onColorChanged(const QColor& c) +{ + m_color = c; +} + +void AbstractTwoPointTool::onSizeChanged(int size) +{ + m_thickness = size; +} + +void AbstractTwoPointTool::paintMousePreview(QPainter& painter, + const CaptureContext& context) +{ + painter.setPen(QPen(context.color, context.toolSize)); + painter.drawLine(context.mousePos, context.mousePos); +} + +void AbstractTwoPointTool::drawStart(const CaptureContext& context) +{ + onColorChanged(context.color); + m_points.first = context.mousePos; + m_points.second = context.mousePos; + onSizeChanged(context.toolSize); +} + +QPoint AbstractTwoPointTool::adjustedVector(QPoint v) const +{ + if (m_supportsOrthogonalAdj && m_supportsDiagonalAdj) { + int dir = (static_cast(round(atan2(-v.y(), v.x()) / ADJ_UNIT)) + + DIRS_NUMBER) % + DIRS_NUMBER; + if (dir == UNIT::HORIZ_DIR) { + v.setY(0); + } else if (dir == UNIT::VERT_DIR) { + v.setX(0); + } else if (dir == UNIT::DIAG1_DIR) { + int newX = (v.x() - v.y()) / 2; + int newY = -newX; + v.setX(newX); + v.setY(newY); + } else { + int newX = (v.x() + v.y()) / 2; + int newY = newX; + v.setX(newX); + v.setY(newY); + } + } else if (m_supportsDiagonalAdj) { + int dir = + (static_cast(round((atan2(-v.y(), v.x()) - ADJ_DIAG_UNIT / 2) / + ADJ_DIAG_UNIT)) + + DIAG_DIRS_NUMBER) % + DIAG_DIRS_NUMBER; + if (dir == DIAG_UNIT::DIR1) { + int newX = (v.x() - v.y()) / 2; + int newY = -newX; + v.setX(newX); + v.setY(newY); + } else { + int newX = (v.x() + v.y()) / 2; + int newY = newX; + v.setX(newX); + v.setY(newY); + } + } + return v; +} + +void AbstractTwoPointTool::move(const QPoint& pos) +{ + QPoint offset = m_points.second - m_points.first; + m_points.first = pos; + m_points.second = m_points.first + offset; +} + +const QPoint* AbstractTwoPointTool::pos() +{ + return &m_points.first; +} diff --git a/src/tools/abstracttwopointtool.h b/src/tools/abstracttwopointtool.h new file mode 100644 index 0000000..c6656b0 --- /dev/null +++ b/src/tools/abstracttwopointtool.h @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "capturetool.h" + +class AbstractTwoPointTool : public CaptureTool +{ + Q_OBJECT +public: + explicit AbstractTwoPointTool(QObject* parent = nullptr); + + bool isValid() const override; + bool closeOnButtonPressed() const override; + bool isSelectable() const override; + bool showMousePreview() const override; + QRect mousePreviewRect(const CaptureContext& context) const override; + QRect boundingRect() const override; + void move(const QPoint& pos) override; + const QPoint* pos() override; + int size() const override { return m_thickness; }; + const QColor& color() { return m_color; }; + const QPair points() const { return m_points; }; + void paintMousePreview(QPainter& painter, + const CaptureContext& context) override; + +public slots: + void drawEnd(const QPoint& p) override; + void drawMove(const QPoint& p) override; + void drawMoveWithAdjustment(const QPoint& p) override; + void onColorChanged(const QColor& c) override; + void onSizeChanged(int size) override; + virtual void drawStart(const CaptureContext& context) override; + +private: + QPoint adjustedVector(QPoint v) const; + +protected: + void copyParams(const AbstractTwoPointTool* from, AbstractTwoPointTool* to); + void setPadding(int padding) { m_padding = padding; }; + +private: + // class members + int m_thickness; + int m_padding; + QColor m_color; + QPair m_points; + +protected: + // use m_padding to extend the area of the backup + bool m_supportsOrthogonalAdj = false; + bool m_supportsDiagonalAdj = false; +}; diff --git a/src/tools/accept/accepttool.cpp b/src/tools/accept/accepttool.cpp new file mode 100644 index 0000000..f636cd6 --- /dev/null +++ b/src/tools/accept/accepttool.cpp @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "accepttool.h" +#include "src/utils/screenshotsaver.h" +#include +#include +#include +#if defined(Q_OS_MACOS) +#include "src/widgets/capture/capturewidget.h" +#include +#endif + +AcceptTool::AcceptTool(QObject* parent) + : AbstractActionTool(parent) +{} + +bool AcceptTool::closeOnButtonPressed() const +{ + return true; +} + +QIcon AcceptTool::icon(const QColor& background, bool inEditor) const +{ + Q_UNUSED(inEditor) + return QIcon(iconPath(background) + "accept.svg"); +} + +QString AcceptTool::name() const +{ + return tr("Accept"); +} + +CaptureTool::Type AcceptTool::type() const +{ + return CaptureTool::TYPE_ACCEPT; +} + +QString AcceptTool::description() const +{ + return tr("Accept the capture"); +} + +CaptureTool* AcceptTool::copy(QObject* parent) +{ + return new AcceptTool(parent); +} + +void AcceptTool::pressed(CaptureContext& context) +{ + emit requestAction(REQ_CAPTURE_DONE_OK); + if (context.request.tasks() & CaptureRequest::PIN) { + QRect geometry = context.selection; + geometry.moveTopLeft(geometry.topLeft() + context.widgetOffset); + context.request.addTask(CaptureRequest::PIN); + } + emit requestAction(REQ_CLOSE_GUI); +} diff --git a/src/tools/accept/accepttool.h b/src/tools/accept/accepttool.h new file mode 100644 index 0000000..5bd2812 --- /dev/null +++ b/src/tools/accept/accepttool.h @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "abstractactiontool.h" + +class AcceptTool : public AbstractActionTool +{ + Q_OBJECT +public: + explicit AcceptTool(QObject* parent = nullptr); + + bool closeOnButtonPressed() const override; + + QIcon icon(const QColor& background, bool inEditor) const override; + QString name() const override; + QString description() const override; + + CaptureTool* copy(QObject* parent = nullptr) override; + +protected: + CaptureTool::Type type() const override; + +public slots: + void pressed(CaptureContext& context) override; +}; diff --git a/src/tools/arrow/arrowtool.cpp b/src/tools/arrow/arrowtool.cpp new file mode 100644 index 0000000..3d2ea52 --- /dev/null +++ b/src/tools/arrow/arrowtool.cpp @@ -0,0 +1,167 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "arrowtool.h" +#include "confighandler.h" +#include + +namespace { +const int ArrowWidth = 10; +const int ArrowHeight = 18; + +QPainterPath getArrowHead(QPoint p1, QPoint p2, const int thickness) +{ + QLineF base(p1, p2); + // Create the vector for the position of the base of the arrowhead + QLineF temp(QPoint(0, 0), p2 - p1); + int val = ArrowHeight + thickness * 4; + if (base.length() < (val - thickness * 2)) { + val = static_cast(base.length() + thickness * 2); + } + temp.setLength(base.length() + thickness * 2 - val); + // Move across the line up to the head + QPointF bottomTranslation(temp.p2()); + + // Rotate base of the arrowhead + base.setLength(ArrowWidth + thickness * 2); + base.setAngle(base.angle() + 90); + // Move to the correct point + QPointF temp2 = p1 - base.p2(); + // Center it + QPointF centerTranslation((temp2.x() / 2), (temp2.y() / 2)); + + base.translate(bottomTranslation); + base.translate(centerTranslation); + + QPainterPath path; + path.moveTo(p2); + path.lineTo(base.p1()); + path.lineTo(base.p2()); + path.lineTo(p2); + return path; +} + +// gets a shorter line to prevent overlap in the point of the arrow +QLine getShorterLine(QPoint p1, QPoint p2, const int thickness) +{ + QLineF l(p1, p2); + int val = ArrowHeight + thickness * 4; + if (l.length() < (val - thickness * 2)) { + // here should be 0, but then we lose "angle", so this is hack, but + // looks not very bad + val = thickness / 4; + l.setLength(val); + } else { + l.setLength(l.length() + thickness * 2 - val); + } + return l.toLine(); +} + +} // unnamed namespace + +ArrowTool::ArrowTool(QObject* parent) + : AbstractTwoPointTool(parent) +{ + setPadding(ArrowWidth / 2); + m_supportsOrthogonalAdj = true; + m_supportsDiagonalAdj = true; +} + +QIcon ArrowTool::icon(const QColor& background, bool inEditor) const +{ + Q_UNUSED(inEditor) + return QIcon(iconPath(background) + "arrow-bottom-left.svg"); +} +QString ArrowTool::name() const +{ + return tr("Arrow"); +} + +CaptureTool::Type ArrowTool::type() const +{ + return CaptureTool::TYPE_ARROW; +} + +QString ArrowTool::description() const +{ + return tr("Set the Arrow as the paint tool"); +} + +QRect ArrowTool::boundingRect() const +{ + if (!isValid()) { + return {}; + } + + int offset = size() <= 1 ? 1 : static_cast(round(size() / 2 + 0.5)); + + // get min and max arrow pos + int min_x = points().first.x(); + int min_y = points().first.y(); + int max_x = points().first.x(); + int max_y = points().first.y(); + for (int i = 0; i < m_arrowPath.elementCount(); i++) { + QPointF pt = m_arrowPath.elementAt(i); + if (static_cast(pt.x()) < min_x) { + min_x = static_cast(pt.x()); + } + if (static_cast(pt.y()) < min_y) { + min_y = static_cast(pt.y()); + } + if (static_cast(pt.x()) > max_x) { + max_x = static_cast(pt.x()); + } + if (static_cast(pt.y()) > max_y) { + max_y = static_cast(pt.y()); + } + } + + // get min and max line pos + int line_pos_min_x = + std::min(std::min(points().first.x(), points().second.x()), min_x); + int line_pos_min_y = + std::min(std::min(points().first.y(), points().second.y()), min_y); + int line_pos_max_x = + std::max(std::max(points().first.x(), points().second.x()), max_x); + int line_pos_max_y = + std::max(std::max(points().first.y(), points().second.y()), max_y); + + QRect rect = QRect(line_pos_min_x - offset, + line_pos_min_y - offset, + line_pos_max_x - line_pos_min_x + offset * 2, + line_pos_max_y - line_pos_min_y + offset * 2); + + return rect.normalized(); +} + +CaptureTool* ArrowTool::copy(QObject* parent) +{ + auto* tool = new ArrowTool(parent); + copyParams(this, tool); + return tool; +} + +void ArrowTool::copyParams(const ArrowTool* from, ArrowTool* to) +{ + AbstractTwoPointTool::copyParams(from, to); + to->m_arrowPath = this->m_arrowPath; +} + +void ArrowTool::process(QPainter& painter, const QPixmap& pixmap) +{ + bool isArrowReversed = ConfigHandler().reverseArrow(); + + const QPoint& head = isArrowReversed ? points().second : points().first; + const QPoint& tail = isArrowReversed ? points().first : points().second; + + Q_UNUSED(pixmap) + painter.setPen(QPen(color(), size())); + painter.drawLine(getShorterLine(head, tail, size())); + m_arrowPath = getArrowHead(head, tail, size()); + painter.fillPath(m_arrowPath, QBrush(color())); +} + +void ArrowTool::pressed(CaptureContext& context) +{ + Q_UNUSED(context) +} diff --git a/src/tools/arrow/arrowtool.h b/src/tools/arrow/arrowtool.h new file mode 100644 index 0000000..03ea819 --- /dev/null +++ b/src/tools/arrow/arrowtool.h @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/tools/abstracttwopointtool.h" +#include +#include + +class ArrowTool : public AbstractTwoPointTool +{ + Q_OBJECT +public: + explicit ArrowTool(QObject* parent = nullptr); + + QIcon icon(const QColor& background, bool inEditor) const override; + QString name() const override; + QString description() const override; + QRect boundingRect() const override; + + CaptureTool* copy(QObject* parent = nullptr) override; + void process(QPainter& painter, const QPixmap& pixmap) override; + +protected: + void copyParams(const ArrowTool* from, ArrowTool* to); + CaptureTool::Type type() const override; + +public slots: + void pressed(CaptureContext& context) override; + +private: + QPainterPath m_arrowPath; +}; diff --git a/src/tools/capturecontext.cpp b/src/tools/capturecontext.cpp new file mode 100644 index 0000000..b14f0ea --- /dev/null +++ b/src/tools/capturecontext.cpp @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "capturecontext.h" +#include "capturerequest.h" +#include "flameshot.h" + +// TODO rename +QPixmap CaptureContext::selectedScreenshotArea() const +{ + if (selection.isNull()) { + return screenshot; + } else { + return screenshot.copy(selection); + } +} diff --git a/src/tools/capturecontext.h b/src/tools/capturecontext.h new file mode 100644 index 0000000..7c9b139 --- /dev/null +++ b/src/tools/capturecontext.h @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "capturerequest.h" +#include +#include +#include +#include + +struct CaptureContext +{ + // screenshot with modifications + QPixmap screenshot; + // unmodified screenshot + QPixmap origScreenshot; + // Selection area + QRect selection; + // Selected tool color + QColor color; + // Path where the content has to be saved + QString savePath; + // Offset of the capture widget based on the system's screen (top-left) + QPoint widgetOffset; + // Mouse position inside the widget + QPoint mousePos; + // Size of the active tool + int toolSize; + // Current circle count + int circleCount; + // Mode of the capture widget + bool fullscreen; + CaptureRequest request = CaptureRequest::GRAPHICAL_MODE; + + QPixmap selectedScreenshotArea() const; +}; diff --git a/src/tools/capturetool.h b/src/tools/capturetool.h new file mode 100644 index 0000000..be613ed --- /dev/null +++ b/src/tools/capturetool.h @@ -0,0 +1,207 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/tools/capturecontext.h" +#include "src/utils/colorutils.h" +#include "src/utils/pathinfo.h" +#include +#include + +class CaptureTool : public QObject +{ + Q_OBJECT + +public: + // IMPORTANT: + // Add new entries to the BOTTOM so existing user configurations don't get + // messed up. + // ALSO NOTE: + // When adding new types, don't forget to update: + // - CaptureToolButton::iterableButtonTypes + // - CaptureToolButton::buttonTypeOrder + enum Type + { + NONE = -1, + TYPE_PENCIL = 0, + TYPE_DRAWER = 1, + TYPE_ARROW = 2, + TYPE_SELECTION = 3, + TYPE_RECTANGLE = 4, + TYPE_CIRCLE = 5, + TYPE_MARKER = 6, + TYPE_MOVESELECTION = 8, + TYPE_UNDO = 9, + TYPE_COPY = 10, + TYPE_SAVE = 11, + TYPE_EXIT = 12, +#ifdef ENABLE_IMGUR + TYPE_IMAGEUPLOADER = 13, +#endif + TYPE_OPEN_APP = 14, + TYPE_PIXELATE = 15, + TYPE_REDO = 16, + TYPE_PIN = 17, + TYPE_TEXT = 18, + TYPE_CIRCLECOUNT = 19, + TYPE_SIZEINCREASE = 20, + TYPE_SIZEDECREASE = 21, + TYPE_INVERT = 22, + TYPE_ACCEPT = 23, + TYPE_CANCEL = 24, + }; + Q_ENUM(Type); + + // Request actions on the main widget + enum Request + { + // Call close() in the editor. + REQ_CLOSE_GUI, + // Call hide() in the editor. + REQ_HIDE_GUI, + // Undo the last active modification in the stack. + REQ_UNDO_MODIFICATION, + // Redo the next modification in the stack. + REQ_REDO_MODIFICATION, + // Open the color picker under the mouse. + REQ_SHOW_COLOR_PICKER, + // Notify is the screenshot has been saved. + REQ_CAPTURE_DONE_OK, + // Notify to redraw screenshot with tools without object selection. + REQ_CLEAR_SELECTION, + // Instance this->widget()'s widget inside the editor under the mouse. + REQ_ADD_CHILD_WIDGET, + // Instance this->widget()'s widget which handles its own lifetime. + REQ_ADD_EXTERNAL_WIDGETS, + // increase tool size for all tools + REQ_INCREASE_TOOL_SIZE, + // decrease tool size for all tools + REQ_DECREASE_TOOL_SIZE + }; + + explicit CaptureTool(QObject* parent = nullptr) + : QObject(parent) + , m_count(0) + , m_editMode(false) + {} + + // TODO unused + virtual void setCapture(const QPixmap& pixmap){}; + + // Returns false when the tool is in an inconsistent state and shouldn't + // be included in the tool undo/redo stack. + virtual bool isValid() const = 0; + // Close the capture after the process() call if the tool was activated + // from a button press. TODO remove this function + virtual bool closeOnButtonPressed() const = 0; + // If the tool keeps active after the selection. + virtual bool isSelectable() const = 0; + // Enable mouse preview. + virtual bool showMousePreview() const = 0; + virtual QRect mousePreviewRect(const CaptureContext& context) const + { + return {}; + }; + virtual QRect boundingRect() const = 0; + + // The icon of the tool. + // inEditor is true when the icon is requested inside the editor + // and false otherwise. + virtual QIcon icon(const QColor& background, bool inEditor) const = 0; + // Name displayed for the tool, this could be translated with tr() + virtual QString name() const = 0; + // Codename for the tool, this shouldn't change as it is used as ID + // for the tool in the internals of Flameshot + virtual CaptureTool::Type type() const = 0; + // Short description of the tool. + virtual QString description() const = 0; + // Short tool item info + virtual QString info() { return name(); }; + + // if the type is TYPE_WIDGET the widget is loaded in the main widget. + // If the type is TYPE_EXTERNAL_WIDGET it is created outside as an + // individual widget. + virtual QWidget* widget() { return nullptr; } + // When the tool is selected this method is called and the widget is added + // to the configuration panel inside the main widget. + virtual QWidget* configurationWidget() { return nullptr; } + // Return a copy of the tool + virtual CaptureTool* copy(QObject* parent = nullptr) = 0; + + virtual void setEditMode(bool b) { m_editMode = b; }; + virtual bool editMode() { return m_editMode; }; + + // return true if object was change after editMode + virtual bool isChanged() { return true; }; + + // Counter for all object types (currently is used for the CircleCounter + // only) + virtual void setCount(int count) { m_count = count; }; + virtual int count() const { return m_count; }; + + // Called every time the tool has to draw + virtual void process(QPainter& painter, const QPixmap& pixmap) = 0; + virtual void drawSearchArea(QPainter& painter, const QPixmap& pixmap) + { + process(painter, pixmap); + }; + virtual void drawObjectSelection(QPainter& painter) + { + drawObjectSelectionRect(painter, boundingRect()); + }; + // When the tool is selected, this is called when the mouse moves + virtual void paintMousePreview(QPainter& painter, + const CaptureContext& context) = 0; + + // Move tool objects + virtual void move(const QPoint& pos) { Q_UNUSED(pos) }; + virtual const QPoint* pos() { return nullptr; }; + +signals: + void requestAction(Request r); + +protected: + void copyParams(const CaptureTool* from, CaptureTool* to) + { + to->m_count = from->m_count; + } + + QString iconPath(const QColor& c) const + { + return ColorUtils::colorIsDark(c) ? PathInfo::whiteIconPath() + : PathInfo::blackIconPath(); + } + + void drawObjectSelectionRect(QPainter& painter, QRect rect) + { + QPen orig_pen = painter.pen(); + painter.setPen(QPen(Qt::black, 3)); + painter.drawRect(rect); + painter.setPen(QPen(Qt::white, 1, Qt::DotLine)); + painter.drawRect(rect); + painter.setPen(orig_pen); + } + +public slots: + // On mouse release. + virtual void drawEnd(const QPoint& p) = 0; + // Mouse pressed and moving, called once a pixel. + virtual void drawMove(const QPoint& p) = 0; + // Called when drawMove is needed with an adjustment; + // should be overridden in case an adjustment is applicable. + virtual void drawMoveWithAdjustment(const QPoint& p) { drawMove(p); } + // Called when the tool is activated. + virtual void drawStart(const CaptureContext& context) = 0; + // Called right after pressing the button which activates the tool. + virtual void pressed(CaptureContext& context) = 0; + // Called when the color is changed in the editor. + virtual void onColorChanged(const QColor& c) = 0; + // Called when the size the tool size is changed by the user. + virtual void onSizeChanged(int size) = 0; + virtual int size() const { return -1; }; + +private: + unsigned int m_count; + bool m_editMode; +}; diff --git a/src/tools/circle/circletool.cpp b/src/tools/circle/circletool.cpp new file mode 100644 index 0000000..a918268 --- /dev/null +++ b/src/tools/circle/circletool.cpp @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "circletool.h" +#include + +CircleTool::CircleTool(QObject* parent) + : AbstractTwoPointTool(parent) +{ + m_supportsDiagonalAdj = true; +} + +QIcon CircleTool::icon(const QColor& background, bool inEditor) const +{ + Q_UNUSED(inEditor) + return QIcon(iconPath(background) + "circle-outline.svg"); +} +QString CircleTool::name() const +{ + return tr("Circle"); +} + +CaptureTool::Type CircleTool::type() const +{ + return CaptureTool::TYPE_CIRCLE; +} + +QString CircleTool::description() const +{ + return tr("Set the Circle as the paint tool"); +} + +CaptureTool* CircleTool::copy(QObject* parent) +{ + auto* tool = new CircleTool(parent); + copyParams(this, tool); + return tool; +} + +void CircleTool::process(QPainter& painter, const QPixmap& pixmap) +{ + Q_UNUSED(pixmap) + painter.setPen(QPen(color(), size())); + painter.drawEllipse(QRect(points().first, points().second)); +} + +void CircleTool::pressed(CaptureContext& context) +{ + Q_UNUSED(context) +} diff --git a/src/tools/circle/circletool.h b/src/tools/circle/circletool.h new file mode 100644 index 0000000..a69afb3 --- /dev/null +++ b/src/tools/circle/circletool.h @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/tools/abstracttwopointtool.h" + +class CircleTool : public AbstractTwoPointTool +{ + Q_OBJECT +public: + explicit CircleTool(QObject* parent = nullptr); + + QIcon icon(const QColor& background, bool inEditor) const override; + QString name() const override; + QString description() const override; + + CaptureTool* copy(QObject* parent = nullptr) override; + void process(QPainter& painter, const QPixmap& pixmap) override; + +protected: + CaptureTool::Type type() const override; + +public slots: + void pressed(CaptureContext& context) override; +}; diff --git a/src/tools/circlecount/circlecounttool.cpp b/src/tools/circlecount/circlecounttool.cpp new file mode 100644 index 0000000..5069058 --- /dev/null +++ b/src/tools/circlecount/circlecounttool.cpp @@ -0,0 +1,204 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "circlecounttool.h" +#include "colorutils.h" +#include +#include + +namespace { +#define PADDING_VALUE 2 +#define THICKNESS_OFFSET 15 +} + +CircleCountTool::CircleCountTool(QObject* parent) + : AbstractTwoPointTool(parent) + , m_valid(false) +{} + +QIcon CircleCountTool::icon(const QColor& background, bool inEditor) const +{ + Q_UNUSED(inEditor) + return QIcon(iconPath(background) + "circlecount-outline.svg"); +} + +QString CircleCountTool::info() +{ + m_tempString = QString("%1 - %2").arg(name(), count()); + return m_tempString; +} + +bool CircleCountTool::isValid() const +{ + return m_valid; +} + +QRect CircleCountTool::mousePreviewRect(const CaptureContext& context) const +{ + int width = (context.toolSize + THICKNESS_OFFSET) * 2; + QRect rect(0, 0, width, width); + rect.moveCenter(context.mousePos); + return rect; +} + +QRect CircleCountTool::boundingRect() const +{ + if (!isValid()) { + return {}; + } + int bubble_size = size() + THICKNESS_OFFSET + PADDING_VALUE; + + int line_pos_min_x = + std::min(points().first.x() - bubble_size, points().second.x()); + int line_pos_min_y = + std::min(points().first.y() - bubble_size, points().second.y()); + int line_pos_max_x = + std::max(points().first.x() + bubble_size, points().second.x()); + int line_pos_max_y = + std::max(points().first.y() + bubble_size, points().second.y()); + + return { line_pos_min_x, + line_pos_min_y, + line_pos_max_x - line_pos_min_x, + line_pos_max_y - line_pos_min_y }; +} + +QString CircleCountTool::name() const +{ + return tr("Circle Counter"); +} + +CaptureTool::Type CircleCountTool::type() const +{ + return CaptureTool::TYPE_CIRCLECOUNT; +} + +void CircleCountTool::copyParams(const CircleCountTool* from, + CircleCountTool* to) +{ + AbstractTwoPointTool::copyParams(from, to); + to->setCount(from->count()); + to->m_valid = from->m_valid; +} + +QString CircleCountTool::description() const +{ + return tr("Add an autoincrementing counter bubble"); +} + +CaptureTool* CircleCountTool::copy(QObject* parent) +{ + auto* tool = new CircleCountTool(parent); + copyParams(this, tool); + return tool; +} + +void CircleCountTool::process(QPainter& painter, const QPixmap& pixmap) +{ + Q_UNUSED(pixmap) + // save current pen, brush, and font state + auto orig_pen = painter.pen(); + auto orig_brush = painter.brush(); + auto orig_font = painter.font(); + + QColor contrastColor = + ColorUtils::colorIsDark(color()) ? Qt::white : Qt::black; + QColor antiContrastColor = + ColorUtils::colorIsDark(color()) ? Qt::black : Qt::white; + + int bubble_size = size() + THICKNESS_OFFSET; + + QLineF line(points().first, points().second); + // if the mouse is outside of the bubble, draw the pointer + if (line.length() > bubble_size) { + painter.setPen(QPen(color(), 0)); + painter.setBrush(color()); + + int middleX = points().first.x(); + int middleY = points().first.y(); + + QLineF normal = line.normalVector(); + normal.setLength(bubble_size); + QPoint p1 = normal.p2().toPoint(); + QPoint p2(middleX - (p1.x() - middleX), middleY - (p1.y() - middleY)); + + QPainterPath path; + path.moveTo(points().first); + path.lineTo(p1); + path.lineTo(points().second); + path.lineTo(p2); + path.lineTo(points().first); + painter.drawPath(path); + } + + painter.setPen(contrastColor); + painter.setBrush(antiContrastColor); + painter.drawEllipse( + points().first, bubble_size + PADDING_VALUE, bubble_size + PADDING_VALUE); + painter.setBrush(color()); + painter.drawEllipse(points().first, bubble_size, bubble_size); + QRect textRect = QRect(points().first.x() - bubble_size / 2, + points().first.y() - bubble_size / 2, + bubble_size, + bubble_size); + auto new_font = orig_font; + auto fontSize = bubble_size; + new_font.setPixelSize(fontSize); + new_font.setBold(true); + painter.setFont(new_font); + + // Draw bounding circle + QRect bRect = + painter.boundingRect(textRect, Qt::AlignCenter, QString::number(count())); + + // Calculate font size + while (bRect.width() > textRect.width()) { + fontSize--; + if (fontSize == 0) { + break; + } + new_font.setPixelSize(fontSize); + painter.setFont(new_font); + bRect = painter.boundingRect( + textRect, Qt::AlignCenter, QString::number(count())); + } + + // Draw text + painter.setPen(contrastColor); + painter.drawText(textRect, Qt::AlignCenter, QString::number(count())); + // restore original font, brush, and pen + painter.setFont(orig_font); + painter.setBrush(orig_brush); + painter.setPen(orig_pen); +} + +void CircleCountTool::paintMousePreview(QPainter& painter, + const CaptureContext& context) +{ + onSizeChanged(context.toolSize + PADDING_VALUE); + + // Thickness for pen is *2 to range from radius to diameter to match the + // ellipse draw function + auto orig_pen = painter.pen(); + auto orig_opacity = painter.opacity(); + painter.setOpacity(0.35); + painter.setPen(QPen(context.color, + (size() + THICKNESS_OFFSET) * 2, + Qt::SolidLine, + Qt::RoundCap)); + painter.drawLine(context.mousePos, + { context.mousePos.x() + 1, context.mousePos.y() + 1 }); + painter.setOpacity(orig_opacity); + painter.setPen(orig_pen); +} + +void CircleCountTool::drawStart(const CaptureContext& context) +{ + AbstractTwoPointTool::drawStart(context); + m_valid = true; +} + +void CircleCountTool::pressed(CaptureContext& context) +{ + Q_UNUSED(context) +} diff --git a/src/tools/circlecount/circlecounttool.h b/src/tools/circlecount/circlecounttool.h new file mode 100644 index 0000000..d2bf9d5 --- /dev/null +++ b/src/tools/circlecount/circlecounttool.h @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/tools/abstracttwopointtool.h" + +class CircleCountTool : public AbstractTwoPointTool +{ + Q_OBJECT +public: + explicit CircleCountTool(QObject* parent = nullptr); + + QIcon icon(const QColor& background, bool inEditor) const override; + QString name() const override; + QString description() const override; + QString info() override; + bool isValid() const override; + + QRect mousePreviewRect(const CaptureContext& context) const override; + QRect boundingRect() const override; + + CaptureTool* copy(QObject* parent = nullptr) override; + void process(QPainter& painter, const QPixmap& pixmap) override; + void paintMousePreview(QPainter& painter, + const CaptureContext& context) override; + +protected: + CaptureTool::Type type() const override; + void copyParams(const CircleCountTool* from, CircleCountTool* to); + +public slots: + void drawStart(const CaptureContext& context) override; + void pressed(CaptureContext& context) override; + +private: + QString m_tempString; + bool m_valid; +}; diff --git a/src/tools/copy/copytool.cpp b/src/tools/copy/copytool.cpp new file mode 100644 index 0000000..99dddc0 --- /dev/null +++ b/src/tools/copy/copytool.cpp @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "copytool.h" +#include "src/utils/screenshotsaver.h" +#include + +CopyTool::CopyTool(QObject* parent) + : AbstractActionTool(parent) +{} + +bool CopyTool::closeOnButtonPressed() const +{ + return true; +} + +QIcon CopyTool::icon(const QColor& background, bool inEditor) const +{ + Q_UNUSED(inEditor) + return QIcon(iconPath(background) + "content-copy.svg"); +} +QString CopyTool::name() const +{ + return tr("Copy"); +} + +CaptureTool::Type CopyTool::type() const +{ + return CaptureTool::TYPE_COPY; +} + +QString CopyTool::description() const +{ + return tr("Copy selection to clipboard"); +} + +CaptureTool* CopyTool::copy(QObject* parent) +{ + return new CopyTool(parent); +} + +void CopyTool::pressed(CaptureContext& context) +{ + emit requestAction(REQ_CLEAR_SELECTION); + context.request.addTask(CaptureRequest::COPY); + emit requestAction(REQ_CAPTURE_DONE_OK); + emit requestAction(REQ_CLOSE_GUI); +} diff --git a/src/tools/copy/copytool.h b/src/tools/copy/copytool.h new file mode 100644 index 0000000..947e12d --- /dev/null +++ b/src/tools/copy/copytool.h @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/tools/abstractactiontool.h" + +class CopyTool : public AbstractActionTool +{ + Q_OBJECT +public: + explicit CopyTool(QObject* parent = nullptr); + + bool closeOnButtonPressed() const override; + + QIcon icon(const QColor& background, bool inEditor) const override; + QString name() const override; + QString description() const override; + + CaptureTool* copy(QObject* parent = nullptr) override; + +protected: + CaptureTool::Type type() const override; + +public slots: + void pressed(CaptureContext& context) override; +}; diff --git a/src/tools/exit/exittool.cpp b/src/tools/exit/exittool.cpp new file mode 100644 index 0000000..66bde1a --- /dev/null +++ b/src/tools/exit/exittool.cpp @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "exittool.h" +#include + +ExitTool::ExitTool(QObject* parent) + : AbstractActionTool(parent) +{} + +bool ExitTool::closeOnButtonPressed() const +{ + return true; +} + +QIcon ExitTool::icon(const QColor& background, bool inEditor) const +{ + Q_UNUSED(inEditor) + return QIcon(iconPath(background) + "close.svg"); +} +QString ExitTool::name() const +{ + return tr("Exit"); +} + +CaptureTool::Type ExitTool::type() const +{ + return CaptureTool::TYPE_EXIT; +} + +QString ExitTool::description() const +{ + return tr("Leave the capture screen"); +} + +CaptureTool* ExitTool::copy(QObject* parent) +{ + return new ExitTool(parent); +} + +void ExitTool::pressed(CaptureContext& context) +{ + Q_UNUSED(context) + emit requestAction(REQ_CLOSE_GUI); +} diff --git a/src/tools/exit/exittool.h b/src/tools/exit/exittool.h new file mode 100644 index 0000000..e52f047 --- /dev/null +++ b/src/tools/exit/exittool.h @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/tools/abstractactiontool.h" + +class ExitTool : public AbstractActionTool +{ + Q_OBJECT +public: + explicit ExitTool(QObject* parent = nullptr); + + bool closeOnButtonPressed() const override; + + QIcon icon(const QColor& background, bool inEditor) const override; + QString name() const override; + QString description() const override; + // TODO create a new abstract class to get rid of such baggage + + CaptureTool* copy(QObject* parent = nullptr) override; + +protected: + CaptureTool::Type type() const override; + +public slots: + void pressed(CaptureContext& context) override; +}; diff --git a/src/tools/imgupload/imguploadermanager.cpp b/src/tools/imgupload/imguploadermanager.cpp new file mode 100644 index 0000000..37df80c --- /dev/null +++ b/src/tools/imgupload/imguploadermanager.cpp @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: Yurii Puchkov & Contributors +// + +#include "imguploadermanager.h" +#include +#include + +// TODO - remove this hard-code and create plugin manager in the future, you may +// include other storage headers here +#include "storages/imgur/imguruploader.h" + +ImgUploaderManager::ImgUploaderManager(QObject* parent) + : QObject(parent) + , m_imgUploaderBase(nullptr) +{ + // TODO - implement ImgUploader for other Storages and selection among them + m_imgUploaderPlugin = IMG_UPLOADER_STORAGE_DEFAULT; + init(); +} + +void ImgUploaderManager::init() +{ + // TODO - implement ImgUploader for other Storages and selection among them, + // example: + // if (uploaderPlugin().compare("s3") == 0) { + // m_qstrUrl = ImgS3Settings().value("S3", "S3_URL").toString(); + //} else { + // m_qstrUrl = "https://imgur.com/"; + // m_imgUploaderPlugin = "imgur"; + //} + m_urlString = "https://imgur.com/"; + m_imgUploaderPlugin = "imgur"; +} + +ImgUploaderBase* ImgUploaderManager::uploader(const QPixmap& capture, + QWidget* parent) +{ + // TODO - implement ImgUploader for other Storages and selection among them, + // example: + // if (uploaderPlugin().compare("s3") == 0) { + // m_imgUploaderBase = + // (ImgUploaderBase*)(new ImgS3Uploader(capture, parent)); + //} else { + // m_imgUploaderBase = + // (ImgUploaderBase*)(new ImgurUploader(capture, parent)); + //} + m_imgUploaderBase = (ImgUploaderBase*)(new ImgurUploader(capture, parent)); + if (m_imgUploaderBase && !capture.isNull()) { + m_imgUploaderBase->upload(); + } + return m_imgUploaderBase; +} + +ImgUploaderBase* ImgUploaderManager::uploader(const QString& imgUploaderPlugin) +{ + m_imgUploaderPlugin = imgUploaderPlugin; + init(); + return uploader(QPixmap()); +} + +const QString& ImgUploaderManager::uploaderPlugin() +{ + return m_imgUploaderPlugin; +} + +const QString& ImgUploaderManager::url() +{ + return m_urlString; +} diff --git a/src/tools/imgupload/imguploadermanager.h b/src/tools/imgupload/imguploadermanager.h new file mode 100644 index 0000000..9b6f214 --- /dev/null +++ b/src/tools/imgupload/imguploadermanager.h @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: Yurii Puchkov & Contributors +// + +#ifndef FLAMESHOT_IMGUPLOADERMANAGER_H +#define FLAMESHOT_IMGUPLOADERMANAGER_H + +#include "src/tools/imgupload/storages/imguploaderbase.h" +#include + +#define IMG_UPLOADER_STORAGE_DEFAULT "imgur" + +class QPixmap; +class QWidget; + +class ImgUploaderManager : public QObject +{ + Q_OBJECT +public: + explicit ImgUploaderManager(QObject* parent = nullptr); + + ImgUploaderBase* uploader(const QPixmap& capture, + QWidget* parent = nullptr); + ImgUploaderBase* uploader(const QString& imgUploaderPlugin); + + const QString& url(); + const QString& uploaderPlugin(); + +private: + void init(); + +private: + ImgUploaderBase* m_imgUploaderBase; + QString m_urlString; + QString m_imgUploaderPlugin; +}; + +#endif // FLAMESHOT_IMGUPLOADERMANAGER_H diff --git a/src/tools/imgupload/imguploadertool.cpp b/src/tools/imgupload/imguploadertool.cpp new file mode 100644 index 0000000..4c51f6c --- /dev/null +++ b/src/tools/imgupload/imguploadertool.cpp @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "imguploadertool.h" + +ImgUploaderTool::ImgUploaderTool(QObject* parent) + : AbstractActionTool(parent) +{} + +bool ImgUploaderTool::closeOnButtonPressed() const +{ + return true; +} + +QIcon ImgUploaderTool::icon(const QColor& background, bool inEditor) const +{ + Q_UNUSED(inEditor); + return QIcon(iconPath(background) + "cloud-upload.svg"); +} + +QString ImgUploaderTool::name() const +{ + return tr("Image Uploader"); +} + +CaptureTool::Type ImgUploaderTool::type() const +{ + return CaptureTool::TYPE_IMAGEUPLOADER; +} + +QString ImgUploaderTool::description() const +{ + return tr("Upload the selection"); +} + +CaptureTool* ImgUploaderTool::copy(QObject* parent) +{ + return new ImgUploaderTool(parent); +} + +void ImgUploaderTool::pressed(CaptureContext& context) +{ + emit requestAction(REQ_CLEAR_SELECTION); + emit requestAction(REQ_CAPTURE_DONE_OK); + context.request.addTask(CaptureRequest::UPLOAD); + emit requestAction(REQ_CLOSE_GUI); +} diff --git a/src/tools/imgupload/imguploadertool.h b/src/tools/imgupload/imguploadertool.h new file mode 100644 index 0000000..72b0b00 --- /dev/null +++ b/src/tools/imgupload/imguploadertool.h @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/tools/abstractactiontool.h" + +class ImgUploaderTool : public AbstractActionTool +{ + Q_OBJECT +public: + explicit ImgUploaderTool(QObject* parent = nullptr); + + bool closeOnButtonPressed() const override; + + QIcon icon(const QColor& background, bool inEditor) const override; + QString name() const override; + QString description() const override; + + CaptureTool* copy(QObject* parent = nullptr) override; + +protected: + CaptureTool::Type type() const override; + +public slots: + void pressed(CaptureContext& context) override; + +private: + QPixmap capture; +}; diff --git a/src/tools/imgupload/storages/imguploaderbase.cpp b/src/tools/imgupload/storages/imguploaderbase.cpp new file mode 100644 index 0000000..9aa5ee8 --- /dev/null +++ b/src/tools/imgupload/storages/imguploaderbase.cpp @@ -0,0 +1,193 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "imguploaderbase.h" +#include "src/core/flameshotdaemon.h" +#include "src/utils/confighandler.h" +#include "src/utils/globalvalues.h" +#include "src/utils/history.h" +#include "src/utils/screenshotsaver.h" +#include "src/widgets/imagelabel.h" +#include "src/widgets/loadspinner.h" +#include "src/widgets/notificationwidget.h" +#include +// FIXME #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +ImgUploaderBase::ImgUploaderBase(const QPixmap& capture, QWidget* parent) + : QWidget(parent) + , m_pixmap(capture) +{ + setWindowTitle(tr("Upload image")); + setWindowIcon(QIcon(GlobalValues::iconPath())); + + QRect position = frameGeometry(); + QScreen* screen = QGuiApplication::screenAt(QCursor::pos()); + position.moveCenter(screen->availableGeometry().center()); + move(position.topLeft()); + + m_spinner = new LoadSpinner(this); + m_spinner->setColor(ConfigHandler().uiColor()); + m_spinner->start(); + + m_infoLabel = new QLabel(tr("Uploading Image")); + m_infoLabel->setTextInteractionFlags(Qt::TextSelectableByMouse); + m_infoLabel->setCursor(QCursor(Qt::IBeamCursor)); + + m_vLayout = new QVBoxLayout(); + setLayout(m_vLayout); + m_vLayout->addWidget(m_spinner, 0, Qt::AlignHCenter); + m_vLayout->addWidget(m_infoLabel); + + setAttribute(Qt::WA_DeleteOnClose); +} + +LoadSpinner* ImgUploaderBase::spinner() +{ + return m_spinner; +} + +const QUrl& ImgUploaderBase::imageURL() +{ + return m_imageURL; +} + +void ImgUploaderBase::setImageURL(const QUrl& imageURL) +{ + m_imageURL = imageURL; +} + +const QPixmap& ImgUploaderBase::pixmap() +{ + return m_pixmap; +} + +void ImgUploaderBase::setPixmap(const QPixmap& pixmap) +{ + m_pixmap = pixmap; +} + +NotificationWidget* ImgUploaderBase::notification() +{ + return m_notification; +} + +void ImgUploaderBase::setInfoLabelText(const QString& text) +{ + m_infoLabel->setText(text); +} + +void ImgUploaderBase::startDrag() +{ + auto* mimeData = new QMimeData; + mimeData->setUrls(QList{ m_imageURL }); + mimeData->setImageData(m_pixmap); + + auto* dragHandler = new QDrag(this); + dragHandler->setMimeData(mimeData); + dragHandler->setPixmap(m_pixmap.scaled( + 256, 256, Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation)); + dragHandler->exec(); +} + +void ImgUploaderBase::showPostUploadDialog() +{ + m_infoLabel->deleteLater(); + + m_notification = new NotificationWidget(); + m_vLayout->addWidget(m_notification); + + auto* imageLabel = new ImageLabel(); + imageLabel->setScreenshot(m_pixmap); + imageLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + connect(imageLabel, + &ImageLabel::dragInitiated, + this, + &ImgUploaderBase::startDrag); + m_vLayout->addWidget(imageLabel); + + m_hLayout = new QHBoxLayout(); + m_vLayout->addLayout(m_hLayout); + + m_copyUrlButton = new QPushButton(tr("Copy URL")); + m_openUrlButton = new QPushButton(tr("Open URL")); + m_openDeleteUrlButton = new QPushButton(tr("Delete image")); + m_toClipboardButton = new QPushButton(tr("Image to Clipboard.")); + m_saveToFilesystemButton = new QPushButton(tr("Save image")); + m_hLayout->addWidget(m_copyUrlButton); + m_hLayout->addWidget(m_openUrlButton); + m_hLayout->addWidget(m_openDeleteUrlButton); + m_hLayout->addWidget(m_toClipboardButton); + m_hLayout->addWidget(m_saveToFilesystemButton); + + connect( + m_copyUrlButton, &QPushButton::clicked, this, &ImgUploaderBase::copyURL); + connect( + m_openUrlButton, &QPushButton::clicked, this, &ImgUploaderBase::openURL); + connect(m_openDeleteUrlButton, + &QPushButton::clicked, + this, + &ImgUploaderBase::deleteCurrentImage); + connect(m_toClipboardButton, + &QPushButton::clicked, + this, + &ImgUploaderBase::copyImage); + + QObject::connect(m_saveToFilesystemButton, + &QPushButton::clicked, + this, + &ImgUploaderBase::saveScreenshotToFilesystem); +} + +void ImgUploaderBase::openURL() +{ + bool successful = QDesktopServices::openUrl(m_imageURL); + if (!successful) { + m_notification->showMessage(tr("Unable to open the URL.")); + } +} + +void ImgUploaderBase::copyURL() +{ + FlameshotDaemon::copyToClipboard(m_imageURL.toString()); + m_notification->showMessage(tr("URL copied to clipboard.")); +} + +void ImgUploaderBase::copyImage() +{ + FlameshotDaemon::copyToClipboard(m_pixmap); + m_notification->showMessage(tr("Screenshot copied to clipboard.")); +} + +void ImgUploaderBase::deleteCurrentImage() +{ + History history; + HistoryFileName unpackFileName = history.unpackFileName(m_currentImageName); + deleteImage(unpackFileName.file, unpackFileName.token); +} + +void ImgUploaderBase::saveScreenshotToFilesystem() +{ + if (!saveToFilesystemGUI(m_pixmap)) { + m_notification->showMessage( + tr("Unable to save the screenshot to disk.")); + return; + } + m_notification->showMessage(tr("Screenshot saved.")); +} diff --git a/src/tools/imgupload/storages/imguploaderbase.h b/src/tools/imgupload/storages/imguploaderbase.h new file mode 100644 index 0000000..44cd051 --- /dev/null +++ b/src/tools/imgupload/storages/imguploaderbase.h @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include +#include + +class QNetworkReply; +class QNetworkAccessManager; +class QHBoxLayout; +class QVBoxLayout; +class QLabel; +class LoadSpinner; +class QPushButton; +class QUrl; +class NotificationWidget; + +class ImgUploaderBase : public QWidget +{ + Q_OBJECT +public: + explicit ImgUploaderBase(const QPixmap& capture, QWidget* parent = nullptr); + + LoadSpinner* spinner(); + + const QUrl& imageURL(); + void setImageURL(const QUrl&); + const QPixmap& pixmap(); + void setPixmap(const QPixmap&); + void setInfoLabelText(const QString&); + + NotificationWidget* notification(); + virtual void deleteImage(const QString& fileName, + const QString& deleteToken) = 0; + virtual void upload() = 0; + +signals: + void uploadOk(const QUrl& url); + void deleteOk(); + +public slots: + void showPostUploadDialog(); + +private slots: + void startDrag(); + void openURL(); + void copyURL(); + void copyImage(); + void deleteCurrentImage(); + void saveScreenshotToFilesystem(); + +private: + QPixmap m_pixmap; + + QVBoxLayout* m_vLayout; + QHBoxLayout* m_hLayout; + // loading + QLabel* m_infoLabel; + LoadSpinner* m_spinner; + // uploaded + QPushButton* m_openUrlButton; + QPushButton* m_openDeleteUrlButton; + QPushButton* m_copyUrlButton; + QPushButton* m_toClipboardButton; + QPushButton* m_saveToFilesystemButton; + QUrl m_imageURL; + NotificationWidget* m_notification; + +public: + QString m_currentImageName; +}; diff --git a/src/tools/imgupload/storages/imgur/imguruploader.cpp b/src/tools/imgupload/storages/imgur/imguruploader.cpp new file mode 100644 index 0000000..1021dc6 --- /dev/null +++ b/src/tools/imgupload/storages/imgur/imguruploader.cpp @@ -0,0 +1,111 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "imguruploader.h" +#include "src/utils/confighandler.h" +#include "src/utils/filenamehandler.h" +#include "src/utils/history.h" +#include "src/widgets/loadspinner.h" +#include "src/widgets/notificationwidget.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +ImgurUploader::ImgurUploader(const QPixmap& capture, QWidget* parent) + : ImgUploaderBase(capture, parent) +{ + m_NetworkAM = new QNetworkAccessManager(this); + connect(m_NetworkAM, + &QNetworkAccessManager::finished, + this, + &ImgurUploader::handleReply); +} + +void ImgurUploader::handleReply(QNetworkReply* reply) +{ + spinner()->deleteLater(); + m_currentImageName.clear(); + QJsonDocument response = QJsonDocument::fromJson(reply->readAll()); + QJsonObject json = response.object(); + if (reply->error() == QNetworkReply::NoError) { + QJsonObject data = json[QStringLiteral("data")].toObject(); + setImageURL(data[QStringLiteral("link")].toString()); + + auto deleteToken = data[QStringLiteral("deletehash")].toString(); + + // save history + m_currentImageName = imageURL().toString(); + int lastSlash = m_currentImageName.lastIndexOf("/"); + if (lastSlash >= 0) { + m_currentImageName = m_currentImageName.mid(lastSlash + 1); + } + + // save image to history + History history; + m_currentImageName = + history.packFileName("imgur", deleteToken, m_currentImageName); + history.save(pixmap(), m_currentImageName); + + emit uploadOk(imageURL()); + } else { + QString status; + if (json.contains(QStringLiteral("errors")) && + json.value(QStringLiteral("errors")).isArray()) { + QJsonArray errorsArray = + json.value(QStringLiteral("errors")).toArray(); + if (!errorsArray.isEmpty() && errorsArray.at(0).isObject()) { + QJsonObject errorObj = errorsArray.at(0).toObject(); + status = errorObj.value(QStringLiteral("code")).toString() + + " - " + + errorObj.value(QStringLiteral("status")).toString(); + } + } + + setInfoLabelText(reply->errorString() + "\n" + status); + } + new QShortcut(Qt::Key_Escape, this, SLOT(close())); +} + +void ImgurUploader::upload() +{ + QByteArray byteArray; + QBuffer buffer(&byteArray); + pixmap().save(&buffer, "PNG"); + + QUrlQuery urlQuery; + urlQuery.addQueryItem(QStringLiteral("title"), QStringLiteral("")); + QString description = FileNameHandler().parsedPattern(); + urlQuery.addQueryItem(QStringLiteral("description"), description); + + QUrl url(QStringLiteral("https://api.imgur.com/3/image")); + url.setQuery(urlQuery); + QNetworkRequest request(url); + request.setHeader(QNetworkRequest::ContentTypeHeader, + "application/application/x-www-form-urlencoded"); + request.setRawHeader("Authorization", + QStringLiteral("Client-ID %1") + .arg(ConfigHandler().uploadClientSecret()) + .toUtf8()); + + m_NetworkAM->post(request, byteArray); +} + +void ImgurUploader::deleteImage(const QString& fileName, + const QString& deleteToken) +{ + Q_UNUSED(fileName) + bool successful = QDesktopServices::openUrl( + QUrl(QStringLiteral("https://imgur.com/delete/%1").arg(deleteToken))); + if (!successful) { + notification()->showMessage(tr("Unable to open the URL.")); + } + + emit deleteOk(); +} diff --git a/src/tools/imgupload/storages/imgur/imguruploader.h b/src/tools/imgupload/storages/imgur/imguruploader.h new file mode 100644 index 0000000..69f9f1e --- /dev/null +++ b/src/tools/imgupload/storages/imgur/imguruploader.h @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/tools/imgupload/storages/imguploaderbase.h" +#include +#include + +class QNetworkReply; +class QNetworkAccessManager; +class QUrl; + +class ImgurUploader : public ImgUploaderBase +{ + Q_OBJECT +public: + explicit ImgurUploader(const QPixmap& capture, QWidget* parent = nullptr); + void deleteImage(const QString& fileName, const QString& deleteToken); + +private slots: + void handleReply(QNetworkReply* reply); + +private: + void upload(); + +private: + QNetworkAccessManager* m_NetworkAM; +}; diff --git a/src/tools/invert/inverttool.cpp b/src/tools/invert/inverttool.cpp new file mode 100644 index 0000000..60854ec --- /dev/null +++ b/src/tools/invert/inverttool.cpp @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "inverttool.h" +#include +#include +#include +#include +#include +#include +#include + +InvertTool::InvertTool(QObject* parent) + : AbstractTwoPointTool(parent) +{} + +QIcon InvertTool::icon(const QColor& background, bool inEditor) const +{ + Q_UNUSED(inEditor) + return QIcon(iconPath(background) + "invert.svg"); +} + +QString InvertTool::name() const +{ + return tr("Invert"); +} + +CaptureTool::Type InvertTool::type() const +{ + return CaptureTool::TYPE_INVERT; +} + +QString InvertTool::description() const +{ + return tr("Set Inverter as the paint tool"); +} + +QRect InvertTool::boundingRect() const +{ + return QRect(points().first, points().second).normalized(); +} + +CaptureTool* InvertTool::copy(QObject* parent) +{ + auto* tool = new InvertTool(parent); + copyParams(this, tool); + return tool; +} + +void InvertTool::process(QPainter& painter, const QPixmap& pixmap) +{ + QRect selection = boundingRect().intersected(pixmap.rect()); + auto pixelRatio = pixmap.devicePixelRatio(); + QRect selectionScaled = QRect(selection.topLeft() * pixelRatio, + selection.bottomRight() * pixelRatio); + + // Invert selection + QPixmap inv = pixmap.copy(selectionScaled); + QImage img = inv.toImage(); + img.invertPixels(); + + painter.drawImage(selection, img); +} + +void InvertTool::drawSearchArea(QPainter& painter, const QPixmap& pixmap) +{ + Q_UNUSED(pixmap) + painter.fillRect(boundingRect(), QBrush(Qt::black)); +} + +void InvertTool::paintMousePreview(QPainter& painter, + const CaptureContext& context) +{ + Q_UNUSED(context) + Q_UNUSED(painter) +} + +void InvertTool::pressed(CaptureContext& context) +{ + Q_UNUSED(context) +} diff --git a/src/tools/invert/inverttool.h b/src/tools/invert/inverttool.h new file mode 100644 index 0000000..8c5980c --- /dev/null +++ b/src/tools/invert/inverttool.h @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/tools/abstracttwopointtool.h" + +class InvertTool : public AbstractTwoPointTool +{ + Q_OBJECT +public: + explicit InvertTool(QObject* parent = nullptr); + + QIcon icon(const QColor& background, bool inEditor) const override; + QString name() const override; + QString description() const override; + QRect boundingRect() const override; + + CaptureTool* copy(QObject* parent = nullptr) override; + void process(QPainter& painter, const QPixmap& pixmap) override; + void drawSearchArea(QPainter& painter, const QPixmap& pixmap) override; + void paintMousePreview(QPainter& painter, + const CaptureContext& context) override; + +protected: + CaptureTool::Type type() const override; + +public slots: + void pressed(CaptureContext& context) override; +}; diff --git a/src/tools/launcher/applaunchertool.cpp b/src/tools/launcher/applaunchertool.cpp new file mode 100644 index 0000000..58bd292 --- /dev/null +++ b/src/tools/launcher/applaunchertool.cpp @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "applaunchertool.h" +#include "applauncherwidget.h" + +AppLauncher::AppLauncher(QObject* parent) + : AbstractActionTool(parent) +{} + +bool AppLauncher::closeOnButtonPressed() const +{ + return true; +} + +QIcon AppLauncher::icon(const QColor& background, bool inEditor) const +{ + Q_UNUSED(inEditor) + return QIcon(iconPath(background) + "open_with.svg"); +} +QString AppLauncher::name() const +{ + return tr("App Launcher"); +} + +CaptureTool::Type AppLauncher::type() const +{ + return CaptureTool::TYPE_OPEN_APP; +} + +QString AppLauncher::description() const +{ + return tr("Choose an app to open the capture"); +} + +QWidget* AppLauncher::widget() +{ + return new AppLauncherWidget(capture); +} + +CaptureTool* AppLauncher::copy(QObject* parent) +{ + return new AppLauncher(parent); +} + +void AppLauncher::pressed(CaptureContext& context) +{ + capture = context.selectedScreenshotArea(); + emit requestAction(REQ_CAPTURE_DONE_OK); + emit requestAction(REQ_ADD_EXTERNAL_WIDGETS); + emit requestAction(REQ_CLOSE_GUI); +} diff --git a/src/tools/launcher/applaunchertool.h b/src/tools/launcher/applaunchertool.h new file mode 100644 index 0000000..9a03fce --- /dev/null +++ b/src/tools/launcher/applaunchertool.h @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/tools/abstractactiontool.h" + +class AppLauncher : public AbstractActionTool +{ + Q_OBJECT +public: + explicit AppLauncher(QObject* parent = nullptr); + + bool closeOnButtonPressed() const override; + + QIcon icon(const QColor& background, bool inEditor) const override; + QString name() const override; + QString description() const override; + + QWidget* widget() override; + + CaptureTool* copy(QObject* parent = nullptr) override; + +protected: + CaptureTool::Type type() const override; + +public slots: + void pressed(CaptureContext& context) override; + +private: + QPixmap capture; +}; diff --git a/src/tools/launcher/applauncherwidget.cpp b/src/tools/launcher/applauncherwidget.cpp new file mode 100644 index 0000000..08d34a3 --- /dev/null +++ b/src/tools/launcher/applauncherwidget.cpp @@ -0,0 +1,327 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "applauncherwidget.h" +#include "src/tools/launcher/launcheritemdelegate.h" +#include "src/utils/confighandler.h" +#include "src/utils/filenamehandler.h" +#include "src/utils/globalvalues.h" +#include "terminallauncher.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { +#if defined(Q_OS_WIN) +QMap catIconNames({ { "Graphics", "image.svg" }, + { "Utility", "apps.svg" } }); +} +#else +QMap catIconNames( + { { "Multimedia", "applications-multimedia" }, + { "Development", "applications-development" }, + { "Graphics", "applications-graphics" }, + { "Network", "preferences-system-network" }, + { "Office", "applications-office" }, + { "Science", "applications-science" }, + { "Settings", "preferences-desktop" }, + { "System", "preferences-system" }, + { "Utility", "applications-utilities" } }); +} +#endif + +AppLauncherWidget::AppLauncherWidget(const QPixmap& p, QWidget* parent) + : QWidget(parent) + , m_pixmap(p) +{ + setAttribute(Qt::WA_DeleteOnClose); + setWindowIcon(QIcon(GlobalValues::iconPath())); + setWindowTitle(tr("Open With")); + + m_keepOpen = ConfigHandler().keepOpenAppLauncher(); + +#if defined(Q_OS_WIN) + QDir userAppsFolder( + QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation) + .at(0)); + m_parser.processDirectory(userAppsFolder); + + QString dir(m_parser.getAllUsersStartMenuPath()); + if (!dir.isEmpty()) { + QDir allUserAppsFolder(dir); + m_parser.processDirectory(allUserAppsFolder); + } +#else + QStringList appsLocations = + QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation); + + for (const auto& appsLocation : appsLocations) { + QDir appsDir(appsLocation); + m_parser.processDirectory(QDir(appsDir)); + } + +#endif + + initAppMap(); + initListWidget(); + + m_terminalCheckbox = new QCheckBox(tr("Launch in terminal"), this); + m_keepOpenCheckbox = new QCheckBox(tr("Keep open after selection"), this); + m_keepOpenCheckbox->setChecked(ConfigHandler().keepOpenAppLauncher()); + connect(m_keepOpenCheckbox, + &QCheckBox::clicked, + this, + &AppLauncherWidget::checkboxClicked); + + // search items + m_lineEdit = new QLineEdit; + connect(m_lineEdit, + &QLineEdit::textChanged, + this, + &AppLauncherWidget::searchChanged); + m_filterList = new QListWidget; + m_filterList->hide(); + configureListView(m_filterList); + connect( + m_filterList, &QListWidget::clicked, this, &AppLauncherWidget::launch); + + m_layout = new QVBoxLayout(this); + m_layout->addWidget(m_filterList); + m_layout->addWidget(m_tabWidget); + m_layout->addWidget(m_lineEdit); + m_layout->addWidget(m_keepOpenCheckbox); + m_layout->addWidget(m_terminalCheckbox); + m_lineEdit->setFocus(); +} + +void AppLauncherWidget::launch(const QModelIndex& index) +{ + if (!QFileInfo(m_tempFile).isReadable()) { + m_tempFile = + FileNameHandler().properScreenshotPath(QDir::tempPath(), "png"); + bool ok = m_pixmap.save(m_tempFile); + if (!ok) { + QMessageBox::about( + this, tr("Error"), tr("Unable to write in") + QDir::tempPath()); + return; + } + } + // Heuristically, if there is a % in the command we assume it is the file + // name slot + QString command = index.data(Qt::UserRole).toString(); +#if defined(Q_OS_WIN) + // Do not split on Windows, since file path can contain spaces + // and % is not used in lnk files + QStringList prog_args; + prog_args << command; +#else + QStringList prog_args = command.split(" "); +#endif + // no quotes because it is going in an array! + static const QRegularExpression regexp("(\\%.)"); + if (command.contains("%")) { + // but that means we need to substitute IN the array not the string! + for (auto& i : prog_args) { + if (i.contains("%")) + i.replace(regexp, m_tempFile); + } + } else { + // we really should append the file name if there + prog_args.append(m_tempFile); // were no replacements + } + QString app_name = prog_args.at(0); + bool inTerminal = + index.data(Qt::UserRole + 1).toBool() || m_terminalCheckbox->isChecked(); + if (inTerminal) { + bool ok = TerminalLauncher::launchDetached(command); + if (!ok) { + QMessageBox::about( + this, tr("Error"), tr("Unable to launch in terminal.")); + } + } else { + QFileInfo fi(m_tempFile); + QString workingDir = fi.absolutePath(); + prog_args.removeAt(0); // strip program name out + QProcess::startDetached(app_name, prog_args, workingDir); + } + if (!m_keepOpen) { + close(); + } +} + +void AppLauncherWidget::checkboxClicked(const bool enabled) +{ + m_keepOpen = enabled; + ConfigHandler().setKeepOpenAppLauncher(enabled); + m_keepOpenCheckbox->setChecked(enabled); +} + +void AppLauncherWidget::searchChanged(const QString& text) +{ + if (text.isEmpty()) { + m_filterList->hide(); + m_tabWidget->show(); + } else { + m_tabWidget->hide(); + m_filterList->show(); + m_filterList->clear(); + const QRegularExpression regexp( + QRegularExpression::wildcardToRegularExpression("*" + text + "*"), + QRegularExpression::CaseInsensitiveOption); + QVector apps; + + for (auto const& i : catIconNames.toStdMap()) { + const QString& cat = i.first; + if (!m_appsMap.contains(cat)) { + continue; + } + const QVector& appList = m_appsMap[cat]; + for (const DesktopAppData& app : appList) { + if (!apps.contains(app) && (app.name.contains(regexp) || + app.description.contains(regexp))) { + apps.append(app); + } + } + } + addAppsToListWidget(m_filterList, apps); + } +} + +void AppLauncherWidget::initListWidget() +{ + m_tabWidget = new QTabWidget; + const int size = GlobalValues::buttonBaseSize(); + m_tabWidget->setIconSize(QSize(size, size)); + + for (auto const& i : catIconNames.toStdMap()) { + const QString& cat = i.first; + const QString& iconName = i.second; + + if (!m_appsMap.contains(cat)) { + continue; + } + + auto* itemsWidget = new QListWidget(); + configureListView(itemsWidget); + + const QVector& appList = m_appsMap[cat]; + addAppsToListWidget(itemsWidget, appList); + +#if defined(Q_OS_WIN) + QColor background = this->palette().window().color(); + bool isDark = ColorUtils::colorIsDark(background); + QString modifier = + isDark ? PathInfo::whiteIconPath() : PathInfo::blackIconPath(); + m_tabWidget->addTab( + itemsWidget, QIcon(modifier + iconName), QLatin1String("")); +#else + m_tabWidget->addTab( + itemsWidget, QIcon::fromTheme(iconName), QLatin1String("")); +#endif + m_tabWidget->setTabToolTip(m_tabWidget->count(), cat); + if (cat == QLatin1String("Graphics")) { + m_tabWidget->setCurrentIndex(m_tabWidget->count() - 1); + } + } +} + +void AppLauncherWidget::initAppMap() +{ + QStringList categories({ "AudioVideo", + "Audio", + "Video", + "Development", + "Graphics", + "Network", + "Office", + "Science", + "Settings", + "System", + "Utility" }); + + m_appsMap = m_parser.getAppsByCategory(categories); + + // Unify multimedia. + QVector multimediaList; + QStringList multimediaNames; + multimediaNames << QStringLiteral("AudioVideo") << QStringLiteral("Audio") + << QStringLiteral("Video"); + for (const QString& name : std::as_const(multimediaNames)) { + if (!m_appsMap.contains(name)) { + continue; + } + for (const auto& i : m_appsMap[name]) { + if (!multimediaList.contains(i)) { + multimediaList.append(i); + } + } + m_appsMap.remove(name); + } + + if (!multimediaList.isEmpty()) { + m_appsMap.insert(QStringLiteral("Multimedia"), multimediaList); + } +} + +void AppLauncherWidget::configureListView(QListWidget* widget) +{ + widget->setItemDelegate(new LauncherItemDelegate()); + widget->setViewMode(QListWidget::IconMode); + widget->setResizeMode(QListView::Adjust); + widget->setSpacing(4); + widget->setFlow(QListView::LeftToRight); + widget->setDragEnabled(false); + widget->setMinimumWidth(GlobalValues::buttonBaseSize() * 11); + connect(widget, &QListWidget::clicked, this, &AppLauncherWidget::launch); +} + +void AppLauncherWidget::addAppsToListWidget( + QListWidget* widget, + const QVector& appList) +{ + for (const DesktopAppData& app : appList) { + auto* buttonItem = new QListWidgetItem(widget); + buttonItem->setData(Qt::DecorationRole, app.icon); + buttonItem->setData(Qt::DisplayRole, app.name); + buttonItem->setData(Qt::UserRole, app.exec); + buttonItem->setData(Qt::UserRole + 1, app.showInTerminal); + QColor foregroundColor = + this->palette().color(QWidget::foregroundRole()); + buttonItem->setForeground(foregroundColor); + + buttonItem->setIcon(app.icon); + buttonItem->setText(app.name); + buttonItem->setToolTip(app.description); + } +} + +void AppLauncherWidget::keyPressEvent(QKeyEvent* keyEvent) +{ + if (keyEvent->key() == Qt::Key_Escape) { + close(); + } else if (keyEvent->key() == Qt::Key_Return) { + auto* widget = (QListWidget*)m_tabWidget->currentWidget(); + if (m_filterList->isVisible()) + widget = m_filterList; + auto* item = widget->currentItem(); + if (item == nullptr) { + item = widget->item(0); + widget->setCurrentItem(item); + } + QModelIndex const idx = widget->currentIndex(); + AppLauncherWidget::launch(idx); + } else { + QWidget::keyPressEvent(keyEvent); + } +} diff --git a/src/tools/launcher/applauncherwidget.h b/src/tools/launcher/applauncherwidget.h new file mode 100644 index 0000000..7ed463a --- /dev/null +++ b/src/tools/launcher/applauncherwidget.h @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include +#include + +#if defined(Q_OS_WIN) +#include "src/utils/winlnkfileparse.h" +#else +#include "src/utils/desktopfileparse.h" +#endif + +class QTabWidget; +class QCheckBox; +class QVBoxLayout; +class QLineEdit; +class QListWidget; + +class AppLauncherWidget : public QWidget +{ + Q_OBJECT +public: + explicit AppLauncherWidget(const QPixmap& p, QWidget* parent = nullptr); + +private slots: + void launch(const QModelIndex& index); + void checkboxClicked(const bool enabled); + void searchChanged(const QString& text); + +private: + void initListWidget(); + void initAppMap(); + void configureListView(QListWidget* widget); + void addAppsToListWidget(QListWidget* widget, + const QVector& appList); + void keyPressEvent(QKeyEvent* keyEvent) override; + +#if defined(Q_OS_WIN) + WinLnkFileParser m_parser; +#else + DesktopFileParser m_parser; +#endif + QPixmap m_pixmap; + QString m_tempFile; + bool m_keepOpen; + QMap> m_appsMap; + QCheckBox* m_keepOpenCheckbox; + QCheckBox* m_terminalCheckbox; + QVBoxLayout* m_layout; + QLineEdit* m_lineEdit; + QListWidget* m_filterList; + QTabWidget* m_tabWidget; +}; diff --git a/src/tools/launcher/launcheritemdelegate.cpp b/src/tools/launcher/launcheritemdelegate.cpp new file mode 100644 index 0000000..1255401 --- /dev/null +++ b/src/tools/launcher/launcheritemdelegate.cpp @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "launcheritemdelegate.h" +#include "src/utils/globalvalues.h" +#include + +LauncherItemDelegate::LauncherItemDelegate(QObject* parent) + : QStyledItemDelegate(parent) +{} + +void LauncherItemDelegate::paint(QPainter* painter, + const QStyleOptionViewItem& option, + const QModelIndex& index) const +{ + const QRect& rect = option.rect; + if (option.state & (QStyle::State_Selected | QStyle::State_MouseOver)) { + painter->save(); + painter->setPen(Qt::transparent); + painter->setBrush(QPalette().highlight()); + painter->drawRect( + rect.x(), rect.y(), rect.width() - 1, rect.height() - 1); + painter->restore(); + } + auto icon = index.data(Qt::DecorationRole).value(); + + const int iconSide = static_cast(GlobalValues::buttonBaseSize() * 1.3); + const int halfIcon = iconSide / 2; + const int halfWidth = rect.width() / 2; + const int halfHeight = rect.height() / 2; + QSize size(iconSide, iconSide); + QPixmap pixIcon = icon.pixmap(size).scaled( + size, Qt::KeepAspectRatio, Qt::SmoothTransformation); + painter->drawPixmap(rect.x() + (halfWidth - halfIcon), + rect.y() + (halfHeight / 2 - halfIcon), + iconSide, + iconSide, + pixIcon); + const QRect textRect( + rect.x(), rect.y() + halfHeight, rect.width(), halfHeight); + painter->drawText(textRect, + Qt::TextWordWrap | Qt::AlignHCenter, + index.data(Qt::DisplayRole).toString()); +} + +QSize LauncherItemDelegate::sizeHint(const QStyleOptionViewItem& option, + const QModelIndex& index) const +{ + Q_UNUSED(option) + Q_UNUSED(index) + const int size = GlobalValues::buttonBaseSize(); + return { static_cast(size * 3.2), static_cast(size * 3.7) }; +} diff --git a/src/tools/launcher/launcheritemdelegate.h b/src/tools/launcher/launcheritemdelegate.h new file mode 100644 index 0000000..49c1d9d --- /dev/null +++ b/src/tools/launcher/launcheritemdelegate.h @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/utils/desktopfileparse.h" +#include + +class LauncherItemDelegate : public QStyledItemDelegate +{ + Q_OBJECT +public: + explicit LauncherItemDelegate(QObject* parent = nullptr); + + void paint(QPainter* painter, + const QStyleOptionViewItem& option, + const QModelIndex& index) const override; + + QSize sizeHint(const QStyleOptionViewItem& option, + const QModelIndex& index) const override; +}; diff --git a/src/tools/launcher/openwithprogram.cpp b/src/tools/launcher/openwithprogram.cpp new file mode 100644 index 0000000..71f4b90 --- /dev/null +++ b/src/tools/launcher/openwithprogram.cpp @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "openwithprogram.h" + +#if defined(Q_OS_WIN) +#include "src/utils/filenamehandler.h" +#include +#include +#include +#ifdef _WIN32_WINNT +#undef _WIN32_WINNT +#define _WIN32_WINNT 0x601 +#endif +#include + +#pragma comment(lib, "Shell32.lib") +#else +#include "src/tools/launcher/applauncherwidget.h" +#endif + +void showOpenWithMenu(const QPixmap& capture) +{ +#if defined(Q_OS_WIN) + QString tempFile = + FileNameHandler().properScreenshotPath(QDir::tempPath(), "png"); + bool ok = capture.save(tempFile); + if (!ok) { + QMessageBox::about(nullptr, + QObject::tr("Error"), + QObject::tr("Unable to write in") + + QDir::tempPath()); + return; + } + + OPENASINFO info; + auto wStringFile = tempFile.replace("/", "\\").toStdWString(); + info.pcszFile = wStringFile.c_str(); + info.pcszClass = nullptr; + info.oaifInFlags = OAIF_ALLOW_REGISTRATION | OAIF_EXEC; + SHOpenWithDialog(nullptr, &info); +#else + auto* w = new AppLauncherWidget(capture); + w->show(); +#endif +} diff --git a/src/tools/launcher/openwithprogram.h b/src/tools/launcher/openwithprogram.h new file mode 100644 index 0000000..4ba63ae --- /dev/null +++ b/src/tools/launcher/openwithprogram.h @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include + +void showOpenWithMenu(const QPixmap& capture); diff --git a/src/tools/launcher/terminallauncher.cpp b/src/tools/launcher/terminallauncher.cpp new file mode 100644 index 0000000..3b9b810 --- /dev/null +++ b/src/tools/launcher/terminallauncher.cpp @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "terminallauncher.h" +#include +#include +#include +#include + +namespace { +static const TerminalApp terminalApps[] = { + { "x-terminal-emulator", "-e" }, + { "xfce4-terminal", "-x" }, + { "konsole", "-e" }, + { "gnome-terminal", "--" }, + { "terminator", "-e" }, + { "terminology", "-e" }, + { "tilix", "-e" }, + { "xterm", "-e" }, + { "aterm", "-e" }, + { "Eterm", "-e" }, + { "rxvt", "-e" }, + { "urxvt", "-e" }, +}; +} + +TerminalLauncher::TerminalLauncher(QObject* parent) + : QObject(parent) +{} + +TerminalApp TerminalLauncher::getPreferedTerminal() +{ + TerminalApp res; + for (const TerminalApp& app : terminalApps) { + QString path = QStandardPaths::findExecutable(app.name); + if (!path.isEmpty()) { + res = app; + break; + } + } + return res; +} + +bool TerminalLauncher::launchDetached(const QString& command) +{ + TerminalApp app = getPreferedTerminal(); + return QProcess::startDetached(app.name, { app.arg, command }); +} diff --git a/src/tools/launcher/terminallauncher.h b/src/tools/launcher/terminallauncher.h new file mode 100644 index 0000000..02f1684 --- /dev/null +++ b/src/tools/launcher/terminallauncher.h @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include + +struct TerminalApp +{ + QString name; + QString arg; +}; + +class TerminalLauncher : public QObject +{ + Q_OBJECT +public: + explicit TerminalLauncher(QObject* parent = nullptr); + + static bool launchDetached(const QString& command); + +private: + static TerminalApp getPreferedTerminal(); +}; diff --git a/src/tools/line/linetool.cpp b/src/tools/line/linetool.cpp new file mode 100644 index 0000000..10b0f24 --- /dev/null +++ b/src/tools/line/linetool.cpp @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "linetool.h" +#include + +LineTool::LineTool(QObject* parent) + : AbstractTwoPointTool(parent) +{ + m_supportsOrthogonalAdj = true; + m_supportsDiagonalAdj = true; +} + +QIcon LineTool::icon(const QColor& background, bool inEditor) const +{ + Q_UNUSED(inEditor) + return QIcon(iconPath(background) + "line.svg"); +} + +QString LineTool::name() const +{ + return tr("Line"); +} + +CaptureTool::Type LineTool::type() const +{ + return CaptureTool::TYPE_DRAWER; +} + +QString LineTool::description() const +{ + return tr("Set the Line as the paint tool"); +} + +CaptureTool* LineTool::copy(QObject* parent) +{ + auto* tool = new LineTool(parent); + copyParams(this, tool); + return tool; +} + +void LineTool::process(QPainter& painter, const QPixmap& pixmap) +{ + Q_UNUSED(pixmap) + painter.setPen(QPen(color(), size())); + painter.drawLine(points().first, points().second); +} + +void LineTool::pressed(CaptureContext& context) +{ + Q_UNUSED(context) +} diff --git a/src/tools/line/linetool.h b/src/tools/line/linetool.h new file mode 100644 index 0000000..d08aed1 --- /dev/null +++ b/src/tools/line/linetool.h @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/tools/abstracttwopointtool.h" + +class LineTool : public AbstractTwoPointTool +{ + Q_OBJECT +public: + explicit LineTool(QObject* parent = nullptr); + + QIcon icon(const QColor& background, bool inEditor) const override; + QString name() const override; + QString description() const override; + + CaptureTool* copy(QObject* parent = nullptr) override; + void process(QPainter& painter, const QPixmap& pixmap) override; + +protected: + CaptureTool::Type type() const override; + +public slots: + void pressed(CaptureContext& context) override; +}; diff --git a/src/tools/marker/markertool.cpp b/src/tools/marker/markertool.cpp new file mode 100644 index 0000000..e2b4109 --- /dev/null +++ b/src/tools/marker/markertool.cpp @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "markertool.h" +#include + +#define PADDING_VALUE 14 + +MarkerTool::MarkerTool(QObject* parent) + : AbstractTwoPointTool(parent) +{ + m_supportsOrthogonalAdj = true; + m_supportsDiagonalAdj = true; +} + +QIcon MarkerTool::icon(const QColor& background, bool inEditor) const +{ + Q_UNUSED(inEditor) + return QIcon(iconPath(background) + "marker.svg"); +} +QString MarkerTool::name() const +{ + return tr("Marker"); +} + +CaptureTool::Type MarkerTool::type() const +{ + return CaptureTool::TYPE_MARKER; +} + +QString MarkerTool::description() const +{ + return tr("Set the Marker as the paint tool"); +} + +QRect MarkerTool::mousePreviewRect(const CaptureContext& context) const +{ + int width = PADDING_VALUE + context.toolSize; + QRect rect(0, 0, width + 2, width + 2); + rect.moveCenter(context.mousePos); + return rect; +} + +CaptureTool* MarkerTool::copy(QObject* parent) +{ + auto* tool = new MarkerTool(parent); + copyParams(this, tool); + return tool; +} + +void MarkerTool::process(QPainter& painter, const QPixmap& pixmap) +{ + Q_UNUSED(pixmap) + auto compositionMode = painter.compositionMode(); + qreal opacity = painter.opacity(); + auto pen = painter.pen(); + painter.setCompositionMode(QPainter::CompositionMode_Multiply); + painter.setOpacity(0.35); + painter.setPen(QPen(color(), size())); + painter.drawLine(points().first, points().second); + painter.setPen(pen); + painter.setOpacity(opacity); + painter.setCompositionMode(compositionMode); +} + +void MarkerTool::paintMousePreview(QPainter& painter, + const CaptureContext& context) +{ + auto compositionMode = painter.compositionMode(); + qreal opacity = painter.opacity(); + auto pen = painter.pen(); + painter.setCompositionMode(QPainter::CompositionMode_Multiply); + painter.setOpacity(0.35); + painter.setPen(QPen(context.color, PADDING_VALUE + context.toolSize)); + painter.drawLine(context.mousePos, context.mousePos); + painter.setPen(pen); + painter.setOpacity(opacity); + painter.setCompositionMode(compositionMode); +} + +void MarkerTool::drawStart(const CaptureContext& context) +{ + AbstractTwoPointTool::drawStart(context); + onSizeChanged(context.toolSize + PADDING_VALUE); +} + +void MarkerTool::pressed(CaptureContext& context) +{ + Q_UNUSED(context) +} diff --git a/src/tools/marker/markertool.h b/src/tools/marker/markertool.h new file mode 100644 index 0000000..5934efb --- /dev/null +++ b/src/tools/marker/markertool.h @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/tools/abstracttwopointtool.h" + +class MarkerTool : public AbstractTwoPointTool +{ + Q_OBJECT +public: + explicit MarkerTool(QObject* parent = nullptr); + + QIcon icon(const QColor& background, bool inEditor) const override; + QString name() const override; + QString description() const override; + QRect mousePreviewRect(const CaptureContext& context) const override; + + CaptureTool* copy(QObject* parent = nullptr) override; + void process(QPainter& painter, const QPixmap& pixmap) override; + void paintMousePreview(QPainter& painter, + const CaptureContext& context) override; + +protected: + CaptureTool::Type type() const override; + +public slots: + void drawStart(const CaptureContext& context) override; + void pressed(CaptureContext& context) override; +}; diff --git a/src/tools/move/movetool.cpp b/src/tools/move/movetool.cpp new file mode 100644 index 0000000..b08ee8d --- /dev/null +++ b/src/tools/move/movetool.cpp @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "movetool.h" +#include + +MoveTool::MoveTool(QObject* parent) + : AbstractActionTool(parent) +{} + +bool MoveTool::closeOnButtonPressed() const +{ + return false; +} + +QIcon MoveTool::icon(const QColor& background, bool inEditor) const +{ + Q_UNUSED(inEditor) + return QIcon(iconPath(background) + "cursor-move.svg"); +} +QString MoveTool::name() const +{ + return tr("Move"); +} + +CaptureTool::Type MoveTool::type() const +{ + return CaptureTool::TYPE_MOVESELECTION; +} + +QString MoveTool::description() const +{ + return tr("Move the selection area"); +} + +CaptureTool* MoveTool::copy(QObject* parent) +{ + return new MoveTool(parent); +} + +void MoveTool::pressed(CaptureContext& context) +{ + Q_UNUSED(context) +} + +bool MoveTool::isSelectable() const +{ + return true; +} diff --git a/src/tools/move/movetool.h b/src/tools/move/movetool.h new file mode 100644 index 0000000..27cf0ae --- /dev/null +++ b/src/tools/move/movetool.h @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/tools/abstractactiontool.h" + +class MoveTool : public AbstractActionTool +{ + Q_OBJECT +public: + explicit MoveTool(QObject* parent = nullptr); + + bool closeOnButtonPressed() const override; + + QIcon icon(const QColor& background, bool inEditor) const override; + QString name() const override; + CaptureTool::Type type() const override; + QString description() const override; + bool isSelectable() const override; + + CaptureTool* copy(QObject* parent = nullptr) override; + +public slots: + void pressed(CaptureContext& context) override; +}; diff --git a/src/tools/pencil/penciltool.cpp b/src/tools/pencil/penciltool.cpp new file mode 100644 index 0000000..8e29aaa --- /dev/null +++ b/src/tools/pencil/penciltool.cpp @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "penciltool.h" +#include + +PencilTool::PencilTool(QObject* parent) + : AbstractPathTool(parent) +{} + +QIcon PencilTool::icon(const QColor& background, bool inEditor) const +{ + Q_UNUSED(inEditor) + return QIcon(iconPath(background) + "pencil.svg"); +} +QString PencilTool::name() const +{ + return tr("Pencil"); +} + +CaptureTool::Type PencilTool::type() const +{ + return CaptureTool::TYPE_PENCIL; +} + +QString PencilTool::description() const +{ + return tr("Set the Pencil as the paint tool"); +} + +CaptureTool* PencilTool::copy(QObject* parent) +{ + auto* tool = new PencilTool(parent); + copyParams(this, tool); + return tool; +} + +void PencilTool::process(QPainter& painter, const QPixmap& pixmap) +{ + Q_UNUSED(pixmap) + painter.setPen(QPen(m_color, size())); + painter.drawPolyline(m_points.data(), m_points.size()); +} + +void PencilTool::paintMousePreview(QPainter& painter, + const CaptureContext& context) +{ + painter.setPen(QPen(context.color, context.toolSize + 2)); + painter.drawLine(context.mousePos, context.mousePos); +} + +void PencilTool::drawStart(const CaptureContext& context) +{ + m_color = context.color; + onSizeChanged(context.toolSize); + m_points.append(context.mousePos); + m_pathArea.setTopLeft(context.mousePos); + m_pathArea.setBottomRight(context.mousePos); +} + +void PencilTool::pressed(CaptureContext& context) +{ + Q_UNUSED(context) +} diff --git a/src/tools/pencil/penciltool.h b/src/tools/pencil/penciltool.h new file mode 100644 index 0000000..404714d --- /dev/null +++ b/src/tools/pencil/penciltool.h @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/tools/abstractpathtool.h" + +class PencilTool : public AbstractPathTool +{ + Q_OBJECT +public: + explicit PencilTool(QObject* parent = nullptr); + + QIcon icon(const QColor& background, bool inEditor) const override; + QString name() const override; + QString description() const override; + + CaptureTool* copy(QObject* parent = nullptr) override; + + void process(QPainter& painter, const QPixmap& pixmap) override; + void paintMousePreview(QPainter& painter, + const CaptureContext& context) override; + +protected: + CaptureTool::Type type() const override; + +public slots: + void drawStart(const CaptureContext& context) override; + void pressed(CaptureContext& context) override; +}; diff --git a/src/tools/pin/pintool.cpp b/src/tools/pin/pintool.cpp new file mode 100644 index 0000000..ff75d74 --- /dev/null +++ b/src/tools/pin/pintool.cpp @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "pintool.h" +#include "src/core/qguiappcurrentscreen.h" +#include "src/tools/pin/pinwidget.h" +#include + +PinTool::PinTool(QObject* parent) + : AbstractActionTool(parent) +{} + +bool PinTool::closeOnButtonPressed() const +{ + return true; +} + +QIcon PinTool::icon(const QColor& background, bool inEditor) const +{ + Q_UNUSED(inEditor) + return QIcon(iconPath(background) + "pin.svg"); +} +QString PinTool::name() const +{ + return tr("Pin Tool"); +} + +CaptureTool::Type PinTool::type() const +{ + return CaptureTool::TYPE_PIN; +} + +QString PinTool::description() const +{ + return tr("Pin image on the desktop"); +} + +CaptureTool* PinTool::copy(QObject* parent) +{ + return new PinTool(parent); +} + +void PinTool::pressed(CaptureContext& context) +{ + emit requestAction(REQ_CLEAR_SELECTION); + emit requestAction(REQ_CAPTURE_DONE_OK); + context.request.addTask(CaptureRequest::PIN); + emit requestAction(REQ_CLOSE_GUI); +} diff --git a/src/tools/pin/pintool.h b/src/tools/pin/pintool.h new file mode 100644 index 0000000..c8599f3 --- /dev/null +++ b/src/tools/pin/pintool.h @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/tools/abstractactiontool.h" + +class PinTool : public AbstractActionTool +{ + Q_OBJECT +public: + explicit PinTool(QObject* parent = nullptr); + + bool closeOnButtonPressed() const override; + + QIcon icon(const QColor& background, bool inEditor) const override; + QString name() const override; + QString description() const override; + + CaptureTool* copy(QObject* parent = nullptr) override; + +protected: + CaptureTool::Type type() const override; + +public slots: + void pressed(CaptureContext& context) override; + +private: + QRect m_geometry; + QPixmap m_pixmap; +}; diff --git a/src/tools/pin/pinwidget.cpp b/src/tools/pin/pinwidget.cpp new file mode 100644 index 0000000..a5f1b1d --- /dev/null +++ b/src/tools/pin/pinwidget.cpp @@ -0,0 +1,339 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors +#include +#include +#include +#include + +#include "pinwidget.h" +#include "qguiappcurrentscreen.h" +#include "screenshotsaver.h" +#include "src/utils/confighandler.h" +#include "src/utils/globalvalues.h" + +#include +#include +#include +#include +#include +#include + +namespace { +constexpr int MARGIN = 7; +constexpr int BLUR_RADIUS = 2 * MARGIN; +constexpr qreal STEP = 0.03; +constexpr qreal MIN_SIZE = 100.0; +} + +PinWidget::PinWidget(const QPixmap& pixmap, + const QRect& geometry, + QWidget* parent) + : QWidget(parent) + , m_pixmap(pixmap) + , m_layout(new QVBoxLayout(this)) + , m_label(new QLabel()) + , m_shadowEffect(new QGraphicsDropShadowEffect(this)) +{ + setWindowIcon(QIcon(GlobalValues::iconPath())); + setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint | + Qt::Dialog); + setFocusPolicy(Qt::StrongFocus); + setAttribute(Qt::WA_TranslucentBackground); + setAttribute(Qt::WA_DeleteOnClose); + setWindowTitle("flameshot-pin"); + ConfigHandler conf; + m_baseColor = conf.uiColor(); + m_hoverColor = conf.contrastUiColor(); + + m_layout->setContentsMargins(MARGIN, MARGIN, MARGIN, MARGIN); + + m_shadowEffect->setColor(m_baseColor); + m_shadowEffect->setBlurRadius(BLUR_RADIUS); + m_shadowEffect->setOffset(0, 0); + setGraphicsEffect(m_shadowEffect); + setWindowOpacity(m_opacity); + + m_label->setPixmap(m_pixmap); + m_layout->addWidget(m_label); + + new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_Q), this, SLOT(close())); + new QShortcut(Qt::Key_Escape, this, SLOT(close())); + + qreal devicePixelRatio = 1; +#if defined(Q_OS_MACOS) || defined(Q_OS_LINUX) + QScreen* currentScreen = QGuiAppCurrentScreen().currentScreen(); + if (currentScreen != nullptr) { + devicePixelRatio = currentScreen->devicePixelRatio(); + } +#endif + const int margin = + static_cast(static_cast(MARGIN) * devicePixelRatio); + QRect adjusted_pos = geometry + QMargins(margin, margin, margin, margin); + setGeometry(adjusted_pos); +#if defined(Q_OS_MACOS) || defined(Q_OS_LINUX) + if (currentScreen != nullptr) { + QPoint topLeft = currentScreen->geometry().topLeft(); + adjusted_pos.setX((adjusted_pos.x() - topLeft.x()) / devicePixelRatio + + topLeft.x()); + + adjusted_pos.setY((adjusted_pos.y() - topLeft.y()) / devicePixelRatio + + topLeft.y()); + adjusted_pos.setWidth(adjusted_pos.size().width() / devicePixelRatio); + adjusted_pos.setHeight(adjusted_pos.size().height() / devicePixelRatio); + resize(0, 0); + move(adjusted_pos.x(), adjusted_pos.y()); + } +#endif + grabGesture(Qt::PinchGesture); + + this->setContextMenuPolicy(Qt::CustomContextMenu); + + connect(this, + &QWidget::customContextMenuRequested, + this, + &PinWidget::showContextMenu); +} + +void PinWidget::closePin() +{ + update(); + close(); +} +bool PinWidget::scrollEvent(QWheelEvent* event) +{ + const auto phase = event->phase(); + if (phase == Qt::ScrollPhase::ScrollUpdate +#if defined(Q_OS_LINUX) || defined(Q_OS_WINDOWS) || defined(Q_OS_MACOS) + || phase == Qt::ScrollPhase::NoScrollPhase +#endif + ) { + const auto angle = event->angleDelta(); + if (angle.y() == 0) { + return true; + } + m_currentStepScaleFactor = angle.y() > 0 + ? m_currentStepScaleFactor + STEP + : m_currentStepScaleFactor - STEP; + m_expanding = m_currentStepScaleFactor >= 1.0; + } +#if defined(Q_OS_MACOS) + // ScrollEnd is currently supported only on Mac OSX + if (phase == Qt::ScrollPhase::ScrollEnd) { +#else + else { +#endif + m_scaleFactor *= m_currentStepScaleFactor; + m_currentStepScaleFactor = 1.0; + m_expanding = false; + } + + m_sizeChanged = true; + update(); + return true; +} + +void PinWidget::enterEvent(QEnterEvent*) +{ + m_shadowEffect->setColor(m_hoverColor); +} + +void PinWidget::leaveEvent(QEvent*) +{ + m_shadowEffect->setColor(m_baseColor); +} + +void PinWidget::mouseDoubleClickEvent(QMouseEvent*) +{ + closePin(); +} + +void PinWidget::mousePressEvent(QMouseEvent* e) +{ + if (QWindow* window = windowHandle(); window != nullptr) { + window->startSystemMove(); + return; + } +} + +void PinWidget::mouseMoveEvent(QMouseEvent* e) {} + +void PinWidget::keyPressEvent(QKeyEvent* event) +{ + if (event->key() == Qt::Key_0) { + m_opacity = 1.0; + } else if (event->key() == Qt::Key_9) { + m_opacity = 0.9; + } else if (event->key() == Qt::Key_8) { + m_opacity = 0.8; + } else if (event->key() == Qt::Key_7) { + m_opacity = 0.7; + } else if (event->key() == Qt::Key_6) { + m_opacity = 0.6; + } else if (event->key() == Qt::Key_5) { + m_opacity = 0.5; + } else if (event->key() == Qt::Key_4) { + m_opacity = 0.4; + } else if (event->key() == Qt::Key_3) { + m_opacity = 0.3; + } else if (event->key() == Qt::Key_2) { + m_opacity = 0.2; + } else if (event->key() == Qt::Key_1) { + m_opacity = 0.1; + } + + setWindowOpacity(m_opacity); +} +bool PinWidget::gestureEvent(QGestureEvent* event) +{ + if (QGesture* pinch = event->gesture(Qt::PinchGesture)) { + pinchTriggered(static_cast(pinch)); + } + return true; +} + +void PinWidget::rotateLeft() +{ + m_sizeChanged = true; + + auto rotateTransform = QTransform().rotate(270); + m_pixmap = m_pixmap.transformed(rotateTransform); +} + +void PinWidget::rotateRight() +{ + m_sizeChanged = true; + + auto rotateTransform = QTransform().rotate(90); + m_pixmap = m_pixmap.transformed(rotateTransform); +} + +void PinWidget::increaseOpacity() +{ + m_opacity += 0.1; + if (m_opacity > 1.0) { + m_opacity = 1.0; + } + setWindowOpacity(m_opacity); +} + +void PinWidget::decreaseOpacity() +{ + m_opacity -= 0.1; + if (m_opacity < 0.0) { + m_opacity = 0.0; + } + + setWindowOpacity(m_opacity); +} + +bool PinWidget::event(QEvent* event) +{ + if (event->type() == QEvent::Gesture) { + return gestureEvent(static_cast(event)); + } else if (event->type() == QEvent::Wheel) { + return scrollEvent(static_cast(event)); + } + return QWidget::event(event); +} + +void PinWidget::paintEvent(QPaintEvent* event) +{ + if (m_sizeChanged) { + const auto aspectRatio = + m_expanding ? Qt::KeepAspectRatioByExpanding : Qt::KeepAspectRatio; + const auto transformType = ConfigHandler().antialiasingPinZoom() + ? Qt::SmoothTransformation + : Qt::FastTransformation; + const qreal iw = m_pixmap.width(); + const qreal ih = m_pixmap.height(); + const qreal nw = qBound(MIN_SIZE, + iw * m_currentStepScaleFactor * m_scaleFactor, + static_cast(maximumWidth())); + const qreal nh = qBound(MIN_SIZE, + ih * m_currentStepScaleFactor * m_scaleFactor, + static_cast(maximumHeight())); + + const QPixmap pix = m_pixmap.scaled(nw, nh, aspectRatio, transformType); + + m_label->setPixmap(pix); + adjustSize(); + m_sizeChanged = false; + } +} + +void PinWidget::pinchTriggered(QPinchGesture* gesture) +{ + const QPinchGesture::ChangeFlags changeFlags = gesture->changeFlags(); + if (changeFlags & QPinchGesture::ScaleFactorChanged) { + m_currentStepScaleFactor = gesture->totalScaleFactor(); + m_expanding = m_currentStepScaleFactor > gesture->lastScaleFactor(); + } + if (gesture->state() == Qt::GestureFinished) { + m_scaleFactor *= m_currentStepScaleFactor; + m_currentStepScaleFactor = 1; + m_expanding = false; + } + m_sizeChanged = true; + update(); +} + +void PinWidget::showContextMenu(const QPoint& pos) +{ + QMenu contextMenu(tr("Context menu"), this); + + QAction copyToClipboardAction(tr("Copy to clipboard"), this); + connect(©ToClipboardAction, + &QAction::triggered, + this, + &PinWidget::copyToClipboard); + contextMenu.addAction(©ToClipboardAction); + + QAction saveToFileAction(tr("Save to file"), this); + connect( + &saveToFileAction, &QAction::triggered, this, &PinWidget::saveToFile); + contextMenu.addAction(&saveToFileAction); + + contextMenu.addSeparator(); + + QAction rotateRightAction(tr("Rotate Right"), this); + connect( + &rotateRightAction, &QAction::triggered, this, &PinWidget::rotateRight); + contextMenu.addAction(&rotateRightAction); + + QAction rotateLeftAction(tr("Rotate Left"), this); + connect( + &rotateLeftAction, &QAction::triggered, this, &PinWidget::rotateLeft); + contextMenu.addAction(&rotateLeftAction); + + QAction increaseOpacityAction(tr("Increase Opacity"), this); + connect(&increaseOpacityAction, + &QAction::triggered, + this, + &PinWidget::increaseOpacity); + contextMenu.addAction(&increaseOpacityAction); + + QAction decreaseOpacityAction(tr("Decrease Opacity"), this); + connect(&decreaseOpacityAction, + &QAction::triggered, + this, + &PinWidget::decreaseOpacity); + contextMenu.addAction(&decreaseOpacityAction); + + QAction closePinAction(tr("Close"), this); + connect(&closePinAction, &QAction::triggered, this, &PinWidget::closePin); + contextMenu.addSeparator(); + contextMenu.addAction(&closePinAction); + + contextMenu.exec(mapToGlobal(pos)); +} + +void PinWidget::copyToClipboard() +{ + saveToClipboard(m_pixmap); +} +void PinWidget::saveToFile() +{ + hide(); + saveToFilesystemGUI(m_pixmap); + show(); +} diff --git a/src/tools/pin/pinwidget.h b/src/tools/pin/pinwidget.h new file mode 100644 index 0000000..54ea92b --- /dev/null +++ b/src/tools/pin/pinwidget.h @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include + +class QLabel; +class QVBoxLayout; +class QGestureEvent; +class QPinchGesture; +class QGraphicsDropShadowEffect; + +class PinWidget : public QWidget +{ + Q_OBJECT +public: + explicit PinWidget(const QPixmap& pixmap, + const QRect& geometry, + QWidget* parent = nullptr); + +protected: + void mouseDoubleClickEvent(QMouseEvent*) override; + void mousePressEvent(QMouseEvent*) override; + void mouseMoveEvent(QMouseEvent*) override; + void keyPressEvent(QKeyEvent*) override; + void enterEvent(QEnterEvent*) override; + void leaveEvent(QEvent*) override; + + bool event(QEvent* event) override; + void paintEvent(QPaintEvent* event) override; + +private: + bool gestureEvent(QGestureEvent* event); + bool scrollEvent(QWheelEvent* e); + void pinchTriggered(QPinchGesture*); + void closePin(); + + void rotateLeft(); + void rotateRight(); + + void increaseOpacity(); + void decreaseOpacity(); + + QPixmap m_pixmap; + QVBoxLayout* m_layout; + QLabel* m_label; + QGraphicsDropShadowEffect* m_shadowEffect; + QColor m_baseColor, m_hoverColor; + + bool m_expanding{ false }; + qreal m_scaleFactor{ 1 }; + qreal m_opacity{ 1 }; + unsigned int m_rotateFactor{ 0 }; + qreal m_currentStepScaleFactor{ 1 }; + bool m_sizeChanged{ false }; + +private slots: + void showContextMenu(const QPoint& pos); + void copyToClipboard(); + void saveToFile(); +}; diff --git a/src/tools/pixelate/pixelatetool.cpp b/src/tools/pixelate/pixelatetool.cpp new file mode 100644 index 0000000..85ea56a --- /dev/null +++ b/src/tools/pixelate/pixelatetool.cpp @@ -0,0 +1,240 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "pixelatetool.h" +#include +#include +#include +#include +#include +#include +#include +#include + +#include "confighandler.h" +PixelateTool::PixelateTool(QObject* parent) + : AbstractTwoPointTool(parent) +{} + +QIcon PixelateTool::icon(const QColor& background, bool inEditor) const +{ + Q_UNUSED(inEditor) + return QIcon(iconPath(background) + "pixelate.svg"); +} + +QString PixelateTool::name() const +{ + return tr("Pixelate"); +} + +CaptureTool::Type PixelateTool::type() const +{ + return CaptureTool::TYPE_PIXELATE; +} + +QString PixelateTool::description() const +{ + return tr("Set Pixelate as the paint tool."); +} + +QRect PixelateTool::boundingRect() const +{ + return QRect(points().first, points().second).normalized(); +} + +CaptureTool* PixelateTool::copy(QObject* parent) +{ + auto* tool = new PixelateTool(parent); + copyParams(this, tool); + return tool; +} + +/** + * Since pixelation does not protect the contents of the pixelated area + * (see e.g. https://github.com/bishopfox/unredacter), + * _pseudo-pixelation_ is used: + * + * Only colors from the fringe of the selected area are used to generate + * a pixelation-like effect. The interior of the selected area is not used + * as an input at all and hence can not be recovered. + * + */ +void PixelateTool::process(QPainter& painter, const QPixmap& pixmap) +{ + bool useInsecurePixelate = ConfigHandler().insecurePixelate(); + + QRect selection = boundingRect().intersected(pixmap.rect()); + auto pixelRatio = pixmap.devicePixelRatio(); + QRect selectionScaled = QRect(selection.topLeft() * pixelRatio, + selection.bottomRight() * pixelRatio); + + const auto width = + static_cast(selection.width() * (0.5 / qMax(1, size() + 1))); + const auto height = + static_cast(selection.height() * (0.5 / qMax(1, size() + 1))); + const auto effectSize = QSize(qMax(width, 1), qMax(height, 1)); + + if (useInsecurePixelate) { + if (size() <= 1) { + auto* blur = new QGraphicsBlurEffect(this); + blur->setBlurRadius(10); + auto* item = new QGraphicsPixmapItem(pixmap.copy(selectionScaled)); + item->setGraphicsEffect(blur); + + QGraphicsScene scene; + scene.addItem(item); + + scene.render(&painter, selection, QRectF()); + blur->setBlurRadius(12); + // multiple repeat for make blur effect stronger + scene.render(&painter, selection, QRectF()); + + } else { + auto pixmapPixelated = pixmap.copy(selectionScaled); + pixmapPixelated = pixmapPixelated.scaled( + effectSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); + pixmapPixelated = + pixmapPixelated.scaled(selection.width(), selection.height()); + painter.drawImage(selection, pixmapPixelated.toImage()); + } + } else { + // the PRNG is only used for visual effects and NOT part of the security + // boundary + std::mt19937 prng(42); + + // noise for the sampling process to avoid only sampling from a small + // subset of the fringe + std::normal_distribution sampling_noise(0, 5 * size() + 1); + + // additional noise that will be added on top of the effect to avoid + // generating a monochromatic box when the fringe is monochromatic + std::normal_distribution noise(0, 0.1f); + + QPoint const offset_top(0, selectionScaled.topLeft().y() == 0 ? 0 : -1); + QPoint const offset_bottom(0, + selectionScaled.bottomLeft().y() == + pixmap.rect().bottomLeft().y() + ? 0 + : 1); + QPoint const offset_left(selectionScaled.topLeft().x() == 0 ? 0 : -1, + 0); + QPoint const offset_right( + selectionScaled.topRight().x() == pixmap.rect().topRight().x() ? 0 + : 1, + 0); + + // only values from the fringe will be used to compute the + // pseudo-pixelation + std::array fringe = { + // top fringe + pixmap + .copy(QRect(selectionScaled.topLeft() + offset_top, + selectionScaled.topRight() + offset_top)) + .toImage(), + // bottom fringe + pixmap + .copy(QRect(selectionScaled.bottomLeft() + offset_bottom, + selectionScaled.bottomRight() + offset_bottom)) + .toImage(), + // left fringe + pixmap + .copy(QRect(selectionScaled.topLeft() + offset_left, + selectionScaled.bottomLeft() + offset_left)) + .toImage(), + // right fringe + pixmap + .copy(QRect(selectionScaled.topRight() + offset_right, + selectionScaled.bottomRight() + offset_right)) + .toImage() + }; + + // Image where the pseudo-pixelation is calculated. + // This will later be scaled to cover the selected area. + QImage pixelated = QImage(effectSize, QImage::Format_RGB32); + + // For every pixel of the effect, we consider four projections + // to the fringe and sample a pixel from there. + // Then a horizontal and vertical interpolation are calculated. + std::array, 4> samples; + + for (int x = 0; x < width; ++x) { + for (int y = 0; y < height; ++y) { + float n = noise(prng); + + // relative horizontal resp. vertical position + float const horizontal = x / (float)width; + float const vertical = y / (float)height; + + for (int i = 0; i < 4; ++i) { + QColor const c = fringe[i].pixel( + std::clamp( + static_cast(horizontal * fringe[i].width() + + sampling_noise(prng)), + 0, + fringe[i].width() - 1), + std::clamp( + static_cast(vertical * fringe[i].height() + + sampling_noise(prng)), + 0, + fringe[i].height() - 1)); + samples[i][0] = c.redF(); + samples[i][1] = c.greenF(); + samples[i][2] = c.blueF(); + } + + // weights of the horizontal resp. vertical interpolation + float const weight_h = (qMin(x, width - x) / width) - + (qMin(y, height - y) / height) + 0.5; + + float const weight_v = 1 - weight_h; + + // compute the weighted sum of the vertical and horizontal + // interpolations + std::array rgb = { 0, 0, 0 }; + for (int i = 0; i < 3; ++i) { + float c = + // horizontal interpolation + weight_h * ((1 - horizontal) * samples[2][i] + + horizontal * samples[3][i]) + + // vertical interpolation + + weight_v * ((1 - vertical) * samples[0][i] + + vertical * samples[1][i]) + + // additional noise + + n; + + rgb[i] = static_cast(0xff * c); + rgb[i] = std::clamp(rgb[i], 0, 0xff); + } + QRgb const value = qRgb(rgb[0], rgb[1], rgb[2]); + pixelated.setPixel(x, y, value); + } + } + + pixelated = pixelated.scaled(selection.width(), + selection.height(), + Qt::IgnoreAspectRatio, + Qt::FastTransformation); + + painter.drawImage(selection, pixelated); + } +} + +void PixelateTool::drawSearchArea(QPainter& painter, const QPixmap& pixmap) +{ + Q_UNUSED(pixmap) + painter.fillRect(boundingRect(), QBrush(Qt::black)); +} + +void PixelateTool::paintMousePreview(QPainter& painter, + const CaptureContext& context) +{ + Q_UNUSED(context) + Q_UNUSED(painter) +} + +void PixelateTool::pressed(CaptureContext& context) +{ + Q_UNUSED(context) +} diff --git a/src/tools/pixelate/pixelatetool.h b/src/tools/pixelate/pixelatetool.h new file mode 100644 index 0000000..f4fd3b6 --- /dev/null +++ b/src/tools/pixelate/pixelatetool.h @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/tools/abstracttwopointtool.h" + +class PixelateTool : public AbstractTwoPointTool +{ + Q_OBJECT +public: + explicit PixelateTool(QObject* parent = nullptr); + + QIcon icon(const QColor& background, bool inEditor) const override; + QString name() const override; + QString description() const override; + QRect boundingRect() const override; + + CaptureTool* copy(QObject* parent = nullptr) override; + void process(QPainter& painter, const QPixmap& pixmap) override; + void drawSearchArea(QPainter& painter, const QPixmap& pixmap) override; + void paintMousePreview(QPainter& painter, + const CaptureContext& context) override; + +protected: + CaptureTool::Type type() const override; + +public slots: + void pressed(CaptureContext& context) override; +}; diff --git a/src/tools/rectangle/rectangletool.cpp b/src/tools/rectangle/rectangletool.cpp new file mode 100644 index 0000000..ce56aaa --- /dev/null +++ b/src/tools/rectangle/rectangletool.cpp @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "rectangletool.h" +#include +#include +#include + +RectangleTool::RectangleTool(QObject* parent) + : AbstractTwoPointTool(parent) +{ + m_supportsDiagonalAdj = true; +} + +QIcon RectangleTool::icon(const QColor& background, bool inEditor) const +{ + Q_UNUSED(inEditor) + return QIcon(iconPath(background) + "square.svg"); +} +QString RectangleTool::name() const +{ + return tr("Rectangle"); +} + +CaptureTool::Type RectangleTool::type() const +{ + return CaptureTool::TYPE_RECTANGLE; +} + +QString RectangleTool::description() const +{ + return tr("Set the Rectangle as the paint tool"); +} + +CaptureTool* RectangleTool::copy(QObject* parent) +{ + auto* tool = new RectangleTool(parent); + copyParams(this, tool); + return tool; +} + +void RectangleTool::process(QPainter& painter, const QPixmap& pixmap) +{ + Q_UNUSED(pixmap) + QPen orig_pen = painter.pen(); + QBrush orig_brush = painter.brush(); + painter.setPen( + QPen(color(), size(), Qt::SolidLine, Qt::SquareCap, Qt::RoundJoin)); + painter.setBrush(QBrush(color())); + if (size() == 0) { + painter.drawRect(QRect(points().first, points().second)); + } else { + QPainterPath path; + int offset = + size() <= 1 ? 1 : static_cast(round(size() / 2 + 0.5)); + path.addRoundedRect( + QRectF( + std::min(points().first.x(), points().second.x()) - offset, + std::min(points().first.y(), points().second.y()) - offset, + std::abs(points().first.x() - points().second.x()) + offset * 2, + std::abs(points().first.y() - points().second.y()) + offset * 2), + size(), + size()); + painter.fillPath(path, color()); + } + painter.setPen(orig_pen); + painter.setBrush(orig_brush); +} + +void RectangleTool::drawStart(const CaptureContext& context) +{ + AbstractTwoPointTool::drawStart(context); + onSizeChanged(context.toolSize); +} + +void RectangleTool::pressed(CaptureContext& context) +{ + Q_UNUSED(context) +} diff --git a/src/tools/rectangle/rectangletool.h b/src/tools/rectangle/rectangletool.h new file mode 100644 index 0000000..ba5656b --- /dev/null +++ b/src/tools/rectangle/rectangletool.h @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/tools/abstracttwopointtool.h" + +class RectangleTool : public AbstractTwoPointTool +{ + Q_OBJECT +public: + explicit RectangleTool(QObject* parent = nullptr); + + QIcon icon(const QColor& background, bool inEditor) const override; + QString name() const override; + QString description() const override; + + CaptureTool* copy(QObject* parent = nullptr) override; + void process(QPainter& painter, const QPixmap& pixmap) override; + +protected: + CaptureTool::Type type() const override; + +public slots: + void drawStart(const CaptureContext& context) override; + void pressed(CaptureContext& context) override; +}; diff --git a/src/tools/redo/redotool.cpp b/src/tools/redo/redotool.cpp new file mode 100644 index 0000000..7ba0a83 --- /dev/null +++ b/src/tools/redo/redotool.cpp @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "redotool.h" +#include + +RedoTool::RedoTool(QObject* parent) + : AbstractActionTool(parent) +{} + +bool RedoTool::closeOnButtonPressed() const +{ + return false; +} + +QIcon RedoTool::icon(const QColor& background, bool inEditor) const +{ + Q_UNUSED(inEditor) + return QIcon(iconPath(background) + "redo-variant.svg"); +} +QString RedoTool::name() const +{ + return tr("Redo"); +} + +CaptureTool::Type RedoTool::type() const +{ + return CaptureTool::TYPE_REDO; +} + +QString RedoTool::description() const +{ + return tr("Redo the next modification"); +} + +CaptureTool* RedoTool::copy(QObject* parent) +{ + return new RedoTool(parent); +} + +void RedoTool::pressed(CaptureContext& context) +{ + Q_UNUSED(context) + emit requestAction(REQ_REDO_MODIFICATION); +} diff --git a/src/tools/redo/redotool.h b/src/tools/redo/redotool.h new file mode 100644 index 0000000..b087981 --- /dev/null +++ b/src/tools/redo/redotool.h @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/tools/abstractactiontool.h" + +class RedoTool : public AbstractActionTool +{ + Q_OBJECT +public: + explicit RedoTool(QObject* parent = nullptr); + + bool closeOnButtonPressed() const override; + + QIcon icon(const QColor& background, bool inEditor) const override; + QString name() const override; + QString description() const override; + + CaptureTool* copy(QObject* parent = nullptr) override; + +protected: + CaptureTool::Type type() const override; + +public slots: + void pressed(CaptureContext& context) override; +}; diff --git a/src/tools/save/savetool.cpp b/src/tools/save/savetool.cpp new file mode 100644 index 0000000..d377703 --- /dev/null +++ b/src/tools/save/savetool.cpp @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "savetool.h" +#include "src/utils/screenshotsaver.h" +#include + +SaveTool::SaveTool(QObject* parent) + : AbstractActionTool(parent) +{} + +bool SaveTool::closeOnButtonPressed() const +{ + return true; +} + +QIcon SaveTool::icon(const QColor& background, bool inEditor) const +{ + Q_UNUSED(inEditor) + return QIcon(iconPath(background) + "content-save.svg"); +} +QString SaveTool::name() const +{ + return tr("Save"); +} + +CaptureTool::Type SaveTool::type() const +{ + return CaptureTool::TYPE_SAVE; +} + +QString SaveTool::description() const +{ + return tr("Save screenshot to a file"); +} + +CaptureTool* SaveTool::copy(QObject* parent) +{ + return new SaveTool(parent); +} + +void SaveTool::pressed(CaptureContext& context) +{ + emit requestAction(REQ_CLEAR_SELECTION); + context.request.addSaveTask(); + emit requestAction(REQ_CAPTURE_DONE_OK); + emit requestAction(REQ_CLOSE_GUI); +} diff --git a/src/tools/save/savetool.h b/src/tools/save/savetool.h new file mode 100644 index 0000000..609ad07 --- /dev/null +++ b/src/tools/save/savetool.h @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/tools/abstractactiontool.h" + +class SaveTool : public AbstractActionTool +{ + Q_OBJECT +public: + explicit SaveTool(QObject* parent = nullptr); + + bool closeOnButtonPressed() const override; + + QIcon icon(const QColor& background, bool inEditor) const override; + QString name() const override; + QString description() const override; + + CaptureTool* copy(QObject* parent = nullptr) override; + +protected: + CaptureTool::Type type() const override; + +public slots: + void pressed(CaptureContext& context) override; +}; diff --git a/src/tools/selection/selectiontool.cpp b/src/tools/selection/selectiontool.cpp new file mode 100644 index 0000000..4b6a8db --- /dev/null +++ b/src/tools/selection/selectiontool.cpp @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "selectiontool.h" +#include + +SelectionTool::SelectionTool(QObject* parent) + : AbstractTwoPointTool(parent) +{ + m_supportsDiagonalAdj = true; +} + +bool SelectionTool::closeOnButtonPressed() const +{ + return false; +} + +QIcon SelectionTool::icon(const QColor& background, bool inEditor) const +{ + Q_UNUSED(inEditor) + return QIcon(iconPath(background) + "square-outline.svg"); +} +QString SelectionTool::name() const +{ + return tr("Rectangular Selection"); +} + +CaptureTool::Type SelectionTool::type() const +{ + return CaptureTool::TYPE_SELECTION; +} + +QString SelectionTool::description() const +{ + return tr("Set Selection as the paint tool"); +} + +CaptureTool* SelectionTool::copy(QObject* parent) +{ + auto* tool = new SelectionTool(parent); + copyParams(this, tool); + return tool; +} + +void SelectionTool::process(QPainter& painter, const QPixmap& pixmap) +{ + Q_UNUSED(pixmap) + painter.setPen( + QPen(color(), size(), Qt::SolidLine, Qt::SquareCap, Qt::MiterJoin)); + painter.drawRect(QRect(points().first, points().second)); +} + +void SelectionTool::pressed(CaptureContext& context) +{ + Q_UNUSED(context) +} diff --git a/src/tools/selection/selectiontool.h b/src/tools/selection/selectiontool.h new file mode 100644 index 0000000..aa52176 --- /dev/null +++ b/src/tools/selection/selectiontool.h @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/tools/abstracttwopointtool.h" + +class SelectionTool : public AbstractTwoPointTool +{ + Q_OBJECT +public: + explicit SelectionTool(QObject* parent = nullptr); + + bool closeOnButtonPressed() const override; + + QIcon icon(const QColor& background, bool inEditor) const override; + QString name() const override; + QString description() const override; + + CaptureTool* copy(QObject* parent = nullptr) override; + void process(QPainter& painter, const QPixmap& pixmap) override; + +protected: + CaptureTool::Type type() const override; + +public slots: + void pressed(CaptureContext& context) override; +}; diff --git a/src/tools/sizedecrease/sizedecreasetool.cpp b/src/tools/sizedecrease/sizedecreasetool.cpp new file mode 100644 index 0000000..fa4439b --- /dev/null +++ b/src/tools/sizedecrease/sizedecreasetool.cpp @@ -0,0 +1,59 @@ +// Copyright(c) 2017-2019 Alejandro Sirgo Rica & Contributors +// +// This file is part of Flameshot. +// +// Flameshot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Flameshot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Flameshot. If not, see . + +#include "sizedecreasetool.h" +#include + +SizeDecreaseTool::SizeDecreaseTool(QObject* parent) + : AbstractActionTool(parent) +{} + +bool SizeDecreaseTool::closeOnButtonPressed() const +{ + return false; +} + +QIcon SizeDecreaseTool::icon(const QColor& background, bool inEditor) const +{ + Q_UNUSED(inEditor) + return QIcon(iconPath(background) + "minus.svg"); +} +QString SizeDecreaseTool::name() const +{ + return tr("Decrease Tool Size"); +} + +CaptureTool::Type SizeDecreaseTool::type() const +{ + return CaptureTool::TYPE_SIZEDECREASE; +} + +QString SizeDecreaseTool::description() const +{ + return tr("Decrease the size of the other tools"); +} + +CaptureTool* SizeDecreaseTool::copy(QObject* parent) +{ + return new SizeDecreaseTool(parent); +} + +void SizeDecreaseTool::pressed(CaptureContext& context) +{ + Q_UNUSED(context) + emit requestAction(REQ_DECREASE_TOOL_SIZE); +} diff --git a/src/tools/sizedecrease/sizedecreasetool.h b/src/tools/sizedecrease/sizedecreasetool.h new file mode 100644 index 0000000..b28c5ba --- /dev/null +++ b/src/tools/sizedecrease/sizedecreasetool.h @@ -0,0 +1,41 @@ +// Copyright(c) 2017-2019 Alejandro Sirgo Rica & Contributors +// +// This file is part of Flameshot. +// +// Flameshot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Flameshot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Flameshot. If not, see . + +#pragma once + +#include "src/tools/abstractactiontool.h" + +class SizeDecreaseTool : public AbstractActionTool +{ + Q_OBJECT +public: + explicit SizeDecreaseTool(QObject* parent = nullptr); + + bool closeOnButtonPressed() const override; + + QIcon icon(const QColor& background, bool inEditor) const override; + QString name() const override; + QString description() const override; + + CaptureTool* copy(QObject* parent = nullptr) override; + +protected: + CaptureTool::Type type() const override; + +public slots: + void pressed(CaptureContext& context) override; +}; diff --git a/src/tools/sizeincrease/sizeincreasetool.cpp b/src/tools/sizeincrease/sizeincreasetool.cpp new file mode 100644 index 0000000..a5c2e14 --- /dev/null +++ b/src/tools/sizeincrease/sizeincreasetool.cpp @@ -0,0 +1,59 @@ +// Copyright(c) 2017-2019 Alejandro Sirgo Rica & Contributors +// +// This file is part of Flameshot. +// +// Flameshot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Flameshot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Flameshot. If not, see . + +#include "sizeincreasetool.h" +#include + +SizeIncreaseTool::SizeIncreaseTool(QObject* parent) + : AbstractActionTool(parent) +{} + +bool SizeIncreaseTool::closeOnButtonPressed() const +{ + return false; +} + +QIcon SizeIncreaseTool::icon(const QColor& background, bool inEditor) const +{ + Q_UNUSED(inEditor) + return QIcon(iconPath(background) + "plus.svg"); +} +QString SizeIncreaseTool::name() const +{ + return tr("Increase Tool Size"); +} + +CaptureTool::Type SizeIncreaseTool::type() const +{ + return CaptureTool::TYPE_SIZEINCREASE; +} + +QString SizeIncreaseTool::description() const +{ + return tr("Increase the size of the other tools"); +} + +CaptureTool* SizeIncreaseTool::copy(QObject* parent) +{ + return new SizeIncreaseTool(parent); +} + +void SizeIncreaseTool::pressed(CaptureContext& context) +{ + Q_UNUSED(context) + emit requestAction(REQ_INCREASE_TOOL_SIZE); +} diff --git a/src/tools/sizeincrease/sizeincreasetool.h b/src/tools/sizeincrease/sizeincreasetool.h new file mode 100644 index 0000000..3238000 --- /dev/null +++ b/src/tools/sizeincrease/sizeincreasetool.h @@ -0,0 +1,41 @@ +// Copyright(c) 2017-2019 Alejandro Sirgo Rica & Contributors +// +// This file is part of Flameshot. +// +// Flameshot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Flameshot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Flameshot. If not, see . + +#pragma once + +#include "src/tools/abstractactiontool.h" + +class SizeIncreaseTool : public AbstractActionTool +{ + Q_OBJECT +public: + explicit SizeIncreaseTool(QObject* parent = nullptr); + + bool closeOnButtonPressed() const override; + + QIcon icon(const QColor& background, bool inEditor) const override; + QString name() const override; + QString description() const override; + + CaptureTool* copy(QObject* parent = nullptr) override; + +protected: + CaptureTool::Type type() const override; + +public slots: + void pressed(CaptureContext& context) override; +}; diff --git a/src/tools/text/textconfig.cpp b/src/tools/text/textconfig.cpp new file mode 100644 index 0000000..328e7f3 --- /dev/null +++ b/src/tools/text/textconfig.cpp @@ -0,0 +1,172 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "textconfig.h" +#include "src/utils/colorutils.h" +#include "src/utils/confighandler.h" +#include "src/utils/pathinfo.h" +#include +#include +#include +#include + +TextConfig::TextConfig(QWidget* parent) + : QWidget(parent) + , m_layout(new QVBoxLayout(this)) + , m_fontsCB(new QComboBox()) + , m_strikeOutButton(nullptr) + , m_underlineButton(nullptr) + , m_weightButton(nullptr) + , m_italicButton(nullptr) + , m_leftAlignButton(nullptr) + , m_centerAlignButton(nullptr) + , m_rightAlignButton(nullptr) +{ + + connect(m_fontsCB, + &QComboBox::currentTextChanged, + this, + &TextConfig::fontFamilyChanged); + m_fontsCB->addItems(QFontDatabase::families()); + setFontFamily(ConfigHandler().fontFamily()); + + QString iconPrefix = ColorUtils::colorIsDark(palette().windowText().color()) + ? PathInfo::blackIconPath() + : PathInfo::whiteIconPath(); + + m_strikeOutButton = new QPushButton( + QIcon(iconPrefix + "format_strikethrough.svg"), QLatin1String("")); + m_strikeOutButton->setCheckable(true); + connect(m_strikeOutButton, + &QPushButton::clicked, + this, + &TextConfig::fontStrikeOutChanged); + m_strikeOutButton->setToolTip(tr("StrikeOut")); + + m_underlineButton = new QPushButton( + QIcon(iconPrefix + "format_underlined.svg"), QLatin1String("")); + m_underlineButton->setCheckable(true); + connect(m_underlineButton, + &QPushButton::clicked, + this, + &TextConfig::fontUnderlineChanged); + m_underlineButton->setToolTip(tr("Underline")); + + m_weightButton = + new QPushButton(QIcon(iconPrefix + "format_bold.svg"), QLatin1String("")); + m_weightButton->setCheckable(true); + connect(m_weightButton, + &QPushButton::clicked, + this, + &TextConfig::weightButtonPressed); + m_weightButton->setToolTip(tr("Bold")); + + m_italicButton = new QPushButton(QIcon(iconPrefix + "format_italic.svg"), + QLatin1String("")); + m_italicButton->setCheckable(true); + connect(m_italicButton, + &QPushButton::clicked, + this, + &TextConfig::fontItalicChanged); + m_italicButton->setToolTip(tr("Italic")); + auto* modifiersLayout = new QHBoxLayout(); + + m_leftAlignButton = + new QPushButton(QIcon(iconPrefix + "leftalign.svg"), QLatin1String("")); + m_leftAlignButton->setCheckable(true); + m_leftAlignButton->setAutoExclusive(true); + connect(m_leftAlignButton, &QPushButton::clicked, this, [this] { + emit alignmentChanged(Qt::AlignLeft); + }); + m_leftAlignButton->setToolTip(tr("Left Align")); + + m_centerAlignButton = + new QPushButton(QIcon(iconPrefix + "centeralign.svg"), QLatin1String("")); + m_centerAlignButton->setCheckable(true); + m_centerAlignButton->setAutoExclusive(true); + connect(m_centerAlignButton, &QPushButton::clicked, this, [this] { + emit alignmentChanged(Qt::AlignCenter); + }); + m_centerAlignButton->setToolTip(tr("Center Align")); + + m_rightAlignButton = + new QPushButton(QIcon(iconPrefix + "rightalign.svg"), QLatin1String("")); + m_rightAlignButton->setCheckable(true); + m_rightAlignButton->setAutoExclusive(true); + connect(m_rightAlignButton, &QPushButton::clicked, this, [this] { + emit alignmentChanged(Qt::AlignRight); + }); + m_rightAlignButton->setToolTip(tr("Right Align")); + + auto* alignmentLayout = new QHBoxLayout(); + alignmentLayout->addWidget(m_leftAlignButton); + alignmentLayout->addWidget(m_centerAlignButton); + alignmentLayout->addWidget(m_rightAlignButton); + + m_layout->addWidget(m_fontsCB); + modifiersLayout->addWidget(m_strikeOutButton); + modifiersLayout->addWidget(m_underlineButton); + modifiersLayout->addWidget(m_weightButton); + modifiersLayout->addWidget(m_italicButton); + m_layout->addLayout(modifiersLayout); + m_layout->addLayout(alignmentLayout); +} + +void TextConfig::setFontFamily(const QString& fontFamily) +{ + m_fontsCB->setCurrentIndex( + m_fontsCB->findText(fontFamily.isEmpty() ? font().family() : fontFamily)); +} + +void TextConfig::setUnderline(const bool underline) +{ + m_underlineButton->setChecked(underline); +} + +void TextConfig::setStrikeOut(const bool strikeout) +{ + m_strikeOutButton->setChecked(strikeout); +} + +void TextConfig::setWeight(const int weight) +{ + m_weightButton->setChecked(static_cast(weight) == + QFont::Bold); +} + +void TextConfig::setItalic(const bool italic) +{ + m_italicButton->setChecked(italic); +} + +void TextConfig::weightButtonPressed(const bool weight) +{ + if (weight) { + emit fontWeightChanged(QFont::Bold); + } else { + emit fontWeightChanged(QFont::Normal); + } +} + +void TextConfig::setTextAlignment(Qt::AlignmentFlag alignment) +{ + switch (alignment) { + case (Qt::AlignCenter): + m_leftAlignButton->setChecked(false); + m_centerAlignButton->setChecked(true); + m_rightAlignButton->setChecked(false); + break; + case (Qt::AlignRight): + m_leftAlignButton->setChecked(false); + m_centerAlignButton->setChecked(false); + m_rightAlignButton->setChecked(true); + break; + case (Qt::AlignLeft): + default: + m_leftAlignButton->setChecked(true); + m_centerAlignButton->setChecked(false); + m_rightAlignButton->setChecked(false); + break; + } + emit alignmentChanged(alignment); +} diff --git a/src/tools/text/textconfig.h b/src/tools/text/textconfig.h new file mode 100644 index 0000000..6b701a2 --- /dev/null +++ b/src/tools/text/textconfig.h @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include + +class QVBoxLayout; +class QPushButton; +class QComboBox; + +class TextConfig : public QWidget +{ + Q_OBJECT +public: + explicit TextConfig(QWidget* parent = nullptr); + + void setFontFamily(const QString& fontFamily); + void setUnderline(bool underline); + void setStrikeOut(bool strikeout); + void setWeight(int weight); + void setItalic(bool italic); + void setTextAlignment(Qt::AlignmentFlag alignment); + +signals: + void fontFamilyChanged(const QString& f); + void fontUnderlineChanged(const bool underlined); + void fontStrikeOutChanged(const bool dashed); + void fontWeightChanged(const QFont::Weight w); + void fontItalicChanged(const bool italic); + void alignmentChanged(Qt::AlignmentFlag alignment); +public slots: + +private slots: + void weightButtonPressed(bool weight); + +private: + QVBoxLayout* m_layout; + QComboBox* m_fontsCB; + QPushButton* m_strikeOutButton; + QPushButton* m_underlineButton; + QPushButton* m_weightButton; + QPushButton* m_italicButton; + + QPushButton* m_leftAlignButton; + QPushButton* m_centerAlignButton; + QPushButton* m_rightAlignButton; +}; diff --git a/src/tools/text/texttool.cpp b/src/tools/text/texttool.cpp new file mode 100644 index 0000000..1d3d2c3 --- /dev/null +++ b/src/tools/text/texttool.cpp @@ -0,0 +1,357 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "texttool.h" +#include "src/utils/confighandler.h" +#include "textconfig.h" +#include "textwidget.h" + +#define BASE_POINT_SIZE 8 +#define MAX_INFO_LENGTH 24 + +TextTool::TextTool(QObject* parent) + : CaptureTool(parent) + , m_size(1) +{ + QString fontFamily = ConfigHandler().fontFamily(); + if (!fontFamily.isEmpty()) { + m_font.setFamily(ConfigHandler().fontFamily()); + } + m_alignment = Qt::AlignLeft; +} + +TextTool::~TextTool() +{ + closeEditor(); +} + +void TextTool::copyParams(const TextTool* from, TextTool* to) +{ + CaptureTool::copyParams(from, to); + to->m_font = from->m_font; + to->m_alignment = from->m_alignment; + to->m_text = from->m_text; + to->m_size = from->m_size; + to->m_color = from->m_color; + to->m_textArea = from->m_textArea; + to->m_currentPos = from->m_currentPos; +} + +bool TextTool::isValid() const +{ + return !m_text.isEmpty(); +} + +bool TextTool::closeOnButtonPressed() const +{ + return false; +} + +bool TextTool::isSelectable() const +{ + return true; +} + +bool TextTool::showMousePreview() const +{ + return false; +} + +QRect TextTool::boundingRect() const +{ + return m_textArea; +} + +QIcon TextTool::icon(const QColor& background, bool inEditor) const +{ + Q_UNUSED(inEditor) + return QIcon(iconPath(background) + "text.svg"); +} + +QString TextTool::name() const +{ + return tr("Text"); +} + +QString TextTool::info() +{ + if (m_text.length() > 0) { + m_tempString = QString("%1 - %2").arg(name(), m_text.trimmed()); + m_tempString = m_tempString.split("\n").at(0); + if (m_tempString.length() > MAX_INFO_LENGTH) { + m_tempString.truncate(MAX_INFO_LENGTH); + m_tempString += "…"; + } + return m_tempString; + } + return name(); +} + +CaptureTool::Type TextTool::type() const +{ + return CaptureTool::TYPE_TEXT; +} + +QString TextTool::description() const +{ + return tr("Add text to your capture"); +} + +QWidget* TextTool::widget() +{ + closeEditor(); + m_widget = new TextWidget(); + m_widget->setTextColor(m_color); + m_font.setPointSize(m_size + BASE_POINT_SIZE); + m_widget->setFont(m_font); + m_widget->setAlignment(m_alignment); + m_widget->setText(m_text); + m_widget->selectAll(); + connect(m_widget, &TextWidget::textUpdated, this, &TextTool::updateText); + return m_widget; +} + +void TextTool::closeEditor() +{ + if (!m_widget.isNull()) { + m_widget->hide(); + delete m_widget; + m_widget = nullptr; + } + if (!m_confW.isNull()) { + m_confW->hide(); + delete m_confW; + m_confW = nullptr; + } +} + +QWidget* TextTool::configurationWidget() +{ + m_confW = new TextConfig(); + connect( + m_confW, &TextConfig::fontFamilyChanged, this, &TextTool::updateFamily); + connect(m_confW, + &TextConfig::fontItalicChanged, + this, + &TextTool::updateFontItalic); + connect(m_confW, + &TextConfig::fontStrikeOutChanged, + this, + &TextTool::updateFontStrikeOut); + connect(m_confW, + &TextConfig::fontUnderlineChanged, + this, + &TextTool::updateFontUnderline); + connect(m_confW, + &TextConfig::fontWeightChanged, + this, + &TextTool::updateFontWeight); + + connect( + m_confW, &TextConfig::alignmentChanged, this, &TextTool::updateAlignment); + + m_confW->setFontFamily(m_font.family()); + m_confW->setItalic(m_font.italic()); + m_confW->setUnderline(m_font.underline()); + m_confW->setStrikeOut(m_font.strikeOut()); + m_confW->setWeight(m_font.weight()); + m_confW->setTextAlignment(m_alignment); + return m_confW; +} + +CaptureTool* TextTool::copy(QObject* parent) +{ + auto* textTool = new TextTool(parent); + if (m_confW != nullptr) { + connect(m_confW, + &TextConfig::fontFamilyChanged, + textTool, + &TextTool::updateFamily); + connect(m_confW, + &TextConfig::fontItalicChanged, + textTool, + &TextTool::updateFontItalic); + connect(m_confW, + &TextConfig::fontStrikeOutChanged, + textTool, + &TextTool::updateFontStrikeOut); + connect(m_confW, + &TextConfig::fontUnderlineChanged, + textTool, + &TextTool::updateFontUnderline); + connect(m_confW, + &TextConfig::fontWeightChanged, + textTool, + &TextTool::updateFontWeight); + + connect(m_confW, + &TextConfig::alignmentChanged, + textTool, + &TextTool::updateAlignment); + } + copyParams(this, textTool); + return textTool; +} + +void TextTool::process(QPainter& painter, const QPixmap& pixmap) +{ + Q_UNUSED(pixmap) + if (m_text.isEmpty()) { + return; + } + const int val = 5; + QFont orig_font = painter.font(); + QPen orig_pen = painter.pen(); + QFontMetrics fm(m_font); + QSize fontsize(fm.boundingRect(QRect(), 0, m_text).size()); + fontsize.setWidth(fontsize.width() + val * 2); + fontsize.setHeight(fontsize.height() + val * 2); + m_textArea.setSize(fontsize); + // draw text + painter.setFont(m_font); + painter.setPen(m_color); + if (!editMode()) { + painter.drawText( + m_textArea + QMargins(-val, -val, val, val), m_alignment, m_text); + } + painter.setFont(orig_font); + painter.setPen(orig_pen); + + if (m_widget != nullptr) { + m_widget->setAlignment(m_alignment); + } +} + +void TextTool::drawObjectSelection(QPainter& painter) +{ + if (m_text.isEmpty()) { + return; + } + drawObjectSelectionRect(painter, boundingRect()); +} + +void TextTool::paintMousePreview(QPainter& painter, + const CaptureContext& context) +{ + Q_UNUSED(painter) + Q_UNUSED(context) +} + +void TextTool::drawEnd(const QPoint& point) +{ + m_textArea.moveTo(point); +} + +void TextTool::drawMove(const QPoint& point) +{ + m_widget->move(point); +} + +void TextTool::drawStart(const CaptureContext& context) +{ + m_color = context.color; + m_size = context.toolSize; + emit requestAction(REQ_ADD_CHILD_WIDGET); +} + +void TextTool::pressed(CaptureContext& context) +{ + Q_UNUSED(context) +} + +void TextTool::onColorChanged(const QColor& color) +{ + m_color = color; + if (m_widget != nullptr) { + m_widget->setTextColor(color); + } +} + +void TextTool::onSizeChanged(int size) +{ + m_size = size; + m_font.setPointSize(m_size + BASE_POINT_SIZE); + if (m_widget != nullptr) { + m_widget->setFont(m_font); + } +} + +void TextTool::updateText(const QString& newText) +{ + m_text = newText; +} + +void TextTool::updateFamily(const QString& text) +{ + m_font.setFamily(text); + if (m_textOld.isEmpty()) { + ConfigHandler().setFontFamily(m_font.family()); + } + if (m_widget != nullptr) { + m_widget->setFont(m_font); + } +} + +void TextTool::updateFontUnderline(const bool underlined) +{ + m_font.setUnderline(underlined); + if (m_widget != nullptr) { + m_widget->setFont(m_font); + } +} + +void TextTool::updateFontStrikeOut(const bool strikeout) +{ + m_font.setStrikeOut(strikeout); + if (m_widget != nullptr) { + m_widget->setFont(m_font); + } +} + +void TextTool::updateFontWeight(const QFont::Weight weight) +{ + m_font.setWeight(weight); + if (m_widget != nullptr) { + m_widget->setFont(m_font); + } +} + +void TextTool::updateFontItalic(const bool italic) +{ + m_font.setItalic(italic); + if (m_widget != nullptr) { + m_widget->setFont(m_font); + } +} + +void TextTool::move(const QPoint& pos) +{ + m_textArea.moveTo(pos); +} + +void TextTool::updateAlignment(Qt::AlignmentFlag alignment) +{ + m_alignment = alignment; + if (m_widget != nullptr) { + m_widget->setAlignment(m_alignment); + } +} + +const QPoint* TextTool::pos() +{ + m_currentPos = m_textArea.topLeft(); + return &m_currentPos; +} + +void TextTool::setEditMode(bool editMode) +{ + if (editMode) { + m_textOld = m_text; + } + CaptureTool::setEditMode(editMode); +} + +bool TextTool::isChanged() +{ + return QString::compare(m_text, m_textOld, Qt::CaseInsensitive) != 0; +} diff --git a/src/tools/text/texttool.h b/src/tools/text/texttool.h new file mode 100644 index 0000000..76a8892 --- /dev/null +++ b/src/tools/text/texttool.h @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/tools/capturetool.h" +#include "textconfig.h" +#include +#include +class TextWidget; +class TextConfig; + +class TextTool : public CaptureTool +{ + Q_OBJECT +public: + explicit TextTool(QObject* parent = nullptr); + ~TextTool() override; + + [[nodiscard]] bool isValid() const override; + [[nodiscard]] bool closeOnButtonPressed() const override; + [[nodiscard]] bool isSelectable() const override; + [[nodiscard]] bool showMousePreview() const override; + [[nodiscard]] QRect boundingRect() const override; + + [[nodiscard]] QIcon icon(const QColor& background, + bool inEditor) const override; + [[nodiscard]] QString name() const override; + [[nodiscard]] QString description() const override; + QString info() override; + + QWidget* widget() override; + QWidget* configurationWidget() override; + CaptureTool* copy(QObject* parent = nullptr) override; + + void process(QPainter& painter, const QPixmap& pixmap) override; + void paintMousePreview(QPainter& painter, + const CaptureContext& context) override; + void move(const QPoint& pos) override; + const QPoint* pos() override; + void drawObjectSelection(QPainter& painter) override; + + void setEditMode(bool editMode) override; + bool isChanged() override; + +protected: + void copyParams(const TextTool* from, TextTool* to); + [[nodiscard]] CaptureTool::Type type() const override; + +public slots: + void drawEnd(const QPoint& point) override; + void drawMove(const QPoint& point) override; + void drawStart(const CaptureContext& context) override; + void pressed(CaptureContext& context) override; + void onColorChanged(const QColor& color) override; + void onSizeChanged(int size) override; + int size() const override { return m_size; }; + +private slots: + void updateText(const QString& string); + void updateFamily(const QString& string); + void updateFontUnderline(bool underlined); + void updateFontStrikeOut(bool strikeout); + void updateFontWeight(QFont::Weight weight); + void updateFontItalic(bool italic); + void updateAlignment(Qt::AlignmentFlag alignment); + +private: + void closeEditor(); + + QFont m_font; + Qt::AlignmentFlag m_alignment; + QString m_text; + QString m_textOld; + int m_size; + QColor m_color; + QRect m_textArea; + QPointer m_widget; + QPointer m_confW; + QPoint m_currentPos; + + QString m_tempString; +}; diff --git a/src/tools/text/textwidget.cpp b/src/tools/text/textwidget.cpp new file mode 100644 index 0000000..bbc6a11 --- /dev/null +++ b/src/tools/text/textwidget.cpp @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "textwidget.h" + +TextWidget::TextWidget(QWidget* parent) + : QTextEdit(parent) +{ + setStyleSheet(QStringLiteral("TextWidget { background: transparent; }")); + connect(this, &TextWidget::textChanged, this, &TextWidget::adjustSize); + connect(this, &TextWidget::textChanged, this, &TextWidget::emitTextUpdated); + setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setContextMenuPolicy(Qt::NoContextMenu); +} + +void TextWidget::showEvent(QShowEvent* e) +{ + QFont font; + QFontMetrics fm(font); + setFixedWidth(fm.lineSpacing() * 6); + setFixedHeight(fm.lineSpacing() * 2.5); + m_baseSize = size(); + m_minSize = m_baseSize; + QTextEdit::showEvent(e); + adjustSize(); +} + +void TextWidget::resizeEvent(QResizeEvent* e) +{ + m_minSize.setHeight(qMin(m_baseSize.height(), height())); + m_minSize.setWidth(qMin(m_baseSize.width(), width())); + QTextEdit::resizeEvent(e); +} + +void TextWidget::setFont(const QFont& f) +{ + QTextEdit::setFont(f); + adjustSize(); +} + +void TextWidget::setAlignment(Qt::AlignmentFlag alignment) +{ + QTextEdit::setAlignment(alignment); + adjustSize(); +} +void TextWidget::setTextColor(const QColor& c) +{ + QString s( + QStringLiteral("TextWidget { background: transparent; color: %1; }")); + setStyleSheet(s.arg(c.name())); +} + +void TextWidget::adjustSize() +{ + QString&& text = this->toPlainText(); + + QFontMetrics fm(font()); + QRect bounds = fm.boundingRect(QRect(), 0, text); + int pixelsWide = bounds.width() + fm.lineSpacing(); + int pixelsHigh = bounds.height() * 1.15 + fm.lineSpacing(); + if (pixelsWide < m_minSize.width()) { + pixelsWide = m_minSize.width(); + } + if (pixelsHigh < m_minSize.height()) { + pixelsHigh = m_minSize.height(); + } + + this->setFixedSize(pixelsWide, pixelsHigh); +} + +void TextWidget::emitTextUpdated() +{ + emit textUpdated(this->toPlainText()); +} diff --git a/src/tools/text/textwidget.h b/src/tools/text/textwidget.h new file mode 100644 index 0000000..c6d4323 --- /dev/null +++ b/src/tools/text/textwidget.h @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include + +class TextWidget : public QTextEdit +{ + Q_OBJECT +public: + explicit TextWidget(QWidget* parent = nullptr); + + void adjustSize(); + void setFont(const QFont& f); + +protected: + void showEvent(QShowEvent* e); + void resizeEvent(QResizeEvent* e); + +signals: + void textUpdated(const QString& s); + +public slots: + void setTextColor(const QColor& c); + void setAlignment(Qt::AlignmentFlag alignment); + +private slots: + void emitTextUpdated(); + +private: + QSize m_baseSize; + QSize m_minSize; +}; diff --git a/src/tools/toolfactory.cpp b/src/tools/toolfactory.cpp new file mode 100644 index 0000000..3521240 --- /dev/null +++ b/src/tools/toolfactory.cpp @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "toolfactory.h" +#include "accept/accepttool.h" +#include "arrow/arrowtool.h" +#include "circle/circletool.h" +#include "circlecount/circlecounttool.h" +#include "copy/copytool.h" +#include "exit/exittool.h" +#ifdef ENABLE_IMGUR +#include "imgupload/imguploadertool.h" +#endif +#include "invert/inverttool.h" +#include "launcher/applaunchertool.h" +#include "line/linetool.h" +#include "marker/markertool.h" +#include "move/movetool.h" +#include "pencil/penciltool.h" +#include "pin/pintool.h" +#include "pixelate/pixelatetool.h" +#include "rectangle/rectangletool.h" +#include "redo/redotool.h" +#include "save/savetool.h" +#include "selection/selectiontool.h" +#include "sizedecrease/sizedecreasetool.h" +#include "sizeincrease/sizeincreasetool.h" +#include "text/texttool.h" +#include "undo/undotool.h" + +ToolFactory::ToolFactory(QObject* parent) + : QObject(parent) +{} + +CaptureTool* ToolFactory::CreateTool(CaptureTool::Type t, QObject* parent) +{ +#define if_TYPE_return_TOOL(TYPE, TOOL) \ + case CaptureTool::TYPE: \ + return new TOOL(parent) + + switch (t) { + if_TYPE_return_TOOL(TYPE_PENCIL, PencilTool); + if_TYPE_return_TOOL(TYPE_DRAWER, LineTool); + if_TYPE_return_TOOL(TYPE_ARROW, ArrowTool); + if_TYPE_return_TOOL(TYPE_SELECTION, SelectionTool); + if_TYPE_return_TOOL(TYPE_RECTANGLE, RectangleTool); + if_TYPE_return_TOOL(TYPE_CIRCLE, CircleTool); + if_TYPE_return_TOOL(TYPE_MARKER, MarkerTool); + if_TYPE_return_TOOL(TYPE_MOVESELECTION, MoveTool); + if_TYPE_return_TOOL(TYPE_UNDO, UndoTool); + if_TYPE_return_TOOL(TYPE_COPY, CopyTool); + if_TYPE_return_TOOL(TYPE_SAVE, SaveTool); + if_TYPE_return_TOOL(TYPE_EXIT, ExitTool); +#ifdef ENABLE_IMGUR + if_TYPE_return_TOOL(TYPE_IMAGEUPLOADER, ImgUploaderTool); +#endif +#if !defined(Q_OS_MACOS) + if_TYPE_return_TOOL(TYPE_OPEN_APP, AppLauncher); +#endif + if_TYPE_return_TOOL(TYPE_PIXELATE, PixelateTool); + if_TYPE_return_TOOL(TYPE_REDO, RedoTool); + if_TYPE_return_TOOL(TYPE_PIN, PinTool); + if_TYPE_return_TOOL(TYPE_TEXT, TextTool); + if_TYPE_return_TOOL(TYPE_CIRCLECOUNT, CircleCountTool); + if_TYPE_return_TOOL(TYPE_SIZEINCREASE, SizeIncreaseTool); + if_TYPE_return_TOOL(TYPE_SIZEDECREASE, SizeDecreaseTool); + if_TYPE_return_TOOL(TYPE_INVERT, InvertTool); + if_TYPE_return_TOOL(TYPE_ACCEPT, AcceptTool); + default: + return nullptr; + } +} diff --git a/src/tools/toolfactory.h b/src/tools/toolfactory.h new file mode 100644 index 0000000..5ce3572 --- /dev/null +++ b/src/tools/toolfactory.h @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/tools/capturetool.h" +#include "src/widgets/capture/capturetoolbutton.h" +#include + +class CaptureTool; + +class ToolFactory : public QObject +{ + Q_OBJECT + +public: + explicit ToolFactory(QObject* parent = nullptr); + + ToolFactory(const ToolFactory&) = delete; + ToolFactory& operator=(const ToolFactory&) = delete; + + CaptureTool* CreateTool(CaptureTool::Type t, QObject* parent = nullptr); +}; diff --git a/src/tools/undo/undotool.cpp b/src/tools/undo/undotool.cpp new file mode 100644 index 0000000..7cfb2d2 --- /dev/null +++ b/src/tools/undo/undotool.cpp @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "undotool.h" +#include + +UndoTool::UndoTool(QObject* parent) + : AbstractActionTool(parent) +{} + +bool UndoTool::closeOnButtonPressed() const +{ + return false; +} + +QIcon UndoTool::icon(const QColor& background, bool inEditor) const +{ + Q_UNUSED(inEditor) + return QIcon(iconPath(background) + "undo-variant.svg"); +} +QString UndoTool::name() const +{ + return tr("Undo"); +} + +CaptureTool::Type UndoTool::type() const +{ + return CaptureTool::TYPE_UNDO; +} + +QString UndoTool::description() const +{ + return tr("Undo the last modification"); +} + +CaptureTool* UndoTool::copy(QObject* parent) +{ + return new UndoTool(parent); +} + +void UndoTool::pressed(CaptureContext& context) +{ + Q_UNUSED(context) + emit requestAction(REQ_UNDO_MODIFICATION); +} diff --git a/src/tools/undo/undotool.h b/src/tools/undo/undotool.h new file mode 100644 index 0000000..0425b2b --- /dev/null +++ b/src/tools/undo/undotool.h @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/tools/abstractactiontool.h" + +class UndoTool : public AbstractActionTool +{ + Q_OBJECT +public: + explicit UndoTool(QObject* parent = nullptr); + + bool closeOnButtonPressed() const override; + + QIcon icon(const QColor& background, bool inEditor) const override; + QString name() const override; + QString description() const override; + + CaptureTool* copy(QObject* parent = nullptr) override; + +protected: + CaptureTool::Type type() const override; + +public slots: + void pressed(CaptureContext& context) override; +}; diff --git a/src/utils/CMakeLists.txt b/src/utils/CMakeLists.txt new file mode 100644 index 0000000..23c868a --- /dev/null +++ b/src/utils/CMakeLists.txt @@ -0,0 +1,43 @@ +# Required to generate MOC +target_sources( + flameshot + PRIVATE abstractlogger.h + filenamehandler.h + screengrabber.h + systemnotification.h + valuehandler.h + strfparse.h +) + +target_sources( + flameshot + PRIVATE abstractlogger.cpp + filenamehandler.cpp + screengrabber.cpp + confighandler.cpp + systemnotification.cpp + valuehandler.cpp + screenshotsaver.cpp + globalvalues.cpp + desktopfileparse.cpp + desktopinfo.cpp + pathinfo.cpp + colorutils.cpp + history.cpp + strfparse.cpp +) + +IF (UNIX AND NOT APPLE) +target_sources( + flameshot + PRIVATE request.h + request.cpp +) +ENDIF() + +IF (WIN32) + target_sources( + flameshot + PRIVATE winlnkfileparse.cpp + ) +ENDIF() diff --git a/src/utils/abstractlogger.cpp b/src/utils/abstractlogger.cpp new file mode 100644 index 0000000..9bf39aa --- /dev/null +++ b/src/utils/abstractlogger.cpp @@ -0,0 +1,138 @@ +#include "abstractlogger.h" +#include "systemnotification.h" +#include + +#include + +AbstractLogger::AbstractLogger(Channel channel, int targets) + : m_defaultChannel(channel) + , m_targets(targets) +{ + if (targets & LogFile) { + // TODO + } +} + +/** + * @brief Construct an AbstractLogger with output to a string. + * @param additionalChannels Optional additional targets to output to. + */ +AbstractLogger::AbstractLogger(QString& str, + Channel channel, + int additionalChannels) + : AbstractLogger(channel, additionalChannels) +{ + m_textStreams << new QTextStream(&str); +} + +AbstractLogger::~AbstractLogger() +{ + qDeleteAll(m_textStreams); +} + +AbstractLogger AbstractLogger::info(int targets) +{ + return { Info, targets }; +} + +AbstractLogger AbstractLogger::warning(int targets) +{ + return { Warning, targets }; +} + +AbstractLogger AbstractLogger::error(int targets) +{ + return { Error, targets }; +} + +AbstractLogger& AbstractLogger::sendMessage(const QString& msg, Channel channel) +{ + if (m_targets & Notification) { + SystemNotification().sendMessage( + msg, messageHeader(channel, Notification), m_notificationPath); + } + if (!m_textStreams.isEmpty()) { + for (auto* stream : m_textStreams) { + *stream << messageHeader(channel, String) << msg << "\n"; + } + } + if (m_targets & LogFile) { + // TODO + } + if (m_targets & Stderr) { + QTextStream stream(stderr); + stream << messageHeader(channel, Stderr) << msg << "\n"; + } + + if (m_targets & Stdout) { + QTextStream stream(stdout); + stream << messageHeader(channel, Stdout) << msg << "\n"; + } + + return *this; +} + +/** + * @brief Send a message to the default channel of this logger. + * @param msg + * @return + */ +AbstractLogger& AbstractLogger::operator<<(const QString& msg) +{ + sendMessage(msg, m_defaultChannel); + return *this; +} + +AbstractLogger& AbstractLogger::addOutputString(QString& str) +{ + m_textStreams << new QTextStream(&str); + return *this; +} + +/** + * @brief Attach a path to a notification so it can be dragged and dropped. + */ +AbstractLogger& AbstractLogger::attachNotificationPath(const QString& path) +{ + if (m_targets & Notification) { + m_notificationPath = path; + } else { + assert("Cannot attach notification path to a logger without a " + "notification channel."); + } + return *this; +} + +/** + * @brief Enable/disable message header (e.g. "flameshot: info:"). + */ +AbstractLogger& AbstractLogger::enableMessageHeader(bool enable) +{ + m_enableMessageHeader = enable; + return *this; +} + +/** + * @brief Generate a message header for the given channel and target. + */ +QString AbstractLogger::messageHeader(Channel channel, Target target) +{ + if (!m_enableMessageHeader) { + return ""; + } + QString messageChannel; + if (channel == Info) { + messageChannel = "info"; + } else if (channel == Warning) { + messageChannel = "warning"; + } else if (channel == Error) { + messageChannel = "error"; + } + + if (target == Notification) { + messageChannel[0] = messageChannel[0].toUpper(); + return "Flameshot " + messageChannel; + } else { + return "flameshot: " + messageChannel + ": "; + } +} diff --git a/src/utils/abstractlogger.h b/src/utils/abstractlogger.h new file mode 100644 index 0000000..a5a153f --- /dev/null +++ b/src/utils/abstractlogger.h @@ -0,0 +1,55 @@ +#pragma once + +#include +#include +#include + +/** + * @brief A class that allows you to log events to where they need to go. + */ +class AbstractLogger +{ +public: + enum Target + { + Notification = 0x01, + Stderr = 0x02, + LogFile = 0x08, + String = 0x10, + Stdout = 0x20, + Default = Notification | LogFile | Stderr, + }; + + enum Channel + { + Info, + Warning, + Error + }; + + AbstractLogger(Channel channel = Info, int targets = Default); + AbstractLogger(QString& str, + Channel channel, + int additionalTargets = String); + ~AbstractLogger(); + + // Convenience functions + static AbstractLogger info(int targets = Default); + static AbstractLogger warning(int targets = Default); + static AbstractLogger error(int targets = Default); + + AbstractLogger& sendMessage(const QString& msg, Channel channel); + AbstractLogger& operator<<(const QString& msg); + AbstractLogger& addOutputString(QString& str); + AbstractLogger& attachNotificationPath(const QString& path); + AbstractLogger& enableMessageHeader(bool enable); + +private: + QString messageHeader(Channel channel, Target target); + + int m_targets; + Channel m_defaultChannel; + QList m_textStreams; + QString m_notificationPath; + bool m_enableMessageHeader = true; +}; diff --git a/src/utils/colorutils.cpp b/src/utils/colorutils.cpp new file mode 100644 index 0000000..0526efc --- /dev/null +++ b/src/utils/colorutils.cpp @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "colorutils.h" + +inline qreal getColorLuma(const QColor& c) +{ + return 0.30 * c.redF() + 0.59 * c.greenF() + 0.11 * c.blueF(); +} + +bool ColorUtils::colorIsDark(const QColor& c) +{ + // when luma <= 0.5, we considor it as a dark color + return getColorLuma(c) <= 0.5; +} + +QColor ColorUtils::contrastColor(const QColor& c) +{ + int change = colorIsDark(c) ? 30 : -45; + + return { qBound(0, c.red() + change, 255), + qBound(0, c.green() + change, 255), + qBound(0, c.blue() + change, 255) }; +} diff --git a/src/utils/colorutils.h b/src/utils/colorutils.h new file mode 100644 index 0000000..599cac3 --- /dev/null +++ b/src/utils/colorutils.h @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include + +namespace ColorUtils { // namespace + +bool colorIsDark(const QColor& c); + +QColor contrastColor(const QColor& c); + +} // namespace diff --git a/src/utils/confighandler.cpp b/src/utils/confighandler.cpp new file mode 100644 index 0000000..e202e5d --- /dev/null +++ b/src/utils/confighandler.cpp @@ -0,0 +1,822 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "confighandler.h" +#include "abstractlogger.h" +#include "src/tools/capturetool.h" +#include "valuehandler.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(Q_OS_MACOS) +#include +#endif + +// HELPER FUNCTIONS + +bool verifyLaunchFile() +{ +#if defined(Q_OS_LINUX) || defined(Q_OS_UNIX) + QString path = QStandardPaths::locate(QStandardPaths::GenericConfigLocation, + "autostart/", + QStandardPaths::LocateDirectory) + + "Flameshot.desktop"; + bool res = QFile(path).exists(); +#elif defined(Q_OS_WIN) + QSettings bootUpSettings( + "HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", + QSettings::NativeFormat); + bool res = + bootUpSettings.value("Flameshot").toString() == + QDir::toNativeSeparators(QCoreApplication::applicationFilePath()); +#endif + return res; +} + +// VALUE HANDLING + +/** + * Use this to declare a setting with a type that is either unrecognized by + * QVariant or if you need to place additional constraints on its value. + * @param KEY Name of the setting as in the config file + * (a C-style string literal) + * @param TYPE An instance of a `ValueHandler` derivative. This must be + * specified in the form of a constructor, or the macro will + * misbehave. + */ +#define OPTION(KEY, TYPE) \ + { \ + QStringLiteral(KEY), QSharedPointer(new TYPE) \ + } + +#define SHORTCUT(NAME, DEFAULT_VALUE) \ + { \ + QStringLiteral(NAME), QSharedPointer(new KeySequence( \ + QKeySequence(QLatin1String(DEFAULT_VALUE)))) \ + } + +/** + * This map contains all the information that is needed to parse, verify and + * preprocess each configuration option in the General section. + * NOTE: Please keep it well structured + */ +// clang-format off +static QMap> + recognizedGeneralOptions = { +// KEY TYPE DEFAULT_VALUE + OPTION("showHelp" ,Bool ( true )), + OPTION("showSidePanelButton" ,Bool ( true )), + OPTION("showDesktopNotification" ,Bool ( true )), + OPTION("showAbortNotification" ,Bool ( true )), + OPTION("disabledTrayIcon" ,Bool ( false )), + OPTION("useGrimAdapter" ,Bool ( false )), + OPTION("disabledGrimWarning" ,Bool ( false )), + OPTION("historyConfirmationToDelete" ,Bool ( true )), +#if !defined(DISABLE_UPDATE_CHECKER) + OPTION("checkForUpdates" ,Bool ( true )), +#endif + OPTION("allowMultipleGuiInstances" ,Bool ( false )), + OPTION("showMagnifier" ,Bool ( false )), + OPTION("squareMagnifier" ,Bool ( false )), +#if !defined(Q_OS_WIN) + OPTION("autoCloseIdleDaemon" ,Bool ( false )), +#endif + OPTION("startupLaunch" ,Bool ( false )), + OPTION("showStartupLaunchMessage" ,Bool ( true )), + OPTION("showQuitPrompt" ,Bool ( false )), + OPTION("copyURLAfterUpload" ,Bool ( true )), + OPTION("copyPathAfterSave" ,Bool ( false )), + OPTION("antialiasingPinZoom" ,Bool ( true )), + OPTION("useJpgForClipboard" ,Bool ( false )), + OPTION("uploadWithoutConfirmation" ,Bool ( false )), + OPTION("saveAfterCopy" ,Bool ( false )), + OPTION("savePath" ,ExistingDir ( )), + OPTION("savePathFixed" ,Bool ( false )), + OPTION("saveAsFileExtension" ,SaveFileExtension ( )), + OPTION("saveLastRegion" ,Bool ( false )), + OPTION("uploadHistoryMax" ,LowerBoundedInt ( 0, 25 )), + OPTION("undoLimit" ,BoundedInt ( 0, 999, 100 )), + // Interface tab + OPTION("uiLanguage" ,String ( "auto" )), + OPTION("uiColor" ,Color ( {116, 0, 150} )), + OPTION("contrastUiColor" ,Color ( {39, 0, 50} )), + OPTION("contrastOpacity" ,BoundedInt ( 0, 255, 190 )), + OPTION("buttons" ,ButtonList ( {} )), + // Filename Editor tab + OPTION("filenamePattern" ,FilenamePattern ( {} )), + // Others + // drawThickness shared by Pencil, Line, Arrow, Rectangular Selection, Circle + OPTION("drawThickness" ,LowerBoundedInt ( 1, 3 )), + OPTION("drawFontSize" ,LowerBoundedInt ( 1, 8 )), + OPTION("drawCircleCounterSize" ,LowerBoundedInt ( 1, 1 )), + OPTION("drawPixelateSize" ,LowerBoundedInt ( 1, 2 )), + OPTION("drawRectangleSize" ,LowerBoundedInt ( 1, 1 )), + OPTION("drawMarkerSize" ,LowerBoundedInt ( 1, 5 )), + OPTION("drawColor" ,Color ( Qt::red )), + OPTION("userColors" ,UserColors ( 3, 17 )), + OPTION("ignoreUpdateToVersion" ,String ( "" )), + OPTION("keepOpenAppLauncher" ,Bool ( false )), + OPTION("fontFamily" ,String ( "" )), + // PREDEFINED_COLOR_PALETTE_LARGE is defined in src/CMakeList.txt file and can be overwritten in GitHub actions + OPTION("predefinedColorPaletteLarge", Bool ( PREDEFINED_COLOR_PALETTE_LARGE )), + // NOTE: If another tool size is added besides drawThickness and + // drawFontSize, remember to update ConfigHandler::toolSize + OPTION("copyOnDoubleClick" ,Bool ( false )), + OPTION("uploadClientSecret" ,String ( "313baf0c7b4d3ff" )), + OPTION("showSelectionGeometry" , BoundedInt ( 0, 5, 4 )), + OPTION("showSelectionGeometryHideTime", LowerBoundedInt ( 0, 3000 )), + OPTION("jpegQuality" , BoundedInt ( 0,100,75 )), + OPTION("reverseArrow" ,Bool ( false )), + OPTION("insecurePixelate" ,Bool ( false )), +}; + +static QMap> recognizedShortcuts = { +// NAME DEFAULT_SHORTCUT + SHORTCUT("TYPE_PENCIL" , "P" ), + SHORTCUT("TYPE_DRAWER" , "D" ), + SHORTCUT("TYPE_ARROW" , "A" ), + SHORTCUT("TYPE_SELECTION" , "S" ), + SHORTCUT("TYPE_RECTANGLE" , "R" ), + SHORTCUT("TYPE_CIRCLE" , "C" ), + SHORTCUT("TYPE_MARKER" , "M" ), + SHORTCUT("TYPE_MOVESELECTION" , "Ctrl+M" ), + SHORTCUT("TYPE_UNDO" , "Ctrl+Z" ), + SHORTCUT("TYPE_COPY" , "Ctrl+C" ), + SHORTCUT("TYPE_SAVE" , "Ctrl+S" ), + SHORTCUT("TYPE_ACCEPT" , "Return" ), + SHORTCUT("TYPE_EXIT" , "Ctrl+Q" ), + SHORTCUT("TYPE_CANCEL" , "Ctrl+Backspace" ), +#ifdef ENABLE_IMGUR + SHORTCUT("TYPE_IMAGEUPLOADER" , ), +#endif +#if !defined(Q_OS_MACOS) + SHORTCUT("TYPE_OPEN_APP" , "Ctrl+O" ), +#endif + SHORTCUT("TYPE_PIXELATE" , "B" ), + SHORTCUT("TYPE_INVERT" , "I" ), + SHORTCUT("TYPE_REDO" , "Ctrl+Shift+Z" ), + SHORTCUT("TYPE_TEXT" , "T" ), + SHORTCUT("TYPE_TOGGLE_PANEL" , "Space" ), + SHORTCUT("TYPE_GRAB_COLOR" , "G" ), + SHORTCUT("TYPE_RESIZE_LEFT" , "Shift+Left" ), + SHORTCUT("TYPE_RESIZE_RIGHT" , "Shift+Right" ), + SHORTCUT("TYPE_RESIZE_UP" , "Shift+Up" ), + SHORTCUT("TYPE_RESIZE_DOWN" , "Shift+Down" ), + SHORTCUT("TYPE_SYM_RESIZE_LEFT" , "Ctrl+Shift+Left" ), + SHORTCUT("TYPE_SYM_RESIZE_RIGHT" , "Ctrl+Shift+Right" ), + SHORTCUT("TYPE_SYM_RESIZE_UP" , "Ctrl+Shift+Up" ), + SHORTCUT("TYPE_SYM_RESIZE_DOWN" , "Ctrl+Shift+Down" ), + SHORTCUT("TYPE_SELECT_ALL" , "Ctrl+A" ), + SHORTCUT("TYPE_MOVE_LEFT" , "Left" ), + SHORTCUT("TYPE_MOVE_RIGHT" , "Right" ), + SHORTCUT("TYPE_MOVE_UP" , "Up" ), + SHORTCUT("TYPE_MOVE_DOWN" , "Down" ), + SHORTCUT("TYPE_COMMIT_CURRENT_TOOL" , "Ctrl+Return" ), +#if defined(Q_OS_MACOS) + SHORTCUT("TYPE_DELETE_CURRENT_TOOL" , "Backspace" ), + SHORTCUT("TAKE_SCREENSHOT" , "Ctrl+Shift+X" ), + SHORTCUT("SCREENSHOT_HISTORY" , "Alt+Shift+X" ), +#else + SHORTCUT("TYPE_DELETE_CURRENT_TOOL" , "Delete" ), +#endif + SHORTCUT("TYPE_PIN" , ), + SHORTCUT("TYPE_SIZEINCREASE" , ), + SHORTCUT("TYPE_SIZEDECREASE" , ), + SHORTCUT("TYPE_CIRCLECOUNT" , ), +}; +// clang-format on + +// CLASS CONFIGHANDLER + +ConfigHandler::ConfigHandler() + : m_settings(QSettings::IniFormat, + QSettings::UserScope, + qApp->organizationName(), + qApp->applicationName()) +{ + static bool firstInitialization = true; + if (firstInitialization) { + // check for error every time the file changes + m_configWatcher.reset(new QFileSystemWatcher()); + ensureFileWatched(); + QObject::connect(m_configWatcher.data(), + &QFileSystemWatcher::fileChanged, + [](const QString& fileName) { + emit getInstance()->fileChanged(); + + if (QFile(fileName).exists()) { + m_configWatcher->addPath(fileName); + } + if (m_skipNextErrorCheck) { + m_skipNextErrorCheck = false; + return; + } + ConfigHandler().checkAndHandleError(); + if (!QFile(fileName).exists()) { + // File watcher stops watching a deleted file. + // Next time the config is accessed, force it + // to check for errors (and watch again). + m_errorCheckPending = true; + } + }); + } + firstInitialization = false; +} + +/// Serves as an object to which slots can be connected. +ConfigHandler* ConfigHandler::getInstance() +{ + static ConfigHandler config; + return &config; +} + +// SPECIAL CASES + +bool ConfigHandler::startupLaunch() +{ + bool res = value(QStringLiteral("startupLaunch")).toBool(); + if (res != verifyLaunchFile()) { + setStartupLaunch(res); + } + return res; +} + +void ConfigHandler::setStartupLaunch(const bool start) +{ + if (start == value(QStringLiteral("startupLaunch")).toBool()) { + return; + } + setValue(QStringLiteral("startupLaunch"), start); +#if defined(Q_OS_MACOS) + /* TODO - there should be more correct way via API, but didn't find it + without extra dependencies, there should be something like that: + https://stackoverflow.com/questions/3358410/programmatically-run-at-startup-on-mac-os-x + But files with this features differs on different MacOS versions and it + doesn't work not on a BigSur at lease. + */ + QProcess process; + if (start) { + process.start("osascript", + QStringList() + << "-e" + << "tell application \"System Events\" to make login " + "item at end with properties {name: " + "\"Flameshot\",path:\"/Applications/" + "flameshot.app\", hidden:false}"); + } else { + process.start("osascript", + QStringList() << "-e" + << "tell application \"System Events\" to " + "delete login item \"Flameshot\""); + } + if (!process.waitForFinished()) { + qWarning() << "Login items is changed. " << process.errorString(); + } else { + qWarning() << "Unable to change login items, error:" + << process.readAll(); + } +#elif defined(Q_OS_LINUX) || defined(Q_OS_UNIX) + QString path = + QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + + "/autostart/"; + QDir autostartDir(path); + if (!autostartDir.exists()) { + autostartDir.mkpath("."); + } + + QFile file(path + "Flameshot.desktop"); + if (start) { + if (file.open(QIODevice::WriteOnly)) { + QByteArray data("[Desktop Entry]\nName=flameshot\nIcon=flameshot" + "\nExec=flameshot\nTerminal=false\nType=Application" + "\nX-GNOME-Autostart-enabled=true\n"); + file.write(data); + } + } else { + file.remove(); + } +#elif defined(Q_OS_WIN) + QSettings bootUpSettings( + "HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", + QSettings::NativeFormat); + // set workdir for flameshot on startup + QSettings bootUpPath( + "HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App " + "Paths", + QSettings::NativeFormat); + if (start) { + QString app_path = + QDir::toNativeSeparators(QCoreApplication::applicationFilePath()); + bootUpSettings.setValue("Flameshot", app_path); + + // set application workdir + bootUpPath.beginGroup("flameshot.exe"); + bootUpPath.setValue("Path", QCoreApplication::applicationDirPath()); + bootUpPath.endGroup(); + + } else { + bootUpSettings.remove("Flameshot"); + + // remove application workdir + bootUpPath.beginGroup("flameshot.exe"); + bootUpPath.remove(""); + bootUpPath.endGroup(); + } +#endif +} + +void ConfigHandler::setAllTheButtons() +{ + QList buttonlist = + CaptureToolButton::getIterableButtonTypes(); + setValue(QStringLiteral("buttons"), QVariant::fromValue(buttonlist)); +} + +void ConfigHandler::setToolSize(CaptureTool::Type toolType, int size) +{ + if (toolType == CaptureTool::TYPE_TEXT) { + setDrawFontSize(size); + } else if (toolType == CaptureTool::TYPE_RECTANGLE) { + setDrawRectangleSize(size); + } else if (toolType == CaptureTool::TYPE_MARKER) { + setDrawMarkerSize(size); + } else if (toolType == CaptureTool::TYPE_PIXELATE) { + setDrawPixelateSize(size); + } else if (toolType == CaptureTool::TYPE_CIRCLECOUNT) { + setDrawCircleCounterSize(size); + } else if (toolType != CaptureTool::NONE) { + // All other tools are sharing the same size + setDrawThickness(size); + } +} + +int ConfigHandler::toolSize(CaptureTool::Type toolType) +{ + if (toolType == CaptureTool::TYPE_TEXT) { + return drawFontSize(); + } else if (toolType == CaptureTool::TYPE_RECTANGLE) { + return drawRectangleSize(); + } else if (toolType == CaptureTool::TYPE_MARKER) { + return drawMarkerSize(); + } else if (toolType == CaptureTool::TYPE_PIXELATE) { + return drawPixelateSize(); + } else if (toolType == CaptureTool::TYPE_CIRCLECOUNT) { + return drawCircleCounterSize(); + } else { + // All other tools are sharing the same size + return drawThickness(); + } +} + +// DEFAULTS + +QString ConfigHandler::filenamePatternDefault() +{ + return QStringLiteral("%F_%H-%M"); +} + +void ConfigHandler::setDefaultSettings() +{ + for (const auto& key : m_settings.allKeys()) { + if (isShortcut(key)) { + // Do not reset Shortcuts + continue; + } + m_settings.remove(key); + } + m_settings.sync(); +} + +QString ConfigHandler::configFilePath() const +{ + return m_settings.fileName(); +} + +// GENERIC GETTERS AND SETTERS + +bool ConfigHandler::setShortcut(const QString& actionName, + const QString& shortcut) +{ + qDebug() << actionName; + static QVector reservedShortcuts = { +#if defined(Q_OS_MACOS) + Qt::CTRL | Qt::Key_Backspace, + Qt::Key_Escape, +#else + Qt::Key_Backspace, + Qt::Key_Escape, +#endif + }; + + if (hasError()) { + return false; + } + + bool errorFlag = false; + + m_settings.beginGroup(CONFIG_GROUP_SHORTCUTS); + if (shortcut.isEmpty()) { + setValue(actionName, ""); + } else if (reservedShortcuts.contains(QKeySequence(shortcut))) { + // do not allow to set reserved shortcuts + errorFlag = true; + } else { + errorFlag = false; + // Make no difference for Return and Enter keys + QString newShortcut = KeySequence().value(shortcut).toString(); + for (auto& otherAction : m_settings.allKeys()) { + if (actionName == otherAction) { + continue; + } + QString existingShortcut = + KeySequence().value(m_settings.value(otherAction)).toString(); + if (newShortcut == existingShortcut) { + errorFlag = true; + goto done; + } + } + m_settings.setValue(actionName, KeySequence().value(shortcut)); + } +done: + m_settings.endGroup(); + return !errorFlag; +} + +QString ConfigHandler::shortcut(const QString& actionName) +{ + QString setting = CONFIG_GROUP_SHORTCUTS "/" + actionName; + QString shortcut = value(setting).toString(); + if (!m_settings.contains(setting)) { + // The action uses a shortcut that is a flameshot default + // (not set explicitly by user) + m_settings.beginGroup(CONFIG_GROUP_SHORTCUTS); + for (auto& otherAction : m_settings.allKeys()) { + if (m_settings.value(otherAction) == shortcut) { + // We found an explicit shortcut - it will take precedence + m_settings.endGroup(); + return {}; + } + } + m_settings.endGroup(); + } + return shortcut; +} + +void ConfigHandler::setValue(const QString& key, const QVariant& value) +{ + assertKeyRecognized(key); + if (!hasError()) { + // don't let the file watcher initiate another error check + m_skipNextErrorCheck = true; + auto val = valueHandler(key)->representation(value); + m_settings.setValue(key, val); + } +} + +QVariant ConfigHandler::value(const QString& key) const +{ + assertKeyRecognized(key); + + auto val = m_settings.value(key); + + auto handler = valueHandler(key); + + // Check the value for semantic errors + if (val.isValid() && !handler->check(val)) { + setErrorState(true); + } + if (m_hasError) { + return handler->fallback(); + } + + return handler->value(val); +} + +void ConfigHandler::remove(const QString& key) +{ + m_settings.remove(key); +} + +void ConfigHandler::resetValue(const QString& key) +{ + m_settings.setValue(key, valueHandler(key)->fallback()); +} + +QSet& ConfigHandler::recognizedGeneralOptions() +{ + auto keys = ::recognizedGeneralOptions.keys(); + static QSet options = QSet(keys.begin(), keys.end()); + return options; +} + +QSet& ConfigHandler::recognizedShortcutNames() +{ + auto keys = recognizedShortcuts.keys(); + static QSet names = QSet(keys.begin(), keys.end()); + return names; +} + +/** + * @brief Return keys from group `group`. + * Use CONFIG_GROUP_GENERAL (General) for general settings. + */ +QSet ConfigHandler::keysFromGroup(const QString& group) const +{ + QSet keys; + for (const QString& key : m_settings.allKeys()) { + if (group == CONFIG_GROUP_GENERAL && !key.contains('/')) { + keys.insert(key); + } else if (key.startsWith(group + "/")) { + keys.insert(baseName(key)); + } + } + return keys; +} + +// ERROR HANDLING + +bool ConfigHandler::checkForErrors(AbstractLogger* log) const +{ + return checkUnrecognizedSettings(log) && checkShortcutConflicts(log) && + checkSemantics(log); +} + +/** + * @brief Parse the config to find settings with unrecognized names. + * @return Whether the config passes this check. + * + * @note An unrecognized option is one that is not included in + * `recognizedGeneralOptions` or `recognizedShortcutNames` depending on the + * group the option belongs to. + */ +bool ConfigHandler::checkUnrecognizedSettings(AbstractLogger* log, + QList* offenders) const +{ + // sort the config keys by group + QSet generalKeys = keysFromGroup(CONFIG_GROUP_GENERAL), + shortcutKeys = keysFromGroup(CONFIG_GROUP_SHORTCUTS), + recognizedGeneralKeys = recognizedGeneralOptions(), + recognizedShortcutKeys = recognizedShortcutNames(); + + // subtract recognized keys + generalKeys.subtract(recognizedGeneralKeys); + shortcutKeys.subtract(recognizedShortcutKeys); + + // what is left are the unrecognized keys - hopefully empty + bool ok = generalKeys.isEmpty() && shortcutKeys.isEmpty(); + if (log != nullptr || offenders != nullptr) { + for (const QString& key : generalKeys) { + if (log) { + *log << tr("Unrecognized setting: '%1'\n").arg(key); + } + if (offenders) { + offenders->append(key); + } + } + for (const QString& key : shortcutKeys) { + if (log) { + *log << tr("Unrecognized shortcut name: '%1'.\n").arg(key); + } + if (offenders) { + offenders->append(CONFIG_GROUP_SHORTCUTS "/" + key); + } + } + } + return ok; +} + +/** + * @brief Check if there are multiple actions with the same shortcut. + * @return Whether the config passes this check. + * + * @note It is not considered a conflict if action A uses shortcut S because it + * is the flameshot default (not because the user explicitly configured it), and + * action B uses the same shortcut. + */ +bool ConfigHandler::checkShortcutConflicts(AbstractLogger* log) const +{ + bool ok = true; + m_settings.beginGroup(CONFIG_GROUP_SHORTCUTS); + QStringList shortcuts = m_settings.allKeys(); + QStringList reportedInLog; + for (auto key1 = shortcuts.begin(); key1 != shortcuts.end(); ++key1) { + for (auto key2 = key1 + 1; key2 != shortcuts.end(); ++key2) { + // values stored in variables are useful when running debugger + QString value1 = m_settings.value(*key1).toString(), + value2 = m_settings.value(*key2).toString(); + // The check will pass if: + // - one shortcut is empty (the action doesn't use a shortcut) + // - or one of the settings is not found in m_settings, i.e. + // user wants to use flameshot's default shortcut for the action + // - or the shortcuts for both actions are different + if (!(value1.isEmpty() || !m_settings.contains(*key1) || + !m_settings.contains(*key2) || value1 != value2)) { + ok = false; + if (log == nullptr) { + break; + } else if (!reportedInLog.contains(*key1) && // No duplicate + !reportedInLog.contains(*key2)) { // log entries + reportedInLog.append(*key1); + reportedInLog.append(*key2); + *log << tr("Shortcut conflict: '%1' and '%2' " + "have the same shortcut: %3\n") + .arg(*key1, *key2, value1); + } + } + } + } + m_settings.endGroup(); + return ok; +} + +/** + * @brief Check each config value semantically. + * @param log Destination for error log output. + * @param offenders Destination for the semantically invalid keys. + * @return Whether the config passes this check. + */ +bool ConfigHandler::checkSemantics(AbstractLogger* log, + QList* offenders) const +{ + QStringList allKeys = m_settings.allKeys(); + bool ok = true; + for (const QString& key : allKeys) { + // Test if the key is recognized + if (!recognizedGeneralOptions().contains(key) && + (!isShortcut(key) || + !recognizedShortcutNames().contains(baseName(key)))) { + continue; + } + QVariant val = m_settings.value(key); + auto valueHandler = this->valueHandler(key); + if (val.isValid() && !valueHandler->check(val)) { + // Key does not pass the check + ok = false; + if (log == nullptr && offenders == nullptr) { + break; + } + if (log != nullptr) { + *log << tr("Bad value in '%1'. Expected: %2\n") + .arg(key, valueHandler->expected()); + } + if (offenders != nullptr) { + offenders->append(key); + } + } + } + return ok; +} + +/** + * @brief Parse the configuration to find any errors in it. + * + * If the error state changes as a result of the check, it will perform the + * appropriate action, e.g. notify the user. + * + * @see ConfigHandler::setErrorState for all the actions. + */ +void ConfigHandler::checkAndHandleError() const +{ + if (!QFile(m_settings.fileName()).exists()) { + setErrorState(false); + } else { + setErrorState(!checkForErrors()); + } + + ensureFileWatched(); +} + +/** + * @brief Update the tracked error state of the config. + * @param error The new error state. + * + * The error state is tracked so that signals are not emitted and the user is + * not spammed every time the config file changes. Instead, only changes in + * error state get reported. + */ +void ConfigHandler::setErrorState(bool error) const +{ + bool hadError = m_hasError; + m_hasError = error; + // Notify user every time m_hasError changes + if (!hadError && m_hasError) { + QString msg = errorMessage(); + AbstractLogger::error() << msg; + emit getInstance()->error(); + } else if (hadError && !m_hasError) { + auto msg = + tr("You have successfully resolved the configuration error."); + AbstractLogger::info() << msg; + emit getInstance()->errorResolved(); + } +} + +/** + * @brief Return if the config contains an error. + * + * If an error check is due, it will be performed. + */ +bool ConfigHandler::hasError() const +{ + if (m_errorCheckPending) { + checkAndHandleError(); + m_errorCheckPending = false; + } + return m_hasError; +} + +/// Error message that can be used by other classes as well +QString ConfigHandler::errorMessage() const +{ + return tr( + "The configuration contains an error. Open configuration to resolve."); +} + +void ConfigHandler::ensureFileWatched() const +{ + QFile file(m_settings.fileName()); + if (!file.exists()) { + file.open(QFileDevice::WriteOnly); + file.close(); + } + if (m_configWatcher != nullptr && m_configWatcher->files().isEmpty() && + qApp != nullptr // ensures that the organization name can be accessed + ) { + m_configWatcher->addPath(m_settings.fileName()); + } +} + +/** + * @brief Obtain a `ValueHandler` for the config option with the given key. + * @return Smart pointer to the handler. + * + * @note If the key is from the CONFIG_GROUP_GENERAL (General) group, the + * `recognizedGeneralOptions` map is looked up. If it is from + * CONFIG_GROUP_SHORTCUTS (Shortcuts), a generic `KeySequence` value handler is + * returned. + */ +QSharedPointer ConfigHandler::valueHandler( + const QString& key) const +{ + QSharedPointer handler; + if (isShortcut(key)) { + handler = recognizedShortcuts.value( + baseName(key), QSharedPointer(new KeySequence())); + } else { // General group + handler = ::recognizedGeneralOptions.value(key); + } + return handler; +} + +/** + * This is used so that we can check if there is a mismatch between a config key + * and its getter function. + * Debug: throw an exception; Release: set error state + */ +void ConfigHandler::assertKeyRecognized(const QString& key) const +{ + bool recognized = isShortcut(key) + ? recognizedShortcutNames().contains(baseName(key)) + : ::recognizedGeneralOptions.contains(key); + if (!recognized) { +#if defined(QT_DEBUG) + // This should never happen, but just in case + throw std::logic_error( + tr("Bad config key '%1' in ConfigHandler. Please report " + "this as a bug.") + .arg(key) + .toStdString()); +#else + setErrorState(true); +#endif + } +} + +bool ConfigHandler::isShortcut(const QString& key) const +{ + return m_settings.group() == QStringLiteral(CONFIG_GROUP_SHORTCUTS) || + key.startsWith(QStringLiteral(CONFIG_GROUP_SHORTCUTS "/")); +} + +QString ConfigHandler::baseName(const QString& key) const +{ + return QFileInfo(key).baseName(); +} + +// STATIC MEMBER DEFINITIONS + +bool ConfigHandler::m_hasError = false; +bool ConfigHandler::m_errorCheckPending = true; +bool ConfigHandler::m_skipNextErrorCheck = false; + +QSharedPointer ConfigHandler::m_configWatcher; diff --git a/src/utils/confighandler.h b/src/utils/confighandler.h new file mode 100644 index 0000000..ecc9566 --- /dev/null +++ b/src/utils/confighandler.h @@ -0,0 +1,199 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/widgets/capture/capturetoolbutton.h" +#include +#include +#include +#include + +#define CONFIG_GROUP_GENERAL "General" +#define CONFIG_GROUP_SHORTCUTS "Shortcuts" + +class QFileSystemWatcher; +class ValueHandler; +template +class QSharedPointer; +class QTextStream; +class AbstractLogger; + +/** + * Declare and implement a getter for a config option. `KEY` is the option key + * as it appears in the config file, `TYPE` is the C++ type. At the same time + * `KEY` is the name of the generated getter function. + */ +// clang-format off +#define CONFIG_GETTER(KEY, TYPE) \ + TYPE KEY() \ + { \ + return value(QStringLiteral(#KEY)).value(); \ + } +// clang-format on + +/** + * Declare and implement a setter for a config option. `FUNC` is the name of the + * generated function, `KEY` is the option key as it appears in the config file + * and `TYPE` is the C++ type. + */ +#define CONFIG_SETTER(FUNC, KEY, TYPE) \ + void FUNC(const TYPE& val) \ + { \ + QString key = QStringLiteral(#KEY); \ + /* Without this check, multiple `flameshot gui` instances running */ \ + /* simultaneously would cause an endless loop of fileWatcher calls */ \ + if (QVariant::fromValue(val) != value(key)) { \ + setValue(key, QVariant::fromValue(val)); \ + } \ + } + +/** + * Combines the functionality of `CONFIG_GETTER` and `CONFIG_SETTER`. `GETFUNC` + * is simultaneously the name of the getter function and the option key as it + * appears in the config file. `SETFUNC` is the name of the setter function. + * `TYPE` is the C++ type of the value. + */ +#define CONFIG_GETTER_SETTER(GETFUNC, SETFUNC, TYPE) \ + CONFIG_GETTER(GETFUNC, TYPE) \ + CONFIG_SETTER(SETFUNC, GETFUNC, TYPE) + +class ConfigHandler : public QObject +{ + Q_OBJECT + +public: + explicit ConfigHandler(); + + static ConfigHandler* getInstance(); + + // Definitions of getters and setters for config options + // Some special cases are implemented regularly, without the macro + // NOTE: When adding new options, make sure to add an entry in + // recognizedGeneralOptions in the cpp file. + CONFIG_GETTER_SETTER(userColors, setUserColors, QVector); + CONFIG_GETTER_SETTER(savePath, setSavePath, QString) + CONFIG_GETTER_SETTER(savePathFixed, setSavePathFixed, bool) + CONFIG_GETTER_SETTER(uiLanguage, setUiLanguage, QString) + CONFIG_GETTER_SETTER(uiColor, setUiColor, QColor) + CONFIG_GETTER_SETTER(contrastUiColor, setContrastUiColor, QColor) + CONFIG_GETTER_SETTER(drawColor, setDrawColor, QColor) + CONFIG_GETTER_SETTER(predefinedColorPaletteLarge, + setPredefinedColorPaletteLarge, + bool) + CONFIG_GETTER_SETTER(fontFamily, setFontFamily, QString) + CONFIG_GETTER_SETTER(showHelp, setShowHelp, bool) + CONFIG_GETTER_SETTER(showSidePanelButton, setShowSidePanelButton, bool) + CONFIG_GETTER_SETTER(showDesktopNotification, + setShowDesktopNotification, + bool) + CONFIG_GETTER_SETTER(showAbortNotification, setShowAbortNotification, bool) + CONFIG_GETTER_SETTER(filenamePattern, setFilenamePattern, QString) + CONFIG_GETTER_SETTER(disabledTrayIcon, setDisabledTrayIcon, bool) + CONFIG_GETTER_SETTER(useGrimAdapter, useGrimAdapter, bool) + CONFIG_GETTER_SETTER(disabledGrimWarning, disabledGrimWarning, bool) + CONFIG_GETTER_SETTER(drawThickness, setDrawThickness, int) + CONFIG_GETTER_SETTER(drawFontSize, setDrawFontSize, int) + CONFIG_GETTER_SETTER(drawCircleCounterSize, setDrawCircleCounterSize, int) + CONFIG_GETTER_SETTER(drawPixelateSize, setDrawPixelateSize, int) + CONFIG_GETTER_SETTER(drawRectangleSize, setDrawRectangleSize, int) + CONFIG_GETTER_SETTER(drawMarkerSize, setDrawMarkerSize, int) + CONFIG_GETTER_SETTER(keepOpenAppLauncher, setKeepOpenAppLauncher, bool) +#if !defined(DISABLE_UPDATE_CHECKER) + CONFIG_GETTER_SETTER(checkForUpdates, setCheckForUpdates, bool) +#endif + CONFIG_GETTER_SETTER(allowMultipleGuiInstances, + setAllowMultipleGuiInstances, + bool) + CONFIG_GETTER_SETTER(autoCloseIdleDaemon, setAutoCloseIdleDaemon, bool) + CONFIG_GETTER_SETTER(showStartupLaunchMessage, + setShowStartupLaunchMessage, + bool) + CONFIG_GETTER_SETTER(showQuitPrompt, setShowQuitPrompt, bool) + CONFIG_GETTER_SETTER(contrastOpacity, setContrastOpacity, int) + CONFIG_GETTER_SETTER(copyURLAfterUpload, setCopyURLAfterUpload, bool) + CONFIG_GETTER_SETTER(historyConfirmationToDelete, + setHistoryConfirmationToDelete, + bool) + CONFIG_GETTER_SETTER(uploadHistoryMax, setUploadHistoryMax, int) + CONFIG_GETTER_SETTER(saveAfterCopy, setSaveAfterCopy, bool) + CONFIG_GETTER_SETTER(copyPathAfterSave, setCopyPathAfterSave, bool) + CONFIG_GETTER_SETTER(saveAsFileExtension, setSaveAsFileExtension, QString) + CONFIG_GETTER_SETTER(antialiasingPinZoom, setAntialiasingPinZoom, bool) + CONFIG_GETTER_SETTER(useJpgForClipboard, setUseJpgForClipboard, bool) + CONFIG_GETTER_SETTER(uploadWithoutConfirmation, + setUploadWithoutConfirmation, + bool) + CONFIG_GETTER_SETTER(ignoreUpdateToVersion, + setIgnoreUpdateToVersion, + QString) + CONFIG_GETTER_SETTER(undoLimit, setUndoLimit, int) + CONFIG_GETTER_SETTER(buttons, setButtons, QList) + CONFIG_GETTER_SETTER(showMagnifier, setShowMagnifier, bool) + CONFIG_GETTER_SETTER(squareMagnifier, setSquareMagnifier, bool) + CONFIG_GETTER_SETTER(copyOnDoubleClick, setCopyOnDoubleClick, bool) + CONFIG_GETTER_SETTER(uploadClientSecret, setUploadClientSecret, QString) + CONFIG_GETTER_SETTER(saveLastRegion, setSaveLastRegion, bool) + CONFIG_GETTER_SETTER(showSelectionGeometry, setShowSelectionGeometry, int) + CONFIG_GETTER_SETTER(jpegQuality, setJpegQuality, int) + CONFIG_GETTER_SETTER(reverseArrow, setReverseArrow, bool) + CONFIG_GETTER_SETTER(insecurePixelate, setInsecurePixelate, bool) + CONFIG_GETTER_SETTER(showSelectionGeometryHideTime, + showSelectionGeometryHideTime, + int) + + // SPECIAL CASES + bool startupLaunch(); + void setStartupLaunch(const bool); + void setAllTheButtons(); + void setToolSize(CaptureTool::Type toolType, int size); + int toolSize(CaptureTool::Type toolType); + + // DEFAULTS + QString filenamePatternDefault(); + void setDefaultSettings(); + QString configFilePath() const; + + // GENERIC GETTERS AND SETTERS + bool setShortcut(const QString& actionName, const QString& shortcut); + QString shortcut(const QString& actionName); + void setValue(const QString& key, const QVariant& value); + QVariant value(const QString& key) const; + void remove(const QString& key); + void resetValue(const QString& key); + + // INFO + static QSet& recognizedGeneralOptions(); + static QSet& recognizedShortcutNames(); + QSet keysFromGroup(const QString& group) const; + + // ERROR HANDLING + bool checkForErrors(AbstractLogger* log = nullptr) const; + bool checkUnrecognizedSettings(AbstractLogger* log = nullptr, + QList* offenders = nullptr) const; + bool checkShortcutConflicts(AbstractLogger* log = nullptr) const; + bool checkSemantics(AbstractLogger* log = nullptr, + QList* offenders = nullptr) const; + void checkAndHandleError() const; + void setErrorState(bool error) const; + bool hasError() const; + QString errorMessage() const; + +signals: + void error() const; + void errorResolved() const; + void fileChanged() const; + +private: + mutable QSettings m_settings; + + static bool m_hasError, m_errorCheckPending, m_skipNextErrorCheck; + static QSharedPointer m_configWatcher; + + void ensureFileWatched() const; + QSharedPointer valueHandler(const QString& key) const; + void assertKeyRecognized(const QString& key) const; + bool isShortcut(const QString& key) const; + QString baseName(const QString& key) const; + void cleanUnusedKeys(const QString& group, const QSet& keys) const; +}; diff --git a/src/utils/desktopfileparse.cpp b/src/utils/desktopfileparse.cpp new file mode 100644 index 0000000..71c70f7 --- /dev/null +++ b/src/utils/desktopfileparse.cpp @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "desktopfileparse.h" +#include +#include +#include +#include +#include + +DesktopFileParser::DesktopFileParser() +{ + QString locale = QLocale().name(); + QString localeShort = QLocale().name().left(2); + m_localeName = QStringLiteral("Name[%1]").arg(locale); + m_localeDescription = QStringLiteral("Comment[%1]").arg(locale); + m_localeNameShort = QStringLiteral("Name[%1]").arg(localeShort); + m_localeDescriptionShort = QStringLiteral("Comment[%1]").arg(localeShort); + m_defaultIcon = + QIcon::fromTheme(QStringLiteral("application-x-executable")); +} + +DesktopAppData DesktopFileParser::parseDesktopFile(const QString& fileName, + bool& ok) const +{ + DesktopAppData res; + ok = true; + QFile file(fileName); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + ok = false; + return res; + } + bool nameLocaleSet = false; + bool descriptionLocaleSet = false; + bool isApplication = false; + bool isService = false; + QTextStream in(&file); + // enter the desktop entry definition + while (!in.atEnd() && in.readLine() != QLatin1String("[Desktop Entry]")) { + } + // start parsing + while (!in.atEnd()) { + QString line = in.readLine(); + if (line.startsWith(QLatin1String("Icon"))) { + res.icon = QIcon::fromTheme( + line.mid(line.indexOf(QLatin1String("=")) + 1).trimmed(), + m_defaultIcon); + } else if (!nameLocaleSet && line.startsWith(QLatin1String("Name"))) { + if (line.startsWith(m_localeName) || + line.startsWith(m_localeNameShort)) { + res.name = + line.mid(line.indexOf(QLatin1String("=")) + 1).trimmed(); + nameLocaleSet = true; + } else if (line.startsWith(QLatin1String("Name="))) { + res.name = + line.mid(line.indexOf(QLatin1String("=")) + 1).trimmed(); + } + } else if (!descriptionLocaleSet && + line.startsWith(QLatin1String("Comment"))) { + if (line.startsWith(m_localeDescription) || + line.startsWith(m_localeDescriptionShort)) { + res.description = + line.mid(line.indexOf(QLatin1String("=")) + 1).trimmed(); + descriptionLocaleSet = true; + } else if (line.startsWith(QLatin1String("Comment="))) { + res.description = + line.mid(line.indexOf(QLatin1String("=")) + 1).trimmed(); + } + } else if (line.startsWith(QLatin1String("Exec"))) { + if (line.contains(QLatin1String("%"))) { + res.exec = + line.mid(line.indexOf(QLatin1String("=")) + 1).trimmed(); + } else { + ok = false; + break; + } + } else if (line.startsWith(QLatin1String("Type"))) { + if (line.contains(QLatin1String("Application"))) { + isApplication = true; + } + if (line.contains(QLatin1String("Service"))) { + isService = true; + } + } else if (line.startsWith(QLatin1String("Categories"))) { + res.categories = line.mid(line.indexOf(QLatin1String("=")) + 1) + .split(QStringLiteral(";")); + } else if (line == QLatin1String("NoDisplay=true")) { + ok = false; + break; + } else if (line == QLatin1String("Terminal=true")) { + res.showInTerminal = true; + } + // ignore the other entries + else if (line.startsWith(QLatin1String("["))) { + break; + } + } + file.close(); + if (res.exec.isEmpty() || res.name.isEmpty() || + (!isApplication && !isService)) { + ok = false; + } + return res; +} + +int DesktopFileParser::processDirectory(const QDir& dir) +{ + // Note that + // https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html + // says files must end in .desktop or .directory + // So filtering by .desktop stops us reading things like editor backups + // .kdelnk is long deprecated + QStringList entries = + dir.entryList({ "*.desktop" }, QDir::NoDotAndDotDot | QDir::Files); + bool ok; + int length = m_appList.length(); + for (const QString& file : entries) { + DesktopAppData app = parseDesktopFile(dir.absoluteFilePath(file), ok); + if (ok) { + m_appList.append(app); + } + } + return m_appList.length() - length; +} + +QVector DesktopFileParser::getAppsByCategory( + const QString& category) +{ + QVector res; + for (const DesktopAppData& app : std::as_const(m_appList)) { + if (app.categories.contains(category)) { + res.append(app); + } + } + return res; +} + +QMap> DesktopFileParser::getAppsByCategory( + const QStringList& categories) +{ + QMap> res; + for (const DesktopAppData& app : std::as_const(m_appList)) { + for (const QString& category : categories) { + if (app.categories.contains(category)) { + res[category].append(app); + } + } + } + return res; +} diff --git a/src/utils/desktopfileparse.h b/src/utils/desktopfileparse.h new file mode 100644 index 0000000..b10eba9 --- /dev/null +++ b/src/utils/desktopfileparse.h @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include +#include +#include + +class QDir; +class QString; +class QTextStream; + +struct DesktopAppData +{ + DesktopAppData() + : showInTerminal() + {} + + DesktopAppData(const QString& name, + const QString& description, + const QString& exec, + QIcon icon) + : name(name) + , description(description) + , exec(exec) + , icon(icon) + , showInTerminal(false) + {} + + bool operator==(const DesktopAppData& other) const + { + return name == other.name; + } + + QString name; + QString description; + QString exec; + QStringList categories; + QIcon icon; + bool showInTerminal; +}; + +struct DesktopFileParser +{ + DesktopFileParser(); + DesktopAppData parseDesktopFile(const QString& fileName, bool& ok) const; + int processDirectory(const QDir& dir); + + QVector getAppsByCategory(const QString& category); + QMap> getAppsByCategory( + const QStringList& categories); + +private: + QString m_localeName; + QString m_localeDescription; + QString m_localeNameShort; + QString m_localeDescriptionShort; + + QIcon m_defaultIcon; + QVector m_appList; +}; diff --git a/src/utils/desktopinfo.cpp b/src/utils/desktopinfo.cpp new file mode 100644 index 0000000..cad77ea --- /dev/null +++ b/src/utils/desktopinfo.cpp @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "desktopinfo.h" +#include + +DesktopInfo::DesktopInfo() +{ + auto e = QProcessEnvironment::systemEnvironment(); + XDG_CURRENT_DESKTOP = e.value(QStringLiteral("XDG_CURRENT_DESKTOP")); + XDG_SESSION_TYPE = e.value(QStringLiteral("XDG_SESSION_TYPE")); + WAYLAND_DISPLAY = e.value(QStringLiteral("WAYLAND_DISPLAY")); + KDE_FULL_SESSION = e.value(QStringLiteral("KDE_FULL_SESSION")); + GNOME_DESKTOP_SESSION_ID = + e.value(QStringLiteral("GNOME_DESKTOP_SESSION_ID")); + DESKTOP_SESSION = e.value(QStringLiteral("DESKTOP_SESSION")); +} + +bool DesktopInfo::waylandDetected() +{ + return XDG_SESSION_TYPE == QLatin1String("wayland") || + WAYLAND_DISPLAY.contains(QLatin1String("wayland"), + Qt::CaseInsensitive); +} + +DesktopInfo::WM DesktopInfo::windowManager() +{ + DesktopInfo::WM res = DesktopInfo::OTHER; + QStringList desktops = XDG_CURRENT_DESKTOP.split(QChar(':')); + for (auto& desktop : desktops) { + if (desktop.contains(QLatin1String("GNOME"), Qt::CaseInsensitive)) { + return DesktopInfo::GNOME; + } + if (desktop.contains(QLatin1String("qtile"), Qt::CaseInsensitive)) { + return DesktopInfo::QTILE; + } + if (desktop.contains(QLatin1String("sway"), Qt::CaseInsensitive) || + desktop.contains(QLatin1String("river"), Qt::CaseInsensitive)) { + return DesktopInfo::WLROOTS; + } + if (desktop.contains(QLatin1String("Hyprland"), Qt::CaseInsensitive)) { + return DesktopInfo::HYPRLAND; + } + if (desktop.contains(QLatin1String("kde-plasma"))) { + return DesktopInfo::KDE; + } + if (desktop.contains(QLatin1String("cosmic"))) { + return DesktopInfo::COSMIC; + } + } + + if (!GNOME_DESKTOP_SESSION_ID.isEmpty()) { + return DesktopInfo::GNOME; + } + + if (!KDE_FULL_SESSION.isEmpty()) { + return DesktopInfo::KDE; + } + + return res; +} diff --git a/src/utils/desktopinfo.h b/src/utils/desktopinfo.h new file mode 100644 index 0000000..db0c5b0 --- /dev/null +++ b/src/utils/desktopinfo.h @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include + +class DesktopInfo +{ +public: + DesktopInfo(); + + enum WM + { + GNOME, + KDE, + COSMIC, + OTHER, + QTILE, + WLROOTS, + HYPRLAND + }; + + bool waylandDetected(); + WM windowManager(); + +private: + QString XDG_CURRENT_DESKTOP; + QString XDG_SESSION_TYPE; + QString WAYLAND_DISPLAY; + QString KDE_FULL_SESSION; + QString GNOME_DESKTOP_SESSION_ID; + QString GDMSESSION; + QString DESKTOP_SESSION; +}; diff --git a/src/utils/filenamehandler.cpp b/src/utils/filenamehandler.cpp new file mode 100644 index 0000000..dd68a55 --- /dev/null +++ b/src/utils/filenamehandler.cpp @@ -0,0 +1,130 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "filenamehandler.h" +#include "abstractlogger.h" +#include "src/utils/confighandler.h" +#include "src/utils/strfparse.h" +#include +#include +#include +#include + +FileNameHandler::FileNameHandler(QObject* parent) + : QObject(parent) +{ + auto err = AbstractLogger::error(AbstractLogger::Stderr); + try { + std::locale::global(std::locale()); + } catch (std::exception&) { + err << "Locales on your system are not properly configured. Falling " + "back to defaults"; + + std::locale::global(std::locale("en_US.UTF-8")); + } +} + +QString FileNameHandler::parsedPattern() +{ + return parseFilename(ConfigHandler().filenamePattern()); +} + +QString FileNameHandler::parseFilename(const QString& name) +{ + QString res = name; + if (name.isEmpty()) { + res = ConfigHandler().filenamePatternDefault(); + } + + // remove trailing characters '%' in the pattern + while (res.endsWith('%')) { + res.chop(1); + } + + res = + QString::fromStdString(strfparse::format_time_string(name.toStdString())); + + // add the parsed pattern in a correct format for the filesystem + res = res.replace(QLatin1String("/"), QStringLiteral("⁄")) + .replace(QLatin1String(":"), QLatin1String("-")); + return res; +} + +/** + * @brief Generate a valid destination path from the possibly incomplete `path`. + * The input `path` can be one of: + * - empty string + * - an existing directory + * - a file in an existing directory + * In each case, the output path will be an absolute path to a file with a + * suffix matching the specified `format`. + * @note + * - If `path` points to a directory, the file name will be generated from the + * formatted file name from the user configuration + * - If `path` points to a file, its suffix will be changed to match `format` + * - If `format` is not given, the suffix will remain untouched, unless `path` + * has no suffix, in which case it will be given the "png" suffix + * - If the path generated by the previous steps points to an existing file, + * "_NUM" will be appended to its base name, where NUM is the first + * available number that produces a non-existent path (starting from 1). + * @param path Possibly incomplete file name to transform + * @param format Desired output file suffix (excluding an initial '.' character) + */ +QString FileNameHandler::properScreenshotPath(QString path, + const QString& format) +{ + QFileInfo info(path); + QString suffix = info.suffix(); + + if (info.isDir()) { + // path is a directory => generate filename from configured pattern + path = QDir(QDir(path).absolutePath() + "/" + parsedPattern()).path(); + } else { + // path points to a file => strip it of its suffix for now + path = QDir(info.dir().absolutePath() + "/" + info.completeBaseName()) + .path(); + } + + if (!format.isEmpty()) { + // Override suffix to match format + path += "." + format; + } else if (!suffix.isEmpty()) { + // Leave the suffix as it was + path += "." + suffix; + } else { + path += ".png"; + } + + if (!QFileInfo::exists(path)) { + return path; + } else { + return autoNumerateDuplicate(path); + } +} + +QString FileNameHandler::autoNumerateDuplicate(const QString& path) +{ + // add numeration in case of repeated filename in the directory + // find unused name adding _n where n is a number + QFileInfo checkFile(path); + QString directory = checkFile.dir().absolutePath(), + filename = checkFile.completeBaseName(), + suffix = checkFile.suffix(); + if (!suffix.isEmpty()) { + suffix = QStringLiteral(".") + suffix; + } + if (checkFile.exists()) { + filename += QLatin1String("_"); + int i = 1; + while (true) { + checkFile.setFile(directory + "/" + filename + QString::number(i) + + suffix); + if (!checkFile.exists()) { + filename += QString::number(i); + break; + } + ++i; + } + } + return checkFile.filePath(); +} diff --git a/src/utils/filenamehandler.h b/src/utils/filenamehandler.h new file mode 100644 index 0000000..88c720e --- /dev/null +++ b/src/utils/filenamehandler.h @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include + +class FileNameHandler : public QObject +{ + Q_OBJECT +public: + explicit FileNameHandler(QObject* parent = nullptr); + + QString parsedPattern(); + QString parseFilename(const QString& name); + + QString properScreenshotPath(QString filename, + const QString& format = QString()); + + static const int MAX_CHARACTERS = 70; + +private: + QString autoNumerateDuplicate(const QString& path); +}; diff --git a/src/utils/globalvalues.cpp b/src/utils/globalvalues.cpp new file mode 100644 index 0000000..af485d7 --- /dev/null +++ b/src/utils/globalvalues.cpp @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "globalvalues.h" +#include +#include + +#if defined(Q_OS_MACOS) +#include +#endif + +int GlobalValues::buttonBaseSize() +{ + return QFontMetrics(qApp->font()).lineSpacing() * 2.2; +} + +QString GlobalValues::versionInfo() +{ + return QStringLiteral("Flameshot " APP_VERSION " (" FLAMESHOT_GIT_HASH ")" + "\nCompiled with Qt " QT_VERSION_STR); +} + +QString GlobalValues::iconPath() +{ +#if USE_MONOCHROME_ICON + return QString(":img/app/flameshot.monochrome.svg"); +#else + return { ":img/app/flameshot.svg" }; +#endif +} + +QString GlobalValues::iconPathPNG() +{ +#if USE_MONOCHROME_ICON + return QString(":img/app/flameshot.monochrome.png"); +#else + return { ":img/app/flameshot.png" }; +#endif +} + +QString GlobalValues::trayIconPath() +{ +#if USE_MONOCHROME_ICON +#if defined(Q_OS_MACOS) + auto currentMacOsVersion = QOperatingSystemVersion::current(); + if (currentMacOsVersion >= QOperatingSystemVersion::MacOSBigSur) { + return { ":img/app/flameshot.mask.png" }; + } else { + return { ":img/app/flameshot.monochrome.png" }; + } +#else + return { ":img/app/flameshot.monochrome.png" }; +#endif +#else + return { ":img/app/flameshot.png" }; +#endif +} diff --git a/src/utils/globalvalues.h b/src/utils/globalvalues.h new file mode 100644 index 0000000..aaf2bef --- /dev/null +++ b/src/utils/globalvalues.h @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +class QString; + +namespace GlobalValues { + +int buttonBaseSize(); +QString versionInfo(); +QString iconPath(); +QString iconPathPNG(); +QString trayIconPath(); +} diff --git a/src/utils/history.cpp b/src/utils/history.cpp new file mode 100644 index 0000000..877e619 --- /dev/null +++ b/src/utils/history.cpp @@ -0,0 +1,118 @@ +#include "history.h" +#include "src/utils/confighandler.h" +#include +#include +#include +#include + +History::History() +{ + // Get cache history path + ConfigHandler config; +#ifdef Q_OS_WIN + m_historyPath = QDir::homePath() + "/AppData/Roaming/flameshot/history/"; +#else + QString cachepath = QProcessEnvironment::systemEnvironment().value( + "XDG_CACHE_HOME", QDir::homePath() + "/.cache"); + m_historyPath = cachepath + "/flameshot/history/"; +#endif + + // Check if directory for history exists and create if doesn't + QDir dir = QDir(m_historyPath); + if (!dir.exists()) { + dir.mkpath("."); + } +} + +const QString& History::path() +{ + return m_historyPath; +} + +void History::save(const QPixmap& pixmap, const QString& fileName) +{ + // scale preview only in local disk + QPixmap pixmapScaled = QPixmap(pixmap); + if (pixmap.height() / HISTORYPIXMAP_MAX_PREVIEW_HEIGHT >= + pixmap.width() / HISTORYPIXMAP_MAX_PREVIEW_WIDTH) { + pixmapScaled = pixmap.scaledToHeight(HISTORYPIXMAP_MAX_PREVIEW_HEIGHT, + Qt::SmoothTransformation); + } else { + pixmapScaled = pixmap.scaledToWidth(HISTORYPIXMAP_MAX_PREVIEW_WIDTH, + Qt::SmoothTransformation); + } + + // save preview + QFile file(path() + fileName); + file.open(QIODevice::WriteOnly); + pixmapScaled.save(&file, "PNG"); + + history(); +} + +const QList& History::history() +{ + QDir directory(path()); + QStringList images = directory.entryList(QStringList() << "*.png" + << "*.PNG", + QDir::Files, + QDir::Time); + int cnt = 0; + int max = ConfigHandler().uploadHistoryMax(); + m_thumbs.clear(); + for (const auto& fileName : images) { + if (++cnt <= max) { + m_thumbs.append(fileName); + } else { + QFile file(path() + fileName); + file.remove(); + } + } + return m_thumbs; +} + +const HistoryFileName& History::unpackFileName(const QString& fileNamePacked) +{ + int nPathIndex = fileNamePacked.lastIndexOf("/"); + QStringList unpackedFileName; + if (nPathIndex == -1) { + unpackedFileName = fileNamePacked.split("-"); + } else { + unpackedFileName = fileNamePacked.mid(nPathIndex + 1).split("-"); + } + + switch (unpackedFileName.length()) { + case 3: + m_unpackedFileName.file = unpackedFileName[2]; + m_unpackedFileName.token = unpackedFileName[1]; + m_unpackedFileName.type = unpackedFileName[0]; + break; + case 2: + m_unpackedFileName.file = unpackedFileName[1]; + m_unpackedFileName.token = ""; + m_unpackedFileName.type = unpackedFileName[0]; + break; + default: + m_unpackedFileName.file = unpackedFileName[0]; + m_unpackedFileName.token = ""; + m_unpackedFileName.type = ""; + break; + } + return m_unpackedFileName; +} + +const QString& History::packFileName(const QString& storageType, + const QString& deleteToken, + const QString& fileName) +{ + m_packedFileName = fileName; + if (storageType.length() > 0) { + if (deleteToken.length() > 0) { + m_packedFileName = + storageType + "-" + deleteToken + "-" + m_packedFileName; + } else { + m_packedFileName = storageType + "-" + m_packedFileName; + } + } + return m_packedFileName; +} diff --git a/src/utils/history.h b/src/utils/history.h new file mode 100644 index 0000000..74d20c1 --- /dev/null +++ b/src/utils/history.h @@ -0,0 +1,39 @@ +#ifndef HISTORY_H +#define HISTORY_H + +#define HISTORYPIXMAP_MAX_PREVIEW_WIDTH 250 +#define HISTORYPIXMAP_MAX_PREVIEW_HEIGHT 100 + +#include +#include +#include + +struct HistoryFileName +{ + QString file; + QString token; + QString type; +}; + +class History +{ +public: + History(); + + void save(const QPixmap&, const QString&); + const QList& history(); + const QString& path(); + + const HistoryFileName& unpackFileName(const QString&); + const QString& packFileName(const QString&, const QString&, const QString&); + +private: + QString m_historyPath; + QList m_thumbs; + + // temporary variables + QString m_packedFileName; + HistoryFileName m_unpackedFileName; +}; + +#endif // HISTORY_H diff --git a/src/utils/pathinfo.cpp b/src/utils/pathinfo.cpp new file mode 100644 index 0000000..ea3faf6 --- /dev/null +++ b/src/utils/pathinfo.cpp @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "pathinfo.h" +#include +#include +#include + +const QString PathInfo::whiteIconPath() +{ + return QStringLiteral(":/img/material/white/"); +} + +const QString PathInfo::blackIconPath() +{ + return QStringLiteral(":/img/material/black/"); +} + +QStringList PathInfo::translationsPaths() +{ + QString binaryPath = + QFileInfo(qApp->applicationDirPath()).absoluteFilePath(); + QString trPath = QDir::toNativeSeparators(binaryPath + "/translations"); +#if defined(Q_OS_LINUX) || defined(Q_OS_UNIX) + return QStringList() + << QStringLiteral(APP_PREFIX) + "/share/flameshot/translations" + << trPath << QStringLiteral("/usr/share/flameshot/translations") + << QStringLiteral("/usr/local/share/flameshot/translations"); +#endif + return QStringList() << trPath; +} diff --git a/src/utils/pathinfo.h b/src/utils/pathinfo.h new file mode 100644 index 0000000..02e015d --- /dev/null +++ b/src/utils/pathinfo.h @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include + +namespace PathInfo { // namespace + +const QString whiteIconPath(); + +const QString blackIconPath(); + +QStringList translationsPaths(); + +} // namespace diff --git a/src/utils/request.cpp b/src/utils/request.cpp new file mode 100644 index 0000000..81ecbd4 --- /dev/null +++ b/src/utils/request.cpp @@ -0,0 +1,22 @@ +// +// Created by nullobsi on 2021/02/01. +// +/* + * Implementation of interface class OrgFreedesktopPortalRequestInterface + */ + +#include "request.h" +OrgFreedesktopPortalRequestInterface::OrgFreedesktopPortalRequestInterface( + const QString& service, + const QString& path, + const QDBusConnection& connection, + QObject* parent) + : QDBusAbstractInterface(service, + path, + staticInterfaceName(), + connection, + parent) +{} + +OrgFreedesktopPortalRequestInterface::~OrgFreedesktopPortalRequestInterface() = + default; diff --git a/src/utils/request.h b/src/utils/request.h new file mode 100644 index 0000000..64f6ac6 --- /dev/null +++ b/src/utils/request.h @@ -0,0 +1,60 @@ +/* + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -p response.cpp resp.xml + * + * qdbusxml2cpp is Copyright (C) 2020 The Qt Company Ltd. + * + * This is an auto-generated file. + * Do not edit! All changes made to it will be lost. + */ + +#ifndef RESPONSE_CPP +#define RESPONSE_CPP +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Proxy class for interface org.freedesktop.portal.Request + */ +class OrgFreedesktopPortalRequestInterface : public QDBusAbstractInterface +{ + Q_OBJECT +public: + static inline const char* staticInterfaceName() + { + return "org.freedesktop.portal.Request"; + } + +public: + OrgFreedesktopPortalRequestInterface(const QString& service, + const QString& path, + const QDBusConnection& connection, + QObject* parent = nullptr); + + ~OrgFreedesktopPortalRequestInterface(); + +public Q_SLOTS: // METHODS + inline QDBusPendingReply<> Close() + { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("Close"), argumentList); + } + +Q_SIGNALS: // SIGNALS + void Response(uint response, QVariantMap results); +}; + +namespace org { +namespace freedesktop { +namespace portal { +typedef ::OrgFreedesktopPortalRequestInterface Request; +} +} +} +#endif diff --git a/src/utils/screengrabber.cpp b/src/utils/screengrabber.cpp new file mode 100644 index 0000000..6f33dd5 --- /dev/null +++ b/src/utils/screengrabber.cpp @@ -0,0 +1,294 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "screengrabber.h" +#include "abstractlogger.h" +#include "src/core/qguiappcurrentscreen.h" +#include "src/utils/confighandler.h" +#include "src/utils/filenamehandler.h" +#include "src/utils/systemnotification.h" +#include +#include +#include +#include +#include + +#if !(defined(Q_OS_MACOS) || defined(Q_OS_WIN)) +#include "request.h" +#include +#include +#include +#include +#include +#endif + +ScreenGrabber::ScreenGrabber(QObject* parent) + : QObject(parent) +{} + +void ScreenGrabber::generalGrimScreenshot(bool& ok, QPixmap& res) +{ +#if !(defined(Q_OS_MACOS) || defined(Q_OS_WIN)) + if (!ConfigHandler().useGrimAdapter()) { + return; + } + + QString runDir = + QProcessEnvironment::systemEnvironment().value("XDG_RUNTIME_DIR"); + QString imgPath = runDir + "/flameshot.ppm"; + QProcess Process; + QString program = "grim"; + QStringList arguments; + arguments << "-t" + << "ppm" << imgPath; + Process.start(program, arguments); + if (Process.waitForFinished()) { + res.load(imgPath, "ppm"); + QFile imgFile(imgPath); + imgFile.remove(); + ok = true; + } else { + ok = false; + AbstractLogger::error() + << tr("The universal wayland screen capture adapter requires Grim as " + "the screen capture component of wayland. If the screen " + "capture component is missing, please install it!"); + } +#endif +} + +void ScreenGrabber::freeDesktopPortal(bool& ok, QPixmap& res) +{ + +#if !(defined(Q_OS_MACOS) || defined(Q_OS_WIN)) + QDBusInterface screenshotInterface( + QStringLiteral("org.freedesktop.portal.Desktop"), + QStringLiteral("/org/freedesktop/portal/desktop"), + QStringLiteral("org.freedesktop.portal.Screenshot")); + + // unique token + QString token = + QUuid::createUuid().toString().remove('-').remove('{').remove('}'); + + // premake interface + auto* request = new OrgFreedesktopPortalRequestInterface( + QStringLiteral("org.freedesktop.portal.Desktop"), + "/org/freedesktop/portal/desktop/request/" + + QDBusConnection::sessionBus().baseService().remove(':').replace('.', + '_') + + "/" + token, + QDBusConnection::sessionBus(), + this); + + QEventLoop loop; + const auto gotSignal = [&res, &loop, this](uint status, + const QVariantMap& map) { + if (status == 0) { + // Parse this as URI to handle unicode properly + QUrl uri = map.value("uri").toString(); + QString uriString = uri.toLocalFile(); + res = QPixmap(uriString); + + // we calculate an approximated physical desktop geometry based on + // dpr(provided by qt), we calculate the logical desktop geometry + // later, this is the accurate size, more info: + // https://bugreports.qt.io/browse/QTBUG-135612 + QRect approxPhysGeo = desktopGeometry(); + QRect logicalGeo = logicalDesktopGeometry(); + if (res.size() == + approxPhysGeo.size()) // which means the res is physical size + // and the dpr is correct. + { + res.setDevicePixelRatio(qApp->devicePixelRatio()); + } else if (res.size() == + logicalGeo.size()) // which means the res is logical size + // and we need to do nothing. + { + // No action needed + } else // which means the res is physical size and the dpr is not + // correct. + { + res.setDevicePixelRatio(res.height() * 1.0f / + logicalGeo.height()); + } + QFile imgFile(uriString); + imgFile.remove(); + } + loop.quit(); + }; + + // prevent racy situations and listen before calling screenshot + QMetaObject::Connection conn = QObject::connect( + request, &org::freedesktop::portal::Request::Response, gotSignal); + + screenshotInterface.call( + QStringLiteral("Screenshot"), + "", + QMap({ { "handle_token", QVariant(token) }, + { "interactive", QVariant(false) } })); + + loop.exec(); + QObject::disconnect(conn); + request->Close().waitForFinished(); + request->deleteLater(); + + if (res.isNull()) { + ok = false; + } +#endif +} + +QPixmap ScreenGrabber::grabEntireDesktop(bool& ok) +{ + ok = true; + int wid = 0; + +#if defined(Q_OS_MACOS) + QScreen* currentScreen = QGuiAppCurrentScreen().currentScreen(); + QPixmap screenPixmap( + currentScreen->grabWindow(wid, + currentScreen->geometry().x(), + currentScreen->geometry().y(), + currentScreen->geometry().width(), + currentScreen->geometry().height())); + screenPixmap.setDevicePixelRatio(currentScreen->devicePixelRatio()); + return screenPixmap; +#elif defined(Q_OS_LINUX) || defined(Q_OS_UNIX) + if (m_info.waylandDetected()) { + QPixmap res; + // handle screenshot based on DE + switch (m_info.windowManager()) { + case DesktopInfo::GNOME: + case DesktopInfo::KDE: + freeDesktopPortal(ok, res); + break; + case DesktopInfo::QTILE: + case DesktopInfo::WLROOTS: + case DesktopInfo::HYPRLAND: + case DesktopInfo::OTHER: { + if (!ConfigHandler().useGrimAdapter()) { + if (!ConfigHandler().disabledGrimWarning()) { + AbstractLogger::warning() << tr( + "If the useGrimAdapter setting is not enabled, the " + "dbus protocol will be used. It should be noted that " + "using the dbus protocol under wayland is not " + "recommended. It is recommended to enable the " + "useGrimAdapter setting in flameshot.ini to activate " + "the grim-based general wayland screenshot adapter"); + } + freeDesktopPortal(ok, res); + } else { + if (!ConfigHandler().disabledGrimWarning()) { + AbstractLogger::warning() << tr( + "grim's screenshot component is implemented based on " + "wlroots, it may not be used in GNOME or similar " + "desktop environments"); + } + generalGrimScreenshot(ok, res); + } + break; + } + default: + ok = false; + AbstractLogger::error() + << tr("Unable to detect desktop environment (GNOME? KDE? " + "Qile? Sway? ...)"); + AbstractLogger::error() + << tr("Hint: try setting the XDG_CURRENT_DESKTOP environment " + "variable."); + break; + } + if (!ok) { + AbstractLogger::error() << tr("Unable to capture screen"); + } + return res; + } +#endif +#if defined(Q_OS_LINUX) || defined(Q_OS_UNIX) || defined(Q_OS_WIN) + QRect geometry = desktopGeometry(); + + // Qt6 fix: Create a composite image from all screens to handle + // multi-monitor setups where screens have different positions/heights. + // This fixes the dual monitor offset bug and handles edge cases where + // the desktop bounding box includes virtual space. + QScreen* primaryScreen = QGuiApplication::primaryScreen(); + QRect r = primaryScreen->geometry(); + QPixmap desktop(geometry.size()); + desktop.fill(Qt::black); // Fill with black background + desktop = + primaryScreen->grabWindow(wid, + -r.x() / primaryScreen->devicePixelRatio(), + -r.y() / primaryScreen->devicePixelRatio(), + geometry.width(), + geometry.height()); + return desktop; +#endif +} + +QRect ScreenGrabber::screenGeometry(QScreen* screen) +{ + QRect geometry; + if (m_info.waylandDetected()) { + QPoint topLeft(0, 0); +#ifdef Q_OS_WIN + for (QScreen* const screen : QGuiApplication::screens()) { + QPoint topLeftScreen = screen->geometry().topLeft(); + if (topLeft.x() > topLeftScreen.x() || + topLeft.y() > topLeftScreen.y()) { + topLeft = topLeftScreen; + } + } +#endif + geometry = screen->geometry(); + geometry.moveTo(geometry.topLeft() - topLeft); + } else { + QScreen* currentScreen = QGuiAppCurrentScreen().currentScreen(); + geometry = currentScreen->geometry(); + } + return geometry; +} + +QPixmap ScreenGrabber::grabScreen(QScreen* screen, bool& ok) +{ + QPixmap p; + QRect geometry = screenGeometry(screen); + if (m_info.waylandDetected()) { + p = grabEntireDesktop(ok); + if (ok) { + return p.copy(geometry); + } + } else { + ok = true; + return screen->grabWindow( + 0, geometry.x(), geometry.y(), geometry.width(), geometry.height()); + } + return p; +} + +QRect ScreenGrabber::desktopGeometry() +{ + QRect geometry; + + for (QScreen* const screen : QGuiApplication::screens()) { + QRect scrRect = screen->geometry(); + // Qt6 fix: Don't divide by devicePixelRatio for multi-monitor setups + // This was causing coordinate offset issues in dual monitor + // configurations + // But it still has a screen position in real pixels, not logical ones + qreal dpr = screen->devicePixelRatio(); + scrRect.moveTo(QPointF(scrRect.x() / dpr, scrRect.y() / dpr).toPoint()); + geometry = geometry.united(scrRect); + } + return geometry; +} + +QRect ScreenGrabber::logicalDesktopGeometry() +{ + QRect geometry; + for (QScreen* const screen : QGuiApplication::screens()) { + QRect scrRect = screen->geometry(); + scrRect.moveTo(scrRect.x(), scrRect.y()); + geometry = geometry.united(scrRect); + } + return geometry; +} diff --git a/src/utils/screengrabber.h b/src/utils/screengrabber.h new file mode 100644 index 0000000..c1e6eeb --- /dev/null +++ b/src/utils/screengrabber.h @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/utils/desktopinfo.h" +#include +#include + +class ScreenGrabber : public QObject +{ + Q_OBJECT +public: + explicit ScreenGrabber(QObject* parent = nullptr); + QPixmap grabEntireDesktop(bool& ok); + QRect screenGeometry(QScreen* screen); + QPixmap grabScreen(QScreen* screenNumber, bool& ok); + void freeDesktopPortal(bool& ok, QPixmap& res); + void generalGrimScreenshot(bool& ok, QPixmap& res); + QRect desktopGeometry(); + QRect logicalDesktopGeometry(); + +private: + DesktopInfo m_info; +}; diff --git a/src/utils/screenshotsaver.cpp b/src/utils/screenshotsaver.cpp new file mode 100644 index 0000000..b67dad9 --- /dev/null +++ b/src/utils/screenshotsaver.cpp @@ -0,0 +1,292 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "screenshotsaver.h" +#include "abstractlogger.h" +#include "src/core/flameshot.h" +#include "src/core/flameshotdaemon.h" +#include "src/utils/confighandler.h" +#include "src/utils/filenamehandler.h" +#include "src/utils/globalvalues.h" +#include "utils/desktopinfo.h" + +#include +#include +#include +#include +#include +#include + +#if USE_WAYLAND_CLIPBOARD +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if defined(Q_OS_MACOS) +#include "src/widgets/capture/capturewidget.h" +#endif + +bool saveToFilesystem(const QPixmap& capture, + const QString& path, + const QString& messagePrefix) +{ + QString completePath = FileNameHandler().properScreenshotPath( + path, ConfigHandler().saveAsFileExtension()); + QFile file{ completePath }; + file.open(QIODevice::WriteOnly); + + bool okay; + QString saveExtension; + saveExtension = QFileInfo(completePath).suffix().toLower(); + if (saveExtension == "jpg" || saveExtension == "jpeg") { + okay = capture.save(&file, nullptr, ConfigHandler().jpegQuality()); + } else { + okay = capture.save(&file); + } + + QString saveMessage = messagePrefix; + QString notificationPath = completePath; + if (!saveMessage.isEmpty()) { + saveMessage += " "; + } + + if (okay) { + saveMessage += QObject::tr("Capture saved as ") + completePath; + AbstractLogger::info().attachNotificationPath(notificationPath) + << saveMessage; + } else { + saveMessage += QObject::tr("Error trying to save as ") + completePath; + if (file.error() != QFile::NoError) { + saveMessage += ": " + file.errorString(); + } + notificationPath = ""; + AbstractLogger::error().attachNotificationPath(notificationPath) + << saveMessage; + } + + return okay; +} + +QString ShowSaveFileDialog(const QString& title, const QString& directory) +{ + QFileDialog dialog(nullptr, title, directory); + dialog.setAcceptMode(QFileDialog::AcceptSave); + + // Build string list of supported image formats + QStringList mimeTypeList; + for (const auto& mimeType : QImageWriter::supportedMimeTypes()) { + // image/heif has several aliases and they cause glitch in save dialog + // It is necessary to keep the image/heif (otherwise HEIF plug-in from + // kimageformats will not work) but the aliases could be filtered out. + if (mimeType != "image/heic" && mimeType != "image/heic-sequence" && + mimeType != "image/heif-sequence") { + mimeTypeList.append(mimeType); + } + } + dialog.setMimeTypeFilters(mimeTypeList); + + QString suffix = ConfigHandler().saveAsFileExtension(); + if (suffix.isEmpty()) { + suffix = "png"; + } + QString defaultMimeType = + QMimeDatabase().mimeTypeForFile("image." + suffix).name(); + dialog.selectMimeTypeFilter(defaultMimeType); + dialog.setDefaultSuffix(suffix); + if (dialog.exec() == QDialog::Accepted) { + return dialog.selectedFiles().constFirst(); + } else { + return {}; + } +} + +void saveJpegToClipboardMacOS(const QPixmap& capture) +{ + // Convert QPixmap to JPEG data + QByteArray jpegData; + QBuffer buffer(&jpegData); + buffer.open(QIODevice::WriteOnly); + + QImageWriter imageWriter(&buffer, "jpeg"); + + // Set JPEG quality to whatever is in settings + imageWriter.setQuality(ConfigHandler().jpegQuality()); + if (!imageWriter.write(capture.toImage())) { + qWarning() << "Failed to write image to JPEG format."; + return; + } + + // Save JPEG data to a temporary file + QTemporaryFile tempFile; + if (!tempFile.open()) { + qWarning() << "Failed to open temporary file for writing."; + return; + } + tempFile.write(jpegData); + tempFile.close(); + + // Use osascript to copy the contents of the file to clipboard + QProcess process; + QString script = + QString("set the clipboard to (read (POSIX file \"%1\") as «class PNGf»)") + .arg(tempFile.fileName()); + process.start("osascript", QStringList() << "-e" << script); + if (!process.waitForFinished()) { + qWarning() << "Failed to execute AppleScript."; + } + + // Clean up + tempFile.remove(); +} + +void saveToClipboardMime(const QPixmap& capture, const QString& imageType) +{ + QByteArray array; + QBuffer buffer{ &array }; + QImageWriter imageWriter{ &buffer, imageType.toUpper().toUtf8() }; + if (imageType == "jpeg") { + imageWriter.setQuality(ConfigHandler().jpegQuality()); + } + imageWriter.write(capture.toImage()); + + QPixmap formattedPixmap; + bool isLoaded = + formattedPixmap.loadFromData(reinterpret_cast(array.data()), + array.size(), + imageType.toUpper().toUtf8()); + if (isLoaded) { + + auto* mimeData = new QMimeData(); + +#ifdef USE_WAYLAND_CLIPBOARD + mimeData->setImageData(formattedPixmap.toImage()); + mimeData->setData(QStringLiteral("x-kde-force-image-copy"), + QByteArray()); + KSystemClipboard::instance()->setMimeData(mimeData, + QClipboard::Clipboard); +#else + mimeData->setData("image/" + imageType, array); + QApplication::clipboard()->setMimeData(mimeData); +#endif + + } else { + AbstractLogger::error() + << QObject::tr("Error while saving to clipboard"); + } +} + +// If data is saved to the clipboard before the notification is sent via +// dbus, the application freezes. +void saveToClipboard(const QPixmap& capture) +{ + // If we are able to properly save the file, save the file and copy to + // clipboard. + if ((ConfigHandler().saveAfterCopy()) && + (!ConfigHandler().savePath().isEmpty())) { + saveToFilesystem(capture, + ConfigHandler().savePath(), + QObject::tr("Capture saved to clipboard.")); + } else { + AbstractLogger() << QObject::tr("Capture saved to clipboard."); + } + if (ConfigHandler().useJpgForClipboard()) { +#ifdef Q_OS_MAC + saveJpegToClipboardMacOS(capture); +#else + saveToClipboardMime(capture, "jpeg"); +#endif + } else { + // Need to send message before copying to clipboard +#if defined(Q_OS_LINUX) || defined(Q_OS_UNIX) + if (DesktopInfo().waylandDetected()) { + saveToClipboardMime(capture, "png"); + } else { + QApplication::clipboard()->setPixmap(capture); + } +#else + QApplication::clipboard()->setPixmap(capture); +#endif + } +} + +bool saveToFilesystemGUI(const QPixmap& capture) +{ + bool okay = false; + ConfigHandler config; + QString defaultSavePath = ConfigHandler().savePath(); + if (defaultSavePath.isEmpty() || !QDir(defaultSavePath).exists() || + !QFileInfo(defaultSavePath).isWritable()) { + defaultSavePath = + QStandardPaths::writableLocation(QStandardPaths::PicturesLocation); + } + QString savePath = FileNameHandler().properScreenshotPath( + defaultSavePath, ConfigHandler().saveAsFileExtension()); +#if defined(Q_OS_MACOS) + for (QWidget* widget : qApp->topLevelWidgets()) { + QString className(widget->metaObject()->className()); + if (0 == + className.compare(CaptureWidget::staticMetaObject.className())) { + widget->showNormal(); + widget->hide(); + break; + } + } +#endif + if (!config.savePathFixed()) { + savePath = ShowSaveFileDialog(QObject::tr("Save screenshot"), savePath); + } + if (savePath == "") { + return okay; + } + + QFile file{ savePath }; + file.open(QIODevice::WriteOnly); + + QString saveExtension; + saveExtension = QFileInfo(savePath).suffix().toLower(); + if (saveExtension == "jpg" || saveExtension == "jpeg") { + okay = capture.save(&file, nullptr, ConfigHandler().jpegQuality()); + } else { + okay = capture.save(&file); + } + + if (okay) { + // Don't use QDir::separator() here, as Qt internally always uses '/' + QString pathNoFile = savePath.left(savePath.lastIndexOf('/')); + + ConfigHandler().setSavePath(pathNoFile); + + QString msg = QObject::tr("Capture saved as ") + savePath; + AbstractLogger().attachNotificationPath(savePath) << msg; + + if (config.copyPathAfterSave()) { +#ifdef Q_OS_WIN + savePath.replace('/', '\\'); +#endif + FlameshotDaemon::copyToClipboard( + savePath, QObject::tr("Path copied to clipboard as ") + savePath); + } + + } else { + QString msg = QObject::tr("Error trying to save as ") + savePath; + + if (file.error() != QFile::NoError) { + msg += ": " + file.errorString(); + } + + QMessageBox saveErrBox( + QMessageBox::Warning, QObject::tr("Save Error"), msg); + saveErrBox.setWindowIcon(QIcon(GlobalValues::iconPath())); + saveErrBox.exec(); + } + + return okay; +} diff --git a/src/utils/screenshotsaver.h b/src/utils/screenshotsaver.h new file mode 100644 index 0000000..9face34 --- /dev/null +++ b/src/utils/screenshotsaver.h @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include + +class QPixmap; + +bool saveToFilesystem(const QPixmap& capture, + const QString& path, + const QString& messagePrefix = ""); +QString ShowSaveFileDialog(const QString& title, const QString& directory); +void saveToClipboardMime(const QPixmap& capture, const QString& imageType); +void saveToClipboard(const QPixmap& capture); +bool saveToFilesystemGUI(const QPixmap& capture); diff --git a/src/utils/strfparse.cpp b/src/utils/strfparse.cpp new file mode 100644 index 0000000..a1ba49a --- /dev/null +++ b/src/utils/strfparse.cpp @@ -0,0 +1,108 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2021 Jeremy Borgman + +#include "strfparse.h" + +namespace strfparse { +std::vector split(std::string const& s, char delimiter) +{ + std::vector tokens; + std::string token; + std::istringstream tokenStream(s); + while (std::getline(tokenStream, token, delimiter)) { + tokens.push_back(token); + } + return tokens; +} + +std::vector create_specifier_list() +{ + + std::vector allowed_specifier{ 'Y', 'H', 'a', 'A', 'b', 'B', 'c', 'C', + 'd', 'D', 'e', 'F', 'g', 'G', 'h', 'H', + 'I', 'j', 'm', 'M', 'n', 'p', 'r', 'R', + 'S', 't', 'T', 'u', 'U', 'V', 'w', 'W', + 'x', 'X', 'y', 'Y', 'z', 'Z' }; + return allowed_specifier; +} + +std::string replace_all(std::string input, + std::string const& to_find, + std::string const& to_replace) +{ + size_t pos = 0; + while ((pos = input.find(to_find, pos)) != std::string::npos) { + input.replace(pos, to_find.length(), to_replace); + pos += to_replace.length(); + } + + return input; +} + +std::vector match_specifiers(std::string const& specifier, + std::vector allowed_specifier) +{ + + std::vector spec_list; + + for (size_t i = 0; i < specifier.size() - 1; i++) { + if (specifier[i] == '%') { + spec_list.push_back(specifier[i + 1]); + } + } + + std::sort(spec_list.begin(), spec_list.end()); + std::sort(allowed_specifier.begin(), allowed_specifier.end()); + + std::vector overlap; + std::set_intersection(spec_list.begin(), + spec_list.end(), + allowed_specifier.begin(), + allowed_specifier.end(), + back_inserter(overlap)); + + return overlap; +} + +std::string format_time_string(std::string const& specifier) +{ + + if (specifier.empty()) { + return ""; + } + + std::time_t t = std::time(nullptr); + char buff[100]; + + auto allowed_specifier = create_specifier_list(); + + auto overlap = match_specifiers(specifier, allowed_specifier); + + // Create "Safe" string for strftime which is the specfiers delimited by * + std::string lookup_string; + for (auto const& e : overlap) { + lookup_string.push_back('%'); + lookup_string.push_back(e); + lookup_string.push_back('*'); + } + + std::strftime( + buff, sizeof(buff), lookup_string.c_str(), std::localtime(&t)); + + std::map lookup_table; + auto result = split(buff, '*'); + + for (size_t i = 0; i < result.size(); i++) { + lookup_table.emplace(std::make_pair(overlap[i], result[i])); + } + + // Sub into original string + std::string delim = "%"; + auto output_string = specifier; + for (auto const& row : lookup_table) { + auto to_find = delim + row.first; + output_string = replace_all(output_string, to_find, row.second); + } + return output_string; +} +} diff --git a/src/utils/strfparse.h b/src/utils/strfparse.h new file mode 100644 index 0000000..d7533b0 --- /dev/null +++ b/src/utils/strfparse.h @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2021 Jeremy Borgman + +#include +#include +#include +#include +#include + +namespace strfparse { +std::vector split(std::string const& s, char delimiter); + +std::vector create_specifier_list(); + +std::string replace_all(std::string input, + std::string const& to_find, + std::string const& to_replace); + +std::vector match_specifiers(std::string const& specifier, + std::vector allowed_specifier); + +std::string format_time_string(std::string const& specifier); +} diff --git a/src/utils/systemnotification.cpp b/src/utils/systemnotification.cpp new file mode 100644 index 0000000..d4bf8e4 --- /dev/null +++ b/src/utils/systemnotification.cpp @@ -0,0 +1,86 @@ +#include "systemnotification.h" +#include "src/core/flameshot.h" +#include "src/utils/confighandler.h" +#include +#include + +#if !(defined(Q_OS_MACOS) || defined(Q_OS_WIN)) +#include +#include +#include +#else +#include "src/core/flameshotdaemon.h" +#endif + +// work-around for snap, which cannot install icons into +// the system folder, so instead the absolute path to the +// icon (saved somewhere in /snap/flameshot/...) is passed +#ifndef FLAMESHOT_ICON +#define FLAMESHOT_ICON "flameshot" +#endif + +SystemNotification::SystemNotification(QObject* parent) + : QObject(parent) + , m_interface(nullptr) +{ +#if !(defined(Q_OS_MACOS) || defined(Q_OS_WIN)) + if (!ConfigHandler().showDesktopNotification()) { + return; + } + m_interface = + new QDBusInterface(QStringLiteral("org.freedesktop.Notifications"), + QStringLiteral("/org/freedesktop/Notifications"), + QStringLiteral("org.freedesktop.Notifications"), + QDBusConnection::sessionBus(), + this); +#endif +} + +void SystemNotification::sendMessage(const QString& text, + const QString& savePath) +{ + sendMessage(text, tr("Flameshot Info"), savePath); +} + +void SystemNotification::sendMessage(const QString& text, + const QString& title, + const QString& savePath, + const int timeout) +{ + if (!ConfigHandler().showDesktopNotification()) { + return; + } + +#if defined(Q_OS_MACOS) || defined(Q_OS_WIN) + QMetaObject::invokeMethod( + this, + [&]() { + // The call is queued to avoid recursive static initialization of + // Flameshot and ConfigHandler. + if (FlameshotDaemon::instance()) + FlameshotDaemon::instance()->sendTrayNotification( + text, title, timeout); + }, + Qt::QueuedConnection); +#else + QList args; + QVariantMap hintsMap; + if (!savePath.isEmpty()) { + QUrl fullPath = QUrl::fromLocalFile(savePath); + // allows the notification to be dragged and dropped + hintsMap[QStringLiteral("x-kde-urls")] = + QStringList({ fullPath.toString() }); + } + + args << (qAppName()) // appname + << static_cast(0) // id + << FLAMESHOT_ICON // icon + << title // summary + << text // body + << QStringList() // actions + << hintsMap // hints + << timeout; // timeout + m_interface->callWithArgumentList( + QDBus::AutoDetect, QStringLiteral("Notify"), args); +#endif +} diff --git a/src/utils/systemnotification.h b/src/utils/systemnotification.h new file mode 100644 index 0000000..51eb65b --- /dev/null +++ b/src/utils/systemnotification.h @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include + +class QDBusInterface; + +class SystemNotification : public QObject +{ + Q_OBJECT +public: + explicit SystemNotification(QObject* parent = nullptr); + + void sendMessage(const QString& text, const QString& savePath = {}); + + void sendMessage(const QString& text, + const QString& title, + const QString& savePath, + const int timeout = 5000); + +private: + QDBusInterface* m_interface; +}; diff --git a/src/utils/valuehandler.cpp b/src/utils/valuehandler.cpp new file mode 100644 index 0000000..99c2bbe --- /dev/null +++ b/src/utils/valuehandler.cpp @@ -0,0 +1,580 @@ +#include "valuehandler.h" +#include "capturetool.h" +#include "colorpickerwidget.h" +#include "confighandler.h" +#include "screengrabber.h" +#include +#include +#include +#include +#include +#include +#include +#include + +// VALUE HANDLER + +QVariant ValueHandler::value(const QVariant& val) +{ + if (!val.isValid() || !check(val)) { + return fallback(); + } else { + return process(val); + } +} + +QVariant ValueHandler::fallback() +{ + return {}; +} + +QVariant ValueHandler::representation(const QVariant& val) +{ + return val.toString(); +} + +QString ValueHandler::expected() +{ + return {}; +} + +QVariant ValueHandler::process(const QVariant& val) +{ + return val; +} + +// BOOL + +Bool::Bool(bool def) + : m_def(def) +{} + +bool Bool::check(const QVariant& val) +{ + QString str = val.toString(); + if (str != "true" && str != "false") { + return false; + } + return true; +} + +QVariant Bool::fallback() +{ + return m_def; +} + +QString Bool::expected() +{ + return QStringLiteral("true or false"); +} + +// STRING + +String::String(QString def) + : m_def(std::move(def)) +{} + +bool String::check(const QVariant&) +{ + return true; +} + +QVariant String::fallback() +{ + return m_def; +} + +QString String::expected() +{ + return QStringLiteral("string"); +} + +// COLOR + +Color::Color(QColor def) + : m_def(std::move(def)) +{} + +bool Color::check(const QVariant& val) +{ + QString str = val.toString(); +#if QT_VERSION < QT_VERSION_CHECK(6, 4, 0) + bool validColor = QColor::isValidColor(str); +#else + bool validColor = QColor::isValidColorName(str); +#endif + // Disable #RGB, #RRRGGGBBB and #RRRRGGGGBBBB formats that QColor supports + return validColor && + (str[0] != '#' || + (str.length() != 4 && str.length() != 10 && str.length() != 13)); +} + +QVariant Color::process(const QVariant& val) +{ + QString str = val.toString(); + QColor color(str); + if (str.length() == 9 && str[0] == '#') { + // Convert #RRGGBBAA (flameshot) to #AARRGGBB (QColor) + int blue = color.blue(); + color.setBlue(color.green()); + color.setGreen(color.red()); + color.setRed(color.alpha()); + color.setAlpha(blue); + } + return color; +} + +QVariant Color::fallback() +{ + return m_def; +} + +QVariant Color::representation(const QVariant& val) +{ + QString str = val.toString(); + QColor color(str); + if (str.length() == 9 && str[0] == '#') { + // Convert #AARRGGBB (QColor) to #RRGGBBAA (flameshot) + int alpha = color.alpha(); + color.setAlpha(color.red()); + color.setRed(color.green()); + color.setGreen(color.blue()); + color.setBlue(alpha); + } + return color.name(); +} + +QString Color::expected() +{ + return QStringLiteral("color name or hex value"); +} + +// BOUNDED INT + +BoundedInt::BoundedInt(int min, int max, int def) + : m_min(min) + , m_max(max) + , m_def(def) +{} + +bool BoundedInt::check(const QVariant& val) +{ + QString str = val.toString(); + bool conversionOk; + int num = str.toInt(&conversionOk); + return conversionOk && m_min <= num && num <= m_max; +} + +QVariant BoundedInt::fallback() +{ + return m_def; +} + +QString BoundedInt::expected() +{ + return QStringLiteral("number between %1 and %2").arg(m_min, m_max); +} + +// LOWER BOUNDED INT + +LowerBoundedInt::LowerBoundedInt(int min, int def) + : m_min(min) + , m_def(def) +{} + +bool LowerBoundedInt::check(const QVariant& val) +{ + QString str = val.toString(); + bool conversionOk; + int num = str.toInt(&conversionOk); + return conversionOk && num >= m_min; +} + +QVariant LowerBoundedInt::fallback() +{ + return m_def; +} + +QString LowerBoundedInt::expected() +{ + return QStringLiteral("number >= %1").arg(m_min); +} + +// KEY SEQUENCE + +KeySequence::KeySequence(const QKeySequence& fallback) + : m_fallback(fallback) +{} + +bool KeySequence::check(const QVariant& val) +{ + QString str = val.toString(); + if (!str.isEmpty() && QKeySequence(str).toString().isEmpty()) { + return false; + } + return true; +} + +QVariant KeySequence::fallback() +{ + return process(m_fallback); +} + +QString KeySequence::expected() +{ + return QStringLiteral("keyboard shortcut"); +} + +QVariant KeySequence::representation(const QVariant& val) +{ + QString str(val.toString()); + if (QKeySequence(str) == QKeySequence(Qt::Key_Return)) { + return QStringLiteral("Enter"); + } + return str; +} + +QVariant KeySequence::process(const QVariant& val) +{ + QString str(val.toString()); + if (str == "Enter") { + return QKeySequence(Qt::Key_Return).toString(); + } + if (str.length() > 0) { + // Make the "main" key in sequence (last one) lower-case. + str[str.length() - 1] = str[str.length() - 1].toLower(); + } + return str; +} + +// EXISTING DIR + +bool ExistingDir::check(const QVariant& val) +{ + if (!val.canConvert() || val.toString().isEmpty()) { + return false; + } + QFileInfo info(val.toString()); + return info.isDir() && info.exists(); +} + +QVariant ExistingDir::fallback() +{ + using SP = QStandardPaths; + for (auto location : + { SP::PicturesLocation, SP::HomeLocation, SP::TempLocation }) { + QString path = SP::writableLocation(location); + if (QFileInfo(path).isDir()) { + return path; + } + } + return {}; +} + +QString ExistingDir::expected() +{ + return QStringLiteral("existing directory"); +} + +// FILENAME PATTERN + +bool FilenamePattern::check(const QVariant&) +{ + return true; +} + +QVariant FilenamePattern::fallback() +{ + return ConfigHandler().filenamePatternDefault(); +} + +QVariant FilenamePattern::process(const QVariant& val) +{ + QString str = val.toString(); + return !str.isEmpty() ? val : fallback(); +} + +QString FilenamePattern::expected() +{ + return QStringLiteral("please edit using the GUI"); +} + +// BUTTON LIST + +using BType = CaptureTool::Type; +using BList = QList; + +bool ButtonList::check(const QVariant& val) +{ + // TODO stop using CTB + using CTB = CaptureToolButton; + auto allButtons = CTB::getIterableButtonTypes(); + for (int btn : val.value>()) { + if (!allButtons.contains(static_cast(btn))) { + return false; + } + } + return true; +} + +// Helper +void sortButtons(BList& buttons) +{ + std::sort(buttons.begin(), buttons.end(), [](BType a, BType b) { + return CaptureToolButton::getPriorityByButton(a) < + CaptureToolButton::getPriorityByButton(b); + }); +} + +QVariant ButtonList::process(const QVariant& val) +{ + auto intButtons = val.value>(); + auto buttons = ButtonList::fromIntList(intButtons); + sortButtons(buttons); + return QVariant::fromValue(buttons); +} + +QVariant ButtonList::fallback() +{ + auto buttons = CaptureToolButton::getIterableButtonTypes(); + buttons.removeOne(CaptureTool::TYPE_SIZEDECREASE); + buttons.removeOne(CaptureTool::TYPE_SIZEINCREASE); + sortButtons(buttons); + return QVariant::fromValue(buttons); +} + +QVariant ButtonList::representation(const QVariant& val) +{ + auto intList = toIntList(val.value()); + normalizeButtons(intList); + return QVariant::fromValue(intList); +} + +QString ButtonList::expected() +{ + return QStringLiteral("please don't edit by hand"); +} + +QList ButtonList::fromIntList(const QList& l) +{ + QList buttons; + buttons.reserve(l.size()); + for (auto const i : l) { + buttons << static_cast(i); + } + return buttons; +} + +QList ButtonList::toIntList(const QList& l) +{ + QList buttons; + buttons.reserve(l.size()); + for (auto const i : l) { + buttons << static_cast(i); + } + return buttons; +} + +bool ButtonList::normalizeButtons(QList& buttons) +{ + QList listTypesInt = + toIntList(CaptureToolButton::getIterableButtonTypes()); + + bool hasChanged = false; + for (int i = 0; i < buttons.size(); i++) { + if (!listTypesInt.contains(buttons.at(i))) { + buttons.removeAt(i); + hasChanged = true; + } + } + return hasChanged; +} + +// USER COLORS + +UserColors::UserColors(int min, int max) + : m_min(min) + , m_max(max) +{} + +bool UserColors::check(const QVariant& val) +{ + if (!val.isValid()) { + return false; + } + if (!val.canConvert()) { + return false; + } + for (const QString& str : val.toStringList()) { +#if QT_VERSION < QT_VERSION_CHECK(6, 4, 0) + if (!QColor::isValidColor(str) && str != "picker") { +#else + if (!QColor::isValidColorName(str) && str != "picker") { +#endif + return false; + } + } + + int sz = val.toStringList().size(); + + return sz >= m_min && sz <= m_max; +} + +QVariant UserColors::process(const QVariant& val) +{ + QStringList strColors = val.toStringList(); + if (strColors.isEmpty()) { + return fallback(); + } + + QVector colors; + colors.reserve(strColors.size()); + + for (const QString& str : strColors) { + if (str != "picker") { + colors.append(QColor(str)); + } else { + colors.append(QColor()); + } + } + + return QVariant::fromValue(colors); +} + +QVariant UserColors::fallback() +{ + if (ConfigHandler().predefinedColorPaletteLarge()) { + return QVariant::fromValue( + ColorPickerWidget::getDefaultLargeColorPalette()); + } else { + return QVariant::fromValue( + ColorPickerWidget::getDefaultSmallColorPalette()); + } +} + +QString UserColors::expected() +{ + return QStringLiteral( + "list of colors(min %1 and max %2) separated by comma") + .arg(m_min - 1, m_max - 1); +} + +QVariant UserColors::representation(const QVariant& val) +{ + auto colors = val.value>(); + + QStringList strColors; + + for (const auto& col : colors) { + if (col.isValid()) { + strColors.append(col.name(QColor::HexRgb)); + } else { + strColors.append(QStringLiteral("picker")); + } + } + + return QVariant::fromValue(strColors); +} + +// SET SAVE FILE AS EXTENSION + +bool SaveFileExtension::check(const QVariant& val) +{ + if (!val.canConvert() || val.toString().isEmpty()) { + return false; + } + + QString extension = val.toString(); + + if (extension.startsWith(".")) { + extension.remove(0, 1); + } + + QStringList imageFormatList; + for (const auto& imageFormat : QImageWriter::supportedImageFormats()) + imageFormatList.append(imageFormat); + + if (!imageFormatList.contains(extension)) { + return false; + } + + return true; +} + +QVariant SaveFileExtension::process(const QVariant& val) +{ + QString extension = val.toString(); + + if (extension.startsWith(".")) { + extension.remove(0, 1); + } + + return QVariant::fromValue(extension); +} + +QString SaveFileExtension::expected() +{ + return QStringLiteral("supported image extension"); +} + +// REGION + +bool Region::check(const QVariant& val) +{ + QVariant region = process(val); + return region.isValid(); +} + +#include // TODO remove after FIXME (see below) +#include + +QVariant Region::process(const QVariant& val) +{ + // FIXME: This is temporary, just before D-Bus is removed + auto argv = std::make_unique(1); + auto argc = std::make_unique(0); + std::unique_ptr tempApp; + if (QGuiApplication::screens().empty()) { + tempApp = std::make_unique(*argc, argv.get()); + } + + QString str = val.toString(); + + if (str == "all") { + return ScreenGrabber().desktopGeometry(); + } else if (str.startsWith("screen")) { + bool ok; + int number = str.mid(6).toInt(&ok); + if (!ok || number < 0) { + return {}; + } + return ScreenGrabber().screenGeometry(qApp->screens()[number]); + } + + static const QRegularExpression regex( + "(-{,1}\\d+)" // number (any sign) + "[x,\\.\\s]" // separator ('x', ',', '.', or whitespace) + "(-{,1}\\d+)" // number (any sign) + "[\\+,\\.\\s]*" // separator ('+',',', '.', or whitespace) + "(-{,1}\\d+)" // number (non-negative) + "[\\+,\\.\\s]*" // separator ('+', ',', '.', or whitespace) + "(-{,1}\\d+)" // number (non-negative) + ); + + if (!regex.match(str).hasMatch()) { + return {}; + } + + int w, h, x, y; + bool w_ok, h_ok, x_ok, y_ok; + w = regex.match(str).captured(1).toInt(&w_ok); + h = regex.match(str).captured(2).toInt(&h_ok); + x = regex.match(str).captured(3).toInt(&x_ok); + y = regex.match(str).captured(4).toInt(&y_ok); + + if (!(w_ok && h_ok && x_ok && y_ok)) { + return {}; + } + + return QRect(x, y, w, h).normalized(); +} diff --git a/src/utils/valuehandler.h b/src/utils/valuehandler.h new file mode 100644 index 0000000..f17af6a --- /dev/null +++ b/src/utils/valuehandler.h @@ -0,0 +1,223 @@ +#pragma once + +#include "src/widgets/capture/capturetoolbutton.h" +#include "src/widgets/colorpickerwidget.h" + +#include +#include +#include + +class QVariant; + +/** + * @brief Handles the value of a configuration option (abstract class). + * + * Each configuration option is represented as a `QVariant`. If the option was + * not specified in a config file, the `QVariant` will be invalid. + * + * Each option will usually be handled in three different ways: + * - have its value checked for semantic errors (type, format, etc). + * @see ValueHandler::check + * - have its value (that was taken from the config file) adapted for proper + * use. + * @see ValueHandler::value + * - provided a fallback value in case: the config does not explicitly specify + * it, or the config contains an error and is globally falling back to + * defaults. + * @see ValueHandler::fallback. + * - some options may want to be stored in the config file in a different way + * than the default one provided by `QVariant`. + * @see ValueHandler::representation + * + * @note Please see the documentation of the functions to learn when you should + * override each. + * + */ +class ValueHandler +{ +public: + /** + * @brief Check the value semantically. + * @param val The value that was read from the config file + * @return Whether the value is correct + * @note The function should presume that `val.isValid()` is true. + */ + virtual bool check(const QVariant& val) = 0; + /** + * @brief Adapt the value for proper use. + * @param val The value that was read from the config file + * @return The modified value + * + * If the value is invalid (unspecified in the config) or does not pass + * `check`, the fallback will be returned. Otherwise the value is processed + * by `process` and then returned. + * + * @note Cannot be overridden + * @see fallback, process + */ + QVariant value(const QVariant& val); + /** + * @brief Fallback value (default value). + */ + virtual QVariant fallback(); + /** + * @brief Return the representation of the value in the config file. + * + * Override this if you want to write the value in a different format than + * the one provided by `QVariant`. + */ + virtual QVariant representation(const QVariant& val); + /** + * @brief The expected value (descriptive). + * Used when reporting configuration errors. + */ + virtual QString expected(); + +protected: + /** + * @brief Process a value, presuming it is a valid `QVariant`. + * @param val The value that was read from the config file + * @return The processed value + * @note You will usually want to override this. In rare cases, you may want + * to override `value`. + */ + virtual QVariant process(const QVariant& val); +}; + +class Bool : public ValueHandler +{ +public: + Bool(bool def); + bool check(const QVariant& val) override; + QVariant fallback() override; + QString expected() override; + +private: + bool m_def; +}; + +class String : public ValueHandler +{ +public: + String(QString def); + bool check(const QVariant&) override; + QVariant fallback() override; + QString expected() override; + +private: + QString m_def; +}; + +class Color : public ValueHandler +{ +public: + Color(QColor def); + bool check(const QVariant& val) override; + QVariant process(const QVariant& val) override; + QVariant fallback() override; + QVariant representation(const QVariant& val) override; + QString expected() override; + +private: + QColor m_def; +}; + +class BoundedInt : public ValueHandler +{ +public: + BoundedInt(int min, int max, int def); + + bool check(const QVariant& val) override; + virtual QVariant fallback() override; + QString expected() override; + +private: + int m_min, m_max, m_def; +}; + +class LowerBoundedInt : public ValueHandler +{ +public: + LowerBoundedInt(int min, int def); + bool check(const QVariant& val) override; + QVariant fallback() override; + QString expected() override; + +private: + int m_min, m_def; +}; + +class KeySequence : public ValueHandler +{ +public: + KeySequence(const QKeySequence& fallback = {}); + bool check(const QVariant& val) override; + QVariant fallback() override; + QString expected() override; + QVariant representation(const QVariant& val) override; + +private: + QKeySequence m_fallback; + + QVariant process(const QVariant& val) override; +}; + +class ExistingDir : public ValueHandler +{ + bool check(const QVariant& val) override; + QVariant fallback() override; + QString expected() override; +}; + +class FilenamePattern : public ValueHandler +{ + bool check(const QVariant&) override; + QVariant fallback() override; + QVariant process(const QVariant&) override; + QString expected() override; +}; + +class ButtonList : public ValueHandler +{ +public: + bool check(const QVariant& val) override; + QVariant process(const QVariant& val) override; + QVariant fallback() override; + QVariant representation(const QVariant& val) override; + QString expected() override; + + // UTILITY FUNCTIONS + static QList fromIntList(const QList&); + static QList toIntList(const QList& l); + static bool normalizeButtons(QList& buttons); +}; + +class UserColors : public ValueHandler +{ +public: + UserColors(int min, int max); + bool check(const QVariant& val) override; + QVariant process(const QVariant& val) override; + QVariant fallback() override; + QString expected() override; + QVariant representation(const QVariant& val) override; + +private: + int m_min, m_max; +}; + +class SaveFileExtension : public ValueHandler +{ + bool check(const QVariant& val) override; + QVariant process(const QVariant& val) override; + QString expected() override; +}; + +class Region : public ValueHandler +{ +public: + bool check(const QVariant& val) override; + +private: + QVariant process(const QVariant& val) override; +}; diff --git a/src/utils/waylandutils.cpp b/src/utils/waylandutils.cpp new file mode 100644 index 0000000..a46e59f --- /dev/null +++ b/src/utils/waylandutils.cpp @@ -0,0 +1,5 @@ +#include "waylandutils.h" + +WaylandUtils::WaylandUtils() {} + +bool WaylandUtils::waylandDetected() {} diff --git a/src/utils/waylandutils.h b/src/utils/waylandutils.h new file mode 100644 index 0000000..32fe512 --- /dev/null +++ b/src/utils/waylandutils.h @@ -0,0 +1,14 @@ +#ifndef WAYLANDUTILS_H +#define WAYLANDUTILS_H + +class WaylandUtils +{ +public: + WaylandUtils(); + + static bool waylandDetected(); + +private: +}; + +#endif // WAYLANDUTILS_H diff --git a/src/utils/winlnkfileparse.cpp b/src/utils/winlnkfileparse.cpp new file mode 100644 index 0000000..e054ffc --- /dev/null +++ b/src/utils/winlnkfileparse.cpp @@ -0,0 +1,157 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "winlnkfileparse.h" +#include +#include +#include +#include +#include +#include +#include + +#include + +WinLnkFileParser::WinLnkFileParser() +{ + QStringList sListImgFileExt; + for (const auto& ext : QImageWriter::supportedImageFormats()) { + sListImgFileExt.append(ext); + } + this->getImageFileExtAssociates(sListImgFileExt); +} + +DesktopAppData WinLnkFileParser::parseLnkFile(const QFileInfo& fiLnk, + bool& ok) const +{ + DesktopAppData res; + ok = true; + + QFileInfo fiSymlink(fiLnk.symLinkTarget()); + if (!fiSymlink.exists() || !fiSymlink.fileName().endsWith(".exe") || + fiSymlink.baseName().contains("unins")) { + ok = false; + return res; + } + + res.name = fiLnk.baseName(); + res.exec = fiSymlink.absoluteFilePath(); + static QFileIconProvider provider; + res.icon = provider.icon(QFileInfo(fiSymlink.filePath())); + + if (m_GraphicAppsList.contains(fiSymlink.fileName())) { + res.categories = QStringList() << "Graphics"; + } else { + res.categories = QStringList() << "Utility"; + } + + for (const auto& app : m_appList) { + if (app.exec == res.exec) { + ok = false; + break; + } + } + + if (res.exec.isEmpty() || res.name.isEmpty()) { + ok = false; + } + return res; +} + +int WinLnkFileParser::processDirectory(const QDir& dir) +{ + QStringList sListMenuFilter; + sListMenuFilter << "Accessibility" + << "Administrative Tools" + << "Setup" + << "System Tools" + << "Uninstall" + << "Update" + << "Updater" + << "Windows PowerShell"; + const QString sMenuFilter("\\b(" + sListMenuFilter.join('|') + ")\\b"); + static const QRegularExpression regexfilter(sMenuFilter); + + bool ok; + int length = m_appList.length(); + // Go through all subfolders and *.lnk files + QDirIterator it(dir.absolutePath(), + { "*.lnk" }, + QDir::NoFilter, + QDirIterator::Subdirectories); + while (it.hasNext()) { + QFileInfo fiLnk(it.next()); + if (!regexfilter.match(fiLnk.absoluteFilePath()).hasMatch()) { + DesktopAppData app = parseLnkFile(fiLnk, ok); + if (ok) { + m_appList.append(app); + } + } + } + + return m_appList.length() - length; +} + +QVector WinLnkFileParser::getAppsByCategory( + const QString& category) +{ + QVector res; + for (const DesktopAppData& app : std::as_const(m_appList)) { + if (app.categories.contains(category)) { + res.append(app); + } + } + + std::sort(res.begin(), res.end(), CompareAppByName()); + + return res; +} + +QMap> WinLnkFileParser::getAppsByCategory( + const QStringList& categories) +{ + QMap> res; + + QVector tmpAppList; + for (const QString& category : categories) { + tmpAppList = getAppsByCategory(category); + for (const DesktopAppData& app : std::as_const(tmpAppList)) { + res[category].append(app); + } + } + + return res; +} + +QString WinLnkFileParser::getAllUsersStartMenuPath() +{ + QString sRet(""); + WCHAR path[MAX_PATH]; + HRESULT hr = SHGetFolderPathW(NULL, CSIDL_COMMON_PROGRAMS, NULL, 0, path); + + if (SUCCEEDED(hr)) { + sRet = QDir(QString::fromWCharArray(path)).absolutePath(); + } + + return sRet; +} + +void WinLnkFileParser::getImageFileExtAssociates(const QStringList& sListImgExt) +{ + const QString sReg("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\" + "CurrentVersion\\Explorer\\FileExts\\.%1\\OpenWithList"); + + for (const auto& sExt : std::as_const(sListImgExt)) { + QString sPath(sReg.arg(sExt)); + QSettings registry(sPath, QSettings::NativeFormat); + for (const auto& key : registry.allKeys()) { + if (1 == key.size()) { // Keys for OpenWith apps are a, b, c, ... + QString sVal = registry.value(key, "").toString(); + if (sVal.endsWith(".exe") && + !m_GraphicAppsList.contains(sVal)) { + m_GraphicAppsList << sVal; + } + } + } + } +} diff --git a/src/utils/winlnkfileparse.h b/src/utils/winlnkfileparse.h new file mode 100644 index 0000000..0e99ce4 --- /dev/null +++ b/src/utils/winlnkfileparse.h @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "desktopfileparse.h" +#include +#include +#include +#include + +class QDir; +class QString; + +struct CompareAppByName +{ + bool operator()(const DesktopAppData a, const DesktopAppData b) + { + return (a.name < b.name); + } +}; + +struct WinLnkFileParser +{ + WinLnkFileParser(); + DesktopAppData parseLnkFile(const QFileInfo& fiLnk, bool& ok) const; + int processDirectory(const QDir& dir); + static QString getAllUsersStartMenuPath(); + + QVector getAppsByCategory(const QString& category); + QMap> getAppsByCategory( + const QStringList& categories); + +private: + void getImageFileExtAssociates(const QStringList& sListImgExt); + + QVector m_appList; + QStringList m_GraphicAppsList; +}; diff --git a/src/widgets/CMakeLists.txt b/src/widgets/CMakeLists.txt new file mode 100644 index 0000000..09695f2 --- /dev/null +++ b/src/widgets/CMakeLists.txt @@ -0,0 +1,68 @@ +add_subdirectory(panel) +add_subdirectory(capture) + +# Required to generate MOC +target_sources( + flameshot + PRIVATE + infowindow.ui + capturelauncher.ui + + capturelauncher.h + draggablewidgetmaker.h + imagelabel.h + trayicon.h + infowindow.h + loadspinner.h + notificationwidget.h + orientablepushbutton.h + + colorpickerwidget.h + capture/capturetoolobjects.h +) + +if (ENABLE_IMGUR) +target_sources( + flameshot + PRIVATE + uploadhistory.ui + uploadlineitem.ui + uploadhistory.h + uploadlineitem.h + imguploaddialog.h +) +endif() + +target_sources( + flameshot + PRIVATE + capturelauncher.cpp + draggablewidgetmaker.cpp + imagelabel.cpp + trayicon.cpp + infowindow.cpp + loadspinner.cpp + notificationwidget.cpp + orientablepushbutton.cpp + colorpickerwidget.cpp + capture/capturetoolobjects.cpp +) + +if (ENABLE_IMGUR) +target_sources( + flameshot + PRIVATE + uploadhistory.cpp + uploadlineitem.cpp + imguploaddialog.cpp +) +endif() + +if (NOT DISABLE_UPDATE_CHECKER) + target_sources( + flameshot + PRIVATE + updatenotificationwidget.h + updatenotificationwidget.cpp + ) +endif() \ No newline at end of file diff --git a/src/widgets/capture/CMakeLists.txt b/src/widgets/capture/CMakeLists.txt new file mode 100644 index 0000000..50c82a3 --- /dev/null +++ b/src/widgets/capture/CMakeLists.txt @@ -0,0 +1,28 @@ +# Required to generate MOC +target_sources( + flameshot + PRIVATE buttonhandler.h + capturebutton.h + capturetoolbutton.h + capturewidget.h + colorpicker.h + hovereventfilter.h + overlaymessage.h + selectionwidget.h + magnifierwidget.h + notifierbox.h + modificationcommand.h) + +target_sources( + flameshot + PRIVATE buttonhandler.cpp + capturebutton.cpp + capturetoolbutton.cpp + capturewidget.cpp + colorpicker.cpp + hovereventfilter.cpp + overlaymessage.cpp + notifierbox.cpp + selectionwidget.cpp + magnifierwidget.cpp + modificationcommand.cpp) diff --git a/src/widgets/capture/buttonhandler.cpp b/src/widgets/capture/buttonhandler.cpp new file mode 100644 index 0000000..3964ef5 --- /dev/null +++ b/src/widgets/capture/buttonhandler.cpp @@ -0,0 +1,394 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "buttonhandler.h" +#include "src/utils/globalvalues.h" +#include +#include + +// ButtonHandler is a handler for every active button. It makes easier to +// manipulate the buttons as a unit. + +ButtonHandler::ButtonHandler(const QVector& v, + QObject* parent) + : QObject(parent) +{ + setButtons(v); + init(); +} + +ButtonHandler::ButtonHandler(QObject* parent) + : QObject(parent) +{ + init(); +} + +void ButtonHandler::hide() +{ + for (CaptureToolButton* b : m_vectorButtons) { + b->hide(); + } +} + +void ButtonHandler::show() +{ + if (m_vectorButtons.isEmpty() || m_vectorButtons.first()->isVisible()) { + return; + } + for (CaptureToolButton* b : m_vectorButtons) { + b->animatedShow(); + } +} + +bool ButtonHandler::isVisible() const +{ + bool ret = true; + for (const CaptureToolButton* b : m_vectorButtons) { + if (!b->isVisible()) { + ret = false; + break; + } + } + return ret; +} + +bool ButtonHandler::buttonsAreInside() const +{ + return m_buttonsAreInside; +} + +size_t ButtonHandler::size() const +{ + return m_vectorButtons.size(); +} + +// updatePosition updates the position of the buttons around the +// selection area. Ignores the sides blocked by the end of the screen. +// When the selection is too small, it works on a virtual selection with +// the original in the center. +void ButtonHandler::updatePosition(const QRect& selection) +{ + resetRegionTrack(); + const int vecLength = m_vectorButtons.size(); + if (vecLength == 0) { + return; + } + // Copy of the selection area for internal modifications + m_selection = intersectWithAreas(selection); + updateBlockedSides(); + ensureSelectionMinimumSize(); + // Indicates the actual button to be moved + int elemIndicator = 0; + + while (elemIndicator < vecLength) { + + // Add them inside the area when there is no more space + if (m_allSidesBlocked) { + m_selection = selection; + positionButtonsInside(elemIndicator); + break; // the while + } + // Number of buttons per row column + int buttonsPerRow = + (m_selection.width() + m_separator) / (m_buttonExtendedSize); + int buttonsPerCol = + (m_selection.height() + m_separator) / (m_buttonExtendedSize); + // Buttons to be placed in the corners + int extraButtons = + (vecLength - elemIndicator) - (buttonsPerRow + buttonsPerCol) * 2; + int elemsAtCorners = extraButtons > 4 ? 4 : extraButtons; + int maxExtra = 2; + if (m_oneHorizontalBlocked) { + maxExtra = 1; + } else if (m_horizontalyBlocked) { + maxExtra = 0; + } + int elemCornersTop = qBound(0, elemsAtCorners, maxExtra); + elemsAtCorners -= elemCornersTop; + int elemCornersBotton = qBound(0, elemsAtCorners, maxExtra); + + // Add buttons at the button of the selection + if (!m_blockedBotton) { + int addCounter = buttonsPerRow + elemCornersBotton; + // Don't add more than we have + addCounter = qBound(0, addCounter, vecLength - elemIndicator); + QPoint center = QPoint(m_selection.center().x(), + m_selection.bottom() + m_separator); + if (addCounter > buttonsPerRow) { + adjustHorizontalCenter(center); + } + // ElemIndicator, elemsAtCorners + QVector positions = + horizontalPoints(center, addCounter, true); + moveButtonsToPoints(positions, elemIndicator); + } + // Add buttons to the right side of the selection + if (!m_blockedRight && elemIndicator < vecLength) { + int addCounter = buttonsPerCol; + addCounter = qBound(0, addCounter, vecLength - elemIndicator); + + QPoint center = QPoint(m_selection.right() + m_separator, + m_selection.center().y()); + QVector positions = + verticalPoints(center, addCounter, false); + moveButtonsToPoints(positions, elemIndicator); + } + // Add buttons at the top of the selection + if (!m_blockedTop && elemIndicator < vecLength) { + int addCounter = buttonsPerRow + elemCornersTop; + addCounter = qBound(0, addCounter, vecLength - elemIndicator); + QPoint center = QPoint(m_selection.center().x(), + m_selection.top() - m_buttonExtendedSize); + if (addCounter == 1 + buttonsPerRow) { + adjustHorizontalCenter(center); + } + QVector positions = + horizontalPoints(center, addCounter, false); + moveButtonsToPoints(positions, elemIndicator); + } + // Add buttons to the left side of the selection + if (!m_blockedLeft && elemIndicator < vecLength) { + int addCounter = buttonsPerCol; + addCounter = qBound(0, addCounter, vecLength - elemIndicator); + + QPoint center = QPoint(m_selection.left() - m_buttonExtendedSize, + m_selection.center().y()); + QVector positions = + verticalPoints(center, addCounter, true); + moveButtonsToPoints(positions, elemIndicator); + } + // If there are elements for the next cycle, increase the size of the + // base area + if (elemIndicator < vecLength && !(m_allSidesBlocked)) { + expandSelection(); + } + updateBlockedSides(); + } +} + +int ButtonHandler::calculateShift(int elements, bool reverse) const +{ + int shift = 0; + if (elements % 2 == 0) { + shift = m_buttonExtendedSize * (elements / 2) - (m_separator / 2); + } else { + shift = + m_buttonExtendedSize * ((elements - 1) / 2) + m_buttonBaseSize / 2; + } + if (!reverse) { + shift -= m_buttonBaseSize; + } + + return shift; +} +// horizontalPoints is an auxiliary method for the button position computation. +// starts from a known center and keeps adding elements horizontally +// and returns the computed positions. +QVector ButtonHandler::horizontalPoints(const QPoint& center, + const int elements, + const bool leftToRight) const +{ + QVector res; + // Distance from the center to start adding buttons + int shift = calculateShift(elements, leftToRight); + + int x = leftToRight ? center.x() - shift : center.x() + shift; + QPoint i(x, center.y()); + while (elements > res.length()) { + res.append(i); + leftToRight ? i.setX(i.x() + m_buttonExtendedSize) + : i.setX(i.x() - m_buttonExtendedSize); + } + return res; +} + +// verticalPoints is an auxiliary method for the button position computation. +// starts from a known center and keeps adding elements vertically +// and returns the computed positions. +QVector ButtonHandler::verticalPoints(const QPoint& center, + const int elements, + const bool upToDown) const +{ + QVector res; + // Distance from the center to start adding buttons + int shift = calculateShift(elements, upToDown); + + int y = upToDown ? center.y() - shift : center.y() + shift; + QPoint i(center.x(), y); + while (elements > res.length()) { + res.append(i); + upToDown ? i.setY(i.y() + m_buttonExtendedSize) + : i.setY(i.y() - m_buttonExtendedSize); + } + return res; +} + +QRect ButtonHandler::intersectWithAreas(const QRect& rect) +{ + QRect res; + for (const QRect& r : m_screenRegions) { + QRect temp = rect.intersected(r); + if (temp.height() * temp.width() > res.height() * res.width()) { + res = temp; + } + } + return res; +} + +void ButtonHandler::init() +{ + m_separator = GlobalValues::buttonBaseSize() / 4; +} + +void ButtonHandler::resetRegionTrack() +{ + m_buttonsAreInside = false; +} + +void ButtonHandler::updateBlockedSides() +{ + QRegion screenRegion{}; + for (const QRect& rect : m_screenRegions) { + screenRegion += rect; + } + + const int EXTENSION = m_separator * 2 + m_buttonBaseSize; + // Right + QPoint pointA(m_selection.right() + EXTENSION, m_selection.bottom()); + QPoint pointB(pointA.x(), m_selection.top()); + m_blockedRight = + !(screenRegion.contains(pointA) && screenRegion.contains(pointB)); + // Left + pointA.setX(m_selection.left() - EXTENSION); + pointB.setX(pointA.x()); + m_blockedLeft = + !(screenRegion.contains(pointA) && screenRegion.contains(pointB)); + // Bottom + pointA = QPoint(m_selection.left(), m_selection.bottom() + EXTENSION); + pointB = QPoint(m_selection.right(), pointA.y()); + m_blockedBotton = + !(screenRegion.contains(pointA) && screenRegion.contains(pointB)); + // Top + pointA.setY(m_selection.top() - EXTENSION); + pointB.setY(pointA.y()); + m_blockedTop = + !(screenRegion.contains(pointA) && screenRegion.contains(pointB)); + // Auxiliary + m_oneHorizontalBlocked = + (!m_blockedRight && m_blockedLeft) || (m_blockedRight && !m_blockedLeft); + m_horizontalyBlocked = (m_blockedRight && m_blockedLeft); + m_allSidesBlocked = + (m_blockedBotton && m_horizontalyBlocked && m_blockedTop); +} + +void ButtonHandler::expandSelection() +{ + int& s = m_buttonExtendedSize; + m_selection = m_selection + QMargins(s, s, s, s); + m_selection = intersectWithAreas(m_selection); +} + +void ButtonHandler::positionButtonsInside(int index) +{ + // Position the buttons in the botton-center of the main but inside of the + // selection. + QRect mainArea = m_selection; + mainArea = intersectWithAreas(mainArea); + const int buttonsPerRow = (mainArea.width()) / (m_buttonExtendedSize); + if (buttonsPerRow == 0) { + return; + } + QPoint center = + QPoint(mainArea.center().x(), mainArea.bottom() - m_buttonExtendedSize); + + while (m_vectorButtons.size() > index) { + int addCounter = buttonsPerRow; + addCounter = qBound(0, addCounter, m_vectorButtons.size() - index); + QVector positions = horizontalPoints(center, addCounter, true); + moveButtonsToPoints(positions, index); + center.setY(center.y() - m_buttonExtendedSize); + } + + m_buttonsAreInside = true; +} + +void ButtonHandler::ensureSelectionMinimumSize() +{ + // Detect if a side is smaller than a button in order to prevent collision + // and redimension the base area to the base size of a single button per + // side + if (m_selection.width() < m_buttonBaseSize) { + if (!m_blockedLeft) { + m_selection.setX(m_selection.x() - + (m_buttonBaseSize - m_selection.width()) / 2); + } + m_selection.setWidth(m_buttonBaseSize); + } + if (m_selection.height() < m_buttonBaseSize) { + if (!m_blockedTop) { + m_selection.setY(m_selection.y() - + (m_buttonBaseSize - m_selection.height()) / 2); + } + m_selection.setHeight(m_buttonBaseSize); + } +} + +void ButtonHandler::moveButtonsToPoints(const QVector& points, + int& index) +{ + for (const QPoint& p : points) { + auto* button = m_vectorButtons[index]; + button->move(p); + ++index; + } +} + +void ButtonHandler::adjustHorizontalCenter(QPoint& center) +{ + if (m_blockedLeft) { + center.setX(center.x() + m_buttonExtendedSize / 2); + } else if (m_blockedRight) { + center.setX(center.x() - m_buttonExtendedSize / 2); + } +} + +// setButtons redefines the buttons of the button handler +void ButtonHandler::setButtons(const QVector& v) +{ + if (v.isEmpty()) { + return; + } + + for (CaptureToolButton* b : m_vectorButtons) { + delete (b); + } + m_vectorButtons = v; + m_buttonBaseSize = GlobalValues::buttonBaseSize(); + m_buttonExtendedSize = m_buttonBaseSize + m_separator; +} + +bool ButtonHandler::contains(const QPoint& p) const +{ + if (m_vectorButtons.isEmpty()) { + return false; + } + QPoint first(m_vectorButtons.first()->pos()); + QPoint last(m_vectorButtons.last()->pos()); + bool firstIsTopLeft = (first.x() <= last.x() && first.y() <= last.y()); + QPoint topLeft = firstIsTopLeft ? first : last; + QPoint bottonRight = firstIsTopLeft ? last : first; + topLeft += QPoint(-m_separator, -m_separator); + bottonRight += QPoint(m_buttonExtendedSize, m_buttonExtendedSize); + QRegion r(QRect(topLeft, bottonRight).normalized()); + return r.contains(p); +} + +void ButtonHandler::updateScreenRegions(const QVector& rects) +{ + m_screenRegions = rects; +} + +void ButtonHandler::updateScreenRegions(const QRect& rect) +{ + m_screenRegions = { rect }; +} diff --git a/src/widgets/capture/buttonhandler.h b/src/widgets/capture/buttonhandler.h new file mode 100644 index 0000000..79119a1 --- /dev/null +++ b/src/widgets/capture/buttonhandler.h @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "capturetoolbutton.h" +#include +#include +#include + +class CaptureToolButton; +class QRect; +class QPoint; + +class ButtonHandler : public QObject +{ + Q_OBJECT +public: + ButtonHandler(const QVector&, + QObject* parent = nullptr); + explicit ButtonHandler(QObject* parent = nullptr); + + void hideSectionUnderMouse(const QPoint& p); + + bool isVisible() const; + bool buttonsAreInside() const; + size_t size() const; + + void setButtons(const QVector&); + bool contains(const QPoint& p) const; + void updateScreenRegions(const QVector& rects); + void updateScreenRegions(const QRect& rect); + +public slots: + void updatePosition(const QRect& selection); + void hide(); + void show(); + +private: + QVector horizontalPoints(const QPoint& center, + const int elements, + const bool leftToRight) const; + QVector verticalPoints(const QPoint& center, + const int elements, + const bool upToDown) const; + + int calculateShift(int elements, bool reverse) const; + + QRect intersectWithAreas(const QRect& rect); + + QVector m_vectorButtons; + + QVector m_screenRegions; + + QRect m_selection; + + int m_separator; + int m_buttonExtendedSize; + int m_buttonBaseSize; + + bool m_buttonsAreInside; + bool m_blockedRight; + bool m_blockedLeft; + bool m_blockedBotton; + bool m_blockedTop; + bool m_oneHorizontalBlocked; + bool m_horizontalyBlocked; + bool m_allSidesBlocked; + + // aux methods + void init(); + void resetRegionTrack(); + void updateBlockedSides(); + void expandSelection(); + void positionButtonsInside(int index); + void ensureSelectionMinimumSize(); + void moveButtonsToPoints(const QVector& points, int& index); + void adjustHorizontalCenter(QPoint& center); +}; diff --git a/src/widgets/capture/capturebutton.cpp b/src/widgets/capture/capturebutton.cpp new file mode 100644 index 0000000..0a83bfe --- /dev/null +++ b/src/widgets/capture/capturebutton.cpp @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "capturebutton.h" +#include "src/utils/colorutils.h" +#include "src/utils/confighandler.h" +#include "src/utils/globalvalues.h" +#include + +CaptureButton::CaptureButton(QWidget* parent) + : QPushButton(parent) +{ + init(); +} + +CaptureButton::CaptureButton(const QString& text, QWidget* parent) + : QPushButton(text, parent) +{ + init(); +} + +CaptureButton::CaptureButton(const QIcon& icon, + const QString& text, + QWidget* parent) + : QPushButton(icon, text, parent) +{ + init(); +} + +void CaptureButton::init() +{ + setCursor(Qt::ArrowCursor); + setFocusPolicy(Qt::NoFocus); + + auto* dsEffect = new QGraphicsDropShadowEffect(this); + dsEffect->setBlurRadius(5); + dsEffect->setOffset(0); + dsEffect->setColor(QColor(Qt::black)); + + setGraphicsEffect(dsEffect); +} + +QString CaptureButton::globalStyleSheet() +{ + return CaptureButton(nullptr).styleSheet(); +} + +QString CaptureButton::styleSheet() const +{ + QString baseSheet = "CaptureButton { border: none;" + "padding: 3px 8px;" + "background-color: %1; color: %4 }" + "CaptureToolButton { border-radius: %3;" + "padding: 0; }" + "CaptureButton:hover { background-color: %2; }" + "CaptureButton:pressed:!hover { " + "background-color: %1; }"; + // define color when mouse is hovering + QColor contrast = ColorUtils::contrastColor(m_mainColor); + // foreground color + QColor color = ColorUtils::colorIsDark(m_mainColor) ? Qt::white : Qt::black; + + return baseSheet.arg(m_mainColor.name(), + contrast.name(), + QString::number(GlobalValues::buttonBaseSize() / 2), + color.name()); +} + +void CaptureButton::setColor(const QColor& c) +{ + m_mainColor = c; + setStyleSheet(styleSheet()); +} + +QColor CaptureButton::m_mainColor; diff --git a/src/widgets/capture/capturebutton.h b/src/widgets/capture/capturebutton.h new file mode 100644 index 0000000..99a5de3 --- /dev/null +++ b/src/widgets/capture/capturebutton.h @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include + +class CaptureButton : public QPushButton +{ + Q_OBJECT + +public: + CaptureButton() = delete; + CaptureButton(QWidget* parent = nullptr); + CaptureButton(const QString& text, QWidget* parent = nullptr); + CaptureButton(const QIcon& icon, + const QString& text, + QWidget* parent = nullptr); + + static QString globalStyleSheet(); + + QString styleSheet() const; + + void setColor(const QColor& c); + +private: + static QColor m_mainColor; + + void init(); +}; diff --git a/src/widgets/capture/capturetoolbutton.cpp b/src/widgets/capture/capturetoolbutton.cpp new file mode 100644 index 0000000..f683f46 --- /dev/null +++ b/src/widgets/capture/capturetoolbutton.cpp @@ -0,0 +1,184 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "capturetoolbutton.h" +#include "src/tools/capturetool.h" +#include "src/tools/toolfactory.h" +#include "src/utils/colorutils.h" +#include "src/utils/confighandler.h" +#include "src/utils/globalvalues.h" +#include +#include +#include +#include +#include + +// Button represents a single button of the capture widget, it can enable +// multiple functionality. + +CaptureToolButton::CaptureToolButton(const CaptureTool::Type t, QWidget* parent) + : CaptureButton(parent) + , m_buttonType(t) + , m_tool(nullptr) + , m_emergeAnimation(nullptr) +{ + initButton(); + updateIcon(); +} + +CaptureToolButton::~CaptureToolButton() +{ + if (m_tool) { + delete m_tool; + m_tool = nullptr; + } + if (m_emergeAnimation) { + delete m_emergeAnimation; + m_emergeAnimation = nullptr; + } +} + +void CaptureToolButton::initButton() +{ + if (m_tool) { + delete m_tool; + m_tool = nullptr; + } + m_tool = ToolFactory().CreateTool(m_buttonType, this); + + resize(GlobalValues::buttonBaseSize(), GlobalValues::buttonBaseSize()); + setMask(QRegion(QRect(-1, + -1, + GlobalValues::buttonBaseSize() + 2, + GlobalValues::buttonBaseSize() + 2), + QRegion::Ellipse)); + + // Set a tooltip showing a shortcut in parentheses (if there is a shortcut) + QString tooltip = m_tool->description(); + QString shortcut = + ConfigHandler().shortcut(QVariant::fromValue(m_buttonType).toString()); + if (m_buttonType == CaptureTool::TYPE_COPY && + ConfigHandler().copyOnDoubleClick()) { + tooltip += QStringLiteral(" (%1Left Double-Click)") + .arg(shortcut.isEmpty() ? QString() : shortcut + " or "); + } else if (!shortcut.isEmpty()) { + tooltip += QStringLiteral(" (%1)").arg(shortcut); + } + tooltip.replace("Return", "Enter"); + setToolTip(tooltip); + + m_emergeAnimation = new QPropertyAnimation(this, "size", this); + m_emergeAnimation->setEasingCurve(QEasingCurve::InOutQuad); + m_emergeAnimation->setDuration(80); + m_emergeAnimation->setStartValue(QSize(0, 0)); + m_emergeAnimation->setEndValue( + QSize(GlobalValues::buttonBaseSize(), GlobalValues::buttonBaseSize())); +} + +void CaptureToolButton::updateIcon() +{ + setIcon(icon()); + setIconSize(size() * 0.6); +} + +const QList& CaptureToolButton::getIterableButtonTypes() +{ + return iterableButtonTypes; +} + +// get icon returns the icon for the type of button +QIcon CaptureToolButton::icon() const +{ + return m_tool->icon(m_mainColor, true); +} + +void CaptureToolButton::mousePressEvent(QMouseEvent* e) +{ + activateWindow(); + if (e->button() == Qt::LeftButton) { + emit pressedButtonLeftClick(this); + emit pressed(); + } else if (e->button() == Qt::RightButton) { + emit pressedButtonRightClick(this); + emit pressed(); + } +} + +void CaptureToolButton::animatedShow() +{ + if (!isVisible()) { + show(); + m_emergeAnimation->start(); + connect(m_emergeAnimation, + &QPropertyAnimation::finished, + this, + [this]() { updateIcon(); }); + } +} + +CaptureTool* CaptureToolButton::tool() const +{ + return m_tool; +} + +void CaptureToolButton::setColor(const QColor& c) +{ + m_mainColor = c; + CaptureButton::setColor(c); + updateIcon(); +} + +QColor CaptureToolButton::m_mainColor; + +static std::map buttonTypeOrder +{ + { CaptureTool::TYPE_PENCIL, 0 }, { CaptureTool::TYPE_DRAWER, 1 }, + { CaptureTool::TYPE_ARROW, 2 }, { CaptureTool::TYPE_SELECTION, 3 }, + { CaptureTool::TYPE_RECTANGLE, 4 }, { CaptureTool::TYPE_CIRCLE, 5 }, + { CaptureTool::TYPE_MARKER, 6 }, { CaptureTool::TYPE_TEXT, 7 }, + { CaptureTool::TYPE_PIXELATE, 8 }, { CaptureTool::TYPE_INVERT, 9 }, + { CaptureTool::TYPE_CIRCLECOUNT, 10 }, + { CaptureTool::TYPE_MOVESELECTION, 12 }, { CaptureTool::TYPE_UNDO, 13 }, + { CaptureTool::TYPE_REDO, 14 }, { CaptureTool::TYPE_COPY, 15 }, + { CaptureTool::TYPE_SAVE, 16 }, +#ifdef ENABLE_IMGUR + { CaptureTool::TYPE_IMAGEUPLOADER, 17 }, +#endif + { CaptureTool::TYPE_ACCEPT, 18 }, +#if !defined(Q_OS_MACOS) + { CaptureTool::TYPE_OPEN_APP, 19 }, { CaptureTool::TYPE_EXIT, 20 }, + { CaptureTool::TYPE_PIN, 21 }, +#else + { CaptureTool::TYPE_EXIT, 19 }, { CaptureTool::TYPE_PIN, 20 }, +#endif + + { CaptureTool::TYPE_SIZEINCREASE, 22 }, + { CaptureTool::TYPE_SIZEDECREASE, 23 }, +}; + +int CaptureToolButton::getPriorityByButton(CaptureTool::Type b) +{ + auto it = buttonTypeOrder.find(b); + return it == buttonTypeOrder.cend() ? (int)buttonTypeOrder.size() + : it->second; +} + +QList CaptureToolButton::iterableButtonTypes = { + CaptureTool::TYPE_PENCIL, CaptureTool::TYPE_DRAWER, + CaptureTool::TYPE_ARROW, CaptureTool::TYPE_SELECTION, + CaptureTool::TYPE_RECTANGLE, CaptureTool::TYPE_CIRCLE, + CaptureTool::TYPE_MARKER, CaptureTool::TYPE_TEXT, + CaptureTool::TYPE_CIRCLECOUNT, CaptureTool::TYPE_PIXELATE, + CaptureTool::TYPE_INVERT, CaptureTool::TYPE_MOVESELECTION, + CaptureTool::TYPE_UNDO, CaptureTool::TYPE_REDO, + CaptureTool::TYPE_COPY, CaptureTool::TYPE_SAVE, + CaptureTool::TYPE_EXIT, +#ifdef ENABLE_IMGUR + CaptureTool::TYPE_IMAGEUPLOADER, +#endif +#if !defined(Q_OS_MACOS) + CaptureTool::TYPE_OPEN_APP, +#endif + CaptureTool::TYPE_PIN, CaptureTool::TYPE_SIZEINCREASE, + CaptureTool::TYPE_SIZEDECREASE, CaptureTool::TYPE_ACCEPT, +}; diff --git a/src/widgets/capture/capturetoolbutton.h b/src/widgets/capture/capturetoolbutton.h new file mode 100644 index 0000000..931642a --- /dev/null +++ b/src/widgets/capture/capturetoolbutton.h @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "capturebutton.h" +#include "src/tools/capturetool.h" +#include +#include + +class QWidget; +class QPropertyAnimation; + +class CaptureToolButton : public CaptureButton +{ + Q_OBJECT + +public: + explicit CaptureToolButton(const CaptureTool::Type, + QWidget* parent = nullptr); + ~CaptureToolButton(); + + static const QList& getIterableButtonTypes(); + static int getPriorityByButton(CaptureTool::Type); + + QString name() const; + QString description() const; + QIcon icon() const; + CaptureTool* tool() const; + + void setColor(const QColor& c); + void animatedShow(); + +protected: + void mousePressEvent(QMouseEvent* e) override; + static QList iterableButtonTypes; + + CaptureTool* m_tool; + +signals: + void pressedButtonLeftClick(CaptureToolButton*); + void pressedButtonRightClick(CaptureToolButton*); + +private: + CaptureToolButton(QWidget* parent = nullptr); + CaptureTool::Type m_buttonType; + + QPropertyAnimation* m_emergeAnimation; + + static QColor m_mainColor; + + void initButton(); + void updateIcon(); +}; diff --git a/src/widgets/capture/capturetoolobjects.cpp b/src/widgets/capture/capturetoolobjects.cpp new file mode 100644 index 0000000..969492e --- /dev/null +++ b/src/widgets/capture/capturetoolobjects.cpp @@ -0,0 +1,162 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2021 Yurii Puchkov & Contributors + +#include "capturetoolobjects.h" + +#define SEARCH_RADIUS_NEAR 3 +#define SEARCH_RADIUS_FAR 5 +#define SEARCH_RADIUS_TEXT_HANDICAP 5 + +CaptureToolObjects::CaptureToolObjects(QObject* parent) + : QObject(parent) +{} + +void CaptureToolObjects::append(const QPointer& captureTool) +{ + if (!captureTool.isNull()) { + m_captureToolObjects.append(captureTool->copy(captureTool->parent())); + m_imageCache.clear(); + } +} + +void CaptureToolObjects::insert(int index, + const QPointer& captureTool) +{ + if (!captureTool.isNull() && index >= 0 && + index <= m_captureToolObjects.size()) { + m_captureToolObjects.insert(index, + captureTool->copy(captureTool->parent())); + m_imageCache.clear(); + } +} + +QPointer CaptureToolObjects::at(int index) +{ + if (index >= 0 && index < m_captureToolObjects.size()) { + return m_captureToolObjects[index]; + } + return nullptr; +} + +void CaptureToolObjects::clear() +{ + m_captureToolObjects.clear(); +} + +QList> CaptureToolObjects::captureToolObjects() +{ + return m_captureToolObjects; +} + +int CaptureToolObjects::size() +{ + return m_captureToolObjects.size(); +} + +void CaptureToolObjects::removeAt(int index) +{ + if (index >= 0 && index < m_captureToolObjects.size()) { + m_captureToolObjects.removeAt(index); + m_imageCache.clear(); + } +} + +int CaptureToolObjects::find(const QPoint& pos, QSize captureSize) +{ + if (m_captureToolObjects.empty()) { + return -1; + } + QPixmap pixmap(captureSize); + pixmap.fill(Qt::transparent); + QPainter painter(&pixmap); + // first attempt to find at exact position + int radius = SEARCH_RADIUS_NEAR; + int index = findWithRadius(painter, pixmap, pos, radius); + if (-1 == index) { + // second attempt to find at position with radius + radius = SEARCH_RADIUS_FAR; + pixmap.fill(Qt::transparent); + index = findWithRadius(painter, pixmap, pos, radius); + } + return index; +} + +int CaptureToolObjects::findWithRadius(QPainter& painter, + QPixmap& pixmap, + const QPoint& pos, + int radius) +{ + int index = m_captureToolObjects.size() - 1; + bool useCache = true; + m_imageCache.clear(); + if (m_imageCache.size() != m_captureToolObjects.size() && index >= 0) { + // TODO - is not optimal and cache will be used just after first tool + // object selecting + m_imageCache.clear(); + useCache = false; + } + for (; index >= 0; --index) { + int currentRadius = radius; + QImage image; + auto toolItem = m_captureToolObjects.at(index); + if (useCache) { + image = m_imageCache.at(index); + } else { + // create transparent image in memory and draw toolItem on it + toolItem->drawSearchArea(painter, pixmap); + + // get color at mouse clicked position in area +/- currentRadius + image = pixmap.toImage(); + m_imageCache.insert(0, image); + } + + if (toolItem->type() == CaptureTool::TYPE_TEXT) { + if (currentRadius > SEARCH_RADIUS_NEAR) { + // Text already has a big currentRadius and no need to search + // with a bit bigger currentRadius than + // SEARCH_RADIUS_TEXT_HANDICAP + SEARCH_RADIUS_NEAR + continue; + } + + // Text has spaces inside to need to take a bigger currentRadius for + // text objects search + currentRadius += SEARCH_RADIUS_TEXT_HANDICAP; + } + + for (int x = pos.x() - currentRadius; x <= pos.x() + currentRadius; + ++x) { + for (int y = pos.y() - currentRadius; y <= pos.y() + currentRadius; + ++y) { + QRgb rgb = image.pixel(x, y); + if (rgb != 0) { + // object was found, return it index (layer index) + return index; + } + } + } + } + // no object at current pos found + return -1; +} + +CaptureToolObjects& CaptureToolObjects::operator=( + const CaptureToolObjects& other) +{ + // remove extra items for this if size is bigger + while (this->m_captureToolObjects.size() > + other.m_captureToolObjects.size()) { + this->m_captureToolObjects.removeLast(); + } + + int count = 0; + for (const auto& item : other.m_captureToolObjects) { + QPointer itemCopy = item->copy(item->parent()); + if (count < this->m_captureToolObjects.size()) { + this->m_captureToolObjects[count] = itemCopy; + } else { + this->m_captureToolObjects.append(itemCopy); + } + count++; + } + return *this; +} diff --git a/src/widgets/capture/capturetoolobjects.h b/src/widgets/capture/capturetoolobjects.h new file mode 100644 index 0000000..5c1f044 --- /dev/null +++ b/src/widgets/capture/capturetoolobjects.h @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2021 Yurii Puchkov & Contributors + +#ifndef FLAMESHOT_CAPTURETOOLOBJECTS_H +#define FLAMESHOT_CAPTURETOOLOBJECTS_H + +#include "src/tools/capturetool.h" +#include +#include + +class CaptureToolObjects : public QObject +{ +public: + explicit CaptureToolObjects(QObject* parent = nullptr); + QList> captureToolObjects(); + void append(const QPointer& captureTool); + void insert(int index, const QPointer& captureTool); + void removeAt(int index); + void clear(); + int size(); + int find(const QPoint& pos, QSize captureSize); + QPointer at(int index); + CaptureToolObjects& operator=(const CaptureToolObjects& other); + +private: + int findWithRadius(QPainter& painter, + QPixmap& pixmap, + const QPoint& pos, + int radius = 0); + + // class members + QList> m_captureToolObjects; + QVector m_imageCache; +}; + +#endif // FLAMESHOT_CAPTURETOOLOBJECTS_H diff --git a/src/widgets/capture/capturewidget.cpp b/src/widgets/capture/capturewidget.cpp new file mode 100644 index 0000000..fd86678 --- /dev/null +++ b/src/widgets/capture/capturewidget.cpp @@ -0,0 +1,2035 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +// Based on Lightscreen areadialog.cpp, Copyright 2017 Christian Kaiser +// released under the GNU GPL2 +// + +// Based on KDE's KSnapshot regiongrabber.cpp, revision 796531, Copyright 2007 +// Luca Gugelmann released under the GNU LGPL +// + +#include "capturewidget.h" +#include "abstractlogger.h" +#include "copytool.h" +#include "src/config/cacheutils.h" +#include "src/core/flameshot.h" +#include "src/core/qguiappcurrentscreen.h" +#include "src/utils/screengrabber.h" +#include "src/utils/screenshotsaver.h" +#include "src/utils/systemnotification.h" +#include "src/widgets/capture/colorpicker.h" +#include "src/widgets/capture/hovereventfilter.h" +#include "src/widgets/capture/modificationcommand.h" +#include "src/widgets/capture/notifierbox.h" +#include "src/widgets/capture/overlaymessage.h" +#include "src/widgets/orientablepushbutton.h" +#include "src/widgets/panel/sidepanelwidget.h" +#include "src/widgets/panel/utilitypanel.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if !defined(DISABLE_UPDATE_CHECKER) +#include "src/widgets/updatenotificationwidget.h" +#endif + +#define MOUSE_DISTANCE_TO_START_MOVING 3 + +// CaptureWidget is the main component used to capture the screen. It contains +// an area of selection with its respective buttons. + +// enableSaveWindow + +CaptureWidget::CaptureWidget(const CaptureRequest& req, + bool fullScreen, + QWidget* parent) + : QWidget(parent) + , m_toolSizeByKeyboard(0) + , m_mouseIsClicked(false) + , m_captureDone(false) + , m_previewEnabled(true) + , m_adjustmentButtonPressed(false) + , m_configError(false) + , m_configErrorResolved(false) +#if !defined(DISABLE_UPDATE_CHECKER) + , m_updateNotificationWidget(nullptr) +#endif + , m_lastMouseWheel(0) + , m_activeButton(nullptr) + , m_activeTool(nullptr) + , m_activeToolIsMoved(false) + , m_toolWidget(nullptr) + , m_panel(nullptr) + , m_sidePanel(nullptr) + , m_colorPicker(nullptr) + , m_selection(nullptr) + , m_magnifier(nullptr) + , m_xywhDisplay(false) + , m_existingObjectIsChanged(false) + , m_startMove(false) + +{ + m_undoStack.setUndoLimit(ConfigHandler().undoLimit()); + m_context.circleCount = 1; + + // Base config of the widget + m_eventFilter = new HoverEventFilter(this); + connect(m_eventFilter, + &HoverEventFilter::hoverIn, + this, + &CaptureWidget::childEnter); + connect(m_eventFilter, + &HoverEventFilter::hoverOut, + this, + &CaptureWidget::childLeave); + connect(&m_xywhTimer, &QTimer::timeout, this, &CaptureWidget::xywhTick); + // else xywhTick keeps triggering when not needed + m_xywhTimer.setSingleShot(true); + setAttribute(Qt::WA_DeleteOnClose); + setAttribute(Qt::WA_QuitOnClose, false); + m_opacity = m_config.contrastOpacity(); + m_uiColor = m_config.uiColor(); + m_contrastUiColor = m_config.contrastUiColor(); + setMouseTracking(true); + initContext(fullScreen, req); +#if (defined(Q_OS_WIN) || defined(Q_OS_MACOS)) + // Top left of the whole set of screens + QPoint topLeft(0, 0); +#endif + if (fullScreen) { + // Grab Screenshot + bool ok = true; + m_context.screenshot = ScreenGrabber().grabEntireDesktop(ok); + if (!ok) { + AbstractLogger::error() << tr("Unable to capture screen"); + this->close(); + } + m_context.origScreenshot = m_context.screenshot; + +#if defined(Q_OS_WIN) +// Call cmake with -DFLAMESHOT_DEBUG_CAPTURE=ON to enable easier debugging +#if !defined(FLAMESHOT_DEBUG_CAPTURE) + setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint | + Qt::SubWindow // Hides the taskbar icon + ); +#endif + + for (QScreen* const screen : QGuiApplication::screens()) { + QPoint topLeftScreen = screen->geometry().topLeft(); + + if (topLeftScreen.x() < topLeft.x()) { + topLeft.setX(topLeftScreen.x()); + } + if (topLeftScreen.y() < topLeft.y()) { + topLeft.setY(topLeftScreen.y()); + } + } + move(topLeft); + resize(pixmap().size()); +#elif defined(Q_OS_MACOS) + // Emulate fullscreen mode + // setWindowFlags(Qt::WindowStaysOnTopHint | + // Qt::BypassWindowManagerHint | + // Qt::FramelessWindowHint | + // Qt::NoDropShadowWindowHint | Qt::ToolTip | + // Qt::Popup + // ); + QScreen* currentScreen = QGuiAppCurrentScreen().currentScreen(); + move(currentScreen->geometry().x(), currentScreen->geometry().y()); + resize(currentScreen->size()); +// LINUX +#else +// Call cmake with -DFLAMESHOT_DEBUG_CAPTURE=ON to enable easier debugging +#if !defined(FLAMESHOT_DEBUG_CAPTURE) + setWindowFlags(Qt::BypassWindowManagerHint | Qt::WindowStaysOnTopHint | + Qt::FramelessWindowHint | Qt::Tool); + // Fix for Qt6 dual monitor offset: position widget to cover entire + // desktop + QRect desktopGeom = ScreenGrabber().desktopGeometry(); + move(desktopGeom.topLeft()); + resize(desktopGeom.size()); +#endif + // Need to move to the top left screen + QPoint topLeft(0, INT_MAX); + for (QScreen* const screen : QGuiApplication::screens()) { + qreal dpr = screen->devicePixelRatio(); + QPoint topLeftScreen = screen->geometry().topLeft() / dpr; + if (topLeftScreen.x() == 0) { + if (topLeftScreen.y() < topLeft.y()) { + topLeft.setY(topLeftScreen.y()); + } + } + } + move(topLeft); +#endif + } + QVector areas; + if (m_context.fullscreen) { + QPoint topLeftOffset = QPoint(0, 0); +#if defined(Q_OS_WIN) + topLeftOffset = topLeft; +#endif + +#if defined(Q_OS_MACOS) + // MacOS works just with one active display, so we need to append + // just one current display and keep multiple displays logic for + // other OS + QRect r; + QScreen* screen = QGuiAppCurrentScreen().currentScreen(); + r = screen->geometry(); + // all calculations are processed according to (0, 0) start + // point so we need to move current object to (0, 0) + r.moveTo(0, 0); + areas.append(r); +#else + // LINUX & WINDOWS + for (QScreen* const screen : QGuiApplication::screens()) { + QRect r = screen->geometry(); + r.moveTo(r.x() / screen->devicePixelRatio(), + r.y() / screen->devicePixelRatio()); + r.moveTo(r.topLeft() - topLeftOffset); + areas.append(r); + } +#endif + } else { + areas.append(rect()); + } + + m_buttonHandler = new ButtonHandler(this); + m_buttonHandler->updateScreenRegions(areas); + m_buttonHandler->hide(); + + initButtons(); + initSelection(); // button handler must be initialized before + initShortcuts(); // must be called after initSelection + // init magnify + if (m_config.showMagnifier()) { + m_magnifier = new MagnifierWidget( + m_context.screenshot, m_uiColor, m_config.squareMagnifier(), this); + } + + // Init color picker + m_colorPicker = new ColorPicker(this); + // Init notification widget + m_notifierBox = new NotifierBox(this); + initPanel(); + + // TODO: Make it more clear why this has moved. In Qt6 some timing related + // to constructors / connect signals has changed so if initPanel is called + // after the connect a SEGFAULT occurs + connect(m_colorPicker, + &ColorPicker::colorSelected, + this, + [this](const QColor& c) { + m_context.mousePos = mapFromGlobal(QCursor::pos()); + setDrawColor(c); + }); + m_colorPicker->hide(); + + // Init tool size sigslots + connect(this, + &CaptureWidget::toolSizeChanged, + this, + &CaptureWidget::onToolSizeChanged); + + m_notifierBox->hide(); + connect(m_notifierBox, &NotifierBox::hidden, this, [this]() { + // Show cursor if it was hidden while adjusting tool size + updateCursor(); + m_toolSizeByKeyboard = 0; + onToolSizeChanged(m_context.toolSize); + onToolSizeSettled(m_context.toolSize); + }); + + m_config.checkAndHandleError(); + if (m_config.hasError()) { + m_configError = true; + } + connect( + ConfigHandler::getInstance(), &ConfigHandler::error, this, [=, this]() { + m_configError = true; + m_configErrorResolved = false; + OverlayMessage::instance()->update(); + }); + connect(ConfigHandler::getInstance(), + &ConfigHandler::errorResolved, + this, + [=, this]() { + m_configError = false; + m_configErrorResolved = true; + OverlayMessage::instance()->update(); + }); + + // Qt6 has only sizes in logical values, position is in physical values. + // Move Help message to the logical pixel with devicePixelRatio. + QScreen* currentScreen = QGuiAppCurrentScreen().currentScreen(); + QRect currentScreenGeometry = currentScreen->geometry(); + qreal currentScreenDpr = currentScreen->devicePixelRatio(); + currentScreenGeometry.moveTo( + int(currentScreenGeometry.x() / currentScreenDpr), + int(currentScreenGeometry.y() / currentScreenDpr)); + OverlayMessage::init(this, currentScreenGeometry); + + if (m_config.showHelp()) { + initHelpMessage(); + OverlayMessage::push(m_helpMessage); + } + + initQuitPrompt(); + + updateCursor(); +} + +CaptureWidget::~CaptureWidget() +{ +#if defined(Q_OS_MACOS) + for (QWidget* widget : qApp->topLevelWidgets()) { + QString className(widget->metaObject()->className()); + if (0 == + className.compare(CaptureWidget::staticMetaObject.className())) { + widget->showNormal(); + widget->hide(); + break; + } + } +#endif + if (m_captureDone) { + auto lastRegion = m_selection->geometry(); + setLastRegion(lastRegion); + QRect geometry(m_context.selection); + geometry.setTopLeft(geometry.topLeft() + m_context.widgetOffset); + Flameshot::instance()->exportCapture( + pixmap(), geometry, m_context.request); + } else { + emit Flameshot::instance()->captureFailed(); + } +} + +void CaptureWidget::initButtons() +{ + auto allButtonTypes = CaptureToolButton::getIterableButtonTypes(); + auto visibleButtonTypes = m_config.buttons(); + if ((m_context.request.tasks() == CaptureRequest::NO_TASK) || + (m_context.request.tasks() == CaptureRequest::PRINT_GEOMETRY)) { + allButtonTypes.removeOne(CaptureTool::TYPE_ACCEPT); + visibleButtonTypes.removeOne(CaptureTool::TYPE_ACCEPT); + } else { + // Remove irrelevant buttons from both lists + for (auto* buttonList : { &allButtonTypes, &visibleButtonTypes }) { + buttonList->removeOne(CaptureTool::TYPE_SAVE); + buttonList->removeOne(CaptureTool::TYPE_COPY); +#ifdef ENABLE_IMGUR + buttonList->removeOne(CaptureTool::TYPE_IMAGEUPLOADER); +#endif + buttonList->removeOne(CaptureTool::TYPE_OPEN_APP); + buttonList->removeOne(CaptureTool::TYPE_PIN); + } + } + QVector vectorButtons; + + // Add all buttons but hide those that were disabled in the Interface config + // This will allow keyboard shortcuts for those buttons to work + for (CaptureTool::Type t : allButtonTypes) { + auto* b = new CaptureToolButton(t, this); + b->setColor(m_uiColor); + b->hide(); + // must be enabled for SelectionWidget's eventFilter to work correctly + b->setAttribute(Qt::WA_NoMousePropagation); + makeChild(b); + + switch (t) { + case CaptureTool::TYPE_UNDO: + case CaptureTool::TYPE_REDO: + // nothing to do, just skip non-dynamic buttons with existing + // hard coded slots + break; + default: + // Set shortcuts for a tool + QString shortcut = + ConfigHandler().shortcut(QVariant::fromValue(t).toString()); + if (!shortcut.isNull()) { + auto shortcuts = newShortcut(shortcut, this, nullptr); + for (auto* sc : shortcuts) { + connect(sc, &QShortcut::activated, this, [=, this]() { + setState(b); + }); + } + } + break; + } + + m_tools[t] = b->tool(); + + connect(b->tool(), + &CaptureTool::requestAction, + this, + &CaptureWidget::handleToolSignal); + + if (visibleButtonTypes.contains(t)) { + connect(b, + &CaptureToolButton::pressedButtonLeftClick, + this, + &CaptureWidget::handleButtonLeftClick); + + if (b->tool()->isSelectable()) { + connect(b, + &CaptureToolButton::pressedButtonRightClick, + this, + &CaptureWidget::handleButtonRightClick); + } + + vectorButtons << b; + } + } + m_buttonHandler->setButtons(vectorButtons); +} + +void CaptureWidget::handleButtonRightClick(CaptureToolButton* b) +{ + if (!b) { + return; + } + + // if button already selected, do not deselect it on right click + if (!m_activeButton || m_activeButton != b) { + setState(b); + } + if (!m_panel->isVisible()) { + m_panel->show(); + } +} + +void CaptureWidget::handleButtonLeftClick(CaptureToolButton* b) +{ + if (!b) { + return; + } + setState(b); +} + +void CaptureWidget::xywhTick() +{ + m_xywhDisplay = false; + update(); +} + +void CaptureWidget::onDisplayGridChanged(bool display) +{ + m_displayGrid = display; + repaint(); +} + +void CaptureWidget::onGridSizeChanged(int size) +{ + m_gridSize = size; + repaint(); +} + +void CaptureWidget::startColorGrab() +{ + if (m_sidePanel) { + m_sidePanel->startColorGrab(); + } +} + +void CaptureWidget::showxywh() +{ + m_xywhDisplay = true; + update(); + int timeout = m_config.showSelectionGeometryHideTime(); + if (timeout != 0) { + m_xywhTimer.start(timeout); + } +} + +void CaptureWidget::initHelpMessage() +{ + QList> keyMap; + keyMap << std::pair(tr("Mouse"), tr("Select screenshot area")); + using CT = CaptureTool; + for (auto toolType : { CT::TYPE_ACCEPT, CT::TYPE_SAVE, CT::TYPE_COPY }) { + if (!m_tools.contains(toolType)) { + continue; + } + auto* tool = m_tools[toolType]; + QString shortcut = + ConfigHandler().shortcut(QVariant::fromValue(toolType).toString()); + shortcut.replace("Return", "Enter"); + if (!shortcut.isEmpty()) { + keyMap << std::pair(shortcut, tool->description()); + } + } + keyMap << std::pair(tr("Mouse Wheel"), tr("Change tool size")); + keyMap << std::pair(tr("Right Click"), tr("Show color picker")); + keyMap << std::pair(ConfigHandler().shortcut("TYPE_TOGGLE_PANEL"), + tr("Open side panel")); + keyMap << std::pair(tr("Esc"), tr("Exit")); + + m_helpMessage = OverlayMessage::compileFromKeyMap(keyMap); +} + +QPixmap CaptureWidget::pixmap() +{ + return m_context.selectedScreenshotArea(); +} + +// Finish whatever the current tool is doing, if there is a current active +// tool. +bool CaptureWidget::commitCurrentTool() +{ + if (m_activeTool) { + processPixmapWithTool(&m_context.screenshot, m_activeTool); + if (m_activeTool->isValid() && !m_activeTool->editMode() && + m_toolWidget) { + pushToolToStack(); + } + if (m_toolWidget) { + m_toolWidget->update(); + } + releaseActiveTool(); + return true; + } + return false; +} + +void CaptureWidget::initQuitPrompt() +{ + m_quitPrompt = new QMessageBox; + makeChild(m_quitPrompt); + + QString baseSheet = "QDialog { background-color: %1; }" + "QLabel, QCheckBox { color: %2 }" + "QPushButton { background-color: %1; color: %2 }"; + QColor text = ColorUtils::colorIsDark(m_uiColor) ? Qt::white : Qt::black; + QString styleSheet = baseSheet.arg(m_uiColor.name(), text.name()); + + m_quitPrompt->setStyleSheet(styleSheet); + m_quitPrompt->setWindowTitle(tr("Quit Capture")); + m_quitPrompt->setText(tr("Are you sure you want to quit capture?")); + m_quitPrompt->setIcon(QMessageBox::Icon::Question); + m_quitPrompt->setStandardButtons(QMessageBox::Yes | QMessageBox::No); + m_quitPrompt->setDefaultButton(QMessageBox::No); + + auto* check = new QCheckBox(tr("Do not show this again")); + m_quitPrompt->setCheckBox(check); + + // Call show() first, otherwise the correct geometry cannot be fetched + // for centering the window on the screen + m_quitPrompt->show(); + QRect position = m_quitPrompt->frameGeometry(); + QScreen* currentScreen = QGuiAppCurrentScreen().currentScreen(); + position.moveCenter(currentScreen->availableGeometry().center()); + m_quitPrompt->move(position.topLeft()); + m_quitPrompt->hide(); + + QObject::connect(check, &QCheckBox::clicked, [](bool checked) { + ConfigHandler().setShowQuitPrompt(!checked); + }); +} + +bool CaptureWidget::promptQuit() +{ + return m_quitPrompt->exec() == QMessageBox::Yes; +} + +void CaptureWidget::deleteToolWidgetOrClose() +{ + if (m_activeButton != nullptr) { + uncheckActiveTool(); + } else if (m_panel->activeLayerIndex() >= 0) { + // remove active tool selection + m_panel->setActiveLayer(-1); + } else if (m_panel->isVisible()) { + // hide panel if visible + m_panel->hide(); + } else if (m_toolWidget) { + // delete toolWidget if exists + m_toolWidget->hide(); + delete m_toolWidget; + m_toolWidget = nullptr; + } else if (m_colorPicker && m_colorPicker->isVisible()) { + m_colorPicker->hide(); + } else { + // close CaptureWidget + if (m_config.showQuitPrompt()) { + // need to show prompt + if (m_quitPrompt->isHidden() && promptQuit()) { + close(); + } + } else { + close(); + } + } +} + +void CaptureWidget::releaseActiveTool() +{ + if (m_activeTool) { + if (m_activeTool->editMode()) { + // Object shouldn't be deleted here because it is in the undo/redo + // stack, just set current pointer to null + m_activeTool->setEditMode(false); + if (m_activeTool->isChanged()) { + pushObjectsStateToUndoStack(); + } + } else { + delete m_activeTool; + } + m_activeTool = nullptr; + } + if (m_toolWidget) { + m_toolWidget->hide(); + delete m_toolWidget; + m_toolWidget = nullptr; + } +} + +void CaptureWidget::uncheckActiveTool() +{ + // uncheck active tool + m_panel->setToolWidget(nullptr); + m_activeButton->setColor(m_uiColor); + updateTool(activeButtonTool()); + m_activeButton = nullptr; + releaseActiveTool(); + updateSelectionState(); + updateCursor(); +} + +void CaptureWidget::paintEvent(QPaintEvent* paintEvent) +{ + Q_UNUSED(paintEvent) + QPainter painter(this); + GeneralConf::xywh_position position = + static_cast(m_config.showSelectionGeometry()); + /* QPainter::save and restore is somewhat costly so we try to guess + if we need to do it here. What that means is that if you add + anything to the paintEvent and want to save/restore you should + add a test to the below if statement -- also if you change + any of the conditions that current trigger it you'll need to change here, + too + */ + bool save = false; + if (m_xywhDisplay || // clause 1: xywh display + m_displayGrid || // clause 2: display grid + (m_activeTool && m_mouseIsClicked) || // clause 3: tool/click + (m_previewEnabled && activeButtonTool() && // clause 4: mouse preview + m_activeButton->tool()->showMousePreview())) { + painter.save(); + save = true; + } + painter.drawPixmap(0, 0, m_context.screenshot); + if (m_selection && m_xywhDisplay) { + const QRect& selection = m_selection->geometry().normalized(); + const qreal scale = m_context.screenshot.devicePixelRatio(); + QRect xybox; + QFontMetrics fm = painter.fontMetrics(); + + QString xy = + QString("%1x%2+%3+%4") + .arg(QString::number(static_cast(selection.width() * scale)), + QString::number(static_cast(selection.height() * scale)), + QString::number(static_cast(selection.left() * scale)), + QString::number(static_cast(selection.top() * scale))); + + xybox = fm.boundingRect(xy); + // the small numbers here are just margins so the text doesn't + // smack right up to the box; they aren't critical and the box + // size itself is tied to the font metrics + xybox.adjust(0, 0, 10, 12); + // in anticipation of making the position adjustable + int x0, y0; + // Move these to header + + switch (position) { + case GeneralConf::xywh_top_left: + x0 = selection.left(); + y0 = selection.top(); + break; + case GeneralConf::xywh_bottom_left: + x0 = selection.left(); + y0 = selection.bottom() - xybox.height(); + break; + case GeneralConf::xywh_top_right: + x0 = selection.right() - xybox.width(); + y0 = selection.top(); + break; + case GeneralConf::xywh_bottom_right: + x0 = selection.right() - xybox.width(); + y0 = selection.bottom() - xybox.height(); + break; + case GeneralConf::xywh_center: + default: + x0 = selection.left() + (selection.width() - xybox.width()) / 2; + y0 = + selection.top() + (selection.height() - xybox.height()) / 2; + } + + QColor uicolor = ConfigHandler().uiColor(); + uicolor.setAlpha(200); + painter.fillRect( + x0, y0, xybox.width(), xybox.height(), QBrush(uicolor)); + painter.setPen(ColorUtils::colorIsDark(uicolor) ? Qt::white + : Qt::black); + painter.drawText(x0, + y0, + xybox.width(), + xybox.height(), + Qt::AlignVCenter | Qt::AlignHCenter, + xy); + } + + if (m_displayGrid) { + QColor uicolor = ConfigHandler().uiColor(); + uicolor.setAlpha(100); + painter.setPen(uicolor); + painter.setBrush(QBrush(uicolor)); + + const auto scale{ m_context.screenshot.devicePixelRatio() }; + auto topLeft = mapToGlobal(m_context.selection.topLeft() / scale); + topLeft.rx() -= topLeft.x() % m_gridSize; + topLeft.ry() -= topLeft.y() % m_gridSize; + topLeft = mapFromGlobal(topLeft); + + const auto step{ m_gridSize / scale }; + const auto radius{ 1 * scale }; + + for (int y = topLeft.y(); y < m_context.selection.bottom() / scale; + y += step) { + for (int x = topLeft.x(); x < m_context.selection.right() / scale; + x += step) { + painter.drawEllipse(x, y, radius, radius); + } + } + } + + if (m_activeTool && m_mouseIsClicked) { + m_activeTool->process(painter, m_context.screenshot); + } else if (m_previewEnabled && activeButtonTool() && + m_activeButton->tool()->showMousePreview()) { + m_activeButton->tool()->paintMousePreview(painter, m_context); + } + if (save) + painter.restore(); + // draw inactive region + drawInactiveRegion(&painter); + + if (!isActiveWindow()) { + drawErrorMessage( + tr("Flameshot has lost focus. Keyboard shortcuts won't " + "work until you click somewhere."), + &painter); + } else if (m_configError) { + drawErrorMessage(ConfigHandler().errorMessage(), &painter); + } else if (m_configErrorResolved) { + drawErrorMessage(tr("Configuration error resolved. Launch `flameshot " + "gui` again to apply it."), + &painter); + } +} + +void CaptureWidget::showColorPicker(const QPoint& pos) +{ + // Try to select new object if current pos out of active object + auto toolItem = activeToolObject(); + if (!toolItem || (toolItem && !toolItem->boundingRect().contains(pos))) { + selectToolItemAtPos(pos); + } + + // save current state for undo/redo stack + if (m_panel->activeLayerIndex() >= 0) { + m_captureToolObjectsBackup = m_captureToolObjects; + } + + // Call color picker + m_colorPicker->move(pos.x() - m_colorPicker->width() / 2, + pos.y() - m_colorPicker->height() / 2); + m_colorPicker->raise(); + m_colorPicker->show(); +} + +bool CaptureWidget::startDrawObjectTool(const QPoint& pos) +{ + if (activeButtonToolType() != CaptureTool::NONE && + activeButtonToolType() != CaptureTool::TYPE_MOVESELECTION) { + if (commitCurrentTool()) { + return false; + } + m_activeTool = m_activeButton->tool()->copy(this); + + connect(this, + &CaptureWidget::colorChanged, + m_activeTool, + &CaptureTool::onColorChanged); + connect(this, + &CaptureWidget::toolSizeChanged, + m_activeTool, + &CaptureTool::onSizeChanged); + connect(m_activeTool, + &CaptureTool::requestAction, + this, + &CaptureWidget::handleToolSignal); + + m_context.mousePos = m_displayGrid ? snapToGrid(pos) : pos; + m_activeTool->drawStart(m_context); + // TODO this is the wrong place to do this + + if (m_activeTool->type() == CaptureTool::TYPE_CIRCLECOUNT) { + m_activeTool->setCount(m_context.circleCount++); + } + + return true; + } + return false; +} + +void CaptureWidget::pushObjectsStateToUndoStack() +{ + m_undoStack.push(new ModificationCommand( + this, m_captureToolObjects, m_captureToolObjectsBackup)); + m_captureToolObjectsBackup.clear(); +} + +int CaptureWidget::selectToolItemAtPos(const QPoint& pos) +{ + // Try to select existing tool, "-1" - no active tool + int activeLayerIndex = -1; + auto selectionMouseSide = m_selection->getMouseSide(pos); + if (m_activeButton.isNull() && + m_captureToolObjects.captureToolObjects().size() > 0 && + (selectionMouseSide == SelectionWidget::NO_SIDE || + selectionMouseSide == SelectionWidget::CENTER)) { + auto toolItem = activeToolObject(); + if (!toolItem || + (toolItem && !toolItem->boundingRect().contains(pos))) { + activeLayerIndex = m_captureToolObjects.find(pos, size()); + int oldToolSize = m_context.toolSize; + m_panel->setActiveLayer(activeLayerIndex); + drawObjectSelection(); + if (oldToolSize != m_context.toolSize) { + emit toolSizeChanged(m_context.toolSize); + } + } + } + return activeLayerIndex; +} + +void CaptureWidget::mousePressEvent(QMouseEvent* e) +{ + activateWindow(); + m_startMove = false; + m_startMovePos = QPoint(); + m_mousePressedPos = e->pos(); + m_activeToolOffsetToMouseOnStart = QPoint(); + if (m_colorPicker->isVisible()) { + updateCursor(); + return; + } + // reset object selection if capture area selection is active + if (m_selection->getMouseSide(e->pos()) != SelectionWidget::CENTER) { + m_panel->setActiveLayer(-1); + } + if (e->button() == Qt::RightButton) { + if (m_activeTool && m_activeTool->editMode()) { + return; + } + showColorPicker(m_mousePressedPos); + return; + } else if (e->button() == Qt::LeftButton) { + m_mouseIsClicked = true; + + // Click using a tool excluding tool MOVE + if (startDrawObjectTool(m_mousePressedPos)) { + // return if success + return; + } + } + + // Commit current tool if it has edit widget and mouse click is outside + // of it + if (m_toolWidget && !m_toolWidget->geometry().contains(e->pos())) { + commitCurrentTool(); + m_panel->setToolWidget(nullptr); + drawToolsData(); + updateLayersPanel(); + } + + selectToolItemAtPos(m_mousePressedPos); + updateSelectionState(); + updateCursor(); +} + +void CaptureWidget::mouseDoubleClickEvent(QMouseEvent* event) +{ + int activeLayerIndex = m_panel->activeLayerIndex(); + if (activeLayerIndex != -1) { + // Start object editing + auto activeTool = m_captureToolObjects.at(activeLayerIndex); + if (activeTool && activeTool->type() == CaptureTool::TYPE_TEXT) { + m_activeTool = activeTool; + m_mouseIsClicked = false; + m_context.mousePos = *m_activeTool->pos(); + m_captureToolObjectsBackup = m_captureToolObjects; + m_activeTool->setEditMode(true); + drawToolsData(); + updateLayersPanel(); + handleToolSignal(CaptureTool::REQ_ADD_CHILD_WIDGET); + m_panel->setToolWidget(m_activeTool->configurationWidget()); + } + } else if (m_selection->geometry().contains(event->pos())) { + if ((event->button() == Qt::LeftButton) && + (m_config.copyOnDoubleClick())) { + CopyTool copyTool; + connect(©Tool, + &CopyTool::requestAction, + this, + &CaptureWidget::handleToolSignal); + copyTool.pressed(m_context); + qApp->processEvents(QEventLoop::ExcludeUserInputEvents); + } + } +} + +void CaptureWidget::mouseMoveEvent(QMouseEvent* e) +{ + if (m_magnifier) { + if (!m_activeButton) { + m_magnifier->show(); + m_magnifier->update(); + } else { + m_magnifier->hide(); + } + } + + m_context.mousePos = e->pos(); + if (e->buttons() != Qt::LeftButton) { + updateTool(activeButtonTool()); + updateCursor(); + return; + } + + // The rest assumes that left mouse button is clicked + if (!m_activeButton && m_panel->activeLayerIndex() >= 0) { + // Move existing object + if (!m_startMove) { + // Check for the minimal offset to start moving an object + if (m_startMovePos.isNull()) { + m_startMovePos = e->pos(); + } + if ((e->pos() - m_startMovePos).manhattanLength() > + MOUSE_DISTANCE_TO_START_MOVING) { + m_startMove = true; + } + } + if (m_startMove) { + QPointer activeTool = + m_captureToolObjects.at(m_panel->activeLayerIndex()); + if (m_activeToolOffsetToMouseOnStart.isNull()) { + setCursor(Qt::ClosedHandCursor); + m_activeToolOffsetToMouseOnStart = + e->pos() - *activeTool->pos(); + } + if (!m_activeToolIsMoved) { + // save state before movement for undo stack + m_captureToolObjectsBackup = m_captureToolObjects; + } + m_activeToolIsMoved = true; + // update the old region of the selection, margins are added to + // ensure selection outline is updated too + update(paddedUpdateRect(activeTool->boundingRect())); + activeTool->move(e->pos() - m_activeToolOffsetToMouseOnStart); + drawToolsData(); + } + } else if (m_activeTool) { + // drawing with a tool + if (m_adjustmentButtonPressed) { + m_activeTool->drawMoveWithAdjustment(e->pos()); + } else { + m_activeTool->drawMove(m_displayGrid ? snapToGrid(e->pos()) + : e->pos()); + } + // update drawing object + updateTool(m_activeTool); + // Hides the buttons under the mouse. If the mouse leaves, it shows + // them. + if (m_buttonHandler->buttonsAreInside()) { + const bool containsMouse = + m_buttonHandler->contains(m_context.mousePos); + if (containsMouse) { + m_buttonHandler->hide(); + } else if (m_selection->isVisible()) { + m_buttonHandler->show(); + } + } + } + updateCursor(); +} + +void CaptureWidget::mouseReleaseEvent(QMouseEvent* e) +{ + if (e->button() == Qt::LeftButton && m_colorPicker->isVisible()) { + // Color picker + if (m_colorPicker->isVisible() && m_panel->activeLayerIndex() >= 0 && + m_context.color.isValid()) { + pushObjectsStateToUndoStack(); + } + m_colorPicker->setNewColor(); + m_colorPicker->hide(); + if (!m_context.color.isValid()) { + m_context.color = ConfigHandler().drawColor(); + m_panel->show(); + } + } else if (m_mouseIsClicked) { + if (m_activeTool) { + // end draw/edit + m_activeTool->drawEnd(m_context.mousePos); + if (m_activeTool->isValid()) { + pushToolToStack(); + } else if (!m_toolWidget) { + releaseActiveTool(); + } + } else { + if (m_activeToolIsMoved) { + m_activeToolIsMoved = false; + pushObjectsStateToUndoStack(); + } + } + } + m_mouseIsClicked = false; + m_activeToolIsMoved = false; + + updateSelectionState(); + updateCursor(); +} + +/** + * Was updateThickness. + * - Update tool mouse preview + * - Show notifier box displaying the new thickness + * - Update selected object thickness + */ +void CaptureWidget::setToolSize(int size) +{ + int oldSize = m_context.toolSize; + m_context.toolSize = qBound(1, size, maxToolSize); + updateTool(activeButtonTool()); + + QPoint topLeft = + QGuiAppCurrentScreen().currentScreen()->geometry().topLeft(); + int offset = m_notifierBox->width() / 4; + m_notifierBox->move(mapFromGlobal(topLeft) + QPoint(offset, offset)); + m_notifierBox->showMessage(QString::number(m_context.toolSize)); + + if (m_context.toolSize != oldSize) { + emit toolSizeChanged(m_context.toolSize); + } +} + +void CaptureWidget::keyPressEvent(QKeyEvent* e) +{ + // If the key is a digit, change the tool size + bool ok; + int digit = e->text().toInt(&ok); + if (ok && ((e->modifiers() == Qt::NoModifier) || + e->modifiers() == Qt::KeypadModifier)) { // digit received + m_toolSizeByKeyboard = 10 * m_toolSizeByKeyboard + digit; + setToolSize(m_toolSizeByKeyboard); + if (m_context.toolSize != m_toolSizeByKeyboard) { + // The tool size was out of range and was clipped by setToolSize + m_toolSizeByKeyboard = 0; + } + } else { + m_toolSizeByKeyboard = 0; + } + + if (!m_selection->isVisible()) { + return; + } else if (e->key() == Qt::Key_Control) { + m_adjustmentButtonPressed = true; + updateCursor(); + } else if (e->key() == Qt::Key_Enter) { + // Make no difference for Return and Enter keys + QCoreApplication::postEvent( + this, + new QKeyEvent(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier)); + } +} + +void CaptureWidget::keyReleaseEvent(QKeyEvent* e) +{ + if (e->key() == Qt::Key_Control) { + m_adjustmentButtonPressed = false; + updateCursor(); + } +} + +void CaptureWidget::wheelEvent(QWheelEvent* e) +{ + /* Mouse scroll usually gives value 120, not more or less, just how many + * times. + * Touchpad gives the value 2 or more (usually 2-8), it doesn't give + * too big values like mouse wheel on normal scrolling, so it is almost + * impossible to scroll. It's easier to calculate number of requests and do + * not accept events faster that one in 200ms. + * */ + int toolSizeOffset = 0; + if (e->angleDelta().y() >= 60) { + // mouse scroll (wheel) increment + toolSizeOffset = 1; + } else if (e->angleDelta().y() <= -60) { + // mouse scroll (wheel) decrement + toolSizeOffset = -1; + } else { + // touchpad scroll + qint64 current = QDateTime::currentMSecsSinceEpoch(); + if ((current - m_lastMouseWheel) > 200) { + if (e->angleDelta().y() > 0) { + toolSizeOffset = 1; + } else if (e->angleDelta().y() < 0) { + toolSizeOffset = -1; + } + m_lastMouseWheel = current; + } else { + return; + } + } + + setToolSize(m_context.toolSize + toolSizeOffset); +} + +void CaptureWidget::resizeEvent(QResizeEvent* e) +{ + QWidget::resizeEvent(e); + m_context.widgetOffset = mapToGlobal(QPoint(0, 0)); + if (!m_context.fullscreen) { + m_panel->setFixedHeight(height()); + m_buttonHandler->updateScreenRegions(rect()); + } +} + +void CaptureWidget::moveEvent(QMoveEvent* e) +{ + QWidget::moveEvent(e); + m_context.widgetOffset = mapToGlobal(QPoint(0, 0)); +} + +void CaptureWidget::changeEvent(QEvent* e) +{ + if (e->type() == QEvent::ActivationChange) { + QPoint bottomRight = rect().bottomRight(); + // Update the message in the bottom right corner. A rough estimate is + // used for the update rect + update(QRect(bottomRight - QPoint(1000, 200), bottomRight)); + } +} + +void CaptureWidget::initContext(bool fullscreen, const CaptureRequest& req) +{ + m_context.color = m_config.drawColor(); + m_context.widgetOffset = mapToGlobal(QPoint(0, 0)); + m_context.mousePos = mapFromGlobal(QCursor::pos()); + m_context.toolSize = m_config.drawThickness(); + m_context.fullscreen = fullscreen; + + // initialize m_context.request + m_context.request = req; +} + +void CaptureWidget::initPanel() +{ + QRect panelRect = rect(); + if (m_context.fullscreen) { +#if (defined(Q_OS_MACOS) || defined(Q_OS_LINUX)) + QScreen* currentScreen = QGuiAppCurrentScreen().currentScreen(); + panelRect = currentScreen->geometry(); + auto devicePixelRatio = currentScreen->devicePixelRatio(); + panelRect.moveTo(static_cast(panelRect.x() / devicePixelRatio), + static_cast(panelRect.y() / devicePixelRatio)); +#else + panelRect = QGuiApplication::primaryScreen()->geometry(); + auto devicePixelRatio = + QGuiApplication::primaryScreen()->devicePixelRatio(); + panelRect.moveTo(panelRect.x() / devicePixelRatio, + panelRect.y() / devicePixelRatio); +#endif + } + + if (ConfigHandler().showSidePanelButton()) { + auto* panelToggleButton = + new OrientablePushButton(tr("Tool Settings"), this); + makeChild(panelToggleButton); + panelToggleButton->setColor(m_uiColor); + panelToggleButton->setOrientation( + OrientablePushButton::VerticalBottomToTop); +#if defined(Q_OS_MACOS) + panelToggleButton->move( + 0, + static_cast(panelRect.height() / 2) - + static_cast(panelToggleButton->width() / 2)); +#else + panelToggleButton->move(panelRect.x(), + panelRect.y() + panelRect.height() / 2 - + panelToggleButton->width() / 2); +#endif + panelToggleButton->setCursor(Qt::ArrowCursor); + (new DraggableWidgetMaker(this))->makeDraggable(panelToggleButton); + connect(panelToggleButton, + &QPushButton::clicked, + this, + &CaptureWidget::togglePanel); + } + + m_panel = new UtilityPanel(this); + m_panel->hide(); + makeChild(m_panel); +#if defined(Q_OS_MACOS) + QScreen* currentScreen = QGuiAppCurrentScreen().currentScreen(); + panelRect.moveTo(mapFromGlobal(panelRect.topLeft())); + m_panel->setFixedWidth(static_cast(m_colorPicker->width() * 1.5)); + m_panel->setFixedHeight(currentScreen->geometry().height()); +#else + panelRect.moveTo(mapFromGlobal(panelRect.topLeft())); + panelRect.setWidth(m_colorPicker->width() * 1.5); + m_panel->setGeometry(panelRect); +#endif + connect(m_panel, + &UtilityPanel::layerChanged, + this, + &CaptureWidget::updateActiveLayer); + connect(m_panel, + &UtilityPanel::moveUpClicked, + this, + &CaptureWidget::onMoveCaptureToolUp); + connect(m_panel, + &UtilityPanel::moveDownClicked, + this, + &CaptureWidget::onMoveCaptureToolDown); + + m_sidePanel = new SidePanelWidget(&m_context.screenshot, this); + connect(m_sidePanel, + &SidePanelWidget::colorChanged, + this, + &CaptureWidget::setDrawColor); + connect(m_sidePanel, + &SidePanelWidget::toolSizeChanged, + this, + &CaptureWidget::onToolSizeChanged); + connect(this, + &CaptureWidget::colorChanged, + m_sidePanel, + &SidePanelWidget::onColorChanged); + connect(this, + &CaptureWidget::toolSizeChanged, + m_sidePanel, + &SidePanelWidget::onToolSizeChanged); + connect(m_sidePanel, + &SidePanelWidget::togglePanel, + m_panel, + &UtilityPanel::toggle); + connect( + m_sidePanel, &SidePanelWidget::showPanel, m_panel, &UtilityPanel::show); + connect( + m_sidePanel, &SidePanelWidget::hidePanel, m_panel, &UtilityPanel::hide); + connect(m_sidePanel, + &SidePanelWidget::displayGridChanged, + this, + &CaptureWidget::onDisplayGridChanged); + connect(m_sidePanel, + &SidePanelWidget::gridSizeChanged, + this, + &CaptureWidget::onGridSizeChanged); + // TODO replace with a CaptureWidget signal + emit m_sidePanel->colorChanged(m_context.color); + emit toolSizeChanged(m_context.toolSize); + m_panel->pushWidget(m_sidePanel); + + // Fill undo/redo/history list widget + m_panel->fillCaptureTools(m_captureToolObjects.captureToolObjects()); +} + +#if !defined(DISABLE_UPDATE_CHECKER) +void CaptureWidget::showAppUpdateNotification(const QString& appLatestVersion, + const QString& appLatestUrl) +{ + if (!ConfigHandler().checkForUpdates()) { + // option check for updates disabled + return; + } + if (nullptr == m_updateNotificationWidget) { + m_updateNotificationWidget = + new UpdateNotificationWidget(this, appLatestVersion, appLatestUrl); + } +#if defined(Q_OS_MACOS) + int ax = (width() - m_updateNotificationWidget->width()) / 2; +#else + QRect helpRect; + QScreen* currentScreen = QGuiAppCurrentScreen().currentScreen(); + if (currentScreen) { + helpRect = currentScreen->geometry(); + } else { + helpRect = QGuiApplication::primaryScreen()->geometry(); + } + int ax = helpRect.left() + + ((helpRect.width() - m_updateNotificationWidget->width()) / 2); +#endif + m_updateNotificationWidget->move(ax, 0); + makeChild(m_updateNotificationWidget); + m_updateNotificationWidget->show(); +} +#endif + +void CaptureWidget::initSelection() +{ + // Be mindful of the order of statements, so that slots are called properly + m_selection = new SelectionWidget(m_uiColor, this); + QRect initialSelection = m_context.request.initialSelection(); + connect(m_selection, &SelectionWidget::geometryChanged, this, [this]() { + QRect constrainedToCaptureArea = + m_selection->geometry().intersected(rect()); + m_context.selection = extendedRect(constrainedToCaptureArea); + + m_buttonHandler->hide(); + updateCursor(); + updateSizeIndicator(); + OverlayMessage::pop(); + }); + connect(m_selection, &SelectionWidget::geometrySettled, this, [this]() { + if (m_selection->isVisibleTo(this)) { + auto& req = m_context.request; + if (req.tasks() & CaptureRequest::ACCEPT_ON_SELECT) { + req.removeTask(CaptureRequest::ACCEPT_ON_SELECT); + m_captureDone = true; + close(); + } + m_buttonHandler->updatePosition(m_selection->geometry()); + m_buttonHandler->show(); + } else { + m_buttonHandler->hide(); + } + }); + connect(m_selection, &SelectionWidget::visibilityChanged, this, [this]() { + if (!m_selection->isVisible() && !m_helpMessage.isEmpty()) { + OverlayMessage::push(m_helpMessage); + } + }); + if (!initialSelection.isNull()) { + const qreal scale = m_context.screenshot.devicePixelRatio(); + initialSelection.moveTopLeft(initialSelection.topLeft() - + mapToGlobal(QPoint(0, 0))); + initialSelection.setTop(initialSelection.top() / scale); + initialSelection.setBottom(initialSelection.bottom() / scale); + initialSelection.setLeft(initialSelection.left() / scale); + initialSelection.setRight(initialSelection.right() / scale); + } + m_selection->setGeometry(initialSelection); + m_selection->setVisible(!initialSelection.isNull()); + if (!initialSelection.isNull()) { + m_context.selection = extendedRect(m_selection->geometry()); + emit m_selection->geometrySettled(); + } +} + +void CaptureWidget::setState(CaptureToolButton* b) +{ + if (!b) { + return; + } + + commitCurrentTool(); + if (m_toolWidget && m_activeTool) { + if (m_activeTool->isValid()) { + pushToolToStack(); + } else { + releaseActiveTool(); + } + } + if (m_activeButton != b) { + auto backup = m_activeTool; + // The tool is active during the pressed(). + // This must be done in order to handle tool requests correctly. + m_activeTool = b->tool(); + m_activeTool->pressed(m_context); + m_activeTool = backup; + } + + if (b->tool()->isSelectable()) { + if (m_activeButton != b) { + if (m_activeButton) { + m_activeButton->setColor(m_uiColor); + } + m_activeButton = b; + m_activeButton->setColor(m_contrastUiColor); + m_panel->setActiveLayer(-1); + m_panel->setToolWidget(b->tool()->configurationWidget()); + } else if (m_activeButton) { + m_panel->clearToolWidget(); + m_activeButton->setColor(m_uiColor); + m_activeButton = nullptr; + } + m_context.toolSize = ConfigHandler().toolSize(activeButtonToolType()); + emit toolSizeChanged(m_context.toolSize); + updateCursor(); + updateSelectionState(); + updateTool(b->tool()); + } +} + +void CaptureWidget::handleToolSignal(CaptureTool::Request r) +{ + switch (r) { + case CaptureTool::REQ_CLOSE_GUI: + close(); + break; + case CaptureTool::REQ_HIDE_GUI: + hide(); + break; + case CaptureTool::REQ_UNDO_MODIFICATION: + undo(); + break; + case CaptureTool::REQ_REDO_MODIFICATION: + redo(); + break; + case CaptureTool::REQ_SHOW_COLOR_PICKER: + // TODO + break; + case CaptureTool::REQ_CAPTURE_DONE_OK: + m_captureDone = true; + break; + case CaptureTool::REQ_CLEAR_SELECTION: + if (m_panel->activeLayerIndex() >= 0) { + m_panel->setActiveLayer(-1); + drawToolsData(false); + } + break; + case CaptureTool::REQ_ADD_CHILD_WIDGET: + if (!m_activeTool) { + break; + } + if (m_toolWidget) { + m_toolWidget->hide(); + delete m_toolWidget; + m_toolWidget = nullptr; + } + m_toolWidget = m_activeTool->widget(); + if (m_toolWidget) { + makeChild(m_toolWidget); + m_toolWidget->move(m_context.mousePos); + m_toolWidget->show(); + m_toolWidget->setFocus(); + } + break; + case CaptureTool::REQ_ADD_EXTERNAL_WIDGETS: + if (!m_activeTool) { + break; + } else { + QWidget* w = m_activeTool->widget(); + w->setAttribute(Qt::WA_DeleteOnClose); + w->activateWindow(); + w->show(); + Flameshot::instance()->setExternalWidget(true); + } + break; + case CaptureTool::REQ_INCREASE_TOOL_SIZE: + setToolSize(m_context.toolSize + 1); + break; + case CaptureTool::REQ_DECREASE_TOOL_SIZE: + setToolSize(m_context.toolSize - 1); + break; + default: + break; + } +} + +/** + * Was setDrawThickness + * - Update config options + * - Update tool object thickness + */ +void CaptureWidget::onToolSizeChanged(int t) +{ + + m_context.toolSize = t; + CaptureTool* tool = activeButtonTool(); + if (tool && tool->showMousePreview()) { + setCursor(Qt::BlankCursor); + tool->onSizeChanged(t); + } + + // update tool size of object being drawn + if (m_activeTool != nullptr) { + updateTool(m_activeTool); + } + + // update tool size of selected object + auto toolItem = activeToolObject(); + if (toolItem) { + // Change thickness + toolItem->onSizeChanged(t); + if (!m_existingObjectIsChanged) { + m_captureToolObjectsBackup = m_captureToolObjects; + m_existingObjectIsChanged = true; + } + drawToolsData(); + updateTool(toolItem); + } + + // Force a repaint to prevent artifacting + this->repaint(); +} + +void CaptureWidget::onToolSizeSettled(int size) +{ + m_config.setToolSize(activeButtonToolType(), size); +} + +void CaptureWidget::setDrawColor(const QColor& c) +{ + m_context.color = c; + if (m_context.color.isValid()) { + ConfigHandler().setDrawColor(m_context.color); + emit colorChanged(c); + // Update mouse preview + updateTool(activeButtonTool()); + + // change color for the active tool + auto toolItem = activeToolObject(); + if (toolItem) { + // Change color + toolItem->onColorChanged(c); + drawToolsData(); + } + } +} + +void CaptureWidget::updateActiveLayer(int layer) +{ + // TODO - refactor this part, make all objects to work with + // m_activeTool->isChanged() and remove m_existingObjectIsChanged + if (m_activeTool && m_activeTool->type() == CaptureTool::TYPE_TEXT && + m_activeTool->isChanged()) { + commitCurrentTool(); + } + + if (m_toolWidget) { + // Release active tool if it is in the editing mode but not changed and + // has editing widget (ex: text tool) + releaseActiveTool(); + } + + if (m_existingObjectIsChanged) { + m_existingObjectIsChanged = false; + pushObjectsStateToUndoStack(); + } + drawToolsData(); + drawObjectSelection(); + updateSelectionState(); +} + +void CaptureWidget::onMoveCaptureToolUp(int captureToolIndex) +{ + m_captureToolObjectsBackup = m_captureToolObjects; + pushObjectsStateToUndoStack(); + auto tool = m_captureToolObjects.at(captureToolIndex); + m_captureToolObjects.removeAt(captureToolIndex); + m_captureToolObjects.insert(captureToolIndex - 1, tool); + updateLayersPanel(); +} + +void CaptureWidget::onMoveCaptureToolDown(int captureToolIndex) +{ + m_captureToolObjectsBackup = m_captureToolObjects; + pushObjectsStateToUndoStack(); + auto tool = m_captureToolObjects.at(captureToolIndex); + m_captureToolObjects.removeAt(captureToolIndex); + m_captureToolObjects.insert(captureToolIndex + 1, tool); + updateLayersPanel(); +} + +void CaptureWidget::selectAll() +{ + m_selection->show(); + m_selection->setGeometry(rect()); + emit m_selection->geometrySettled(); + m_buttonHandler->show(); + updateSelectionState(); +} + +void CaptureWidget::removeToolObject(int index) +{ + --index; + if (index >= 0 && index < m_captureToolObjects.size()) { + // in case this tool is circle counter + const CaptureTool::Type currentToolType = + m_captureToolObjects.at(index)->type(); + m_captureToolObjectsBackup = m_captureToolObjects; + update( + paddedUpdateRect(m_captureToolObjects.at(index)->boundingRect())); + if (currentToolType == CaptureTool::TYPE_CIRCLECOUNT) { + int removedCircleCount = m_captureToolObjects.at(index)->count(); + --m_context.circleCount; + // Decrement circle counter numbers starting from deleted circle + for (int cnt = 0; cnt < m_captureToolObjects.size(); cnt++) { + auto toolItem = m_captureToolObjects.at(cnt); + if (toolItem->type() != CaptureTool::TYPE_CIRCLECOUNT) { + continue; + } + auto circleTool = m_captureToolObjects.at(cnt); + if (circleTool->count() >= removedCircleCount) { + circleTool->setCount(circleTool->count() - 1); + } + } + } + m_captureToolObjects.removeAt(index); + pushObjectsStateToUndoStack(); + drawToolsData(); + updateLayersPanel(); + } +} + +void CaptureWidget::initShortcuts() +{ + newShortcut( + QKeySequence(ConfigHandler().shortcut("TYPE_UNDO")), this, SLOT(undo())); + + newShortcut( + QKeySequence(ConfigHandler().shortcut("TYPE_REDO")), this, SLOT(redo())); + + newShortcut(QKeySequence(ConfigHandler().shortcut("TYPE_TOGGLE_PANEL")), + this, + SLOT(togglePanel())); + newShortcut(QKeySequence(ConfigHandler().shortcut("TYPE_GRAB_COLOR")), + this, + SLOT(startColorGrab())); + + newShortcut(QKeySequence(ConfigHandler().shortcut("TYPE_RESIZE_LEFT")), + m_selection, + SLOT(resizeLeft())); + newShortcut(QKeySequence(ConfigHandler().shortcut("TYPE_RESIZE_RIGHT")), + m_selection, + SLOT(resizeRight())); + newShortcut(QKeySequence(ConfigHandler().shortcut("TYPE_RESIZE_UP")), + m_selection, + SLOT(resizeUp())); + newShortcut(QKeySequence(ConfigHandler().shortcut("TYPE_RESIZE_DOWN")), + m_selection, + SLOT(resizeDown())); + newShortcut(QKeySequence(ConfigHandler().shortcut("TYPE_SYM_RESIZE_LEFT")), + m_selection, + SLOT(symResizeLeft())); + newShortcut(QKeySequence(ConfigHandler().shortcut("TYPE_SYM_RESIZE_RIGHT")), + m_selection, + SLOT(symResizeRight())); + newShortcut(QKeySequence(ConfigHandler().shortcut("TYPE_SYM_RESIZE_UP")), + m_selection, + SLOT(symResizeUp())); + newShortcut(QKeySequence(ConfigHandler().shortcut("TYPE_SYM_RESIZE_DOWN")), + m_selection, + SLOT(symResizeDown())); + + newShortcut(QKeySequence(ConfigHandler().shortcut("TYPE_MOVE_LEFT")), + m_selection, + SLOT(moveLeft())); + newShortcut(QKeySequence(ConfigHandler().shortcut("TYPE_MOVE_RIGHT")), + m_selection, + SLOT(moveRight())); + newShortcut(QKeySequence(ConfigHandler().shortcut("TYPE_MOVE_UP")), + m_selection, + SLOT(moveUp())); + newShortcut(QKeySequence(ConfigHandler().shortcut("TYPE_MOVE_DOWN")), + m_selection, + SLOT(moveDown())); + + newShortcut(QKeySequence(ConfigHandler().shortcut("TYPE_CANCEL")), + this, + SLOT(cancel())); + + newShortcut( + QKeySequence(ConfigHandler().shortcut("TYPE_DELETE_CURRENT_TOOL")), + this, + SLOT(deleteCurrentTool())); + + newShortcut( + QKeySequence(ConfigHandler().shortcut("TYPE_COMMIT_CURRENT_TOOL")), + this, + SLOT(commitCurrentTool())); + + newShortcut(QKeySequence(ConfigHandler().shortcut("TYPE_SELECT_ALL")), + this, + SLOT(selectAll())); + + newShortcut(Qt::Key_Escape, this, SLOT(deleteToolWidgetOrClose())); +} + +void CaptureWidget::deleteCurrentTool() +{ + int oldToolSize = m_context.toolSize; + m_panel->slotButtonDelete(true); + drawObjectSelection(); + if (oldToolSize != m_context.toolSize) { + emit toolSizeChanged(m_context.toolSize); + } +} + +void CaptureWidget::updateSizeIndicator() +{ + if (m_config.showSelectionGeometry()) { + showxywh(); + } + if (m_sizeIndButton) { + const QRect& selection = extendedSelection(); + m_sizeIndButton->setText( + QStringLiteral("%1\n%2").arg(selection.width(), selection.height())); + } +} + +void CaptureWidget::updateCursor() +{ + if (m_colorPicker && m_colorPicker->isVisible()) { + setCursor(Qt::ArrowCursor); + } else if (m_activeButton != nullptr && + activeButtonToolType() != CaptureTool::TYPE_MOVESELECTION) { + setCursor(Qt::CrossCursor); + } else if (m_selection->getMouseSide(mapFromGlobal(QCursor::pos())) != + SelectionWidget::NO_SIDE) { + setCursor(m_selection->cursor()); + } else if (activeButtonToolType() == CaptureTool::TYPE_MOVESELECTION) { + setCursor(Qt::OpenHandCursor); + } else { + setCursor(Qt::CrossCursor); + } +} + +void CaptureWidget::updateSelectionState() +{ + auto toolType = activeButtonToolType(); + if (toolType == CaptureTool::TYPE_MOVESELECTION) { + m_selection->setIdleCentralCursor(Qt::OpenHandCursor); + m_selection->setIgnoreMouse(false); + } else { + m_selection->setIdleCentralCursor(Qt::ArrowCursor); + if (toolType == CaptureTool::NONE) { + m_selection->setIgnoreMouse(m_panel->activeLayerIndex() != -1); + } else { + m_selection->setIgnoreMouse(true); + } + } +} + +void CaptureWidget::updateTool(CaptureTool* tool) +{ + if (!tool || !tool->showMousePreview()) { + return; + } + + static QRect oldPreviewRect, oldToolObjectRect; + + QRect previewRect(tool->mousePreviewRect(m_context)); + previewRect += QMargins(previewRect.width(), + previewRect.height(), + previewRect.width(), + previewRect.height()); + + QRect toolObjectRect = paddedUpdateRect(tool->boundingRect()); + + // old rects are united with current rects to handle sudden mouse movement + update(previewRect); + update(toolObjectRect); + update(oldPreviewRect); + update(oldToolObjectRect); + + oldPreviewRect = previewRect; + oldToolObjectRect = toolObjectRect; +} + +void CaptureWidget::updateLayersPanel() +{ + m_panel->fillCaptureTools(m_captureToolObjects.captureToolObjects()); +} + +void CaptureWidget::pushToolToStack() +{ + // append current tool to the new state + if (m_activeTool && m_activeButton) { + disconnect(this, + &CaptureWidget::colorChanged, + m_activeTool, + &CaptureTool::onColorChanged); + disconnect(this, + &CaptureWidget::toolSizeChanged, + m_activeTool, + &CaptureTool::onSizeChanged); + if (m_panel->toolWidget()) { + disconnect(m_panel->toolWidget(), nullptr, m_activeTool, nullptr); + } + + // disable signal connect for updating layer because it may call this + // function again on text objects + m_panel->blockSignals(true); + + m_captureToolObjectsBackup = m_captureToolObjects; + m_captureToolObjects.append(m_activeTool); + pushObjectsStateToUndoStack(); + releaseActiveTool(); + drawToolsData(); + updateLayersPanel(); + + // restore signal connection for updating layer + m_panel->blockSignals(false); + } +} + +void CaptureWidget::drawToolsData(bool drawSelection) +{ + // TODO refactor this for performance. The objects should not all be updated + // at once every time + QPixmap pixmapItem = m_context.origScreenshot; + for (const auto& toolItem : m_captureToolObjects.captureToolObjects()) { + processPixmapWithTool(&pixmapItem, toolItem); + update(paddedUpdateRect(toolItem->boundingRect())); + } + + m_context.screenshot = pixmapItem; + if (drawSelection) { + drawObjectSelection(); + } +} + +void CaptureWidget::drawObjectSelection() +{ + auto toolItem = activeToolObject(); + if (toolItem && !toolItem->editMode()) { + QPainter painter(&m_context.screenshot); + toolItem->drawObjectSelection(painter); + // TODO move this elsewhere + if (m_context.toolSize != toolItem->size()) { + m_context.toolSize = toolItem->size(); + } + if (activeToolObject() && m_activeButton) { + uncheckActiveTool(); + } + } +} + +void CaptureWidget::processPixmapWithTool(QPixmap* pixmap, CaptureTool* tool) +{ + QPainter painter(pixmap); + painter.setRenderHint(QPainter::Antialiasing); + tool->process(painter, *pixmap); +} + +CaptureTool* CaptureWidget::activeButtonTool() const +{ + if (m_activeButton == nullptr) { + return nullptr; + } + return m_activeButton->tool(); +} + +CaptureTool::Type CaptureWidget::activeButtonToolType() const +{ + auto* activeTool = activeButtonTool(); + if (activeTool == nullptr) { + return CaptureTool::NONE; + } + return activeTool->type(); +} + +QPoint CaptureWidget::snapToGrid(const QPoint& point) const +{ + QPoint snapPoint = mapToGlobal(point); + + const auto scale{ m_context.screenshot.devicePixelRatio() }; + + snapPoint.setX((qRound(snapPoint.x() / double(m_gridSize)) * m_gridSize)); + snapPoint.setY((qRound(snapPoint.y() / double(m_gridSize)) * m_gridSize)); + + return mapFromGlobal(snapPoint); +} + +QPointer CaptureWidget::activeToolObject() +{ + return m_captureToolObjects.at(m_panel->activeLayerIndex()); +} + +void CaptureWidget::makeChild(QWidget* w) +{ + w->setParent(this); + w->installEventFilter(m_eventFilter); +} + +void CaptureWidget::restoreCircleCountState() +{ + int largest = 0; + for (int cnt = 0; cnt < m_captureToolObjects.size(); cnt++) { + auto toolItem = m_captureToolObjects.at(cnt); + if (toolItem->type() != CaptureTool::TYPE_CIRCLECOUNT) { + continue; + } + if (toolItem->count() > largest) { + largest = toolItem->count(); + } + } + m_context.circleCount = largest + 1; +} + +/** + * @brief Wrapper around `new QShortcut`, properly handling Enter/Return. + */ +QList CaptureWidget::newShortcut(const QKeySequence& key, + QWidget* parent, + const char* slot) +{ + QList shortcuts; + QString strKey = key.toString(); + if (strKey.contains("Enter") || strKey.contains("Return")) { + strKey.replace("Enter", "Return"); + shortcuts << new QShortcut(strKey, parent, slot); + strKey.replace("Return", "Enter"); + shortcuts << new QShortcut(strKey, parent, slot); + } else { + shortcuts << new QShortcut(key, parent, slot); + } + return shortcuts; +} + +void CaptureWidget::togglePanel() +{ + m_panel->toggle(); +} + +void CaptureWidget::childEnter() +{ + m_previewEnabled = false; + updateTool(activeButtonTool()); +} + +void CaptureWidget::childLeave() +{ + m_previewEnabled = true; + updateTool(activeButtonTool()); +} + +void CaptureWidget::setCaptureToolObjects( + const CaptureToolObjects& captureToolObjects) +{ + // Used for undo/redo + m_captureToolObjects = captureToolObjects; + drawToolsData(); + updateLayersPanel(); + drawObjectSelection(); +} + +void CaptureWidget::undo() +{ + if (m_activeTool && + (m_activeTool->isChanged() || m_activeTool->editMode())) { + // Remove selection on undo, at the same time commit current tool will + // be called + m_panel->setActiveLayer(-1); + } + + // drawToolsData is called twice to update both previous and new regions + // FIXME this is a temporary workaround + drawToolsData(); + m_undoStack.undo(); + drawToolsData(); + updateLayersPanel(); + + restoreCircleCountState(); +} + +void CaptureWidget::redo() +{ + // drawToolsData is called twice to update both previous and new regions + // FIXME this is a temporary workaround + drawToolsData(); + m_undoStack.redo(); + drawToolsData(); + update(); + updateLayersPanel(); + + restoreCircleCountState(); +} + +void CaptureWidget::cancel() +{ + if (m_activeButton != nullptr) { + uncheckActiveTool(); + } + if (m_panel) { + m_panel->setActiveLayer(-1); + } + if (m_toolWidget) { + m_toolWidget->hide(); + delete m_toolWidget; + m_toolWidget = nullptr; + } + m_selection->hide(); + emit m_selection->geometrySettled(); +} + +QRect CaptureWidget::extendedSelection() const +{ + if (m_selection == nullptr) { + return {}; + } + QRect r = m_selection->geometry(); + return extendedRect(r); +} + +QRect CaptureWidget::extendedRect(const QRect& r) const +{ + auto devicePixelRatio = m_context.screenshot.devicePixelRatio(); + return { static_cast(r.left() * devicePixelRatio), + static_cast(r.top() * devicePixelRatio), + static_cast(r.width() * devicePixelRatio), + static_cast(r.height() * devicePixelRatio) }; +} + +QRect CaptureWidget::paddedUpdateRect(const QRect& r) const +{ + if (r.isNull()) { + return r; + } else { + return r + QMargins(20, 20, 20, 20); + } +} + +void CaptureWidget::drawErrorMessage(const QString& msg, QPainter* painter) +{ + auto textRect = painter->fontMetrics().boundingRect(msg); + int w = textRect.width(), h = textRect.height(); + textRect = { + size().width() - w - 10, size().height() - h - 5, w + 100, h + 100 + }; + QScreen* currentScreen = QGuiAppCurrentScreen().currentScreen(); + + if (!textRect.contains(QCursor::pos(currentScreen))) { + QColor textColor(Qt::white); + painter->setPen(textColor); + painter->drawText(textRect, msg); + } +} + +void CaptureWidget::drawInactiveRegion(QPainter* painter) +{ + QColor overlayColor(0, 0, 0, m_opacity); + painter->setBrush(overlayColor); + QRect r; + if (m_selection->isVisible()) { + r = m_selection->geometry().normalized(); + } + QRegion grey(rect()); + grey = grey.subtracted(r); + + painter->setClipRegion(grey); + painter->drawRect(-1, -1, rect().width() + 1, rect().height() + 1); +} diff --git a/src/widgets/capture/capturewidget.h b/src/widgets/capture/capturewidget.h new file mode 100644 index 0000000..a0230fc --- /dev/null +++ b/src/widgets/capture/capturewidget.h @@ -0,0 +1,232 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +// Based on Lightscreen areadialog.h, Copyright 2017 Christian Kaiser +// released under the GNU GPL2 +// + +// Based on KDE's KSnapshot regiongrabber.cpp, revision 796531, Copyright 2007 +// Luca Gugelmann released under the GNU LGPL +// + +#pragma once + +#include "buttonhandler.h" +#include "capturetoolbutton.h" +#include "capturetoolobjects.h" +#include "src/config/generalconf.h" +#include "src/tools/capturecontext.h" +#include "src/tools/capturetool.h" +#include "src/utils/confighandler.h" +#include "src/widgets/capture/magnifierwidget.h" +#include "src/widgets/capture/selectionwidget.h" +#include +#include +#include +#include +#include + +class QLabel; +class QPaintEvent; +class QResizeEvent; +class QMouseEvent; +class QShortcut; +class QNetworkAccessManager; +class QNetworkReply; +class ColorPicker; +class NotifierBox; +class HoverEventFilter; +#if !defined(DISABLE_UPDATE_CHECKER) +class UpdateNotificationWidget; +#endif +class UtilityPanel; +class SidePanelWidget; + +class CaptureWidget : public QWidget +{ + Q_OBJECT + +public: + explicit CaptureWidget(const CaptureRequest& req, + bool fullScreen = true, + QWidget* parent = nullptr); + ~CaptureWidget(); + + QPixmap pixmap(); + void setCaptureToolObjects(const CaptureToolObjects& captureToolObjects); +#if !defined(DISABLE_UPDATE_CHECKER) + void showAppUpdateNotification(const QString& appLatestVersion, + const QString& appLatestUrl); +#endif + +public slots: + bool commitCurrentTool(); + void deleteToolWidgetOrClose(); + +signals: + void colorChanged(const QColor& c); + void toolSizeChanged(int size); + +private slots: + void undo(); + void redo(); + void cancel(); + void togglePanel(); + void childEnter(); + void childLeave(); + + void deleteCurrentTool(); + + void setState(CaptureToolButton* b); + void handleToolSignal(CaptureTool::Request r); + void handleButtonLeftClick(CaptureToolButton* b); + void handleButtonRightClick(CaptureToolButton* b); + void setDrawColor(const QColor& c); + void onToolSizeChanged(int size); + void onToolSizeSettled(int size); + void updateActiveLayer(int layer); + void onMoveCaptureToolUp(int captureToolIndex); + void onMoveCaptureToolDown(int captureToolIndex); + void selectAll(); + void xywhTick(); + void onDisplayGridChanged(bool display); + void onGridSizeChanged(int size); + + void startColorGrab(); + +public: + void removeToolObject(int index = -1); + void showxywh(); + +protected: + void paintEvent(QPaintEvent* paintEvent) override; + void mousePressEvent(QMouseEvent* mouseEvent) override; + void mouseMoveEvent(QMouseEvent* mouseEvent) override; + void mouseReleaseEvent(QMouseEvent* mouseEvent) override; + void mouseDoubleClickEvent(QMouseEvent* event) override; + void keyPressEvent(QKeyEvent* keyEvent) override; + void keyReleaseEvent(QKeyEvent* keyEvent) override; + void wheelEvent(QWheelEvent* wheelEvent) override; + void resizeEvent(QResizeEvent* resizeEvent) override; + void moveEvent(QMoveEvent* moveEvent) override; + void changeEvent(QEvent* changeEvent) override; + +private: + void pushObjectsStateToUndoStack(); + void releaseActiveTool(); + void uncheckActiveTool(); + int selectToolItemAtPos(const QPoint& pos); + void showColorPicker(const QPoint& pos); + bool startDrawObjectTool(const QPoint& pos); + QPointer activeToolObject(); + void initContext(bool fullscreen, const CaptureRequest& req); + void initPanel(); + void initSelection(); + void initShortcuts(); + void initButtons(); + void initHelpMessage(); + void initQuitPrompt(); + void updateSizeIndicator(); + void updateCursor(); + void updateSelectionState(); + void updateTool(CaptureTool* tool); + void updateLayersPanel(); + bool promptQuit(); + void pushToolToStack(); + void makeChild(QWidget* w); + void restoreCircleCountState(); + + QList newShortcut(const QKeySequence& key, + QWidget* parent, + const char* slot); + + void setToolSize(int size); + + QRect extendedSelection() const; + QRect extendedRect(const QRect& r) const; + QRect paddedUpdateRect(const QRect& r) const; + void drawErrorMessage(const QString& msg, QPainter* painter); + void drawInactiveRegion(QPainter* painter); + void drawToolsData(bool drawSelection = true); + void drawObjectSelection(); + + void processPixmapWithTool(QPixmap* pixmap, CaptureTool* tool); + + CaptureTool* activeButtonTool() const; + CaptureTool::Type activeButtonToolType() const; + + QPoint snapToGrid(const QPoint& point) const; + + //////////////////////////////////////// + // Class members + + // Context information + CaptureContext m_context; + + // Main ui color + QColor m_uiColor; + // Secondary ui color + QColor m_contrastUiColor; + + // Outside selection opacity + int m_opacity; + int m_toolSizeByKeyboard; + + // utility flags + bool m_mouseIsClicked; + bool m_newSelection; + bool m_movingSelection; + bool m_captureDone; + bool m_previewEnabled; + bool m_adjustmentButtonPressed; + bool m_configError; + bool m_configErrorResolved; + +#if !defined(DISABLE_UPDATE_CHECKER) + UpdateNotificationWidget* m_updateNotificationWidget; +#endif + quint64 m_lastMouseWheel; + QPointer m_sizeIndButton; + // Last pressed button + QPointer m_activeButton; + QPointer m_activeTool; + bool m_activeToolIsMoved; + QPointer m_toolWidget; + QPointer m_quitPrompt; + + ButtonHandler* m_buttonHandler; + UtilityPanel* m_panel; + SidePanelWidget* m_sidePanel; + ColorPicker* m_colorPicker; + ConfigHandler m_config; + NotifierBox* m_notifierBox; + HoverEventFilter* m_eventFilter; + SelectionWidget* m_selection; + MagnifierWidget* m_magnifier; + QString m_helpMessage; + + SelectionWidget::SideType m_mouseOverHandle; + + QMap m_tools; + CaptureToolObjects m_captureToolObjects; + CaptureToolObjects m_captureToolObjectsBackup; + + QPoint m_mousePressedPos; + QPoint m_activeToolOffsetToMouseOnStart; + + // XYWH display position and timer + bool m_xywhDisplay; + QTimer m_xywhTimer; + + QUndoStack m_undoStack; + + bool m_existingObjectIsChanged; + + // For start moving after more than X offset + QPoint m_startMovePos; + bool m_startMove; + + // Grid + bool m_displayGrid{ false }; + int m_gridSize{ 10 }; +}; diff --git a/src/widgets/capture/colorpicker.cpp b/src/widgets/capture/colorpicker.cpp new file mode 100644 index 0000000..6032974 --- /dev/null +++ b/src/widgets/capture/colorpicker.cpp @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "colorpicker.h" +#include "src/utils/confighandler.h" +#include "src/utils/globalvalues.h" +#include +#include + +ColorPicker::ColorPicker(QWidget* parent) + : ColorPickerWidget(parent) +{ + setMouseTracking(true); + + ConfigHandler config; + QColor drawColor = config.drawColor(); + for (int i = 0; i < m_colorList.size(); ++i) { + if (m_colorList.at(i) == drawColor) { + m_selectedIndex = i; + m_lastIndex = i; + break; + } + } +} +void ColorPicker::setNewColor() +{ + emit colorSelected(m_colorList.at(m_selectedIndex)); +} + +void ColorPicker::mouseMoveEvent(QMouseEvent* e) +{ + for (int i = 0; i < m_colorList.size(); ++i) { + if (m_colorAreaList.at(i).contains(e->pos())) { + m_selectedIndex = i; + update(m_colorAreaList.at(i) + QMargins(10, 10, 10, 10)); + update(m_colorAreaList.at(m_lastIndex) + QMargins(10, 10, 10, 10)); + m_lastIndex = i; + break; + } + } +} + +void ColorPicker::showEvent(QShowEvent* event) +{ + grabMouse(); +} + +void ColorPicker::hideEvent(QHideEvent* event) +{ + releaseMouse(); +} diff --git a/src/widgets/capture/colorpicker.h b/src/widgets/capture/colorpicker.h new file mode 100644 index 0000000..2f34142 --- /dev/null +++ b/src/widgets/capture/colorpicker.h @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/widgets/colorpickerwidget.h" + +class ColorPicker : public ColorPickerWidget +{ + Q_OBJECT +public: + explicit ColorPicker(QWidget* parent = nullptr); + void setNewColor(); +signals: + void colorSelected(QColor c); + +protected: + void showEvent(QShowEvent* event) override; + void hideEvent(QHideEvent* event) override; + void mouseMoveEvent(QMouseEvent* e) override; +}; diff --git a/src/widgets/capture/hovereventfilter.cpp b/src/widgets/capture/hovereventfilter.cpp new file mode 100644 index 0000000..126bc38 --- /dev/null +++ b/src/widgets/capture/hovereventfilter.cpp @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +// Based on Lightscreen areadialog.h, Copyright 2017 Christian Kaiser +// released under the GNU GPL2 +// + +// Based on KDE's KSnapshot regiongrabber.cpp, revision 796531, Copyright 2007 +// Luca Gugelmann released under the GNU LGPL +// + +#include "hovereventfilter.h" +#include + +HoverEventFilter::HoverEventFilter(QObject* parent) + : QObject(parent) +{} + +bool HoverEventFilter::eventFilter(QObject* watched, QEvent* event) +{ + QEvent::Type t = event->type(); + switch (t) { + case QEvent::Enter: + emit hoverIn(watched); + break; + case QEvent::Leave: + emit hoverOut(watched); + break; + default: + break; + } + return false; +} diff --git a/src/widgets/capture/hovereventfilter.h b/src/widgets/capture/hovereventfilter.h new file mode 100644 index 0000000..c1ce4f2 --- /dev/null +++ b/src/widgets/capture/hovereventfilter.h @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +// Based on Lightscreen areadialog.h, Copyright 2017 Christian Kaiser +// released under the GNU GPL2 +// + +// Based on KDE's KSnapshot regiongrabber.cpp, revision 796531, Copyright 2007 +// Luca Gugelmann released under the GNU LGPL +// + +#pragma once + +#include + +class HoverEventFilter : public QObject +{ + Q_OBJECT +public: + explicit HoverEventFilter(QObject* parent = nullptr); + +signals: + void hoverIn(QObject*); + void hoverOut(QObject*); + +protected: + bool eventFilter(QObject* watched, QEvent* event); +}; diff --git a/src/widgets/capture/magnifierwidget.cpp b/src/widgets/capture/magnifierwidget.cpp new file mode 100644 index 0000000..bbef246 --- /dev/null +++ b/src/widgets/capture/magnifierwidget.cpp @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "magnifierwidget.h" +#include +#include +#include +#include +#include +#include +#include + +MagnifierWidget::MagnifierWidget(const QPixmap& p, + const QColor& c, + bool isSquare, + QWidget* parent) + : QWidget(parent) + , m_color(c) + , m_borderColor(c) + , m_screenshot(p) + , m_square(isSquare) +{ + setFixedSize(parent->width(), parent->height()); + setAttribute(Qt::WA_TransparentForMouseEvents); + m_color.setAlpha(130); + // add padding for circular magnifier + QImage padded(p.width() + 2 * m_magPixels, + p.height() + 2 * m_magPixels, + QImage::Format_ARGB32); + padded.fill(Qt::black); + QPainter painter(&padded); + painter.drawPixmap(m_magPixels, m_magPixels, p); + m_paddedScreenshot.convertFromImage(padded); +} +void MagnifierWidget::paintEvent(QPaintEvent*) +{ + QPainter p(this); + if (m_square) { + drawMagnifier(p); + } else { + drawMagnifierCircle(p); + } +} + +void MagnifierWidget::drawMagnifierCircle(QPainter& painter) +{ + auto relativeCursor = QCursor::pos(); + auto translated = QWidget::mapFromGlobal(relativeCursor); + auto x = translated.x() + m_magPixels; + auto y = translated.y() + m_magPixels; + + int magX = static_cast(x * m_devicePixelRatio - m_magPixels); + int magY = static_cast(y * m_devicePixelRatio - m_magPixels); + QRectF magniRect(magX, magY, m_pixels, m_pixels); + + qreal drawPosX = x + m_magOffset + m_pixels * magZoom / 2; + if (drawPosX > width() - m_pixels * magZoom / 2) { + drawPosX = x - m_magOffset - m_pixels * magZoom / 2; + } + qreal drawPosY = y + m_magOffset + m_pixels * magZoom / 2; + if (drawPosY > height() - m_pixels * magZoom / 2) { + drawPosY = y - m_magOffset - m_pixels * magZoom / 2; + } + QPointF drawPos(drawPosX, drawPosY); + QRectF crossHairTop(drawPos.x() + magZoom * (-0.5), + drawPos.y() - magZoom * (m_magPixels + 0.5), + magZoom, + magZoom * (m_magPixels)); + QRectF crossHairRight(drawPos.x() + magZoom * (0.5), + drawPos.y() + magZoom * (-0.5), + magZoom * (m_magPixels), + magZoom); + QRectF crossHairBottom(drawPos.x() + magZoom * (-0.5), + drawPos.y() + magZoom * (0.5), + magZoom, + magZoom * (m_magPixels)); + QRectF crossHairLeft(drawPos.x() - magZoom * (m_magPixels + 0.5), + drawPos.y() + magZoom * (-0.5), + magZoom * (m_magPixels), + magZoom); + const auto frag = + QPainter::PixmapFragment::create(drawPos, magniRect, magZoom, magZoom); + + painter.setRenderHint(QPainter::Antialiasing, true); + QPainterPath path = QPainterPath(); + path.addEllipse(drawPos, m_pixels * magZoom / 2, m_pixels * magZoom / 2); + painter.setClipPath(path); + + painter.drawPixmapFragments( + &frag, 1, m_paddedScreenshot, QPainter::OpaqueHint); + painter.setCompositionMode(QPainter::CompositionMode_SourceOver); + for (const auto& rect : + { crossHairTop, crossHairRight, crossHairBottom, crossHairLeft }) { + painter.fillRect(rect, m_color); + } + QPen pen(m_borderColor); + pen.setWidth(4); + painter.setPen(pen); + painter.drawEllipse( + drawPos, m_pixels * magZoom / 2, m_pixels * magZoom / 2); +} +// https://invent.kde.org/graphics/spectacle/-/blob/master/src/QuickEditor/QuickEditor.cpp#L841 +void MagnifierWidget::drawMagnifier(QPainter& painter) +{ + auto relativeCursor = QCursor::pos(); + auto translated = QWidget::mapFromGlobal(relativeCursor); + auto x = translated.x(); + auto y = translated.y(); + + int magX = static_cast(x * m_devicePixelRatio - m_magPixels); + int offsetX = 0; + if (magX < 0) { + offsetX = magX; + magX = 0; + } else { + const int maxX = m_screenshot.width() - m_pixels; + if (magX > maxX) { + offsetX = magX - maxX; + magX = maxX; + } + } + int magY = static_cast(y * m_devicePixelRatio - m_magPixels); + int offsetY = 0; + if (magY < 0) { + offsetY = magY; + magY = 0; + } else { + const int maxY = m_screenshot.height() - m_pixels; + if (magY > maxY) { + offsetY = magY - maxY; + magY = maxY; + } + } + QRectF magniRect(magX, magY, m_pixels, m_pixels); + + qreal drawPosX = x + m_magOffset + m_pixels * magZoom / 2; + if (drawPosX > width() - m_pixels * magZoom / 2) { + drawPosX = x - m_magOffset - m_pixels * magZoom / 2; + } + qreal drawPosY = y + m_magOffset + m_pixels * magZoom / 2; + if (drawPosY > height() - m_pixels * magZoom / 2) { + drawPosY = y - m_magOffset - m_pixels * magZoom / 2; + } + QPointF drawPos(drawPosX, drawPosY); + QRectF crossHairTop(drawPos.x() + magZoom * (offsetX - 0.5), + drawPos.y() - magZoom * (m_magPixels + 0.5), + magZoom, + magZoom * (m_magPixels + offsetY)); + QRectF crossHairRight(drawPos.x() + magZoom * (0.5 + offsetX), + drawPos.y() + magZoom * (offsetY - 0.5), + magZoom * (m_magPixels - offsetX), + magZoom); + QRectF crossHairBottom(drawPos.x() + magZoom * (offsetX - 0.5), + drawPos.y() + magZoom * (0.5 + offsetY), + magZoom, + magZoom * (m_magPixels - offsetY)); + QRectF crossHairLeft(drawPos.x() - magZoom * (m_magPixels + 0.5), + drawPos.y() + magZoom * (offsetY - 0.5), + magZoom * (m_magPixels + offsetX), + magZoom); + QRectF crossHairBorder(drawPos.x() - magZoom * (m_magPixels + 0.5) - 1, + drawPos.y() - magZoom * (m_magPixels + 0.5) - 1, + m_pixels * magZoom + 2, + m_pixels * magZoom + 2); + const auto frag = + QPainter::PixmapFragment::create(drawPos, magniRect, magZoom, magZoom); + + painter.fillRect(crossHairBorder, m_borderColor); + painter.drawPixmapFragments(&frag, 1, m_screenshot, QPainter::OpaqueHint); + painter.setCompositionMode(QPainter::CompositionMode_SourceOver); + for (const auto& rect : + { crossHairTop, crossHairRight, crossHairBottom, crossHairLeft }) { + painter.fillRect(rect, m_color); + } +} diff --git a/src/widgets/capture/magnifierwidget.h b/src/widgets/capture/magnifierwidget.h new file mode 100644 index 0000000..70df500 --- /dev/null +++ b/src/widgets/capture/magnifierwidget.h @@ -0,0 +1,32 @@ +#pragma once + +#include + +class QPropertyAnimation; + +class MagnifierWidget : public QWidget +{ + Q_OBJECT +public: + explicit MagnifierWidget(const QPixmap& p, + const QColor& c, + bool isSquare, + QWidget* parent = nullptr); + +protected: + void paintEvent(QPaintEvent*) override; + +private: + const int m_magPixels = 8; + const int m_magOffset = 16; + const int magZoom = 10; + const int m_pixels = 2 * m_magPixels + 1; + const int m_devicePixelRatio = 1; + bool m_square; + QColor m_color; + QColor m_borderColor; + QPixmap m_screenshot; + QPixmap m_paddedScreenshot; + void drawMagnifier(QPainter& painter); + void drawMagnifierCircle(QPainter& painter); +}; diff --git a/src/widgets/capture/modificationcommand.cpp b/src/widgets/capture/modificationcommand.cpp new file mode 100644 index 0000000..635ee18 --- /dev/null +++ b/src/widgets/capture/modificationcommand.cpp @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "modificationcommand.h" +#include "capturewidget.h" + +ModificationCommand::ModificationCommand( + CaptureWidget* captureWidget, + const CaptureToolObjects& captureToolObjects, + const CaptureToolObjects& captureToolObjectsBackup) + : m_captureWidget(captureWidget) +{ + m_captureToolObjects = captureToolObjects; + m_captureToolObjectsBackup = captureToolObjectsBackup; +} + +void ModificationCommand::undo() +{ + m_captureWidget->setCaptureToolObjects(m_captureToolObjectsBackup); +} + +void ModificationCommand::redo() +{ + m_captureWidget->setCaptureToolObjects(m_captureToolObjects); +} diff --git a/src/widgets/capture/modificationcommand.h b/src/widgets/capture/modificationcommand.h new file mode 100644 index 0000000..292054d --- /dev/null +++ b/src/widgets/capture/modificationcommand.h @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "capturetoolobjects.h" +#include + +#ifndef FLAMESHOT_MODIFICATIONCOMMAND_H +#define FLAMESHOT_MODIFICATIONCOMMAND_H + +class CaptureWidget; + +class ModificationCommand : public QUndoCommand +{ +public: + ModificationCommand(CaptureWidget* captureWidget, + const CaptureToolObjects& captureToolObjects, + const CaptureToolObjects& captureToolObjectsBackup); + + virtual void undo() override; + virtual void redo() override; + +private: + CaptureToolObjects m_captureToolObjects; + CaptureToolObjects m_captureToolObjectsBackup; + CaptureWidget* m_captureWidget; +}; + +#endif // FLAMESHOT_MODIFICATIONCOMMAND_H diff --git a/src/widgets/capture/notifierbox.cpp b/src/widgets/capture/notifierbox.cpp new file mode 100644 index 0000000..4c177fb --- /dev/null +++ b/src/widgets/capture/notifierbox.cpp @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "notifierbox.h" +#include "src/utils/colorutils.h" +#include "src/utils/confighandler.h" +#include "src/utils/globalvalues.h" +#include +#include +#include + +NotifierBox::NotifierBox(QWidget* parent) + : QWidget(parent) +{ + m_timer = new QTimer(this); + m_timer->setSingleShot(true); + m_timer->setInterval(600); + connect(m_timer, &QTimer::timeout, this, &NotifierBox::hide); + m_bgColor = ConfigHandler().uiColor(); + m_foregroundColor = + (ColorUtils::colorIsDark(m_bgColor) ? Qt::white : Qt::black); + m_bgColor.setAlpha(180); + const int size = + (GlobalValues::buttonBaseSize() + GlobalValues::buttonBaseSize() / 2) * + qApp->devicePixelRatio(); + setFixedSize(QSize(size, size)); +} + +void NotifierBox::enterEvent(QEnterEvent*) +{ + hide(); +} + +void NotifierBox::paintEvent(QPaintEvent*) +{ + QPainter painter(this); + // draw Ellipse + painter.setRenderHint(QPainter::Antialiasing); + painter.setBrush(QBrush(m_bgColor, Qt::SolidPattern)); + painter.setPen(QPen(Qt::transparent)); + painter.drawEllipse(rect()); + // Draw the text: + painter.setPen(QPen(m_foregroundColor)); + painter.drawText(rect(), Qt::AlignCenter, m_message); +} + +void NotifierBox::showMessage(const QString& msg) +{ + m_message = msg; + update(); + show(); + m_timer->start(); +} + +void NotifierBox::showColor(const QColor& color) +{ + Q_UNUSED(color) + m_message = QLatin1String(""); +} + +void NotifierBox::hideEvent(QHideEvent* event) +{ + emit hidden(); +} diff --git a/src/widgets/capture/notifierbox.h b/src/widgets/capture/notifierbox.h new file mode 100644 index 0000000..df163a9 --- /dev/null +++ b/src/widgets/capture/notifierbox.h @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include + +class QTimer; + +class NotifierBox : public QWidget +{ + Q_OBJECT +public: + explicit NotifierBox(QWidget* parent = nullptr); + +protected: + void enterEvent(QEnterEvent*) override; + virtual void paintEvent(QPaintEvent*) override; + +signals: + void hidden(); + +public slots: + void showMessage(const QString& msg); + void showColor(const QColor& color); + +private: + QTimer* m_timer; + QString m_message; + QColor m_bgColor; + QColor m_foregroundColor; + + void hideEvent(QHideEvent* event) override; +}; diff --git a/src/widgets/capture/overlaymessage.cpp b/src/widgets/capture/overlaymessage.cpp new file mode 100644 index 0000000..48d8ca7 --- /dev/null +++ b/src/widgets/capture/overlaymessage.cpp @@ -0,0 +1,126 @@ +#include "overlaymessage.h" +#include "colorutils.h" +#include "confighandler.h" + +#include +#include +#include +#include +#include +#include + +OverlayMessage::OverlayMessage(QWidget* parent, const QRect& targetArea) + : QLabel(parent) + , m_targetArea(targetArea) +{ + // NOTE: do not call the static functions from the constructor + m_instance = this; + m_messageStack.push(QString()); // Default message is empty + setAttribute(Qt::WA_TransparentForMouseEvents); + setAttribute(Qt::WA_AlwaysStackOnTop); + setAlignment(Qt::AlignCenter); + setTextFormat(Qt::RichText); + + m_fillColor = ConfigHandler().uiColor(); + int opacity = ConfigHandler().contrastOpacity(); + m_textColor = + (ColorUtils::colorIsDark(m_fillColor) ? Qt::white : Qt::black); + // map a background opacity range 0-255 to a fill opacity range 190-160 + // we do this because an opaque background makes the box look opaque too + m_fillColor.setAlpha(160 + (180 - 220) / (255.0 - 0) * (opacity - 255)); + setStyleSheet( + QStringLiteral("QLabel { color: %1; }").arg(m_textColor.name())); + + setMargin(QFontMetrics(qApp->font()).height() / 2); + QWidget::hide(); +} + +void OverlayMessage::init(QWidget* parent, const QRect& targetArea) +{ + new OverlayMessage(parent, targetArea); +} + +/** + * @brief Push a message to the message stack. + * @param msg Message text formatted as rich text + */ +void OverlayMessage::push(const QString& msg) +{ + m_instance->m_messageStack.push(msg); + m_instance->setText(m_instance->m_messageStack.top()); + setVisibility(true); +} + +void OverlayMessage::pop() +{ + if (m_instance->m_messageStack.size() > 1) { + m_instance->m_messageStack.pop(); + } + + m_instance->setText(m_instance->m_messageStack.top()); + setVisibility(m_instance->m_messageStack.size() > 1); +} + +void OverlayMessage::setVisibility(bool visible) +{ + m_instance->updateGeometry(); + m_instance->setVisible(visible); +} + +OverlayMessage* OverlayMessage::instance() +{ + return m_instance; +} + +void OverlayMessage::pushKeyMap(const QList>& map) +{ + push(compileFromKeyMap(map)); +} + +/** + * @brief Compile a message from a set of shortcuts and descriptions. + * @param map List of (shortcut, description) pairs + */ +QString OverlayMessage::compileFromKeyMap( + const QList>& map) +{ + QString str = QStringLiteral(""); + for (const auto& pair : map) { + str += QStringLiteral("" + "" + "" + "") + .arg(pair.first, pair.second); + } + str += QStringLiteral("
    %1   %2
    "); + return str; +} + +void OverlayMessage::paintEvent(QPaintEvent* e) +{ + QPainter painter(this); + painter.setRenderHint(QPainter::Antialiasing); + + painter.setBrush(QBrush(m_fillColor, Qt::SolidPattern)); + painter.setPen(QPen(m_textColor, 1.5)); + float margin = painter.pen().widthF(); + painter.drawRoundedRect( + rect() - QMarginsF(margin, margin, margin, margin), 5, 5); + + return QLabel::paintEvent(e); +} + +QRect OverlayMessage::boundingRect() const +{ + QRect geom = QRect(QPoint(), sizeHint()); + geom.moveCenter(m_targetArea.center()); + return geom; +} + +void OverlayMessage::updateGeometry() +{ + setGeometry(boundingRect()); + QLabel::updateGeometry(); +} + +OverlayMessage* OverlayMessage::m_instance = nullptr; diff --git a/src/widgets/capture/overlaymessage.h b/src/widgets/capture/overlaymessage.h new file mode 100644 index 0000000..bfea1d6 --- /dev/null +++ b/src/widgets/capture/overlaymessage.h @@ -0,0 +1,46 @@ +#pragma once + +#include +#include + +/** + * @brief Overlay a message in capture mode. + * + * The message must be initialized by calling `init` before it can be used. That + * can be done once per capture session. The class is a singleton. + * + * To change the active message call `push`. This will automatically show the + * widget. Previous messages won't be forgotten and will be reactivated after + * you call `pop`. You can show/hide the message using `setVisibility` (this + * won't push/pop anything). + * + * @note You have to make sure that widgets pop the messages they pushed when + * they are closed, to avoid potential bugs and resource leaks. + */ +class OverlayMessage : public QLabel +{ +public: + OverlayMessage() = delete; + + static void init(QWidget* parent, const QRect& targetArea); + static void push(const QString& msg); + static void pop(); + static void setVisibility(bool visible); + static OverlayMessage* instance(); + + static void pushKeyMap(const QList>& map); + static QString compileFromKeyMap(const QList>& map); + +private: + QStack m_messageStack; + QRect m_targetArea; + QColor m_fillColor, m_textColor; + static OverlayMessage* m_instance; + + OverlayMessage(QWidget* parent, const QRect& center); + + void paintEvent(QPaintEvent*) override; + + QRect boundingRect() const; + void updateGeometry(); +}; diff --git a/src/widgets/capture/selectionwidget.cpp b/src/widgets/capture/selectionwidget.cpp new file mode 100644 index 0000000..5e5fe35 --- /dev/null +++ b/src/widgets/capture/selectionwidget.cpp @@ -0,0 +1,566 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "selectionwidget.h" +#include "capturetool.h" +#include "capturetoolbutton.h" +#include "src/utils/globalvalues.h" +#include +#include +#include +#include +#include +#include +#include + +#define MARGIN (m_THandle.width()) + +SelectionWidget::SelectionWidget(QColor c, QWidget* parent) + : QWidget(parent) + , m_color(std::move(c)) + , m_activeSide(NO_SIDE) + , m_ignoreMouse(false) +{ + // prevents this widget from consuming CaptureToolButton mouse events + setAttribute(Qt::WA_TransparentForMouseEvents); + parent->installEventFilter(this); + + m_animation = new QPropertyAnimation(this, "geometry", this); + m_animation->setEasingCurve(QEasingCurve::InOutQuad); + m_animation->setDuration(200); + connect(m_animation, &QPropertyAnimation::finished, this, [this]() { + emit geometrySettled(); + }); + + int sideVal = GlobalValues::buttonBaseSize() * 0.6; + int handleSide = sideVal / 2; + const QRect areaRect(0, 0, sideVal, sideVal); + + const QRect handleRect(0, 0, handleSide, handleSide); + m_TLHandle = m_TRHandle = m_BLHandle = m_BRHandle = m_LHandle = m_THandle = + m_RHandle = m_BHandle = handleRect; + m_TLArea = m_TRArea = m_BLArea = m_BRArea = areaRect; + + m_areaOffset = QPoint(-sideVal / 2, -sideVal / 2); + m_handleOffset = QPoint(-handleSide / 2, -handleSide / 2); +} + +/** + * @brief Get the side where the mouse cursor is. + * @param mousePos Mouse cursor position relative to the parent widget. + */ +SelectionWidget::SideType SelectionWidget::getMouseSide( + const QPoint& mousePos) const +{ + if (!isVisible()) { + return NO_SIDE; + } + QPoint localPos = mapFromParent(mousePos); + if (m_TLArea.contains(localPos)) { + return TOPLEFT_SIDE; + } else if (m_TRArea.contains(localPos)) { + return TOPRIGHT_SIDE; + } else if (m_BLArea.contains(localPos)) { + return BOTTOMLEFT_SIDE; + } else if (m_BRArea.contains(localPos)) { + return BOTTOMRIGHT_SIDE; + } else if (m_LArea.contains(localPos)) { + return LEFT_SIDE; + } else if (m_TArea.contains(localPos)) { + return TOP_SIDE; + } else if (m_RArea.contains(localPos)) { + return RIGHT_SIDE; + } else if (m_BArea.contains(localPos)) { + return BOTTOM_SIDE; + } else if (rect().contains(localPos)) { + return CENTER; + } else { + return NO_SIDE; + } +} + +QVector SelectionWidget::handlerAreas() +{ + QVector areas; + areas << m_TLHandle << m_TRHandle << m_BLHandle << m_BRHandle << m_LHandle + << m_THandle << m_RHandle << m_BHandle; + return areas; +} + +// helper function +SelectionWidget::SideType getProperSide(SelectionWidget::SideType side, + const QRect& r) +{ + using SideType = SelectionWidget::SideType; + int intSide = side; + if (r.right() < r.left()) { + intSide ^= SideType::LEFT_SIDE; + intSide ^= SideType::RIGHT_SIDE; + } + if (r.bottom() < r.top()) { + intSide ^= SideType::TOP_SIDE; + intSide ^= SideType::BOTTOM_SIDE; + } + + return (SideType)intSide; +} + +void SelectionWidget::setIgnoreMouse(bool ignore) +{ + m_ignoreMouse = ignore; + updateCursor(); +} + +/** + * Set the cursor that will be active when the mouse is inside the selection and + * the mouse is not clicked. + */ +void SelectionWidget::setIdleCentralCursor(const QCursor& cursor) +{ + m_idleCentralCursor = cursor; +} + +void SelectionWidget::setGeometryAnimated(const QRect& r) +{ + if (isVisible()) { + m_animation->setStartValue(geometry()); + m_animation->setEndValue(r); + m_animation->start(); + } +} + +void SelectionWidget::setGeometry(const QRect& r) +{ + QWidget::setGeometry(r + QMargins(MARGIN, MARGIN, MARGIN, MARGIN)); + updateCursor(); + if (isVisible()) { + emit geometryChanged(); + } +} + +QRect SelectionWidget::geometry() const +{ + return QWidget::geometry() - QMargins(MARGIN, MARGIN, MARGIN, MARGIN); +} + +QRect SelectionWidget::fullGeometry() const +{ + return QWidget::geometry(); +} + +QRect SelectionWidget::rect() const +{ + return QWidget::rect() - QMargins(MARGIN, MARGIN, MARGIN, MARGIN); +} + +bool SelectionWidget::eventFilter(QObject* obj, QEvent* event) +{ + if (m_ignoreMouse && dynamic_cast(event)) { + m_activeSide = NO_SIDE; + unsetCursor(); + } else if (event->type() == QEvent::MouseButtonRelease) { + parentMouseReleaseEvent(static_cast(event)); + } else if (event->type() == QEvent::MouseButtonPress) { + parentMousePressEvent(static_cast(event)); + } else if (event->type() == QEvent::MouseMove) { + parentMouseMoveEvent(static_cast(event)); + } + return false; +} + +void SelectionWidget::parentMousePressEvent(QMouseEvent* e) +{ + if (e->button() != Qt::LeftButton) { + return; + } + + m_dragStartPos = e->pos(); + m_activeSide = getMouseSide(e->pos()); +} + +void SelectionWidget::parentMouseReleaseEvent(QMouseEvent* e) +{ + // released outside of the selection area + if (!getMouseSide(e->pos())) { + hide(); + } + + m_activeSide = NO_SIDE; + updateCursor(); + emit geometrySettled(); +} + +void SelectionWidget::parentMouseMoveEvent(QMouseEvent* e) +{ + updateCursor(); + + if (e->buttons() != Qt::LeftButton) { + return; + } + + SideType mouseSide = m_activeSide; + if (!m_activeSide) { + mouseSide = getMouseSide(e->pos()); + } + + QPoint pos; + + if (!isVisible() || !mouseSide) { + show(); + m_activeSide = TOPLEFT_SIDE; + pos = m_dragStartPos; + setGeometry({ pos, pos }); + } else { + pos = e->pos(); + } + + auto geom = geometry(); + float aspectRatio = (float)geom.width() / (float)geom.height(); + bool symmetryMod = qApp->keyboardModifiers() & Qt::ShiftModifier; + bool preserveAspect = qApp->keyboardModifiers() & Qt::ControlModifier; + + QPoint newTopLeft = geom.topLeft(), newBottomRight = geom.bottomRight(); + int oldLeft = newTopLeft.rx(), oldRight = newBottomRight.rx(), + oldTop = newTopLeft.ry(), oldBottom = newBottomRight.ry(); + int &newLeft = newTopLeft.rx(), &newRight = newBottomRight.rx(), + &newTop = newTopLeft.ry(), &newBottom = newBottomRight.ry(); + switch (mouseSide) { + case TOPLEFT_SIDE: + if (m_activeSide) { + if (preserveAspect) { + if ((float)(oldRight - pos.x()) / + (float)(oldBottom - pos.y()) > + aspectRatio) { + /* width longer than expected width, hence increase + * height to compensate for the aspect ratio */ + newLeft = pos.x(); + newTop = + oldBottom - + (int)(((float)(oldRight - pos.x())) / aspectRatio); + } else { + /* height longer than expected height, hence increase + * width to compensate for the aspect ratio */ + newTop = pos.y(); + newLeft = + oldRight - + (int)(((float)(oldBottom - pos.y())) * aspectRatio); + } + } else { + newTopLeft = pos; + } + } + break; + case BOTTOMRIGHT_SIDE: + if (m_activeSide) { + if (preserveAspect) { + if ((float)(pos.x() - oldLeft) / (float)(pos.y() - oldTop) > + aspectRatio) { + newRight = pos.x(); + newBottom = + oldTop + + (int)(((float)(pos.x() - oldLeft)) / aspectRatio); + } else { + newBottom = pos.y(); + newRight = oldLeft + (int)(((float)(pos.y() - oldTop)) * + aspectRatio); + } + } else { + newBottomRight = pos; + } + } + break; + case TOPRIGHT_SIDE: + if (m_activeSide) { + if (preserveAspect) { + if ((float)(pos.x() - oldLeft) / + (float)(oldBottom - pos.y()) > + aspectRatio) { + newRight = pos.x(); + newTop = + oldBottom - + (int)(((float)(pos.x() - oldLeft)) / aspectRatio); + } else { + newTop = pos.y(); + newRight = + oldLeft + + (int)(((float)(oldBottom - pos.y())) * aspectRatio); + } + } else { + newTop = pos.y(); + newRight = pos.x(); + } + } + break; + case BOTTOMLEFT_SIDE: + if (m_activeSide) { + if (preserveAspect) { + if ((float)(oldRight - pos.x()) / + (float)(pos.y() - oldTop) > + aspectRatio) { + newLeft = pos.x(); + newBottom = + oldTop + + (int)(((float)(oldRight - pos.x())) / aspectRatio); + } else { + newBottom = pos.y(); + newLeft = oldRight - (int)(((float)(pos.y() - oldTop)) * + aspectRatio); + } + } else { + newBottom = pos.y(); + newLeft = pos.x(); + } + } + break; + case LEFT_SIDE: + if (m_activeSide) { + newLeft = pos.x(); + if (preserveAspect) { + /* By default bottom edge moves when dragging sides, this + * behavior feels natural */ + newBottom = oldTop + (int)(((float)(oldRight - pos.x())) / + aspectRatio); + } + } + break; + case RIGHT_SIDE: + if (m_activeSide) { + newRight = pos.x(); + if (preserveAspect) { + newBottom = oldTop + (int)(((float)(pos.x() - oldLeft)) / + aspectRatio); + } + } + break; + case TOP_SIDE: + if (m_activeSide) { + newTop = pos.y(); + if (preserveAspect) { + /* By default right edge moves when dragging sides, this + * behavior feels natural */ + newRight = + oldLeft + + (int)(((float)(oldBottom - pos.y()) * aspectRatio)); + } + } + break; + case BOTTOM_SIDE: + if (m_activeSide) { + newBottom = pos.y(); + if (preserveAspect) { + newRight = oldLeft + + (int)(((float)(pos.y() - oldTop) * aspectRatio)); + } + } + break; + default: + if (m_activeSide) { + move(this->pos() + pos - m_dragStartPos); + m_dragStartPos = pos; + /* do nothing special in case of preserveAspect */ + } + return; + } + // finalize geometry change + if (m_activeSide) { + if (symmetryMod) { + QPoint deltaTopLeft = newTopLeft - geom.topLeft(); + QPoint deltaBottomRight = newBottomRight - geom.bottomRight(); + newTopLeft = geom.topLeft() + deltaTopLeft - deltaBottomRight; + newBottomRight = + geom.bottomRight() + deltaBottomRight - deltaTopLeft; + } + geom = { newTopLeft, newBottomRight }; + setGeometry(geom.normalized()); + m_activeSide = getProperSide(m_activeSide, geom); + } + m_dragStartPos = e->pos(); +} + +void SelectionWidget::paintEvent(QPaintEvent*) +{ + QPainter p(this); + p.setPen(m_color); + p.drawRect(rect() + QMargins(0, 0, -1, -1)); + p.setRenderHint(QPainter::Antialiasing); + p.setBrush(m_color); + for (auto rectangle : handlerAreas()) { + p.drawEllipse(rectangle); + } +} + +void SelectionWidget::resizeEvent(QResizeEvent*) +{ + updateAreas(); + if (isVisible()) { + emit geometryChanged(); + } +} + +void SelectionWidget::moveEvent(QMoveEvent*) +{ + updateAreas(); + if (isVisible()) { + emit geometryChanged(); + } +} + +void SelectionWidget::showEvent(QShowEvent*) +{ + emit visibilityChanged(); +} + +void SelectionWidget::hideEvent(QHideEvent*) +{ + emit visibilityChanged(); +} + +void SelectionWidget::updateColor(const QColor& c) +{ + m_color = c; +} + +void SelectionWidget::moveLeft() +{ + setGeometryByKeyboard(geometry().adjusted(-1, 0, -1, 0)); +} + +void SelectionWidget::moveRight() +{ + setGeometryByKeyboard(geometry().adjusted(1, 0, 1, 0)); +} + +void SelectionWidget::moveUp() +{ + setGeometryByKeyboard(geometry().adjusted(0, -1, 0, -1)); +} + +void SelectionWidget::moveDown() +{ + setGeometryByKeyboard(geometry().adjusted(0, 1, 0, 1)); +} + +void SelectionWidget::resizeLeft() +{ + setGeometryByKeyboard(geometry().adjusted(0, 0, -1, 0)); +} + +void SelectionWidget::resizeRight() +{ + setGeometryByKeyboard(geometry().adjusted(0, 0, 1, 0)); +} + +void SelectionWidget::resizeUp() +{ + setGeometryByKeyboard(geometry().adjusted(0, 0, 0, -1)); +} + +void SelectionWidget::resizeDown() +{ + setGeometryByKeyboard(geometry().adjusted(0, 0, 0, 1)); +} + +void SelectionWidget::symResizeLeft() +{ + setGeometryByKeyboard(geometry().adjusted(1, 0, -1, 0)); +} + +void SelectionWidget::symResizeRight() +{ + setGeometryByKeyboard(geometry().adjusted(-1, 0, 1, 0)); +} + +void SelectionWidget::symResizeUp() +{ + setGeometryByKeyboard(geometry().adjusted(0, -1, 0, 1)); +} + +void SelectionWidget::symResizeDown() +{ + setGeometryByKeyboard(geometry().adjusted(0, 1, 0, -1)); +} + +void SelectionWidget::updateAreas() +{ + QRect r = rect(); + m_TLArea.moveTo(r.topLeft() + m_areaOffset); + m_TRArea.moveTo(r.topRight() + m_areaOffset); + m_BLArea.moveTo(r.bottomLeft() + m_areaOffset); + m_BRArea.moveTo(r.bottomRight() + m_areaOffset); + + m_LArea = QRect(m_TLArea.bottomLeft(), m_BLArea.topRight()); + m_TArea = QRect(m_TLArea.topRight(), m_TRArea.bottomLeft()); + m_RArea = QRect(m_TRArea.bottomLeft(), m_BRArea.topRight()); + m_BArea = QRect(m_BLArea.topRight(), m_BRArea.bottomLeft()); + + m_TLHandle.moveTo(m_TLArea.center() + m_handleOffset); + m_BLHandle.moveTo(m_BLArea.center() + m_handleOffset); + m_TRHandle.moveTo(m_TRArea.center() + m_handleOffset); + m_BRHandle.moveTo(m_BRArea.center() + m_handleOffset); + m_LHandle.moveTo(m_LArea.center() + m_handleOffset); + m_THandle.moveTo(m_TArea.center() + m_handleOffset); + m_RHandle.moveTo(m_RArea.center() + m_handleOffset); + m_BHandle.moveTo(m_BArea.center() + m_handleOffset); +} + +void SelectionWidget::updateCursor() +{ + SideType mouseSide = m_activeSide; + if (!m_activeSide) { + mouseSide = getMouseSide(parentWidget()->mapFromGlobal(QCursor::pos())); + } + + switch (mouseSide) { + case TOPLEFT_SIDE: + setCursor(Qt::SizeFDiagCursor); + break; + case BOTTOMRIGHT_SIDE: + setCursor(Qt::SizeFDiagCursor); + break; + case TOPRIGHT_SIDE: + setCursor(Qt::SizeBDiagCursor); + break; + case BOTTOMLEFT_SIDE: + setCursor(Qt::SizeBDiagCursor); + break; + case LEFT_SIDE: + setCursor(Qt::SizeHorCursor); + break; + case RIGHT_SIDE: + setCursor(Qt::SizeHorCursor); + break; + case TOP_SIDE: + setCursor(Qt::SizeVerCursor); + break; + case BOTTOM_SIDE: + setCursor(Qt::SizeVerCursor); + break; + default: + if (m_activeSide) { + setCursor(Qt::ClosedHandCursor); + } else { + setCursor(m_idleCentralCursor); + return; + } + break; + } +} + +void SelectionWidget::setGeometryByKeyboard(const QRect& r) +{ + static QTimer timer; + QRect rectangle = r.intersected(parentWidget()->rect()); + if (rectangle.width() <= 0) { + rectangle.setWidth(1); + } + if (rectangle.height() <= 0) { + rectangle.setHeight(1); + } + setGeometry(rectangle); + connect(&timer, + &QTimer::timeout, + this, + &SelectionWidget::geometrySettled, + Qt::UniqueConnection); + timer.start(400); +} diff --git a/src/widgets/capture/selectionwidget.h b/src/widgets/capture/selectionwidget.h new file mode 100644 index 0000000..fa7238a --- /dev/null +++ b/src/widgets/capture/selectionwidget.h @@ -0,0 +1,106 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include + +class QPropertyAnimation; + +class SelectionWidget : public QWidget +{ + Q_OBJECT +public: + enum SideType + { + NO_SIDE = 0, + TOP_SIDE = 0b0001, + BOTTOM_SIDE = 0b0010, + RIGHT_SIDE = 0b0100, + LEFT_SIDE = 0b1000, + TOPLEFT_SIDE = TOP_SIDE | LEFT_SIDE, + BOTTOMLEFT_SIDE = BOTTOM_SIDE | LEFT_SIDE, + TOPRIGHT_SIDE = TOP_SIDE | RIGHT_SIDE, + BOTTOMRIGHT_SIDE = BOTTOM_SIDE | RIGHT_SIDE, + CENTER = 0b10000, + }; + + explicit SelectionWidget(QColor c, QWidget* parent = nullptr); + + SideType getMouseSide(const QPoint& mousePos) const; + QVector handlerAreas(); + + void setIgnoreMouse(bool ignore); + void setIdleCentralCursor(const QCursor& cursor); + + void setGeometryAnimated(const QRect& r); + void setGeometry(const QRect& r); + QRect geometry() const; + QRect fullGeometry() const; + + QRect rect() const; + +protected: + bool eventFilter(QObject*, QEvent*) override; + void parentMousePressEvent(QMouseEvent* e); + void parentMouseReleaseEvent(QMouseEvent* e); + void parentMouseMoveEvent(QMouseEvent* e); + + void paintEvent(QPaintEvent*) override; + void resizeEvent(QResizeEvent*) override; + void moveEvent(QMoveEvent*) override; + + void showEvent(QShowEvent*) override; + void hideEvent(QHideEvent*) override; + +signals: + void animationEnded(); + void geometryChanged(); + void geometrySettled(); + void visibilityChanged(); + +public slots: + void updateColor(const QColor& c); + + void moveLeft(); + void moveRight(); + void moveUp(); + void moveDown(); + + void resizeLeft(); + void resizeRight(); + void resizeUp(); + void resizeDown(); + + void symResizeLeft(); + void symResizeRight(); + void symResizeUp(); + void symResizeDown(); + +private: + void updateAreas(); + void updateCursor(); + void setGeometryByKeyboard(const QRect& r); + + QPropertyAnimation* m_animation; + + QColor m_color; + QPoint m_areaOffset; + QPoint m_handleOffset; + + QPoint m_dragStartPos; + SideType m_activeSide; + QCursor m_idleCentralCursor; + bool m_ignoreMouse; + bool m_mouseStartMove; + + // naming convention for handles + // T top, B bottom, R Right, L left + // 2 letters: a corner + // 1 letter: the handle on the middle of the corresponding side + QRect m_TLHandle, m_TRHandle, m_BLHandle, m_BRHandle; + QRect m_LHandle, m_THandle, m_RHandle, m_BHandle; + + QRect m_TLArea, m_TRArea, m_BLArea, m_BRArea; + QRect m_LArea, m_TArea, m_RArea, m_BArea; +}; diff --git a/src/widgets/capturelauncher.cpp b/src/widgets/capturelauncher.cpp new file mode 100644 index 0000000..69f7429 --- /dev/null +++ b/src/widgets/capturelauncher.cpp @@ -0,0 +1,181 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2018 Alejandro Sirgo Rica & Contributors + +#include "capturelauncher.h" +#include "./ui_capturelauncher.h" +#include "src/config/cacheutils.h" +#include "src/core/flameshot.h" +#include "src/core/qguiappcurrentscreen.h" +#include "src/utils/globalvalues.h" +#include "src/utils/screengrabber.h" +#include "src/utils/screenshotsaver.h" +#include "src/widgets/imagelabel.h" +#include + +// https://github.com/KDE/spectacle/blob/941c1a517be82bed25d1254ebd735c29b0d2951c/src/Gui/KSWidget.cpp +// https://github.com/KDE/spectacle/blob/941c1a517be82bed25d1254ebd735c29b0d2951c/src/Gui/KSMainWindow.cpp + +CaptureLauncher::CaptureLauncher(QDialog* parent) + : QDialog(parent) + , ui(new Ui::CaptureLauncher) +{ + qApp->installEventFilter(this); // see eventFilter() + ui->setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + setWindowIcon(QIcon(GlobalValues::iconPath())); + bool ok; + + ui->imagePreview->setScreenshot(ScreenGrabber().grabEntireDesktop(ok)); + ui->imagePreview->setSizePolicy(QSizePolicy::Expanding, + QSizePolicy::Expanding); + + ui->captureType->insertItem( + 1, tr("Rectangular Region"), CaptureRequest::GRAPHICAL_MODE); + +#if defined(Q_OS_MACOS) + // Following to MacOS philosophy (one application cannot be displayed on + // more than one display) + ui->captureType->insertItem( + 2, tr("Full Screen (Current Display)"), CaptureRequest::FULLSCREEN_MODE); +#else + ui->captureType->insertItem( + 2, tr("Full Screen (All Monitors)"), CaptureRequest::FULLSCREEN_MODE); +#endif + + ui->delayTime->setSpecialValueText(tr("No Delay")); + ui->launchButton->setFocus(); + + // Function to add or remove plural to seconds + connect(ui->delayTime, + static_cast(&QSpinBox::valueChanged), + this, + [this](int val) { + QString suffix = val == 1 ? tr(" second") : tr(" seconds"); + this->ui->delayTime->setSuffix(suffix); + }); + + connect(ui->launchButton, + &QPushButton::clicked, + this, + &CaptureLauncher::startCapture); + + connect(ui->captureType, + QOverload::of(&QComboBox::currentIndexChanged), + this, + [this]() { + auto mode = static_cast( + ui->captureType->currentData().toInt()); + if (mode == CaptureRequest::CaptureMode::GRAPHICAL_MODE) { + ui->sizeLabel->show(); + ui->screenshotX->show(); + ui->screenshotY->show(); + ui->screenshotWidth->show(); + ui->screenshotHeight->show(); + } else { + ui->sizeLabel->hide(); + ui->screenshotX->hide(); + ui->screenshotY->hide(); + ui->screenshotWidth->hide(); + ui->screenshotHeight->hide(); + } + }); + + auto lastRegion = getLastRegion(); + ui->screenshotX->setText(QString::number(lastRegion.x())); + ui->screenshotY->setText(QString::number(lastRegion.y())); + ui->screenshotWidth->setText(QString::number(lastRegion.width())); + ui->screenshotHeight->setText(QString::number(lastRegion.height())); + + show(); + // Call show() first, otherwise the correct geometry cannot be fetched + // for centering the window on the screen + QRect position = frameGeometry(); + QScreen* screen = QGuiAppCurrentScreen().currentScreen(); + position.moveCenter(screen->availableGeometry().center()); + move(position.topLeft()); +} + +// HACK: +// https://github.com/KDE/spectacle/blob/fa1e780b8bf3df3ac36c410b9ece4ace041f401b/src/Gui/KSMainWindow.cpp#L70 +void CaptureLauncher::startCapture() +{ + ui->launchButton->setEnabled(false); + hide(); + + auto const additionalDelayToHideUI = 600; + auto const secondsToMilliseconds = 1000; + auto mode = static_cast( + ui->captureType->currentData().toInt()); + CaptureRequest req(mode, + additionalDelayToHideUI + + ui->delayTime->value() * secondsToMilliseconds); + + if (mode == CaptureRequest::CaptureMode::GRAPHICAL_MODE) { + req.setInitialSelection(QRect(ui->screenshotX->text().toInt(), + ui->screenshotY->text().toInt(), + ui->screenshotWidth->text().toInt(), + ui->screenshotHeight->text().toInt())); + } + + connectCaptureSlots(); + Flameshot::instance()->requestCapture(req); +} + +void CaptureLauncher::connectCaptureSlots() const +{ + connect(Flameshot::instance(), + &Flameshot::captureTaken, + this, + &CaptureLauncher::onCaptureTaken); + connect(Flameshot::instance(), + &Flameshot::captureFailed, + this, + &CaptureLauncher::onCaptureFailed); +} + +void CaptureLauncher::disconnectCaptureSlots() const +{ + // Hack for MacOS + // for some strange reasons MacOS sends multiple "captureTaken" signals + // (random number, usually from 1 up to 20). + // So now it enables signal on "Capture new screenshot" button and disables + // on first success of fail. + disconnect(Flameshot::instance(), + &Flameshot::captureTaken, + this, + &CaptureLauncher::onCaptureTaken); + disconnect(Flameshot::instance(), + &Flameshot::captureFailed, + this, + &CaptureLauncher::onCaptureFailed); +} + +void CaptureLauncher::onCaptureTaken(QPixmap const& screenshot) +{ + // MacOS specific, more details in the function disconnectCaptureSlots() + disconnectCaptureSlots(); + + ui->imagePreview->setScreenshot(screenshot); + show(); + + auto mode = static_cast( + ui->captureType->currentData().toInt()); + + if (mode == CaptureRequest::FULLSCREEN_MODE) { + saveToFilesystemGUI(screenshot); + } + ui->launchButton->setEnabled(true); +} + +void CaptureLauncher::onCaptureFailed() +{ + // MacOS specific, more details in the function disconnectCaptureSlots() + disconnectCaptureSlots(); + show(); + ui->launchButton->setEnabled(true); +} + +CaptureLauncher::~CaptureLauncher() +{ + delete ui; +} diff --git a/src/widgets/capturelauncher.h b/src/widgets/capturelauncher.h new file mode 100644 index 0000000..0e0baf0 --- /dev/null +++ b/src/widgets/capturelauncher.h @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2018 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include + +QT_BEGIN_NAMESPACE +namespace Ui { +class CaptureLauncher; +} +QT_END_NAMESPACE + +class CaptureLauncher : public QDialog +{ + Q_OBJECT + +public: + explicit CaptureLauncher(QDialog* parent = nullptr); + ~CaptureLauncher(); + +private: + Ui::CaptureLauncher* ui; + void connectCaptureSlots() const; + void disconnectCaptureSlots() const; + +private slots: + void startCapture(); + void onCaptureTaken(QPixmap const& p); + void onCaptureFailed(); +}; diff --git a/src/widgets/capturelauncher.ui b/src/widgets/capturelauncher.ui new file mode 100644 index 0000000..ae26f27 --- /dev/null +++ b/src/widgets/capturelauncher.ui @@ -0,0 +1,182 @@ + + + CaptureLauncher + + + + 0 + 0 + 807 + 213 + + + + Capture Launcher + + + + + + + + + 0 + 0 + + + + + 420 + 0 + + + + TextLabel + + + + + + + + + + + + 75 + true + + + + Capture Mode + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + -1 + + + + + + + + + Area: + + + + + + + + + + + + + + Delay: + + + + + + + + 0 + 0 + + + + WxH+x+y + + + + + + + seconds + + + 0 + + + 999 + + + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + + + + + + + + + 0 + 0 + + + + Take new screenshot + + + + + + + + + + ImageLabel + QLabel +
    imagelabel.h
    +
    +
    + + +
    diff --git a/src/widgets/colorpickerwidget.cpp b/src/widgets/colorpickerwidget.cpp new file mode 100644 index 0000000..866a975 --- /dev/null +++ b/src/widgets/colorpickerwidget.cpp @@ -0,0 +1,157 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2022 Dearsh Oberoi + +#include "colorpickerwidget.h" +#include "src/utils/confighandler.h" +#include "src/utils/globalvalues.h" +#include +#include + +ColorPickerWidget::ColorPickerWidget(QWidget* parent) + : QWidget(parent) + , m_selectedIndex(1) + , m_lastIndex(1) +{ + initColorPicker(); +} + +const QVector& ColorPickerWidget::getDefaultSmallColorPalette() +{ + return defaultSmallColorPalette; +} + +const QVector& ColorPickerWidget::getDefaultLargeColorPalette() +{ + return defaultLargeColorPalette; +} + +void ColorPickerWidget::paintEvent(QPaintEvent* e) +{ + QPainter painter(this); + painter.setRenderHint(QPainter::Antialiasing); + painter.setPen(QColor(Qt::black)); + + for (int i = 0; i < m_colorAreaList.size(); ++i) { + if (e->region().contains(m_colorAreaList.at(i))) { + painter.setClipRegion(e->region()); + repaint(i, painter); + } + } +} + +void ColorPickerWidget::repaint(int i, QPainter& painter) +{ + // draw the highlight when we have to draw the selected color + if (i == m_selectedIndex) { + auto c = QColor(m_uiColor); + c.setAlpha(155); + painter.setBrush(c); + c.setAlpha(100); + painter.setPen(c); + QRect highlight = m_colorAreaList.at(i); + const int highlightThickness = 6; + + // makes the highlight and color circles concentric + highlight.moveTo(highlight.x() - (highlightThickness / 2), + highlight.y() - (highlightThickness / 2)); + + highlight.setHeight(highlight.height() + highlightThickness); + highlight.setWidth(highlight.width() + highlightThickness); + painter.drawRoundedRect(highlight, 100, 100); + painter.setPen(QColor(Qt::black)); + } + + // draw available colors + if (m_colorList.at(i).isValid()) { + // draw preset color + painter.setBrush(QColor(m_colorList.at(i))); + painter.drawRoundedRect(m_colorAreaList.at(i), 100, 100); + } else { + // draw rainbow (part) for custom color + QRect lastRect = m_colorAreaList.at(i); + int nStep = 1; + int nSteps = lastRect.height() / nStep; + // 0.02 - start rainbow color, 0.33 - end rainbow color from range: + // 0.0 - 1.0 + float h = 0.02f; + for (int radius = nSteps; radius > 0; radius -= nStep * 2) { + // calculate color + float fHStep = (0.33 - h) / (nSteps / nStep / 2); + QColor color = QColor::fromHslF(h, 0.95f, 0.5f); + + // set color and draw circle + painter.setPen(color); + painter.setBrush(color); + painter.drawRoundedRect(lastRect, 100, 100); + + // set next color, circle geometry + h += fHStep; + lastRect.setX(lastRect.x() + nStep); + lastRect.setY(lastRect.y() + nStep); + lastRect.setHeight(lastRect.height() - nStep); + lastRect.setWidth(lastRect.width() - nStep); + + painter.setPen(QColor(Qt::black)); + } + } +} + +void ColorPickerWidget::updateSelection(int index) +{ + m_selectedIndex = index; + update(m_colorAreaList.at(index) + QMargins(10, 10, 10, 10)); + update(m_colorAreaList.at(m_lastIndex) + QMargins(10, 10, 10, 10)); + m_lastIndex = index; +} + +void ColorPickerWidget::updateWidget() +{ + m_colorAreaList.clear(); + initColorPicker(); + update(); +} + +void ColorPickerWidget::initColorPicker() +{ + ConfigHandler config; + m_colorList = config.userColors(); + m_colorAreaSize = GlobalValues::buttonBaseSize() * 0.6; + // save the color values in member variables for faster access + m_uiColor = config.uiColor(); + + // extraSize represents the extra space needed for the highlight of the + // selected color. + const int extraSize = 6; + const double slope = 3; + double radius = slope * m_colorList.size() + GlobalValues::buttonBaseSize(); + setMinimumSize(radius * 2 + m_colorAreaSize + extraSize, + radius * 2 + m_colorAreaSize + extraSize); + resize(radius * 2 + m_colorAreaSize + extraSize, + radius * 2 + m_colorAreaSize + extraSize); + double degree = (double)360 / m_colorList.size(); + double degreeAcum = 90; + // this line is the radius of the circle which will be rotated to add + // the color components. + QLineF baseLine = + QLineF(QPoint(radius + extraSize / 2, radius + extraSize / 2), + QPoint(radius + extraSize / 2, extraSize / 2)); + + for (int i = 0; i < m_colorList.size(); ++i) { + m_colorAreaList.append(QRect( + baseLine.x2(), baseLine.y2(), m_colorAreaSize, m_colorAreaSize)); + degreeAcum += degree; + baseLine.setAngle(degreeAcum); + } +} + +QVector ColorPickerWidget::defaultSmallColorPalette = { + QColor(), Qt::darkRed, Qt::red, Qt::yellow, Qt::green, + Qt::darkGreen, Qt::cyan, Qt::blue, Qt::magenta, Qt::darkMagenta +}; + +QVector ColorPickerWidget::defaultLargeColorPalette = { + QColor(), Qt::white, Qt::red, Qt::green, Qt::blue, + Qt::black, Qt::darkRed, Qt::darkGreen, Qt::darkBlue, Qt::darkGray, + Qt::cyan, Qt::magenta, Qt::yellow, Qt::lightGray, Qt::darkCyan, + Qt::darkMagenta, Qt::darkYellow +}; diff --git a/src/widgets/colorpickerwidget.h b/src/widgets/colorpickerwidget.h new file mode 100644 index 0000000..4935960 --- /dev/null +++ b/src/widgets/colorpickerwidget.h @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2022 Dearsh Oberoi + +#pragma once + +#include + +class ColorPickerWidget : public QWidget +{ + Q_OBJECT +public: + explicit ColorPickerWidget(QWidget* parent = nullptr); + + static const QVector& getDefaultSmallColorPalette(); + static const QVector& getDefaultLargeColorPalette(); + void updateWidget(); + void updateSelection(int index); + +protected: + void paintEvent(QPaintEvent* event) override; + void repaint(int i, QPainter& painter); + + int m_colorAreaSize; + int m_selectedIndex, m_lastIndex; + QVector m_colorAreaList; + QVector m_colorList; + + QColor m_uiColor; + +private: + void initColorPicker(); + static QVector defaultSmallColorPalette, defaultLargeColorPalette; +}; diff --git a/src/widgets/draggablewidgetmaker.cpp b/src/widgets/draggablewidgetmaker.cpp new file mode 100644 index 0000000..6f93fc8 --- /dev/null +++ b/src/widgets/draggablewidgetmaker.cpp @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "draggablewidgetmaker.h" +#include + +DraggableWidgetMaker::DraggableWidgetMaker(QObject* parent) + : QObject(parent) +{} + +void DraggableWidgetMaker::makeDraggable(QWidget* widget) +{ + widget->installEventFilter(this); +} + +bool DraggableWidgetMaker::eventFilter(QObject* obj, QEvent* event) +{ + auto* widget = static_cast(obj); + + // based on https://stackoverflow.com/a/12221360/964478 + switch (event->type()) { + case QEvent::MouseButtonPress: { + auto* mouseEvent = static_cast(event); + + m_isPressing = false; + m_isDragging = false; + if (mouseEvent->button() == Qt::LeftButton) { + m_isPressing = true; + m_mousePressPos = mouseEvent->globalPosition(); + m_mouseMovePos = m_mousePressPos; + } + } break; + case QEvent::MouseMove: { + auto* mouseEvent = static_cast(event); + + if (m_isPressing) { + QPointF widgetPos = widget->mapToGlobal(widget->pos()); + QPointF eventPos = mouseEvent->globalPosition(); + QPointF diff = eventPos - m_mouseMovePos; + QPointF newPos = widgetPos + diff; + + widget->move(widget->mapFromGlobal(newPos.toPoint())); + + if (!m_isDragging) { + QPointF totalMovedDiff = eventPos - m_mousePressPos; + if (totalMovedDiff.manhattanLength() > 3) { + m_isDragging = true; + } + } + + m_mouseMovePos = eventPos; + } + } break; + case QEvent::MouseButtonRelease: { + m_isPressing = false; + if (m_isDragging) { + m_isDragging = false; + event->ignore(); + return true; + } + } break; + default: + break; + } + + return QObject::eventFilter(obj, event); +} diff --git a/src/widgets/draggablewidgetmaker.h b/src/widgets/draggablewidgetmaker.h new file mode 100644 index 0000000..aba5097 --- /dev/null +++ b/src/widgets/draggablewidgetmaker.h @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include +#include +#include +#include + +class DraggableWidgetMaker : public QObject +{ + Q_OBJECT +public: + DraggableWidgetMaker(QObject* parent = nullptr); + + void makeDraggable(QWidget* widget); + +protected: + bool eventFilter(QObject* obj, QEvent* event) override; + +private: + bool m_isPressing = false; + bool m_isDragging = false; + QPointF m_mouseMovePos; + QPointF m_mousePressPos; +}; diff --git a/src/widgets/imagelabel.cpp b/src/widgets/imagelabel.cpp new file mode 100644 index 0000000..8d600d4 --- /dev/null +++ b/src/widgets/imagelabel.cpp @@ -0,0 +1,78 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +// This code is a modified version of the KDE software Spectacle +// /src/Gui/KSImageWidget.cpp commit cbbd6d45f6426ccbf1a82b15fdf98613ccccbbe9 + +#include "imagelabel.h" + +ImageLabel::ImageLabel(QWidget* parent) + : QLabel(parent) + , m_pixmap(QPixmap()) +{ + m_DSEffect = new QGraphicsDropShadowEffect(this); + + m_DSEffect->setBlurRadius(5); + m_DSEffect->setOffset(0); + m_DSEffect->setColor(QColor(Qt::black)); + + setGraphicsEffect(m_DSEffect); + setCursor(Qt::OpenHandCursor); + setAlignment(Qt::AlignCenter); + setMinimumSize(size()); +} + +void ImageLabel::setScreenshot(const QPixmap& pixmap) +{ + m_pixmap = pixmap; + const QString tooltip = + QStringLiteral("%1x%2 px").arg(m_pixmap.width(), m_pixmap.height()); + setToolTip(tooltip); + setScaledPixmap(); +} + +void ImageLabel::setScaledPixmap() +{ + const qreal scale = qApp->devicePixelRatio(); + QPixmap scaledPixmap = m_pixmap.scaled( + size() * scale, Qt::KeepAspectRatio, Qt::SmoothTransformation); + scaledPixmap.setDevicePixelRatio(scale); + setPixmap(scaledPixmap); +} + +// drag handlers + +void ImageLabel::mousePressEvent(QMouseEvent* event) +{ + if (event->button() == Qt::LeftButton) { + m_dragStartPosition = event->pos(); + setCursor(Qt::ClosedHandCursor); + } +} + +void ImageLabel::mouseReleaseEvent(QMouseEvent* event) +{ + if (event->button() == Qt::LeftButton) { + setCursor(Qt::OpenHandCursor); + } +} + +void ImageLabel::mouseMoveEvent(QMouseEvent* event) +{ + if (!(event->buttons() & Qt::LeftButton)) { + return; + } + if ((event->pos() - m_dragStartPosition).manhattanLength() < + QGuiApplication::styleHints()->startDragDistance()) { + return; + } + setCursor(Qt::OpenHandCursor); + emit dragInitiated(); +} + +// resize handler +void ImageLabel::resizeEvent(QResizeEvent* event) +{ + Q_UNUSED(event) + setScaledPixmap(); +} diff --git a/src/widgets/imagelabel.h b/src/widgets/imagelabel.h new file mode 100644 index 0000000..89814ef --- /dev/null +++ b/src/widgets/imagelabel.h @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +// This code is a modified version of the KDE software Spectacle +// /src/Gui/KSImageWidget.h commit cbbd6d45f6426ccbf1a82b15fdf98613ccccbbe9 + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + +class ImageLabel : public QLabel +{ + Q_OBJECT + +public: + explicit ImageLabel(QWidget* parent = nullptr); + void setScreenshot(const QPixmap& pixmap); + +signals: + void dragInitiated(); + +protected: + void mousePressEvent(QMouseEvent* event) Q_DECL_OVERRIDE; + void mouseReleaseEvent(QMouseEvent* event) Q_DECL_OVERRIDE; + void mouseMoveEvent(QMouseEvent* event) Q_DECL_OVERRIDE; + void resizeEvent(QResizeEvent* event) Q_DECL_OVERRIDE; + +private: + void setScaledPixmap(); + + QGraphicsDropShadowEffect* m_DSEffect; + QPixmap m_pixmap; + QPoint m_dragStartPosition; +}; diff --git a/src/widgets/imguploaddialog.cpp b/src/widgets/imguploaddialog.cpp new file mode 100644 index 0000000..6fc46ca --- /dev/null +++ b/src/widgets/imguploaddialog.cpp @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "imguploaddialog.h" +#include "src/utils/confighandler.h" +#include "src/utils/globalvalues.h" +#include +#include +#include +#include + +ImgUploadDialog::ImgUploadDialog(QDialog* parent) + : QDialog(parent) +{ + setAttribute(Qt::WA_DeleteOnClose); + setMinimumSize(400, 120); + setWindowIcon(QIcon(GlobalValues::iconPath())); + setWindowTitle(tr("Upload Confirmation")); + + layout = new QVBoxLayout(this); + + m_uploadLabel = new QLabel(tr("Do you want to upload this capture?"), this); + + layout->addWidget(m_uploadLabel); + + buttonBox = + new QDialogButtonBox(QDialogButtonBox::Yes | QDialogButtonBox::No); + + connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); + connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); + + layout->addWidget(buttonBox); + + m_uploadWithoutConfirmation = + new QCheckBox(tr("Upload without confirmation"), this); + m_uploadWithoutConfirmation->setToolTip(tr("Upload without confirmation")); + connect(m_uploadWithoutConfirmation, &QCheckBox::clicked, [](bool checked) { + ConfigHandler().setUploadWithoutConfirmation(checked); + }); + + layout->addWidget(m_uploadWithoutConfirmation); +} \ No newline at end of file diff --git a/src/widgets/imguploaddialog.h b/src/widgets/imguploaddialog.h new file mode 100644 index 0000000..d2ed444 --- /dev/null +++ b/src/widgets/imguploaddialog.h @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include + +class QCheckBox; +class QLabel; +class QDialogButtonBox; +class QVBoxLayout; + +class ImgUploadDialog : public QDialog +{ + Q_OBJECT +public: + explicit ImgUploadDialog(QDialog* parent = nullptr); + +private: + QCheckBox* m_uploadWithoutConfirmation; + QLabel* m_uploadLabel; + QDialogButtonBox* buttonBox; + QVBoxLayout* layout; +}; diff --git a/src/widgets/infowindow.cpp b/src/widgets/infowindow.cpp new file mode 100644 index 0000000..88ead9b --- /dev/null +++ b/src/widgets/infowindow.cpp @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2021-2022 Jeremy Borgman & Contributors + +#include "infowindow.h" +#include "./ui_infowindow.h" +#include "src/core/flameshotdaemon.h" +#include "src/core/qguiappcurrentscreen.h" +#include "src/utils/globalvalues.h" +#include +#include + +InfoWindow::InfoWindow(QWidget* parent) + : QWidget(parent) + , ui(new Ui::InfoWindow) +{ + ui->setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + + ui->IconSVG->setPixmap(QPixmap(GlobalValues::iconPath())); + ui->VersionDetails->setText(GlobalValues::versionInfo()); + ui->OperatingSystemDetails->setText(generateKernelString()); + + connect( + ui->CopyInfoButton, &QPushButton::clicked, this, &InfoWindow::copyInfo); + + show(); + // Call show() first, otherwise the correct geometry cannot be fetched for + // centering the window on the screen + QRect position = frameGeometry(); + QScreen* screen = QGuiAppCurrentScreen().currentScreen(); + position.moveCenter(screen->availableGeometry().center()); + move(position.topLeft()); +} + +InfoWindow::~InfoWindow() +{ + delete ui; +} + +void InfoWindow::keyPressEvent(QKeyEvent* event) +{ + if (event->key() == Qt::Key_Escape) { + close(); + } +} + +QString generateKernelString() +{ + QString kernelVersion = + QSysInfo::kernelType() + ": " + QSysInfo::kernelVersion() + "\n" + + QSysInfo::productType() + ": " + QSysInfo::productVersion(); + return kernelVersion; +} + +void InfoWindow::copyInfo() +{ + FlameshotDaemon::copyToClipboard(GlobalValues::versionInfo() + "\n" + + generateKernelString()); +} diff --git a/src/widgets/infowindow.h b/src/widgets/infowindow.h new file mode 100644 index 0000000..3f7a85f --- /dev/null +++ b/src/widgets/infowindow.h @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2021-2022 Jeremy Borgman & Contributors + +#pragma once + +#include + +QT_BEGIN_NAMESPACE +namespace Ui { +class InfoWindow; +} +QT_END_NAMESPACE + +class InfoWindow : public QWidget +{ + Q_OBJECT + +public: + explicit InfoWindow(QWidget* parent = nullptr); + ~InfoWindow(); + +private: + Ui::InfoWindow* ui; + +protected: + void keyPressEvent(QKeyEvent* event); + +private slots: + void copyInfo(); +}; + +QString generateKernelString(); diff --git a/src/widgets/infowindow.ui b/src/widgets/infowindow.ui new file mode 100644 index 0000000..3479d20 --- /dev/null +++ b/src/widgets/infowindow.ui @@ -0,0 +1,140 @@ + + + InfoWindow + + + + 0 + 0 + 182 + 262 + + + + About + + + + :/img/app/flameshot.png:/img/app/flameshot.png + + + + + + + + Icon + + + Qt::AlignCenter + + + + + + + + 75 + true + true + + + + License + + + Qt::AlignCenter + + + Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + + + + + GPLv3+ + + + Qt::AlignCenter + + + Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + 75 + true + true + + + + Version + + + Qt::AlignCenter + + + Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + + + + + Flameshot v + + + Qt::AlignCenter + + + Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + + + + + OS Info + + + Qt::AlignCenter + + + Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + + + + + Copy Info + + + + + + + + + + + + diff --git a/src/widgets/loadspinner.cpp b/src/widgets/loadspinner.cpp new file mode 100644 index 0000000..b48f411 --- /dev/null +++ b/src/widgets/loadspinner.cpp @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "loadspinner.h" +#include +#include +#include +#include + +#define OFFSET 5 + +LoadSpinner::LoadSpinner(QWidget* parent) + : QWidget(parent) + , m_span(0) + , m_growing(true) +{ + setAttribute(Qt::WA_TranslucentBackground); + const int size = QFontMetrics(qApp->font()).height() * 8; + setFixedSize(size, size); + updateFrame(); + // init timer + m_timer = new QTimer(this); + connect(m_timer, &QTimer::timeout, this, &LoadSpinner::rotate); + m_timer->setInterval(30); +} + +void LoadSpinner::setColor(const QColor& c) +{ + m_color = c; +} + +void LoadSpinner::setWidth(int w) +{ + setFixedSize(w, w); + updateFrame(); +} + +void LoadSpinner::setHeight(int h) +{ + setFixedSize(h, h); + updateFrame(); +} + +void LoadSpinner::start() +{ + m_timer->start(); +} + +void LoadSpinner::stop() +{ + m_timer->stop(); +} + +void LoadSpinner::paintEvent(QPaintEvent*) +{ + QPainter painter(this); + painter.setRenderHint(QPainter::Antialiasing, true); + auto pen = QPen(m_color); + + pen.setWidth(height() / 10); + painter.setPen(pen); + painter.setOpacity(0.2); + painter.drawArc(m_frame, 0, 5760); + painter.setOpacity(1.0); + painter.drawArc(m_frame, (m_startAngle * 16), (m_span * 16)); +} + +void LoadSpinner::rotate() +{ + const int advance = 3; + const int grow = 8; + if (m_growing) { + m_startAngle = (m_startAngle + advance) % 360; + m_span += grow; + if (m_span > 260) { + m_growing = false; + } + } else { + m_startAngle = (m_startAngle + grow) % 360; + m_span = m_span + advance - grow; + if (m_span < 10) { + m_growing = true; + } + } + update(); +} + +void LoadSpinner::updateFrame() +{ + m_frame = + QRect(OFFSET, OFFSET, width() - OFFSET * 2, height() - OFFSET * 2); +} diff --git a/src/widgets/loadspinner.h b/src/widgets/loadspinner.h new file mode 100644 index 0000000..c6a2dbf --- /dev/null +++ b/src/widgets/loadspinner.h @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include + +class LoadSpinner : public QWidget +{ + Q_OBJECT +public: + explicit LoadSpinner(QWidget* parent = nullptr); + + void setColor(const QColor& c); + void setWidth(int w); + void setHeight(int h); + void start(); + void stop(); + +protected: + void paintEvent(QPaintEvent*); + +private slots: + void rotate(); + +private: + QColor m_color; + QTimer* m_timer; + + int m_startAngle = 0; + int m_span = 180; + bool m_growing; + + QRect m_frame; + void updateFrame(); +}; diff --git a/src/widgets/notificationwidget.cpp b/src/widgets/notificationwidget.cpp new file mode 100644 index 0000000..ee54659 --- /dev/null +++ b/src/widgets/notificationwidget.cpp @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "notificationwidget.h" +#include +#include +#include +#include +#include +#include + +NotificationWidget::NotificationWidget(QWidget* parent) + : QWidget(parent) +{ + m_timer = new QTimer(this); + m_timer->setSingleShot(true); + m_timer->setInterval(7000); + connect(m_timer, &QTimer::timeout, this, &NotificationWidget::animatedHide); + + m_content = new QFrame(); + m_layout = new QVBoxLayout(); + m_label = new QLabel(m_content); + m_label->hide(); + + m_showAnimation = new QPropertyAnimation(m_content, "geometry", this); + m_showAnimation->setDuration(300); + + m_hideAnimation = new QPropertyAnimation(m_content, "geometry", this); + m_hideAnimation->setDuration(300); + connect( + m_hideAnimation, &QPropertyAnimation::finished, m_label, &QLabel::hide); + + auto* mainLayout = new QVBoxLayout(); + setLayout(mainLayout); + + mainLayout->addWidget(m_content); + m_layout->addWidget(m_label, 0, Qt::AlignHCenter); + m_content->setLayout(m_layout); + + setFixedHeight(40); +} + +void NotificationWidget::showMessage(const QString& msg) +{ + m_label->setText(msg); + m_label->show(); + animatedShow(); +} + +void NotificationWidget::animatedShow() +{ + m_showAnimation->setStartValue(QRect(0, 0, width(), 0)); + m_showAnimation->setEndValue(QRect(0, 0, width(), height())); + m_showAnimation->start(); + m_timer->start(); +} + +void NotificationWidget::animatedHide() +{ + m_hideAnimation->setStartValue(QRect(0, 0, width(), height())); + m_hideAnimation->setEndValue(QRect(0, 0, width(), 0)); + m_hideAnimation->start(); +} diff --git a/src/widgets/notificationwidget.h b/src/widgets/notificationwidget.h new file mode 100644 index 0000000..2ff7314 --- /dev/null +++ b/src/widgets/notificationwidget.h @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include + +class QLabel; +class QTimer; +class QPropertyAnimation; +class QVBoxLayout; +class QFrame; + +class NotificationWidget : public QWidget +{ + Q_OBJECT +public: + explicit NotificationWidget(QWidget* parent = nullptr); + + void showMessage(const QString& msg); + +private: + QLabel* m_label; + QPropertyAnimation* m_showAnimation; + QPropertyAnimation* m_hideAnimation; + QVBoxLayout* m_layout; + QFrame* m_content; + QTimer* m_timer; + + void animatedShow(); + void animatedHide(); +}; diff --git a/src/widgets/orientablepushbutton.cpp b/src/widgets/orientablepushbutton.cpp new file mode 100644 index 0000000..091397d --- /dev/null +++ b/src/widgets/orientablepushbutton.cpp @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +// Based on https://stackoverflow.com/a/53135675/964478 + +#include "orientablepushbutton.h" +#include +#include +#include + +OrientablePushButton::OrientablePushButton(QWidget* parent) + : CaptureButton(parent) +{} + +OrientablePushButton::OrientablePushButton(const QString& text, QWidget* parent) + : CaptureButton(text, parent) +{} + +OrientablePushButton::OrientablePushButton(const QIcon& icon, + const QString& text, + QWidget* parent) + : CaptureButton(icon, text, parent) +{} + +QSize OrientablePushButton::sizeHint() const +{ + QSize sh = QPushButton::sizeHint(); + + if (m_orientation != OrientablePushButton::Horizontal) { + sh.transpose(); + } + + return sh; +} + +void OrientablePushButton::paintEvent(QPaintEvent* event) +{ + Q_UNUSED(event) + + QStylePainter painter(this); + QStyleOptionButton option; + initStyleOption(&option); + + if (m_orientation == OrientablePushButton::VerticalTopToBottom) { + painter.rotate(90); + painter.translate(0, -1 * width()); + option.rect = option.rect.transposed(); + } + + else if (m_orientation == OrientablePushButton::VerticalBottomToTop) { + painter.rotate(-90); + painter.translate(-1 * height(), 0); + option.rect = option.rect.transposed(); + } + + painter.drawControl(QStyle::CE_PushButton, option); +} + +OrientablePushButton::Orientation OrientablePushButton::orientation() const +{ + return m_orientation; +} + +void OrientablePushButton::setOrientation( + OrientablePushButton::Orientation orientation) +{ + m_orientation = orientation; +} diff --git a/src/widgets/orientablepushbutton.h b/src/widgets/orientablepushbutton.h new file mode 100644 index 0000000..0082ff4 --- /dev/null +++ b/src/widgets/orientablepushbutton.h @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +// Based on https://stackoverflow.com/a/53135675/964478 + +#pragma once + +#include "capture/capturebutton.h" +#include + +class OrientablePushButton : public CaptureButton +{ + Q_OBJECT +public: + enum Orientation + { + Horizontal, + VerticalTopToBottom, + VerticalBottomToTop + }; + + OrientablePushButton(QWidget* parent = nullptr); + OrientablePushButton(const QString& text, QWidget* parent = nullptr); + OrientablePushButton(const QIcon& icon, + const QString& text, + QWidget* parent = nullptr); + + QSize sizeHint() const; + + OrientablePushButton::Orientation orientation() const; + void setOrientation(OrientablePushButton::Orientation orientation); + +protected: + void paintEvent(QPaintEvent* event); + +private: + Orientation m_orientation = Horizontal; +}; diff --git a/src/widgets/panel/CMakeLists.txt b/src/widgets/panel/CMakeLists.txt new file mode 100644 index 0000000..5c4a468 --- /dev/null +++ b/src/widgets/panel/CMakeLists.txt @@ -0,0 +1,4 @@ +# Required to generate MOC +target_sources(flameshot PRIVATE sidepanelwidget.h utilitypanel.h colorgrabwidget.h) + +target_sources(flameshot PRIVATE sidepanelwidget.cpp utilitypanel.cpp colorgrabwidget.cpp) diff --git a/src/widgets/panel/colorgrabwidget.cpp b/src/widgets/panel/colorgrabwidget.cpp new file mode 100644 index 0000000..ec8e111 --- /dev/null +++ b/src/widgets/panel/colorgrabwidget.cpp @@ -0,0 +1,238 @@ +#include "colorgrabwidget.h" +#include "sidepanelwidget.h" + +#include "colorutils.h" +#include "confighandler.h" +#include "overlaymessage.h" +#include "src/core/qguiappcurrentscreen.h" +#include +#include +#include +#include +#include +#include +#include +#include + +// Width (= height) and zoom level of the widget before the user clicks +#define WIDTH1 77 +#define ZOOM1 11 +// Width (= height) and zoom level of the widget after the user clicks +#define WIDTH2 165 +#define ZOOM2 15 + +// NOTE: WIDTH1(2) should be divisible by ZOOM1(2) for best precision. +// WIDTH1 should be odd so the cursor can be centered on a pixel. + +ColorGrabWidget::ColorGrabWidget(QPixmap* p, QWidget* parent) + : QWidget(parent) + , m_pixmap(p) + , m_mousePressReceived(false) + , m_extraZoomActive(false) + , m_magnifierActive(false) +{ + if (p == nullptr) { + throw std::logic_error("Pixmap must not be null"); + } + setAttribute(Qt::WA_DeleteOnClose); + // We don't need this widget to receive mouse events because we use + // eventFilter on other objects that do + setAttribute(Qt::WA_TransparentForMouseEvents); + setAttribute(Qt::WA_QuitOnClose, false); + // On Windows: don't activate the widget so CaptureWidget remains active + setAttribute(Qt::WA_ShowWithoutActivating); + setWindowFlags(Qt::BypassWindowManagerHint | Qt::WindowStaysOnTopHint | + Qt::FramelessWindowHint | Qt::WindowDoesNotAcceptFocus); + setMouseTracking(true); +} + +void ColorGrabWidget::startGrabbing() +{ + // NOTE: grabMouse() would prevent move events being received + // With this method we just need to make sure that mouse press and release + // events get consumed before they reach their target widget. + // This is undone in the destructor. + qApp->setOverrideCursor(Qt::CrossCursor); + qApp->installEventFilter(this); + OverlayMessage::pushKeyMap( + { { tr("Enter or Left Click"), tr("Accept color") }, + { tr("Hold Left Click"), tr("Precisely select color") }, + { tr("Space or Right Click"), tr("Toggle magnifier") }, + { tr("Esc"), tr("Cancel") } }); +} + +QColor ColorGrabWidget::color() +{ + return m_color; +} + +bool ColorGrabWidget::eventFilter(QObject*, QEvent* event) +{ + // Consume shortcut events and handle key presses from whole app + if (event->type() == QEvent::KeyPress || + event->type() == QEvent::Shortcut) { + QKeySequence key = event->type() == QEvent::KeyPress + ? static_cast(event)->key() + : static_cast(event)->key(); + if (key == Qt::Key_Escape) { + emit grabAborted(); + finalize(); + } else if (key == Qt::Key_Return || key == Qt::Key_Enter) { + emit colorGrabbed(m_color); + finalize(); + } else if (key == Qt::Key_Space && !m_extraZoomActive) { + setMagnifierActive(!m_magnifierActive); + } + return true; + } else if (event->type() == QEvent::MouseMove) { + // NOTE: This relies on the fact that CaptureWidget tracks mouse moves + + if (m_extraZoomActive && !geometry().contains(cursorPos())) { + setExtraZoomActive(false); + return true; + } + if (!m_extraZoomActive && !m_magnifierActive) { + // This fixes an issue when the mouse leaves the zoom area before + // the widget even appears. + hide(); + } + if (!m_extraZoomActive) { + // Update only before the user clicks the mouse, after the mouse + // press the widget remains static. + updateWidget(); + } + + // Hide overlay message when cursor is over it + OverlayMessage* overlayMsg = OverlayMessage::instance(); + overlayMsg->setVisibility( + !overlayMsg->geometry().contains(cursorPos())); + + m_color = getColorAtPoint(cursorPos()); + emit colorUpdated(m_color); + return true; + } else if (event->type() == QEvent::MouseButtonPress) { + m_mousePressReceived = true; + auto* e = static_cast(event); + if (e->buttons() == Qt::RightButton) { + setMagnifierActive(!m_magnifierActive); + } else if (e->buttons() == Qt::LeftButton) { + setExtraZoomActive(true); + } + return true; + } else if (event->type() == QEvent::MouseButtonRelease) { + if (!m_mousePressReceived) { + // Do not consume event if it corresponds to the mouse press that + // triggered the color grabbing in the first place. This prevents + // focus issues in the capture widget when the color grabber is + // closed. + return false; + } + auto* e = static_cast(event); + if (e->button() == Qt::LeftButton && m_extraZoomActive) { + emit colorGrabbed(getColorAtPoint(cursorPos())); + finalize(); + } + return true; + } else if (event->type() == QEvent::MouseButtonDblClick) { + return true; + } + return false; +} + +void ColorGrabWidget::paintEvent(QPaintEvent*) +{ + QPainter painter(this); + painter.drawImage(QRectF(0, 0, width(), height()), m_previewImage); +} + +void ColorGrabWidget::showEvent(QShowEvent*) +{ + updateWidget(); +} + +QPoint ColorGrabWidget::cursorPos() const +{ + return QCursor::pos(QGuiAppCurrentScreen().currentScreen()); +} + +/// @note The point is in screen coordinates. +QColor ColorGrabWidget::getColorAtPoint(const QPoint& p) const +{ + if (m_extraZoomActive && geometry().contains(p)) { + QPoint point = mapFromGlobal(p); + // we divide coordinate-wise to avoid rounding to nearest + return m_previewImage.pixel( + QPoint(point.x() / ZOOM2, point.y() / ZOOM2)); + } + QPoint point = p; +#if defined(Q_OS_MACOS) + QScreen* currentScreen = QGuiAppCurrentScreen().currentScreen(); + if (currentScreen) { + point = QPoint((p.x() - currentScreen->geometry().x()) * + currentScreen->devicePixelRatio(), + (p.y() - currentScreen->geometry().y()) * + currentScreen->devicePixelRatio()); + } +#endif + QPixmap pixel = m_pixmap->copy(QRect(point, point)); + return pixel.toImage().pixel(0, 0); +} + +void ColorGrabWidget::setExtraZoomActive(bool active) +{ + m_extraZoomActive = active; + if (!active && !m_magnifierActive) { + hide(); + } else { + if (!isVisible()) { + QTimer::singleShot(250, this, [this]() { show(); }); + } else { + QTimer::singleShot(250, this, [this]() { updateWidget(); }); + } + } +} + +void ColorGrabWidget::setMagnifierActive(bool active) +{ + m_magnifierActive = active; + setVisible(active); +} + +void ColorGrabWidget::updateWidget() +{ + int width = m_extraZoomActive ? WIDTH2 : WIDTH1; + float zoom = m_extraZoomActive ? ZOOM2 : ZOOM1; + // Set window size and move its center to the mouse cursor + QRect rect(0, 0, width, width); + + auto realCursorPos = cursorPos(); + auto adjustedCursorPos = realCursorPos; + +#if defined(Q_OS_MACOS) + QScreen* currentScreen = QGuiAppCurrentScreen().currentScreen(); + if (currentScreen) { + adjustedCursorPos = + QPoint((realCursorPos.x() - currentScreen->geometry().x()) * + currentScreen->devicePixelRatio(), + (realCursorPos.y() - currentScreen->geometry().y()) * + currentScreen->devicePixelRatio()); + } +#endif + + rect.moveCenter(cursorPos()); + setGeometry(rect); + // Store a pixmap containing the zoomed-in section around the cursor + QRect sourceRect(0, 0, width / zoom, width / zoom); + sourceRect.moveCenter(adjustedCursorPos); + m_previewImage = m_pixmap->copy(sourceRect).toImage(); + // Repaint + update(); +} + +void ColorGrabWidget::finalize() +{ + qApp->removeEventFilter(this); + qApp->restoreOverrideCursor(); + OverlayMessage::pop(); + close(); +} diff --git a/src/widgets/panel/colorgrabwidget.h b/src/widgets/panel/colorgrabwidget.h new file mode 100644 index 0000000..dd04e76 --- /dev/null +++ b/src/widgets/panel/colorgrabwidget.h @@ -0,0 +1,45 @@ +#ifndef COLORGRABWIDGET_H +#define COLORGRABWIDGET_H + +#include + +class SidePanelWidget; +class OverlayMessage; + +class ColorGrabWidget : public QWidget +{ + Q_OBJECT +public: + ColorGrabWidget(QPixmap* p, QWidget* parent = nullptr); + + void startGrabbing(); + + QColor color(); + +signals: + void colorUpdated(const QColor& color); + void colorGrabbed(const QColor& color); + void grabAborted(); + +private: + bool eventFilter(QObject* obj, QEvent* event) override; + void paintEvent(QPaintEvent* e) override; + void showEvent(QShowEvent* event) override; + + QPoint cursorPos() const; + QColor getColorAtPoint(const QPoint& point) const; + void setExtraZoomActive(bool active); + void setMagnifierActive(bool active); + void updateWidget(); + void finalize(); + + QPixmap* m_pixmap; + QImage m_previewImage; + QColor m_color; + + bool m_mousePressReceived; + bool m_extraZoomActive; + bool m_magnifierActive; +}; + +#endif // COLORGRABWIDGET_H diff --git a/src/widgets/panel/sidepanelwidget.cpp b/src/widgets/panel/sidepanelwidget.cpp new file mode 100644 index 0000000..227e583 --- /dev/null +++ b/src/widgets/panel/sidepanelwidget.cpp @@ -0,0 +1,230 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "sidepanelwidget.h" +#include "colorgrabwidget.h" +#include "src/core/qguiappcurrentscreen.h" +#include "src/utils/colorutils.h" +#include "src/utils/pathinfo.h" +#include "utilitypanel.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if defined(Q_OS_MACOS) +#include +#endif + +SidePanelWidget::SidePanelWidget(QPixmap* p, QWidget* parent) + : QWidget(parent) + , m_layout(new QVBoxLayout(this)) + , m_pixmap(p) +{ + + if (parent != nullptr) { + parent->installEventFilter(this); + } + + auto* colorLayout = new QGridLayout(); + + // Create Active Tool Size + auto* toolSizeHBox = new QHBoxLayout(); + auto* activeToolSizeText = new QLabel(tr("Active tool size: ")); + + m_toolSizeSpin = new QSpinBox(this); + m_toolSizeSpin->setRange(1, maxToolSize); + m_toolSizeSpin->setSingleStep(1); + m_toolSizeSpin->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + + toolSizeHBox->addWidget(activeToolSizeText); + toolSizeHBox->addWidget(m_toolSizeSpin); + + m_toolSizeSlider = new QSlider(Qt::Horizontal); + m_toolSizeSlider->setRange(1, maxToolSize); + m_toolSizeSlider->setValue(m_toolSize); + m_toolSizeSlider->setMinimumWidth(minSliderWidth); + + colorLayout->addLayout(toolSizeHBox, 0, 0); + colorLayout->addWidget(m_toolSizeSlider, 1, 0); + + // Create Active Color + auto* colorHBox = new QHBoxLayout(); + auto* colorText = new QLabel(tr("Active Color: ")); + + m_colorLabel = new QLabel(); + m_colorLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + + colorHBox->addWidget(colorText); + colorHBox->addWidget(m_colorLabel); + colorLayout->addLayout(colorHBox, 2, 0); + + m_layout->addLayout(colorLayout); + + m_colorWheel = new color_widgets::ColorWheel(this); + m_colorWheel->setColor(m_color); + m_colorHex = new QLineEdit(this); + m_colorHex->setAlignment(Qt::AlignCenter); + + QColor background = this->palette().window().color(); + bool isDark = ColorUtils::colorIsDark(background); + QString modifier = + isDark ? PathInfo::whiteIconPath() : PathInfo::blackIconPath(); + QIcon grabIcon(modifier + "colorize.svg"); + m_colorGrabButton = new QPushButton(grabIcon, tr("Grab Color")); + + m_layout->addWidget(m_colorGrabButton); + m_layout->addWidget(m_colorWheel); + m_layout->addWidget(m_colorHex); + + QHBoxLayout* gridHBoxLayout = new QHBoxLayout(this); + m_gridCheck = new QCheckBox(tr("Display grid"), this); + m_gridSizeSpin = new QSpinBox(this); + m_gridSizeSpin->setRange(5, 50); + m_gridSizeSpin->setSingleStep(5); + m_gridSizeSpin->setValue(10); + m_gridSizeSpin->setDisabled(true); + m_gridSizeSpin->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + gridHBoxLayout->addWidget(m_gridCheck); + gridHBoxLayout->addWidget(m_gridSizeSpin); + m_layout->addLayout(gridHBoxLayout); + + // tool size sigslots + connect(m_toolSizeSpin, + static_cast(&QSpinBox::valueChanged), + this, + &SidePanelWidget::toolSizeChanged); + connect(m_toolSizeSlider, + &QSlider::valueChanged, + this, + &SidePanelWidget::toolSizeChanged); + connect(this, + &SidePanelWidget::toolSizeChanged, + this, + &SidePanelWidget::onToolSizeChanged); + // color hex editor sigslots + connect(m_colorHex, &QLineEdit::editingFinished, this, [=, this]() { +#if QT_VERSION < QT_VERSION_CHECK(6, 4, 0) + if (!QColor::isValidColor(m_colorHex->text())) { +#else + if (!QColor::isValidColorName(m_colorHex->text())) { +#endif + m_colorHex->setText(m_color.name(QColor::HexRgb)); + } else { + emit colorChanged(m_colorHex->text()); + } + }); + // color grab button sigslots + connect(m_colorGrabButton, + &QPushButton::pressed, + this, + &SidePanelWidget::startColorGrab); + // color wheel sigslots + // re-emit ColorWheel::colorSelected as SidePanelWidget::colorChanged + connect(m_colorWheel, + &color_widgets::ColorWheel::colorSelected, + this, + &SidePanelWidget::colorChanged); + // Grid feature + connect(m_gridCheck, &QCheckBox::clicked, this, [=, this](bool b) { + this->m_gridSizeSpin->setEnabled(b); + emit this->displayGridChanged(b); + }); + connect(m_gridSizeSpin, + qOverload(&QSpinBox::valueChanged), + this, + &SidePanelWidget::gridSizeChanged); +} + +void SidePanelWidget::onColorChanged(const QColor& color) +{ + m_color = color; + updateColorNoWheel(color); + m_colorWheel->setColor(color); +} + +void SidePanelWidget::onToolSizeChanged(int t) +{ + m_toolSize = qBound(0, t, maxToolSize); + m_toolSizeSlider->setValue(m_toolSize); + m_toolSizeSpin->setValue(m_toolSize); +} + +void SidePanelWidget::startColorGrab() +{ + m_revertColor = m_color; + m_colorGrabber = new ColorGrabWidget(m_pixmap); + connect(m_colorGrabber, + &ColorGrabWidget::colorUpdated, + this, + &SidePanelWidget::onTemporaryColorUpdated); + connect(m_colorGrabber, + &ColorGrabWidget::colorGrabbed, + this, + &SidePanelWidget::onColorGrabFinished); + connect(m_colorGrabber, + &ColorGrabWidget::grabAborted, + this, + &SidePanelWidget::onColorGrabAborted); + + emit hidePanel(); + m_colorGrabber->startGrabbing(); +} + +void SidePanelWidget::onColorGrabFinished() +{ + finalizeGrab(); + m_color = m_colorGrabber->color(); + emit colorChanged(m_color); +} + +void SidePanelWidget::onColorGrabAborted() +{ + finalizeGrab(); + // Restore color that was selected before we started grabbing + onColorChanged(m_revertColor); +} + +void SidePanelWidget::onTemporaryColorUpdated(const QColor& color) +{ + updateColorNoWheel(color); +} + +void SidePanelWidget::finalizeGrab() +{ + emit showPanel(); +} + +void SidePanelWidget::updateColorNoWheel(const QColor& c) +{ + m_colorLabel->setStyleSheet( + QStringLiteral("QLabel { background-color : %1; }").arg(c.name())); + m_colorHex->setText(c.name(QColor::HexRgb)); +} + +bool SidePanelWidget::eventFilter(QObject* obj, QEvent* event) +{ + if (event->type() == QEvent::ShortcutOverride) { + // Override Escape shortcut from CaptureWidget + auto* e = static_cast(event); + if (e->key() == Qt::Key_Escape && m_colorHex->hasFocus()) { + m_colorHex->clearFocus(); + e->accept(); + return true; + } + } else if (event->type() == QEvent::MouseButtonPress) { + // Clicks outside of the Color Hex editor + m_colorHex->clearFocus(); + } + return QWidget::eventFilter(obj, event); +} + +void SidePanelWidget::hideEvent(QHideEvent* event) +{ + QWidget::hideEvent(event); + m_colorHex->clearFocus(); +} diff --git a/src/widgets/panel/sidepanelwidget.h b/src/widgets/panel/sidepanelwidget.h new file mode 100644 index 0000000..b1ca13c --- /dev/null +++ b/src/widgets/panel/sidepanelwidget.h @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "QtColorWidgets/color_wheel.hpp" +#include +#include + +class QVBoxLayout; +class QPushButton; +class QLabel; +class QLineEdit; +class ColorGrabWidget; +class QColorPickingEventFilter; +class QSlider; +class QCheckBox; + +constexpr int maxToolSize = 50; +constexpr int minSliderWidth = 100; + +class SidePanelWidget : public QWidget +{ + Q_OBJECT + + friend class QColorPickingEventFilter; + +public: + explicit SidePanelWidget(QPixmap* p, QWidget* parent = nullptr); + +signals: + void colorChanged(const QColor& color); + void toolSizeChanged(int size); + void togglePanel(); + void showPanel(); + void hidePanel(); + void displayGridChanged(bool display); + void gridSizeChanged(int size); + +public slots: + void onToolSizeChanged(int tool); + void onColorChanged(const QColor& color); + void startColorGrab(); + +private slots: + void onColorGrabFinished(); + void onColorGrabAborted(); + void onTemporaryColorUpdated(const QColor& color); + +private: + void finalizeGrab(); + void updateColorNoWheel(const QColor& color); + + bool eventFilter(QObject* obj, QEvent* event) override; + void hideEvent(QHideEvent* event) override; + + QVBoxLayout* m_layout; + QPushButton* m_colorGrabButton; + ColorGrabWidget* m_colorGrabber{}; + color_widgets::ColorWheel* m_colorWheel; + QLabel* m_colorLabel; + QLineEdit* m_colorHex; + QPixmap* m_pixmap; + QColor m_color; + QColor m_revertColor; + QSpinBox* m_toolSizeSpin; + QSlider* m_toolSizeSlider; + int m_toolSize{}; + QCheckBox* m_gridCheck{ nullptr }; + QSpinBox* m_gridSizeSpin{ nullptr }; +}; diff --git a/src/widgets/panel/utilitypanel.cpp b/src/widgets/panel/utilitypanel.cpp new file mode 100644 index 0000000..fe04605 --- /dev/null +++ b/src/widgets/panel/utilitypanel.cpp @@ -0,0 +1,276 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#include "utilitypanel.h" +#include "capturewidget.h" +#include +#include +#include +#include +#include +#include + +UtilityPanel::UtilityPanel(CaptureWidget* captureWidget) + : QWidget(captureWidget) + , m_captureWidget(captureWidget) + , m_internalPanel(nullptr) + , m_upLayout(nullptr) + , m_bottomLayout(nullptr) + , m_layout(nullptr) + , m_showAnimation(nullptr) + , m_hideAnimation(nullptr) + , m_layersLayout(nullptr) + , m_captureTools(nullptr) + , m_buttonDelete(nullptr) + , m_buttonMoveUp(nullptr) + , m_buttonMoveDown(nullptr) +{ + initInternalPanel(); + setAttribute(Qt::WA_TransparentForMouseEvents); + setCursor(Qt::ArrowCursor); + + m_showAnimation = new QPropertyAnimation(m_internalPanel, "geometry", this); + m_showAnimation->setEasingCurve(QEasingCurve::InOutQuad); + m_showAnimation->setDuration(300); + + m_hideAnimation = new QPropertyAnimation(m_internalPanel, "geometry", this); + m_hideAnimation->setEasingCurve(QEasingCurve::InOutQuad); + m_hideAnimation->setDuration(300); + + connect(m_hideAnimation, + &QPropertyAnimation::finished, + m_internalPanel, + &QWidget::hide); + +#if (defined(Q_OS_WIN) || defined(Q_OS_MACOS)) + move(0, 0); +#endif + hide(); +} + +QWidget* UtilityPanel::toolWidget() const +{ + return m_toolWidget; +} + +void UtilityPanel::setToolWidget(QWidget* widget) +{ + if (m_toolWidget != nullptr) { + m_toolWidget->hide(); + m_toolWidget->setParent(this); + m_toolWidget->deleteLater(); + } + if (widget != nullptr) { + m_toolWidget = widget; + m_toolWidget->setSizePolicy(QSizePolicy::Ignored, + QSizePolicy::Preferred); + m_upLayout->addWidget(widget); + } +} + +void UtilityPanel::clearToolWidget() +{ + if (m_toolWidget != nullptr) { + m_toolWidget->deleteLater(); + } +} + +void UtilityPanel::pushWidget(QWidget* widget) +{ + m_layout->insertWidget(m_layout->count() - 1, widget); +} + +void UtilityPanel::show() +{ + if (!m_internalPanel->isHidden()) { + return; + } + setAttribute(Qt::WA_TransparentForMouseEvents, false); + m_showAnimation->setStartValue(QRect(-width(), 0, 0, height())); + m_showAnimation->setEndValue(QRect(0, 0, width(), height())); + m_internalPanel->show(); + m_showAnimation->start(); +#if (defined(Q_OS_WIN) || defined(Q_OS_MACOS)) + move(0, 0); +#endif + QWidget::show(); +} + +void UtilityPanel::hide() +{ + if (m_internalPanel->isHidden()) { + return; + } + setAttribute(Qt::WA_TransparentForMouseEvents); + m_hideAnimation->setStartValue(QRect(0, 0, width(), height())); + m_hideAnimation->setEndValue(QRect(-width(), 0, 0, height())); + m_hideAnimation->start(); + m_internalPanel->hide(); + QWidget::hide(); +} + +void UtilityPanel::toggle() +{ + if (m_internalPanel->isHidden()) { + show(); + } else { + hide(); + } +} + +void UtilityPanel::initInternalPanel() +{ + m_internalPanel = new QScrollArea(this); + m_internalPanel->setAttribute(Qt::WA_NoMousePropagation); + auto* widget = new QWidget(); + m_internalPanel->setWidget(widget); + m_internalPanel->setWidgetResizable(true); + + m_layout = new QVBoxLayout(); + m_upLayout = new QVBoxLayout(); + m_bottomLayout = new QVBoxLayout(); + m_layersLayout = new QVBoxLayout(); + m_layout->addLayout(m_upLayout); + m_layout->addLayout(m_bottomLayout); + m_bottomLayout->addLayout(m_layersLayout); + widget->setLayout(m_layout); + + QColor bgColor = palette().window().color(); + bgColor.setAlphaF(0.0); + m_internalPanel->setStyleSheet( + QStringLiteral("QScrollArea {background-color: %1}").arg(bgColor.name())); + m_internalPanel->hide(); + + m_captureTools = new QListWidget(this); + connect(m_captureTools, + &QListWidget::currentRowChanged, + this, + &UtilityPanel::onCurrentRowChanged); + + auto* layersButtons = new QHBoxLayout(); + m_layersLayout->addLayout(layersButtons); + + m_layersLayout->addWidget(m_captureTools); + + bool isDark = ColorUtils::colorIsDark(bgColor); + QString coloredIconPath = + isDark ? PathInfo::whiteIconPath() : PathInfo::blackIconPath(); + + m_buttonDelete = new QPushButton(this); + m_buttonDelete->setIcon(QIcon(coloredIconPath + "delete.svg")); + m_buttonDelete->setMinimumWidth(m_buttonDelete->height()); + m_buttonDelete->setDisabled(true); + + m_buttonMoveUp = new QPushButton(this); + m_buttonMoveUp->setIcon(QIcon(coloredIconPath + "move_up.svg")); + m_buttonMoveUp->setMinimumWidth(m_buttonMoveUp->height()); + m_buttonMoveUp->setDisabled(true); + + m_buttonMoveDown = new QPushButton(this); + m_buttonMoveDown->setIcon(QIcon(coloredIconPath + "move_down.svg")); + m_buttonMoveDown->setMinimumWidth(m_buttonMoveDown->height()); + m_buttonMoveDown->setDisabled(true); + + layersButtons->addWidget(m_buttonDelete); + layersButtons->addWidget(m_buttonMoveUp); + layersButtons->addWidget(m_buttonMoveDown); + layersButtons->addStretch(); + + connect(m_buttonDelete, + &QPushButton::clicked, + this, + &UtilityPanel::slotButtonDelete); + + connect(m_buttonMoveUp, + &QPushButton::clicked, + this, + &UtilityPanel::slotUpClicked); + + connect(m_buttonMoveDown, + &QPushButton::clicked, + this, + &UtilityPanel::slotDownClicked); + + // Bottom + auto* closeButton = new QPushButton(this); + closeButton->setText(tr("Close")); + connect(closeButton, &QPushButton::clicked, this, &UtilityPanel::toggle); + m_bottomLayout->addWidget(closeButton); +} + +void UtilityPanel::fillCaptureTools( + const QList>& captureToolObjects) +{ + int currentSelection = m_captureTools->currentRow(); + m_captureTools->clear(); + m_captureTools->addItem(tr("")); + + for (auto toolItem : captureToolObjects) { + auto* item = new QListWidgetItem( + toolItem->icon(QColor(Qt::white), false), toolItem->info()); + m_captureTools->addItem(item); + } + if (currentSelection >= 0 && currentSelection < m_captureTools->count()) { + m_captureTools->setCurrentRow(currentSelection); + } +} + +void UtilityPanel::setActiveLayer(int index) +{ + Q_ASSERT(index >= -1); + m_captureTools->setCurrentRow(index + 1); +} + +int UtilityPanel::activeLayerIndex() +{ + return m_captureTools->currentRow() >= 0 ? m_captureTools->currentRow() - 1 + : -1; +} + +void UtilityPanel::onCurrentRowChanged(int currentRow) +{ + m_buttonDelete->setDisabled(currentRow <= 0); + m_buttonMoveDown->setDisabled(currentRow == 0 || + currentRow + 1 == m_captureTools->count()); + m_buttonMoveUp->setDisabled(currentRow <= 1); + + emit layerChanged(activeLayerIndex()); +} + +void UtilityPanel::slotUpClicked(bool clicked) +{ + Q_UNUSED(clicked); + // subtract 1 because there's in m_captureTools as [0] element + int toolRow = m_captureTools->currentRow() - 1; + m_captureTools->setCurrentRow(toolRow); + emit moveUpClicked(toolRow); +} + +void UtilityPanel::slotDownClicked(bool clicked) +{ + Q_UNUSED(clicked); + // subtract 1 because there's in m_captureTools as [0] element + int toolRow = m_captureTools->currentRow() - 1; + m_captureTools->setCurrentRow(toolRow + 2); + emit moveDownClicked(toolRow); +} + +void UtilityPanel::slotButtonDelete(bool clicked) +{ + Q_UNUSED(clicked) + int currentRow = m_captureTools->currentRow(); + if (currentRow > 0) { + m_captureWidget->removeToolObject(currentRow); + if (currentRow >= m_captureTools->count()) { + currentRow = m_captureTools->count() - 1; + } + } else { + currentRow = 0; + } + m_captureTools->setCurrentRow(currentRow); +} + +bool UtilityPanel::isVisible() const +{ + return !m_internalPanel->isHidden(); +} diff --git a/src/widgets/panel/utilitypanel.h b/src/widgets/panel/utilitypanel.h new file mode 100644 index 0000000..33c6a30 --- /dev/null +++ b/src/widgets/panel/utilitypanel.h @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors + +#pragma once + +#include "src/tools/capturetool.h" +#include +#include + +class QVBoxLayout; +class QPropertyAnimation; +class QScrollArea; +class QPushButton; +class QListWidget; +class QPushButton; +class CaptureWidget; + +class UtilityPanel : public QWidget +{ + Q_OBJECT +public: + explicit UtilityPanel(CaptureWidget* captureWidget); + + [[nodiscard]] QWidget* toolWidget() const; + void setToolWidget(QWidget* weight); + void clearToolWidget(); + void pushWidget(QWidget* widget); + void fillCaptureTools( + const QList>& captureToolObjectsHistory); + void setActiveLayer(int index); + int activeLayerIndex(); + bool isVisible() const; + +signals: + void layerChanged(int layer); + void moveUpClicked(int currentRow); + void moveDownClicked(int currentRow); + +public slots: + void toggle(); + void hide(); + void show(); + void slotButtonDelete(bool clicked); + void onCurrentRowChanged(int currentRow); + +private slots: + void slotUpClicked(bool clicked); + void slotDownClicked(bool clicked); + +private: + void initInternalPanel(); + + QPointer m_toolWidget; + QScrollArea* m_internalPanel; + QVBoxLayout* m_upLayout; + QVBoxLayout* m_bottomLayout; + QVBoxLayout* m_layout; + QPropertyAnimation* m_showAnimation; + QPropertyAnimation* m_hideAnimation; + QVBoxLayout* m_layersLayout; + QListWidget* m_captureTools; + QPushButton* m_buttonDelete; + QPushButton* m_buttonMoveUp; + QPushButton* m_buttonMoveDown; + CaptureWidget* m_captureWidget; +}; diff --git a/src/widgets/trayicon.cpp b/src/widgets/trayicon.cpp new file mode 100644 index 0000000..7d93348 --- /dev/null +++ b/src/widgets/trayicon.cpp @@ -0,0 +1,225 @@ +#include "trayicon.h" + +#include "src/core/flameshot.h" +#include "src/core/flameshotdaemon.h" +#include "src/utils/globalvalues.h" + +#include "src/utils/confighandler.h" +#include +#include +#include +#include +#include + +#if defined(Q_OS_MACOS) +#include +#endif + +TrayIcon::TrayIcon(QObject* parent) + : QSystemTrayIcon(parent) +{ + initMenu(); + + setToolTip(QStringLiteral("Flameshot")); +#if defined(Q_OS_MACOS) + // Because of the following issues on MacOS "Catalina": + // https://bugreports.qt.io/browse/QTBUG-86393 + // https://developer.apple.com/forums/thread/126072 + auto currentMacOsVersion = QOperatingSystemVersion::current(); + if (currentMacOsVersion >= QOperatingSystemVersion::MacOSBigSur) { + setContextMenu(m_menu); + } +#else + setContextMenu(m_menu); +#endif + QIcon icon = + QIcon::fromTheme("flameshot-tray", QIcon(GlobalValues::trayIconPath())); + +#if defined(Q_OS_MACOS) + if (currentMacOsVersion >= QOperatingSystemVersion::MacOSBigSur) { + icon.setIsMask(true); + } +#endif + + setIcon(icon); + +#if defined(Q_OS_MACOS) + if (currentMacOsVersion < QOperatingSystemVersion::MacOSBigSur) { + // Because of the following issues on MacOS "Catalina": + // https://bugreports.qt.io/browse/QTBUG-86393 + // https://developer.apple.com/forums/thread/126072 + auto trayIconActivated = [this](QSystemTrayIcon::ActivationReason r) { + if (m_menu->isVisible()) { + m_menu->hide(); + } else { + m_menu->popup(QCursor::pos()); + } + }; + connect(this, &QSystemTrayIcon::activated, this, trayIconActivated); + } +#else + connect(this, &TrayIcon::activated, this, [this](ActivationReason r) { + if (r == Trigger) { + startGuiCapture(); + } + }); +#endif + +#ifdef Q_OS_WIN + // Ensure proper removal of tray icon when program quits on Windows. + connect(qApp, &QCoreApplication::aboutToQuit, this, &TrayIcon::hide); +#endif + + show(); // TODO needed? + + if (ConfigHandler().showStartupLaunchMessage()) { + showMessage( + "Flameshot", + QObject::tr( + "Hello, I'm here! Click icon in the tray to take a screenshot or " + "click with a right button to see more options."), + icon, + 3000); + } + + connect(ConfigHandler::getInstance(), + &ConfigHandler::fileChanged, + this, + [this]() { updateCaptureActionShortcut(); }); +} + +TrayIcon::~TrayIcon() +{ + delete m_menu; +} + +#if !defined(DISABLE_UPDATE_CHECKER) +QAction* TrayIcon::appUpdates() +{ + return m_appUpdates; +} +#endif + +void TrayIcon::initMenu() +{ + m_menu = new QMenu(); + + m_captureAction = new QAction(tr("&Take Screenshot"), this); + + updateCaptureActionShortcut(); + + connect(m_captureAction, &QAction::triggered, this, [this]() { +#if defined(Q_OS_MACOS) + auto currentMacOsVersion = QOperatingSystemVersion::current(); + if (currentMacOsVersion >= QOperatingSystemVersion::MacOSBigSur) { + startGuiCapture(); + } else { + // It seems it is not relevant for MacOS BigSur (Wait 400 ms to hide + // the QMenu) + QTimer::singleShot(400, this, [this]() { startGuiCapture(); }); + } +#else + // Wait 400 ms to hide the QMenu + QTimer::singleShot(400, this, [this]() { + startGuiCapture(); + }); +#endif + }); + auto* launcherAction = new QAction(tr("&Open Launcher"), this); + connect(launcherAction, + &QAction::triggered, + Flameshot::instance(), + &Flameshot::launcher); + auto* configAction = new QAction(tr("&Configuration"), this); + connect(configAction, + &QAction::triggered, + Flameshot::instance(), + &Flameshot::config); + auto* infoAction = new QAction(tr("&About"), this); + connect( + infoAction, &QAction::triggered, Flameshot::instance(), &Flameshot::info); + +#if !defined(DISABLE_UPDATE_CHECKER) + m_appUpdates = new QAction(tr("Check for updates"), this); + connect(m_appUpdates, + &QAction::triggered, + FlameshotDaemon::instance(), + &FlameshotDaemon::checkForUpdates); + + connect(FlameshotDaemon::instance(), + &FlameshotDaemon::newVersionAvailable, + this, + [this](const QVersionNumber& version) { + QString newVersion = + tr("New version %1 is available").arg(version.toString()); + m_appUpdates->setText(newVersion); + }); +#endif + + QAction* quitAction = new QAction(tr("&Quit"), this); + connect(quitAction, &QAction::triggered, qApp, &QCoreApplication::quit); + +#ifdef ENABLE_IMGUR + // recent screenshots + QAction* recentAction = new QAction(tr("&Latest Uploads"), this); + connect(recentAction, + &QAction::triggered, + Flameshot::instance(), + &Flameshot::history); +#endif + auto* openSavePathAction = new QAction(tr("&Open Save Path"), this); + connect(openSavePathAction, + &QAction::triggered, + Flameshot::instance(), + &Flameshot::openSavePath); + + m_menu->addAction(m_captureAction); + m_menu->addAction(launcherAction); + m_menu->addSeparator(); +#ifdef ENABLE_IMGUR + m_menu->addAction(recentAction); +#endif + m_menu->addAction(openSavePathAction); + m_menu->addSeparator(); + m_menu->addAction(configAction); + m_menu->addSeparator(); +#if !defined(DISABLE_UPDATE_CHECKER) + m_menu->addAction(m_appUpdates); +#endif + m_menu->addAction(infoAction); + m_menu->addSeparator(); + m_menu->addAction(quitAction); +} + +void TrayIcon::updateCaptureActionShortcut() +{ +#if defined(Q_OS_MACOS) + if (!m_captureAction) { + return; + } + + QString shortcut = ConfigHandler().shortcut("TAKE_SCREENSHOT"); + m_captureAction->setShortcut(QKeySequence(shortcut)); +#endif +} + +#if !defined(DISABLE_UPDATE_CHECKER) +void TrayIcon::enableCheckUpdatesAction(bool enable) +{ + if (m_appUpdates != nullptr) { + m_appUpdates->setVisible(enable); + m_appUpdates->setEnabled(enable); + } + if (enable) { + FlameshotDaemon::instance()->getLatestAvailableVersion(); + } +} +#endif + +void TrayIcon::startGuiCapture() +{ + auto* widget = Flameshot::instance()->gui(); +#if !defined(DISABLE_UPDATE_CHECKER) + FlameshotDaemon::instance()->showUpdateNotificationIfAvailable(widget); +#endif +} diff --git a/src/widgets/trayicon.h b/src/widgets/trayicon.h new file mode 100644 index 0000000..1fbc6e0 --- /dev/null +++ b/src/widgets/trayicon.h @@ -0,0 +1,33 @@ +#include + +#pragma once + +class QAction; + +class TrayIcon : public QSystemTrayIcon +{ + Q_OBJECT +public: + TrayIcon(QObject* parent = nullptr); + virtual ~TrayIcon(); + +#if !defined(DISABLE_UPDATE_CHECKER) + QAction* appUpdates(); +#endif + +private: + void initTrayIcon(); + void initMenu(); + void updateCaptureActionShortcut(); +#if !defined(DISABLE_UPDATE_CHECKER) + void enableCheckUpdatesAction(bool enable); +#endif + + void startGuiCapture(); + + QMenu* m_menu; + QAction* m_captureAction; +#if !defined(DISABLE_UPDATE_CHECKER) + QAction* m_appUpdates; +#endif +}; diff --git a/src/widgets/updatenotificationwidget.cpp b/src/widgets/updatenotificationwidget.cpp new file mode 100644 index 0000000..e24e0e9 --- /dev/null +++ b/src/widgets/updatenotificationwidget.cpp @@ -0,0 +1,145 @@ +// +// Created by yuriypuchkov on 09.12.2020. +// + +#include "updatenotificationwidget.h" +#include "src/utils/confighandler.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +UpdateNotificationWidget::UpdateNotificationWidget( + QWidget* parent, + const QString& appLatestVersion, + QString appLatestUrl) + : QWidget(parent) + , m_appLatestVersion(appLatestVersion) + , m_appLatestUrl(std::move(appLatestUrl)) + , m_layout(nullptr) +{ + setMinimumSize(400, 100); + initInternalPanel(); + setAttribute(Qt::WA_TransparentForMouseEvents); + setCursor(Qt::ArrowCursor); + + m_showAnimation = new QPropertyAnimation(m_internalPanel, "geometry", this); + m_showAnimation->setEasingCurve(QEasingCurve::InOutQuad); + m_showAnimation->setDuration(300); + + m_hideAnimation = new QPropertyAnimation(m_internalPanel, "geometry", this); + m_hideAnimation->setEasingCurve(QEasingCurve::InOutQuad); + m_hideAnimation->setDuration(300); + + connect(m_hideAnimation, + &QPropertyAnimation::finished, + m_internalPanel, + &QWidget::hide); + setAppLatestVersion(appLatestVersion); +} + +void UpdateNotificationWidget::show() +{ + setAttribute(Qt::WA_TransparentForMouseEvents, false); + m_showAnimation->setStartValue(QRect(0, -height(), width(), height())); + m_showAnimation->setEndValue(QRect(0, 0, width(), height())); + m_internalPanel->show(); + m_showAnimation->start(); + QWidget::show(); +} + +void UpdateNotificationWidget::hide() +{ + setAttribute(Qt::WA_TransparentForMouseEvents); + m_hideAnimation->setStartValue(QRect(0, 0, width(), height())); + m_hideAnimation->setEndValue(QRect(0, -height(), 0, height())); + m_hideAnimation->start(); + m_internalPanel->hide(); + QWidget::hide(); +} + +void UpdateNotificationWidget::setAppLatestVersion(const QString& latestVersion) +{ + m_appLatestVersion = latestVersion; + QString newVersion = + tr("New Flameshot version %1 is available").arg(latestVersion); + m_notification->setText(newVersion); +} + +void UpdateNotificationWidget::laterButton() +{ + hide(); +} + +void UpdateNotificationWidget::ignoreButton() +{ + ConfigHandler().setIgnoreUpdateToVersion(m_appLatestVersion); + hide(); +} + +void UpdateNotificationWidget::updateButton() +{ + QDesktopServices::openUrl(m_appLatestUrl); + hide(); + if (parentWidget()) { + parentWidget()->close(); + } +} + +void UpdateNotificationWidget::initInternalPanel() +{ + m_internalPanel = new QScrollArea(this); + m_internalPanel->setAttribute(Qt::WA_NoMousePropagation); + auto* widget = new QWidget(); + m_internalPanel->setWidget(widget); + m_internalPanel->setWidgetResizable(true); + + QColor bgColor = palette().window().color(); + bgColor.setAlphaF(0.0); + m_internalPanel->setStyleSheet( + QStringLiteral("QScrollArea {background-color: %1}").arg(bgColor.name())); + m_internalPanel->hide(); + + // + m_layout = new QVBoxLayout(); + widget->setLayout(m_layout); + + // caption + m_notification = new QLabel(m_appLatestVersion, this); + m_layout->addWidget(m_notification); + + // buttons layout + auto* buttonsLayout = new QHBoxLayout(); + auto* bottonsSpacer = new QSpacerItem(1, 1, QSizePolicy::Expanding); + buttonsLayout->addSpacerItem(bottonsSpacer); + m_layout->addLayout(buttonsLayout); + + // ignore + auto* ignoreBtn = new QPushButton(tr("Ignore"), this); + buttonsLayout->addWidget(ignoreBtn); + connect(ignoreBtn, + &QPushButton::clicked, + this, + &UpdateNotificationWidget::ignoreButton); + + // later + auto* laterBtn = new QPushButton(tr("Later"), this); + buttonsLayout->addWidget(laterBtn); + connect(laterBtn, + &QPushButton::clicked, + this, + &UpdateNotificationWidget::laterButton); + + // update + auto* updateBtn = new QPushButton(tr("Update"), this); + buttonsLayout->addWidget(updateBtn); + connect(updateBtn, + &QPushButton::clicked, + this, + &UpdateNotificationWidget::updateButton); +} diff --git a/src/widgets/updatenotificationwidget.h b/src/widgets/updatenotificationwidget.h new file mode 100644 index 0000000..b19ae26 --- /dev/null +++ b/src/widgets/updatenotificationwidget.h @@ -0,0 +1,47 @@ +// +// Created by yuriypuchkov on 09.12.2020. +// + +#ifndef FLAMESHOT_UPDATENOTIFICATIONWIDGET_H +#define FLAMESHOT_UPDATENOTIFICATIONWIDGET_H + +#include +#include + +class QVBoxLayout; +class QPropertyAnimation; +class QScrollArea; +class QPushButton; +class QLabel; + +class UpdateNotificationWidget : public QWidget +{ + Q_OBJECT +public: + explicit UpdateNotificationWidget(QWidget* parent, + const QString& appLatestVersion, + QString appLatestUrl); + void setAppLatestVersion(const QString& latestVersion); + + void hide(); + void show(); + +public slots: + void ignoreButton(); + void laterButton(); + void updateButton(); + +private: + void initInternalPanel(); + + // class members + QString m_appLatestVersion; + QString m_appLatestUrl; + QVBoxLayout* m_layout; + QLabel* m_notification; + QScrollArea* m_internalPanel; + QPropertyAnimation* m_showAnimation; + QPropertyAnimation* m_hideAnimation; +}; + +#endif // FLAMESHOT_UPDATENOTIFICATIONWIDGET_H diff --git a/src/widgets/uploadhistory.cpp b/src/widgets/uploadhistory.cpp new file mode 100644 index 0000000..f1a9d9c --- /dev/null +++ b/src/widgets/uploadhistory.cpp @@ -0,0 +1,102 @@ +#include "uploadhistory.h" +#include "./ui_uploadhistory.h" +#include "src/tools/imgupload/imguploadermanager.h" +#include "src/utils/confighandler.h" +#include "src/utils/history.h" +#include "uploadlineitem.h" + +#include +#include +#include + +void scaleThumbnail(QPixmap& pixmap) +{ + if (pixmap.height() / HISTORYPIXMAP_MAX_PREVIEW_HEIGHT >= + pixmap.width() / HISTORYPIXMAP_MAX_PREVIEW_WIDTH) { + pixmap = pixmap.scaledToHeight(HISTORYPIXMAP_MAX_PREVIEW_HEIGHT, + Qt::SmoothTransformation); + } else { + pixmap = pixmap.scaledToWidth(HISTORYPIXMAP_MAX_PREVIEW_WIDTH, + Qt::SmoothTransformation); + } +} + +void clearHistoryLayout(QLayout* layout) +{ + while (layout->count() != 0) { + delete layout->takeAt(0); + } +} + +UploadHistory::UploadHistory(QWidget* parent) + : QWidget(parent) + , ui(new Ui::UploadHistory) +{ + ui->setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); +} + +void UploadHistory::loadHistory() +{ + clearHistoryLayout(ui->historyContainer); + + History history = History(); + QList historyFiles = history.history(); + + if (historyFiles.isEmpty()) { + setEmptyMessage(); + } else { + for (const auto& fileName : historyFiles) { + addLine(history.path(), fileName); + } + } +} + +void UploadHistory::setEmptyMessage() +{ + auto* buttonEmpty = new QPushButton; + buttonEmpty->setText(tr("Screenshots history is empty")); + buttonEmpty->setMinimumSize(1, HISTORYPIXMAP_MAX_PREVIEW_HEIGHT); + connect( + buttonEmpty, &QPushButton::clicked, this, [=, this]() { this->close(); }); + ui->historyContainer->addWidget(buttonEmpty); +} + +void UploadHistory::addLine(const QString& path, const QString& fileName) +{ + QString fullFileName = path + fileName; + + History history; + HistoryFileName unpackFileName = history.unpackFileName(fileName); + + QString url = ImgUploaderManager(this).url() + unpackFileName.file; + + // load pixmap + QPixmap pixmap; + pixmap.load(fullFileName, "png"); + scaleThumbnail(pixmap); + + // get file info + auto fileInfo = QFileInfo(fullFileName); + QString lastModified = + fileInfo.lastModified().toString("yyyy-MM-dd\nhh:mm:ss"); + + auto* line = new UploadLineItem( + this, pixmap, lastModified, url, fullFileName, unpackFileName); + + connect(line, &UploadLineItem::requestedDeletion, this, [=, this]() { + if (ui->historyContainer->count() <= 1) { + setEmptyMessage(); + } + delete line; + }); + + ui->historyContainer->addWidget(line); +} + +UploadHistory::~UploadHistory() +{ + delete ui; +} diff --git a/src/widgets/uploadhistory.h b/src/widgets/uploadhistory.h new file mode 100644 index 0000000..62fa84f --- /dev/null +++ b/src/widgets/uploadhistory.h @@ -0,0 +1,32 @@ +#ifndef UPLOADHISTORY_H +#define UPLOADHISTORY_H + +#include + +QT_BEGIN_NAMESPACE +namespace Ui { +class UploadHistory; +} +QT_END_NAMESPACE + +void clearHistoryLayout(QLayout* layout); +void scaleThumbnail(QPixmap& input); + +class UploadHistory : public QWidget +{ + Q_OBJECT +public: + explicit UploadHistory(QWidget* parent = nullptr); + ~UploadHistory(); + + void loadHistory(); + +public slots: + +private: + void setEmptyMessage(); + void addLine(QString const&, QString const&); + + Ui::UploadHistory* ui; +}; +#endif // UPLOADHISTORY_H \ No newline at end of file diff --git a/src/widgets/uploadhistory.ui b/src/widgets/uploadhistory.ui new file mode 100644 index 0000000..e74b227 --- /dev/null +++ b/src/widgets/uploadhistory.ui @@ -0,0 +1,52 @@ + + + UploadHistory + + + + 0 + 0 + 823 + 479 + + + + Upload History + + + + :/img/app/flameshot.png:/img/app/flameshot.png + + + + + + Qt::ScrollBarAlwaysOn + + + true + + + + + 0 + 0 + 781 + 453 + + + + + + + + + + + + + + + + + diff --git a/src/widgets/uploadlineitem.cpp b/src/widgets/uploadlineitem.cpp new file mode 100644 index 0000000..5e24257 --- /dev/null +++ b/src/widgets/uploadlineitem.cpp @@ -0,0 +1,69 @@ +#include "uploadlineitem.h" +#include "./ui_uploadlineitem.h" +#include "src/core/flameshotdaemon.h" +#include "src/tools/imgupload/imguploadermanager.h" +#include "src/utils/confighandler.h" +#include "src/utils/history.h" +#include "src/widgets/notificationwidget.h" + +#include +#include +#include +#include +#include + +void removeCacheFile(QString const& fullFileName) +{ + QFile file(fullFileName); + if (file.exists()) { + file.remove(); + } +} + +UploadLineItem::UploadLineItem(QWidget* parent, + QPixmap const& preview, + QString const& timestamp, + QString const& url, + QString const& fullFileName, + HistoryFileName const& unpackFileName) + : QWidget(parent) + , ui(new Ui::UploadLineItem) +{ + ui->setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + ui->imagePreview->setPixmap(preview); + ui->uploadTimestamp->setText(timestamp); + + connect(ui->copyUrl, &QPushButton::clicked, this, [=, this]() { + FlameshotDaemon::copyToClipboard(url); + }); + + connect(ui->openBrowser, &QPushButton::clicked, this, [=, this]() { + QDesktopServices::openUrl(QUrl(url)); + }); + + connect(ui->deleteImage, &QPushButton::clicked, this, [=, this]() { + if (ConfigHandler().historyConfirmationToDelete() && + QMessageBox::No == + QMessageBox::question( + this, + tr("Confirm to delete"), + tr("Are you sure you want to delete a screenshot from the " + "latest uploads and server?"), + QMessageBox::Yes | QMessageBox::No)) { + return; + } + + ImgUploaderBase* imgUploaderBase = + ImgUploaderManager(this).uploader(unpackFileName.type); + imgUploaderBase->deleteImage(unpackFileName.file, unpackFileName.token); + + removeCacheFile(fullFileName); + emit requestedDeletion(); + }); +} + +UploadLineItem::~UploadLineItem() +{ + delete ui; +} \ No newline at end of file diff --git a/src/widgets/uploadlineitem.h b/src/widgets/uploadlineitem.h new file mode 100644 index 0000000..ef8a66a --- /dev/null +++ b/src/widgets/uploadlineitem.h @@ -0,0 +1,34 @@ +#ifndef UPLOADLINEITEM_H +#define UPLOADLINEITEM_H + +#include + +struct HistoryFileName; + +QT_BEGIN_NAMESPACE +namespace Ui { +class UploadLineItem; +} +QT_END_NAMESPACE + +void removeCacheFile(QString const& fullFileName); + +class UploadLineItem : public QWidget +{ + Q_OBJECT +public: + UploadLineItem(QWidget* parent, + QPixmap const& preview, + QString const& timestamp, + QString const& url, + QString const& fullFileName, + HistoryFileName const& unpackFileName); + ~UploadLineItem(); + +signals: + void requestedDeletion(); + +private: + Ui::UploadLineItem* ui; +}; +#endif // UPLOADLINEITEM_H \ No newline at end of file diff --git a/src/widgets/uploadlineitem.ui b/src/widgets/uploadlineitem.ui new file mode 100644 index 0000000..d43a506 --- /dev/null +++ b/src/widgets/uploadlineitem.ui @@ -0,0 +1,137 @@ + + + UploadLineItem + + + + 0 + 0 + 665 + 168 + + + + + 665 + 300 + + + + Form + + + + QLayout::SetMaximumSize + + + + + + + + 0 + 0 + + + + + 250 + 0 + + + + + 250 + 16777215 + + + + TextLabel + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + timestamp + + + + + + + + 0 + 0 + + + + Copy URL + + + + + + + + 0 + 0 + + + + Open In Browser + + + + + + + + 0 + 0 + + + + + + + + :/img/material/black/delete.svg:/img/material/black/delete.svg + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + diff --git a/src/windows-cli.cpp b/src/windows-cli.cpp new file mode 100644 index 0000000..60773b6 --- /dev/null +++ b/src/windows-cli.cpp @@ -0,0 +1,69 @@ +#include +#include + +std::wstring joinArgs(int argc, wchar_t* argv[]) +{ + std::wstring result; + for (int i = 1; i < argc; ++i) { + if (i > 1) { + result += L" "; + } + result += argv[i]; + } + return result; +} + +void CallFlameshot(const std::wstring args, bool wait) +{ + // generate full path for flameshot executable + wchar_t path[MAX_PATH]; + int pathLength = GetModuleFileNameW(NULL, path, MAX_PATH); + std::wstring pathstring(path); + + // Find the last backslash to isolate the filename + size_t lastBackslash = pathstring.find_last_of(L'\\'); + std::wstring directory = (lastBackslash != std::wstring::npos) + ? pathstring.substr(0, lastBackslash + 1) + : L""; + + // generate command string + // note: binary path placed within quotes in case of spaces in path + int cmdSize = 32 + sizeof(directory) + sizeof(args); + wchar_t* cmd = (wchar_t*)malloc(sizeof(wchar_t) * cmdSize); + swprintf(cmd, + cmdSize, + L"\"%s\\flameshot.exe\" %s", + directory.c_str(), + args.c_str()); + // call subprocess + FILE* stream = _wpopen(cmd, L"r"); + free(cmd); + if (wait) { + if (stream) { + const int MAX_BUFFER = 2048; + char buffer[MAX_BUFFER]; + while (!feof(stream)) { + if (fgets(buffer, MAX_BUFFER, stream) != NULL) { + std::cout << buffer; + } + } + } + _pclose(stream); + } + return; +} + +// Console 'wrapper' for flameshot on windows +int wmain(int argc, wchar_t* argv[]) +{ + // if no args, do not wait for stdout + if (argc == 1) { + std::cout << "Starting flameshot in daemon mode" << std::endl; + CallFlameshot(L"", false); + } else { + std::wstring argString = joinArgs(argc, argv); + CallFlameshot(argString, true); + } + std::cout.flush(); + return 0; +} diff --git a/tests/action_options.sh b/tests/action_options.sh new file mode 100644 index 0000000..93663fb --- /dev/null +++ b/tests/action_options.sh @@ -0,0 +1,125 @@ +#!/usr/bin/env sh + +# Tests for final action options with various flameshot commands +# Arguments: +# 1. path to tested flameshot executable + +# Dependencies: +# - display command (imagemagick) + +# HOW TO USE: +# - Start the script with path to tested flameshot executable as the first +# argument +# +# - Read messages from stdout and see if flameshot sends the right notifications +# +# Some commands will pin screenshots to the screen. Check if that is happening +# correctly. NOTE: the screen command will pin one screenshot over your entire +# screen, so don't be confused by that. +# +# - When the flameshot gui is tested, follow the instructions from the system +# notifications +# +# - Some tests may ask you for confirmation in the CLI before continuing. +# - Whenever the --raw option is tested, the `display` command is used to open +# the image from stdout in a window. Just close that window. +# + +FLAMESHOT="$1" +[ -z "$FLAMESHOT" ] && FLAMESHOT="flameshot" + +# --raw >/dev/null is a hack that makes the subcommand wait for the daemon to +# finish the pending action +flameshot() { + command "$FLAMESHOT" "$@" --raw >/tmp/img.png +} + +# Print the given command and run it +cmd() { + echo "$*" >&2 + "$@" + sleep 1 +} + +notify() { + if [ "$FLAMESHOT_PLATFORM" = "MAC" ] + then +osascript - "$1" <&2 && read ____ +} + +# NOTE: Upload option is intentionally not tested + +# flameshot full & screen +# ┗━━━━━━━━━━━━━━━━━━━━━━━━┛ + +for subcommand in full screen +do + cmd flameshot "$subcommand" --path /tmp/ + cmd flameshot "$subcommand" --clipboard + cmd command "$FLAMESHOT" "$subcommand" --raw | display_img + [ "$subcommand" = "full" ] && sleep 1 + echo +done + +echo "The next command will pin a screenshot over your entire screen." +echo "Make sure to close it afterwards" +echo "Press Enter to continue..." +read ____ +flameshot screen --pin +sleep 1 + +# flameshot gui +# ┗━━━━━━━━━━━━━━━┛ + +wait_for_key +notify "GUI Test 1: --path" #"Make a selection, then accept" +cmd flameshot gui --path /tmp/ +wait_for_key +notify "GUI Test 2: Clipboard" "Make a selection, then accept" +cmd flameshot gui --clipboard +wait_for_key +notify "GUI Test 3: Print geometry" "Make a selection, then accept" +cmd command "$FLAMESHOT" gui --print-geometry +wait_for_key +notify "GUI Test 4: Pin" "Make a selection, then accept" +cmd flameshot gui --pin +wait_for_key +notify "GUI Test 5: Print raw" "Make a selection, then accept" +cmd command "$FLAMESHOT" gui --raw | display_img +wait_for_key +notify "GUI Test 6: Copy on select" "Make a selection, flameshot will close automatically" +cmd flameshot gui --clipboard --accept-on-select +wait_for_key +notify "GUI Test 7: File dialog on select" "After selecting, a file dialog will open" +cmd flameshot gui --accept-on-select + +# All options except for --print-geometry (incompatible with --raw) +wait_for_key +notify "GUI Test 8: All actions except print-geometry" "Just make a selection" +cmd command "$FLAMESHOT" gui -p /tmp/ -c -r --pin | display_img + +echo '>> All tests done.' diff --git a/tests/path_option.sh b/tests/path_option.sh new file mode 100644 index 0000000..214683d --- /dev/null +++ b/tests/path_option.sh @@ -0,0 +1,52 @@ +#!/usr/bin/env sh + +# Before running the script make sure a flameshot daemon with a matching version +# is running + +# The first argument to this script is a path to the flameshot executable +[ -n "$1" ] && flameshot="$1" || flameshot='flameshot' + +# TODO Before proper stderr logging is implemented, you will have to look at the +# system notifications + +rm -rf /tmp/flameshot_path_test 2>/dev/null +mkdir -p /tmp/flameshot_path_test +cd /tmp/flameshot_path_test + +echo ">> Nonexistent directory. This command should give an invalid path error." +"$flameshot" screen -p blah/blah + +sleep 2 +echo ">> The output file is specified relative to PWD" +"$flameshot" screen -p relative.png + +sleep 2 +echo ">> Absolute paths work too" +"$flameshot" screen -p /tmp/flameshot_path_test/absolute.png + +sleep 2 +mkdir subdir +echo ">> Redundancy in the path will be removed" +"$flameshot" screen -p /tmp/flameshot_path_test/subdir/..///redundancy_removed.png + +sleep 2 +echo ">> If the destination is a directory, the file name is generated from strf from the config" +"$flameshot" screen -p ./ + +sleep 2 +echo ">> If the output file has no suffix, it will be added (png)" +"$flameshot" screen -p /tmp/flameshot_path_test/without_suffix + +sleep 2 +echo ">> Other suffixes are supported, and the image format will match it" +"$flameshot" screen -p /tmp/flameshot_path_test/jpg_suffix.jpg + +sleep 2 +echo ">> If the destination path exists, it will have _NUM appended to the base name" +"$flameshot" screen -p /tmp/flameshot_path_test/absolute.png + +sleep 2 +echo ">> Same thing again but without specifying a suffix" +"$flameshot" screen -p /tmp/flameshot_path_test/absolute + +sleep 2