Compare commits

..

No commits in common. 'master' and '4.1.0' have entirely different histories.

@ -1,40 +0,0 @@
---
name: Bug report
about: Create a report to help us improve app
title: ''
labels: bug
assignees: ''
---
**Bug Description**
**Steps to reproduce:**
<!-- Please describe what you expected to see and what you saw instead. Also include screenshots or screencasts if needed. -->
**Terminal output** (optional):
```
<!--
Add terminal output only if needed - if there are some errors or warnings or you have performance/freeze issues.
Very helpful in this situation will be logs from czkawka run with RUST_LOG environment variable set e.g.
`RUST_LOG=debug ./czkawka` or `flatpak run --env=RUST_LOG=debug com.github.qarmin.czkawka` if you use flatpak, which will print more detailed info about executed function.
-->
<details>
<summary>Debug log</summary>
# UNCOMMENT DETAILS AND PUT LOGS HERE
</details>
```
**System**
- Czkawka/Krokiet version: <!-- e.g. 7.0.0 cli/gui -->
- OS version: <!-- e.g Ubuntu 22.04, Windows 11, Mac 15.1 ARM -->
- Installation method: <!-- e.g. github binaries, snap, flatpak, msys2 -->
<!-- If you use flatpak, please include the result of `flatpak info com.github.qarmin.czkawka`. -->

@ -1,11 +0,0 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: enhancement
assignees: ''
---
**Feature Description**
...

@ -0,0 +1,239 @@
name: 🐧 Linux
on:
push:
pull_request:
schedule:
- cron: '0 0 * * 2'
env:
CARGO_TERM_COLOR: always
jobs:
linux-cli:
strategy:
matrix:
toolchain: [ stable ]
type: [ release ]
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- uses: actions-rs/toolchain@v1
with:
toolchain: ${{ matrix.toolchain }}
override: true
- uses: actions/cache@v2
with:
path: |
target
key: linux-cli-${{github.ref}}-${{github.sha}}
restore-keys: |
linux-cli-${{github.ref}}-${{github.sha}}
- name: Install basic libraries
run: sudo apt-get update; sudo apt install libgtk-3-dev libasound2-dev -y
- name: Build CLI Debug
run: cargo build --bin czkawka_cli
env:
CARGO_INCREMENTAL: 0
RUSTFLAGS: "-C debuginfo=0 -D warnings"
if: ${{ matrix.type == 'debug'}}
- name: Build CLI Release
run: cargo build --release --bin czkawka_cli
env:
CARGO_INCREMENTAL: 0
RUSTFLAGS: "-C debuginfo=0 -D warnings"
if: ${{ matrix.type == 'release'}}
- name: Store Linux CLI
uses: actions/upload-artifact@v2
with:
name: czkawka_cli-${{ runner.os }}-${{ matrix.toolchain }}
path: target/release/czkawka_cli
if: ${{ matrix.type == 'release' }}
# Duplicate finder checks included and excluded directories
# Others are just check delete files number
- name: Linux Regression Test
run: |
wget https://github.com/qarmin/czkawka/releases/download/1.1.0/TestSuite.zip
unzip TestSuite.zip -d TestSuite
python3 misc/check_results.py TestSuite 15 8
target/release/czkawka_cli dup -d "$(pwd)/TestSuite" -D aen -m 1024
python3 misc/check_results.py TestSuite 7 8
rm -rf TestSuite
unzip TestSuite.zip -d TestSuite
target/release/czkawka_cli dup -d "$(pwd)/TestSuite" -D aen -m 1024
python3 misc/check_results.py TestSuite 7 8
rm -rf TestSuite
unzip TestSuite.zip -d TestSuite
target/release/czkawka_cli dup -d "$(pwd)/TestSuite" -x TEXT -D aeo -m 1024
python3 misc/check_results.py TestSuite 14 8
rm -rf TestSuite
unzip TestSuite.zip -d TestSuite
target/release/czkawka_cli dup -d "$(pwd)/TestSuite" -e "$(pwd)/TestSuite/SubFolder" -D aeo -m 1024
python3 misc/check_results.py TestSuite 13 8
rm -rf TestSuite
unzip TestSuite.zip -d TestSuite
target/release/czkawka_cli dup -d "$(pwd)/TestSuite" -m 1500 -D aeo
python3 misc/check_results.py TestSuite 8 8
rm -rf TestSuite
unzip TestSuite.zip -d TestSuite
target/release/czkawka_cli dup -d "$(pwd)/TestSuite" -R -m 1024
python3 misc/check_results.py TestSuite 15 8
target/release/czkawka_cli dup -d "$(pwd)/TestSuite" -R -D aeo -m 1024
python3 misc/check_results.py TestSuite 13 8
target/release/czkawka_cli big -d "$(pwd)/TestSuite"
rm -rf TestSuite
unzip TestSuite.zip -d TestSuite
target/release/czkawka_cli empty-files -d "$(pwd)/TestSuite"
python3 misc/check_results.py TestSuite 15 8
target/release/czkawka_cli empty-files -d "$(pwd)/TestSuite" -D
python3 misc/check_results.py TestSuite 13 8
rm -rf TestSuite
unzip TestSuite.zip -d TestSuite
target/release/czkawka_cli empty-folders -d "$(pwd)/TestSuite"
python3 misc/check_results.py TestSuite 15 8
target/release/czkawka_cli empty-folders -d "$(pwd)/TestSuite" -D
python3 misc/check_results.py TestSuite 15 2
rm -rf TestSuite
unzip TestSuite.zip -d TestSuite
target/release/czkawka_cli temp -d "$(pwd)/TestSuite"
python3 misc/check_results.py TestSuite 15 8
target/release/czkawka_cli temp -d "$(pwd)/TestSuite" -D
python3 misc/check_results.py TestSuite 14 8
if: ${{ matrix.type == 'release' }}
linux-gui:
strategy:
matrix:
toolchain: [ stable, 1.57.0 ]
type: [ release ]
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- uses: actions-rs/toolchain@v1
with:
toolchain: ${{ matrix.toolchain }}
override: true
- uses: actions/cache@v2
with:
path: |
target
key: linux-gui-${{github.ref}}-${{github.sha}}
restore-keys: |
linux-gui-${{github.ref}}-${{github.sha}}
- name: Install Gtk, Mingw, unzip, zip and wget
run: sudo apt-get update; sudo apt install libgtk-3-dev libasound2-dev -y
- name: Build GUI Debug
run: cargo build --bin czkawka_gui
env:
CARGO_INCREMENTAL: 0
RUSTFLAGS: "-C debuginfo=0 -D warnings"
if: ${{ matrix.type == 'debug'}}
- name: Build GUI Release
run: cargo build --release --bin czkawka_gui
env:
CARGO_INCREMENTAL: 0
RUSTFLAGS: "-C debuginfo=0 -D warnings"
if: ${{ matrix.type == 'release'}}
- name: Store Linux GUI
uses: actions/upload-artifact@v2
with:
name: czkawka_gui-${{ runner.os }}-${{ matrix.toolchain }}
path: target/release/czkawka_gui
if: ${{ matrix.type == 'release' }}
- name: Minimal AppImage
run: |
pwd
rm -rf czkawka_gui
cp target/release/czkawka_gui .
strip czkawka_gui
wget https://github.com/AppImage/pkg2appimage/releases/download/continuous/pkg2appimage-1807-x86_64.AppImage
chmod +x pkg2appimage-1807-x86_64.AppImage
./pkg2appimage-1807-x86_64.AppImage misc/czkawka-appimage-recipe.yml
mv out/Czkawka*.AppImage out/czkawka_gui-minimal.AppImage
- name: Minimal Appimage Upload
uses: actions/upload-artifact@v2
with:
name: czkawka_gui-${{ matrix.toolchain }}_minimal_AppImage
path: out/*.AppImage
linux-appimage-gui:
strategy:
matrix:
toolchain: [ stable ]
type: [ release ]
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- uses: actions-rs/toolchain@v1
with:
toolchain: ${{ matrix.toolchain }}
override: true
- uses: actions/cache@v2
with:
path: |
target
key: linux-appimage-gui-${{github.ref}}-${{github.sha}}
restore-keys: |
linux-appimage-gui-${{github.ref}}-${{github.sha}}
- name: Install Gtk,
run: sudo apt-get update; sudo apt install libgtk-3-dev libasound2-dev librsvg2-dev wget -y
- name: Build GUI Release
run: cargo build --release --bin czkawka_gui
env:
CARGO_INCREMENTAL: 0
RUSTFLAGS: "-C debuginfo=0 -D warnings"
- name: Download appimage dependiences
run: |
wget -c "https://raw.githubusercontent.com/linuxdeploy/linuxdeploy-plugin-gtk/master/linuxdeploy-plugin-gtk.sh"
wget -c "https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage"
chmod +x linuxdeploy-plugin-gtk.sh
chmod +x linuxdeploy-x86_64.AppImage
mkdir -p AppDir/usr/bin
cp target/release/czkawka_gui AppDir/usr/bin
./linuxdeploy-x86_64.AppImage --appdir AppDir --plugin gtk --output appimage --icon-file data/icons/com.github.qarmin.czkawka.svg --desktop-file data/com.github.qarmin.czkawka.desktop
- name: Store Linux Appimage GUI
uses: actions/upload-artifact@v2
with:
name: czkawka_gui-appimage-${{ runner.os }}-${{ matrix.toolchain }}
path: Czkawka*.AppImage

@ -1,50 +0,0 @@
name: 🐧 Linux CLI
on:
push:
pull_request:
schedule:
- cron: '0 0 * * 2'
env:
CARGO_TERM_COLOR: always
jobs:
linux-cli:
strategy:
matrix:
toolchain: [ stable, 1.75.0 ]
type: [ release ]
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v4
- name: Install basic libraries
run: sudo apt update || true; sudo apt install libheif-dev ffmpeg -y
- name: Setup rust version
run: rustup default ${{ matrix.toolchain }}
- name: Enable LTO
run: sed -i 's/#lto = "thin"/lto = "thin"/g' Cargo.toml
if: ${{ (matrix.type == 'release') }}
- name: Build Release
run: cargo build --release --bin czkawka_cli
if: ${{ (matrix.type == 'release') }}
- name: Store Linux CLI
uses: actions/upload-artifact@v4
with:
name: czkawka_cli-${{ runner.os }}-${{ matrix.toolchain }}
path: target/release/czkawka_cli
if: ${{ matrix.type == 'release' }}
- name: Linux Regression Test
run: |
wget https://github.com/qarmin/czkawka/releases/download/6.0.0/TestFiles.zip
cd ci_tester
cargo build --release
cd ..
ci_tester/target/release/ci_tester target/release/czkawka_cli
if: ${{ matrix.type == 'release' }}

@ -1,58 +0,0 @@
name: 🐧 Linux CLI Eyra
on:
push:
pull_request:
schedule:
- cron: '0 0 * * 2'
env:
CARGO_TERM_COLOR: always
jobs:
linux-cli:
strategy:
matrix:
toolchain: [ nightly ]
type: [ release ]
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v4
- name: Install basic libraries
run: sudo apt update || true; sudo apt install -y ffmpeg
# New versions of nightly rust may call new unimplemented in eyra functions, so use const version
- name: Setup rust version
run: rustup default nightly-2024-02-06
- name: Add eyra
run: |
cd czkawka_cli
cargo add eyra --rename=std
echo 'fn main() { println!("cargo:rustc-link-arg=-nostartfiles"); }' > build.rs
cd ..
- name: Enable LTO
run: sed -i 's/#lto = "thin"/lto = "thin"/g' Cargo.toml
if: ${{ (matrix.type == 'release') }}
- name: Build Release
run: cargo build --release --bin czkawka_cli
if: ${{ (matrix.type == 'release') }}
- name: Store Linux CLI
uses: actions/upload-artifact@v4
with:
name: czkawka_cli-${{ runner.os }}-${{ matrix.toolchain }}
path: target/release/czkawka_cli
if: ${{ matrix.type == 'release' }}
- name: Linux Regression Test
run: |
wget https://github.com/qarmin/czkawka/releases/download/6.0.0/TestFiles.zip
cd ci_tester
cargo build --release
cd ..
ci_tester/target/release/ci_tester target/release/czkawka_cli
if: ${{ matrix.type == 'release' }}

@ -1,184 +0,0 @@
name: 🐧 Linux GUI
on:
push:
pull_request:
schedule:
- cron: '0 0 * * 2'
env:
CARGO_TERM_COLOR: always
jobs:
linux-krokiet-gui:
strategy:
matrix:
toolchain: [ stable, 1.75.0 ]
type: [ release ]
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v4
- name: Setup rust version
run: rustup default ${{ matrix.toolchain }}
- name: Enable LTO
run: sed -i 's/#lto = "thin"/lto = "thin"/g' Cargo.toml
if: ${{ (matrix.type == 'release') }}
- name: Build Release Krokiet
run: cargo build --release --bin krokiet
if: ${{ (matrix.type == 'release') }}
- name: Store Linux GUI Krokiet
uses: actions/upload-artifact@v4
with:
name: krokiet-${{ runner.os }}-${{ matrix.toolchain }}
path: target/release/krokiet
if: ${{ matrix.type == 'release' }}
linux-krokiet-gui-heif:
strategy:
matrix:
toolchain: [ stable, 1.75.0 ]
type: [ release ]
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- name: Install basic libraries
run: sudo apt update || true; sudo apt install libheif-dev libraw-dev -y
- name: Setup rust version
run: rustup default ${{ matrix.toolchain }}
- name: Enable LTO
run: sed -i 's/#lto = "thin"/lto = "thin"/g' Cargo.toml
if: ${{ (matrix.type == 'release') }}
- name: Build Release Krokiet heif
run: cargo build --release --bin krokiet --features "heif,libraw"
if: ${{ (matrix.type == 'release') }}
- name: Store Linux GUI Krokiet heif libraw
uses: actions/upload-artifact@v4
with:
name: krokiet-${{ runner.os }}-${{ matrix.toolchain }}-heif-libraw
path: target/release/krokiet
if: ${{ matrix.type == 'release' }}
linux-gui:
strategy:
matrix:
toolchain: [ stable, 1.75.0 ]
type: [ release ]
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- name: Install basic libraries
run: sudo apt update || true; sudo apt install libgtk-4-dev libheif-dev libraw-dev -y
- name: Setup rust version
run: rustup default ${{ matrix.toolchain }}
- name: Enable LTO
run: sed -i 's/#lto = "thin"/lto = "thin"/g' Cargo.toml
if: ${{ (matrix.type == 'release') }}
- name: Build Release Heif Libraw
run: cargo build --release --bin czkawka_gui --features "heif,libraw"
if: ${{ (matrix.type == 'release') }}
- name: Store Linux GUI Heif Libraw
uses: actions/upload-artifact@v4
with:
name: czkawka_gui-${{ runner.os }}-${{ matrix.toolchain }}-heif-libraw
path: target/release/czkawka_gui
if: ${{ (matrix.type == 'release') && (matrix.toolchain == 'stable') }}
- name: Build Release
run: cargo build --release --bin czkawka_gui
if: ${{ (matrix.type == 'release') }}
# Only store stable toolchain
- name: Store Linux GUI
uses: actions/upload-artifact@v4
with:
name: czkawka_gui-${{ runner.os }}-${{ matrix.toolchain }}
path: target/release/czkawka_gui
if: ${{ (matrix.type == 'release') && (matrix.toolchain == 'stable') }}
linux-appimage-gui:
strategy:
matrix:
toolchain: [ stable ]
type: [ release ]
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- name: Install Dependencies
run: sudo apt update || true; sudo apt install libgtk-4-dev libheif-dev librsvg2-dev wget fuse libfuse2 -y
- name: Setup rust version
run: rustup default ${{ matrix.toolchain }}
- name: Enable LTO
run: sed -i 's/#lto = "thin"/lto = "thin"/g' Cargo.toml
if: ${{ (matrix.type == 'release') }}
- name: Build Release
run: cargo build --release --bin czkawka_gui
- name: Download appimage dependencies
run: |
pwd
wget -c "https://raw.githubusercontent.com/linuxdeploy/linuxdeploy-plugin-gtk/master/linuxdeploy-plugin-gtk.sh"
wget -c "https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage"
chmod +x linuxdeploy-plugin-gtk.sh
chmod +x linuxdeploy-x86_64.AppImage
mkdir -p AppDir/usr/bin
pwd
cp target/release/czkawka_gui AppDir/usr/bin
./linuxdeploy-x86_64.AppImage --appdir AppDir --plugin gtk --output appimage --icon-file data/icons/com.github.qarmin.czkawka.svg --desktop-file data/com.github.qarmin.czkawka.desktop
- name: Store Linux Appimage GUI
uses: actions/upload-artifact@v4
with:
name: czkawka_gui-appimage-${{ runner.os }}-${{ matrix.toolchain }}
path: Czkawka*.AppImage
- name: Minimal AppImage
run: |
pwd
rm -rf czkawka_gui
cp target/release/czkawka_gui .
strip czkawka_gui
wget https://github.com/AppImageCommunity/pkg2appimage/releases/download/continuous/pkg2appimage--x86_64.AppImage -O pkg2.appimage
chmod +x ./pkg2.appimage
./pkg2.appimage misc/czkawka-appimage-recipe.yml
mv out/Czkawka*.AppImage out/czkawka_gui-minimal.AppImage
- name: Minimal Appimage Upload
uses: actions/upload-artifact@v4
with:
name: czkawka_gui-${{ matrix.toolchain }}_minimal_AppImage
path: out/*.AppImage
linux-tests:
strategy:
matrix:
toolchain: [ stable ]
type: [ debug ]
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- name: Install Dependencies
run: sudo apt update || true; sudo apt install libgtk-4-dev libheif-dev librsvg2-dev wget fuse libfuse2 -y xvfb
- name: Setup rust version
run: rustup default ${{ matrix.toolchain }}
- name: Test
run: xvfb-run cargo test

@ -9,77 +9,89 @@ env:
CARGO_TERM_COLOR: always
jobs:
macos:
macos-cli:
strategy:
matrix:
toolchain: [ stable ]
type: [ release ]
runs-on: macos-latest
runs-on: macos-10.15
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v2
- name: Install Homebrew
run: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
- name: Install GTK4
run: |
brew link --overwrite python@3.11
brew install rust gtk4 libheif || true
brew link --overwrite python@3.11
- uses: actions-rs/toolchain@v1
with:
toolchain: ${{ matrix.toolchain }}
override: true
- name: Setup rust version
run: rustup default ${{ matrix.toolchain }}
- uses: actions/cache@v2
with:
path: |
target
key: mac-cli-${{github.ref}}-${{github.sha}}
restore-keys: |
mac-cli-${{github.ref}}-${{github.sha}}
- name: Enable LTO
run: sed -i '' 's/#lto = "thin"/lto = "thin"/g' Cargo.toml
if: ${{ (matrix.type == 'release') }}
- name: Build CLI Debug
run: cargo build --bin czkawka_cli
env:
CARGO_INCREMENTAL: 0
RUSTFLAGS: "-C debuginfo=0 -D warnings"
if: ${{ matrix.type == 'debug'}}
- name: Build Release
run: cargo build --release
- name: Build CLI Release
run: cargo build --release --bin czkawka_cli
env:
CARGO_INCREMENTAL: 0
RUSTFLAGS: "-C debuginfo=0 -D warnings"
if: ${{ matrix.type == 'release'}}
- name: Store MacOS CLI
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v2
with:
name: czkawka_cli-${{ runner.os }}-${{ matrix.toolchain }}
path: target/release/czkawka_cli
if: ${{ matrix.type == 'release' }}
- name: Store MacOS GUI
uses: actions/upload-artifact@v4
with:
name: czkawka_gui-${{ runner.os }}-${{ matrix.toolchain }}
path: target/release/czkawka_gui
if: ${{ matrix.type == 'release' }}
macos-gui:
strategy:
matrix:
toolchain: [ stable ]
type: [ release ]
runs-on: macos-10.15
steps:
- uses: actions/checkout@v2
- name: Store MacOS Krokiet
uses: actions/upload-artifact@v4
- uses: actions-rs/toolchain@v1
with:
name: krokiet-${{ runner.os }}-${{ matrix.toolchain }}
path: target/release/krokiet
if: ${{ matrix.type == 'release' }}
toolchain: ${{ matrix.toolchain }}
override: true
- name: Build Release Heif
run: cargo build --release --features heif
if: ${{ matrix.type == 'release'}}
- name: Install Homebrew
run: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
- name: Store MacOS CLI Heif
uses: actions/upload-artifact@v4
with:
name: czkawka_cli-${{ runner.os }}-${{ matrix.toolchain }}-heif
path: target/release/czkawka_cli
if: ${{ matrix.type == 'release' }}
- name: Override link[WORKAROUND] # Looks that this is a bug with current homebrew or Github CI
run: rm '/usr/local/bin/2to3'
- name: Install GTK3
run: brew install rust gtk+3
- name: Store MacOS GUI Heif
uses: actions/upload-artifact@v4
- name: Build GUI Debug
run: cargo build --bin czkawka_gui
env:
CARGO_INCREMENTAL: 0
RUSTFLAGS: "-C debuginfo=0 -D warnings"
if: ${{ matrix.type == 'debug'}}
- name: Build GUI Release
run: cargo build --release --bin czkawka_gui
env:
CARGO_INCREMENTAL: 0
RUSTFLAGS: "-C debuginfo=0 -D warnings"
if: ${{ matrix.type == 'release'}}
- name: Store MacOS GUI
uses: actions/upload-artifact@v2
with:
name: czkawka_gui-${{ runner.os }}-${{ matrix.toolchain }}-heif
name: czkawka_gui-${{ runner.os }}-${{ matrix.toolchain }}
path: target/release/czkawka_gui
if: ${{ matrix.type == 'release' }}
- name: Store MacOS Krokiet Heif
uses: actions/upload-artifact@v4
with:
name: krokiet-${{ runner.os }}-${{ matrix.toolchain }}-heif
path: target/release/krokiet
if: ${{ matrix.type == 'release' }}

@ -10,18 +10,35 @@ env:
jobs:
quality:
runs-on: ubuntu-22.04
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v2
- name: Install Gtk 4
run: sudo apt update || true; sudo apt install -y libgtk-4-dev libraw-dev libheif-dev -y
- uses: actions/cache@v2
with:
path: |
target
key: quality-${{github.ref}}-${{github.sha}}
restore-keys: |
quality-cli-${{github.ref}}-${{github.sha}}
- uses: actions-rs/toolchain@v1
with:
toolchain: stable
components: rustfmt, clippy
override: true
- name: Install Gtk
run: sudo apt-get update; sudo apt install -y libgtk-3-dev libasound2-dev
- name: Check the format
run: cargo fmt --all -- --check
# type complexity must be ignored because we use huge templates for queries
- name: Run clippy
run: cargo clippy --all-targets --all-features -- -D warnings
- name: Run clippy
run: cargo clippy -- -D warnings
run: >
cargo clippy
--all-targets
--all-features
--
-D warnings

@ -9,284 +9,503 @@ env:
CARGO_TERM_COLOR: always
jobs:
krokiet-compiled-on-linux:
windows-cli:
strategy:
fail-fast: false
matrix:
use_heif: [ normal ]
runs-on: ubuntu-latest
toolchain: [ stable ]
type: [ release ]
runs-on: windows-2019
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v2
- name: Install dependencies(mostly sd)
run: |
sudo apt update || true;sudo apt install -y mingw-w64 mingw-w64-x86-64-dev
wget https://github.com/chmln/sd/releases/download/v1.0.0/sd-v1.0.0-x86_64-unknown-linux-gnu.tar.gz -O a.tar.gz
tar -xzf a.tar.gz
cp sd-v1.0.0-x86_64-unknown-linux-gnu/sd .
chmod +x ./sd
- uses: actions/setup-python@v1
- name: Setup rust version
run: |
rustup target add x86_64-pc-windows-gnu
- uses: actions-rs/toolchain@v1
with:
toolchain: ${{ matrix.toolchain }}
override: true
- uses: actions/cache@v2
with:
path: |
target
key: windows-cli-${{github.ref}}-${{github.sha}}
restore-keys: |
windows-cli-${{github.ref}}-${{github.sha}}
- name: Enable LTO
run: sed -i 's/#lto = "thin"/lto = "thin"/g' Cargo.toml
- name: Build CLI Debug
run: cargo build --bin czkawka_cli
env:
CARGO_INCREMENTAL: 0
RUSTFLAGS: "-C debuginfo=0 -D warnings"
if: ${{ matrix.type == 'debug'}}
- name: Compile Krokiet
run: cargo build --release --target x86_64-pc-windows-gnu --bin krokiet
- name: Build CLI Release
run: cargo build --release --bin czkawka_cli
env:
CARGO_INCREMENTAL: 0
RUSTFLAGS: "-C debuginfo=0 -D warnings"
if: ${{ matrix.type == 'release'}}
- name: Upload artifacts
uses: actions/upload-artifact@v4
- name: Store Windows CLI
uses: actions/upload-artifact@v2
with:
name: krokiet-windows-c-on-linux-${{ github.sha }}-${{ matrix.use_heif }}
path: |
target/x86_64-pc-windows-gnu/release/krokiet.exe
if-no-files-found: error
name: czkawka_cli-${{ runner.os }}-${{ matrix.toolchain }}
path: target/release/czkawka_cli.exe
if: ${{ matrix.type == 'release' }}
- name: Show console window on windows
# Duplicate finder checks included and excluded directories
# Others are just check delete files number
# Windows build have some elements changed like powershell before wget and unzip, python instead python3, rm -r instead rm -r and one (at the top) additional test which check size of characyers
- name: test
run: |
./sd -s '#![windows_subsystem = "windows"]' '//#![windows_subsystem = "windows"]' krokiet/src/main.rs
cat krokiet/src/main.rs
powershell wget https://github.com/qarmin/czkawka/releases/download/1.1.0/TestSuite.zip -O TestSuite.zip
powershell unzip TestSuite.zip -d TestSuite
python misc/check_results.py TestSuite 15 8
- name: Compile Krokiet Console
run: cargo build --release --target x86_64-pc-windows-gnu --bin krokiet
- name: Upload artifacts Console
uses: actions/upload-artifact@v4
with:
name: krokiet-windows-c-on-linux-${{ github.sha }}-${{ matrix.use_heif }}-console
path: |
target/x86_64-pc-windows-gnu/release/krokiet.exe
if-no-files-found: error
target/release/czkawka_cli dup -d "$(pwd)/TestSuite" "$(pwd)\testsuite" -e "$(pwd)/TestSuite/subFolder" -D aeo -m 1024
python misc/check_results.py TestSuite 13 8
krokiet-compiled-on-windows:
strategy:
fail-fast: false
matrix:
use_heif: [ normal ]
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
rm -r TestSuite
unzip TestSuite.zip -d TestSuite
- name: Install dependencies(mostly sd)
run: |
Invoke-WebRequest -Uri https://github.com/chmln/sd/releases/download/v1.0.0/sd-v1.0.0-x86_64-pc-windows-gnu.zip -OutFile a.zip
Expand-Archive ./a.zip
cp a/sd-v1.0.0-x86_64-pc-windows-gnu/sd.exe .
target/release/czkawka_cli dup -d "$(pwd)/TestSuite" "$(pwd)/teStSuite" -D aen -m 1024
python misc/check_results.py TestSuite 7 8
- name: Setup rust version
run: rustup default stable-x86_64-pc-windows-gnu
rm -r TestSuite
unzip TestSuite.zip -d TestSuite
- name: Enable LTO
run: sed -i 's/#lto = "thin"/lto = "thin"/g' Cargo.toml
target/release/czkawka_cli dup -d "$(pwd)\TestSuite" "$(pwd)/TESTSUITE" -D aen -m 1024
python misc/check_results.py TestSuite 7 8
- name: Compile Krokiet
run: cargo build --release --bin krokiet
rm -r TestSuite
unzip TestSuite.zip -d TestSuite
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: krokiet-windows-c-on-windows-${{ github.sha }}-${{ matrix.use_heif }}
path: |
target/release/krokiet.exe
if-no-files-found: error
- name: Show console window on windows
run: |
./sd.exe -s '#![windows_subsystem = "windows"]' '//#![windows_subsystem = "windows"]' krokiet/src/main.rs
cat krokiet/src/main.rs
- name: Compile Krokiet Console
run: cargo build --release --bin krokiet
target/release/czkawka_cli dup -d "$(pwd)/TestSuite" -D aen -m 1024
python misc/check_results.py TestSuite 7 8
- name: Upload artifacts Console
uses: actions/upload-artifact@v4
with:
name: krokiet-windows-c-on-windows-${{ github.sha }}-${{ matrix.use_heif }}-console
path: |
target/release/krokiet.exe
if-no-files-found: error
rm -r TestSuite
unzip TestSuite.zip -d TestSuite
target/release/czkawka_cli dup -d "$(pwd)/TestSuite" -D aen -m 1024
python misc/check_results.py TestSuite 7 8
container_4_10:
rm -r TestSuite
unzip TestSuite.zip -d TestSuite
target/release/czkawka_cli dup -d "$(pwd)/TestSuite" -x TEXT -D aeo -m 1024
python misc/check_results.py TestSuite 14 8
rm -r TestSuite
unzip TestSuite.zip -d TestSuite
target/release/czkawka_cli dup -d "$(pwd)/TestSuite" -e "$(pwd)/TestSuite/SubFolder" -D aeo -m 1024
python misc/check_results.py TestSuite 13 8
rm -r TestSuite
unzip TestSuite.zip -d TestSuite
target/release/czkawka_cli dup -d "$(pwd)/TestSuite" -m 1500 -D aeo
python misc/check_results.py TestSuite 8 8
rm -r TestSuite
unzip TestSuite.zip -d TestSuite
target/release/czkawka_cli dup -d "$(pwd)/TestSuite" -R -m 1024
python misc/check_results.py TestSuite 15 8
target/release/czkawka_cli dup -d "$(pwd)/TestSuite" -R -D aeo -m 1024
python misc/check_results.py TestSuite 13 8
target/release/czkawka_cli big -d "$(pwd)/TestSuite"
rm -r TestSuite
unzip TestSuite.zip -d TestSuite
target/release/czkawka_cli empty-files -d "$(pwd)/TestSuite"
python misc/check_results.py TestSuite 15 8
target/release/czkawka_cli empty-files -d "$(pwd)/TestSuite" -D
python misc/check_results.py TestSuite 13 8
rm -r TestSuite
unzip TestSuite.zip -d TestSuite
target/release/czkawka_cli empty-folders -d "$(pwd)/TestSuite"
python misc/check_results.py TestSuite 15 8
target/release/czkawka_cli empty-folders -d "$(pwd)/TestSuite" -D
python misc/check_results.py TestSuite 15 2
rm -r TestSuite
unzip TestSuite.zip -d TestSuite
target/release/czkawka_cli temp -d "$(pwd)/TestSuite"
python misc/check_results.py TestSuite 15 8
target/release/czkawka_cli temp -d "$(pwd)/TestSuite" -D
python misc/check_results.py TestSuite 14 8
if: ${{ matrix.type == 'release' }}
windows-gui-release-normal-app:
strategy:
fail-fast: false
matrix:
use_heif: [ non_heif ]
runs-on: ubuntu-latest
container:
image: ghcr.io/mglolenstine/gtk4-cross:gtk-4.10
toolchain: [ stable ]
type: [ release ]
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v4
- name: Install additional dependencies
# gio is for the build script
- uses: actions/checkout@v2
- uses: actions-rs/toolchain@v1
with:
toolchain: ${{ matrix.toolchain }}
override: true
- name: Install Gtk, Mingw, unzip, zip and wget
run: sudo apt-get update; sudo apt install mingw-w64 libgtk-3-dev unzip wget zip -y
- name: Build GUI Release Cross Compile
run: |
dnf install curl wget2 unzip mingw64-bzip2.noarch mingw64-poppler mingw64-poppler-glib mingw32-python3 rust-gio-devel adwaita-icon-theme -y && dnf clean all -y
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
source "$HOME/.cargo/env"
rustup target add x86_64-pc-windows-gnu
- name: Cross compile for Windows
run: |
source "$HOME/.cargo/env"
#!/bin/bash
set -euo pipefail
export PKG_CONFIG_PATH=/usr/lib64/pkgconfig:/usr/share/pkgconfig:$MINGW_PREFIX/lib/pkgconfig/:/usr/x86_64-w64-mingw32/lib/pkgconfig/
cargo build --target=x86_64-pc-windows-gnu --release --locked
mkdir -p package
cp target/x86_64-pc-windows-gnu/release/czkawka_gui.exe package/
cp target/x86_64-pc-windows-gnu/release/czkawka_cli.exe package/
- name: Package
run: |
#!/bin/bash
set -euo pipefail
cp -t package $(pds -vv -f package/*.exe)
# Add gdbus which is recommended on Windows (why?)
cp $MINGW_PREFIX/bin/gdbus.exe package
# Handle the glib schema compilation as well
glib-compile-schemas $MINGW_PREFIX/share/glib-2.0/schemas/
mkdir -p package/share/glib-2.0/schemas/
cp -T $MINGW_PREFIX/share/glib-2.0/schemas/gschemas.compiled package/share/glib-2.0/schemas/gschemas.compiled
# Pixbuf stuff, in order to get SVGs (scalable icons) to load
mkdir -p package/lib/gdk-pixbuf-2.0
cp -rT $MINGW_PREFIX/lib/gdk-pixbuf-2.0 package/lib/gdk-pixbuf-2.0
cp -f -t package $(pds -vv -f $MINGW_PREFIX/lib/gdk-pixbuf-2.0/2.10.0/loaders/*)
find package -iname "*.dll" -or -iname "*.exe" -type f -exec mingw-strip {} +
cd package/share
wget2 https://github.com/qarmin/czkawka/files/10832192/gtk4_theme.zip
unzip gtk4_theme.zip
rm gtk4_theme.zip
cd ../..
- name: Upload artifacts
uses: actions/upload-artifact@v4
echo "[target.x86_64-pc-windows-gnu]" > ~/.cargo/config
echo "linker = \"x86_64-w64-mingw32-gcc\"" >> ~/.cargo/config
echo "ar = \"x86_64-w64-mingw32-gcc-ar\"" >> ~/.cargo/config
GTK_LIBRARY="$(pwd)/gtk_library"
GTK_APP="$(pwd)/gtk_app"
GTK_THEME="$(pwd)/gtk_theme"
wget https://github.com/qarmin/gtk_library_store/releases/download/3.24.0/mingw64.zip
unzip mingw64.zip -d $GTK_LIBRARY
GTK_LIBRARY="$GTK_LIBRARY/mingw64"
wget https://github.com/nrhodes91/AdMin/archive/master.zip
unzip master.zip -d $GTK_THEME
PKG_CONFIG_ALLOW_CROSS=1 PKG_CONFIG_PATH="$GTK_LIBRARY/lib/pkgconfig" RUSTFLAGS="-L $GTK_LIBRARY/lib" cargo build --target=x86_64-pc-windows-gnu --bin czkawka_gui --release
strip target/x86_64-pc-windows-gnu/release/czkawka_gui.exe
mkdir $GTK_APP
cp target/x86_64-pc-windows-gnu/release/czkawka_gui.exe $GTK_APP
cp $GTK_LIBRARY/bin/*.dll $GTK_APP
mkdir -p $GTK_APP/share/glib-2.0/schemas
mkdir $GTK_APP/share/icons
cp $GTK_LIBRARY/share/glib-2.0/schemas/* $GTK_APP/share/glib-2.0/schemas
cp -r $GTK_LIBRARY/share/icons/* $GTK_APP/share/icons
mkdir $GTK_APP/lib
cp -r $GTK_LIBRARY/lib/gdk-pixbuf-2.0 $GTK_APP/lib
mkdir -p $GTK_APP/share/themes
mkdir -p $GTK_APP/share/gtk-3.0
echo "[Settings]" > $GTK_APP/share/gtk-3.0/settings.ini
echo "gtk-theme-name = admin-gtk3-dark-osx" >> $GTK_APP/share/gtk-3.0/settings.ini
echo "gtk-font-name = Segoe UI 10" >> $GTK_APP/share/gtk-3.0/settings.ini
echo "gtk-xft-rgba = rgb" >> $GTK_APP/share/gtk-3.0/settings.ini
cp $GTK_THEME/AdMin-master/admin-gtk3-dark-osx $GTK_APP/share/themes -r -L
# This part is only unique for Czkawka
# This code allows to check which icons are used in Czkawka
# cd czkawka/ui
# rg icon-name
rm -rf $GTK_APP/share/icons/Adwaita/16x16
rm -rf $GTK_APP/share/icons/Adwaita/22x22
rm -rf $GTK_APP/share/icons/Adwaita/24x24
rm -rf $GTK_APP/share/icons/Adwaita/256x256
rm -rf $GTK_APP/share/icons/Adwaita/32x32
rm -rf $GTK_APP/share/icons/Adwaita/48x48
rm -rf $GTK_APP/share/icons/Adwaita/512x512
rm -rf $GTK_APP/share/icons/Adwaita/64x64
rm -rf $GTK_APP/share/icons/Adwaita/8x8
rm -rf $GTK_APP/share/icons/Adwaita/96x96
rm -rf $GTK_APP/share/icons/Adwaita/cursors
rm -rf $GTK_APP/share/icons/Adwaita/scalable
rm -rf $GTK_APP/share/icons/Adwaita/scalable-up-to-32
rm -rf $GTK_APP/share/icons/hicolor
wget https://github.com/qarmin/gtk_library_store/releases/download/3.24.0/czkawka_icons.zip
unzip czkawka_icons.zip -d $GTK_APP/share/icons/Adwaita
zip -r gtk_app.zip $GTK_APP
env:
CARGO_INCREMENTAL: 0
RUSTFLAGS: "-C debuginfo=0 -D warnings"
- name: Store Windows GUI CrossComplile
uses: actions/upload-artifact@v2
with:
name: czkawka-windows-${{ github.sha }}-${{ matrix.use_heif }}-4.10
path: |
./package
if-no-files-found: error
name: czkawka_gui-release-normal-app-${{ matrix.toolchain }}
path: gtk_app.zip
container_4_6:
windows-gui-release-console:
strategy:
fail-fast: false
matrix:
use_heif: [ non_heif ]
runs-on: ubuntu-latest
container:
image: ghcr.io/piegamesde/gtk4-cross:gtk-4.6
toolchain: [ stable ]
type: [ release ]
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v4
- name: Install additional dependencies
# gio is for the build script
run: |
dnf install curl wget2 unzip mingw64-bzip2.noarch mingw64-poppler mingw64-poppler-glib mingw32-python3 rust-gio-devel adwaita-icon-theme -y && dnf clean all -y
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
source "$HOME/.cargo/env"
rustup target add x86_64-pc-windows-gnu
- uses: actions/checkout@v2
- name: Cross compile for Windows
run: |
source "$HOME/.cargo/env"
#!/bin/bash
set -euo pipefail
export PKG_CONFIG_PATH=/usr/lib64/pkgconfig:/usr/share/pkgconfig:$MINGW_PREFIX/lib/pkgconfig/:/usr/x86_64-w64-mingw32/lib/pkgconfig/
cargo build --target=x86_64-pc-windows-gnu --release --locked
mkdir -p package
cp target/x86_64-pc-windows-gnu/release/czkawka_gui.exe package/
cp target/x86_64-pc-windows-gnu/release/czkawka_cli.exe package/
- name: Package
run: |
#!/bin/bash
set -euo pipefail
cp -t package $(pds -vv -f package/*.exe)
# Add gdbus which is recommended on Windows (why?)
cp $MINGW_PREFIX/bin/gdbus.exe package
# Handle the glib schema compilation as well
glib-compile-schemas $MINGW_PREFIX/share/glib-2.0/schemas/
mkdir -p package/share/glib-2.0/schemas/
cp -T $MINGW_PREFIX/share/glib-2.0/schemas/gschemas.compiled package/share/glib-2.0/schemas/gschemas.compiled
# Pixbuf stuff, in order to get SVGs (scalable icons) to load
mkdir -p package/lib/gdk-pixbuf-2.0
cp -rT $MINGW_PREFIX/lib/gdk-pixbuf-2.0 package/lib/gdk-pixbuf-2.0
cp -f -t package $(pds -vv -f $MINGW_PREFIX/lib/gdk-pixbuf-2.0/2.10.0/loaders/*)
find package -iname "*.dll" -or -iname "*.exe" -type f -exec mingw-strip {} +
cd package/share
wget2 https://github.com/qarmin/czkawka/files/10832192/gtk4_theme.zip
unzip gtk4_theme.zip
rm gtk4_theme.zip
cd ../..
- name: Upload artifacts
uses: actions/upload-artifact@v4
- uses: actions-rs/toolchain@v1
with:
name: czkawka-windows-${{ github.sha }}-${{ matrix.use_heif }}-4.6
path: |
./package
if-no-files-found: error
# Provide option to log things to windows CLI
container_4_6_console_window:
runs-on: ubuntu-22.04
container:
image: ghcr.io/piegamesde/gtk4-cross:gtk-4.6
steps:
- uses: actions/checkout@v4
- name: Install dependencies(mostly sd)
run: |
dnf install wget -y
wget https://github.com/chmln/sd/releases/download/v1.0.0/sd-v1.0.0-x86_64-unknown-linux-gnu.tar.gz -O a.tar.gz
tar -xzf a.tar.gz
chmod +x sd-v1.0.0-x86_64-unknown-linux-gnu/sd
sudo cp sd-v1.0.0-x86_64-unknown-linux-gnu/sd /usr/bin/sd
- name: Install additional dependencies
# gio is for the build script
toolchain: ${{ matrix.toolchain }}
override: true
- name: Install Gtk, Mingw, unzip, zip and wget
run: sudo apt-get update; sudo apt install mingw-w64 libgtk-3-dev unzip wget zip -y
- name: Build GUI Release Cross Compile
run: |
dnf install curl wget2 unzip mingw64-bzip2.noarch mingw64-poppler mingw64-poppler-glib mingw32-python3 rust-gio-devel adwaita-icon-theme -y && dnf clean all -y
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
source "$HOME/.cargo/env"
sed -i 's/windows_subsystem = "windows"/windows_subsystem = "console"/' czkawka_gui/src/main.rs
rustup target add x86_64-pc-windows-gnu
- name: Show console window on windows
run: sd -s '#![windows_subsystem = "windows"]' '//#![windows_subsystem = "windows"]' krokiet/src/main.rs
- name: Cross compile for Windows
run: |
source "$HOME/.cargo/env"
#!/bin/bash
set -euo pipefail
export PKG_CONFIG_PATH=/usr/lib64/pkgconfig:/usr/share/pkgconfig:$MINGW_PREFIX/lib/pkgconfig/:/usr/x86_64-w64-mingw32/lib/pkgconfig/
cargo build --target=x86_64-pc-windows-gnu --release --locked
mkdir -p package
cp target/x86_64-pc-windows-gnu/release/czkawka_gui.exe package/
cp target/x86_64-pc-windows-gnu/release/czkawka_cli.exe package/
- name: Package
run: |
#!/bin/bash
set -euo pipefail
cp -t package $(pds -vv -f package/*.exe)
# Add gdbus which is recommended on Windows (why?)
cp $MINGW_PREFIX/bin/gdbus.exe package
# Handle the glib schema compilation as well
glib-compile-schemas $MINGW_PREFIX/share/glib-2.0/schemas/
mkdir -p package/share/glib-2.0/schemas/
cp -T $MINGW_PREFIX/share/glib-2.0/schemas/gschemas.compiled package/share/glib-2.0/schemas/gschemas.compiled
# Pixbuf stuff, in order to get SVGs (scalable icons) to load
mkdir -p package/lib/gdk-pixbuf-2.0
cp -rT $MINGW_PREFIX/lib/gdk-pixbuf-2.0 package/lib/gdk-pixbuf-2.0
cp -f -t package $(pds -vv -f $MINGW_PREFIX/lib/gdk-pixbuf-2.0/2.10.0/loaders/*)
find package -iname "*.dll" -or -iname "*.exe" -type f -exec mingw-strip {} +
cd package/share
wget2 https://github.com/qarmin/czkawka/files/10832192/gtk4_theme.zip
unzip gtk4_theme.zip
rm gtk4_theme.zip
cd ../..
- name: Upload artifacts
uses: actions/upload-artifact@v4
echo "[target.x86_64-pc-windows-gnu]" > ~/.cargo/config
echo "linker = \"x86_64-w64-mingw32-gcc\"" >> ~/.cargo/config
echo "ar = \"x86_64-w64-mingw32-gcc-ar\"" >> ~/.cargo/config
GTK_LIBRARY="$(pwd)/gtk_library"
GTK_APP="$(pwd)/gtk_app"
GTK_THEME="$(pwd)/gtk_theme"
wget https://github.com/qarmin/gtk_library_store/releases/download/3.24.0/mingw64.zip
unzip mingw64.zip -d $GTK_LIBRARY
GTK_LIBRARY="$GTK_LIBRARY/mingw64"
wget https://github.com/nrhodes91/AdMin/archive/master.zip
unzip master.zip -d $GTK_THEME
PKG_CONFIG_ALLOW_CROSS=1 PKG_CONFIG_PATH="$GTK_LIBRARY/lib/pkgconfig" RUSTFLAGS="-L $GTK_LIBRARY/lib" cargo build --target=x86_64-pc-windows-gnu --bin czkawka_gui --release
strip target/x86_64-pc-windows-gnu/release/czkawka_gui.exe
mkdir $GTK_APP
cp target/x86_64-pc-windows-gnu/release/czkawka_gui.exe $GTK_APP
cp $GTK_LIBRARY/bin/*.dll $GTK_APP
mkdir -p $GTK_APP/share/glib-2.0/schemas
mkdir $GTK_APP/share/icons
cp $GTK_LIBRARY/share/glib-2.0/schemas/* $GTK_APP/share/glib-2.0/schemas
cp -r $GTK_LIBRARY/share/icons/* $GTK_APP/share/icons
mkdir $GTK_APP/lib
cp -r $GTK_LIBRARY/lib/gdk-pixbuf-2.0 $GTK_APP/lib
mkdir -p $GTK_APP/share/themes
mkdir -p $GTK_APP/share/gtk-3.0
echo "[Settings]" > $GTK_APP/share/gtk-3.0/settings.ini
echo "gtk-theme-name = admin-gtk3-dark-osx" >> $GTK_APP/share/gtk-3.0/settings.ini
echo "gtk-font-name = Segoe UI 10" >> $GTK_APP/share/gtk-3.0/settings.ini
echo "gtk-xft-rgba = rgb" >> $GTK_APP/share/gtk-3.0/settings.ini
cp $GTK_THEME/AdMin-master/admin-gtk3-dark-osx $GTK_APP/share/themes -r -L
# This part is only unique for Czkawka
# This code allows to check which icons are used in Czkawka
# cd czkawka/ui
# rg icon-name
rm -rf $GTK_APP/share/icons/Adwaita/16x16
rm -rf $GTK_APP/share/icons/Adwaita/22x22
rm -rf $GTK_APP/share/icons/Adwaita/24x24
rm -rf $GTK_APP/share/icons/Adwaita/256x256
rm -rf $GTK_APP/share/icons/Adwaita/32x32
rm -rf $GTK_APP/share/icons/Adwaita/48x48
rm -rf $GTK_APP/share/icons/Adwaita/512x512
rm -rf $GTK_APP/share/icons/Adwaita/64x64
rm -rf $GTK_APP/share/icons/Adwaita/8x8
rm -rf $GTK_APP/share/icons/Adwaita/96x96
rm -rf $GTK_APP/share/icons/Adwaita/cursors
rm -rf $GTK_APP/share/icons/Adwaita/scalable
rm -rf $GTK_APP/share/icons/Adwaita/scalable-up-to-32
rm -rf $GTK_APP/share/icons/hicolor
wget https://github.com/qarmin/gtk_library_store/releases/download/3.24.0/czkawka_icons.zip
unzip czkawka_icons.zip -d $GTK_APP/share/icons/Adwaita
zip -r gtk_app.zip $GTK_APP
env:
CARGO_INCREMENTAL: 0
RUSTFLAGS: "-C debuginfo=0 -D warnings"
- name: Store Windows GUI CrossComplile
uses: actions/upload-artifact@v2
with:
name: czkawka-windows-${{ github.sha }}-console-4.6
path: |
./package
if-no-files-found: error
name: czkawka_gui-release-console-${{ matrix.toolchain }}
path: gtk_app.zip
# windows-gui-debug-normal-app:
# strategy:
# matrix:
# toolchain: [ stable ]
# type: [ release ]
# runs-on: ubuntu-20.04
# steps:
# - uses: actions/checkout@v2
#
# - uses: actions-rs/toolchain@v1
# with:
# toolchain: ${{ matrix.toolchain }}
# override: true
#
# - name: Install Gtk, Mingw, unzip, zip and wget
# run: sudo apt-get update; sudo apt install mingw-w64 libgtk-3-dev unzip wget zip -y
#
# - name: Build GUI Debug Cross Compile
# run: |
# rustup target add x86_64-pc-windows-gnu
#
# echo "[target.x86_64-pc-windows-gnu]" > ~/.cargo/config
# echo "linker = \"x86_64-w64-mingw32-gcc\"" >> ~/.cargo/config
# echo "ar = \"x86_64-w64-mingw32-gcc-ar\"" >> ~/.cargo/config
#
# GTK_LIBRARY="$(pwd)/gtk_library"
# GTK_APP="$(pwd)/gtk_app"
# GTK_THEME="$(pwd)/gtk_theme"
#
# wget https://github.com/qarmin/gtk_library_store/releases/download/3.24.0/mingw64.zip
# unzip mingw64.zip -d $GTK_LIBRARY
# GTK_LIBRARY="$GTK_LIBRARY/mingw64"
#
# wget https://github.com/nrhodes91/AdMin/archive/master.zip
# unzip master.zip -d $GTK_THEME
#
# PKG_CONFIG_ALLOW_CROSS=1 PKG_CONFIG_PATH="$GTK_LIBRARY/lib/pkgconfig" RUSTFLAGS="-L $GTK_LIBRARY/lib" cargo build --target=x86_64-pc-windows-gnu --bin czkawka_gui
#
# strip target/x86_64-pc-windows-gnu/debug/czkawka_gui.exe
#
# mkdir $GTK_APP
# cp target/x86_64-pc-windows-gnu/debug/czkawka_gui.exe $GTK_APP
# cp $GTK_LIBRARY/bin/*.dll $GTK_APP
# mkdir -p $GTK_APP/share/glib-2.0/schemas
# mkdir $GTK_APP/share/icons
# cp $GTK_LIBRARY/share/glib-2.0/schemas/* $GTK_APP/share/glib-2.0/schemas
# cp -r $GTK_LIBRARY/share/icons/* $GTK_APP/share/icons
# mkdir $GTK_APP/lib
# cp -r $GTK_LIBRARY/lib/gdk-pixbuf-2.0 $GTK_APP/lib
#
# mkdir -p $GTK_APP/share/themes
# mkdir -p $GTK_APP/share/gtk-3.0
# echo "[Settings]" > $GTK_APP/share/gtk-3.0/settings.ini
# echo "gtk-theme-name = admin-gtk3-dark-osx" >> $GTK_APP/share/gtk-3.0/settings.ini
# echo "gtk-font-name = Segoe UI 10" >> $GTK_APP/share/gtk-3.0/settings.ini
# echo "gtk-xft-rgba = rgb" >> $GTK_APP/share/gtk-3.0/settings.ini
# cp $GTK_THEME/AdMin-master/admin-gtk3-dark-osx $GTK_APP/share/themes -r -L
#
# # This part is only unique for Czkawka
# # This code allows to check which icons are used in Czkawka
# # cd czkawka/ui
# # rg icon-name
# rm -rf $GTK_APP/share/icons/Adwaita/16x16
# rm -rf $GTK_APP/share/icons/Adwaita/22x22
# rm -rf $GTK_APP/share/icons/Adwaita/24x24
# rm -rf $GTK_APP/share/icons/Adwaita/256x256
# rm -rf $GTK_APP/share/icons/Adwaita/32x32
# rm -rf $GTK_APP/share/icons/Adwaita/48x48
# rm -rf $GTK_APP/share/icons/Adwaita/512x512
# rm -rf $GTK_APP/share/icons/Adwaita/64x64
# rm -rf $GTK_APP/share/icons/Adwaita/8x8
# rm -rf $GTK_APP/share/icons/Adwaita/96x96
# rm -rf $GTK_APP/share/icons/Adwaita/cursors
# rm -rf $GTK_APP/share/icons/Adwaita/scalable
# rm -rf $GTK_APP/share/icons/Adwaita/scalable-up-to-32
# rm -rf $GTK_APP/share/icons/hicolor
# wget https://github.com/qarmin/gtk_library_store/releases/download/3.24.0/czkawka_icons.zip
# unzip czkawka_icons.zip -d $GTK_APP/share/icons/Adwaita
#
# zip -r gtk_app.zip $GTK_APP
# env:
# CARGO_INCREMENTAL: 0
# RUSTFLAGS: "-C debuginfo=0 -D warnings"
#
# - name: Store Windows GUI CrossComplile
# uses: actions/upload-artifact@v2
# with:
# name: czkawka_gui-debug-normal-app-${{ matrix.toolchain }}
# path: gtk_app.zip
#
#
# windows-gui-debug-console:
# strategy:
# matrix:
# toolchain: [ stable ]
# type: [ release ]
# runs-on: ubuntu-20.04
# steps:
# - uses: actions/checkout@v2
#
# - uses: actions-rs/toolchain@v1
# with:
# toolchain: ${{ matrix.toolchain }}
# override: true
#
# - name: Install Gtk, Mingw, unzip, zip and wget
# run: sudo apt-get update; sudo apt install mingw-w64 libgtk-3-dev unzip wget zip -y
#
# - name: Build GUI Debug Cross Compile
# run: |
# sed -i 's/windows_subsystem = "windows"/windows_subsystem = "console"/' czkawka_gui/src/main.rs
# rustup target add x86_64-pc-windows-gnu
#
# echo "[target.x86_64-pc-windows-gnu]" > ~/.cargo/config
# echo "linker = \"x86_64-w64-mingw32-gcc\"" >> ~/.cargo/config
# echo "ar = \"x86_64-w64-mingw32-gcc-ar\"" >> ~/.cargo/config
#
# GTK_LIBRARY="$(pwd)/gtk_library"
# GTK_APP="$(pwd)/gtk_app"
# GTK_THEME="$(pwd)/gtk_theme"
#
# wget https://github.com/qarmin/gtk_library_store/releases/download/3.24.0/mingw64.zip
# unzip mingw64.zip -d $GTK_LIBRARY
# GTK_LIBRARY="$GTK_LIBRARY/mingw64"
#
# wget https://github.com/nrhodes91/AdMin/archive/master.zip
# unzip master.zip -d $GTK_THEME
#
# PKG_CONFIG_ALLOW_CROSS=1 PKG_CONFIG_PATH="$GTK_LIBRARY/lib/pkgconfig" RUSTFLAGS="-L $GTK_LIBRARY/lib" cargo build --target=x86_64-pc-windows-gnu --bin czkawka_gui
#
# strip target/x86_64-pc-windows-gnu/debug/czkawka_gui.exe
#
# mkdir $GTK_APP
# cp target/x86_64-pc-windows-gnu/debug/czkawka_gui.exe $GTK_APP
# cp $GTK_LIBRARY/bin/*.dll $GTK_APP
# mkdir -p $GTK_APP/share/glib-2.0/schemas
# mkdir $GTK_APP/share/icons
# cp $GTK_LIBRARY/share/glib-2.0/schemas/* $GTK_APP/share/glib-2.0/schemas
# cp -r $GTK_LIBRARY/share/icons/* $GTK_APP/share/icons
# mkdir $GTK_APP/lib
# cp -r $GTK_LIBRARY/lib/gdk-pixbuf-2.0 $GTK_APP/lib
#
# mkdir -p $GTK_APP/share/themes
# mkdir -p $GTK_APP/share/gtk-3.0
# echo "[Settings]" > $GTK_APP/share/gtk-3.0/settings.ini
# echo "gtk-theme-name = admin-gtk3-dark-osx" >> $GTK_APP/share/gtk-3.0/settings.ini
# echo "gtk-font-name = Segoe UI 10" >> $GTK_APP/share/gtk-3.0/settings.ini
# echo "gtk-xft-rgba = rgb" >> $GTK_APP/share/gtk-3.0/settings.ini
# cp $GTK_THEME/AdMin-master/admin-gtk3-dark-osx $GTK_APP/share/themes -r -L
#
# # This part is only unique for Czkawka
# # This code allows to check which icons are used in Czkawka
# # cd czkawka/ui
# # rg icon-name
# rm -rf $GTK_APP/share/icons/Adwaita/16x16
# rm -rf $GTK_APP/share/icons/Adwaita/22x22
# rm -rf $GTK_APP/share/icons/Adwaita/24x24
# rm -rf $GTK_APP/share/icons/Adwaita/256x256
# rm -rf $GTK_APP/share/icons/Adwaita/32x32
# rm -rf $GTK_APP/share/icons/Adwaita/48x48
# rm -rf $GTK_APP/share/icons/Adwaita/512x512
# rm -rf $GTK_APP/share/icons/Adwaita/64x64
# rm -rf $GTK_APP/share/icons/Adwaita/8x8
# rm -rf $GTK_APP/share/icons/Adwaita/96x96
# rm -rf $GTK_APP/share/icons/Adwaita/cursors
# rm -rf $GTK_APP/share/icons/Adwaita/scalable
# rm -rf $GTK_APP/share/icons/Adwaita/scalable-up-to-32
# rm -rf $GTK_APP/share/icons/hicolor
# wget https://github.com/qarmin/gtk_library_store/releases/download/3.24.0/czkawka_icons.zip
# unzip czkawka_icons.zip -d $GTK_APP/share/icons/Adwaita
#
# zip -r gtk_app.zip $GTK_APP
# env:
# CARGO_INCREMENTAL: 0
# RUSTFLAGS: "-C debuginfo=0 -D warnings"
#
# - name: Store Windows GUI CrossComplile
# uses: actions/upload-artifact@v2
# with:
# name: czkawka_gui-debug-console-${{ matrix.toolchain }}
# path: gtk_app.zip

16
.gitignore vendored

@ -7,18 +7,4 @@ results*.txt
TestSuite*
*.snap
flatpak/
*.zip
*.zst
*.profraw
*.profdata
/lcov_report*
/report
ci_tester/target
ci_tester/Cargo.lock
krokiet/Cargo.lock
krokiet/target
*.json
*.mm_profdata
perf.data
perf.data.old
krokiet/ui/test.slint
*.zip

@ -1,6 +1,3 @@
newline_style = "Unix"
max_width = 180
remove_nested_parens = true
# Enable only with nightly channel via - cargo +nightly fmt
imports_granularity = "Module"

7198
Cargo.lock generated

File diff suppressed because it is too large Load Diff

@ -3,24 +3,11 @@ members = [
"czkawka_core",
"czkawka_cli",
"czkawka_gui",
"krokiet"
]
exclude = [
"ci_tester",
]
resolver = "2"
[profile.release]
# panic = "unwind" in opposite to "abort", allows to catch panic!()
# Since Czkawka parse different types of files with few libraries, it is possible
# that some files will cause crash, so at this moment I don't recommend to use "abort"
# until you are ready to occasional crashes
# Panic = "abort" will crash entire app when processing invalid image file.
# Since crash happens in external library, this is only way to handle this(I think).
panic = "unwind"
# LTO setting is disabled by default, because release mode is usually needed to develop app and compilation with LTO would take a lot of time
# But it is used to optimize release builds(and probably also in CI, where time is not so important as in local development)
#lto = "thin"
# Optimize all dependencies except application/workspaces, even in debug builds
[profile.dev.package."*"]
opt-level = 3
#lto = "fat"

@ -1,129 +1,6 @@
## Version 7.0.0 - 19.02.2024r
### BREAKING CHANGES
- Reducing size of cache files, made old cache files incompatible with new version
- `-C` in CLI now saves as compact json
### GTK GUI
- Added drag&drop support for included/excluded folders - [#1106](https://github.com/qarmin/czkawka/pull/1106)
- Added information where are saved scan results - [#1102](https://github.com/qarmin/czkawka/pull/1102)
### CLI
- Providing full static rust binary with [Eyra](https://github.com/sunfishcode/eyra) - [#1102](https://github.com/qarmin/czkawka/pull/1102)
- Fixed duplicated `-c` argument, now saving as compact json is handled via `-C` - [#1153](https://github.com/qarmin/czkawka/pull/1153)
- Added scan progress bar - [#1183](https://github.com/qarmin/czkawka/pull/1183)
- Clean and safe cancelling of scan - [#1183](https://github.com/qarmin/czkawka/pull/1183)
- Unification of CLI arguments - [#1183](https://github.com/qarmin/czkawka/pull/1183)
- Hardlink support for similar images/videos - [#1201](https://github.com/qarmin/czkawka/pull/1201)
### Krokiet GUI
- Initial release of new gui - [#1102](https://github.com/qarmin/czkawka/pull/1102)
### Core
- Using normal crossbeam channels instead of asyncio tokio channel - [#1102](https://github.com/qarmin/czkawka/pull/1102)
- Fixed tool type when using progress of empty directories - [#1102](https://github.com/qarmin/czkawka/pull/1102)
- Fixed missing json support when saving size and name duplicate results - [#1102](https://github.com/qarmin/czkawka/pull/1102)
- Fix cross-compiled debug windows build - [#1102](https://github.com/qarmin/czkawka/pull/1102)
- Added bigger stack size by default(fixes stack overflow in some musl apps) - [#1102](https://github.com/qarmin/czkawka/pull/1102)
- Added optional libraw dependency(better single-core performance and support more raw files) - [#1102](https://github.com/qarmin/czkawka/pull/1102)
- Speedup checking for wildcards and fix invalid recognizing long excluded items - [#1152](https://github.com/qarmin/czkawka/pull/1152)
- Big speedup when searching for empty folders(especially with multithreading + cached FS schema) - [#1152](https://github.com/qarmin/czkawka/pull/1152)
- Collecting files for scan can be a lot of faster due lazy file metadata gathering - [#1152](https://github.com/qarmin/czkawka/pull/1152)
- Fixed recognizing not accessible folders as non-empty - [#1152](https://github.com/qarmin/czkawka/pull/1152)
- Unifying code for collecting files to scan - [#1159](https://github.com/qarmin/czkawka/pull/1159)
- Decrease memory usage when collecting files by removing unused fields in custom file entries structs - [#1159](https://github.com/qarmin/czkawka/pull/1159)
- Decrease a little size of cache by few percents and improve loading/saving speed - [#1159](https://github.com/qarmin/czkawka/pull/1159)
- Added ability to remove from scan files with excluded extensions - [#1184](https://github.com/qarmin/czkawka/pull/1102)
- Fixed not showing in similar images results, files with same hashes when using reference folders - [#1184](https://github.com/qarmin/czkawka/pull/1102)
- Optimize release binaries with LTO(~25/50% smaller, ~5/10% faster) - [#1184](https://github.com/qarmin/czkawka/pull/1102)
## Version 6.1.0 - 15.10.2023r
- BREAKING CHANGE - Changed cache saving method, deduplicated, optimized and simplified procedure(all files needs to be hashed again) - [#1072](https://github.com/qarmin/czkawka/pull/1072), [#1086](https://github.com/qarmin/czkawka/pull/1086)
- Remove up to 340ms of delay when waiting for results - [#1070](https://github.com/qarmin/czkawka/pull/1070)
- Added logger with useful info when debugging app (level can be adjusted via e.g. `RUST_LOG=debug` env) - [#1072](https://github.com/qarmin/czkawka/pull/1072), [#1070](https://github.com/qarmin/czkawka/pull/1070)
- Core code cleanup - [#1072](https://github.com/qarmin/czkawka/pull/1072), [#1070](https://github.com/qarmin/czkawka/pull/1070), [#1082](https://github.com/qarmin/czkawka/pull/1082)
- Updated list of bad extensions and support for finding invalid jar files - [#1070](https://github.com/qarmin/czkawka/pull/1070)
- More default excluded items on Windows(like pagefile) - [#1074](https://github.com/qarmin/czkawka/pull/1074)
- Unified printing/saving method to files/terminal and fixed some differences/bugs - [#1082](https://github.com/qarmin/czkawka/pull/1082)
- Uses fun_time library to print how much functions take time - [#1082](https://github.com/qarmin/czkawka/pull/1082)
- Added exporting results into json file format - [#1083](https://github.com/qarmin/czkawka/pull/1083)
- Added new test/regression suite for CI - [#1083](https://github.com/qarmin/czkawka/pull/1083)
- Added ability to use relative paths - [#1083](https://github.com/qarmin/czkawka/pull/1083)
- Allowed removing similar images/videos/music from cli - [#1087](https://github.com/qarmin/czkawka/pull/1087)
- Added info about saving/loading items to cache in duplicate and music mode - [#1091](https://github.com/qarmin/czkawka/pull/1091)
- Fixed number of files to check in duplicate mode - [#1091](https://github.com/qarmin/czkawka/pull/1091)
- Added support for qoi image format(without preview yet) - [e92a](https://github.com/qarmin/czkawka/commit/e92a8a65de9bd1250be482dbce06959125554849)
- Fixed stability problem, that could remove invalid file in CLI - [#1083](https://github.com/qarmin/czkawka/pull/1083)
- Fix Windows gui crashes by using gtk 4.6 instead 4.8 or 4.10 - [#992](https://github.com/qarmin/czkawka/pull/992)
- Fixed printing info about duplicated music files - [#1016](https://github.com/qarmin/czkawka/pull/1016)
- Fixed printing info about duplicated video files - [#1017](https://github.com/qarmin/czkawka/pull/1017)
## Version 6.0.0 - 11.06.2023r
- Add finding similar audio files by content - [#970](https://github.com/qarmin/czkawka/pull/970)
- Allow to find duplicates by name/size at once - [#956](https://github.com/qarmin/czkawka/pull/956)
- Fix, simplify and speed up finding similar images - [#983](https://github.com/qarmin/czkawka/pull/956)
- Fixed bug when cache for music tags not worked - [#970](https://github.com/qarmin/czkawka/pull/970)
- Allow to set number of threads from CLI - [#972](https://github.com/qarmin/czkawka/pull/972)
- Fix problem with invalid item sorting in bad extensions mode - [#972](https://github.com/qarmin/czkawka/pull/972)
- Big refactor/cleaning of code - [#956](https://github.com/qarmin/czkawka/pull/956)/[#970](https://github.com/qarmin/czkawka/pull/970)/[#972](https://github.com/qarmin/czkawka/pull/972)
- Use builtin gtk webp loader for previews - [#923](https://github.com/qarmin/czkawka/pull/923)
- Fixed docker build - [#947](https://github.com/qarmin/czkawka/pull/947)
- Restore snap builds broken since GTk 4 port - [#965](https://github.com/qarmin/czkawka/pull/947)
- Instruction how to build native ARM64 binaries on Mac - [#945](https://github.com/qarmin/czkawka/pull/945)/[#971](https://github.com/qarmin/czkawka/pull/971)
## Version 5.1.0 - 19.02.2023r
- Added sort button - [#894](https://github.com/qarmin/czkawka/pull/894)
- Allow to set number of thread used to scan - [#839](https://github.com/qarmin/czkawka/pull/839)
- Faster similar images comparing with reference folders - [#826](https://github.com/qarmin/czkawka/pull/826)
- Update to clap 4 - [#878](https://github.com/qarmin/czkawka/pull/878)
- Use FileChooserNative instead FileChooserDialog - [#894](https://github.com/qarmin/czkawka/pull/894)
- Fix invalid music tags in music files when using reference folders - [#894](https://github.com/qarmin/czkawka/pull/894)
- Updated pdf dependency(a lot of less amount of broken pdf false positives) - [#894](https://github.com/qarmin/czkawka/pull/894)
- Changed strange PDF error message - "Try at" - [#894](https://github.com/qarmin/czkawka/pull/894)
- Treat extensions Mp4 and m4v as identical - [#834](https://github.com/qarmin/czkawka/pull/834)
- Improve thumbnail quality - [#895](https://github.com/qarmin/czkawka/pull/895)
- Verify if hardlinking works, and if not, disable button with proper message - [#881](https://github.com/qarmin/czkawka/pull/881)
- Apply some pydantic clippy lints on project - [#901](https://github.com/qarmin/czkawka/pull/901)
## Version 5.0.2 - 30.08.2022r
- Fixed problem with missing some similar images when using similarity > 0 - [#799](https://github.com/qarmin/czkawka/pull/799)
- Prebuilt Linux binaries are compiled without heif support - [24b](https://github.com/qarmin/czkawka/commit/24b64a32c65904c506b54270f0977ccbe5098cc8)
- Similar videos stops to proceed video after certain amount of time(fixes freezes) - [#815](https://github.com/qarmin/czkawka/pull/815)
- Add --version argument for czkawka_cli - [#806](https://github.com/qarmin/czkawka/pull/806)
- Rewrite a little nonsense message about minimal file size - [#807](https://github.com/qarmin/czkawka/pull/807)
## Version 5.0.1 - 03.08.2022r
- Fixed problem with removing ending slash with empty disk window path - [975](https://github.com/qarmin/czkawka/commit/97563a7b2a70fb5fcf6463f28069e6ea3b0ff5c2)
- Added to CLI bad extensions mode - [#795](https://github.com/qarmin/czkawka/pull/795)
- Restore default sorting method in CLI where finding biggest files - [5d7](https://github.com/qarmin/czkawka/commit/5d79dc7ccfee6d5426e37c4e6a860fa555c5927a)
- Added tests to CI - [#791](https://github.com/qarmin/czkawka/pull/791)
- Show error message when all directories are set as reference folders - [#795](https://github.com/qarmin/czkawka/pull/795)
- Added more info about new requirements on Linux - [#795](https://github.com/qarmin/czkawka/pull/795)
## Version 5.0.0 - 28.07.2022r
- GUI ported to use GTK 4 - [#466](https://github.com/qarmin/czkawka/pull/466)
- Use multithreading and improved algorithm to compare image hashes - [#762](https://github.com/qarmin/czkawka/pull/762)
- Resize preview with window - [#466](https://github.com/qarmin/czkawka/pull/466)
- Fix removing only one item from list view - [#466](https://github.com/qarmin/czkawka/pull/466)
- Fix showing help command in duplicate CLI mode - [#720](https://github.com/qarmin/czkawka/pull/720)
- Fix freeze when not choosing any tag in similar music mode - [#732](https://github.com/qarmin/czkawka/pull/732)
- Fix preview of files with non-lowercase extensions - [#694](https://github.com/qarmin/czkawka/pull/694)
- Read more tags from music files - [#705](https://github.com/qarmin/czkawka/pull/705)
- Improve checking for invalid extensions - [#705](https://github.com/qarmin/czkawka/pull/705), [#747](https://github.com/qarmin/czkawka/pull/747), [#749](https://github.com/qarmin/czkawka/pull/749)
- Support for finding invalid PDF files - [#705](https://github.com/qarmin/czkawka/pull/705)
- Re-enable checking for broken music files(`libasound.so.2` no longer needed) - [#705](https://github.com/qarmin/czkawka/pull/705)
- Fix disabled ui when using invalid settings in similar music - [#740](https://github.com/qarmin/czkawka/pull/740)
- Speedup searching for invalid extensions - [#740](https://github.com/qarmin/czkawka/pull/740)
- Support for finding the smallest files - [#741](https://github.com/qarmin/czkawka/pull/741)
- Improved Windows CI - [#749](https://github.com/qarmin/czkawka/pull/749)
- Ability to check for broken files by types - [#749](https://github.com/qarmin/czkawka/pull/749)
- Add heif and Webp files support - [#750](https://github.com/qarmin/czkawka/pull/750)
- Use in CLI Clap library instead StructOpt - [#759](https://github.com/qarmin/czkawka/pull/759)
- Multiple directories can be added via Manual Add button - [#782](https://github.com/qarmin/czkawka/pull/782)
- Option to exclude files from other filesystems in GUI(Linux) - [#776](https://github.com/qarmin/czkawka/pull/776)
## Version 4.1.0 - 24.04.2022r
- New mode - finding files whose content not match with their extension - [#678](https://github.com/qarmin/czkawka/pull/678)
- Builtin icons - no more invalid, theme/OS dependent icons - [#659](https://github.com/qarmin/czkawka/pull/659)
- Builtin icons - no more invalid, theme/OS dependant icons - [#659](https://github.com/qarmin/czkawka/pull/659)
- Big(usually 2x) speedup of showing previews of images(both previews in scan and compare window) - [#660](https://github.com/qarmin/czkawka/pull/660)
- Fix selecting records by custom selection popup - [#632](https://github.com/qarmin/czkawka/pull/632)
- Support more tags when comparing music files - [#590](https://github.com/qarmin/czkawka/pull/590)
@ -148,7 +25,7 @@
- Change minimal supported OS to Ubuntu 20.04(needed by GTK) - [#468](https://github.com/qarmin/czkawka/pull/468)
- Increased performance by avoiding creating unnecessary image previews - [#468](https://github.com/qarmin/czkawka/pull/468)
- Improved performance due caching hash of broken/not supported images/videos = [#471](https://github.com/qarmin/czkawka/pull/471)
- Option to not remove cache from non-existent files(e.g. from unplugged pendrive) - [#472](https://github.com/qarmin/czkawka/pull/472)
- Option to not remove cache from non existent files(e.g. from unplugged pendrive) - [#472](https://github.com/qarmin/czkawka/pull/472)
- Add multiple tooltips with helpful messages - [#472](https://github.com/qarmin/czkawka/pull/472)
- Allow caching prehash - [#477](https://github.com/qarmin/czkawka/pull/477)
- Improve custom selecting of records(allows to use Rust regex) - [#489](https://github.com/qarmin/czkawka/pull/478)
@ -173,7 +50,7 @@
- Add additional info to printed errors [#446](https://github.com/qarmin/czkawka/pull/446)
- Add support for multiple image filters, hashes and sizes in similar images tool [#447](https://github.com/qarmin/czkawka/pull/447), [#448](https://github.com/qarmin/czkawka/pull/448)
- Button to move files/folders to provided location [#449](https://github.com/qarmin/czkawka/pull/449)
- Add non-clickable button to fix white theme [#450](https://github.com/qarmin/czkawka/pull/450)
- Add non clickable button to fix white theme [#450](https://github.com/qarmin/czkawka/pull/450)
- Fixed freeze when opening in same thread file/folder [#448](https://github.com/qarmin/czkawka/pull/448)
- Tool to check performance of different image filters and hash types and sizes [#447](https://github.com/qarmin/czkawka/pull/447)
- Add scheduled CI and pin it to support Rust 1.53.0 [7bb](https://github.com/qarmin/czkawka/commit/7bbdf742739a513b80d0cc06ba61dfafec976b23), [#431](https://github.com/qarmin/czkawka/pull/431)
@ -183,7 +60,7 @@
## Version 3.2.0 - 07.08.2021r
- Use checkbox instead selection to select files [#392](https://github.com/qarmin/czkawka/pull/392)
- Re-enable hardlink on windows - [#410](https://github.com/qarmin/czkawka/pull/410)
- Fix symlink and hardlink creating - [#409](https://github.com/qarmin/czkawka/pull/409)
- Fix symlink and harlink creating - [#409](https://github.com/qarmin/czkawka/pull/409)
- Add image preview to duplicate finder [#408](https://github.com/qarmin/czkawka/pull/408)
- Add setting maximum file size [#407](https://github.com/qarmin/czkawka/pull/407)
- Add new grouping algorithm to similar images [#405](https://github.com/qarmin/czkawka/pull/405)
@ -233,7 +110,7 @@
- Add support for CRC32 and XXH3 hash - [#243](https://github.com/qarmin/czkawka/pull/243)
- Add delete method to replace duplicate files with hard links - [#236](https://github.com/qarmin/czkawka/pull/236)
- Add checking for broken music opt-in - [#249](https://github.com/qarmin/czkawka/pull/249)
- Allow to save to file similar images results - [10156ccfd3](https://github.com/qarmin/czkawka/commit/10156ccfd3ba880d26d4bbad1e025b0050d7753b)
- Allow to save to files similar images results - [10156ccfd3](https://github.com/qarmin/czkawka/commit/10156ccfd3ba880d26d4bbad1e025b0050d7753b)
- Keep original file if replacing duplicate with hardlink fails - [#256](https://github.com/qarmin/czkawka/pull/256)
- Fix Windows theme - [#265](https://github.com/qarmin/czkawka/pull/265)
- Windows taskbar progress support - [#264](https://github.com/qarmin/czkawka/pull/264)
@ -279,7 +156,7 @@ This version is only needed to test flatpak build
- Add support for delete button - [#159](https://github.com/qarmin/czkawka/pull/159)
- Allow to select multiple entries in File Chooser - [#154](https://github.com/qarmin/czkawka/pull/154)
- Add cache support for similar images - [#139](https://github.com/qarmin/czkawka/pull/139)
- Add selecting images with its size - [#138](https://github.com/qarmin/czkawka/pull/138)
- Add selecting images with it's size - [#138](https://github.com/qarmin/czkawka/pull/138)
- Modernize popovers code and simplify later changes - [#137](https://github.com/qarmin/czkawka/pull/137)
## Version 2.0.0 - 23.12.2020r
@ -323,7 +200,7 @@ This version is only needed to test flatpak build
## Version 1.3.0 - 02.11.2020r
- Appimage support - [#77](https://github.com/qarmin/czkawka/pull/77)
- Removed warnings about non-existed excluded directories - [#79](https://github.com/qarmin/czkawka/pull/79)
- Removed warnings about non existend excluded directories - [#79](https://github.com/qarmin/czkawka/pull/79)
- Updated README - [8ec](https://github.com/qarmin/czkawka/commit/8ecde0fc9adb3e6cedf432c4ba749e698b645a7a)
- Added pre hash support(speedup for searching big duplicates) - [#83](https://github.com/qarmin/czkawka/pull/83)
- Support for searching duplicates by file name - [#84](https://github.com/qarmin/czkawka/pull/84)
@ -357,7 +234,7 @@ This version is only needed to test flatpak build
## Version 1.0.1 - 06.10.2020r
- Replaced default argument parser with StructOpt [#37](https://github.com/qarmin/czkawka/pull/37)
- Added all(except macOS GTK build) builds to CI where can be freely downloaded [#41](https://github.com/qarmin/czkawka/pull/41) [#39](https://github.com/qarmin/czkawka/pull/39)
- Added all(except MacOS GTK build) builds to CI where can be freely downloaded [#41](https://github.com/qarmin/czkawka/pull/41) [#39](https://github.com/qarmin/czkawka/pull/39)
- App can be downloaded also from Arch AUR and Cargo [#36](https://github.com/qarmin/czkawka/pull/36)
- Fixed crash with invalid file modification date [#33](https://github.com/qarmin/czkawka/issues/33)
- Upper tabs can hide and show when this is necessary [#38](https://github.com/qarmin/czkawka/pull/38)
@ -408,11 +285,11 @@ This version is only needed to test flatpak build
- Basic search in GTK
- Cleaned core from println
- Core functions doesn't use now process::exit(everything is done with help of messages/errors/warnings)
- Added support for non-recursive search
- Added support for non recursive search
- Improved finding number and size of duplicated files
- Saving results to file
- Print how much data was read by duplicate finder(debug only)
- Added GitHub CI
- Added Github CI
- Only debug build prints debug information's
- Clean code
- Add basic idea config to misc folder

@ -1,6 +1,6 @@
MIT License
Copyright (c) 2020-2024 Rafał Mikrut
Copyright (c) 2020-2022 Rafał Mikrut
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@ -369,7 +369,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Icons used inside GUI version
Reshot license - https://www.reshot.com/
Reshot license
czkawka_gui/icons/*

@ -1,149 +1,182 @@
![com github qarmin czkawka](https://user-images.githubusercontent.com/41945903/102616149-66490400-4137-11eb-9cd6-813b2b070834.png)
**Czkawka** (_tch•kav•ka_ (IPA: [ˈʧ̑kafka]), "hiccup" in Polish) is a simple, fast and free app to remove unnecessary
files from your computer.
**Krokiet** ((IPA: [ˈkrɔcɛt]), "croquet" in Polish) same as above, but uses Slint frontend.
**Czkawka** (_tch•kav•ka_ (IPA: [ʈ͡ʂkafka]), "hiccup" in Polish) is a simple, fast and free app to remove unnecessary files from your computer.
## Features
- Written in memory-safe Rust
- Amazingly fast - due to using more or less advanced algorithms and multithreading
- Free, Open Source without ads
- Multiplatform - works on Linux, Windows, macOS, FreeBSD and many more
- Cache support - second and further scans should be much faster than the first one
- CLI frontend - for easy automation
- GUI frontend - uses GTK 4 or Slint frameworks
- GUI frontend - uses modern GTK 3 and looks similar to FSlint
- No spying - Czkawka does not have access to the Internet, nor does it collect any user information or statistics
- Multilingual - support multiple languages like Polish, English or Italian
- Multiple tools to use:
- Duplicates - Finds duplicates based on file name, size or hash
- Empty Folders - Finds empty folders with the help of an advanced algorithm
- Big Files - Finds the provided number of the biggest files in given location
- Empty Files - Looks for empty files across the drive
- Temporary Files - Finds temporary files
- Similar Images - Finds images which are not exactly the same (different resolution, watermarks)
- Similar Videos - Looks for visually similar videos
- Same Music - Searches for similar music by tags or by reading content and comparing it
- Invalid Symbolic Links - Shows symbolic links which point to non-existent files/directories
- Broken Files - Finds files that are invalid or corrupted
- Bad Extensions - Lists files whose content not match with their extension
- Duplicates - Finds duplicates based on file name, size or hash
- Empty Folders - Finds empty folders with the help of an advanced algorithm
- Big Files - Finds the provided number of the biggest files in given location
- Empty Files - Looks for empty files across the drive
- Temporary Files - Finds temporary files
- Similar Images - Finds images which are not exactly the same (different resolution, watermarks)
- Similar Videos - Looks for visually similar videos
- Same Music - Searches for music with the same artist, album etc.
- Invalid Symbolic Links - Shows symbolic links which point to non-existent files/directories
- Broken Files - Finds files that are invalid or corrupted
- Bad Extensions - List files whose content not match with they extension
<!-- The GIF thingy -->
![Czkawka](https://user-images.githubusercontent.com/41945903/145280350-506f7e94-4db0-4de7-a68d-6e7c26bbd2bf.gif)
![Krokiet](https://github.com/qarmin/czkawka/assets/41945903/52628a29-ecd6-4692-9ee4-8a680c889193)
## How do I use it?
You can find the instructions on how to use Czkawka [**here**](instructions/Instruction.md).
Changelog and new releases can be found in [Github releases](https://github.com/qarmin/czkawka/releases) or
in [CHANGELOG.md](CHANGELOG.md).
Some helpful tricks you can find [**here**](instructions/Instruction.md#tips-tricks-and-known-bugs)
More about latest version, you can find [in Medium article](https://medium.com/@qarmin/czkawka-7-0-a465036e8788)
## Installation
Installation instructions with download links you can find [**here**](instructions/Installation.md).
## Usage, installation, compilation, requirements, license
## Compilation
If you want to try and develop Czkawka or just use the latest available feature, you may want to look at the [**compilation instruction**](instructions/Compilation.md).
Each tool uses different technologies, so you can find instructions for each of them in the appropriate file:
## Benchmarks
- [Czkawka GUI (GTK frontend)](czkawka_gui/README.md)</br>
- [Czkawka CLI](czkawka_cli/README.md)</br>
- [Czkawka Core](czkawka_core/README.md)</br>
- [Krokiet GUI (Slint frontend)](krokiet/README.md)</br>
Since Czkawka is written in Rust and it aims to be a faster alternative to FSlint or DupeGuru which are written in Python, we need to compare the speed of these tools.
## Comparison to other tools
I tested it on a 256 GB SSD and a i7-4770 CPU.
Bleachbit is a master at finding and removing temporary files, while Czkawka only finds the most basic ones. So these
two apps shouldn't be compared directly or be considered as an alternative to one another.
In this comparison remember, that even if app have same features they may work different(e.g. one app may have more
options to choose than other).
| | Czkawka | Krokiet | FSlint | DupeGuru | Bleachbit |
|:------------------------:|:-----------:|:-----------:|:------:|:-----------------:|:-----------:|
| Language | Rust | Rust | Python | Python/Obj-C | Python |
| Framework base language | C | Rust | C | C/C++/Obj-C/Swift | C |
| Framework | GTK 4 | Slint | PyGTK2 | Qt 5 (PyQt)/Cocoa | PyGTK3 |
| OS | Lin,Mac,Win | Lin,Mac,Win | Lin | Lin,Mac,Win | Lin,Mac,Win |
| Duplicate finder | ✔ | ✔ | ✔ | ✔ | |
| Empty files | ✔ | ✔ | ✔ | | |
| Empty folders | ✔ | ✔ | ✔ | | |
| Temporary files | ✔ | ✔ | ✔ | | ✔ |
| Big files | ✔ | ✔ | | | |
| Similar images | ✔ | ✔ | | ✔ | |
| Similar videos | ✔ | ✔ | | | |
| Music duplicates(tags) | ✔ | ✔ | | ✔ | |
| Invalid symlinks | ✔ | ✔ | ✔ | | |
| Broken files | ✔ | ✔ | | | |
| Names conflict | ✔ | ✔ | ✔ | | |
| Invalid names/extensions | ✔ | ✔ | ✔ | | |
| Installed packages | | | ✔ | | |
| Bad ID | | | ✔ | | |
| Non stripped binaries | | | ✔ | | |
| Redundant whitespace | | | ✔ | | |
| Overwriting files | | | ✔ | | ✔ |
| Multiple languages | ✔ | | ✔ | ✔ | ✔ |
| Cache support | ✔ | ✔ | | ✔ | |
| In active development | Yes | Yes | No | Yes | Yes |
I prepared a disk and performed a test without any folder exceptions and with disabled ignoring of hard links. The disk contained 363 215 files, took 221,8 GB and had 62093 duplicate files in 31790 groups which occupied 4,1 GB.
## Other apps
I set the minimal file size to check to 1KB on all programs.
There are many similar applications to Czkawka on the Internet, which do some things better and some things worse:
| App | Executing Time |
|:---------------------------:|:--------------:|
| FSlint 2.4.7 (First Run) | 86s |
| FSlint 2.4.7 (Second Run) | 43s |
| Czkawka 3.0.0 (First Run) | 8s |
| Czkawka 3.0.0 (Second Run) | 7s |
| DupeGuru 4.1.1 (First Run) | 22s |
| DupeGuru 4.1.1 (Second Run) | 21s |
### GUI
I used Mprof for checking memory usage of FSlint and DupeGuru, and Heaptrack for Czkawka.
| App | Idle Ram | Max Operational Ram Usage | Stabilized after search |
|:--------------:|:--------:|:-------------------------:|:-----------------------:|
| FSlint 2.4.7 | 62 MB | 164 MB | 158 MB |
| Dupeguru 4.1.1 | 90 MB | 170 MB | 166 MB |
| Czkawka 3.0.0 | 12 MB | 122 MB | 60 MB |
In Dupeguru, I enabled checking images with different dimensions to match Czkawka behavior.
Both apps use a caching mechanism, so the second scan is really fast.
Similar images which check 10949 files that occupied 6.6 GB
| App | Scan time |
|:---------------------------:|:---------:|
| Czkawka 3.0.0 (First Run) | 276s |
| Czkawka 3.0.0 (Second Run) | 1s |
| DupeGuru 4.1.1 (First Run) | 539s |
| DupeGuru 4.1.1 (Second Run) | 1s |
Similar images which check 349 image files that occupied 1.7 GB
| App | Scan time |
|:---------------------------:|:----------|
| Czkawka 3.0.0 (First Run) | 54s |
| Czkawka 3.0.0 (Second Run) | 1s |
| DupeGuru 4.1.1 (First Run) | 55s |
| DupeGuru 4.1.1 (Second Run) | 1s |
## Comparison to other tools
Bleachbit is a master at finding and removing temporary files, while Czkawka only finds the most basic ones. So these two apps shouldn't be compared directly or be considered as an alternative to one another.
| | Czkawka | FSlint | DupeGuru | Bleachbit |
|:------------------------:|:-----------:|:----------:|:-----------------:|:-----------:|
| Language | Rust | Python | Python/Obj-C | Python |
| OS | Lin,Mac,Win | Lin | Lin,Mac,Win | Lin,Mac,Win |
| Framework | GTK 3 | PyGTK2 | Qt 5 (PyQt)/Cocoa | PyGTK3 |
| Duplicate finder | • | • | • | |
| Empty files | • | • | | |
| Empty folders | • | • | | |
| Temporary files | • | • | | • |
| Big files | • | | | |
| Similar images | • | | • | |
| Similar videos | • | | | |
| Music duplicates(tags) | • | | • | |
| Invalid symlinks | • | • | | |
| Broken files | • | | | |
| Names conflict | • | • | | |
| Invalid names/extensions | • | • | | |
| Installed packages | | • | | |
| Bad ID | | • | | |
| Non stripped binaries | | • | | |
| Redundant whitespace | | • | | |
| Overwriting files | | • | | • |
| Multiple languages | • | • | • | • |
| Cache support | • | | • | |
| In active development | Yes | No | Yes | Yes |
## Other apps
There are many similar applications to Czkawka on the Internet, which do some things better and some things worse:
### GUI
- [DupeGuru](https://github.com/arsenetar/dupeguru) - Many options to customize; great photo compare tool
- [FSlint](https://github.com/pixelb/fslint) - A little outdated, but still have some tools not available in Czkawka
- [AntiDupl.NET](https://github.com/ermig1979/AntiDupl) - Shows a lot of metadata of compared images
- [Video Duplicate Finder](https://github.com/0x90d/videoduplicatefinder) - Finds similar videos(surprising, isn't it),
supports video thumbnails
- [Video Duplicate Finder](https://github.com/0x90d/videoduplicatefinder) - Finds similar videos(surprising, isn't it), supports video thumbnails
### CLI
Due to limited time, the biggest emphasis is on the GUI version so if you are looking for really good and feature-packed
console apps, then take a look at these:
- [Fclones](https://github.com/pkolaczk/fclones) - One of the fastest tools to find duplicates; it is written also in
Rust
- [Rmlint](https://github.com/sahib/rmlint) - Nice console interface and also is feature packed
Due to limited time, the biggest emphasis is on the GUI version so if you are looking for really good and feature-packed console apps, then take a look at these:
- [Fclones](https://github.com/pkolaczk/fclones) - One of the fastest tools to find duplicates; it is written also in Rust
- [Rmlint](https://github.com/sahib/rmlint) - Really good console interface and also is feature packed
- [RdFind](https://github.com/pauldreik/rdfind) - Fast, but written in C++ ¯\\\_(ツ)\_/¯
## Contributions
Contributions to this repository are welcome.
You can help by creating:
- Bug reports - memory leaks, unexpected behavior, crashes
- Feature proposals - proposal to change/add/delete some features
- Pull Requests - implementing a new feature yourself or fixing bugs.
If the change is bigger, then it's a good idea to open a new issue to discuss changes, but issues with
label `PR welcome` are already checked and accepted.
If the change is bigger, then it's a good idea to open a new issue to discuss changes.
- Documentation - There is an [instruction](instructions/Instruction.md) which you can improve.
- Translations - Instruction how to translate files is available [here](instructions/Translations.md)
- External contributions - App use big number of external libraries
like [lofty](https://github.com/Serial-ATA/lofty-rs), [image-rs](https://github.com/image-rs/image)
or [symphonia](https://github.com/pdeljanov/Symphonia) so improving this libraries will automatically improve Czkawka
You can also help by doing other things:
- Creating text
articles - [LinuxUprising](https://www.linuxuprising.com/2021/03/find-and-remove-duplicate-files-similar.html)
or [Ubunlog](https://ubunlog.com/en/czkawka-finds-and-removes-empty-and-broken-duplicate-files/)
- Adding Czkawka to repositories - [Alpine Linux](https://pkgs.alpinelinux.org/packages?name=czkawka&branch=edge)
or [NixOS](https://github.com/NixOS/nixpkgs/pull/116441)
or [OpenMandriva](https://github.com/OpenMandrivaAssociation/czkawka)
- Creating videos - [First Video](https://www.youtube.com/watch?v=CWlRiTD4vDc)
or [Spanish Tutorial](https://www.youtube.com/watch?v=V9x-pHJRmKY)
- Creating text articles - [LinuxUprising](https://www.linuxuprising.com/2021/03/find-and-remove-duplicate-files-similar.html) or [Ubunlog](https://ubunlog.com/en/czkawka-finds-and-removes-empty-and-broken-duplicate-files/)
- Adding Czkawka to repositories - [Alpine Linux](https://pkgs.alpinelinux.org/packages?name=czkawka&branch=edge) or [NixOS](https://github.com/NixOS/nixpkgs/pull/116441) or [OpenMandriva](https://github.com/OpenMandrivaAssociation/czkawka)
- Creating videos - [First Video](https://www.youtube.com/watch?v=CWlRiTD4vDc) or [Spanish Tutorial](https://www.youtube.com/watch?v=V9x-pHJRmKY)
- Recommending it to others
## Name
Czkawka is a Polish word which means _hiccup_.
I chose this name because I wanted to hear people speaking other languages pronounce it, so feel free to spell it the way you want.
This name is not as bad as it seems, because I was also thinking about using words like _żółć_, _gżegżółka_ or _żołądź_,
but I gave up on these ideas because they contained Polish characters, which would cause difficulty in searching for the project.
At the beginning of the program creation, if the response concerning the name was unanimously negative, I prepared myself
for a possible change of the name of the program, and the opinions were extremely mixed.
## License
Code is distributed under MIT license.
Icon was created by [jannuary](https://github.com/jannuary) and licensed CC-BY-4.0.
Windows dark theme is used from [AdMin repo](https://github.com/nrhodes91/AdMin) with MIT license.
Some icons were taken from [ReShot](https://www.reshot.com) site and are licensed under Reshot Free License
The program is completely free to use.
"Gratis to uczciwa cena" - "Free is a fair price"
## Thanks
Big thanks to Pádraig Brady, creator of fantastic FSlint, because without his work I wouldn't create this tool.
Thanks also to all the people who create patches for this program, make it available on other systems, create videos,
articles about it etc.
Also, I really appreciate work of people that create crates on which Czkawka is based and for that I try to report bugs
to make it even better.
Thanks also to all the people who create patches for this program, make it available on other systems, create videos, articles about it etc.
## Donations
If you are using the app, I would appreciate a donation for its further development, which can be
done [here](https://github.com/sponsors/qarmin).
If you are using the app, I would appreciate a donation for its further development, which can be done [here](https://github.com/sponsors/qarmin).

@ -1,11 +0,0 @@
[package]
name = "ci_tester"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
state = "0.6.0"
handsome_logger = "0.8.0"
log = "0.4.20"

@ -1,339 +0,0 @@
use std::collections::BTreeSet;
use std::fs;
use std::process::Command;
use std::process::Stdio;
use log::info;
#[derive(Default, Clone, Debug)]
struct CollectedFiles {
files: BTreeSet<String>,
folders: BTreeSet<String>,
symlinks: BTreeSet<String>,
}
static CZKAWKA_PATH: state::InitCell<String> = state::InitCell::new();
static COLLECTED_FILES: state::InitCell<CollectedFiles> = state::InitCell::new();
const ATTEMPTS: u32 = 10;
const PRINT_MESSAGES_CZKAWKA: bool = true;
// App runs - ./ci_tester PATH_TO_CZKAWKA
fn main() {
handsome_logger::init().unwrap();
let args: Vec<String> = std::env::args().collect();
let path_to_czkawka = args[1].clone();
CZKAWKA_PATH.set(path_to_czkawka);
remove_test_dir();
run_with_good_status(&["ls"], false);
unzip_files();
let all_files = collect_all_files_and_dirs("TestFiles").unwrap();
COLLECTED_FILES.set(all_files);
remove_test_dir();
for _ in 0..ATTEMPTS {
test_empty_files();
test_smallest_files();
test_biggest_files();
test_empty_folders();
test_temporary_files();
test_symlinks_files();
test_remove_duplicates_one_oldest();
test_remove_duplicates_one_newest();
test_remove_duplicates_all_expect_newest();
test_remove_duplicates_all_expect_oldest();
test_remove_same_music_tags_one_oldest();
test_remove_same_music_tags_one_newest();
test_remove_same_music_tags_all_expect_oldest();
test_remove_same_music_tags_all_expect_newest();
test_remove_same_music_content_one_oldest();
test_remove_same_music_content_all_expect_oldest();
test_remove_same_music_content_one_newest();
test_remove_same_music_content_all_expect_newest();
test_remove_videos_one_oldest();
test_remove_videos_one_newest();
test_remove_videos_all_expect_oldest();
test_remove_videos_all_expect_newest();
}
println!("Completed checking");
}
fn test_remove_videos_one_oldest() {
info!("test_remove_videos_one_oldest");
run_test(&["video", "-d", "TestFiles", "-D", "OO"], vec!["Videos/V3.webm"], vec![], vec![]);
}
fn test_remove_videos_one_newest() {
info!("test_remove_videos_one_newest");
run_test(&["video", "-d", "TestFiles", "-D", "ON"], vec!["Videos/V5.mp4"], vec![], vec![]);
}
fn test_remove_videos_all_expect_oldest() {
info!("test_remove_videos_all_expect_oldest");
run_test(
&["video", "-d", "TestFiles", "-D", "AEO"],
vec!["Videos/V1.mp4", "Videos/V2.mp4", "Videos/V5.mp4"],
vec![],
vec![],
);
}
fn test_remove_videos_all_expect_newest() {
info!("test_remove_videos_all_expect_newest");
run_test(
&["video", "-d", "TestFiles", "-D", "AEN"],
vec!["Videos/V1.mp4", "Videos/V2.mp4", "Videos/V3.webm"],
vec![],
vec![],
);
}
fn test_remove_same_music_content_one_newest() {
info!("test_remove_same_music_content_one_newest");
run_test(
&["music", "-d", "TestFiles", "-s", "CONTENT", "-l", "2.0", "-D", "ON"],
vec!["Music/M2.mp3"],
vec![],
vec![],
);
}
fn test_remove_same_music_content_all_expect_newest() {
info!("test_remove_same_music_content_all_expect_newest");
run_test(
&["music", "-d", "TestFiles", "-s", "CONTENT", "-l", "2.0", "-D", "AEN"],
vec!["Music/M1.mp3", "Music/M3.flac", "Music/M5.mp3"],
vec![],
vec![],
);
}
fn test_remove_same_music_content_all_expect_oldest() {
info!("test_remove_same_music_content_all_expect_oldest");
run_test(
&["music", "-d", "TestFiles", "-s", "CONTENT", "-l", "2.0", "-D", "AEO"],
vec!["Music/M1.mp3", "Music/M2.mp3", "Music/M3.flac"],
vec![],
vec![],
);
}
fn test_remove_same_music_content_one_oldest() {
info!("test_remove_same_music_content_one_oldest");
run_test(
&["music", "-d", "TestFiles", "-s", "CONTENT", "-l", "2.0", "-D", "OO"],
vec!["Music/M5.mp3"],
vec![],
vec![],
);
}
fn test_remove_same_music_tags_one_oldest() {
info!("test_remove_same_music_one_oldest");
run_test(&["music", "-d", "TestFiles", "-D", "OO"], vec!["Music/M5.mp3"], vec![], vec![]);
}
fn test_remove_same_music_tags_one_newest() {
info!("test_remove_same_music_one_newest");
run_test(&["music", "-d", "TestFiles", "-D", "ON"], vec!["Music/M2.mp3"], vec![], vec![]);
}
fn test_remove_same_music_tags_all_expect_oldest() {
info!("test_remove_same_music_all_expect_oldest");
run_test(
&["music", "-d", "TestFiles", "-D", "AEO"],
vec!["Music/M1.mp3", "Music/M2.mp3", "Music/M3.flac"],
vec![],
vec![],
);
}
fn test_remove_same_music_tags_all_expect_newest() {
info!("test_remove_same_music_all_expect_newest");
run_test(
&["music", "-d", "TestFiles", "-D", "AEN"],
vec!["Music/M1.mp3", "Music/M3.flac", "Music/M5.mp3"],
vec![],
vec![],
);
}
fn test_remove_duplicates_all_expect_oldest() {
info!("test_remove_duplicates_all_expect_oldest");
run_test(
&["dup", "-d", "TestFiles", "-D", "AEO"],
vec!["Images/A1.jpg", "Images/A5.jpg", "Music/M1.mp3", "Music/M2.mp3", "Videos/V1.mp4", "Videos/V5.mp4"],
vec![],
vec![],
);
}
fn test_remove_duplicates_all_expect_newest() {
info!("test_remove_duplicates_all_expect_newest");
run_test(
&["dup", "-d", "TestFiles", "-D", "AEN"],
vec!["Images/A2.jpg", "Images/A5.jpg", "Music/M1.mp3", "Music/M5.mp3", "Videos/V1.mp4", "Videos/V2.mp4"],
vec![],
vec![],
);
}
fn test_remove_duplicates_one_newest() {
info!("test_remove_duplicates_one_newest");
run_test(
&["dup", "-d", "TestFiles", "-D", "ON"],
vec!["Images/A1.jpg", "Music/M2.mp3", "Videos/V5.mp4"],
vec![],
vec![],
);
}
fn test_remove_duplicates_one_oldest() {
info!("test_remove_duplicates_one_oldest");
run_test(
&["dup", "-d", "TestFiles", "-D", "OO"],
vec!["Images/A2.jpg", "Music/M5.mp3", "Videos/V2.mp4"],
vec![],
vec![],
);
}
fn test_symlinks_files() {
info!("test_symlinks_files");
run_test(&["symlinks", "-d", "TestFiles", "-D"], vec![], vec![], vec!["Symlinks/EmptyFiles"]);
}
fn test_temporary_files() {
info!("test_temporary_files");
run_test(&["temp", "-d", "TestFiles", "-D"], vec!["Temporary/Boczze.cache"], vec![], vec![]);
}
fn test_empty_folders() {
info!("test_empty_folders");
run_test(
&["empty-folders", "-d", "TestFiles", "-D"],
vec![],
vec!["EmptyFolders/One", "EmptyFolders/Two", "EmptyFolders/Two/TwoInside"],
vec![],
);
}
fn test_biggest_files() {
info!("test_biggest_files");
run_test(
&["big", "-d", "TestFiles", "-n", "6", "-D"],
vec!["Music/M3.flac", "Music/M4.mp3", "Videos/V2.mp4", "Videos/V3.webm", "Videos/V1.mp4", "Videos/V5.mp4"],
vec![],
vec![],
);
}
fn test_smallest_files() {
info!("test_smallest_files");
run_test(
&["big", "-d", "TestFiles", "-J", "-n", "5", "-D"],
vec!["Broken/Br.jpg", "Broken/Br.mp3", "Broken/Br.pdf", "Broken/Br.zip", "EmptyFolders/ThreeButNot/KEKEKE"],
vec![],
vec![],
);
}
fn test_empty_files() {
info!("test_empty_files");
run_test(&["empty-files", "-d", "TestFiles", "-D"], vec!["EmptyFile"], vec![], vec![]);
}
////////////////////////////////////
////////////////////////////////////
/////////HELPER FUNCTIONS///////////
////////////////////////////////////
////////////////////////////////////
fn run_test(arguments: &[&str], expected_files_differences: Vec<&'static str>, expected_folders_differences: Vec<&'static str>, expected_symlinks_differences: Vec<&'static str>) {
unzip_files();
// Add path_to_czkawka to arguments
let mut all_arguments = vec![];
all_arguments.push(CZKAWKA_PATH.get().as_str());
all_arguments.extend_from_slice(arguments);
run_with_good_status(&all_arguments, PRINT_MESSAGES_CZKAWKA);
file_folder_diffs(
COLLECTED_FILES.get(),
expected_files_differences,
expected_folders_differences,
expected_symlinks_differences,
);
remove_test_dir();
}
fn unzip_files() {
run_with_good_status(&["unzip", "-X", "TestFiles.zip", "-d", "TestFiles"], false);
}
fn remove_test_dir() {
let _ = fs::remove_dir_all("TestFiles");
}
fn run_with_good_status(str_command: &[&str], print_messages: bool) {
let mut command = Command::new(str_command[0]);
let mut com = command.args(&str_command[1..]);
if !print_messages {
com = com.stderr(Stdio::piped()).stdout(Stdio::piped());
}
let status = com.spawn().expect("failed to execute process").wait().unwrap();
assert!(status.success());
}
fn file_folder_diffs(
all_files: &CollectedFiles,
mut expected_files_differences: Vec<&'static str>,
mut expected_folders_differences: Vec<&'static str>,
mut expected_symlinks_differences: Vec<&'static str>,
) {
let current_files = collect_all_files_and_dirs("TestFiles").unwrap();
let mut diff_files = all_files
.files
.difference(&current_files.files)
.map(|e| e.strip_prefix("TestFiles/").unwrap().to_string())
.collect::<Vec<_>>();
let mut diff_folders = all_files
.folders
.difference(&current_files.folders)
.map(|e| e.strip_prefix("TestFiles/").unwrap().to_string())
.collect::<Vec<_>>();
let mut diff_symlinks = all_files
.symlinks
.difference(&current_files.symlinks)
.map(|e| e.strip_prefix("TestFiles/").unwrap().to_string())
.collect::<Vec<_>>();
expected_symlinks_differences.sort();
expected_folders_differences.sort();
expected_files_differences.sort();
diff_files.sort();
diff_folders.sort();
diff_symlinks.sort();
assert_eq!(diff_files, expected_files_differences);
assert_eq!(diff_folders, expected_folders_differences);
assert_eq!(diff_symlinks, expected_symlinks_differences);
}
fn collect_all_files_and_dirs(dir: &str) -> std::io::Result<CollectedFiles> {
let mut files = BTreeSet::new();
let mut folders = BTreeSet::new();
let mut symlinks = BTreeSet::new();
let mut folders_to_check = vec![dir.to_string()];
while !folders_to_check.is_empty() {
let folder = folders_to_check.pop().unwrap();
let rd = fs::read_dir(folder)?;
for entry in rd {
let entry = entry?;
let file_type = entry.file_type()?;
let path_str = entry.path().to_string_lossy().to_string();
if file_type.is_dir() {
folders.insert(path_str.clone());
folders_to_check.push(path_str);
} else if file_type.is_symlink() {
symlinks.insert(path_str);
} else if file_type.is_file() {
files.insert(path_str);
} else {
panic!("Unknown type of file {path_str:?}");
}
}
}
folders.remove(dir);
// println!("Found {} files, {} folders and {} symlinks", files.len(), folders.len(), symlinks.len());
Ok(CollectedFiles { files, folders, symlinks })
}

@ -1,29 +1,16 @@
[package]
name = "czkawka_cli"
version = "7.0.0"
version = "4.1.0"
authors = ["Rafał Mikrut <mikrutrafal@protonmail.com>"]
edition = "2021"
rust-version = "1.75.0"
description = "CLI frontend of Czkawka"
license = "MIT"
homepage = "https://github.com/qarmin/czkawka"
repository = "https://github.com/qarmin/czkawka"
[dependencies]
clap = { version = "4.5", features = ["derive"] }
czkawka_core = { path = "../czkawka_core", version = "4.1.0" }
structopt = "0.3.26"
# For enum types
image_hasher = "1.2"
log = "0.4.20"
handsome_logger = "0.8"
fun_time = { version = "0.3", features = ["log"] }
czkawka_core = { path = "../czkawka_core", version = "7.0.0", features = [] }
indicatif = "0.17"
crossbeam-channel = { version = "0.5", features = [] }
ctrlc = { version = "3.4", features = ["termination"] }
[features]
default = []
heif = ["czkawka_core/heif"]
libraw = ["czkawka_core/libraw"]
image_hasher = "1.0.0"

@ -1,21 +0,0 @@
MIT License
Copyright (c) 2020-2024 Rafał Mikrut
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.

@ -1,44 +0,0 @@
# Czkawka CLI
CLI frontend, allows to use Czkawka from terminal.
## Requirements
Precompiled binaries should work without any additional dependencies with Linux(Ubuntu 20.04+), Windows(10+) and macOS(10.15+).
If you decide to compile the app, you probably will be able to run it on even older versions of OS, like Ubuntu 16.04 or Windows 7.
On linux it is even possible with eyra to avoid entirely libc and using fully static rust binary.
If you want to use similar videos tool, you need to install ffmpeg(runtime dependency) or use heif/libraw(build/runtime dependency) you need to install required packages.
- mac - `brew install ffmpeg libraw libheif` - https://formulae.brew.sh/formula/ffmpeg
- linux - `sudo apt install ffmpeg libraw-dev libheif-dev`
- windows - `choco install ffmpeg` - or if not working, download from https://ffmpeg.org/download.html#build-windows and unpack to location with `czkawka_cli.exe`, heif and libraw are not supported on windows
## Compilation
For compilation, you need to have installed Rust via rustup - https://rustup.rs/ and compile it e.g. via
```shell
cargo run --release --bin czkawka_cli
```
you can enable additional features via
```shell
cargo run --release --bin czkawka_cli --features "heif,libraw"
```
on linux to build fully static binary with eyra you need to use (this is only for crazy people, so just use command above if you don't know what you are doing)
```shell
rustup default nightly-2024-02-06 # or any newer nightly that works fine with eyra
cd czkawka_cli
cargo add eyra --rename=std
echo 'fn main() { println!("cargo:rustc-link-arg=-nostartfiles"); }' > build.rs
cd ..
cargo build --release --bin czkawka_cli
```
## Limitations
Not all available features in core are available in CLI.
List of not available features:
- Ability to use/choose referenced directories
- See progress of scanning
## LICENSE
MIT

@ -1 +0,0 @@
../data/

@ -1,495 +1,327 @@
use std::path::PathBuf;
use image_hasher::{FilterType, HashAlg};
use structopt::StructOpt;
use czkawka_core::common_dir_traversal::CheckingMethod;
use czkawka_core::common_tool::DeleteMethod;
use czkawka_core::duplicate::HashType;
use czkawka_core::duplicate::{DeleteMethod, HashType};
use czkawka_core::same_music::MusicSimilarity;
use czkawka_core::similar_images::SimilarityPreset;
use czkawka_core::CZKAWKA_VERSION;
#[derive(clap::Parser)]
#[clap(
name = "czkawka",
help_template = HELP_TEMPLATE,
version = CZKAWKA_VERSION
)]
pub struct Args {
#[command(subcommand)]
pub command: Commands,
}
#[derive(Debug, clap::Subcommand)]
#[derive(Debug, StructOpt)]
#[structopt(name = "czkawka", help_message = HELP_MESSAGE, template = HELP_TEMPLATE)]
pub enum Commands {
#[clap(
name = "dup",
about = "Finds duplicate files",
after_help = "EXAMPLE:\n czkawka dup -d /home/rafal -e /home/rafal/Obrazy -m 25 -x 7z rar IMAGE -s hash -f results.txt -D aeo"
)]
Duplicates(DuplicatesArgs),
#[clap(
name = "empty-folders",
about = "Finds empty folders",
after_help = "EXAMPLE:\n czkawka empty-folders -d /home/rafal/rr /home/gateway -f results.txt"
)]
EmptyFolders(EmptyFoldersArgs),
#[clap(
name = "big",
about = "Finds big files",
after_help = "EXAMPLE:\n czkawka big -d /home/rafal/ /home/piszczal -e /home/rafal/Roman -n 25 -J -x VIDEO -f results.txt"
)]
BiggestFiles(BiggestFilesArgs),
#[clap(
name = "empty-files",
about = "Finds empty files",
after_help = "EXAMPLE:\n czkawka empty-files -d /home/rafal /home/szczekacz -e /home/rafal/Pulpit -R -f results.txt"
)]
EmptyFiles(EmptyFilesArgs),
#[clap(
name = "temp",
about = "Finds temporary files",
after_help = "EXAMPLE:\n czkawka temp -d /home/rafal/ -E */.git */tmp* *Pulpit -f results.txt -D"
)]
Temporary(TemporaryArgs),
#[clap(
name = "image",
about = "Finds similar images",
after_help = "EXAMPLE:\n czkawka image -d /home/rafal/ -E */.git */tmp* *Pulpit -f results.txt"
)]
SimilarImages(SimilarImagesArgs),
#[clap(name = "music", about = "Finds same music by tags", after_help = "EXAMPLE:\n czkawka music -d /home/rafal -f results.txt")]
SameMusic(SameMusicArgs),
#[clap(
name = "symlinks",
about = "Finds invalid symlinks",
after_help = "EXAMPLE:\n czkawka symlinks -d /home/kicikici/ /home/szczek -e /home/kicikici/jestempsem -x jpg -f results.txt"
)]
InvalidSymlinks(InvalidSymlinksArgs),
#[clap(
name = "broken",
about = "Finds broken files",
after_help = "EXAMPLE:\n czkawka broken -d /home/kicikici/ /home/szczek -e /home/kicikici/jestempsem -x jpg -f results.txt"
)]
BrokenFiles(BrokenFilesArgs),
#[clap(name = "video", about = "Finds similar video files", after_help = "EXAMPLE:\n czkawka videos -d /home/rafal -f results.txt")]
SimilarVideos(SimilarVideosArgs),
#[clap(
name = "ext",
about = "Finds files with invalid extensions",
after_help = "EXAMPLE:\n czkawka broken -d /home/czokolada/ -f results.txt"
)]
BadExtensions(BadExtensionsArgs),
#[clap(name = "tester", about = "Small utility to test supported speed of ", after_help = "EXAMPLE:\n czkawka tester")]
Tester,
}
#[derive(Debug, clap::Args)]
pub struct DuplicatesArgs {
#[clap(flatten)]
pub common_cli_items: CommonCliItems,
#[clap(
short,
long,
value_parser = parse_minimal_file_size,
default_value = "8192",
help = "Minimum size in bytes",
long_help = "Minimum size of checked files in bytes, assigning bigger value may speed up searching"
)]
pub minimal_file_size: u64,
#[clap(
short = 'i',
long,
value_parser = parse_maximal_file_size,
default_value = "18446744073709551615",
help = "Maximum size in bytes",
long_help = "Maximum size of checked files in bytes, assigning lower value may speed up searching"
)]
pub maximal_file_size: u64,
#[clap(
short = 'c',
long,
value_parser = parse_minimal_file_size,
default_value = "257144",
help = "Minimum cached file size in bytes",
long_help = "Minimum size of cached files in bytes, assigning bigger value may speed up the scan but loading the cache will be slower, assigning smaller value may slow down the scan and some files may need to be hashed again but loading the cache will be faster"
)]
pub minimal_cached_file_size: u64,
#[clap(
short,
long,
default_value = "HASH",
value_parser = parse_checking_method_duplicate,
help = "Search method (NAME, SIZE, HASH)",
long_help = "Methods to search files.\nNAME - Fast but but rarely usable,\nSIZE - Fast but not accurate, checking by the file's size,\nHASH - The slowest method, checking by the hash of the entire file"
)]
pub search_method: CheckingMethod,
#[clap(flatten)]
pub delete_method: DMethod,
#[clap(
short = 't',
long,
default_value = "BLAKE3",
value_parser = parse_hash_type,
help = "Hash type (BLAKE3, CRC32, XXH3)"
)]
pub hash_type: HashType,
#[clap(flatten)]
pub case_sensitive_name_comparison: CaseSensitiveNameComparison,
#[clap(flatten)]
pub allow_hard_links: AllowHardLinks,
#[clap(flatten)]
pub dry_run: DryRun,
}
#[derive(Debug, clap::Args)]
pub struct EmptyFoldersArgs {
#[clap(flatten)]
pub common_cli_items: CommonCliItems,
#[clap(short = 'D', long, help = "Delete found folders")]
pub delete_folders: bool,
}
#[derive(Debug, clap::Args)]
pub struct BiggestFilesArgs {
#[clap(flatten)]
pub common_cli_items: CommonCliItems,
#[clap(short, long, default_value = "50", help = "Number of files to be shown")]
pub number_of_files: usize,
#[clap(short = 'D', long, help = "Delete found files")]
pub delete_files: bool,
#[clap(short = 'J', long, help = "Finds the smallest files instead the biggest")]
pub smallest_mode: bool,
}
#[derive(Debug, clap::Args)]
pub struct EmptyFilesArgs {
#[clap(flatten)]
pub common_cli_items: CommonCliItems,
#[clap(short = 'D', long, help = "Delete found files")]
pub delete_files: bool,
}
#[derive(Debug, clap::Args)]
pub struct TemporaryArgs {
#[clap(flatten)]
pub common_cli_items: CommonCliItems,
#[clap(short = 'D', long, help = "Delete found files")]
pub delete_files: bool,
}
#[derive(Debug, clap::Args)]
pub struct SimilarImagesArgs {
#[clap(flatten)]
pub common_cli_items: CommonCliItems,
#[clap(
short,
long,
value_parser = parse_minimal_file_size,
default_value = "16384",
help = "Minimum size in bytes",
long_help = "Minimum size of checked files in bytes, assigning bigger value may speed up searching"
)]
pub minimal_file_size: u64,
#[clap(
short = 'i',
long,
value_parser = parse_minimal_file_size,
default_value = "18446744073709551615",
help = "Maximum size in bytes",
long_help = "Maximum size of checked files in bytes, assigning lower value may speed up searching"
)]
pub maximal_file_size: u64,
#[clap(
short,
long,
default_value = "High",
value_parser = parse_similar_images_similarity,
help = "Similairty level (Minimal, VerySmall, Small, Medium, High, VeryHigh, Original)",
long_help = "Methods to choose similarity level of images which will be considered as duplicated."
)]
pub similarity_preset: SimilarityPreset,
#[clap(flatten)]
pub delete_method: DMethod,
#[clap(flatten)]
pub allow_hard_links: AllowHardLinks,
#[clap(flatten)]
pub dry_run: DryRun,
#[clap(
short = 'g',
long,
default_value = "Gradient",
value_parser = parse_similar_hash_algorithm,
help = "Hash algorithm (allowed: Mean, Gradient, Blockhash, VertGradient, DoubleGradient)"
)]
pub hash_alg: HashAlg,
#[clap(
short = 'z',
long,
default_value = "Nearest",
value_parser = parse_similar_image_filter,
help = "Hash algorithm (allowed: Lanczos3, Nearest, Triangle, Faussian, Catmullrom)"
)]
pub image_filter: FilterType,
#[clap(
short = 'c',
long,
default_value = "16",
value_parser = parse_image_hash_size,
help = "Hash size (allowed: 8, 16, 32, 64)"
)]
pub hash_size: u8,
}
#[derive(Debug, clap::Args)]
pub struct SameMusicArgs {
#[clap(flatten)]
pub common_cli_items: CommonCliItems,
#[clap(flatten)]
pub delete_method: DMethod,
#[clap(flatten)]
pub dry_run: DryRun,
#[clap(
short = 'z',
long,
default_value = "track_title,track_artist",
value_parser = parse_music_duplicate_type,
help = "Search method (track_title,track_artist,year,bitrate,genre,length))",
long_help = "Sets which rows must be equal to set this files as duplicates(may be mixed, but must be divided by commas)."
)]
pub music_similarity: MusicSimilarity,
#[clap(
short,
long,
default_value = "TAGS",
value_parser = parse_checking_method_same_music,
help = "Search method (CONTENT, TAGS)",
long_help = "Methods to search files.\nCONTENT - finds similar audio files by content, TAGS - finds similar images by tags, needs to set"
)]
pub search_method: CheckingMethod,
#[clap(
short,
long,
value_parser = parse_minimal_file_size,
default_value = "8192",
help = "Minimum size in bytes",
long_help = "Minimum size of checked files in bytes, assigning bigger value may speed up searching"
)]
pub minimal_file_size: u64,
#[clap(
short = 'i',
long,
value_parser = parse_maximal_file_size,
default_value = "18446744073709551615",
help = "Maximum size in bytes",
long_help = "Maximum size of checked files in bytes, assigning lower value may speed up searching"
)]
pub maximal_file_size: u64,
#[clap(
short = 'l',
long,
value_parser = parse_minimum_segment_duration,
default_value = "10.0",
help = "Maximum size in bytes",
long_help = "Minimum segment duration, smaller value will finds also shorter similar segments, which may increase false positives number"
)]
pub minimum_segment_duration: f32,
#[clap(
short = 'd',
long,
value_parser = parse_maximum_difference,
default_value = "2.0",
help = "Maximum difference between segments",
long_help = "Maximum difference between segments, 0.0 will find only identical segments, 10.0 will find also segments which are almost not similar at all"
)]
pub maximum_difference: f64,
}
fn parse_maximum_difference(src: &str) -> Result<f64, String> {
match src.parse::<f64>() {
Ok(maximum_difference) => {
if maximum_difference <= 0.0 {
Err("Maximum difference must be bigger than 0".to_string())
} else if maximum_difference >= 10.0 {
Err("Maximum difference must be smaller than 10.0".to_string())
} else {
Ok(maximum_difference)
}
}
Err(e) => Err(e.to_string()),
}
}
fn parse_minimum_segment_duration(src: &str) -> Result<f32, String> {
match src.parse::<f32>() {
Ok(minimum_segment_duration) => {
if minimum_segment_duration <= 0.0 {
Err("Minimum segment duration must be bigger than 0".to_string())
} else if minimum_segment_duration >= 3600.0 {
Err("Minimum segment duration must be smaller than 3600(greater values not have much sense)".to_string())
} else {
Ok(minimum_segment_duration)
}
}
Err(e) => Err(e.to_string()),
}
}
#[derive(Debug, clap::Args)]
pub struct InvalidSymlinksArgs {
#[clap(flatten)]
pub common_cli_items: CommonCliItems,
#[clap(short = 'D', long, help = "Delete found files")]
pub delete_files: bool,
}
#[derive(Debug, clap::Args)]
pub struct BrokenFilesArgs {
#[clap(flatten)]
pub common_cli_items: CommonCliItems,
#[clap(short = 'D', long, help = "Delete found files")]
pub delete_files: bool,
}
#[derive(Debug, clap::Args)]
pub struct SimilarVideosArgs {
#[clap(flatten)]
pub common_cli_items: CommonCliItems,
#[clap(flatten)]
pub delete_method: DMethod,
#[clap(flatten)]
pub allow_hard_links: AllowHardLinks,
#[clap(flatten)]
pub dry_run: DryRun,
#[clap(
short,
long,
value_parser = parse_minimal_file_size,
default_value = "8192",
help = "Minimum size in bytes",
long_help = "Minimum size of checked files in bytes, assigning bigger value may speed up searching"
)]
pub minimal_file_size: u64,
#[clap(
short = 'i',
long,
value_parser = parse_maximal_file_size,
default_value = "18446744073709551615",
help = "Maximum size in bytes",
long_help = "Maximum size of checked files in bytes, assigning lower value may speed up searching"
)]
pub maximal_file_size: u64,
#[clap(
short = 't',
long,
value_parser = parse_tolerance,
default_value = "10",
help = "Video maximum difference (allowed values <0,20>)",
long_help = "Maximum difference between video frames, bigger value means that videos can looks more and more different (allowed values <0,20>)"
)]
pub tolerance: i32,
}
#[derive(Debug, clap::Args)]
pub struct BadExtensionsArgs {
#[clap(flatten)]
pub common_cli_items: CommonCliItems,
}
#[derive(Debug, clap::Args)]
pub struct CommonCliItems {
#[clap(short = 'T', long, default_value = "0", help = "Limits thread number, 0(default) will use all available threads")]
pub thread_number: usize,
#[clap(
#[structopt(name = "dup", about = "Finds duplicate files", help_message = HELP_MESSAGE, after_help = "EXAMPLE:\n czkawka dup -d /home/rafal -e /home/rafal/Obrazy -m 25 -x 7z rar IMAGE -s hash -f results.txt -D aeo")]
Duplicates {
#[structopt(flatten)]
directories: Directories,
#[structopt(flatten)]
excluded_directories: ExcludedDirectories,
#[structopt(flatten)]
excluded_items: ExcludedItems,
#[structopt(short, long, parse(try_from_str = parse_minimal_file_size), default_value = "8192", help = "Minimum size in bytes", long_help = "Minimum size of checked files in bytes, assigning bigger value may speed up searching")]
minimal_file_size: u64,
#[structopt(short = "i", long, parse(try_from_str = parse_maximal_file_size), default_value = "18446744073709551615", help = "Maximum size in bytes", long_help = "Maximum size of checked files in bytes, assigning lower value may speed up searching")]
maximal_file_size: u64,
#[structopt(short = "c", long, parse(try_from_str = parse_minimal_file_size), default_value = "257144", help = "Minimum cached file size in bytes", long_help = "Minimum size of cached files in bytes, assigning bigger value may speed up will cause that lower amount of files will be cached, but loading of cache will be faster")]
minimal_cached_file_size: u64,
#[structopt(flatten)]
allowed_extensions: AllowedExtensions,
#[structopt(short, long, default_value = "HASH", parse(try_from_str = parse_checking_method), help = "Search method (NAME, SIZE, HASH)", long_help = "Methods to search files.\nNAME - Fast but but rarely usable,\nSIZE - Fast but not accurate, checking by the file's size,\nHASH - The slowest method, checking by the hash of the entire file")]
search_method: CheckingMethod,
#[structopt(short = "D", long, default_value = "NONE", parse(try_from_str = parse_delete_method), help = "Delete method (AEN, AEO, ON, OO, HARD)", long_help = "Methods to delete the files.\nAEN - All files except the newest,\nAEO - All files except the oldest,\nON - Only 1 file, the newest,\nOO - Only 1 file, the oldest\nHARD - create hard link\nNONE - not delete files")]
delete_method: DeleteMethod,
#[structopt(short = "ht", long, default_value = "BLAKE3", parse(try_from_str = parse_hash_type), help = "Hash type (BLAKE3, CRC32, XXH3)")]
hash_type: HashType,
#[structopt(flatten)]
file_to_save: FileToSave,
#[structopt(flatten)]
not_recursive: NotRecursive,
#[cfg(target_family = "unix")]
#[structopt(flatten)]
exclude_other_filesystems: ExcludeOtherFilesystems,
#[structopt(flatten)]
allow_hard_links: AllowHardLinks,
#[structopt(flatten)]
dryrun: DryRun,
},
#[structopt(name = "empty-folders", about = "Finds empty folders", help_message = HELP_MESSAGE, after_help = "EXAMPLE:\n czkawka empty-folders -d /home/rafal/rr /home/gateway -f results.txt")]
EmptyFolders {
#[structopt(flatten)]
directories: Directories,
#[structopt(flatten)]
excluded_directories: ExcludedDirectories,
#[structopt(flatten)]
excluded_items: ExcludedItems,
#[structopt(short = "D", long, help = "Delete found folders")]
delete_folders: bool,
#[structopt(flatten)]
file_to_save: FileToSave,
#[cfg(target_family = "unix")]
#[structopt(flatten)]
exclude_other_filesystems: ExcludeOtherFilesystems,
},
#[structopt(name = "big", about = "Finds big files", help_message = HELP_MESSAGE, after_help = "EXAMPLE:\n czkawka big -d /home/rafal/ /home/piszczal -e /home/rafal/Roman -n 25 -x VIDEO -f results.txt")]
BiggestFiles {
#[structopt(flatten)]
directories: Directories,
#[structopt(flatten)]
excluded_directories: ExcludedDirectories,
#[structopt(flatten)]
excluded_items: ExcludedItems,
#[structopt(flatten)]
allowed_extensions: AllowedExtensions,
#[structopt(short, long, default_value = "50", help = "Number of files to be shown")]
number_of_files: usize,
#[structopt(short = "D", long, help = "Delete found files")]
delete_files: bool,
#[structopt(flatten)]
file_to_save: FileToSave,
#[structopt(flatten)]
not_recursive: NotRecursive,
#[cfg(target_family = "unix")]
#[structopt(flatten)]
exclude_other_filesystems: ExcludeOtherFilesystems,
},
#[structopt(name = "empty-files", about = "Finds empty files", help_message = HELP_MESSAGE, after_help = "EXAMPLE:\n czkawka empty-files -d /home/rafal /home/szczekacz -e /home/rafal/Pulpit -R -f results.txt")]
EmptyFiles {
#[structopt(flatten)]
directories: Directories,
#[structopt(flatten)]
excluded_directories: ExcludedDirectories,
#[structopt(flatten)]
excluded_items: ExcludedItems,
#[structopt(flatten)]
allowed_extensions: AllowedExtensions,
#[structopt(short = "D", long, help = "Delete found files")]
delete_files: bool,
#[structopt(flatten)]
file_to_save: FileToSave,
#[structopt(flatten)]
not_recursive: NotRecursive,
#[cfg(target_family = "unix")]
#[structopt(flatten)]
exclude_other_filesystems: ExcludeOtherFilesystems,
},
#[structopt(name = "temp", about = "Finds temporary files", help_message = HELP_MESSAGE, after_help = "EXAMPLE:\n czkawka temp -d /home/rafal/ -E */.git */tmp* *Pulpit -f results.txt -D")]
Temporary {
#[structopt(flatten)]
directories: Directories,
#[structopt(flatten)]
excluded_directories: ExcludedDirectories,
#[structopt(flatten)]
excluded_items: ExcludedItems,
#[structopt(short = "D", long, help = "Delete found files")]
delete_files: bool,
#[structopt(flatten)]
file_to_save: FileToSave,
#[structopt(flatten)]
not_recursive: NotRecursive,
#[cfg(target_family = "unix")]
#[structopt(flatten)]
exclude_other_filesystems: ExcludeOtherFilesystems,
},
#[structopt(name = "image", about = "Finds similar images", help_message = HELP_MESSAGE, after_help = "EXAMPLE:\n czkawka image -d /home/rafal/ -E */.git */tmp* *Pulpit -f results.txt")]
SimilarImages {
#[structopt(flatten)]
directories: Directories,
#[structopt(flatten)]
excluded_directories: ExcludedDirectories,
#[structopt(short, long, parse(try_from_str = parse_minimal_file_size), default_value = "16384", help = "Minimum size in bytes", long_help = "Minimum size of checked files in bytes, assigning bigger value may speed up searching")]
minimal_file_size: u64,
#[structopt(short = "i", long, parse(try_from_str = parse_maximal_file_size), default_value = "18446744073709551615", help = "Maximum size in bytes", long_help = "Maximum size of checked files in bytes, assigning lower value may speed up searching")]
maximal_file_size: u64,
#[structopt(short, long, default_value = "High", parse(try_from_str = parse_similar_images_similarity), help = "Similairty level (Minimal, VerySmall, Small, Medium, High, VeryHigh)", long_help = "Methods to choose similarity level of images which will be considered as duplicated.")]
similarity_preset: SimilarityPreset,
#[structopt(flatten)]
excluded_items: ExcludedItems,
#[structopt(flatten)]
file_to_save: FileToSave,
#[structopt(flatten)]
not_recursive: NotRecursive,
#[cfg(target_family = "unix")]
#[structopt(flatten)]
exclude_other_filesystems: ExcludeOtherFilesystems,
#[structopt(short = "g", long, default_value = "Gradient", parse(try_from_str = parse_similar_hash_algorithm), help = "Hash algorithm (allowed: Mean, Gradient, Blockhash, VertGradient, DoubleGradient)")]
hash_alg: HashAlg,
#[structopt(short = "z", long, default_value = "Lanczos3", parse(try_from_str = parse_similar_image_filter), help = "Hash algorithm (allowed: Lanczos3, Nearest, Triangle, Faussian, Catmullrom)")]
image_filter: FilterType,
#[structopt(short = "c", long, default_value = "8", parse(try_from_str = parse_image_hash_size), help = "Hash size (allowed: 4, 8, 16)")]
hash_size: u8,
},
#[structopt(name = "music", about = "Finds same music by tags", help_message = HELP_MESSAGE, after_help = "EXAMPLE:\n czkawka music -d /home/rafal -f results.txt")]
SameMusic {
#[structopt(flatten)]
directories: Directories,
#[structopt(flatten)]
excluded_directories: ExcludedDirectories,
#[structopt(flatten)]
excluded_items: ExcludedItems,
// #[structopt(short = "D", long, help = "Delete found files")]
// delete_files: bool, TODO
#[structopt(short = "z", long, default_value = "track_title,track_artist", parse(try_from_str = parse_music_duplicate_type), help = "Search method (track_title,track_artist,year,bitrate,genre,length))", long_help = "Sets which rows must be equal to set this files as duplicates(may be mixed, but must be divided by commas).")]
music_similarity: MusicSimilarity,
#[structopt(flatten)]
file_to_save: FileToSave,
#[structopt(flatten)]
not_recursive: NotRecursive,
#[cfg(target_family = "unix")]
#[structopt(flatten)]
exclude_other_filesystems: ExcludeOtherFilesystems,
#[structopt(short, long, parse(try_from_str = parse_minimal_file_size), default_value = "8192", help = "Minimum size in bytes", long_help = "Minimum size of checked files in bytes, assigning bigger value may speed up searching")]
minimal_file_size: u64,
#[structopt(short = "i", long, parse(try_from_str = parse_maximal_file_size), default_value = "18446744073709551615", help = "Maximum size in bytes", long_help = "Maximum size of checked files in bytes, assigning lower value may speed up searching")]
maximal_file_size: u64,
},
#[structopt(name = "symlinks", about = "Finds invalid symlinks", help_message = HELP_MESSAGE, after_help = "EXAMPLE:\n czkawka symlinks -d /home/kicikici/ /home/szczek -e /home/kicikici/jestempsem -x jpg -f results.txt")]
InvalidSymlinks {
#[structopt(flatten)]
directories: Directories,
#[structopt(flatten)]
excluded_directories: ExcludedDirectories,
#[structopt(flatten)]
excluded_items: ExcludedItems,
#[structopt(flatten)]
allowed_extensions: AllowedExtensions,
#[structopt(short = "D", long, help = "Delete found files")]
delete_files: bool,
#[structopt(flatten)]
file_to_save: FileToSave,
#[structopt(flatten)]
not_recursive: NotRecursive,
#[cfg(target_family = "unix")]
#[structopt(flatten)]
exclude_other_filesystems: ExcludeOtherFilesystems,
},
#[structopt(name = "broken", about = "Finds broken files", help_message = HELP_MESSAGE, after_help = "EXAMPLE:\n czkawka broken -d /home/kicikici/ /home/szczek -e /home/kicikici/jestempsem -x jpg -f results.txt")]
BrokenFiles {
#[structopt(flatten)]
directories: Directories,
#[structopt(flatten)]
excluded_directories: ExcludedDirectories,
#[structopt(flatten)]
excluded_items: ExcludedItems,
#[structopt(flatten)]
allowed_extensions: AllowedExtensions,
#[structopt(short = "D", long, help = "Delete found files")]
delete_files: bool,
#[structopt(flatten)]
file_to_save: FileToSave,
#[structopt(flatten)]
not_recursive: NotRecursive,
#[cfg(target_family = "unix")]
#[structopt(flatten)]
exclude_other_filesystems: ExcludeOtherFilesystems,
},
#[structopt(name = "video", about = "Finds similar video files", help_message = HELP_MESSAGE, after_help = "EXAMPLE:\n czkawka videos -d /home/rafal -f results.txt")]
SimilarVideos {
#[structopt(flatten)]
directories: Directories,
#[structopt(flatten)]
excluded_directories: ExcludedDirectories,
#[structopt(flatten)]
excluded_items: ExcludedItems,
// #[structopt(short = "D", long, help = "Delete found files")]
// delete_files: bool, TODO
#[structopt(flatten)]
file_to_save: FileToSave,
#[structopt(flatten)]
allowed_extensions: AllowedExtensions,
#[structopt(flatten)]
not_recursive: NotRecursive,
#[cfg(target_family = "unix")]
#[structopt(flatten)]
exclude_other_filesystems: ExcludeOtherFilesystems,
#[structopt(short, long, parse(try_from_str = parse_minimal_file_size), default_value = "8192", help = "Minimum size in bytes", long_help = "Minimum size of checked files in bytes, assigning bigger value may speed up searching")]
minimal_file_size: u64,
#[structopt(short = "i", long, parse(try_from_str = parse_maximal_file_size), default_value = "18446744073709551615", help = "Maximum size in bytes", long_help = "Maximum size of checked files in bytes, assigning lower value may speed up searching")]
maximal_file_size: u64,
#[structopt(short = "t", long, parse(try_from_str = parse_tolerance), default_value = "10", help = "Video maximium difference (allowed values <0,20>)", long_help = "Maximum difference between video frames, bigger value means that videos can looks more and more different (allowed values <0,20>)")]
tolerance: i32,
},
#[structopt(name = "tester", about = "Contains various test", help_message = HELP_MESSAGE, after_help = "EXAMPLE:\n czkawka tests -i")]
Tester {
#[structopt(short = "i", long = "test_image", help = "Test speed of hashing provided test.jpg image with different filters and methods.")]
test_image: bool,
},
}
#[derive(Debug, StructOpt)]
pub struct Directories {
#[structopt(
short,
long,
parse(from_os_str),
required = true,
help = "Directorie(s) to search",
long_help = "List of directorie(s) which will be searched(absolute path)"
)]
pub directories: Vec<PathBuf>,
#[clap(
}
#[derive(Debug, StructOpt)]
pub struct ExcludedDirectories {
#[structopt(
short,
long,
parse(from_os_str),
help = "Excluded directorie(s)",
long_help = "List of directorie(s) which will be excluded from search(absolute path)"
)]
pub excluded_directories: Vec<PathBuf>,
#[clap(
short = 'E',
}
#[derive(Debug, StructOpt)]
pub struct ExcludedItems {
#[structopt(
short = "E",
long,
help = "Excluded item(s)",
long_help = "List of excluded item(s) which contains * wildcard(may be slow, so use -e where possible)"
)]
pub excluded_items: Vec<String>,
#[clap(
short = 'x',
}
#[derive(Debug, StructOpt)]
pub struct AllowedExtensions {
#[structopt(
short = "x",
long,
help = "Allowed file extension(s)",
long_help = "List of checked files with provided extension(s). There are also helpful macros which allow to easy use a typical extensions like:\nIMAGE(\"jpg,kra,gif,png,bmp,tiff,hdr,svg\"),\nTEXT(\"txt,doc,docx,odt,rtf\"),\nVIDEO(\"mp4,flv,mkv,webm,vob,ogv,gifv,avi,mov,wmv,mpg,m4v,m4p,mpeg,3gp\") or\nMUSIC(\"mp3,flac,ogg,tta,wma,webm\")\n "
)]
pub allowed_extensions: Vec<String>,
#[clap(short = 'P', long, help = "Excluded file extension(s)", long_help = "List of extensions, that will be removed from search.\n ")]
pub excluded_extensions: Vec<String>,
#[clap(flatten)]
pub file_to_save: FileToSave,
#[clap(flatten)]
pub json_compact_file_to_save: JsonCompactFileToSave,
#[clap(flatten)]
pub json_pretty_file_to_save: JsonPrettyFileToSave,
#[clap(short = 'R', long, help = "Prevents from recursive check of folders")]
}
#[derive(Debug, StructOpt)]
pub struct NotRecursive {
#[structopt(short = "R", long, help = "Prevents from recursive check of folders")]
pub not_recursive: bool,
#[cfg(target_family = "unix")]
#[clap(short = 'X', long, help = "Exclude files on other filesystems")]
pub exclude_other_filesystems: bool,
}
#[derive(Debug, clap::Args)]
pub struct DMethod {
#[clap(
short = 'D',
long,
default_value = "NONE",
value_parser = parse_delete_method,
help = "Delete method (AEN, AEO, ON, OO, HARD)",
long_help = "Methods to delete the files.\nAEN - All files except the newest,\nAEO - All files except the oldest,\nON - Only 1 file, the newest,\nOO - Only 1 file, the oldest\nHARD - create hard link\nNONE - not delete files"
)]
pub delete_method: DeleteMethod,
#[cfg(target_family = "unix")]
#[derive(Debug, StructOpt)]
pub struct ExcludeOtherFilesystems {
#[structopt(short = "X", long, help = "Exclude files on other filesystmes")]
pub exclude_other_filesystems: bool,
}
#[derive(Debug, clap::Args)]
#[derive(Debug, StructOpt)]
pub struct FileToSave {
#[clap(short, long, value_name = "file-name", help = "Saves the results into the formatted txt file")]
#[structopt(short, long, value_name = "file-name", help = "Saves the results into the file")]
pub file_to_save: Option<PathBuf>,
}
#[derive(Debug, clap::Args)]
pub struct JsonCompactFileToSave {
#[clap(short = 'C', long, value_name = "json-file-name", help = "Saves the results into the compact json file")]
pub compact_file_to_save: Option<PathBuf>,
}
#[derive(Debug, clap::Args)]
pub struct JsonPrettyFileToSave {
#[clap(short, long, value_name = "pretty-json-file-name", help = "Saves the results into the pretty json file")]
pub pretty_file_to_save: Option<PathBuf>,
}
#[derive(Debug, clap::Args)]
#[derive(Debug, StructOpt)]
pub struct AllowHardLinks {
#[clap(short = 'L', long, help = "Do not ignore hard links")]
#[structopt(short = "L", long, help = "Do not ignore hard links")]
pub allow_hard_links: bool,
}
#[derive(Debug, clap::Args)]
pub struct CaseSensitiveNameComparison {
#[clap(short = 'l', long, help = "Use case sensitive name comparison")]
pub case_sensitive_name_comparison: bool,
}
#[derive(Debug, clap::Args)]
#[derive(Debug, StructOpt)]
pub struct DryRun {
#[clap(long, help = "Do nothing and print the operation that would happen.")]
pub dry_run: bool,
#[structopt(long, help = "Do nothing and print the operation that would happen.")]
pub dryrun: bool,
}
impl FileToSave {
@ -501,24 +333,6 @@ impl FileToSave {
None
}
}
impl JsonCompactFileToSave {
pub fn file_name(&self) -> Option<&str> {
if let Some(file_name) = &self.compact_file_to_save {
return file_name.to_str();
}
None
}
}
impl JsonPrettyFileToSave {
pub fn file_name(&self) -> Option<&str> {
if let Some(file_name) = &self.pretty_file_to_save {
return file_name.to_str();
}
None
}
}
fn parse_hash_type(src: &str) -> Result<HashType, &'static str> {
match src.to_ascii_lowercase().as_str() {
@ -542,24 +356,15 @@ fn parse_tolerance(src: &str) -> Result<i32, &'static str> {
}
}
fn parse_checking_method_duplicate(src: &str) -> Result<CheckingMethod, &'static str> {
fn parse_checking_method(src: &str) -> Result<CheckingMethod, &'static str> {
match src.to_ascii_lowercase().as_str() {
"name" => Ok(CheckingMethod::Name),
"size" => Ok(CheckingMethod::Size),
"size_name" => Ok(CheckingMethod::SizeName),
"hash" => Ok(CheckingMethod::Hash),
_ => Err("Couldn't parse the search method (allowed: NAME, SIZE, HASH)"),
}
}
fn parse_checking_method_same_music(src: &str) -> Result<CheckingMethod, &'static str> {
match src.to_ascii_lowercase().as_str() {
"tags" => Ok(CheckingMethod::AudioTags),
"content" => Ok(CheckingMethod::AudioContent),
_ => Err("Couldn't parse the searc method (allowed: TAGS, CONTENT)"),
}
}
fn parse_delete_method(src: &str) -> Result<DeleteMethod, &'static str> {
match src.to_ascii_lowercase().as_str() {
"none" => Ok(DeleteMethod::None),
@ -640,7 +445,7 @@ fn parse_image_hash_size(src: &str) -> Result<u8, String> {
}
fn parse_music_duplicate_type(src: &str) -> Result<MusicSimilarity, String> {
if src.trim().is_empty() {
if src.is_empty() {
return Ok(MusicSimilarity::NONE);
}
@ -648,22 +453,22 @@ fn parse_music_duplicate_type(src: &str) -> Result<MusicSimilarity, String> {
let parts: Vec<String> = src.split(',').map(|e| e.to_lowercase().replace('_', "")).collect();
if parts.contains(&"tracktitle".into()) {
if parts.iter().any(|e| e.contains("tracktitle")) {
similarity |= MusicSimilarity::TRACK_TITLE;
}
if parts.contains(&"trackartist".into()) {
if parts.iter().any(|e| e.contains("trackartist")) {
similarity |= MusicSimilarity::TRACK_ARTIST;
}
if parts.contains(&"year".into()) {
if parts.iter().any(|e| e.contains("year")) {
similarity |= MusicSimilarity::YEAR;
}
if parts.contains(&"bitrate".into()) {
if parts.iter().any(|e| e.contains("bitrate")) {
similarity |= MusicSimilarity::BITRATE;
}
if parts.contains(&"genre".into()) {
if parts.iter().any(|e| e.contains("genre")) {
similarity |= MusicSimilarity::GENRE;
}
if parts.contains(&"length".into()) {
if parts.iter().any(|e| e.contains("length")) {
similarity |= MusicSimilarity::LENGTH;
}
@ -674,14 +479,16 @@ fn parse_music_duplicate_type(src: &str) -> Result<MusicSimilarity, String> {
Ok(similarity)
}
static HELP_MESSAGE: &str = "Prints help information (--help will give more information)";
const HELP_TEMPLATE: &str = r#"
{bin} {version}
USAGE:
{usage} [SCFLAGS] [SCOPTIONS]
OPTIONS:
{options}
FLAGS:
{flags}
SUBCOMMANDS:
{subcommands}
@ -697,5 +504,4 @@ EXAMPLES:
{bin} image -d /home/rafal -e /home/rafal/Pulpit -f results.txt
{bin} music -d /home/rafal -e /home/rafal/Pulpit -z "artist,year, ARTISTALBUM, ALBUM___tiTlE" -f results.txt
{bin} symlinks -d /home/kicikici/ /home/szczek -e /home/kicikici/jestempsem -x jpg -f results.txt
{bin} broken -d /home/mikrut/ -e /home/mikrut/trakt -f results.txt
{bin} extnp -d /home/mikrut/ -e /home/mikrut/trakt -f results.txt"#;
{bin} broken -d /home/mikrut/ -e /home/mikrut/trakt -f results.txt"#;

@ -1,343 +1,435 @@
#![allow(clippy::needless_late_init)]
use std::thread;
use std::process;
use clap::Parser;
use crossbeam_channel::{bounded, unbounded, Receiver, Sender};
use log::error;
use structopt::StructOpt;
use commands::Commands;
use czkawka_core::bad_extensions::BadExtensions;
use czkawka_core::big_file::{BigFile, SearchMode};
use czkawka_core::broken_files::BrokenFiles;
use czkawka_core::common::{print_version_mode, set_number_of_threads, setup_logger, DEFAULT_THREAD_SIZE};
use czkawka_core::common_dir_traversal::ProgressData;
use czkawka_core::common_tool::{CommonData, DeleteMethod};
#[allow(unused_imports)] // It is used in release for print_results_to_output().
#[allow(unused_imports)] // It is used in release for print_results().
use czkawka_core::common_traits::*;
use czkawka_core::duplicate::DuplicateFinder;
use czkawka_core::empty_files::EmptyFiles;
use czkawka_core::empty_folder::EmptyFolder;
use czkawka_core::invalid_symlinks::InvalidSymlinks;
use czkawka_core::same_music::SameMusic;
use czkawka_core::similar_images::{return_similarity_from_similarity_preset, test_image_conversion_speed, SimilarImages};
use czkawka_core::similar_videos::SimilarVideos;
use czkawka_core::temporary::Temporary;
use crate::commands::{
Args, BadExtensionsArgs, BiggestFilesArgs, BrokenFilesArgs, CommonCliItems, DuplicatesArgs, EmptyFilesArgs, EmptyFoldersArgs, InvalidSymlinksArgs, SameMusicArgs,
SimilarImagesArgs, SimilarVideosArgs, TemporaryArgs,
use czkawka_core::similar_images::test_image_conversion_speed;
use czkawka_core::{
big_file::{self, BigFile},
broken_files::{self, BrokenFiles},
duplicate::DuplicateFinder,
empty_files::{self, EmptyFiles},
empty_folder::EmptyFolder,
invalid_symlinks,
invalid_symlinks::InvalidSymlinks,
same_music::SameMusic,
similar_images::{return_similarity_from_similarity_preset, SimilarImages},
similar_videos::SimilarVideos,
temporary::{self, Temporary},
};
use crate::progress::connect_progress;
mod commands;
mod progress;
fn main() {
let command = Args::parse().command;
setup_logger(true);
print_version_mode();
if cfg!(debug_assertions) {
println!("{command:?}");
}
let (progress_sender, progress_receiver): (Sender<ProgressData>, Receiver<ProgressData>) = unbounded();
let (stop_sender, stop_receiver): (Sender<()>, Receiver<()>) = bounded(1);
let calculate_thread = thread::Builder::new().stack_size(DEFAULT_THREAD_SIZE).spawn(move || match command {
Commands::Duplicates(duplicates_args) => duplicates(duplicates_args, &stop_receiver, &progress_sender),
Commands::EmptyFolders(empty_folders_args) => empty_folders(empty_folders_args, &stop_receiver, &progress_sender),
Commands::BiggestFiles(biggest_files_args) => biggest_files(biggest_files_args, &stop_receiver, &progress_sender),
Commands::EmptyFiles(empty_files_args) => empty_files(empty_files_args, &stop_receiver, &progress_sender),
Commands::Temporary(temporary_args) => temporary(temporary_args, &stop_receiver, &progress_sender),
Commands::SimilarImages(similar_images_args) => similar_images(similar_images_args, &stop_receiver, &progress_sender),
Commands::SameMusic(same_music_args) => same_music(same_music_args, &stop_receiver, &progress_sender),
Commands::InvalidSymlinks(invalid_symlinks_args) => invalid_symlinks(invalid_symlinks_args, &stop_receiver, &progress_sender),
Commands::BrokenFiles(broken_files_args) => broken_files(broken_files_args, &stop_receiver, &progress_sender),
Commands::SimilarVideos(similar_videos_args) => similar_videos(similar_videos_args, &stop_receiver, &progress_sender),
Commands::BadExtensions(bad_extensions_args) => bad_extensions(bad_extensions_args, &stop_receiver, &progress_sender),
Commands::Tester {} => {
test_image_conversion_speed();
let command = Commands::from_args();
#[cfg(debug_assertions)]
println!("{:?}", command);
match command {
Commands::Duplicates {
directories,
excluded_directories,
excluded_items,
minimal_file_size,
maximal_file_size,
minimal_cached_file_size,
allowed_extensions,
search_method,
delete_method,
hash_type,
file_to_save,
not_recursive,
#[cfg(target_family = "unix")]
exclude_other_filesystems,
allow_hard_links,
dryrun,
} => {
let mut df = DuplicateFinder::new();
df.set_included_directory(directories.directories);
df.set_excluded_directory(excluded_directories.excluded_directories);
df.set_excluded_items(excluded_items.excluded_items);
df.set_minimal_file_size(minimal_file_size);
df.set_maximal_file_size(maximal_file_size);
df.set_minimal_cache_file_size(minimal_cached_file_size);
df.set_allowed_extensions(allowed_extensions.allowed_extensions.join(","));
df.set_check_method(search_method);
df.set_delete_method(delete_method);
df.set_hash_type(hash_type);
df.set_recursive_search(!not_recursive.not_recursive);
#[cfg(target_family = "unix")]
df.set_exclude_other_filesystems(exclude_other_filesystems.exclude_other_filesystems);
df.set_ignore_hard_links(!allow_hard_links.allow_hard_links);
df.set_dryrun(dryrun.dryrun);
df.find_duplicates(None, None);
if let Some(file_name) = file_to_save.file_name() {
if !df.save_results_to_file(file_name) {
df.get_text_messages().print_messages();
process::exit(1);
}
}
#[cfg(not(debug_assertions))] // This will show too much probably unnecessary data to debug, comment line only if needed
df.print_results();
df.get_text_messages().print_messages();
}
});
ctrlc::set_handler(move || {
println!("Get Sender");
stop_sender.send(()).expect("Could not send signal on channel.");
})
.expect("Error setting Ctrl-C handler");
connect_progress(&progress_receiver);
calculate_thread.unwrap().join().unwrap();
}
fn duplicates(duplicates: DuplicatesArgs, stop_receiver: &Receiver<()>, progress_sender: &Sender<ProgressData>) {
let DuplicatesArgs {
common_cli_items,
minimal_file_size,
maximal_file_size,
minimal_cached_file_size,
search_method,
delete_method,
hash_type,
allow_hard_links,
dry_run,
case_sensitive_name_comparison,
} = duplicates;
let mut item = DuplicateFinder::new();
set_common_settings(&mut item, &common_cli_items);
item.set_minimal_file_size(minimal_file_size);
item.set_maximal_file_size(maximal_file_size);
item.set_minimal_cache_file_size(minimal_cached_file_size);
item.set_check_method(search_method);
item.set_delete_method(delete_method.delete_method);
item.set_hash_type(hash_type);
item.set_ignore_hard_links(!allow_hard_links.allow_hard_links);
item.set_dry_run(dry_run.dry_run);
item.set_case_sensitive_name_comparison(case_sensitive_name_comparison.case_sensitive_name_comparison);
item.find_duplicates(Some(stop_receiver), Some(progress_sender));
save_and_print_results(&mut item, &common_cli_items);
}
fn empty_folders(empty_folders: EmptyFoldersArgs, stop_receiver: &Receiver<()>, progress_sender: &Sender<ProgressData>) {
let EmptyFoldersArgs { common_cli_items, delete_folders } = empty_folders;
let mut item = EmptyFolder::new();
set_common_settings(&mut item, &common_cli_items);
if delete_folders {
item.set_delete_method(DeleteMethod::Delete);
}
item.find_empty_folders(Some(stop_receiver), Some(progress_sender));
save_and_print_results(&mut item, &common_cli_items);
}
fn biggest_files(biggest_files: BiggestFilesArgs, stop_receiver: &Receiver<()>, progress_sender: &Sender<ProgressData>) {
let BiggestFilesArgs {
common_cli_items,
number_of_files,
delete_files,
smallest_mode,
} = biggest_files;
let mut item = BigFile::new();
set_common_settings(&mut item, &common_cli_items);
item.set_number_of_files_to_check(number_of_files);
if delete_files {
item.set_delete_method(DeleteMethod::Delete);
}
if smallest_mode {
item.set_search_mode(SearchMode::SmallestFiles);
}
item.find_big_files(Some(stop_receiver), Some(progress_sender));
save_and_print_results(&mut item, &common_cli_items);
}
fn empty_files(empty_files: EmptyFilesArgs, stop_receiver: &Receiver<()>, progress_sender: &Sender<ProgressData>) {
let EmptyFilesArgs { common_cli_items, delete_files } = empty_files;
let mut item = EmptyFiles::new();
set_common_settings(&mut item, &common_cli_items);
if delete_files {
item.set_delete_method(DeleteMethod::Delete);
}
item.find_empty_files(Some(stop_receiver), Some(progress_sender));
save_and_print_results(&mut item, &common_cli_items);
}
fn temporary(temporary: TemporaryArgs, stop_receiver: &Receiver<()>, progress_sender: &Sender<ProgressData>) {
let TemporaryArgs { common_cli_items, delete_files } = temporary;
let mut item = Temporary::new();
set_common_settings(&mut item, &common_cli_items);
if delete_files {
item.set_delete_method(DeleteMethod::Delete);
}
item.find_temporary_files(Some(stop_receiver), Some(progress_sender));
save_and_print_results(&mut item, &common_cli_items);
}
fn similar_images(similar_images: SimilarImagesArgs, stop_receiver: &Receiver<()>, progress_sender: &Sender<ProgressData>) {
let SimilarImagesArgs {
common_cli_items,
minimal_file_size,
maximal_file_size,
similarity_preset,
hash_alg,
image_filter,
hash_size,
delete_method,
dry_run,
allow_hard_links,
} = similar_images;
let mut item = SimilarImages::new();
set_common_settings(&mut item, &common_cli_items);
item.set_minimal_file_size(minimal_file_size);
item.set_maximal_file_size(maximal_file_size);
item.set_image_filter(image_filter);
item.set_hash_alg(hash_alg);
item.set_hash_size(hash_size);
item.set_delete_method(delete_method.delete_method);
item.set_dry_run(dry_run.dry_run);
item.set_similarity(return_similarity_from_similarity_preset(&similarity_preset, hash_size));
item.set_ignore_hard_links(!allow_hard_links.allow_hard_links);
item.find_similar_images(Some(stop_receiver), Some(progress_sender));
save_and_print_results(&mut item, &common_cli_items);
}
fn same_music(same_music: SameMusicArgs, stop_receiver: &Receiver<()>, progress_sender: &Sender<ProgressData>) {
let SameMusicArgs {
common_cli_items,
delete_method,
minimal_file_size,
maximal_file_size,
music_similarity,
dry_run,
minimum_segment_duration,
maximum_difference,
search_method,
} = same_music;
let mut item = SameMusic::new();
set_common_settings(&mut item, &common_cli_items);
item.set_minimal_file_size(minimal_file_size);
item.set_maximal_file_size(maximal_file_size);
item.set_music_similarity(music_similarity);
item.set_delete_method(delete_method.delete_method);
item.set_dry_run(dry_run.dry_run);
item.set_minimum_segment_duration(minimum_segment_duration);
item.set_maximum_difference(maximum_difference);
item.set_check_type(search_method);
item.find_same_music(Some(stop_receiver), Some(progress_sender));
save_and_print_results(&mut item, &common_cli_items);
}
fn invalid_symlinks(invalid_symlinks: InvalidSymlinksArgs, stop_receiver: &Receiver<()>, progress_sender: &Sender<ProgressData>) {
let InvalidSymlinksArgs { common_cli_items, delete_files } = invalid_symlinks;
let mut item = InvalidSymlinks::new();
set_common_settings(&mut item, &common_cli_items);
if delete_files {
item.set_delete_method(DeleteMethod::Delete);
}
item.find_invalid_links(Some(stop_receiver), Some(progress_sender));
save_and_print_results(&mut item, &common_cli_items);
}
fn broken_files(broken_files: BrokenFilesArgs, stop_receiver: &Receiver<()>, progress_sender: &Sender<ProgressData>) {
let BrokenFilesArgs { common_cli_items, delete_files } = broken_files;
let mut item = BrokenFiles::new();
set_common_settings(&mut item, &common_cli_items);
if delete_files {
item.set_delete_method(DeleteMethod::Delete);
}
item.find_broken_files(Some(stop_receiver), Some(progress_sender));
save_and_print_results(&mut item, &common_cli_items);
}
fn similar_videos(similar_videos: SimilarVideosArgs, stop_receiver: &Receiver<()>, progress_sender: &Sender<ProgressData>) {
let SimilarVideosArgs {
common_cli_items,
tolerance,
minimal_file_size,
maximal_file_size,
delete_method,
dry_run,
allow_hard_links,
} = similar_videos;
let mut item = SimilarVideos::new();
set_common_settings(&mut item, &common_cli_items);
item.set_minimal_file_size(minimal_file_size);
item.set_maximal_file_size(maximal_file_size);
item.set_tolerance(tolerance);
item.set_delete_method(delete_method.delete_method);
item.set_dry_run(dry_run.dry_run);
item.set_ignore_hard_links(!allow_hard_links.allow_hard_links);
item.find_similar_videos(Some(stop_receiver), Some(progress_sender));
save_and_print_results(&mut item, &common_cli_items);
}
fn bad_extensions(bad_extensions: BadExtensionsArgs, stop_receiver: &Receiver<()>, progress_sender: &Sender<ProgressData>) {
let BadExtensionsArgs { common_cli_items } = bad_extensions;
let mut item = BadExtensions::new();
set_common_settings(&mut item, &common_cli_items);
item.find_bad_extensions_files(Some(stop_receiver), Some(progress_sender));
save_and_print_results(&mut item, &common_cli_items);
}
fn save_and_print_results<T: CommonData + PrintResults>(component: &mut T, common_cli_items: &CommonCliItems) {
if let Some(file_name) = common_cli_items.file_to_save.file_name() {
if let Err(e) = component.print_results_to_file(file_name) {
error!("Failed to save results to file {e}");
Commands::EmptyFolders {
directories,
delete_folders,
file_to_save,
excluded_directories,
excluded_items,
#[cfg(target_family = "unix")]
exclude_other_filesystems,
} => {
let mut ef = EmptyFolder::new();
ef.set_included_directory(directories.directories);
ef.set_excluded_directory(excluded_directories.excluded_directories);
ef.set_excluded_items(excluded_items.excluded_items);
ef.set_delete_folder(delete_folders);
#[cfg(target_family = "unix")]
ef.set_exclude_other_filesystems(exclude_other_filesystems.exclude_other_filesystems);
ef.find_empty_folders(None, None);
if let Some(file_name) = file_to_save.file_name() {
if !ef.save_results_to_file(file_name) {
ef.get_text_messages().print_messages();
process::exit(1);
}
}
#[cfg(not(debug_assertions))] // This will show too much probably unnecessary data to debug, comment line only if needed
ef.print_results();
ef.get_text_messages().print_messages();
}
}
if let Some(file_name) = common_cli_items.json_compact_file_to_save.file_name() {
if let Err(e) = component.save_results_to_file_as_json(file_name, false) {
error!("Failed to save compact json results to file {e}");
Commands::BiggestFiles {
directories,
excluded_directories,
excluded_items,
allowed_extensions,
number_of_files,
file_to_save,
not_recursive,
#[cfg(target_family = "unix")]
exclude_other_filesystems,
delete_files,
} => {
let mut bf = BigFile::new();
bf.set_included_directory(directories.directories);
bf.set_excluded_directory(excluded_directories.excluded_directories);
bf.set_excluded_items(excluded_items.excluded_items);
bf.set_allowed_extensions(allowed_extensions.allowed_extensions.join(","));
bf.set_number_of_files_to_check(number_of_files);
bf.set_recursive_search(!not_recursive.not_recursive);
#[cfg(target_family = "unix")]
bf.set_exclude_other_filesystems(exclude_other_filesystems.exclude_other_filesystems);
if delete_files {
bf.set_delete_method(big_file::DeleteMethod::Delete);
}
bf.find_big_files(None, None);
if let Some(file_name) = file_to_save.file_name() {
if !bf.save_results_to_file(file_name) {
bf.get_text_messages().print_messages();
process::exit(1);
}
}
#[cfg(not(debug_assertions))] // This will show too much probably unnecessary data to debug, comment line only if needed
bf.print_results();
bf.get_text_messages().print_messages();
}
}
if let Some(file_name) = common_cli_items.json_pretty_file_to_save.file_name() {
if let Err(e) = component.save_results_to_file_as_json(file_name, true) {
error!("Failed to save pretty json results to file {e}");
Commands::EmptyFiles {
directories,
excluded_directories,
excluded_items,
allowed_extensions,
delete_files,
file_to_save,
not_recursive,
#[cfg(target_family = "unix")]
exclude_other_filesystems,
} => {
let mut ef = EmptyFiles::new();
ef.set_included_directory(directories.directories);
ef.set_excluded_directory(excluded_directories.excluded_directories);
ef.set_excluded_items(excluded_items.excluded_items);
ef.set_allowed_extensions(allowed_extensions.allowed_extensions.join(","));
ef.set_recursive_search(!not_recursive.not_recursive);
#[cfg(target_family = "unix")]
ef.set_exclude_other_filesystems(exclude_other_filesystems.exclude_other_filesystems);
if delete_files {
ef.set_delete_method(empty_files::DeleteMethod::Delete);
}
ef.find_empty_files(None, None);
if let Some(file_name) = file_to_save.file_name() {
if !ef.save_results_to_file(file_name) {
ef.get_text_messages().print_messages();
process::exit(1);
}
}
#[cfg(not(debug_assertions))] // This will show too much probably unnecessary data to debug, comment line only if needed
ef.print_results();
ef.get_text_messages().print_messages();
}
Commands::Temporary {
directories,
excluded_directories,
excluded_items,
#[cfg(target_family = "unix")]
exclude_other_filesystems,
delete_files,
file_to_save,
not_recursive,
} => {
let mut tf = Temporary::new();
tf.set_included_directory(directories.directories);
tf.set_excluded_directory(excluded_directories.excluded_directories);
tf.set_excluded_items(excluded_items.excluded_items);
tf.set_recursive_search(!not_recursive.not_recursive);
#[cfg(target_family = "unix")]
tf.set_exclude_other_filesystems(exclude_other_filesystems.exclude_other_filesystems);
if delete_files {
tf.set_delete_method(temporary::DeleteMethod::Delete);
}
tf.find_temporary_files(None, None);
if let Some(file_name) = file_to_save.file_name() {
if !tf.save_results_to_file(file_name) {
tf.get_text_messages().print_messages();
process::exit(1);
}
}
#[cfg(not(debug_assertions))] // This will show too much probably unnecessary data to debug, comment line only if needed
tf.print_results();
tf.get_text_messages().print_messages();
}
Commands::SimilarImages {
directories,
excluded_directories,
excluded_items,
file_to_save,
minimal_file_size,
maximal_file_size,
similarity_preset,
not_recursive,
#[cfg(target_family = "unix")]
exclude_other_filesystems,
hash_alg,
image_filter,
hash_size,
} => {
let mut sf = SimilarImages::new();
sf.set_included_directory(directories.directories);
sf.set_excluded_directory(excluded_directories.excluded_directories);
sf.set_excluded_items(excluded_items.excluded_items);
sf.set_minimal_file_size(minimal_file_size);
sf.set_maximal_file_size(maximal_file_size);
sf.set_recursive_search(!not_recursive.not_recursive);
#[cfg(target_family = "unix")]
sf.set_exclude_other_filesystems(exclude_other_filesystems.exclude_other_filesystems);
sf.set_image_filter(image_filter);
sf.set_hash_alg(hash_alg);
sf.set_hash_size(hash_size);
sf.set_similarity(return_similarity_from_similarity_preset(&similarity_preset, hash_size));
sf.find_similar_images(None, None);
if let Some(file_name) = file_to_save.file_name() {
if !sf.save_results_to_file(file_name) {
sf.get_text_messages().print_messages();
process::exit(1);
}
}
#[cfg(not(debug_assertions))] // This will show too much probably unnecessary data to debug, comment line only if needed
sf.print_results();
sf.get_text_messages().print_messages();
}
Commands::SameMusic {
directories,
excluded_directories,
excluded_items,
// delete_files,
file_to_save,
not_recursive,
#[cfg(target_family = "unix")]
exclude_other_filesystems,
minimal_file_size,
maximal_file_size,
music_similarity,
} => {
let mut mf = SameMusic::new();
mf.set_included_directory(directories.directories);
mf.set_excluded_directory(excluded_directories.excluded_directories);
mf.set_excluded_items(excluded_items.excluded_items);
mf.set_minimal_file_size(minimal_file_size);
mf.set_maximal_file_size(maximal_file_size);
mf.set_recursive_search(!not_recursive.not_recursive);
#[cfg(target_family = "unix")]
mf.set_exclude_other_filesystems(exclude_other_filesystems.exclude_other_filesystems);
mf.set_music_similarity(music_similarity);
// if delete_files {
// // TODO mf.set_delete_method(same_music::DeleteMethod::Delete);
// }
mf.find_same_music(None, None);
if let Some(file_name) = file_to_save.file_name() {
if !mf.save_results_to_file(file_name) {
mf.get_text_messages().print_messages();
process::exit(1);
}
}
#[cfg(not(debug_assertions))] // This will show too much probably unnecessary data to debug, comment line only if needed
mf.print_results();
mf.get_text_messages().print_messages();
}
Commands::InvalidSymlinks {
directories,
excluded_directories,
excluded_items,
allowed_extensions,
file_to_save,
not_recursive,
#[cfg(target_family = "unix")]
exclude_other_filesystems,
delete_files,
} => {
let mut ifs = InvalidSymlinks::new();
ifs.set_included_directory(directories.directories);
ifs.set_excluded_directory(excluded_directories.excluded_directories);
ifs.set_excluded_items(excluded_items.excluded_items);
ifs.set_allowed_extensions(allowed_extensions.allowed_extensions.join(","));
ifs.set_recursive_search(!not_recursive.not_recursive);
#[cfg(target_family = "unix")]
ifs.set_exclude_other_filesystems(exclude_other_filesystems.exclude_other_filesystems);
if delete_files {
ifs.set_delete_method(invalid_symlinks::DeleteMethod::Delete);
}
ifs.find_invalid_links(None, None);
if let Some(file_name) = file_to_save.file_name() {
if !ifs.save_results_to_file(file_name) {
ifs.get_text_messages().print_messages();
process::exit(1);
}
}
#[cfg(not(debug_assertions))] // This will show too much probably unnecessary data to debug, comment line only if needed
ifs.print_results();
ifs.get_text_messages().print_messages();
}
Commands::BrokenFiles {
directories,
excluded_directories,
excluded_items,
allowed_extensions,
delete_files,
file_to_save,
not_recursive,
#[cfg(target_family = "unix")]
exclude_other_filesystems,
} => {
let mut br = BrokenFiles::new();
br.set_included_directory(directories.directories);
br.set_excluded_directory(excluded_directories.excluded_directories);
br.set_excluded_items(excluded_items.excluded_items);
br.set_allowed_extensions(allowed_extensions.allowed_extensions.join(","));
br.set_recursive_search(!not_recursive.not_recursive);
#[cfg(target_family = "unix")]
br.set_exclude_other_filesystems(exclude_other_filesystems.exclude_other_filesystems);
if delete_files {
br.set_delete_method(broken_files::DeleteMethod::Delete);
}
br.find_broken_files(None, None);
if let Some(file_name) = file_to_save.file_name() {
if !br.save_results_to_file(file_name) {
br.get_text_messages().print_messages();
process::exit(1);
}
}
#[cfg(not(debug_assertions))] // This will show too much probably unnecessary data to debug, comment line only if needed
br.print_results();
br.get_text_messages().print_messages();
}
Commands::SimilarVideos {
directories,
excluded_directories,
excluded_items,
file_to_save,
not_recursive,
#[cfg(target_family = "unix")]
exclude_other_filesystems,
tolerance,
minimal_file_size,
maximal_file_size,
allowed_extensions,
} => {
let mut vr = SimilarVideos::new();
vr.set_included_directory(directories.directories);
vr.set_excluded_directory(excluded_directories.excluded_directories);
vr.set_excluded_items(excluded_items.excluded_items);
vr.set_allowed_extensions(allowed_extensions.allowed_extensions.join(","));
vr.set_recursive_search(!not_recursive.not_recursive);
#[cfg(target_family = "unix")]
vr.set_exclude_other_filesystems(exclude_other_filesystems.exclude_other_filesystems);
vr.set_minimal_file_size(minimal_file_size);
vr.set_maximal_file_size(maximal_file_size);
vr.set_tolerance(tolerance);
vr.find_similar_videos(None, None);
if let Some(file_name) = file_to_save.file_name() {
if !vr.save_results_to_file(file_name) {
vr.get_text_messages().print_messages();
process::exit(1);
}
}
#[cfg(not(debug_assertions))] // This will show too much probably unnecessary data to debug, comment line only if needed
vr.print_results();
vr.get_text_messages().print_messages();
}
Commands::Tester { test_image } => {
if test_image {
test_image_conversion_speed();
} else {
println!("At least one test should be choosen!");
}
}
}
if !cfg!(debug_assertions) {
component.print_results_to_output();
}
component.get_text_messages().print_messages();
}
fn set_common_settings<T>(component: &mut T, common_cli_items: &CommonCliItems)
where
T: CommonData + PrintResults,
{
set_number_of_threads(common_cli_items.thread_number);
component.set_included_directory(common_cli_items.directories.clone());
component.set_excluded_directory(common_cli_items.excluded_directories.clone());
component.set_excluded_items(common_cli_items.excluded_items.clone());
component.set_recursive_search(!common_cli_items.not_recursive);
#[cfg(target_family = "unix")]
component.set_exclude_other_filesystems(common_cli_items.exclude_other_filesystems);
component.set_allowed_extensions(common_cli_items.allowed_extensions.clone().join(","));
}

@ -1,93 +0,0 @@
use std::time::Duration;
use crossbeam_channel::Receiver;
use indicatif::{ProgressBar, ProgressStyle};
use czkawka_core::common_dir_traversal::{CheckingMethod, ProgressData, ToolType};
pub fn connect_progress(progress_receiver: &Receiver<ProgressData>) {
let mut pb = ProgressBar::new(1);
let mut latest_id = None;
while let Ok(progress_data) = progress_receiver.recv() {
if latest_id != Some(progress_data.current_stage) {
pb.finish_and_clear();
if progress_data.current_stage == 0 {
pb = get_progress_bar_for_collect_files();
} else if check_if_saving_cache(&progress_data) || check_if_loading_cache(&progress_data) {
pb = get_progress_loading_saving_cache(check_if_loading_cache(&progress_data));
} else {
pb = get_progress_known_values(progress_data.entries_to_check, &get_progress_message(&progress_data));
}
latest_id = Some(progress_data.current_stage);
}
pb.set_position(progress_data.entries_checked as u64);
if progress_data.current_stage == 0 && progress_data.tool_type != ToolType::EmptyFolders {
pb.set_message(format!("Collecting files: {}", progress_data.entries_checked));
} else if progress_data.current_stage == 0 {
pb.set_message(format!("Collecting folders: {}", progress_data.entries_checked));
}
}
pb.finish();
}
pub fn get_progress_message(progress_data: &ProgressData) -> String {
match (progress_data.tool_type, progress_data.current_stage, progress_data.checking_method) {
(ToolType::SameMusic, 2, CheckingMethod::AudioTags) | (ToolType::SameMusic, 5, CheckingMethod::AudioContent) => "Reading tags",
(ToolType::SameMusic, 2, CheckingMethod::AudioContent) => "Calculating fingerprint",
(ToolType::SameMusic, 4, CheckingMethod::AudioTags) => "Comparing tags",
(ToolType::SameMusic, 4, CheckingMethod::AudioContent) => "Comparing fingerprint",
(ToolType::Duplicate, 2, CheckingMethod::Hash) => "Reading prehashes",
(ToolType::Duplicate, 5, CheckingMethod::Hash) => "Reading hashes",
(ToolType::SimilarImages, 1, _) => "Reading images",
(ToolType::SimilarImages, 2, _) => "Comparing image hashes",
(ToolType::SimilarVideos, 1, _) => "Reading similar values",
(ToolType::BrokenFiles, 1, _) => "Checking broken files",
(ToolType::BadExtensions, 1, _) => "Checking extensions of files",
_ => unreachable!(),
}
.to_string()
}
pub fn check_if_loading_cache(progress_data: &ProgressData) -> bool {
matches!(
(progress_data.tool_type, progress_data.current_stage),
(ToolType::SameMusic, 1) | (ToolType::Duplicate, 1 | 4)
)
}
pub fn check_if_saving_cache(progress_data: &ProgressData) -> bool {
matches!(
(progress_data.tool_type, progress_data.current_stage),
(ToolType::SameMusic, 3) | (ToolType::Duplicate, 3 | 6)
)
}
pub fn get_progress_bar_for_collect_files() -> ProgressBar {
let pb = ProgressBar::new_spinner();
pb.enable_steady_tick(Duration::from_millis(120));
pb.set_style(
ProgressStyle::with_template("{msg} {spinner:.blue}")
.unwrap()
.tick_strings(&["▹▹▹▹▹", "▸▹▹▹▹", "▹▸▹▹▹", "▹▹▸▹▹", "▹▹▹▸▹", "▹▹▹▹▸", "▪▪▪▪▪"]),
);
pb
}
pub fn get_progress_known_values(max_value: usize, msg: &str) -> ProgressBar {
let pb = ProgressBar::new(max_value as u64);
pb.set_style(ProgressStyle::with_template(&format!("{msg} [{{bar}}] {{pos}}/{{len}} ")).unwrap().progress_chars("=> "));
pb
}
pub fn get_progress_loading_saving_cache(loading: bool) -> ProgressBar {
let msg = if loading { "Loading cache" } else { "Saving cache" };
let pb = ProgressBar::new_spinner();
pb.enable_steady_tick(Duration::from_millis(120));
pb.set_style(
ProgressStyle::with_template(&format!("{msg} {{spinner:.blue}}"))
.unwrap()
.tick_strings(&["▹▹▹▹▹", "▸▹▹▹▹", "▹▸▹▹▹", "▹▹▸▹▹", "▹▹▹▸▹", "▹▹▹▹▸", "▪▪▪▪▪"]),
);
pb
}

@ -1,91 +1,70 @@
[package]
name = "czkawka_core"
version = "7.0.0"
version = "4.1.0"
authors = ["Rafał Mikrut <mikrutrafal@protonmail.com>"]
edition = "2021"
rust-version = "1.75.0"
description = "Core of Czkawka app"
license = "MIT"
homepage = "https://github.com/qarmin/czkawka"
repository = "https://github.com/qarmin/czkawka"
build = "build.rs"
[dependencies]
humansize = "2.1"
rayon = "1.8"
crossbeam-channel = "0.5"
humansize = "1.1.1"
rayon = "1.5.1"
crossbeam-channel = "0.5.4"
# For saving/loading config files to specific directories
directories-next = "2.0"
directories-next = "2.0.0"
# Needed by similar images
image_hasher = "1.2"
bk-tree = "0.5"
image = { version = "0.24", default-features = false, features = ["gif", "jpeg", "ico", "png", "pnm", "tga", "tiff", "webp", "bmp", "hdr", "dxt", "dds", "farbfeld", "openexr", "qoi"] }
hamming = "0.1"
image_hasher = "1.0.0"
bk-tree = "0.4.0"
image = "0.24.1"
hamming = "0.1.3"
# Needed by same music
bitflags = "2.4"
lofty = "0.18"
bitflags = "1.3.2"
lofty="0.6.0"
# Needed by broken files
zip = { version = "0.6", features = ["aes-crypto", "bzip2", "deflate", "time"], default-features = false }
audio_checker = "0.1"
pdf = "0.9"
# Futures - needed by async progress sender
futures = "0.3.21"
# Needed by audio similarity feature
rusty-chromaprint = "0.2"
symphonia = { version = "0.5", features = ["all"] }
# Needed by broken files
zip = { version = "0.6.2", features=["aes-crypto", "bzip2", "deflate", "time"], default-features = false}
rodio = { version = "0.15.0", optional = true }
# Hashes for duplicate files
blake3 = "1.5"
crc32fast = "1.4"
xxhash-rust = { version = "0.8", features = ["xxh3"] }
blake3 = "1.3.1"
crc32fast = "1.3.2"
xxhash-rust = { version = "0.8.4", features = ["xxh3"] }
tempfile = "3.10"
tempfile = "3.3.0"
# Video Duplicates
vid_dup_finder_lib = "0.1"
ffmpeg_cmdline_utils = "0.1"
# Video Duplactes
vid_dup_finder_lib = "0.1.0"
ffmpeg_cmdline_utils = "0.1.1"
# Saving/Loading Cache
serde = "1.0"
bincode = "1.3"
serde_json = "1.0"
serde = "1.0.136"
bincode = "1.3.3"
serde_json = "1.0.79"
# Language
i18n-embed = { version = "0.14", features = ["fluent-system", "desktop-requester"] }
i18n-embed-fl = "0.8"
rust-embed = { version = "8.2", features = ["debug-embed"] }
once_cell = "1.19"
i18n-embed = { version = "0.13.4", features = ["fluent-system", "desktop-requester"] }
i18n-embed-fl = "0.6.4"
rust-embed = "6.3.0"
once_cell = "1.10.0"
# Raw image files
rawloader = "0.37"
imagepipe = "0.5"
libraw-rs = { version = "0.0.4", optional = true }
rawloader = "0.37.0"
imagepipe = "0.4.0"
# Checking for invalid extensions
mime_guess = "2.0"
infer = "0.15"
# Heif/Heic
libheif-rs = { version = "=0.18.0", optional = true } # Do not upgrade now, since Ubuntu 22.04 not works with newer version
libheif-sys = { version = "=1.14.2", optional = true } # 1.14.3 brake compilation on Ubuntu 22.04, so pin it to this version
anyhow = { version = "1.0" }
state = "0.6"
trash = "3.3"
os_info = { version = "3", default-features = false }
log = "0.4.20"
handsome_logger = "0.8"
fun_time = { version = "0.3", features = ["log"] }
[build-dependencies]
rustc_version = "0.4"
mime_guess = "2.0.4"
infer = "0.7.0"
[features]
default = []
heif = ["dep:libheif-rs", "dep:libheif-sys"]
libraw = ["dep:libraw-rs"]
broken_audio = ["rodio"]

@ -1,21 +0,0 @@
MIT License
Copyright (c) 2020-2024 Rafał Mikrut
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.

@ -1,3 +0,0 @@
# Czkawka Core
Core of Czkawka GUI/CLI and Krokiet projects.

@ -1,18 +0,0 @@
fn main() {
let rust_version = match rustc_version::version_meta() {
Ok(meta) => {
let rust_v = meta.semver.to_string();
let rust_date = meta.commit_date.unwrap_or_default();
format!("{rust_v} ({rust_date})")
}
Err(_) => "<unknown>".to_string(),
};
println!("cargo:rustc-env=RUST_VERSION_INTERNAL={rust_version}");
// Find if app is build with cranelift
if let Ok(codegen) = std::env::var("CARGO_PROFILE_RELEASE_CODEGEN_UNITS") {
if codegen == "1" {
println!("cargo:rustc-env=USING_CRANELIFT=1");
}
}
}

@ -1 +0,0 @@
../data/

@ -1,29 +0,0 @@
# Core
core_similarity_original = الأصل
core_similarity_very_high = عالية جدا
core_similarity_high = مرتفع
core_similarity_medium = متوسط
core_similarity_small = صغير
core_similarity_very_small = صغير جدا
core_similarity_minimal = الحد الأدنى
core_cannot_open_dir = لا يمكن فتح dir { $dir }، السبب { $reason }
core_cannot_read_entry_dir = لا يمكن قراءة الإدخال في dir { $dir }، السبب { $reason }
core_cannot_read_metadata_dir = لا يمكن قراءة البيانات الوصفية في dir { $dir }، السبب { $reason }
core_file_not_utf8_name = الملف { $name } ليس لديه اسم UTF-8 صالح (قد لا تظهر بعض الأحرف)
core_file_modified_before_epoch = يبدو أن الملف { $name } قد تم تعديله قبل يونكس Epoch
core_folder_modified_before_epoch = يبدو أن المجلد { $name } قد تم تعديله قبل يونكس Epoch
core_file_no_modification_date = غير قادر على الحصول على تاريخ التعديل من الملف { $name }، السبب { $reason }
core_folder_no_modification_date = غير قادر على الحصول على تاريخ التعديل من المجلد { $name }، السبب { $reason }
core_missing_no_chosen_included_directory = يجب توفير دليل واحد على الأقل
core_directory_wildcard_no_supported = الأدلة: البطاقات البرية في المسار غير مدعومة، تجاهل { $path }
core_directory_must_exists = الأدلة: يجب أن يكون مسار المجلد المتوفر موجودا، تجاهل { $path }
core_directory_must_be_directory = الأدلة: المسار المقدم يجب أن يشير إلى الدليل، تجاهل { $path }
core_included_directory_zero_valid_directories = خطأ في الدليل المضمن: لا يوجد حتى مسار واحد صحيح للإدراج المطلوب
core_excluded_directory_pointless_slash = الأدلة: استبعاد / لا معنى له، لأنه يعني أنه لن يتم مسح أي ملفات
core_directory_overlap = الأدلة: جميع الدلائل للبحث عن التداخل مع الدلائل المستبعدة
core_directory_unable_to_get_device_id = الأدلة: غير قادر على الحصول على معرف الجهاز من المجلد { $path }
core_ffmpeg_not_found = لا يمكن العثور على التثبيت الصحيح لFFmpeg
core_ffmpeg_not_found_windows = تأكد من أن ffmpeg.exe و ffprobe.exe متاحان في PATH أو يتم وضعهما مباشرة لنفس المجلد حيث التطبيق قابل للتنفيذ
core_ffmpeg_missing_in_snap = مقاطع فيديو مشابهة لا تعمل حاليا مع السعادة، إذا كنت تريد المساعدة في النظر - { $url }
core_saving_to_cache = تم الحفظ في الملف { $number } إدخالات ذاكرة التخزين المؤقت
core_loading_from_cache = تحميل من ذاكرة التخزين المؤقت { $number } إدخالات

@ -1,29 +0,0 @@
# Core
core_similarity_original = Оригинален
core_similarity_very_high = Много висок
core_similarity_high = Висок
core_similarity_medium = Среден
core_similarity_small = Малък
core_similarity_very_small = Много малък
core_similarity_minimal = Минимален
core_cannot_open_dir = Не може да се отвори папка { $dir }, причината е { $reason }
core_cannot_read_entry_dir = Не може да се прочете папка { $dir }, причината е { $reason }
core_cannot_read_metadata_dir = Не могат да се прочетат мета-данните в папка { $dir }, причината е { $reason }
core_file_not_utf8_name = Файлът { $name } няма валидно UTF-8 име (някои от символите може да не се визуализират)
core_file_modified_before_epoch = Файлът { $name } изглежда да е променен преди Unix Epoc
core_folder_modified_before_epoch = Папка { $name } изглежда да е променена преди Unix Epoc
core_file_no_modification_date = Невъзможно е да се получи променената дата от файл { $name }, причината е { $reason }
core_folder_no_modification_date = Невъзможно е да се извлече променената дата от файл { $name }, причината е { $reason }
core_missing_no_chosen_included_directory = Трябва да се предостави поне една директория
core_directory_wildcard_no_supported = Директории: Не се поддържат заместващи знаци в пътя, игнорирайки { $path }
core_directory_must_exists = Директории: Предоставеният път до папката трябва да съществува, като се игнорира { $path }
core_directory_must_be_directory = Директории: Предоставеният път трябва да сочи към директорията, като не се взема под внимание { $path }
core_included_directory_zero_valid_directories = Включена директория ГРЕШКА: Не е намерен дори един правилен път към включената директория, която се изисква
core_excluded_directory_pointless_slash = Директории: Изключването на / е безсмислено, защото означава, че няма да бъдат сканирани никакви файлове
core_directory_overlap = Директории: Всички директории за търсене се припокриват с изключените директории
core_directory_unable_to_get_device_id = Директории: Невъзможно е да се получи идентификатор на устройството от папка { $path }
core_ffmpeg_not_found = Не мога да намеря правилната инсталация на FFmpeg
core_ffmpeg_not_found_windows = Уверете се, че ffmpeg.exe и ffprobe.exe са налични в PATH или са поставени директно в същата папка, където е изпълнимото приложение
core_ffmpeg_missing_in_snap = Подобни видеоклипове не работят в момента със snap, ако искате помощ, погледнете - { $url }
core_saving_to_cache = Запазени във файл {$number } записи в кеша
core_loading_from_cache = Заредени от кеш { $number } вписвания

@ -1,29 +1,27 @@
# Core
core_similarity_original = Originál
core_similarity_very_high = Velmi vysoká
core_similarity_high = Vysoká
core_similarity_medium = Střední
core_similarity_small = Malá
core_similarity_very_small = Velmi malá
core_similarity_minimal = Minimální
core_cannot_open_dir = Nelze otevřít adresář { $dir }, důvod { $reason }
core_cannot_read_entry_dir = Nelze načíst záznam v adresáři { $dir }, důvod { $reason }
core_cannot_read_metadata_dir = Nelze načíst metadata v adresáři { $dir }, důvod { $reason }
core_cannot_open_dir = Nelze otevřít dir { $dir }, důvod { $reason }
core_cannot_read_entry_dir = Nelze číst záznam v adresáři { $dir }, důvod { $reason }
core_cannot_read_metadata_dir = Metadata nelze číst v adresáři { $dir }, důvod { $reason }
core_file_not_utf8_name = Soubor { $name } nemá platný název UTF-8 (některé znaky nemusí být zobrazeny)
core_file_modified_before_epoch = Soubor { $name } se zdá být upraven před unixovým Epochem (1.1.1970)
core_folder_modified_before_epoch = Složka { $name } se zdá být upravena před unixovým Epochem (1.1.1970)
core_file_modified_before_epoch = Soubor { $name } se zdá být před Unix Epoch upraven
core_folder_modified_before_epoch = Složka { $name } se zdá být upravena před Unixem Epoch
core_file_no_modification_date = Nelze získat datum úpravy ze souboru { $name }, důvod { $reason }
core_folder_no_modification_date = Nelze získat datum úpravy ze složky { $name }, důvod { $reason }
core_missing_no_chosen_included_directory = Musí být uveden alespoň jeden adresář
core_directory_wildcard_no_supported = Adresáře: Zástupné znaky v cestě nejsou podporovány, ignoruji { $path }
core_directory_must_exists = Adresáře: Poskytnutá cesta ke složce musí existovat, ignoruji { $path }
core_directory_must_be_directory = Adresáře: Poskytnutá cesta musí směřovat do adresáře, ignoruji { $path }
core_directory_relative_path = Adresáře: Zástupné znaky v cestě nejsou podporovány, ignoruji { $path }
core_directory_must_exists = Adresáře: Poskytnutá cesta ke složce musí skončit, ignoruji { $path }
core_directory_must_be_directory = Adresáře: Poskytnutá cesta musí směřovat do adresáře, ignoruje { $path }
core_included_directory_zero_valid_directories = CHYBA zahrnutí adresáře: Nenalezena ani jedna správná cesta k zahrnutí, která je vyžadována
core_excluded_directory_pointless_slash = Adresáře: Vyloučení / je bezúčelné, protože to znamená, že žádné soubory nebudou naskenovány
core_directory_overlap = Adresáře: Všechny adresáře pro vyhledávání se překrývají s vyloučením adresářů
core_directory_unable_to_get_device_id = Adresáře: Nelze získat ID zařízení ze složky { $path }
core_ffmpeg_not_found = Nelze najít správnou instalaci FFmpeg
core_ffmpeg_not_found_windows = Ujistěte se, že ffmpeg.exe a ffprobe.exe jsou k dispozici v PATH nebo jsou umístěny přímo do stejné složky, kde lze spustit aplikaci
core_ffmpeg_missing_in_snap = Podobná videa v současné době nefungují se snapem, pokud chcete nápovědu sledovat - { $url }
core_saving_to_cache = Uloženo do souboru { $number } položek mezipaměti
core_loading_from_cache = Načteno z { $number } položek keše

@ -1,5 +1,4 @@
# Core
core_similarity_original = Original
core_similarity_very_high = Sehr Hoch
core_similarity_high = Hoch
core_similarity_medium = Mittel
@ -10,20 +9,19 @@ core_cannot_open_dir = Verzeichnis { $dir } kann nicht geöffnet werden, Grund {
core_cannot_read_entry_dir = Kann Eintrag in Verzeichnis { $dir } nicht lesen, Grund { $reason }
core_cannot_read_metadata_dir = Metadaten können in Verzeichnis { $dir } nicht gelesen werden, Grund { $reason }
core_file_not_utf8_name = Datei { $name } hat keinen gültigen UTF-8-Namen (einige Zeichen könnten nicht angezeigt werden)
core_file_modified_before_epoch = Datei { $name } scheint vor dieser Unix-Epoche geändert worden zu sein
core_folder_modified_before_epoch = Ordner { $name } scheint vor dieser Unix-Epoche geändert worden zu sein
core_file_modified_before_epoch = Datei { $name } scheint vor dem Unix-Epoch geändert worden zu sein
core_folder_modified_before_epoch = Ordner { $name } scheint vor dem Unix-Epoch geändert worden zu sein
core_file_no_modification_date = Konnte das Änderungsdatum von Datei { $name } nicht abrufen, Grund { $reason }
core_folder_no_modification_date = Konnte das Änderungsdatum aus dem Ordner { $name } nicht abrufen, Grund { $reason }
core_missing_no_chosen_included_directory = Mindestens ein Verzeichnis muss angegeben werden
core_directory_wildcard_no_supported = Verzeichnisse: Wildcards im Pfad werden nicht unterstützt, { $path } wird ignoriert
core_directory_relative_path = Verzeichnisse: Relativer Pfad wird nicht unterstützt, { $path } wird ignoriert
core_directory_must_exists = Verzeichnisse: Der angegebene Ordnerpfad muss existieren, { $path } wird ignoriert
core_directory_must_be_directory = Verzeichnisse: Der angegebene Pfad muss auf das Verzeichnis zeigen, { $path } wird ignoriert
core_included_directory_zero_valid_directories = Einbezogenes Verzeichnis-FEHLER: Kein korrekter Pfad gefunden, welcher einbezogen werden soll, was erforderlich ist
core_included_directory_zero_valid_directories = Inklusive Verzeichnis-FEHLER: Nicht einmal einen korrekten Pfad zu inkludiert, der erforderlich ist
core_excluded_directory_pointless_slash = Verzeichnisse: / auszuschließen ist sinnlos, weil somit keine Dateien gescannt werden
core_directory_overlap = Verzeichnisse: Alle zu durchsuchende Verzeichnisse überlappen mit den ausgeschlossenen Verzeichnissen
core_directory_unable_to_get_device_id = Verzeichnisse: Geräte-ID kann nicht aus dem Ordner { $path } geholt werden
core_ffmpeg_not_found = Keine richtige Installation von FFmpeg gefunden
core_ffmpeg_not_found_windows = Stellen Sie sicher, dass ffmpeg.exe und ffprobe.exe in PATH verfügbar sind oder direkt in den gleichen Ordner gelegt werden, in dem die App ausführbar ist
core_ffmpeg_missing_in_snap = Ähnliche Videos funktionieren derzeit nicht mit Snap, wenn du Hilfe möchtest, besuche - { $url }
core_saving_to_cache = { $number } Cache-Einträge in der Datei gespeichert
core_loading_from_cache = { $number } Einträge aus dem Cache geladen

@ -1,29 +0,0 @@
# Core
core_similarity_original = Αρχικό
core_similarity_very_high = Πολύ Υψηλή
core_similarity_high = Υψηλή
core_similarity_medium = Μεσαίο
core_similarity_small = Μικρό
core_similarity_very_small = Πολύ Μικρό
core_similarity_minimal = Ελάχιστα
core_cannot_open_dir = Αδυναμία ανοίγματος dir { $dir }, λόγος { $reason }
core_cannot_read_entry_dir = Αδυναμία ανάγνωσης καταχώρησης στον κατάλογο { $dir }, λόγος { $reason }
core_cannot_read_metadata_dir = Αδύνατη η ανάγνωση μεταδεδομένων στον κατάλογο { $dir }, λόγος { $reason }
core_file_not_utf8_name = Το αρχείο { $name } δεν έχει ένα έγκυρο όνομα UTF-8 (ορισμένοι χαρακτήρες μπορεί να μην εμφανίζονται)
core_file_modified_before_epoch = Το { $name } φαίνεται να τροποποιείται πριν το Unix Epoch
core_folder_modified_before_epoch = Ο φάκελος { $name } φαίνεται να τροποποιείται πριν το Unix Epoch
core_file_no_modification_date = Δεν είναι δυνατή η λήψη ημερομηνίας τροποποίησης από το αρχείο { $name }, λόγος { $reason }
core_folder_no_modification_date = Δεν είναι δυνατή η λήψη ημερομηνίας τροποποίησης από το φάκελο { $name }, λόγος { $reason }
core_missing_no_chosen_included_directory = Πρέπει να παρέχεται τουλάχιστον ένας κατάλογος
core_directory_wildcard_no_supported = Κατάλογοι: Δεν υποστηρίζονται μπαλαντέρ στο μονοπάτι, αγνοώντας { $path }
core_directory_must_exists = Κατάλογοι: Η παρεχόμενη διαδρομή φακέλου πρέπει να υπάρχει, αγνοώντας { $path }
core_directory_must_be_directory = Κατάλογοι: Παρέχεται διαδρομή πρέπει να δείχνει στον κατάλογο, αγνοώντας { $path }
core_included_directory_zero_valid_directories = Συμπεριλαμβανόμενος κατάλογος ΣΦΑΛΜΑ: Δεν βρέθηκε ούτε μια σωστή διαδρομή για να συμπεριληφθεί η οποία απαιτείται
core_excluded_directory_pointless_slash = Κατάλογοι: Εξαιρούνται / είναι άσκοπες, επειδή σημαίνει ότι δεν θα σαρωθούν αρχεία
core_directory_overlap = Κατάλογοι: Όλοι οι κατάλογοι για αναζήτηση επικαλύψεων με αποκλεισμένους καταλόγους
core_directory_unable_to_get_device_id = Κατάλογοι: Αδυναμία λήψης id συσκευής από το φάκελο { $path }
core_ffmpeg_not_found = Αδυναμία εύρεσης σωστής εγκατάστασης του FFmpeg
core_ffmpeg_not_found_windows = Να είστε βέβαιος ότι ffmpeg.exe και ffprobe.exe είναι διαθέσιμα σε PATH ή τίθενται απευθείας στον ίδιο φάκελο όπου είναι εκτελέσιμο app
core_ffmpeg_missing_in_snap = Παρόμοια βίντεο δεν λειτουργούν αυτή τη στιγμή με συμπληρωματικό πρόγραμμα, αν θέλετε να δείτε βοήθεια - { $url }
core_saving_to_cache = Αποθηκεύτηκε στο αρχείο καταχωρήσεις { $number } cache
core_loading_from_cache = Φορτώθηκε από καταχωρήσεις της λανθάνουσας μνήμης { $number }

@ -1,5 +1,4 @@
# Core
core_similarity_original = Original
core_similarity_very_high = Very High
core_similarity_high = High
core_similarity_medium = Medium
@ -18,6 +17,7 @@ core_folder_no_modification_date = Unable to get modification date from folder {
core_missing_no_chosen_included_directory = At least one directory must be provided
core_directory_wildcard_no_supported = Directories: Wildcards in path are not supported, ignoring { $path }
core_directory_relative_path = Directories: Relative path are not supported, ignoring { $path }
core_directory_must_exists = Directories: Provided folder path must exist, ignoring { $path }
core_directory_must_be_directory = Directories: Provided path must point at the directory, ignoring { $path }
core_included_directory_zero_valid_directories = Included Directory ERROR: Not found even one correct path to included which is required
@ -26,7 +26,6 @@ core_directory_overlap = Directories: All directories to search overlaps with ex
core_directory_unable_to_get_device_id = Directories: Unable to get device id from folder { $path }
core_ffmpeg_not_found = Cannot find proper installation of FFmpeg
core_ffmpeg_not_found_windows = Be sure that ffmpeg.exe and ffprobe.exe are available in PATH or are put directly to same folder where is app executable
core_ffmpeg_missing_in_snap = Similar Videos don't work currently with snap, if you want help look at - { $url }
core_saving_to_cache = Saved to file { $number } cache entries

@ -1,5 +1,4 @@
# Core
core_similarity_original = Original
core_similarity_very_high = Muy alta
core_similarity_high = Alta
core_similarity_medium = Medio
@ -16,14 +15,13 @@ core_file_no_modification_date = No se puede obtener la fecha de modificación d
core_folder_no_modification_date = No se puede obtener la fecha de modificación de la carpeta { $name }, razón { $reason }
core_missing_no_chosen_included_directory = Debe proporcionarse al menos un directorio
core_directory_wildcard_no_supported = Directorios: Los comodines en la ruta no son compatibles, ignorando { $path }
core_directory_relative_path = Directorios: No se admite la ruta relativa, ignorando { $path }
core_directory_must_exists = Directorios: La ruta de la carpeta debe salir, ignorando { $path }
core_directory_must_be_directory = Directorios: La ruta proporcionada debe apuntar al directorio, ignorando { $path }
core_included_directory_zero_valid_directories = ERROR del directorio incluido: No se ha encontrado ni una ruta correcta a incluida que es necesaria
core_excluded_directory_pointless_slash = Directorios: Excluyendo / es inútil, ya que no se analizarán archivos
core_directory_overlap = Directorios: Todos los directorios para buscar superposiciones con directorios excluidos
core_directory_unable_to_get_device_id = Directorios: No se puede obtener el id del dispositivo de la carpeta { $path }
core_ffmpeg_not_found = No se puede encontrar la instalación correcta de FFmpeg
core_ffmpeg_not_found_windows = Asegúrese de que ffmpeg.exe y ffprobe.exe están disponibles en PATH o se colocan directamente en la misma carpeta donde es ejecutable la aplicación
core_ffmpeg_missing_in_snap = Los Videos Similares no funcionan actualmente con el snap, si quieres ayuda mira - { $url }
core_saving_to_cache = Guardado en el archivo { $number } entradas de caché
core_loading_from_cache = Cargado desde { $number } entradas de caché

@ -1,29 +1,27 @@
# Core
core_similarity_original = Originale
core_similarity_very_high = Très haute
core_similarity_high = Haute
core_similarity_medium = Moyenne
core_similarity_small = Basse
core_similarity_very_small = Très basse
core_similarity_minimal = Minimale
core_cannot_open_dir = Impossible douvrir le répertoire { $dir }. Raison: { $reason }
core_cannot_read_entry_dir = Impossible de lire l'entrée dans le répertoire { $dir }. Raison: { $reason }
core_cannot_read_metadata_dir = Impossible de lire les métadonnées dans le répertoire { $dir }. Raison : { $reason }
core_file_not_utf8_name = Le fichier { $name } n'a pas de nom UTF-8 valide (certains caractères peuvent ne pas être affichés)
core_file_modified_before_epoch = Le fichier { $name } semble avoir été modifié avant l'epoch Unix
core_folder_modified_before_epoch = Le dossier { $name } semble avoir été modifié avant l'epoch Unix
core_file_no_modification_date = Impossible d'obtenir la date de modification du fichier { $name }. Raison : { $reason }
core_folder_no_modification_date = Impossible d'obtenir la date de modification du dossier { $name }. Raison: { $reason }
core_cannot_open_dir = Impossible douvrir le répertoire { $dir }, raison: { $reason }
core_cannot_read_entry_dir = Impossible de lire l'entrée dans le répertoire { $dir }, raison: { $reason }
core_cannot_read_metadata_dir = Impossible de lire les métadonnées dans le répertoire { $dir }, raison: { $reason }
core_file_not_utf8_name = Le fichier { $name } n'a pas de nom UTF-8 valide (certains caractères ne peuvent pas être affichés)
core_file_modified_before_epoch = Le fichier { $name } semble avoir été modifié avant l'époque Unix
core_folder_modified_before_epoch = Le dossier { $name } semble avoir été modifié avant l'époque Unix
core_file_no_modification_date = Impossible d'obtenir la date de modification du fichier { $name }, raison: { $reason }
core_folder_no_modification_date = Impossible d'obtenir la date de modification du dossier { $name }, raison: { $reason }
core_missing_no_chosen_included_directory = Au moins un répertoire doit être fourni
core_directory_wildcard_no_supported = Répertoires : les jokers dans le chemin ne sont pas pris en charge. { $path } est ignoré
core_directory_must_exists = Répertoires : le chemin du dossier fourni doit exister. { $path } est ignoré
core_directory_must_be_directory = Répertoires : le chemin fourni doit pointer vers le répertoire, { $path } est ignoré
core_included_directory_zero_valid_directories = ERREUR de répertoire inclus : aucun chemin correct n'a été trouvé alors qu'au moins un est nécessaire
core_excluded_directory_pointless_slash = Répertoires: exclure « / » est inutile car cela signifie qu'aucun fichier ne sera scanné
core_directory_overlap = Répertoires : tous les répertoires dans lesquels rechercher des chevauchements avec des répertoires exclus
core_directory_unable_to_get_device_id = Répertoires : impossible d'obtenir l'ID de l'appareil depuis le dossier { $path }
core_directory_wildcard_no_supported = Répertoires : Les jokers dans le chemin ne sont pas pris en charge, ignorant { $path }
core_directory_relative_path = Répertoires : Le chemin relatif n'est pas pris en charge, ignorant { $path }
core_directory_must_exists = Répertoires : Le chemin du dossier fourni doit se terminer, ignorant { $path }
core_directory_must_be_directory = Répertoires : Le chemin fourni doit pointer dans le répertoire, { $path }
core_included_directory_zero_valid_directories = ERREUR de répertoire inclus : Aucun chemin n'a été trouvé, même un chemin correct à inclure qui est requis
core_excluded_directory_pointless_slash = Répertoires: Exclure / est inutile, car cela signifie qu'aucun fichier ne sera scanné
core_directory_overlap = Répertoires : Tous les répertoires pour rechercher des chevauchements avec des répertoires exclus
core_ffmpeg_not_found = Impossible de trouver une installation correcte de FFmpeg
core_ffmpeg_not_found_windows = Assurez-vous que ffmpeg.exe et ffprobe.exe sont disponibles dans PATH ou sont présents dans le même dossier que l'exécutable de l'application
core_ffmpeg_missing_in_snap = Les vidéos similaires ne fonctionnent pas actuellement avec snap. Si vous voulez de l'aide référez vous à - { $url }
core_saving_to_cache = { $number } entrées du cache enregistres dans un fichier
core_loading_from_cache = { $number } entrées chargées depuis le cache
core_ffmpeg_missing_in_snap = Les vidéos similaires ne fonctionnent pas actuellement avec un instantané, si vous voulez de l'aide - { $url }
core_saving_to_cache = Enregistré dans le fichier { $number } entrées du cache
core_loading_from_cache = Chargé depuis l'entrées { $number } du cache

@ -1,5 +1,4 @@
# Core
core_similarity_original = Originali
core_similarity_very_high = Altissima
core_similarity_high = Alta
core_similarity_medium = Media
@ -16,14 +15,13 @@ core_file_no_modification_date = Impossibile recuperare data di modifica dal fil
core_folder_no_modification_date = Impossibile recuperare data di modifica dalla cartella { $name }, ragione { $reason }
core_missing_no_chosen_included_directory = Almeno una directory deve essere fornita
core_directory_wildcard_no_supported = Cartelle: i caratteri jolly nel percorso non sono supportati, ignorando { $path }
core_directory_relative_path = Directories: Il percorso relativo non è supportato, ignorando { $path }
core_directory_must_exists = Directories: Il percorso della cartella fornito deve uscire, ignorando { $path }
core_directory_must_be_directory = Directories: Il percorso fornito deve puntare alla directory, ignorando { $path }
core_included_directory_zero_valid_directories = ERRORE Directory incluso: Non trovato nemmeno un percorso corretto incluso che è richiesto
core_excluded_directory_pointless_slash = Cartelle: Escludere / è inutile, perché significa che nessun file verrà scansionato
core_directory_overlap = Directories: Tutte le directory per cercare sovrapposizioni con directory escluse
core_directory_unable_to_get_device_id = Directory: non è possibile ottenere l'id del dispositivo dalla cartella { $path }
core_ffmpeg_not_found = Impossibile trovare la corretta installazione di FFmpeg
core_ffmpeg_not_found_windows = Quando si utilizza Windows essere sicuri che ffmpeg.exe e ffprobe.exe sono disponibili in PATH o sono messi direttamente nella stessa cartella dove è eseguibile l'applicazione
core_ffmpeg_missing_in_snap = Video simili non funzionano attualmente con snap, se si desidera aiutare a guardare - { $url }
core_saving_to_cache = Salvato nel file { $number } voci cache
core_loading_from_cache = Caricato dalla cache { $number } voci

@ -1,5 +1,4 @@
# Core
core_similarity_original = 新規に作成
core_similarity_very_high = 非常に高い
core_similarity_high = 高い
core_similarity_medium = ミディアム
@ -16,14 +15,13 @@ core_file_no_modification_date = ファイル { $name } から変更日を取得
core_folder_no_modification_date = フォルダ { $name } から変更日を取得できません、理由 { $reason }
core_missing_no_chosen_included_directory = 少なくとも 1 つのディレクトリを指定する必要があります。
core_directory_wildcard_no_supported = ディレクトリ: パス内のワイルドカードはサポートされていません。 { $path } を無視してください
core_directory_relative_path = ディレクトリ: 相対パスはサポートされていません。 { $path } を無視してください
core_directory_must_exists = ディレクトリ: 指定されたフォルダパスは、 { $path } を無視して終了する必要があります
core_directory_must_be_directory = ディレクトリ: 指定されたパスはディレクトリを指す必要があります。 { $path } を無視します
core_included_directory_zero_valid_directories = 含まれるディレクトリエラー: 必須の正しいパスが1つも見つかりません
core_excluded_directory_pointless_slash = ディレクトリ: ファイルがスキャンされないことを意味するため、除外/無意味です
core_directory_overlap = ディレクトリ: 除外されたディレクトリとオーバーラップを検索するすべてのディレクトリ
core_directory_unable_to_get_device_id = ディレクトリ: フォルダ { $path } からデバイス ID を取得できません
core_ffmpeg_not_found = 適切なFFmpegのインストールが見つかりません
core_ffmpeg_not_found_windows = ffmpeg.exeとffprobe.exeがPATHで使用できることを確認するか、アプリ実行ファイルのある同じフォルダに直接配置してください。
core_ffmpeg_missing_in_snap = ヘルプを見たい場合は、現在同様のビデオはスナップでは動作しません - { $url }
core_saving_to_cache = { $number } 個のキャッシュエントリをファイルに保存しました
core_loading_from_cache = キャッシュから { $number } 個のエントリが読み込まれました

@ -1,29 +0,0 @@
# Core
core_similarity_original = 원본
core_similarity_very_high = 매우 높음
core_similarity_high = 높음
core_similarity_medium = 보통
core_similarity_small = 낮음
core_similarity_very_small = 매우 낮음
core_similarity_minimal = 최소
core_cannot_open_dir = { $dir } 디렉터리를 열 수 없습니다. 이유: { $reason }
core_cannot_read_entry_dir = { $dir } 디렉터리를 열 수 없습니다. 이유: { $reason }
core_cannot_read_metadata_dir = { $dir } 디렉터리의 메타데이터를 열 수 없습니다. 이유: { $reason }
core_file_not_utf8_name = 파일 이름 "{ $name }"은 유효한 UTF-8 이름이 아닙니다. 일부 글자가 보이지 않을 수 있습니다.
core_file_modified_before_epoch = { $name } 파일이 Unix 시간 이전에 수정된 것 같습니다.
core_folder_modified_before_epoch = { $name } 폴더가 Unix 시간 이전에 수정된 것 같습니다.
core_file_no_modification_date = { $name } 파일의 수정된 시각을 읽을 수 없습니다. 이유: { $reason }
core_folder_no_modification_date = { $name } 폴더의 수정된 시각을 읽을 수 없습니다. 이유: { $reason }
core_missing_no_chosen_included_directory = 적어도 1개 이상의 디렉터리가 주어져야 합니다.
core_directory_wildcard_no_supported = 디렉터리: 경로에는 와일드 카드가 지원되지 않습니다. "{ $path }"는 무시됩니다.
core_directory_must_exists = 디렉터리: 주어진 폴더 경로는 반드시 존재해야 합니다. "{ $path }"는 무시됩니다.
core_directory_must_be_directory = 디렉터리: 주어진 경로는 디렉터리를 가리켜야 합니다. "{ $path }"는 무시됩니다.
core_included_directory_zero_valid_directories = 검색 대상 디렉터리 오류: 적어도 1개 이상의 유효한 경로가 주어져야 합니다. 유효한 경로가 하나도 없습니다.
core_excluded_directory_pointless_slash = 디렉터리: "/"를 제외하는 것은 아무런 파일도 스캔하지 않는다는 것이므로, 의미가 없습니다.
core_directory_overlap = 디렉터리: 모든 주어진 경로가 검색 제외 경로와 겹칩니다.
core_directory_unable_to_get_device_id = 디렉터리: { $path }의 장치 ID를 가져올 수 없습니다.
core_ffmpeg_not_found = 유효한 FFmpeg 설치를 발견하지 못했습니다.
core_ffmpeg_not_found_windows = ffmpeg.exe와 ffprobe.exe가 시스템 변수 PATH에서 사용 가능하거나, 이 프로그램의 경로와 같은 곳에 위치하는지 확인하세요.
core_ffmpeg_missing_in_snap = 현재 ffmpeg snap에서는 유사한 영상 검색이 지원되지 않습니다. 더 많은 정보는 { $url }에서 확인하세요.
core_saving_to_cache = { $number }개의 파일을 캐시에 저장했습니다.
core_loading_from_cache = { $number }개의 파일을 캐시에서 불러왔습니다.

@ -1,29 +0,0 @@
# Core
core_similarity_original = Origineel
core_similarity_very_high = Zeer hoog
core_similarity_high = hoog
core_similarity_medium = Middelgroot
core_similarity_small = Klein
core_similarity_very_small = Zeer Klein
core_similarity_minimal = Minimaal
core_cannot_open_dir = Kan dir { $dir }niet openen, reden { $reason }
core_cannot_read_entry_dir = Kan invoer niet lezen in map { $dir }, reden { $reason }
core_cannot_read_metadata_dir = Kan metadata niet lezen in map { $dir }, reden { $reason }
core_file_not_utf8_name = Bestand { $name } heeft geen geldige UTF-8-naam (sommige tekens kunnen niet worden getoond)
core_file_modified_before_epoch = Het bestand { $name } lijkt aangepast te zijn voor Unix Epoch
core_folder_modified_before_epoch = Map { $name } lijkt aangepast te zijn voor Unix Epoch
core_file_no_modification_date = Niet in staat om de datum van bestand { $name }te krijgen, reden { $reason }
core_folder_no_modification_date = Niet in staat om wijzigingsdatum van map { $name }te krijgen, reden { $reason }
core_missing_no_chosen_included_directory = Ten minste één map moet worden opgegeven
core_directory_wildcard_no_supported = Maps: Wildcards op pad worden niet ondersteund, negeer { $path }
core_directory_must_exists = Maps: Opgegeven mappad moet bestaan, afwijzend { $path }
core_directory_must_be_directory = Directories: Het opgegeven pad moet naar de map wijzen, { $path } wordt genegeerd
core_included_directory_zero_valid_directories = Inclusief map FOUT: Er is niet één juist pad gevonden naar de map die vereist is
core_excluded_directory_pointless_slash = Maps: Uitsluiten/is zinloos, omdat er geen bestanden worden gescand
core_directory_overlap = Maps: alle mappen om overlappingen te zoeken met uitgesloten mappen
core_directory_unable_to_get_device_id = Maps: Kan apparaat-id niet ophalen uit map { $path }
core_ffmpeg_not_found = Kan de juiste installatie van FFmpeg niet vinden
core_ffmpeg_not_found_windows = Zorg ervoor dat ffmpeg.exe en ffprobe.exe beschikbaar zijn in PATH of direct in dezelfde map geplaatst zijn waar de app uitvoerbaar is
core_ffmpeg_missing_in_snap = Vergelijkbare video's werken momenteel niet met snap, als je wilt helpen kijken naar - { $url }
core_saving_to_cache = Opgeslagen in bestand { $number } cache items
core_loading_from_cache = Geladen uit cache { $number } items

@ -1,5 +1,4 @@
# Core
core_similarity_original = Opprinnelig
core_similarity_very_high = Veldig høy
core_similarity_high = Høy
core_similarity_medium = Middels
@ -16,14 +15,13 @@ core_file_no_modification_date = Klarte ikke å hente endringsdato fra filen { $
core_folder_no_modification_date = Klarte ikke å hente endringsdato fra mappen { $name }. Årsak { $reason }
core_missing_no_chosen_included_directory = Minst en katalog må angis
core_directory_wildcard_no_supported = Kataloger: Jokertegn i stien støttes ikke, ignorerer { $path }
core_directory_relative_path = Kataloger: Relativ sti støttes ikke. Ignorerer { $path }
core_directory_must_exists = Kataloger: Angitt sti for mappe må eksistere. Ignorerer { $path }
core_directory_must_be_directory = Kataloger: Angitt sti må peke på mappen. Ignorerer { $path }
core_included_directory_zero_valid_directories = Feil med inkludert katalog: Fant ikke én eneste sti til den inkluderte mappen, noe som er påkrevd
core_excluded_directory_pointless_slash = Kataloger: Ekskludere / er poengløst, fordi det betyr at ingen filer vil bli skannet
core_directory_overlap = Kataloger: Alle kataloger å søke overlapper med ekskluderte mapper
core_directory_unable_to_get_device_id = Mapper: Kan ikke hente enhets id fra mappen { $path }
core_ffmpeg_not_found = Klarte ikke å finne riktig installasjon av FFmpeg
core_ffmpeg_not_found_windows = Pass på at ffmpeg.exe og ffprobe.exe er tilgjengelig i PATH eller plasseres direkte i samme mappe som appen kan kjøres
core_ffmpeg_missing_in_snap = Lignende videoer fungerer ikke for øyeblikket med snap. Hvis du vil ha hjelp kan du se her - { $url }
core_saving_to_cache = Lagret i filen { $number } cache-oppføringer
core_loading_from_cache = Lastet fra hurtigbuffer { $number } oppføringer

@ -1,5 +1,4 @@
# Core
core_similarity_original = Oryginalny
core_similarity_very_high = Bardzo Duże
core_similarity_high = Duże
core_similarity_medium = Średnie
@ -16,14 +15,13 @@ core_file_no_modification_date = Nie udało się pobrać daty modyfikacji z plik
core_folder_no_modification_date = Nie udało się pobrać daty modyfikacji z folderu { $name }, powód { $reason }
core_missing_no_chosen_included_directory = Należy podać co najmniej jeden katalog
core_directory_wildcard_no_supported = Katalogi: Wildcard na ścieżce nie są obsługiwane, ignorowanie { $path }
core_directory_relative_path = Katalogi: Ścieżka względna nie jest wspierana, ignorowanie { $path }
core_directory_must_exists = Katalogi: Podana ścieżka do folderu musi istnieć, ignorowanie { $path }
core_directory_must_be_directory = Katalogi: Podana ścieżka musi wskazywać na katalog, ignorowanie { $path }
core_included_directory_zero_valid_directories = Błąd katalogów do przeszukiwania: Nie znaleziono nawet jednej poprawnej ścieżki do przeszukania
core_excluded_directory_pointless_slash = Katalogi: Wykluczanie folderu / jest bezcelowe, ponieważ oznacza to, że żadne pliki nie zostaną sprawdzone
core_directory_overlap = Katalogi: Wszystkie katalogi do wyszukiwania pokrywają się z wykluczonymi
core_directory_unable_to_get_device_id = Katalogi: Nie można uzyskać identyfikatora urządzenia z folderu { $path }
core_ffmpeg_not_found = Nie można odnaleźć poprawnej instalacji FFmpeg
core_ffmpeg_not_found_windows = Upewnij się, że ffmpeg.exe i ffprobe.exe są dostępne w PATH lub są umieszczone bezpośrednio w tym samym folderze, w którym aplikacja jest uruchamiana.
core_ffmpeg_missing_in_snap = Wyszukiwanie podobnych filmów nie działa obecnie w snapach, jeśli chcesz pomóc spójrz na - { $url }
core_saving_to_cache = Zapisano do pliku { $number } obiektów
core_loading_from_cache = Załadowano z pamięci podręcznej { $number } obiektów

@ -1,5 +1,4 @@
# Core
core_similarity_original = Original
core_similarity_very_high = Muito alto
core_similarity_high = Alto
core_similarity_medium = Média
@ -16,14 +15,13 @@ core_file_no_modification_date = Não foi possível obter a data de modificaçã
core_folder_no_modification_date = Não foi possível obter a data de modificação da pasta { $name }, motivo { $reason }
core_missing_no_chosen_included_directory = Pelo menos um diretório deve ser fornecido
core_directory_wildcard_no_supported = Directorias: Caracteres curinga no caminho não são suportados, ignorando { $path }
core_directory_relative_path = Directorias: Caminho relativo não são suportados, ignorando { $path }
core_directory_must_exists = Directórios: Caminho da pasta fornecida deve sair, ignorando { $path }
core_directory_must_be_directory = Diretórios: Caminho fornecido deve apontar para o diretório, ignorando { $path }
core_included_directory_zero_valid_directories = ERRO do Diretório incluído: Não foi encontrado nenhum caminho correto que é necessário incluir
core_excluded_directory_pointless_slash = Directorias: Excluir / não faz sentido, porque significa que nenhum arquivo será escaneado
core_directory_overlap = Diretórios: Todos os diretórios para pesquisar sobreposições com diretórios excluídos
core_directory_unable_to_get_device_id = Directorias: Não foi possível obter o dispositivo id da pasta { $path }
core_ffmpeg_not_found = Instalação adequada do FFmpeg não encontrada
core_ffmpeg_not_found_windows = Certifique-se de que o ffmpeg.exe e ffprobe.exe estão disponíveis no PATH ou são colocados diretamente na mesma pasta onde o aplicativo é executável
core_ffmpeg_missing_in_snap = Vídeos similares não funcionam atualmente com o snap, se você quiser ajudar a olhar - { $url }
core_saving_to_cache = Salvo no arquivo { $number } entradas de cache
core_loading_from_cache = Carregado do cache { $number } entradas

@ -1,29 +0,0 @@
# Core
core_similarity_original = Originală
core_similarity_very_high = Foarte Mare
core_similarity_high = Ridicat
core_similarity_medium = Medie
core_similarity_small = Mică
core_similarity_very_small = Foarte mic
core_similarity_minimal = Minimă
core_cannot_open_dir = Nu se poate deschide dir { $dir }, motiv { $reason }
core_cannot_read_entry_dir = Nu se poate citi intrarea în dir { $dir }, motivul { $reason }
core_cannot_read_metadata_dir = Metadatele nu pot fi citite în dir { $dir }, motivul { $reason }
core_file_not_utf8_name = Fișierul { $name } nu are un nume valid UTF-8 (este posibil ca unele caractere să nu fie afișate)
core_file_modified_before_epoch = Fișierul { $name } pare să fie modificat înainte de Epoch Unix
core_folder_modified_before_epoch = Dosarul { $name } pare să fie modificat înainte de Epoc Unix
core_file_no_modification_date = Imposibil de obținut data modificării din fișierul { $name }, motivul { $reason }
core_folder_no_modification_date = Imposibil de obținut data modificării din dosarul { $name }, motivul { $reason }
core_missing_no_chosen_included_directory = Trebuie furnizat cel puțin un director
core_directory_wildcard_no_supported = Directoare: Wildcards pe cale nu sunt acceptate, ignorând { $path }
core_directory_must_exists = Directoare: Calea dosarului furnizat trebuie să existe, ignorând { $path }
core_directory_must_be_directory = Directoare: Calea specificată trebuie să indice în director, ignorând { $path }
core_included_directory_zero_valid_directories = EROARE din Director inclusă: Nici măcar o cale corectă de inclus, care este necesară
core_excluded_directory_pointless_slash = Directoare: Excludere / este inutilă, deoarece înseamnă că niciun fișier nu va fi scanat
core_directory_overlap = Directoare: Toate directoarele pentru a căuta suprapuneri cu directoarele excluse
core_directory_unable_to_get_device_id = Directoare: Imposibil de obținut ID-ul dispozitivului din folderul { $path }
core_ffmpeg_not_found = Nu se poate găsi instalarea corectă a FFmpeg
core_ffmpeg_not_found_windows = Asigurați-vă că ffmpeg.exe și ffprobe.exe sunt disponibile în PATH sau sunt puse direct în același folder unde este executabilă aplicația
core_ffmpeg_missing_in_snap = Videoclipuri similare nu funcționează în prezent cu ancorare, dacă doriți să vă uitați - { $url }
core_saving_to_cache = Intrări cache salvate în fişierul { $number }
core_loading_from_cache = Încărcat din geocutia { $number }

@ -1,11 +1,10 @@
# Core
core_similarity_original = Оригинальное
core_similarity_very_high = Очень высокое
core_similarity_high = Высокое
core_similarity_medium = Среднее
core_similarity_small = Низкое
core_similarity_very_small = Очень низкое
core_similarity_minimal = Минимальное
core_similarity_very_high = Очень высокий
core_similarity_high = Высокий
core_similarity_medium = Средний
core_similarity_small = Маленький
core_similarity_very_small = Очень маленький
core_similarity_minimal = Минимальный
core_cannot_open_dir = Невозможно открыть каталог { $dir }, причина: { $reason }
core_cannot_read_entry_dir = Невозможно прочитать запись в директории { $dir }, причина: { $reason }
core_cannot_read_metadata_dir = Невозможно прочитать метаданные в директории { $dir }, причина: { $reason }
@ -16,14 +15,13 @@ core_file_no_modification_date = Не удаётся получить дату
core_folder_no_modification_date = Не удаётся получить дату изменения из папки { $name }, причина: { $reason }
core_missing_no_chosen_included_directory = Должен быть указан хотя бы один каталог
core_directory_wildcard_no_supported = Директории: Не поддерживаются маски в путях, будет проигнорирован { $path }
core_directory_relative_path = Директории: Относительные пути не поддерживается, будет проигнорирован { $path }
core_directory_must_exists = Директории: Указанный путь к папке должен существовать, будет проигнорирован{ $path }
core_directory_must_be_directory = Директории: Указанный путь должен указывать на директорию, будет проигнорирован { $path }
core_included_directory_zero_valid_directories = Включённый каталог, ОШИБКА: Не найдено ни одного корректного пути для включения в список поиска — обязательно добавить хотя бы один
core_excluded_directory_pointless_slash = Директории: Исключение корневой папки «/» бессмысленно, потому что в таком случае ни один файл не будет просканирован
core_directory_overlap = Каталоги: Все директории для поиска также присутствуют в списке исключённых каталогов
core_directory_unable_to_get_device_id = Каталоги: Не удалось получить идентификатор устройства из папки { $path }
core_ffmpeg_not_found = Не удалось найти путь, содержащий корректную инсталляцию FFmpeg
core_ffmpeg_not_found_windows = Убедитесь, что ffmpeg.exe и ffprobe.exe доступны в PATH или находятся в той же папке, где это исполняемый файл
core_ffmpeg_missing_in_snap = Функция поиска похожих видео пока не работает — если хотите помочь проекту, см. { $url }
core_saving_to_cache = Сохранено в файл записей кэша: { $number }
core_loading_from_cache = Загружено записей из кэша: { $number }

@ -1,29 +0,0 @@
# Core
core_similarity_original = Ursprunglig
core_similarity_very_high = Mycket Hög
core_similarity_high = Hög
core_similarity_medium = Mellan
core_similarity_small = Litet
core_similarity_very_small = Väldigt Liten
core_similarity_minimal = Minimalt
core_cannot_open_dir = Kan inte öppna dir { $dir }anledning { $reason }
core_cannot_read_entry_dir = Kan inte läsa post i dir { $dir }, anledning { $reason }
core_cannot_read_metadata_dir = Kan inte läsa metadata i dir { $dir }, anledning { $reason }
core_file_not_utf8_name = Filen { $name } har inte ett giltigt UTF-8-namn (vissa tecken kan inte visas)
core_file_modified_before_epoch = Filen { $name } verkar ändras innan Unix Epoch
core_folder_modified_before_epoch = Mappen { $name } verkar ändras innan Unix Epoch
core_file_no_modification_date = Det går inte att hämta ändringsdatum från filen { $name }, anledning { $reason }
core_folder_no_modification_date = Det går inte att hämta ändringsdatum från mappen { $name }, anledning { $reason }
core_missing_no_chosen_included_directory = Minst en katalog måste tillhandahållas
core_directory_wildcard_no_supported = Kataloger: Wildcards i sökvägen stöds inte, ignorerar { $path }
core_directory_must_exists = Kataloger: Tillhandahållen mappsökväg måste finnas, ignorerar { $path }
core_directory_must_be_directory = Kataloger: Tillhandahållen sökväg måste peka på katalogen, ignorerar { $path }
core_included_directory_zero_valid_directories = Inkluderad katalog FEL: Hittas inte ens en korrekt sökväg till inkluderad som krävs
core_excluded_directory_pointless_slash = Kataloger: Exklusive / är meningslös, eftersom det innebär att inga filer kommer att skannas
core_directory_overlap = Kataloger: Alla kataloger att söka överlappar med uteslutna kataloger
core_directory_unable_to_get_device_id = Kataloger: Det går inte att hämta enhets-id från mappen { $path }
core_ffmpeg_not_found = Kan inte hitta rätt installation av FFmpeg
core_ffmpeg_not_found_windows = Se till att ffmpeg.exe och ffprobe.exe är tillgängliga i PATH eller sätts direkt till samma mapp där är app körbar
core_ffmpeg_missing_in_snap = Liknande videor fungerar inte just nu med snap, om du vill ha hjälp att titta på - { $url }
core_saving_to_cache = Sparad i filen { $number } cacheposter
core_loading_from_cache = Laddad från cache { $number } poster

@ -1,29 +0,0 @@
# Core
core_similarity_original = Asıl
core_similarity_very_high = Çok Yüksek
core_similarity_high = Yüksek
core_similarity_medium = Orta
core_similarity_small = Düşük
core_similarity_very_small = Çok Düşük
core_similarity_minimal = Aşırı Düşük
core_cannot_open_dir = { $dir } dizini açılamıyor, nedeni: { $reason }
core_cannot_read_entry_dir = { $dir } dizinindeki girdi okunamıyor, nedeni: { $reason }
core_cannot_read_metadata_dir = { $dir } dizinindeki metaveri okunamıyor, nedei: { $reason }
core_file_not_utf8_name = { $name } dosyasının geçerli bir UTF-8 adı yok (kimi karakterler gösterilemeyebilir)
core_file_modified_before_epoch = { $name } dosyası Unix Epoch'tan önce değiştirilmiş gibi görünüyor.
core_folder_modified_before_epoch = { $name } klasörü Unix Epoch'tan önce değiştirilmiş gibi görünüyor.
core_file_no_modification_date = { $name } dosyasının değişiklik tarihine erişilemiyor, nedeni: { $reason }
core_folder_no_modification_date = { $name } klasörünün değişiklik tarihine erişilemiyor, nedeni: { $reason }
core_missing_no_chosen_included_directory = "Aranacak Dizinler" listesinde en az bir dizin yer almalıdır.
core_directory_wildcard_no_supported = Dizinler: Yol adında joker karakterler desteklenmez, { $path } yok sayıldı.
core_directory_must_exists = Dizinler: Girilen klasör yolu var olmalı, { $path } yok sayıldı.
core_directory_must_be_directory = Dizinler: Girilen yol bir dizini göstermelidir, { $path } yok sayıldı.
core_included_directory_zero_valid_directories = "Aranacak Dizinler" listesinde HATA: Tarama yapılması için gerekli olan tek bir doğru yol bile bulunamadı.
core_excluded_directory_pointless_slash = Dizinler: "/" kök dizinini hariç tutmak anlamsızdır, çünkü bu hiçbir dosyanın taranmayacağı anlamına gelir.
core_directory_overlap = Dizinler: Aranacak tüm dizinler, hariç tutulan dizinlerle çakışıyor.
core_directory_unable_to_get_device_id = Dizinler: { $path } klasörünün aygıt kimliği bilgisine erişilemiyor.
core_ffmpeg_not_found = FFmpeg'in uygun kurulumu bulunamıyor.
core_ffmpeg_not_found_windows = "ffmpeg(.exe)" ve "ffprobe(.exe)" uygulamalarının PATH dizininde ya da uygulamanın doğrudan yürütüldüğü dizinde yer aldığından ve 'yürütülebilir' olarak işaretlendiğinden emin olun.
core_ffmpeg_missing_in_snap = Benzer Videolar şu anda snap ile çalışmıyor, eğer yardım istiyorsanız - { $url }
core_saving_to_cache = { $number } adet önbellek kaydı dosyaya kaydedildi
core_loading_from_cache = Önbellekten { $number } adet kayıt yüklendi

@ -1,29 +1,27 @@
# Core
core_similarity_original = Оригінал
core_similarity_very_high = Дуже висока
core_similarity_high = Висока
core_similarity_medium = Середня
core_similarity_small = Низька
core_similarity_very_small = Дуже низька
core_similarity_minimal = Мінімальна
core_cannot_open_dir = Не вдалося відкрити каталог { $dir }, причина: { $reason }
core_cannot_read_entry_dir = Не вдалося прочитати запис в каталозі { $dir }, причина: { $reason }
core_cannot_read_metadata_dir = Не вдалося прочитати метадані в каталозі { $dir }, причина: { $reason }
core_similarity_very_high = Дуже високий
core_similarity_high = Високий
core_similarity_medium = Медіум
core_similarity_small = Маленький
core_similarity_very_small = Дуже малий
core_similarity_minimal = Мінімальні
core_cannot_open_dir = Не вдалося відкрити папку { $dir }, причина: { $reason }
core_cannot_read_entry_dir = Не вдалося прочитати запис в папці { $dir }, причина: { $reason }
core_cannot_read_metadata_dir = Не вдалося прочитати метадані в папці { $dir }, причина: { $reason }
core_file_not_utf8_name = Файл { $name } не має припустимого імені UTF-8 (деякі символи не можуть бути показані)
core_file_modified_before_epoch = Файл { $name }, здається, змінено до початку епохи Unix
core_folder_modified_before_epoch = Папка { $name }, здається, змінена до початку епохи Unix
core_file_no_modification_date = Не вдалося отримати дату модифікації з файлу { $name }, причина: { $reason }
core_folder_no_modification_date = Не вдалося отримати дату модифікації з каталогу { $name }, причина: { $reason }
core_folder_no_modification_date = Не вдалося отримати дату модифікації з папки { $name }, причина: { $reason }
core_missing_no_chosen_included_directory = Необхідно вказати принаймні один каталог
core_directory_wildcard_no_supported = Директорії: Не підтримуються маски у шляхах, буде проігнорован { $path }
core_directory_relative_path = Директорії: Відносні шляхи не підтримуються, буде проігнорован { $path }
core_directory_must_exists = Директорії: Вказаний шлях до папки має існувати, буде проігнорован { $path }
core_directory_must_be_directory = Директорії: Вказаний шлях повинен вказувати на директорію, буде проігнорован { $path }
core_included_directory_zero_valid_directories = Включений каталог, ПОМИЛКА: Не знайдено жодного коректного шляху для включення до списку пошуку — обов'язково додати хоча б один
core_excluded_directory_pointless_slash = Директорії: Виключення кореневого каталогу «/» не має сенсу, тому що в такому разі жоден файл не буде просканований
core_excluded_directory_pointless_slash = Директорії: Виключення кореневої папки «/» не має сенсу, тому що в такому разі жоден файл не буде просканований
core_directory_overlap = Каталоги: Усі директорії для пошуку також присутні у списку виключених каталогів
core_directory_unable_to_get_device_id = Каталоги: Не вдалося отримати ідентифікатор пристрою з папки { $path }
core_ffmpeg_not_found = Неможливо знайти шлях, що містить коректну інсталяцію FFmpeg
core_ffmpeg_not_found_windows = Будьте впевнені, що ffmpeg.exe і ffprobe.exe доступні в PATH або прямо в тій же папці, де є виконуваний додаток
core_ffmpeg_missing_in_snap = Функція пошуку схожих відео поки не працює — якщо хочете допомогти проекту, див. {$url}
core_saving_to_cache = Збережено записів кешу у файл: { $number }
core_loading_from_cache = Завантажено записів з кешу: { $number }

@ -1,5 +1,4 @@
# Core
core_similarity_original = 原版
core_similarity_very_high = 非常高
core_similarity_high = 高
core_similarity_medium = 中
@ -9,21 +8,20 @@ core_similarity_minimal = 最小化
core_cannot_open_dir = 无法打开目录 { $dir },因为 { $reason }
core_cannot_read_entry_dir = 无法在目录 { $dir } 中读取条目,因为 { $reason }
core_cannot_read_metadata_dir = 无法读取目录 { $dir } 中的元数据,因为 { $reason }
core_file_not_utf8_name = 文件 { $name } 没有有效的 UTF-8 名称 (可能无法显示一些字符)
core_file_modified_before_epoch = 文件 { $name } 似乎在 Unix Epoch前被修改
core_folder_modified_before_epoch = 文件夹 { $name } 似乎在 Unix Epoch前被修改
core_file_not_utf8_name = 文件 { $name } 效的 UTF-8 名称 (可能无法显示一些字符)
core_file_modified_before_epoch = 文件 { $name } 似乎在 Unix Epoch前被修改
core_folder_modified_before_epoch = 文件夹 { $name } 似乎在Unix Epoch前被修改
core_file_no_modification_date = 无法从文件 { $name } 获取修改日期,因为 { $reason }
core_folder_no_modification_date = 无法从文件夹 { $name } 获取修改日期,因为 { $reason }
core_missing_no_chosen_included_directory = 必须至少提供一个目录
core_directory_wildcard_no_supported = 目录:不支持路径中的通配符,忽略 { $path }
core_directory_relative_path = 目录:不支持相对路径,忽略 { $path }
core_directory_must_exists = 目录:提供的文件夹路径必须退出,忽略 { $path }
core_directory_must_be_directory = 目录:提供的路径必须指向目录,忽略 { $path }
core_included_directory_zero_valid_directories = 包括目录错误:即使找不到一个需要包含的正确路径
core_excluded_directory_pointless_slash = 目录:不包括 / 无意义,因为它意味着没有文件将被扫描
core_directory_overlap = 目录:所有要搜索与排除目录重叠的目录
core_directory_unable_to_get_device_id = 目录:无法从文件夹 { $path } 获取设备 id
core_ffmpeg_not_found = FFmpeg未被正确安装
core_ffmpeg_not_found_windows = 请确保 ffmpeg.exe 和 ffprobe.exe 在 PATH 中可用,或者直接放入应用可执行文件的同一文件夹中
core_ffmpeg_not_found = 找不到正确安装FFmpeg
core_ffmpeg_missing_in_snap = 类似的视频目前不适用于快照,如果您想要帮助查看- { $url }
core_saving_to_cache = 保存到文件 { $number } 缓存条目
core_loading_from_cache = 从缓存加载 { $number } 个条目
core_saving_to_cache = 保存到文件 { $number } 缓存条目
core_loading_from_cache = 从缓存 { $number } 项加载

@ -1,166 +1,89 @@
use std::collections::{BTreeSet, HashMap};
use std::collections::BTreeSet;
use std::fs::File;
use std::io::prelude::*;
use std::mem;
use std::path::{Path, PathBuf};
use std::io::BufWriter;
use std::path::PathBuf;
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
use std::sync::Arc;
use std::thread::sleep;
use std::time::{Duration, SystemTime};
use std::{mem, thread};
use crossbeam_channel::{Receiver, Sender};
use fun_time::fun_time;
use log::debug;
use crossbeam_channel::Receiver;
use mime_guess::get_mime_extensions;
use rayon::prelude::*;
use serde::Serialize;
use crate::common::{check_if_stop_received, prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads};
use crate::common_dir_traversal::{CheckingMethod, DirTraversalBuilder, DirTraversalResult, FileEntry, ProgressData, ToolType};
use crate::common_tool::{CommonData, CommonToolData};
use crate::common::{Common, LOOP_DURATION};
use crate::common_dir_traversal::{CheckingMethod, DirTraversalBuilder, DirTraversalResult, FileEntry, ProgressData};
use crate::common_directory::Directories;
use crate::common_extensions::Extensions;
use crate::common_items::ExcludedItems;
use crate::common_messages::Messages;
use crate::common_traits::*;
static DISABLED_EXTENSIONS: &[&str] = &["file", "cache", "bak", "data"]; // Such files can have any type inside
// This adds several workarounds for bugs/invalid recognizing types by external libraries
// ("real_content_extension", "current_file_extension")
const WORKAROUNDS: &[(&str, &str)] = &[
static WORKAROUNDS: &[(&str, &str)] = &[
// Wine/Windows
("der", "cat"),
("exe", "acm"),
("exe", "ax"),
("exe", "bck"),
("exe", "com"),
("exe", "cpl"),
("exe", "dll16"),
("exe", "cpl"),
("exe", "dll"),
("exe", "drv16"),
("exe", "dll16"),
("exe", "drv"),
("exe", "drv16"),
("exe", "ds"),
("exe", "efi"),
("exe", "exe16"),
("exe", "fon"), // Type of font or something else
("exe", "mod16"),
("exe", "msstyles"),
("exe", "mui"),
("exe", "mun"),
("exe", "orig"),
("exe", "ps1xml"),
("exe", "rll"),
("exe", "rs"),
("exe", "scr"),
("exe", "signed"),
("exe", "sys"),
("exe", "tlb"),
("exe", "tsp"),
("exe", "vdm"),
("exe", "vxd"),
("exe", "winmd"),
("gz", "loggz"),
("xml", "adml"),
("xml", "admx"),
("xml", "camp"),
("xml", "cdmp"),
("xml", "cdxml"),
("xml", "dgml"),
("xml", "diagpkg"),
("xml", "gmmp"),
("xml", "library-ms"),
("xml", "man"),
("xml", "manifest"),
("xml", "msc"),
("xml", "mum"),
("xml", "resx"),
("zip", "wmz"),
// Games specific extensions - cannot be used here common extensions like zip
("gz", "h3m"), // Heroes 3
("zip", "hashdb"), // Gog
("zip", "c2"), // King of the Dark Age
("bmp", "c2"), // King of the Dark Age
("avi", "c2"), // King of the Dark Age
("exe", "c2"), // King of the Dark Age
// Other
("der", "keystore"), // Godot/Android keystore
("exe", "pyd"), // Python/Mingw
("gz", "blend"), // Blender
("gz", "crate"), // Cargo
("gz", "svgz"), // Archive svg
("gz", "tgz"), // Archive
("html", "dtd"), // Mingw
("html", "ent"), // Mingw
("html", "md"), // Markdown
("html", "svelte"), // Svelte
("jpg", "jfif"), // Photo format
("m4v", "mp4"), // m4v and mp4 are interchangeable
("mobi", "azw3"), // Ebook format
("mpg", "vob"), // Weddings in parts have usually vob extension
("obj", "bin"), // Multiple apps, Czkawka, Nvidia, Windows
("obj", "o"), // Compilators
("odp", "otp"), // LibreOffice
("ods", "ots"), // Libreoffice
("odt", "ott"), // Libreoffice
("ogg", "ogv"), // Audio format
("pem", "key"), // curl, openssl
("png", "kpp"), // Krita presets
("pptx", "ppsx"), // Powerpoint
("sh", "bash"), // Linux
("sh", "guess"), // GNU
("sh", "pl"), // Gnome/Linux
("sh", "pm"), // Gnome/Linux
("sh", "py"), // Python
("sh", "pyx"), // Python
("sh", "rs"), // Rust
("sh", "sample"), // Git
("xml", "bsp"), // Quartus
("xml", "cbp"), // CodeBlocks config
("xml", "cfg"), // Multiple apps - Godot
("xml", "cmb"), // Cambalache
("xml", "conf"), // Multiple apps - Python
("xml", "config"), // Multiple apps - QT Creator
("xml", "dae"), // 3D models
("xml", "docbook"), //
("xml", "fb2"), //
("xml", "filters"), // Visual studio
("xml", "gir"), // GTK
("xml", "glade"), // Glade
("xml", "iml"), // Intelij Idea
("xml", "kdenlive"), // KDenLive
("xml", "lang"), // ?
("xml", "nuspec"), // Nuget
("xml", "policy"), // SystemD
("xml", "qsys"), // Quartus
("xml", "sopcinfo"), // Quartus
("xml", "svg"), // SVG
("xml", "ui"), // Cambalache, Glade
("xml", "user"), // Qtcreator
("xml", "vbox"), // VirtualBox
("xml", "vbox-prev"), // VirtualBox
("xml", "vcproj"), // VisualStudio
("xml", "vcxproj"), // VisualStudio
("xml", "xba"), // Libreoffice
("xml", "xcd"), // Libreoffice files
("zip", "apk"), // Android apk
("zip", "cbr"), // Comics
("zip", "dat"), // Multiple - python, brave
("zip", "doc"), // Word
("zip", "docx"), // Word
("zip", "jar"), // Java
("zip", "kra"), // Krita
("zip", "kgm"), // Krita
("zip", "nupkg"), // Nuget packages
("zip", "odg"), // Libreoffice
("zip", "pptx"), // Powerpoint
("zip", "whl"), // Python packages
("zip", "xlsx"), // Excel
("zip", "xpi"), // Firefox extensions
("zip", "zcos"), // Scilab
// Probably invalid
("html", "svg"),
("exe", "doc"), // Not sure whe docx is not recognized
("exe", "sys"),
("gz", "blend"),
("gz", "crate"),
("gz", "svgz"),
("gz", "tgz"),
("html", "md"),
("html", "svg"), // Quite strange, but yes it works
("jpg", "jfif"),
("obj", "o"),
("odp", "otp"),
("odt", "ott"),
("ogg", "ogv"),
("pptx", "ppsx"),
("sh", "bash"),
("sh", "py"),
("sh", "rs"),
("xml", "cmb"),
("xml", "conf"),
("xml", "dae"),
("xml", "docbook"),
("xml", "gir"),
("xml", "glade"),
("xml", "html"),
// Probably bug in external library
("msi", "ppt"), // Not sure why ppt is not recognized
("msi", "doc"), // Not sure why doc is not recognized
("exe", "xls"), // Not sure why xls is not recognized
("xml", "kdenlive"),
("xml", "lang"),
("xml", "svg"),
("xml", "ui"),
("xml", "vcproj"),
("zip", "apk"),
("zip", "dat"),
("zip", "jar"),
("zip", "kra"),
("zip", "nupkg"),
("zip", "pptx"),
("zip", "whl"),
("zip", "xpi"),
];
#[derive(Clone, Serialize, Debug)]
#[derive(Clone)]
pub struct BadFileEntry {
pub path: PathBuf,
pub modified_date: u64,
@ -168,129 +91,202 @@ pub struct BadFileEntry {
pub current_extension: String,
pub proper_extensions: String,
}
impl ResultEntry for BadFileEntry {
fn get_path(&self) -> &Path {
&self.path
}
fn get_modified_date(&self) -> u64 {
self.modified_date
}
fn get_size(&self) -> u64 {
self.size
}
}
/// Info struck with helpful information's about results
#[derive(Default)]
pub struct Info {
pub number_of_files_with_bad_extension: usize,
}
impl Info {
pub fn new() -> Self {
Default::default()
}
}
pub struct BadExtensions {
common_data: CommonToolData,
text_messages: Messages,
information: Info,
files_to_check: Vec<FileEntry>,
bad_extensions_files: Vec<BadFileEntry>,
directories: Directories,
allowed_extensions: Extensions,
excluded_items: ExcludedItems,
minimal_file_size: u64,
maximal_file_size: u64,
recursive_search: bool,
stopped_search: bool,
save_also_as_json: bool,
include_files_without_extension: bool,
}
impl BadExtensions {
pub fn new() -> Self {
Self {
common_data: CommonToolData::new(ToolType::BadExtensions),
information: Info::default(),
text_messages: Messages::new(),
information: Info::new(),
recursive_search: true,
allowed_extensions: Extensions::new(),
directories: Directories::new(),
excluded_items: ExcludedItems::new(),
files_to_check: Default::default(),
stopped_search: false,
minimal_file_size: 8192,
maximal_file_size: u64::MAX,
bad_extensions_files: Default::default(),
save_also_as_json: false,
include_files_without_extension: true,
}
}
#[fun_time(message = "find_bad_extensions_files", level = "info")]
pub fn find_bad_extensions_files(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&Sender<ProgressData>>) {
self.prepare_items();
pub fn find_bad_extensions_files(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&futures::channel::mpsc::UnboundedSender<ProgressData>>) {
self.directories.optimize_directories(self.recursive_search, &mut self.text_messages);
if !self.check_files(stop_receiver, progress_sender) {
self.common_data.stopped_search = true;
self.stopped_search = true;
return;
}
if !self.look_for_bad_extensions_files(stop_receiver, progress_sender) {
self.common_data.stopped_search = true;
self.stopped_search = true;
return;
}
self.debug_print();
}
#[fun_time(message = "check_files", level = "debug")]
fn check_files(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&Sender<ProgressData>>) -> bool {
pub fn get_stopped_search(&self) -> bool {
self.stopped_search
}
pub const fn get_bad_extensions_files(&self) -> &Vec<BadFileEntry> {
&self.bad_extensions_files
}
pub fn set_maximal_file_size(&mut self, maximal_file_size: u64) {
self.maximal_file_size = match maximal_file_size {
0 => 1,
t => t,
};
}
pub fn set_minimal_file_size(&mut self, minimal_file_size: u64) {
self.minimal_file_size = match minimal_file_size {
0 => 1,
t => t,
};
}
pub const fn get_text_messages(&self) -> &Messages {
&self.text_messages
}
pub const fn get_information(&self) -> &Info {
&self.information
}
pub fn set_save_also_as_json(&mut self, save_also_as_json: bool) {
self.save_also_as_json = save_also_as_json;
}
pub fn set_recursive_search(&mut self, recursive_search: bool) {
self.recursive_search = recursive_search;
}
pub fn set_included_directory(&mut self, included_directory: Vec<PathBuf>) -> bool {
self.directories.set_included_directory(included_directory, &mut self.text_messages)
}
pub fn set_excluded_directory(&mut self, excluded_directory: Vec<PathBuf>) {
self.directories.set_excluded_directory(excluded_directory, &mut self.text_messages);
}
pub fn set_allowed_extensions(&mut self, allowed_extensions: String) {
self.allowed_extensions.set_allowed_extensions(allowed_extensions, &mut self.text_messages);
}
pub fn set_excluded_items(&mut self, excluded_items: Vec<String>) {
self.excluded_items.set_excluded_items(excluded_items, &mut self.text_messages);
}
fn check_files(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&futures::channel::mpsc::UnboundedSender<ProgressData>>) -> bool {
let result = DirTraversalBuilder::new()
.common_data(&self.common_data)
.root_dirs(self.directories.included_directories.clone())
.group_by(|_fe| ())
.stop_receiver(stop_receiver)
.progress_sender(progress_sender)
.minimal_file_size(self.minimal_file_size)
.maximal_file_size(self.maximal_file_size)
.directories(self.directories.clone())
.allowed_extensions(self.allowed_extensions.clone())
.excluded_items(self.excluded_items.clone())
.recursive_search(self.recursive_search)
.build()
.run();
match result {
DirTraversalResult::SuccessFiles { grouped_file_entries, warnings } => {
self.files_to_check = grouped_file_entries.into_values().flatten().collect();
self.common_data.text_messages.warnings.extend(warnings);
DirTraversalResult::SuccessFiles {
start_time,
grouped_file_entries,
warnings,
} => {
if let Some(files_to_check) = grouped_file_entries.get(&()) {
self.files_to_check = files_to_check.clone();
}
self.text_messages.warnings.extend(warnings);
Common::print_time(start_time, SystemTime::now(), "check_files".to_string());
true
}
DirTraversalResult::SuccessFolders { .. } => {
unreachable!()
}
DirTraversalResult::Stopped => false,
}
}
#[fun_time(message = "look_for_bad_extensions_files", level = "debug")]
fn look_for_bad_extensions_files(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&Sender<ProgressData>>) -> bool {
let (progress_thread_handle, progress_thread_run, atomic_counter, check_was_stopped) =
prepare_thread_handler_common(progress_sender, 1, 1, self.files_to_check.len(), CheckingMethod::None, self.get_cd().tool_type);
let files_to_check = mem::take(&mut self.files_to_check);
let mut hashmap_workarounds: HashMap<&str, Vec<&str>> = Default::default();
for (proper, found) in WORKAROUNDS {
// This should be enabled when items will have only 1 possible workaround items, but looks that some have 2 or even more, so at least for now this is disabled
// if hashmap_workarounds.contains_key(found) {
// panic!("Already have {} key", found);
// }
hashmap_workarounds.entry(found).or_default().push(proper);
}
self.bad_extensions_files = self.verify_extensions(files_to_check, &atomic_counter, stop_receiver, &check_was_stopped, &hashmap_workarounds);
send_info_and_wait_for_ending_all_threads(&progress_thread_run, progress_thread_handle);
// Break if stop was clicked
if check_was_stopped.load(Ordering::Relaxed) {
return false;
}
self.information.number_of_files_with_bad_extension = self.bad_extensions_files.len();
debug!("Found {} files with invalid extension.", self.information.number_of_files_with_bad_extension);
fn look_for_bad_extensions_files(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&futures::channel::mpsc::UnboundedSender<ProgressData>>) -> bool {
let system_time = SystemTime::now();
let include_files_without_extension = self.include_files_without_extension;
let check_was_breaked = AtomicBool::new(false); // Used for breaking from GUI and ending check thread
//// PROGRESS THREAD START
let progress_thread_run = Arc::new(AtomicBool::new(true));
let atomic_file_counter = Arc::new(AtomicUsize::new(0));
let progress_thread_handle = if let Some(progress_sender) = progress_sender {
let progress_send = progress_sender.clone();
let progress_thread_run = progress_thread_run.clone();
let atomic_file_counter = atomic_file_counter.clone();
let entries_to_check = self.files_to_check.len();
thread::spawn(move || loop {
progress_send
.unbounded_send(ProgressData {
checking_method: CheckingMethod::None,
current_stage: 1,
max_stage: 1,
entries_checked: atomic_file_counter.load(Ordering::Relaxed) as usize,
entries_to_check,
})
.unwrap();
if !progress_thread_run.load(Ordering::Relaxed) {
break;
}
sleep(Duration::from_millis(LOOP_DURATION as u64));
})
} else {
thread::spawn(|| {})
};
true
}
let mut files_to_check = Default::default();
mem::swap(&mut files_to_check, &mut self.files_to_check);
#[fun_time(message = "verify_extensions", level = "debug")]
fn verify_extensions(
&self,
files_to_check: Vec<FileEntry>,
atomic_counter: &Arc<AtomicUsize>,
stop_receiver: Option<&Receiver<()>>,
check_was_stopped: &AtomicBool,
hashmap_workarounds: &HashMap<&str, Vec<&str>>,
) -> Vec<BadFileEntry> {
files_to_check
.into_par_iter()
//// PROGRESS THREAD END
self.bad_extensions_files = files_to_check
.into_par_iter() // TODO into par iter after
.map(|file_entry| {
atomic_counter.fetch_add(1, Ordering::Relaxed);
if check_if_stop_received(stop_receiver) {
check_was_stopped.store(true, Ordering::Relaxed);
atomic_file_counter.fetch_add(1, Ordering::Relaxed);
if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {
check_was_breaked.store(true, Ordering::Relaxed);
return None;
}
let current_extension;
// Check what exactly content file contains
let kind = match infer::get_from_path(&file_entry.path) {
Ok(k) => match k {
@ -301,21 +297,64 @@ impl BadExtensions {
};
let proper_extension = kind.extension();
let Some(current_extension) = self.get_and_validate_extension(&file_entry, proper_extension) else {
// Extract current extension from file
if let Some(extension) = file_entry.path.extension() {
let extension = extension.to_string_lossy().to_lowercase();
// Text longer than 10 characters is not considered as extension
if extension.len() > 10 {
current_extension = "".to_string();
} else {
current_extension = extension;
}
} else {
current_extension = "".to_string();
}
// Already have proper extension, no need to do more things
if current_extension == proper_extension {
return Some(None);
};
}
// Check for all extensions that file can use(not sure if it is worth to do it)
let (mut all_available_extensions, valid_extensions) = self.check_for_all_extensions_that_file_can_use(hashmap_workarounds, &current_extension, proper_extension);
let mut all_available_extensions: BTreeSet<_> = Default::default();
let think_extension = match current_extension.is_empty() {
true => "".to_string(),
false => {
for mim in mime_guess::from_ext(proper_extension) {
if let Some(all_ext) = get_mime_extensions(&mim) {
for ext in all_ext {
all_available_extensions.insert(ext);
}
}
}
// Workarounds
for (pre, post) in WORKAROUNDS {
if post == &current_extension.as_str() && all_available_extensions.contains(&pre) {
all_available_extensions.insert(post);
}
}
let mut guessed_multiple_extensions = "".to_string();
for ext in &all_available_extensions {
guessed_multiple_extensions.push_str(ext);
guessed_multiple_extensions.push(',');
}
guessed_multiple_extensions.pop();
guessed_multiple_extensions
}
};
if all_available_extensions.is_empty() {
// Not found any extension
return Some(None);
} else if current_extension.is_empty() {
if !self.include_files_without_extension {
if !include_files_without_extension {
println!("Empty extension which is disabled by settings");
return Some(None);
}
} else if all_available_extensions.take(&current_extension).is_some() {
} else if all_available_extensions.take(&current_extension.as_str()).is_some() {
// Found proper extension
return Some(None);
}
@ -325,78 +364,31 @@ impl BadExtensions {
modified_date: file_entry.modified_date,
size: file_entry.size,
current_extension,
proper_extensions: valid_extensions,
proper_extensions: think_extension,
}))
})
.while_some()
.filter(Option::is_some)
.map(Option::unwrap)
.collect::<Vec<_>>()
}
.filter(|file_entry| file_entry.is_some())
.map(|file_entry| file_entry.unwrap())
.collect::<Vec<_>>();
fn get_and_validate_extension(&self, file_entry: &FileEntry, proper_extension: &str) -> Option<String> {
let current_extension;
// Extract current extension from file
if let Some(extension) = file_entry.path.extension() {
let extension = extension.to_string_lossy().to_lowercase();
if DISABLED_EXTENSIONS.contains(&extension.as_str()) {
return None;
}
// Text longer than 10 characters is not considered as extension
if extension.len() > 10 {
current_extension = String::new();
} else {
current_extension = extension;
}
} else {
current_extension = String::new();
}
// End thread which send info to gui
progress_thread_run.store(false, Ordering::Relaxed);
progress_thread_handle.join().unwrap();
// Already have proper extension, no need to do more things
if current_extension == proper_extension {
return None;
// Break if stop was clicked
if check_was_breaked.load(Ordering::Relaxed) {
return false;
}
Some(current_extension)
}
fn check_for_all_extensions_that_file_can_use(
&self,
hashmap_workarounds: &HashMap<&str, Vec<&str>>,
current_extension: &str,
proper_extension: &str,
) -> (BTreeSet<String>, String) {
let mut all_available_extensions: BTreeSet<String> = Default::default();
let valid_extensions = if current_extension.is_empty() {
String::new()
} else {
for mim in mime_guess::from_ext(proper_extension) {
if let Some(all_ext) = get_mime_extensions(&mim) {
for ext in all_ext {
all_available_extensions.insert((*ext).to_string());
}
}
}
self.information.number_of_files_with_bad_extension = self.bad_extensions_files.len();
// Workarounds
if let Some(vec_pre) = hashmap_workarounds.get(current_extension) {
for pre in vec_pre {
if all_available_extensions.contains(*pre) {
all_available_extensions.insert(current_extension.to_string());
break;
}
}
}
Common::print_time(system_time, SystemTime::now(), "sort_images - reading data from files in parallel".to_string());
let mut guessed_multiple_extensions = format!("({proper_extension}) - ");
for ext in &all_available_extensions {
guessed_multiple_extensions.push_str(ext);
guessed_multiple_extensions.push(',');
}
guessed_multiple_extensions.pop();
// Clean unused data
self.files_to_check = Default::default();
guessed_multiple_extensions
};
(all_available_extensions, valid_extensions)
true
}
}
@ -407,54 +399,80 @@ impl Default for BadExtensions {
}
impl DebugPrint for BadExtensions {
#[allow(dead_code)]
#[allow(unreachable_code)]
/// Debugging printing - only available on debug build
fn debug_print(&self) {
if !cfg!(debug_assertions) {
#[cfg(not(debug_assertions))]
{
return;
}
println!("---------------DEBUG PRINT---------------");
self.debug_print_common();
println!("### Information's");
println!("Errors size - {}", self.text_messages.errors.len());
println!("Warnings size - {}", self.text_messages.warnings.len());
println!("Messages size - {}", self.text_messages.messages.len());
println!("### Other");
println!("Excluded items - {:?}", self.excluded_items.items);
println!("Included directories - {:?}", self.directories.included_directories);
println!("Excluded directories - {:?}", self.directories.excluded_directories);
println!("Recursive search - {}", self.recursive_search);
println!("-----------------------------------------");
}
}
impl PrintResults for BadExtensions {
fn write_results<T: Write>(&self, writer: &mut T) -> std::io::Result<()> {
writeln!(
impl SaveResults for BadExtensions {
fn save_results_to_file(&mut self, file_name: &str) -> bool {
let start_time: SystemTime = SystemTime::now();
let file_name: String = match file_name {
"" => "results.txt".to_string(),
k => k.to_string(),
};
let file_handler = match File::create(&file_name) {
Ok(t) => t,
Err(e) => {
self.text_messages.errors.push(format!("Failed to create file {}, reason {}", file_name, e));
return false;
}
};
let mut writer = BufWriter::new(file_handler);
if let Err(e) = writeln!(
writer,
"Results of searching {:?} with excluded directories {:?} and excluded items {:?}",
self.common_data.directories.included_directories,
self.common_data.directories.excluded_directories,
self.common_data.excluded_items.get_excluded_items()
)?;
writeln!(writer, "Found {} files with invalid extension.\n", self.information.number_of_files_with_bad_extension)?;
for file_entry in &self.bad_extensions_files {
writeln!(writer, "{:?} ----- {}", file_entry.path, file_entry.proper_extensions)?;
self.directories.included_directories, self.directories.excluded_directories, self.excluded_items.items
) {
self.text_messages.errors.push(format!("Failed to save results to file {}, reason {}", file_name, e));
return false;
}
Ok(())
}
fn save_results_to_file_as_json(&self, file_name: &str, pretty_print: bool) -> std::io::Result<()> {
self.save_results_to_file_as_json_internal(file_name, &self.bad_extensions_files, pretty_print)
if !self.bad_extensions_files.is_empty() {
writeln!(writer, "Found {} files with invalid extension.", self.information.number_of_files_with_bad_extension).unwrap();
for file_entry in self.bad_extensions_files.iter() {
writeln!(writer, "{}", file_entry.path.display()).unwrap();
}
} else {
write!(writer, "Not found any files with invalid extension.").unwrap();
}
Common::print_time(start_time, SystemTime::now(), "save_results_to_file".to_string());
true
}
}
impl BadExtensions {
pub const fn get_bad_extensions_files(&self) -> &Vec<BadFileEntry> {
&self.bad_extensions_files
}
pub const fn get_information(&self) -> &Info {
&self.information
}
}
impl PrintResults for BadExtensions {
/// Print information's about duplicated entries
/// Only needed for CLI
fn print_results(&self) {
let start_time: SystemTime = SystemTime::now();
println!("Found {} files with invalid extension.\n", self.information.number_of_files_with_bad_extension);
for file_entry in self.bad_extensions_files.iter() {
println!("{}", file_entry.path.display());
}
impl CommonData for BadExtensions {
fn get_cd(&self) -> &CommonToolData {
&self.common_data
}
fn get_cd_mut(&mut self) -> &mut CommonToolData {
&mut self.common_data
Common::print_time(start_time, SystemTime::now(), "print_entries".to_string());
}
}

@ -1,108 +1,376 @@
use std::fs;
use std::io::Write;
use std::collections::BTreeMap;
use std::fs::{File, Metadata};
use std::io::{BufWriter, Write};
use std::path::PathBuf;
use std::sync::atomic::Ordering;
use std::sync::atomic::{AtomicBool, AtomicU64};
use std::sync::Arc;
use std::thread::sleep;
use std::time::Duration;
use std::time::{SystemTime, UNIX_EPOCH};
use std::{fs, thread};
use crossbeam_channel::{Receiver, Sender};
use fun_time::fun_time;
use humansize::{format_size, BINARY};
use log::debug;
use crossbeam_channel::Receiver;
use humansize::{file_size_opts as options, FileSize};
use rayon::prelude::*;
use crate::common_dir_traversal::{DirTraversalBuilder, DirTraversalResult, FileEntry, ProgressData, ToolType};
use crate::common_tool::{CommonData, CommonToolData, DeleteMethod};
use crate::common_traits::{DebugPrint, PrintResults};
use crate::common::{Common, LOOP_DURATION};
use crate::common_directory::Directories;
use crate::common_extensions::Extensions;
use crate::common_items::ExcludedItems;
use crate::common_messages::Messages;
use crate::common_traits::{DebugPrint, PrintResults, SaveResults};
use crate::flc;
use crate::localizer_core::generate_translation_hashmap;
#[derive(Copy, Clone, Eq, PartialEq)]
pub enum SearchMode {
BiggestFiles,
SmallestFiles,
#[derive(Debug)]
pub struct ProgressData {
pub files_checked: usize,
}
#[derive(Clone)]
pub struct FileEntry {
pub path: PathBuf,
pub size: u64,
pub modified_date: u64,
}
#[derive(Eq, PartialEq, Clone, Debug)]
pub enum DeleteMethod {
None,
Delete,
}
/// Info struck with helpful information's about results
#[derive(Default)]
pub struct Info {
pub number_of_real_files: usize,
}
impl Info {
pub fn new() -> Self {
Default::default()
}
}
/// Struct with required information's to work
pub struct BigFile {
common_data: CommonToolData,
text_messages: Messages,
information: Info,
big_files: Vec<FileEntry>,
big_files: BTreeMap<u64, Vec<FileEntry>>,
excluded_items: ExcludedItems,
directories: Directories,
allowed_extensions: Extensions,
recursive_search: bool,
number_of_files_to_check: usize,
search_mode: SearchMode,
delete_method: DeleteMethod,
stopped_search: bool,
}
impl BigFile {
pub fn new() -> Self {
Self {
common_data: CommonToolData::new(ToolType::BigFile),
information: Info::default(),
text_messages: Default::default(),
information: Info::new(),
big_files: Default::default(),
excluded_items: ExcludedItems::new(),
directories: Directories::new(),
allowed_extensions: Extensions::new(),
recursive_search: true,
number_of_files_to_check: 50,
search_mode: SearchMode::BiggestFiles,
delete_method: DeleteMethod::None,
stopped_search: false,
}
}
#[fun_time(message = "find_big_files", level = "info")]
pub fn find_big_files(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&Sender<ProgressData>>) {
self.prepare_items();
pub fn find_big_files(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&futures::channel::mpsc::UnboundedSender<ProgressData>>) {
self.optimize_directories();
if !self.look_for_big_files(stop_receiver, progress_sender) {
self.common_data.stopped_search = true;
self.stopped_search = true;
return;
}
self.delete_files();
self.debug_print();
}
pub fn get_stopped_search(&self) -> bool {
self.stopped_search
}
// #[fun_time(message = "look_for_big_files", level = "debug")]
fn look_for_big_files(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&Sender<ProgressData>>) -> bool {
let result = DirTraversalBuilder::new()
.group_by(|_fe| ())
.stop_receiver(stop_receiver)
.progress_sender(progress_sender)
.common_data(&self.common_data)
.minimal_file_size(1)
.maximal_file_size(u64::MAX)
.max_stage(0)
.build()
.run();
match result {
DirTraversalResult::SuccessFiles { grouped_file_entries, warnings } => {
let mut all_files = grouped_file_entries.into_values().flatten().collect::<Vec<_>>();
all_files.par_sort_unstable_by_key(|fe| fe.size);
if self.search_mode == SearchMode::BiggestFiles {
all_files.reverse();
}
pub const fn get_big_files(&self) -> &BTreeMap<u64, Vec<FileEntry>> {
&self.big_files
}
pub const fn get_text_messages(&self) -> &Messages {
&self.text_messages
}
pub const fn get_information(&self) -> &Info {
&self.information
}
pub fn set_delete_method(&mut self, delete_method: DeleteMethod) {
self.delete_method = delete_method;
}
pub fn set_recursive_search(&mut self, recursive_search: bool) {
self.recursive_search = recursive_search;
}
#[cfg(target_family = "unix")]
pub fn set_exclude_other_filesystems(&mut self, exclude_other_filesystems: bool) {
self.directories.set_exclude_other_filesystems(exclude_other_filesystems);
}
/// List of allowed extensions, only files with this extensions will be checking if are duplicates
pub fn set_allowed_extensions(&mut self, allowed_extensions: String) {
self.allowed_extensions.set_allowed_extensions(allowed_extensions, &mut self.text_messages);
}
if all_files.len() > self.number_of_files_to_check {
all_files.truncate(self.number_of_files_to_check);
fn look_for_big_files(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&futures::channel::mpsc::UnboundedSender<ProgressData>>) -> bool {
let start_time: SystemTime = SystemTime::now();
let mut folders_to_check: Vec<PathBuf> = Vec::with_capacity(1024 * 2); // This should be small enough too not see to big difference and big enough to store most of paths without needing to resize vector
// Add root folders for finding
for id in &self.directories.included_directories {
folders_to_check.push(id.clone());
}
//// PROGRESS THREAD START
let progress_thread_run = Arc::new(AtomicBool::new(true));
let atomic_file_counter = Arc::new(AtomicU64::new(0));
let progress_thread_handle = if let Some(progress_sender) = progress_sender {
let progress_send = progress_sender.clone();
let progress_thread_run = progress_thread_run.clone();
let atomic_file_counter = atomic_file_counter.clone();
thread::spawn(move || loop {
progress_send
.unbounded_send(ProgressData {
files_checked: atomic_file_counter.load(Ordering::Relaxed) as usize,
})
.unwrap();
if !progress_thread_run.load(Ordering::Relaxed) {
break;
}
sleep(Duration::from_millis(LOOP_DURATION as u64));
})
} else {
thread::spawn(|| {})
};
//// PROGRESS THREAD END
while !folders_to_check.is_empty() {
if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {
// End thread which send info to gui
progress_thread_run.store(false, Ordering::Relaxed);
progress_thread_handle.join().unwrap();
return false;
}
let segments: Vec<_> = folders_to_check
.par_iter()
.map(|current_folder| {
let mut dir_result = vec![];
let mut warnings = vec![];
let mut fe_result = vec![];
// Read current dir childrens
let read_dir = match fs::read_dir(&current_folder) {
Ok(t) => t,
Err(e) => {
warnings.push(flc!(
"core_cannot_open_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())])
));
return (dir_result, warnings, fe_result);
}
};
// Check every sub folder/file/link etc.
'dir: for entry in read_dir {
let entry_data = match entry {
Ok(t) => t,
Err(e) => {
warnings.push(flc!(
"core_cannot_read_entry_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())])
));
continue 'dir;
}
};
let metadata: Metadata = match entry_data.metadata() {
Ok(t) => t,
Err(e) => {
warnings.push(flc!(
"core_cannot_read_metadata_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())])
));
continue 'dir;
}
};
if metadata.is_dir() {
if !self.recursive_search {
continue 'dir;
}
let next_folder = current_folder.join(entry_data.file_name());
if self.directories.is_excluded(&next_folder) {
continue 'dir;
}
if self.excluded_items.is_excluded(&next_folder) {
continue 'dir;
}
#[cfg(target_family = "unix")]
if self.directories.exclude_other_filesystems() {
match self.directories.is_on_other_filesystems(&next_folder) {
Ok(true) => continue 'dir,
Err(e) => warnings.push(e.to_string()),
_ => (),
}
}
self.big_files = all_files;
dir_result.push(next_folder);
} else if metadata.is_file() {
atomic_file_counter.fetch_add(1, Ordering::Relaxed);
self.common_data.text_messages.warnings.extend(warnings);
debug!("check_files - Found {} biggest/smallest files.", self.big_files.len());
true
let file_name_lowercase: String = match entry_data.file_name().into_string() {
Ok(t) => t,
Err(_inspected) => {
warnings.push(flc!(
"core_file_not_utf8_name",
generate_translation_hashmap(vec![("name", entry_data.path().display().to_string())])
));
continue 'dir;
}
}
.to_lowercase();
if !self.allowed_extensions.matches_filename(&file_name_lowercase) {
continue 'dir;
}
let current_file_name = current_folder.join(entry_data.file_name());
if self.excluded_items.is_excluded(&current_file_name) {
continue 'dir;
}
let fe: FileEntry = FileEntry {
path: current_file_name.clone(),
size: metadata.len(),
modified_date: match metadata.modified() {
Ok(t) => match t.duration_since(UNIX_EPOCH) {
Ok(d) => d.as_secs(),
Err(_inspected) => {
warnings.push(flc!(
"core_file_modified_before_epoch",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string())])
));
0
}
},
Err(e) => {
warnings.push(flc!(
"core_file_no_modification_date",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string()), ("reason", e.to_string())])
));
0
}
},
};
fe_result.push((fe.size, fe));
}
}
(dir_result, warnings, fe_result)
})
.collect();
// Advance the frontier
folders_to_check.clear();
// Process collected data
for (segment, warnings, fe_result) in segments {
folders_to_check.extend(segment);
self.text_messages.warnings.extend(warnings);
for (size, fe) in fe_result {
self.big_files.entry(size).or_insert_with(Vec::new);
self.big_files.get_mut(&size).unwrap().push(fe);
}
}
}
DirTraversalResult::Stopped => false,
// End thread which send info to gui
progress_thread_run.store(false, Ordering::Relaxed);
progress_thread_handle.join().unwrap();
// Extract n biggest files to new TreeMap
let mut new_map: BTreeMap<u64, Vec<FileEntry>> = Default::default();
for (size, vector) in self.big_files.iter().rev() {
if self.information.number_of_real_files < self.number_of_files_to_check {
for file in vector {
if self.information.number_of_real_files < self.number_of_files_to_check {
new_map.entry(*size).or_insert_with(Vec::new);
new_map.get_mut(size).unwrap().push(file.clone());
self.information.number_of_real_files += 1;
} else {
break;
}
}
} else {
break;
}
}
self.big_files = new_map;
Common::print_time(start_time, SystemTime::now(), "look_for_big_files".to_string());
true
}
pub fn set_number_of_files_to_check(&mut self, number_of_files_to_check: usize) {
self.number_of_files_to_check = number_of_files_to_check;
}
/// Setting excluded items which needs to contains * wildcard
/// Are a lot of slower than absolute path, so it should be used to heavy
pub fn set_excluded_items(&mut self, excluded_items: Vec<String>) {
self.excluded_items.set_excluded_items(excluded_items, &mut self.text_messages);
}
fn optimize_directories(&mut self) {
self.directories.optimize_directories(self.recursive_search, &mut self.text_messages);
}
pub fn set_included_directory(&mut self, included_directory: Vec<PathBuf>) {
self.directories.set_included_directory(included_directory, &mut self.text_messages);
}
pub fn set_excluded_directory(&mut self, excluded_directory: Vec<PathBuf>) {
self.directories.set_excluded_directory(excluded_directory, &mut self.text_messages);
}
/// Function to delete files, from filed Vector
fn delete_files(&mut self) {
match self.common_data.delete_method {
let start_time: SystemTime = SystemTime::now();
match self.delete_method {
DeleteMethod::Delete => {
for file_entry in &self.big_files {
if fs::remove_file(&file_entry.path).is_err() {
self.common_data.text_messages.warnings.push(file_entry.path.to_string_lossy().to_string());
for vec_file_entry in self.big_files.values() {
for file_entry in vec_file_entry {
if fs::remove_file(file_entry.path.clone()).is_err() {
self.text_messages.warnings.push(file_entry.path.display().to_string());
}
}
}
}
DeleteMethod::None => {
//Just do nothing
}
_ => unreachable!(),
}
Common::print_time(start_time, SystemTime::now(), "delete_files".to_string());
}
}
@ -113,73 +381,86 @@ impl Default for BigFile {
}
impl DebugPrint for BigFile {
#[allow(dead_code)]
#[allow(unreachable_code)]
/// Debugging printing - only available on debug build
fn debug_print(&self) {
if !cfg!(debug_assertions) {
#[cfg(not(debug_assertions))]
{
return;
}
println!("---------------DEBUG PRINT---------------");
println!("### Information's");
println!("Errors size - {}", self.text_messages.errors.len());
println!("Warnings size - {}", self.text_messages.warnings.len());
println!("Messages size - {}", self.text_messages.messages.len());
println!("### INDIVIDUAL DEBUG PRINT ###");
println!("### Other");
println!("Big files size {} in {} groups", self.information.number_of_real_files, self.big_files.len());
println!("Excluded items - {:?}", self.excluded_items.items);
println!("Included directories - {:?}", self.directories.included_directories);
println!("Excluded directories - {:?}", self.directories.excluded_directories);
println!("Recursive search - {}", self.recursive_search);
#[cfg(target_family = "unix")]
println!("Skip other filesystmes - {}", self.directories.exclude_other_filesystems());
println!("Number of files to check - {:?}", self.number_of_files_to_check);
self.debug_print_common();
println!("-----------------------------------------");
}
}
impl PrintResults for BigFile {
fn write_results<T: Write>(&self, writer: &mut T) -> std::io::Result<()> {
writeln!(
impl SaveResults for BigFile {
/// Saving results to provided file
fn save_results_to_file(&mut self, file_name: &str) -> bool {
let start_time: SystemTime = SystemTime::now();
let file_name: String = match file_name {
"" => "results.txt".to_string(),
k => k.to_string(),
};
let file_handler = match File::create(&file_name) {
Ok(t) => t,
Err(e) => {
self.text_messages.errors.push(format!("Failed to create file {}, reason {}", file_name, e));
return false;
}
};
let mut writer = BufWriter::new(file_handler);
if let Err(e) = writeln!(
writer,
"Results of searching {:?} with excluded directories {:?} and excluded items {:?}",
self.common_data.directories.included_directories,
self.common_data.directories.excluded_directories,
self.common_data.excluded_items.get_excluded_items()
)?;
self.directories.included_directories, self.directories.excluded_directories, self.excluded_items.items
) {
self.text_messages.errors.push(format!("Failed to save results to file {}, reason {}", file_name, e));
return false;
}
if self.information.number_of_real_files != 0 {
if self.search_mode == SearchMode::BiggestFiles {
writeln!(writer, "{} the biggest files.\n\n", self.information.number_of_real_files)?;
} else {
writeln!(writer, "{} the smallest files.\n\n", self.information.number_of_real_files)?;
}
for file_entry in &self.big_files {
writeln!(writer, "{} ({}) - {:?}", format_size(file_entry.size, BINARY), file_entry.size, file_entry.path)?;
write!(writer, "{} the biggest files.\n\n", self.information.number_of_real_files).unwrap();
for (size, files) in self.big_files.iter().rev() {
for file_entry in files {
writeln!(writer, "{} ({}) - {}", size.file_size(options::BINARY).unwrap(), size, file_entry.path.display()).unwrap();
}
}
} else {
write!(writer, "Not found any files.").unwrap();
}
Ok(())
}
fn save_results_to_file_as_json(&self, file_name: &str, pretty_print: bool) -> std::io::Result<()> {
self.save_results_to_file_as_json_internal(file_name, &self.big_files, pretty_print)
Common::print_time(start_time, SystemTime::now(), "save_results_to_file".to_string());
true
}
}
impl CommonData for BigFile {
fn get_cd(&self) -> &CommonToolData {
&self.common_data
}
fn get_cd_mut(&mut self) -> &mut CommonToolData {
&mut self.common_data
}
}
impl BigFile {
pub fn set_search_mode(&mut self, search_mode: SearchMode) {
self.search_mode = search_mode;
}
pub const fn get_big_files(&self) -> &Vec<FileEntry> {
&self.big_files
}
pub const fn get_information(&self) -> &Info {
&self.information
}
pub fn set_number_of_files_to_check(&mut self, number_of_files_to_check: usize) {
self.number_of_files_to_check = number_of_files_to_check;
impl PrintResults for BigFile {
fn print_results(&self) {
let start_time: SystemTime = SystemTime::now();
for (size, vector) in self.big_files.iter().rev() {
// TODO Align all to same width
for entry in vector {
println!("{} ({} bytes) - {}", size.file_size(options::BINARY).unwrap(), size, entry.path.display());
}
}
Common::print_time(start_time, SystemTime::now(), "print_entries".to_string());
}
}

File diff suppressed because it is too large Load Diff

@ -1,197 +1,18 @@
#![allow(unused_imports)]
use std::{fs, thread};
// I don't wanna fight with unused imports in this file, so simply ignore it to avoid too much complexity
use std::cmp::Ordering;
use std::ffi::OsString;
use std::fs::{DirEntry, File, OpenOptions};
use std::path::{Path, PathBuf};
use std::sync::atomic::{AtomicBool, AtomicUsize};
use std::sync::{atomic, Arc};
use std::thread::{sleep, JoinHandle};
use std::time::{Duration, Instant, SystemTime};
#[cfg(feature = "heif")]
use anyhow::Result;
use crossbeam_channel::Sender;
use directories_next::ProjectDirs;
use fun_time::fun_time;
use handsome_logger::{ColorChoice, ConfigBuilder, TerminalMode};
use image::{DynamicImage, ImageBuffer, Rgb};
use imagepipe::{ImageSource, Pipeline};
#[cfg(feature = "heif")]
use libheif_rs::{ColorSpace, HeifContext, RgbChroma};
#[cfg(feature = "libraw")]
use libraw::Processor;
use log::{debug, error, info, warn, LevelFilter, Record};
use rawloader::RawLoader;
use symphonia::core::conv::IntoSample;
// #[cfg(feature = "heif")]
// use libheif_rs::LibHeif;
use crate::common_dir_traversal::{CheckingMethod, ProgressData, ToolType};
use crate::common_directory::Directories;
use crate::common_items::{ExcludedItems, SingleExcludedItem};
use crate::common_messages::Messages;
use crate::common_tool::DeleteMethod;
use crate::common_traits::ResultEntry;
use crate::duplicate::make_hard_link;
use crate::CZKAWKA_VERSION;
static NUMBER_OF_THREADS: state::InitCell<usize> = state::InitCell::new();
static ALL_AVAILABLE_THREADS: state::InitCell<usize> = state::InitCell::new();
pub const DEFAULT_THREAD_SIZE: usize = 8 * 1024 * 1024; // 8 MB
pub const DEFAULT_WORKER_THREAD_SIZE: usize = 4 * 1024 * 1024; // 4 MB
pub fn get_number_of_threads() -> usize {
let data = NUMBER_OF_THREADS.get();
if *data >= 1 {
*data
} else {
get_all_available_threads()
}
}
fn filtering_messages(record: &Record) -> bool {
if let Some(module_path) = record.module_path() {
module_path.starts_with("czkawka") || module_path.starts_with("krokiet")
} else {
true
}
}
pub fn setup_logger(disabled_printing: bool) {
let log_level = if disabled_printing { LevelFilter::Off } else { LevelFilter::Info };
let config = ConfigBuilder::default().set_level(log_level).set_message_filtering(Some(filtering_messages)).build();
handsome_logger::TermLogger::init(config, TerminalMode::Mixed, ColorChoice::Always).unwrap();
}
pub fn get_all_available_threads() -> usize {
*ALL_AVAILABLE_THREADS.get_or_init(|| {
let available_threads = thread::available_parallelism().map(std::num::NonZeroUsize::get).unwrap_or(1);
ALL_AVAILABLE_THREADS.set(available_threads);
available_threads
})
}
pub fn print_version_mode() {
let rust_version = env!("RUST_VERSION_INTERNAL");
let debug_release = if cfg!(debug_assertions) { "debug" } else { "release" };
let processors = get_all_available_threads();
let info = os_info::get();
info!(
"App version: {CZKAWKA_VERSION}, {debug_release} mode, rust {rust_version}, os {} {} [{} {}], {processors} cpu/threads",
info.os_type(),
info.version(),
std::env::consts::ARCH,
info.bitness(),
);
if cfg!(debug_assertions) {
warn!("You are running debug version of app which is a lot of slower than release version.");
}
if option_env!("USING_CRANELIFT").is_some() {
warn!("You are running app with cranelift which is intended only for fast compilation, not runtime performance.");
}
}
pub fn set_default_number_of_threads() {
set_number_of_threads(get_all_available_threads());
}
pub fn set_number_of_threads(thread_number: usize) {
NUMBER_OF_THREADS.set(thread_number);
let additional_message = if thread_number == 0 {
" (0 - means that all available threads will be used)"
} else {
""
};
debug!("Number of threads set to {thread_number}{additional_message}");
rayon::ThreadPoolBuilder::new()
.num_threads(get_number_of_threads())
.stack_size(DEFAULT_WORKER_THREAD_SIZE)
.build_global()
.unwrap();
}
pub const RAW_IMAGE_EXTENSIONS: &[&str] = &[
"mrw", "arw", "srf", "sr2", "mef", "orf", "srw", "erf", "kdc", "kdc", "dcs", "rw2", "raf", "dcr", "dng", "pef", "crw", "iiq", "3fr", "nrw", "nef", "mos", "cr2", "ari",
];
pub const IMAGE_RS_EXTENSIONS: &[&str] = &["jpg", "jpeg", "png", "bmp", "tiff", "tif", "tga", "ff", "jif", "jfi", "webp", "gif", "ico", "exr", "qoi"];
pub const IMAGE_RS_SIMILAR_IMAGES_EXTENSIONS: &[&str] = &["jpg", "jpeg", "png", "tiff", "tif", "tga", "ff", "jif", "jfi", "bmp", "webp", "exr", "qoi"];
pub const IMAGE_RS_BROKEN_FILES_EXTENSIONS: &[&str] = &[
"jpg", "jpeg", "png", "tiff", "tif", "tga", "ff", "jif", "jfi", "gif", "bmp", "ico", "jfif", "jpe", "pnz", "dib", "webp", "exr",
];
pub const HEIC_EXTENSIONS: &[&str] = &["heif", "heifs", "heic", "heics", "avci", "avcs", "avifs"];
pub const ZIP_FILES_EXTENSIONS: &[&str] = &["zip", "jar"];
pub const PDF_FILES_EXTENSIONS: &[&str] = &["pdf"];
pub const AUDIO_FILES_EXTENSIONS: &[&str] = &[
"mp3", "flac", "wav", "ogg", "m4a", "aac", "aiff", "pcm", "aif", "aiff", "aifc", "m3a", "mp2", "mp4a", "mp2a", "mpga", "wave", "weba", "wma", "oga",
];
pub const VIDEO_FILES_EXTENSIONS: &[&str] = &[
"mp4", "mpv", "flv", "mp4a", "webm", "mpg", "mp2", "mpeg", "m4p", "m4v", "avi", "wmv", "qt", "mov", "swf", "mkv",
];
pub const LOOP_DURATION: u32 = 20; //ms
pub const SEND_PROGRESS_DATA_TIME_BETWEEN: u32 = 200; //ms
pub fn remove_folder_if_contains_only_empty_folders(path: impl AsRef<Path>, remove_to_trash: bool) -> Result<(), String> {
let path = path.as_ref();
if !path.is_dir() {
return Err(format!("Trying to remove folder {path:?} which is not a directory",));
}
use std::ffi::OsString;
use std::fs;
use std::fs::{File, OpenOptions};
use std::io::BufReader;
use std::path::{Path, PathBuf};
use std::time::SystemTime;
let mut entries_to_check = Vec::new();
let Ok(initial_entry) = path.read_dir() else {
return Err(format!("Cannot read directory {path:?}",));
};
for entry in initial_entry {
if let Ok(entry) = entry {
entries_to_check.push(entry);
} else {
return Err(format!("Cannot read entry from directory {path:?}"));
}
}
loop {
let Some(entry) = entries_to_check.pop() else {
break;
};
let Some(file_type) = entry.file_type().ok() else {
return Err(format!("Folder contains file with unknown type {:?} inside {path:?}", entry.path()));
};
/// Class for common functions used across other class/functions
if !file_type.is_dir() {
return Err(format!("Folder contains file {:?} inside {path:?}", entry.path(),));
}
let Ok(internal_read_dir) = entry.path().read_dir() else {
return Err(format!("Cannot read directory {:?} inside {path:?}", entry.path()));
};
for internal_elements in internal_read_dir {
if let Ok(internal_element) = internal_elements {
entries_to_check.push(internal_element);
} else {
return Err(format!("Cannot read entry from directory {:?} inside {path:?}", entry.path()));
}
}
}
pub const LOOP_DURATION: u32 = 200; //ms
if remove_to_trash {
trash::delete(path).map_err(|e| format!("Cannot move folder {path:?} to trash, reason {e}"))
} else {
fs::remove_dir_all(path).map_err(|e| format!("Cannot remove directory {path:?}, reason {e}"))
}
}
pub struct Common();
pub fn open_cache_folder(cache_file_name: &str, save_to_cache: bool, use_json: bool, warnings: &mut Vec<String>) -> Option<((Option<File>, PathBuf), (Option<File>, PathBuf))> {
if let Some(proj_dirs) = ProjectDirs::from("pl", "Qarmin", "Czkawka") {
@ -205,18 +26,18 @@ pub fn open_cache_folder(cache_file_name: &str, save_to_cache: bool, use_json: b
if save_to_cache {
if cache_dir.exists() {
if !cache_dir.is_dir() {
warnings.push(format!("Config dir {cache_dir:?} is a file!"));
warnings.push(format!("Config dir {} is a file!", cache_dir.display()));
return None;
}
} else if let Err(e) = fs::create_dir_all(&cache_dir) {
warnings.push(format!("Cannot create config dir {cache_dir:?}, reason {e}"));
warnings.push(format!("Cannot create config dir {}, reason {}", cache_dir.display(), e));
return None;
}
file_handler_default = Some(match OpenOptions::new().truncate(true).write(true).create(true).open(&cache_file) {
Ok(t) => t,
Err(e) => {
warnings.push(format!("Cannot create or open cache file {cache_file:?}, reason {e}"));
warnings.push(format!("Cannot create or open cache file {}, reason {}", cache_file.display(), e));
return None;
}
});
@ -224,7 +45,7 @@ pub fn open_cache_folder(cache_file_name: &str, save_to_cache: bool, use_json: b
file_handler_json = Some(match OpenOptions::new().truncate(true).write(true).create(true).open(&cache_file_json) {
Ok(t) => t,
Err(e) => {
warnings.push(format!("Cannot create or open cache file {cache_file_json:?}, reason {e}"));
warnings.push(format!("Cannot create or open cache file {}, reason {}", cache_file_json.display(), e));
return None;
}
});
@ -234,9 +55,12 @@ pub fn open_cache_folder(cache_file_name: &str, save_to_cache: bool, use_json: b
file_handler_default = Some(t);
} else {
if use_json {
file_handler_json = Some(OpenOptions::new().read(true).open(&cache_file_json).ok()?);
file_handler_json = Some(match OpenOptions::new().read(true).open(&cache_file_json) {
Ok(t) => t,
Err(_) => return None,
});
} else {
// messages.push(format!("Cannot find or open cache file {cache_file:?}")); // No error or warning
// messages.push(format!("Cannot find or open cache file {}", cache_file.display())); // No error or warning
return None;
}
}
@ -246,440 +70,211 @@ pub fn open_cache_folder(cache_file_name: &str, save_to_cache: bool, use_json: b
None
}
#[cfg(feature = "heif")]
pub fn get_dynamic_image_from_heic(path: &str) -> Result<DynamicImage> {
// let libheif = LibHeif::new();
let im = HeifContext::read_from_file(path)?;
let handle = im.primary_image_handle()?;
// let image = libheif.decode(&handle, ColorSpace::Rgb(RgbChroma::Rgb), None)?; // Enable when using libheif 0.19
let image = handle.decode(ColorSpace::Rgb(RgbChroma::Rgb), None)?;
let width = image.width();
let height = image.height();
let planes = image.planes();
let interleaved_plane = planes.interleaved.unwrap();
ImageBuffer::from_raw(width, height, interleaved_plane.data.to_owned())
.map(DynamicImage::ImageRgb8)
.ok_or_else(|| anyhow::anyhow!("Failed to create image buffer"))
}
#[cfg(feature = "libraw")]
pub fn get_dynamic_image_from_raw_image(path: impl AsRef<Path>) -> Option<DynamicImage> {
let buf = fs::read(path.as_ref()).ok()?;
let processor = Processor::new();
let start_timer = Instant::now();
let processed = processor.process_8bit(&buf).expect("processing successful");
println!("Processing took {:?}", start_timer.elapsed());
let width = processed.width();
let height = processed.height();
let data = processed.to_vec();
let buffer = ImageBuffer::from_raw(width, height, data)?;
// Utwórz DynamicImage z ImageBuffer
Some(DynamicImage::ImageRgb8(buffer))
}
#[cfg(not(feature = "libraw"))]
pub fn get_dynamic_image_from_raw_image(path: impl AsRef<Path> + std::fmt::Debug) -> Option<DynamicImage> {
let mut start_timer = Instant::now();
let mut times = Vec::new();
let loader = RawLoader::new();
let raw = loader.decode_file(path.as_ref()).ok()?;
let file_handler = match OpenOptions::new().read(true).open(&path) {
Ok(t) => t,
Err(_e) => {
return None;
}
};
times.push(("After decoding", start_timer.elapsed()));
start_timer = Instant::now();
let mut reader = BufReader::new(file_handler);
let raw = match rawloader::decode(&mut reader) {
Ok(raw) => raw,
Err(_e) => {
return None;
}
};
let width = raw.width;
let height = raw.height;
let source = ImageSource::Raw(raw);
times.push(("After creating source", start_timer.elapsed()));
start_timer = Instant::now();
let mut pipeline = Pipeline::new_from_source(source).ok()?;
times.push(("After creating pipeline", start_timer.elapsed()));
start_timer = Instant::now();
let mut pipeline = match Pipeline::new_from_source(source, width, height, true) {
Ok(pipeline) => pipeline,
Err(_e) => {
return None;
}
};
pipeline.run(None);
let image = pipeline.output_8bit(None).ok()?;
times.push(("After creating image", start_timer.elapsed()));
start_timer = Instant::now();
let image = match pipeline.output_8bit(None) {
Ok(image) => image,
Err(_e) => {
return None;
}
};
let image = ImageBuffer::<Rgb<u8>, Vec<u8>>::from_raw(image.width as u32, image.height as u32, image.data)?;
let image = match ImageBuffer::<Rgb<u8>, Vec<u8>>::from_raw(image.width as u32, image.height as u32, image.data) {
Some(image) => image,
None => {
return None;
}
};
times.push(("After creating image buffer", start_timer.elapsed()));
start_timer = Instant::now();
// println!("Properly hashed {:?}", path);
let res = Some(DynamicImage::ImageRgb8(image));
times.push(("After creating dynamic image", start_timer.elapsed()));
let str_timer = times.into_iter().map(|(name, time)| format!("{name}: {time:?}")).collect::<Vec<_>>().join(", ");
debug!("Loading raw image --- {str_timer}");
res
}
pub fn split_path(path: &Path) -> (String, String) {
match (path.parent(), path.file_name()) {
(Some(dir), Some(file)) => (dir.to_string_lossy().to_string(), file.to_string_lossy().into_owned()),
(Some(dir), None) => (dir.to_string_lossy().to_string(), String::new()),
(None, _) => (String::new(), String::new()),
}
}
pub fn split_path_compare(path_a: &Path, path_b: &Path) -> Ordering {
match path_a.parent().cmp(&path_b.parent()) {
Ordering::Equal => path_a.file_name().cmp(&path_b.file_name()),
other => other,
}
}
pub fn create_crash_message(library_name: &str, file_path: &str, home_library_url: &str) -> String {
format!("{library_name} library crashed when opening \"{file_path}\", please check if this is fixed with the latest version of {library_name} and if it is not fixed, please report bug here - {home_library_url}")
Some(image::DynamicImage::ImageRgb8(image))
}
pub fn regex_check(expression_item: &SingleExcludedItem, directory_name: &str) -> bool {
if expression_item.expression_splits.is_empty() {
return true;
impl Common {
/// Printing time which took between start and stop point and prints also function name
#[allow(unused_variables)]
pub fn print_time(start_time: SystemTime, end_time: SystemTime, function_name: String) {
#[cfg(debug_assertions)]
println!(
"Execution of function \"{}\" took {:?}",
function_name,
end_time.duration_since(start_time).expect("Time cannot go reverse.")
);
}
// Early checking if directory contains all parts needed by expression
for split in &expression_item.unique_extensions_splits {
if !directory_name.contains(split) {
return false;
pub fn delete_multiple_entries(entries: &[String]) -> Vec<String> {
let mut path: &Path;
let mut warnings: Vec<String> = Vec::new();
for entry in entries {
path = Path::new(entry);
if path.is_dir() {
if let Err(e) = fs::remove_dir_all(&entry) {
warnings.push(format!("Failed to remove folder {}, reason {}", entry, e));
}
} else if let Err(e) = fs::remove_file(&entry) {
warnings.push(format!("Failed to remove file {}, reason {}", entry, e));
}
}
warnings
}
// `git*` shouldn't be true for `/gitsfafasfs`
if !expression_item.expression.starts_with('*') && directory_name.find(&expression_item.expression_splits[0]).unwrap() > 0 {
return false;
}
// `*home` shouldn't be true for `/homeowner`
if !expression_item.expression.ends_with('*') && !directory_name.ends_with(expression_item.expression_splits.last().unwrap()) {
return false;
}
// At the end we check if parts between * are correctly positioned
let mut last_split_point = directory_name.find(&expression_item.expression_splits[0]).unwrap();
let mut current_index: usize = 0;
let mut found_index: usize;
for spl in &expression_item.expression_splits[1..] {
found_index = match directory_name[current_index..].find(spl) {
Some(t) => t,
None => return false,
};
current_index = last_split_point + spl.len();
last_split_point = found_index + current_index;
}
true
}
pub fn normalize_windows_path(path_to_change: impl AsRef<Path>) -> PathBuf {
let path = path_to_change.as_ref();
// Don't do anything, because network path may be case intensive
if path.to_string_lossy().starts_with('\\') {
return path.to_path_buf();
}
match path.to_str() {
Some(path) if path.is_char_boundary(1) => {
let replaced = path.replace('/', "\\");
let mut new_path = OsString::new();
if replaced[1..].starts_with(':') {
new_path.push(replaced[..1].to_ascii_uppercase());
new_path.push(replaced[1..].to_ascii_lowercase());
} else {
new_path.push(replaced.to_ascii_lowercase());
pub fn delete_one_entry(entry: &str) -> String {
let path: &Path = Path::new(entry);
let mut warning: String = String::from("");
if path.is_dir() {
if let Err(e) = fs::remove_dir_all(&entry) {
warning = format!("Failed to remove folder {}, reason {}", entry, e)
}
PathBuf::from(new_path)
} else if let Err(e) = fs::remove_file(&entry) {
warning = format!("Failed to remove file {}, reason {}", entry, e)
}
_ => path.to_path_buf(),
}
}
pub fn check_folder_children(
dir_result: &mut Vec<PathBuf>,
warnings: &mut Vec<String>,
entry_data: &DirEntry,
recursive_search: bool,
directories: &Directories,
excluded_items: &ExcludedItems,
) {
if !recursive_search {
return;
}
let next_item = entry_data.path();
if directories.is_excluded(&next_item) {
return;
warning
}
if excluded_items.is_excluded(&next_item) {
return;
}
#[cfg(target_family = "unix")]
if directories.exclude_other_filesystems() {
match directories.is_on_other_filesystems(&next_item) {
Ok(true) => return,
Err(e) => warnings.push(e),
_ => (),
/// Function to check if directory match expression
pub fn regex_check(expression: &str, directory: impl AsRef<Path>) -> bool {
if expression == "*" {
return true;
}
}
dir_result.push(next_item);
}
// Here we assume, that internal Vec<> have at least 1 object
#[allow(clippy::ptr_arg)]
pub fn delete_files_custom<T>(items: &Vec<&Vec<T>>, delete_method: &DeleteMethod, text_messages: &mut Messages, dry_run: bool) -> (u64, usize, usize)
where
T: ResultEntry + Clone,
{
let res = items
.iter()
.map(|values| {
let mut gained_space: u64 = 0;
let mut removed_files: usize = 0;
let mut failed_to_remove_files: usize = 0;
let mut infos = Vec::new();
let mut errors = Vec::new();
let mut all_values = (*values).clone();
let len = all_values.len();
// Sorted from oldest to newest - from smallest value to bigger
all_values.sort_unstable_by_key(ResultEntry::get_modified_date);
let temp_splits: Vec<&str> = expression.split('*').collect();
let mut splits: Vec<&str> = Vec::new();
for i in temp_splits {
if !i.is_empty() {
splits.push(i);
}
}
if splits.is_empty() {
return false;
}
if delete_method == &DeleteMethod::HardLink {
let original_file = &all_values[0];
for file_entry in &all_values[1..] {
if dry_run {
infos.push(format!(
"dry_run - would create hardlink from {:?} to {:?}",
original_file.get_path(),
file_entry.get_path()
));
} else {
if dry_run {
infos.push(format!("Replace file {:?} with hard link to {:?}", original_file.get_path(), file_entry.get_path()));
} else {
if let Err(e) = make_hard_link(original_file.get_path(), file_entry.get_path()) {
errors.push(format!(
"Cannot create hard link from {:?} to {:?} - {}",
file_entry.get_path(),
original_file.get_path(),
e
));
failed_to_remove_files += 1;
} else {
gained_space += 1;
removed_files += 1;
}
}
}
}
// Get rid of non unicode characters
let directory = directory.as_ref().to_string_lossy();
return (infos, errors, gained_space, removed_files, failed_to_remove_files);
// Early checking if directory contains all parts needed by expression
for split in &splits {
if !directory.contains(split) {
return false;
}
}
let items = match delete_method {
DeleteMethod::Delete => &all_values,
DeleteMethod::AllExceptNewest => &all_values[..(len - 1)],
DeleteMethod::AllExceptOldest => &all_values[1..],
DeleteMethod::OneOldest => &all_values[..1],
DeleteMethod::OneNewest => &all_values[(len - 1)..],
DeleteMethod::HardLink | DeleteMethod::None => unreachable!("HardLink and None should be handled before"),
};
let mut position_of_splits: Vec<usize> = Vec::new();
for i in items {
if dry_run {
infos.push(format!("dry_run - would delete file: {:?}", i.get_path()));
} else {
if let Err(e) = fs::remove_file(i.get_path()) {
errors.push(format!("Cannot delete file: {:?} - {e}", i.get_path()));
failed_to_remove_files += 1;
} else {
removed_files += 1;
gained_space += i.get_size();
}
}
}
(infos, errors, gained_space, removed_files, failed_to_remove_files)
})
.collect::<Vec<_>>();
// `git*` shouldn't be true for `/gitsfafasfs`
if !expression.starts_with('*') && directory.find(&splits[0]).unwrap() > 0 {
return false;
}
// `*home` shouldn't be true for `/homeowner`
if !expression.ends_with('*') && !directory.ends_with(splits.last().unwrap()) {
return false;
}
let mut gained_space = 0;
let mut removed_files = 0;
let mut failed_to_remove_files = 0;
for (infos, errors, gained_space_v, removed_files_v, failed_to_remove_files_v) in res {
text_messages.messages.extend(infos);
text_messages.errors.extend(errors);
gained_space += gained_space_v;
removed_files += removed_files_v;
failed_to_remove_files += failed_to_remove_files_v;
// At the end we check if parts between * are correctly positioned
position_of_splits.push(directory.find(&splits[0]).unwrap());
let mut current_index: usize;
let mut found_index: usize;
for i in splits[1..].iter().enumerate() {
current_index = *position_of_splits.get(i.0).unwrap() + i.1.len();
found_index = match directory[current_index..].find(i.1) {
Some(t) => t,
None => return false,
};
position_of_splits.push(found_index + current_index);
}
true
}
(gained_space, removed_files, failed_to_remove_files)
}
pub fn filter_reference_folders_generic<T>(entries_to_check: Vec<Vec<T>>, directories: &Directories) -> Vec<(T, Vec<T>)>
where
T: ResultEntry,
{
entries_to_check
.into_iter()
.filter_map(|vec_file_entry| {
let (mut files_from_referenced_folders, normal_files): (Vec<_>, Vec<_>) =
vec_file_entry.into_iter().partition(|e| directories.is_in_referenced_directory(e.get_path()));
pub fn normalize_windows_path(path_to_change: impl AsRef<Path>) -> PathBuf {
let path = path_to_change.as_ref();
if files_from_referenced_folders.is_empty() || normal_files.is_empty() {
None
} else {
Some((files_from_referenced_folders.pop().unwrap(), normal_files))
}
})
.collect::<Vec<(T, Vec<T>)>>()
}
pub fn prepare_thread_handler_common(
progress_sender: Option<&Sender<ProgressData>>,
current_stage: u8,
max_stage: u8,
max_value: usize,
checking_method: CheckingMethod,
tool_type: ToolType,
) -> (JoinHandle<()>, Arc<AtomicBool>, Arc<AtomicUsize>, AtomicBool) {
assert_ne!(tool_type, ToolType::None, "ToolType::None should not exist");
let progress_thread_run = Arc::new(AtomicBool::new(true));
let atomic_counter = Arc::new(AtomicUsize::new(0));
let check_was_stopped = AtomicBool::new(false);
let progress_thread_sender = if let Some(progress_sender) = progress_sender {
let progress_send = progress_sender.clone();
let progress_thread_run = progress_thread_run.clone();
let atomic_counter = atomic_counter.clone();
thread::spawn(move || {
// Use earlier time, to send immediately first message
let mut time_since_last_send = SystemTime::now() - Duration::from_secs(10u64);
// Don't do anything, because network path may be case intensive
if path.to_string_lossy().starts_with('\\') {
return path.to_path_buf();
}
loop {
if time_since_last_send.elapsed().unwrap().as_millis() > SEND_PROGRESS_DATA_TIME_BETWEEN as u128 {
progress_send
.send(ProgressData {
checking_method,
current_stage,
max_stage,
entries_checked: atomic_counter.load(atomic::Ordering::Relaxed),
entries_to_check: max_value,
tool_type,
})
.unwrap();
time_since_last_send = SystemTime::now();
}
if !progress_thread_run.load(atomic::Ordering::Relaxed) {
break;
match path.to_str() {
Some(path) if path.is_char_boundary(1) => {
let replaced = path.replace('/', "\\");
let mut new_path = OsString::new();
if replaced[1..].starts_with(':') {
new_path.push(replaced[..1].to_ascii_uppercase());
new_path.push(replaced[1..].to_ascii_lowercase());
} else {
new_path.push(replaced.to_ascii_lowercase());
}
sleep(Duration::from_millis(LOOP_DURATION as u64));
PathBuf::from(new_path)
}
})
} else {
thread::spawn(|| {})
};
(progress_thread_sender, progress_thread_run, atomic_counter, check_was_stopped)
}
#[inline]
pub fn check_if_stop_received(stop_receiver: Option<&crossbeam_channel::Receiver<()>>) -> bool {
if let Some(stop_receiver) = stop_receiver {
if stop_receiver.try_recv().is_ok() {
return true;
_ => path.to_path_buf(),
}
}
false
}
#[fun_time(message = "send_info_and_wait_for_ending_all_threads", level = "debug")]
pub fn send_info_and_wait_for_ending_all_threads(progress_thread_run: &Arc<AtomicBool>, progress_thread_handle: JoinHandle<()>) {
progress_thread_run.store(false, atomic::Ordering::Relaxed);
progress_thread_handle.join().unwrap();
}
#[cfg(test)]
mod test {
use std::fs;
use std::io::Write;
use std::path::{Path, PathBuf};
use tempfile::tempdir;
use std::path::PathBuf;
use crate::common::{normalize_windows_path, regex_check, remove_folder_if_contains_only_empty_folders};
use crate::common_items::new_excluded_item;
#[test]
fn test_remove_folder_if_contains_only_empty_folders() {
let dir = tempdir().unwrap();
let sub_dir = dir.path().join("sub_dir");
fs::create_dir(&sub_dir).unwrap();
// Test with empty directory
assert!(remove_folder_if_contains_only_empty_folders(&sub_dir, false).is_ok());
assert!(!Path::new(&sub_dir).exists());
// Test with directory containing an empty directory
fs::create_dir(&sub_dir).unwrap();
fs::create_dir(sub_dir.join("empty_sub_dir")).unwrap();
assert!(remove_folder_if_contains_only_empty_folders(&sub_dir, false).is_ok());
assert!(!Path::new(&sub_dir).exists());
// Test with directory containing a file
fs::create_dir(&sub_dir).unwrap();
let mut file = fs::File::create(sub_dir.join("file.txt")).unwrap();
writeln!(file, "Hello, world!").unwrap();
assert!(remove_folder_if_contains_only_empty_folders(&sub_dir, false).is_err());
assert!(Path::new(&sub_dir).exists());
}
use crate::common::Common;
#[test]
fn test_regex() {
assert!(regex_check(&new_excluded_item("*"), "/home/rafal"));
assert!(regex_check(&new_excluded_item("*home*"), "/home/rafal"));
assert!(regex_check(&new_excluded_item("*home"), "/home"));
assert!(regex_check(&new_excluded_item("*home/"), "/home/"));
assert!(regex_check(&new_excluded_item("*home/*"), "/home/"));
assert!(regex_check(&new_excluded_item("*.git*"), "/home/.git"));
assert!(regex_check(&new_excluded_item("*/home/rafal*rafal*rafal*rafal*"), "/home/rafal/rafalrafalrafal"));
assert!(regex_check(&new_excluded_item("AAA"), "AAA"));
assert!(regex_check(&new_excluded_item("AAA*"), "AAABDGG/QQPW*"));
assert!(!regex_check(&new_excluded_item("*home"), "/home/"));
assert!(!regex_check(&new_excluded_item("*home"), "/homefasfasfasfasf/"));
assert!(!regex_check(&new_excluded_item("*home"), "/homefasfasfasfasf"));
assert!(!regex_check(&new_excluded_item("rafal*afal*fal"), "rafal"));
assert!(!regex_check(&new_excluded_item("rafal*a"), "rafal"));
assert!(!regex_check(&new_excluded_item("AAAAAAAA****"), "/AAAAAAAAAAAAAAAAA"));
assert!(!regex_check(&new_excluded_item("*.git/*"), "/home/.git"));
assert!(!regex_check(&new_excluded_item("*home/*koc"), "/koc/home/"));
assert!(!regex_check(&new_excluded_item("*home/"), "/home"));
assert!(!regex_check(&new_excluded_item("*TTT"), "/GGG"));
assert!(regex_check(
&new_excluded_item("*/home/*/.local/share/containers"),
"/var/home/roman/.local/share/containers"
));
if cfg!(target_family = "windows") {
assert!(regex_check(&new_excluded_item("*\\home"), "C:\\home"));
assert!(regex_check(&new_excluded_item("*/home"), "C:\\home"));
assert!(Common::regex_check("*home*", "/home/rafal"));
assert!(Common::regex_check("*home", "/home"));
assert!(Common::regex_check("*home/", "/home/"));
assert!(Common::regex_check("*home/*", "/home/"));
assert!(Common::regex_check("*.git*", "/home/.git"));
assert!(Common::regex_check("*/home/rafal*rafal*rafal*rafal*", "/home/rafal/rafalrafalrafal"));
assert!(Common::regex_check("AAA", "AAA"));
assert!(Common::regex_check("AAA*", "AAABDGG/QQPW*"));
assert!(!Common::regex_check("*home", "/home/"));
assert!(!Common::regex_check("*home", "/homefasfasfasfasf/"));
assert!(!Common::regex_check("*home", "/homefasfasfasfasf"));
assert!(!Common::regex_check("rafal*afal*fal", "rafal"));
assert!(!Common::regex_check("rafal*a", "rafal"));
assert!(!Common::regex_check("AAAAAAAA****", "/AAAAAAAAAAAAAAAAA"));
assert!(!Common::regex_check("*.git/*", "/home/.git"));
assert!(!Common::regex_check("*home/*koc", "/koc/home/"));
assert!(!Common::regex_check("*home/", "/home"));
assert!(!Common::regex_check("*TTT", "/GGG"));
#[cfg(target_family = "windows")]
{
assert!(Common::regex_check("*\\home", "C:\\home"));
assert!(Common::regex_check("*/home", "C:\\home"));
}
}
#[test]
fn test_windows_path() {
assert_eq!(PathBuf::from("C:\\path.txt"), normalize_windows_path("c:/PATH.tXt"));
assert_eq!(PathBuf::from("H:\\reka\\weza\\roman.txt"), normalize_windows_path("h:/RekA/Weza\\roMan.Txt"));
assert_eq!(PathBuf::from("T:\\a"), normalize_windows_path("T:\\A"));
assert_eq!(PathBuf::from("\\\\aBBa"), normalize_windows_path("\\\\aBBa"));
assert_eq!(PathBuf::from("a"), normalize_windows_path("a"));
assert_eq!(PathBuf::from(""), normalize_windows_path(""));
assert_eq!(PathBuf::from("C:\\path.txt"), Common::normalize_windows_path("c:/PATH.tXt"));
assert_eq!(PathBuf::from("H:\\reka\\weza\\roman.txt"), Common::normalize_windows_path("h:/RekA/Weza\\roMan.Txt"));
assert_eq!(PathBuf::from("T:\\a"), Common::normalize_windows_path("T:\\A"));
assert_eq!(PathBuf::from("\\\\aBBa"), Common::normalize_windows_path("\\\\aBBa"));
assert_eq!(PathBuf::from("a"), Common::normalize_windows_path("a"));
assert_eq!(PathBuf::from(""), Common::normalize_windows_path(""));
}
}

@ -1,241 +0,0 @@
use std::collections::BTreeMap;
use std::io::{BufReader, BufWriter};
use fun_time::fun_time;
use image::imageops::FilterType;
use image_hasher::HashAlg;
use log::debug;
use rayon::iter::{IntoParallelIterator, ParallelIterator};
use serde::{Deserialize, Serialize};
use crate::common;
use crate::common_messages::Messages;
use crate::common_traits::ResultEntry;
use crate::duplicate::HashType;
use crate::similar_images::{convert_algorithm_to_string, convert_filters_to_string};
const CACHE_VERSION: &str = "70";
pub fn get_broken_files_cache_file() -> String {
format!("cache_broken_files_{CACHE_VERSION}.bin")
}
pub fn get_similar_images_cache_file(hash_size: &u8, hash_alg: &HashAlg, image_filter: &FilterType) -> String {
format!(
"cache_similar_images_{hash_size}_{}_{}_{CACHE_VERSION}.bin",
convert_algorithm_to_string(hash_alg),
convert_filters_to_string(image_filter),
)
}
pub fn get_similar_videos_cache_file() -> String {
format!("cache_similar_videos_{CACHE_VERSION}.bin")
}
pub fn get_similar_music_cache_file(checking_tags: bool) -> String {
if checking_tags {
format!("cache_same_music_tags_{CACHE_VERSION}.bin")
} else {
format!("cache_same_music_fingerprints_{CACHE_VERSION}.bin")
}
}
pub fn get_duplicate_cache_file(type_of_hash: &HashType, is_prehash: bool) -> String {
let prehash_str = if is_prehash { "_prehash" } else { "" };
format!("cache_duplicates_{type_of_hash:?}{prehash_str}_{CACHE_VERSION}.bin")
}
#[fun_time(message = "save_cache_to_file_generalized", level = "debug")]
pub fn save_cache_to_file_generalized<T>(cache_file_name: &str, hashmap: &BTreeMap<String, T>, save_also_as_json: bool, minimum_file_size: u64) -> Messages
where
T: Serialize + ResultEntry + Sized + Send + Sync,
{
let mut text_messages = Messages::new();
if let Some(((file_handler, cache_file), (file_handler_json, cache_file_json))) =
common::open_cache_folder(cache_file_name, true, save_also_as_json, &mut text_messages.warnings)
{
let hashmap_to_save = hashmap.values().filter(|t| t.get_size() >= minimum_file_size).collect::<Vec<_>>();
{
let writer = BufWriter::new(file_handler.unwrap()); // Unwrap because cannot fail here
if let Err(e) = bincode::serialize_into(writer, &hashmap_to_save) {
text_messages.warnings.push(format!("Cannot write data to cache file {cache_file:?}, reason {e}"));
debug!("Failed to save cache to file {cache_file:?}");
return text_messages;
}
debug!("Saved binary to file {cache_file:?}");
}
if save_also_as_json {
if let Some(file_handler_json) = file_handler_json {
let writer = BufWriter::new(file_handler_json);
if let Err(e) = serde_json::to_writer(writer, &hashmap_to_save) {
text_messages.warnings.push(format!("Cannot write data to cache file {cache_file_json:?}, reason {e}"));
debug!("Failed to save cache to file {cache_file_json:?}");
return text_messages;
}
debug!("Saved json to file {cache_file_json:?}");
}
}
text_messages.messages.push(format!("Properly saved to file {} cache entries.", hashmap.len()));
debug!("Properly saved to file {} cache entries.", hashmap.len());
} else {
debug!("Failed to save cache to file {cache_file_name} because not exists");
}
text_messages
}
#[fun_time(message = "load_cache_from_file_generalized_by_path", level = "debug")]
pub fn load_cache_from_file_generalized_by_path<T>(cache_file_name: &str, delete_outdated_cache: bool, used_files: &BTreeMap<String, T>) -> (Messages, Option<BTreeMap<String, T>>)
where
for<'a> T: Deserialize<'a> + ResultEntry + Sized + Send + Sync + Clone,
{
let (text_messages, vec_loaded_cache) = load_cache_from_file_generalized(cache_file_name, delete_outdated_cache, used_files);
let Some(vec_loaded_entries) = vec_loaded_cache else {
return (text_messages, None);
};
debug!("Converting cache Vec<T> into BTreeMap<String, T>");
let map_loaded_entries: BTreeMap<String, T> = vec_loaded_entries
.into_iter()
.map(|file_entry| (file_entry.get_path().to_string_lossy().into_owned(), file_entry))
.collect();
debug!("Converted cache Vec<T> into BTreeMap<String, T>");
(text_messages, Some(map_loaded_entries))
}
#[fun_time(message = "load_cache_from_file_generalized_by_size", level = "debug")]
pub fn load_cache_from_file_generalized_by_size<T>(
cache_file_name: &str,
delete_outdated_cache: bool,
cache_not_converted: &BTreeMap<u64, Vec<T>>,
) -> (Messages, Option<BTreeMap<u64, Vec<T>>>)
where
for<'a> T: Deserialize<'a> + ResultEntry + Sized + Send + Sync + Clone,
{
debug!("Converting cache BtreeMap<u64, Vec<T>> into BTreeMap<String, T>");
let mut used_files: BTreeMap<String, T> = Default::default();
for file_entry in cache_not_converted.values().flatten() {
used_files.insert(file_entry.get_path().to_string_lossy().into_owned(), file_entry.clone());
}
debug!("Converted cache BtreeMap<u64, Vec<T>> into BTreeMap<String, T>");
let (text_messages, vec_loaded_cache) = load_cache_from_file_generalized(cache_file_name, delete_outdated_cache, &used_files);
let Some(vec_loaded_entries) = vec_loaded_cache else {
return (text_messages, None);
};
debug!("Converting cache Vec<T> into BTreeMap<u64, Vec<T>>");
let mut map_loaded_entries: BTreeMap<u64, Vec<T>> = Default::default();
for file_entry in vec_loaded_entries {
map_loaded_entries.entry(file_entry.get_size()).or_default().push(file_entry);
}
debug!("Converted cache Vec<T> into BTreeMap<u64, Vec<T>>");
(text_messages, Some(map_loaded_entries))
}
#[fun_time(message = "load_cache_from_file_generalized_by_path_from_size", level = "debug")]
pub fn load_cache_from_file_generalized_by_path_from_size<T>(
cache_file_name: &str,
delete_outdated_cache: bool,
cache_not_converted: &BTreeMap<u64, Vec<T>>,
) -> (Messages, Option<BTreeMap<String, T>>)
where
for<'a> T: Deserialize<'a> + ResultEntry + Sized + Send + Sync + Clone,
{
debug!("Converting cache BtreeMap<u64, Vec<T>> into BTreeMap<String, T>");
let mut used_files: BTreeMap<String, T> = Default::default();
for file_entry in cache_not_converted.values().flatten() {
used_files.insert(file_entry.get_path().to_string_lossy().into_owned(), file_entry.clone());
}
debug!("Converted cache BtreeMap<u64, Vec<T>> into BTreeMap<String, T>");
let (text_messages, vec_loaded_cache) = load_cache_from_file_generalized(cache_file_name, delete_outdated_cache, &used_files);
let Some(vec_loaded_entries) = vec_loaded_cache else {
return (text_messages, None);
};
debug!("Converting cache Vec<T> into BTreeMap<String, T>");
let map_loaded_entries: BTreeMap<String, T> = vec_loaded_entries
.into_iter()
.map(|file_entry| (file_entry.get_path().to_string_lossy().into_owned(), file_entry))
.collect();
debug!("Converted cache Vec<T> into BTreeMap<String, T>");
(text_messages, Some(map_loaded_entries))
}
#[fun_time(message = "load_cache_from_file_generalized", level = "debug")]
fn load_cache_from_file_generalized<T>(cache_file_name: &str, delete_outdated_cache: bool, used_files: &BTreeMap<String, T>) -> (Messages, Option<Vec<T>>)
where
for<'a> T: Deserialize<'a> + ResultEntry + Sized + Send + Sync + Clone,
{
let mut text_messages = Messages::new();
if let Some(((file_handler, cache_file), (file_handler_json, cache_file_json))) = common::open_cache_folder(cache_file_name, false, true, &mut text_messages.warnings) {
let mut vec_loaded_entries: Vec<T>;
if let Some(file_handler) = file_handler {
let reader = BufReader::new(file_handler);
vec_loaded_entries = match bincode::deserialize_from(reader) {
Ok(t) => t,
Err(e) => {
text_messages.warnings.push(format!("Failed to load data from cache file {cache_file:?}, reason {e}"));
debug!("Failed to load cache from file {cache_file:?}");
return (text_messages, None);
}
};
} else {
let reader = BufReader::new(file_handler_json.unwrap()); // Unwrap cannot fail, because at least one file must be valid
vec_loaded_entries = match serde_json::from_reader(reader) {
Ok(t) => t,
Err(e) => {
text_messages.warnings.push(format!("Failed to load data from cache file {cache_file_json:?}, reason {e}"));
debug!("Failed to load cache from file {cache_file:?}");
return (text_messages, None);
}
};
}
debug!(
"Starting removing outdated cache entries (removing non existent files from cache - {})",
delete_outdated_cache
);
let initial_number_of_entries = vec_loaded_entries.len();
vec_loaded_entries = vec_loaded_entries
.into_par_iter()
.filter(|file_entry| {
let path = file_entry.get_path();
let file_entry_path_str = path.to_string_lossy().to_string();
if let Some(used_file) = used_files.get(&file_entry_path_str) {
if file_entry.get_size() != used_file.get_size() {
return false;
}
if file_entry.get_modified_date() != used_file.get_modified_date() {
return false;
}
}
if delete_outdated_cache && !path.exists() {
return false;
}
true
})
.collect();
debug!(
"Completed removing outdated cache entries, removed {} out of all {} entries",
initial_number_of_entries - vec_loaded_entries.len(),
initial_number_of_entries
);
text_messages.messages.push(format!("Properly loaded {} cache entries.", vec_loaded_entries.len()));
debug!("Loaded cache from file {cache_file_name} (or json alternative) - {} results", vec_loaded_entries.len());
return (text_messages, Some(vec_loaded_entries));
}
debug!("Failed to load cache from file {cache_file_name} because not exists");
(text_messages, None)
}

File diff suppressed because it is too large Load Diff

@ -1,19 +1,22 @@
use std::path::{Path, PathBuf};
use std::time::SystemTime;
#[cfg(target_family = "unix")]
use std::{fs, os::unix::fs::MetadataExt};
use crate::common::normalize_windows_path;
use crate::common::Common;
use crate::common_messages::Messages;
use crate::flc;
use crate::localizer_core::generate_translation_hashmap;
#[derive(Debug, Clone, Default)]
#[derive(Clone, Default)]
pub struct Directories {
pub excluded_directories: Vec<PathBuf>,
pub included_directories: Vec<PathBuf>,
pub reference_directories: Vec<PathBuf>,
pub exclude_other_filesystems: Option<bool>,
#[cfg(target_family = "unix")]
pub included_dev_ids: Vec<u64>,
exclude_other_filesystems: Option<bool>,
#[cfg(target_family = "unix")]
included_dev_ids: Vec<u64>,
}
impl Directories {
@ -21,59 +24,81 @@ impl Directories {
Default::default()
}
pub fn set_reference_directory(&mut self, reference_directory: &[PathBuf]) -> Messages {
let mut messages: Messages = Messages::new();
pub fn set_reference_directory(&mut self, reference_directory: Vec<PathBuf>) {
self.reference_directories = reference_directory
.iter()
.filter_map(|directory| {
let (dir, msg) = Self::canonicalize_and_clear_path(directory, false);
messages.extend_with_another_messages(msg);
dir
})
.collect::<Vec<PathBuf>>();
messages
}
pub fn set_included_directory(&mut self, included_directory: Vec<PathBuf>) -> Messages {
let mut messages: Messages = Messages::new();
/// Setting included directories, at least one must be provided or scan won't start
pub fn set_included_directory(&mut self, included_directory: Vec<PathBuf>, text_messages: &mut Messages) -> bool {
let start_time: SystemTime = SystemTime::now();
if included_directory.is_empty() {
messages.errors.push(flc!("core_missing_no_chosen_included_directory"));
return messages;
text_messages.errors.push(flc!("core_missing_no_chosen_included_directory"));
return false;
}
let directories: Vec<PathBuf> = included_directory;
let mut checked_directories: Vec<PathBuf> = Vec::new();
for directory in directories {
let (dir, msg) = Self::canonicalize_and_clear_path(&directory, false);
if directory.to_string_lossy().contains('*') {
text_messages.warnings.push(flc!(
"core_directory_wildcard_no_supported",
generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
continue;
}
messages.extend_with_another_messages(msg);
#[cfg(not(target_family = "windows"))]
if directory.is_relative() {
text_messages.warnings.push(flc!(
"core_directory_relative_path",
generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
continue;
}
#[cfg(target_family = "windows")]
if directory.is_relative() && !directory.starts_with("\\") {
text_messages.warnings.push(flc!(
"core_directory_relative_path",
generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
continue;
}
if let Some(dir) = dir {
checked_directories.push(dir);
if !directory.exists() {
text_messages.warnings.push(flc!(
"core_directory_must_exists",
generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
continue;
}
if !directory.is_dir() {
text_messages.warnings.push(flc!(
"core_directory_must_be_directory",
generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
continue;
}
checked_directories.push(directory);
}
if checked_directories.is_empty() {
messages.warnings.push(flc!("core_included_directory_zero_valid_directories"));
return messages;
text_messages.warnings.push(flc!("core_included_directory_zero_valid_directories"));
return false;
}
self.included_directories = checked_directories;
messages
Common::print_time(start_time, SystemTime::now(), "set_included_directory".to_string());
true
}
pub fn set_excluded_directory(&mut self, excluded_directory: Vec<PathBuf>) -> Messages {
let mut messages: Messages = Messages::new();
/// Setting absolute path to exclude from search
pub fn set_excluded_directory(&mut self, excluded_directory: Vec<PathBuf>, text_messages: &mut Messages) {
let start_time: SystemTime = SystemTime::now();
if excluded_directory.is_empty() {
return messages;
return;
}
let directories: Vec<PathBuf> = excluded_directory;
@ -82,90 +107,81 @@ impl Directories {
for directory in directories {
let directory_as_string = directory.to_string_lossy();
if directory_as_string == "/" {
messages.errors.push(flc!("core_excluded_directory_pointless_slash"));
text_messages.errors.push(flc!("core_excluded_directory_pointless_slash"));
break;
}
let (dir, msg) = Self::canonicalize_and_clear_path(&directory, true);
messages.extend_with_another_messages(msg);
if let Some(dir) = dir {
checked_directories.push(dir);
if directory_as_string.contains('*') {
text_messages.warnings.push(flc!(
"core_directory_wildcard_no_supported",
generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
continue;
}
}
self.excluded_directories = checked_directories;
messages
}
fn canonicalize_and_clear_path(directory: &Path, is_excluded: bool) -> (Option<PathBuf>, Messages) {
let mut messages = Messages::new();
let mut directory = directory.to_path_buf();
if !directory.exists() {
if !is_excluded {
messages.warnings.push(flc!("core_directory_must_exists", path = directory.to_string_lossy().to_string()));
#[cfg(not(target_family = "windows"))]
if directory.is_relative() {
text_messages.warnings.push(flc!(
"core_directory_relative_path",
generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
continue;
}
#[cfg(target_family = "windows")]
if directory.is_relative() && !directory.starts_with("\\") {
text_messages.warnings.push(flc!(
"core_directory_relative_path",
generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
continue;
}
return (None, messages);
}
if !directory.is_dir() {
messages
.warnings
.push(flc!("core_directory_must_be_directory", path = directory.to_string_lossy().to_string()));
return (None, messages);
}
// Try to canonicalize them
if cfg!(windows) {
// Only canonicalize if it's not a network path
// This can be check by checking if path starts with \\?\UNC\
if let Ok(dir_can) = directory.canonicalize() {
let dir_can_str = dir_can.to_string_lossy().to_string();
if let Some(dir_can_str) = dir_can_str.strip_prefix(r"\\?\") {
if dir_can_str.chars().nth(1) == Some(':') {
directory = PathBuf::from(dir_can_str);
}
}
if !directory.exists() {
// No error when excluded directories are missing
continue;
}
} else {
if let Ok(dir) = directory.canonicalize() {
directory = dir;
if !directory.is_dir() {
text_messages.warnings.push(flc!(
"core_directory_must_be_directory",
generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
continue;
}
checked_directories.push(directory);
}
(Some(directory), messages)
self.excluded_directories = checked_directories;
Common::print_time(start_time, SystemTime::now(), "set_excluded_directory".to_string());
}
#[cfg(target_family = "unix")]
pub fn set_exclude_other_filesystems(&mut self, exclude_other_filesystems: bool) {
self.exclude_other_filesystems = Some(exclude_other_filesystems);
self.exclude_other_filesystems = Some(exclude_other_filesystems)
}
pub fn optimize_directories(&mut self, recursive_search: bool) -> Messages {
let mut messages: Messages = Messages::new();
/// Remove unused entries when included or excluded overlaps with each other or are duplicated etc.
pub fn optimize_directories(&mut self, recursive_search: bool, text_messages: &mut Messages) -> bool {
let start_time: SystemTime = SystemTime::now();
let mut optimized_included: Vec<PathBuf> = Vec::new();
let mut optimized_excluded: Vec<PathBuf> = Vec::new();
if cfg!(target_family = "windows") {
self.included_directories = self.included_directories.iter().map(normalize_windows_path).collect();
self.excluded_directories = self.excluded_directories.iter().map(normalize_windows_path).collect();
self.reference_directories = self.reference_directories.iter().map(normalize_windows_path).collect();
self.included_directories = self.included_directories.iter().map(Common::normalize_windows_path).collect();
self.excluded_directories = self.excluded_directories.iter().map(Common::normalize_windows_path).collect();
self.reference_directories = self.reference_directories.iter().map(Common::normalize_windows_path).collect();
}
// Remove duplicated entries like: "/", "/"
self.excluded_directories.sort_unstable();
self.included_directories.sort_unstable();
self.reference_directories.sort_unstable();
self.excluded_directories.sort();
self.included_directories.sort();
self.reference_directories.sort();
self.excluded_directories.dedup();
self.included_directories.dedup();
self.reference_directories.dedup();
// Optimize for duplicated included directories - "/", "/home". "/home/Pulpit" to "/"
// Do not use when not using recursive search or using
if recursive_search && !self.exclude_other_filesystems.unwrap_or(false) {
if recursive_search {
// This is only point which can't be done when recursive search is disabled.
let mut is_inside: bool;
for ed_checked in &self.excluded_directories {
@ -263,7 +279,7 @@ impl Directories {
{
let mut ref_folders = Vec::new();
for folder in &self.reference_directories {
if self.included_directories.iter().any(|e| folder.starts_with(e)) {
if self.included_directories.iter().any(|e| folder.starts_with(&e)) {
ref_folders.push(folder.clone());
}
}
@ -271,13 +287,14 @@ impl Directories {
}
if self.included_directories.is_empty() {
messages.errors.push(flc!("core_directory_overlap"));
return messages;
text_messages.errors.push(flc!("core_directory_overlap"));
return false;
}
// Not needed, but better is to have sorted everything
self.excluded_directories.sort_unstable();
self.included_directories.sort_unstable();
self.excluded_directories.sort();
self.included_directories.sort();
Common::print_time(start_time, SystemTime::now(), "optimize_directories".to_string());
// Get device IDs for included directories
#[cfg(target_family = "unix")]
@ -285,21 +302,22 @@ impl Directories {
for d in &self.included_directories {
match fs::metadata(d) {
Ok(m) => self.included_dev_ids.push(m.dev()),
Err(_) => messages.errors.push(flc!("core_directory_unable_to_get_device_id", path = d.to_string_lossy().to_string())),
Err(_) => text_messages.errors.push(flc!(
"core_directory_unable_to_get_device_id",
generate_translation_hashmap(vec![("path", d.display().to_string())])
)),
}
}
}
messages
true
}
pub fn is_in_referenced_directory(&self, path: &Path) -> bool {
self.reference_directories.iter().any(|e| path.starts_with(e))
}
pub fn is_excluded(&self, path: &Path) -> bool {
/// Checks whether a specified directory is excluded from searching
pub fn is_excluded(&self, path: impl AsRef<Path>) -> bool {
let path = path.as_ref();
#[cfg(target_family = "windows")]
let path = normalize_windows_path(path);
let path = Common::normalize_windows_path(path);
// We're assuming that `excluded_directories` are already normalized
self.excluded_directories.iter().any(|p| p.as_path() == path)
}
@ -309,12 +327,17 @@ impl Directories {
self.exclude_other_filesystems.unwrap_or(false)
}
/// Checks whether a specified directory is on other filesystems rather then include
/// directories
#[cfg(target_family = "unix")]
pub fn is_on_other_filesystems(&self, path: impl AsRef<Path>) -> Result<bool, String> {
let path = path.as_ref();
match fs::metadata(path) {
Ok(m) => Ok(!self.included_dev_ids.iter().any(|&id| id == m.dev())),
Err(_) => Err(flc!("core_directory_unable_to_get_device_id", path = path.to_string_lossy().to_string())),
Err(_) => Err(flc!(
"core_directory_unable_to_get_device_id",
generate_translation_hashmap(vec![("path", path.display().to_string())])
)),
}
}
}

@ -1,124 +1,80 @@
use std::collections::HashSet;
use std::fs::DirEntry;
use std::time::SystemTime;
use crate::common::Common;
use crate::common_messages::Messages;
#[derive(Debug, Clone, Default)]
#[derive(Clone, Default)]
pub struct Extensions {
allowed_extensions_hashset: HashSet<String>,
excluded_extensions_hashset: HashSet<String>,
file_extensions: Vec<String>,
}
impl Extensions {
pub fn new() -> Self {
Default::default()
}
pub fn filter_extensions(mut file_extensions: String) -> (HashSet<String>, Messages) {
let mut messages = Messages::new();
let mut extensions_hashset = HashSet::new();
if file_extensions.trim().is_empty() {
return (Default::default(), messages);
/// List of allowed extensions, only files with this extensions will be checking if are duplicates
/// After, extensions cannot contains any dot, commas etc.
pub fn set_allowed_extensions(&mut self, mut allowed_extensions: String, text_messages: &mut Messages) {
let start_time: SystemTime = SystemTime::now();
if allowed_extensions.trim().is_empty() {
return;
}
file_extensions = file_extensions.replace("IMAGE", "jpg,kra,gif,png,bmp,tiff,hdr,svg");
file_extensions = file_extensions.replace("VIDEO", "mp4,flv,mkv,webm,vob,ogv,gifv,avi,mov,wmv,mpg,m4v,m4p,mpeg,3gp");
file_extensions = file_extensions.replace("MUSIC", "mp3,flac,ogg,tta,wma,webm");
file_extensions = file_extensions.replace("TEXT", "txt,doc,docx,odt,rtf");
allowed_extensions = allowed_extensions.replace("IMAGE", "jpg,kra,gif,png,bmp,tiff,hdr,svg");
allowed_extensions = allowed_extensions.replace("VIDEO", "mp4,flv,mkv,webm,vob,ogv,gifv,avi,mov,wmv,mpg,m4v,m4p,mpeg,3gp");
allowed_extensions = allowed_extensions.replace("MUSIC", "mp3,flac,ogg,tta,wma,webm");
allowed_extensions = allowed_extensions.replace("TEXT", "txt,doc,docx,odt,rtf");
let extensions: Vec<String> = file_extensions.split(',').map(str::trim).map(String::from).collect();
let extensions: Vec<String> = allowed_extensions.split(',').map(|e| e.trim()).map(String::from).collect();
for mut extension in extensions {
if extension.is_empty() || extension.replace(['.', ' '], "").trim().is_empty() {
if extension.is_empty() || extension.replace('.', "").replace(' ', "").trim().is_empty() {
continue;
}
if extension.starts_with('.') {
extension = extension.chars().skip(1).collect::<String>();
if !extension.starts_with('.') {
extension = format!(".{}", extension);
}
if extension.contains('.') {
messages.warnings.push(format!("{extension} is not valid extension because contains dot inside"));
if extension[1..].contains('.') {
text_messages.warnings.push(format!("{} is not valid extension because contains dot inside", extension));
continue;
}
if extension.contains(' ') {
messages.warnings.push(format!("{extension} is not valid extension because contains empty space inside"));
if extension[1..].contains(' ') {
text_messages
.warnings
.push(format!("{} is not valid extension because contains empty space inside", extension));
continue;
}
extensions_hashset.insert(extension);
}
(extensions_hashset, messages)
}
/// List of allowed extensions, only files with this extensions will be checking if are duplicates
/// After, extensions cannot contain any dot, commas etc.
pub fn set_allowed_extensions(&mut self, allowed_extensions: String) -> Messages {
let (extensions, messages) = Self::filter_extensions(allowed_extensions);
self.allowed_extensions_hashset = extensions;
messages
}
pub fn set_excluded_extensions(&mut self, excluded_extensions: String) -> Messages {
let (extensions, messages) = Self::filter_extensions(excluded_extensions);
self.excluded_extensions_hashset = extensions;
messages
}
pub fn check_if_entry_have_valid_extension(&self, entry_data: &DirEntry) -> bool {
if self.allowed_extensions_hashset.is_empty() && self.excluded_extensions_hashset.is_empty() {
return true;
}
// Using entry_data.path().extension() is a lot of slower, even 5 times
let file_name = entry_data.file_name();
let Some(file_name_str) = file_name.to_str() else { return false };
let Some(extension_idx) = file_name_str.rfind('.') else { return false };
let extension = &file_name_str[extension_idx + 1..];
if !self.allowed_extensions_hashset.is_empty() {
if extension.chars().all(|c| c.is_ascii_lowercase()) {
self.allowed_extensions_hashset.contains(extension)
} else {
self.allowed_extensions_hashset.contains(&extension.to_lowercase())
}
} else {
if extension.chars().all(|c| c.is_ascii_lowercase()) {
!self.excluded_extensions_hashset.contains(extension)
} else {
!self.excluded_extensions_hashset.contains(&extension.to_lowercase())
if !self.file_extensions.contains(&extension) {
self.file_extensions.push(extension);
}
}
}
pub fn set_any_extensions(&self) -> bool {
!self.allowed_extensions_hashset.is_empty()
if self.file_extensions.is_empty() {
text_messages
.messages
.push("No valid extensions were provided, so allowing all extensions by default.".to_string());
}
Common::print_time(start_time, SystemTime::now(), "set_allowed_extensions".to_string());
}
fn extend_allowed_extensions(&mut self, file_extensions: &[&str]) {
for extension in file_extensions {
let extension_without_dot = extension.trim_start_matches('.');
self.allowed_extensions_hashset.insert(extension_without_dot.to_string());
pub fn matches_filename(&self, file_name: &str) -> bool {
// assert_eq!(file_name, file_name.to_lowercase());
if !self.file_extensions.is_empty() && !self.file_extensions.iter().any(|e| file_name.ends_with(e)) {
return false;
}
true
}
// E.g. when using similar videos, user can provide extensions like "mp4,flv", but if user provide "mp4,jpg" then
// it will be only "mp4" because "jpg" is not valid extension for videos
fn union_allowed_extensions(&mut self, file_extensions: &[&str]) {
let mut new_extensions = HashSet::new();
for extension in file_extensions {
let extension_without_dot = extension.trim_start_matches('.');
new_extensions.insert(extension_without_dot.to_string());
}
pub fn using_custom_extensions(&self) -> bool {
!self.file_extensions.is_empty()
}
pub fn set_and_validate_allowed_extensions(&mut self, file_extensions: &[&str]) {
if self.allowed_extensions_hashset.is_empty() {
self.extend_allowed_extensions(file_extensions);
} else {
self.union_allowed_extensions(file_extensions);
pub fn extend_allowed_extensions(&mut self, file_extensions: &[&str]) {
for extension in file_extensions {
assert!(extension.starts_with('.'));
self.file_extensions.push(extension.to_string());
}
}
}

@ -1,48 +1,25 @@
use std::path::Path;
use std::time::SystemTime;
#[cfg(not(target_family = "unix"))]
use crate::common::normalize_windows_path;
use crate::common::regex_check;
use crate::common::Common;
use crate::common_messages::Messages;
#[cfg(target_family = "unix")]
pub const DEFAULT_EXCLUDED_DIRECTORIES: &[&str] = &["/proc", "/dev", "/sys", "/run", "/snap"];
#[cfg(not(target_family = "unix"))]
pub const DEFAULT_EXCLUDED_DIRECTORIES: &[&str] = &["C:\\Windows"];
#[cfg(target_family = "unix")]
pub const DEFAULT_EXCLUDED_ITEMS: &str = "*/.git/*,*/node_modules/*,*/lost+found/*,*/Trash/*,*/.Trash-*/*,*/snap/*,/home/*/.cache/*";
#[cfg(not(target_family = "unix"))]
pub const DEFAULT_EXCLUDED_ITEMS: &str = "*\\.git\\*,*\\node_modules\\*,*\\lost+found\\*,*:\\windows\\*,*:\\$RECYCLE.BIN\\*,*:\\$SysReset\\*,*:\\System Volume Information\\*,*:\\OneDriveTemp\\*,*:\\hiberfil.sys,*:\\pagefile.sys,*:\\swapfile.sys";
#[derive(Debug, Clone, Default)]
#[derive(Clone, Default)]
pub struct ExcludedItems {
expressions: Vec<String>,
connected_expressions: Vec<SingleExcludedItem>,
}
#[derive(Debug, Clone, Default)]
pub struct SingleExcludedItem {
pub expression: String,
pub expression_splits: Vec<String>,
pub unique_extensions_splits: Vec<String>,
pub items: Vec<String>,
}
impl ExcludedItems {
pub fn new() -> Self {
Default::default()
}
/// Setting excluded items which needs to contains * wildcard
/// Are a lot of slower than absolute path, so it should be used to heavy
pub fn set_excluded_items(&mut self, excluded_items: Vec<String>, text_messages: &mut Messages) {
let start_time: SystemTime = SystemTime::now();
pub fn new_from(excluded_items: Vec<String>) -> Self {
let mut s = Self::new();
s.set_excluded_items(excluded_items);
s
}
pub fn set_excluded_items(&mut self, excluded_items: Vec<String>) -> Messages {
let mut warnings: Vec<String> = Vec::new();
if excluded_items.is_empty() {
return Messages::new();
return;
}
let expressions: Vec<String> = excluded_items;
@ -59,60 +36,37 @@ impl ExcludedItems {
let expression = expression.replace("/", "\\");
if expression == "DEFAULT" {
checked_expressions.push(DEFAULT_EXCLUDED_ITEMS.to_string());
if cfg!(target_family = "unix") {
checked_expressions.push("*/.git/*,*/node_modules/*,*/lost+found/*,*/Trash/*,*/.Trash-*/*,*/snap/*,/home/*/.cache/*".to_string());
}
if cfg!(target_family = "windows") {
checked_expressions.push("*\\.git\\*,*\\node_modules\\*,*\\lost+found\\*,*:\\windows\\*".to_string());
}
continue;
}
if !expression.contains('*') {
warnings.push("Excluded Items Warning: Wildcard * is required in expression, ignoring ".to_string() + expression.as_str());
text_messages
.warnings
.push("Excluded Items Warning: Wildcard * is required in expression, ignoring ".to_string() + expression.as_str());
continue;
}
checked_expressions.push(expression);
}
for checked_expression in &checked_expressions {
let item = new_excluded_item(checked_expression);
self.expressions.push(item.expression.clone());
self.connected_expressions.push(item);
}
Messages {
messages: vec![],
warnings,
errors: vec![],
}
self.items = checked_expressions;
Common::print_time(start_time, SystemTime::now(), "set_excluded_items".to_string());
}
pub fn get_excluded_items(&self) -> &Vec<String> {
&self.expressions
}
pub fn is_excluded(&self, path: &Path) -> bool {
if self.connected_expressions.is_empty() {
return false;
}
/// Checks whether a specified path is excluded from searching
pub fn is_excluded(&self, path: impl AsRef<Path>) -> bool {
#[cfg(target_family = "windows")]
let path = normalize_windows_path(path);
let path_str = path.to_string_lossy();
let path = Common::normalize_windows_path(path);
for expression in &self.connected_expressions {
if regex_check(expression, &path_str) {
for expression in &self.items {
if Common::regex_check(expression, &path) {
return true;
}
}
false
}
}
pub fn new_excluded_item(expression: &str) -> SingleExcludedItem {
let expression = expression.trim().to_string();
let expression_splits: Vec<String> = expression.split('*').filter_map(|e| if e.is_empty() { None } else { Some(e.to_string()) }).collect();
let mut unique_extensions_splits = expression_splits.clone();
unique_extensions_splits.sort();
unique_extensions_splits.dedup();
unique_extensions_splits.sort_by_key(|b| std::cmp::Reverse(b.len()));
SingleExcludedItem {
expression,
expression_splits,
unique_extensions_splits,
}
}

@ -1,4 +1,4 @@
#[derive(Debug, Default, Clone)]
#[derive(Default)]
pub struct Messages {
pub messages: Vec<String>,
pub warnings: Vec<String>,
@ -9,21 +9,11 @@ impl Messages {
pub fn new() -> Self {
Default::default()
}
pub fn new_from_errors(errors: Vec<String>) -> Self {
Messages { errors, ..Default::default() }
}
pub fn new_from_warnings(warnings: Vec<String>) -> Self {
Messages { warnings, ..Default::default() }
}
pub fn new_from_messages(messages: Vec<String>) -> Self {
Messages { messages, ..Default::default() }
}
pub fn print_messages(&self) {
println!("{}", self.create_messages_text());
}
pub fn create_messages_text(&self) -> String {
let mut text_to_return: String = String::new();
let mut text_to_return: String = "".to_string();
if !self.messages.is_empty() {
text_to_return += "-------------------------------MESSAGES--------------------------------\n";
@ -56,17 +46,4 @@ impl Messages {
text_to_return
}
pub fn extend_messages_with(&mut self, messages: Vec<String>, warnings: Vec<String>, errors: Vec<String>) {
self.messages.extend(messages);
self.warnings.extend(warnings);
self.errors.extend(errors);
}
pub fn extend_with_another_messages(&mut self, messages: Messages) {
let (messages, warnings, errors) = (messages.messages, messages.warnings, messages.errors);
self.messages.extend(messages);
self.warnings.extend(warnings);
self.errors.extend(errors);
}
}

@ -1,213 +0,0 @@
use std::path::PathBuf;
use crate::common_dir_traversal::ToolType;
use crate::common_directory::Directories;
use crate::common_extensions::Extensions;
use crate::common_items::ExcludedItems;
use crate::common_messages::Messages;
#[derive(Debug, Clone, Default)]
pub struct CommonToolData {
pub(crate) tool_type: ToolType,
pub(crate) text_messages: Messages,
pub(crate) directories: Directories,
pub(crate) extensions: Extensions,
pub(crate) excluded_items: ExcludedItems,
pub(crate) recursive_search: bool,
pub(crate) delete_method: DeleteMethod,
pub(crate) maximal_file_size: u64,
pub(crate) minimal_file_size: u64,
pub(crate) stopped_search: bool,
pub(crate) use_cache: bool,
pub(crate) delete_outdated_cache: bool,
pub(crate) save_also_as_json: bool,
pub(crate) use_reference_folders: bool,
pub(crate) dry_run: bool,
}
#[derive(Eq, PartialEq, Clone, Debug, Copy, Default)]
pub enum DeleteMethod {
#[default]
None,
Delete, // Just delete items
AllExceptNewest,
AllExceptOldest,
OneOldest,
OneNewest,
HardLink,
}
impl CommonToolData {
pub fn new(tool_type: ToolType) -> Self {
Self {
tool_type,
text_messages: Messages::new(),
directories: Directories::new(),
extensions: Extensions::new(),
excluded_items: ExcludedItems::new(),
recursive_search: true,
delete_method: DeleteMethod::None,
maximal_file_size: u64::MAX,
minimal_file_size: 8192,
stopped_search: false,
use_cache: true,
delete_outdated_cache: true,
save_also_as_json: false,
use_reference_folders: false,
dry_run: false,
}
}
}
pub trait CommonData {
fn get_cd(&self) -> &CommonToolData;
fn get_cd_mut(&mut self) -> &mut CommonToolData;
fn set_dry_run(&mut self, dry_run: bool) {
self.get_cd_mut().dry_run = dry_run;
}
fn get_dry_run(&self) -> bool {
self.get_cd().dry_run
}
fn set_use_cache(&mut self, use_cache: bool) {
self.get_cd_mut().use_cache = use_cache;
}
fn get_use_cache(&self) -> bool {
self.get_cd().use_cache
}
fn set_delete_outdated_cache(&mut self, delete_outdated_cache: bool) {
self.get_cd_mut().delete_outdated_cache = delete_outdated_cache;
}
fn get_delete_outdated_cache(&self) -> bool {
self.get_cd().delete_outdated_cache
}
fn get_stopped_search(&self) -> bool {
self.get_cd().stopped_search
}
fn set_stopped_search(&mut self, stopped_search: bool) {
self.get_cd_mut().stopped_search = stopped_search;
}
fn set_maximal_file_size(&mut self, maximal_file_size: u64) {
self.get_cd_mut().maximal_file_size = match maximal_file_size {
0 => 1,
t => t,
};
}
fn get_maximal_file_size(&self) -> u64 {
self.get_cd().maximal_file_size
}
fn set_minimal_file_size(&mut self, minimal_file_size: u64) {
self.get_cd_mut().minimal_file_size = match minimal_file_size {
0 => 1,
t => t,
};
}
fn get_minimal_file_size(&self) -> u64 {
self.get_cd().minimal_file_size
}
fn set_reference_directory(&mut self, reference_directory: Vec<PathBuf>) {
let messages = self.get_cd_mut().directories.set_reference_directory(&reference_directory);
self.get_cd_mut().text_messages.extend_with_another_messages(messages);
}
#[cfg(target_family = "unix")]
fn set_exclude_other_filesystems(&mut self, exclude_other_filesystems: bool) {
self.get_cd_mut().directories.set_exclude_other_filesystems(exclude_other_filesystems);
}
#[cfg(not(target_family = "unix"))]
fn set_exclude_other_filesystems(&mut self, _exclude_other_filesystems: bool) {}
fn get_text_messages(&self) -> &Messages {
&self.get_cd().text_messages
}
fn get_text_messages_mut(&mut self) -> &mut Messages {
&mut self.get_cd_mut().text_messages
}
fn set_save_also_as_json(&mut self, save_also_as_json: bool) {
self.get_cd_mut().save_also_as_json = save_also_as_json;
}
fn get_save_also_as_json(&self) -> bool {
self.get_cd().save_also_as_json
}
fn set_recursive_search(&mut self, recursive_search: bool) {
self.get_cd_mut().recursive_search = recursive_search;
}
fn get_recursive_search(&self) -> bool {
self.get_cd().recursive_search
}
fn set_use_reference_folders(&mut self, use_reference_folders: bool) {
self.get_cd_mut().use_reference_folders = use_reference_folders;
}
fn get_use_reference_folders(&self) -> bool {
self.get_cd().use_reference_folders
}
fn set_delete_method(&mut self, delete_method: DeleteMethod) {
self.get_cd_mut().delete_method = delete_method;
}
fn get_delete_method(&self) -> DeleteMethod {
self.get_cd().delete_method
}
fn set_included_directory(&mut self, included_directory: Vec<PathBuf>) {
let messages = self.get_cd_mut().directories.set_included_directory(included_directory);
self.get_cd_mut().text_messages.extend_with_another_messages(messages);
}
fn set_excluded_directory(&mut self, excluded_directory: Vec<PathBuf>) {
let messages = self.get_cd_mut().directories.set_excluded_directory(excluded_directory);
self.get_cd_mut().text_messages.extend_with_another_messages(messages);
}
fn set_allowed_extensions(&mut self, allowed_extensions: String) {
let messages = self.get_cd_mut().extensions.set_allowed_extensions(allowed_extensions);
self.get_cd_mut().text_messages.extend_with_another_messages(messages);
}
fn set_excluded_extensions(&mut self, excluded_extensions: String) {
let messages = self.get_cd_mut().extensions.set_excluded_extensions(excluded_extensions);
self.get_cd_mut().text_messages.extend_with_another_messages(messages);
}
fn set_excluded_items(&mut self, excluded_items: Vec<String>) {
let messages = self.get_cd_mut().excluded_items.set_excluded_items(excluded_items);
self.get_cd_mut().text_messages.extend_with_another_messages(messages);
}
fn prepare_items(&mut self) {
let recursive_search = self.get_cd().recursive_search;
// Optimizes directories and removes recursive calls
let messages = self.get_cd_mut().directories.optimize_directories(recursive_search);
self.get_cd_mut().text_messages.extend_with_another_messages(messages);
}
fn debug_print_common(&self) {
println!("---------------DEBUG PRINT COMMON---------------");
println!("Tool type: {:?}", self.get_cd().tool_type);
println!("Directories: {:?}", self.get_cd().directories);
println!("Extensions: {:?}", self.get_cd().extensions);
println!("Excluded items: {:?}", self.get_cd().excluded_items);
println!("Recursive search: {:?}", self.get_cd().recursive_search);
println!("Maximal file size: {:?}", self.get_cd().maximal_file_size);
println!("Minimal file size: {:?}", self.get_cd().minimal_file_size);
println!("Stopped search: {:?}", self.get_cd().stopped_search);
println!("Use cache: {:?}", self.get_cd().use_cache);
println!("Delete outdated cache: {:?}", self.get_cd().delete_outdated_cache);
println!("Save also as json: {:?}", self.get_cd().save_also_as_json);
println!("Delete method: {:?}", self.get_cd().delete_method);
println!("Use reference folders: {:?}", self.get_cd().use_reference_folders);
println!("Dry run: {:?}", self.get_cd().dry_run);
println!("---------------DEBUG PRINT MESSAGES---------------");
println!("Errors size - {}", self.get_cd().text_messages.errors.len());
println!("Warnings size - {}", self.get_cd().text_messages.warnings.len());
println!("Messages size - {}", self.get_cd().text_messages.messages.len());
}
}

@ -1,75 +1,11 @@
use std::fs::File;
use std::io::{BufWriter, Write};
use std::path::Path;
use fun_time::fun_time;
use serde::Serialize;
pub trait DebugPrint {
fn debug_print(&self);
}
pub trait PrintResults {
fn write_results<T: Write>(&self, writer: &mut T) -> std::io::Result<()>;
#[fun_time(message = "print_results_to_output", level = "debug")]
fn print_results_to_output(&self) {
let stdout = std::io::stdout();
let mut handle = stdout.lock();
self.write_results(&mut handle).unwrap();
handle.flush().unwrap();
}
#[fun_time(message = "print_results_to_file", level = "debug")]
fn print_results_to_file(&self, file_name: &str) -> std::io::Result<()> {
let file_name: String = match file_name {
"" => "results.txt".to_string(),
k => k.to_string(),
};
let file_handler = File::create(file_name)?;
let mut writer = BufWriter::new(file_handler);
self.write_results(&mut writer)?;
writer.flush()?;
Ok(())
}
fn save_results_to_file_as_json(&self, file_name: &str, pretty_print: bool) -> std::io::Result<()>;
fn save_results_to_file_as_json_internal<T: Serialize + std::fmt::Debug>(&self, file_name: &str, item_to_serialize: &T, pretty_print: bool) -> std::io::Result<()> {
if pretty_print {
self.save_results_to_file_as_json_pretty(file_name, item_to_serialize)
} else {
self.save_results_to_file_as_json_compact(file_name, item_to_serialize)
}
}
#[fun_time(message = "save_results_to_file_as_json_pretty", level = "debug")]
fn save_results_to_file_as_json_pretty<T: Serialize + std::fmt::Debug>(&self, file_name: &str, item_to_serialize: &T) -> std::io::Result<()> {
let file_handler = File::create(file_name)?;
let mut writer = BufWriter::new(file_handler);
serde_json::to_writer_pretty(&mut writer, item_to_serialize)?;
Ok(())
}
#[fun_time(message = "save_results_to_file_as_json_compact", level = "debug")]
fn save_results_to_file_as_json_compact<T: Serialize + std::fmt::Debug>(&self, file_name: &str, item_to_serialize: &T) -> std::io::Result<()> {
let file_handler = File::create(file_name)?;
let mut writer = BufWriter::new(file_handler);
serde_json::to_writer(&mut writer, item_to_serialize)?;
Ok(())
}
fn save_all_in_one(&self, file_name: &str) -> std::io::Result<()> {
self.save_results_to_file_as_json(&format!("{file_name}_pretty.json"), true)?;
self.save_results_to_file_as_json(&format!("{file_name}_compact.json"), false)?;
self.print_results_to_file(&format!("{file_name}.txt"))?;
Ok(())
}
pub trait SaveResults {
fn save_results_to_file(&mut self, file_name: &str) -> bool;
}
pub trait ResultEntry {
fn get_path(&self) -> &Path;
fn get_modified_date(&self) -> u64;
fn get_size(&self) -> u64;
pub trait PrintResults {
fn print_results(&self);
}

File diff suppressed because it is too large Load Diff

@ -1,98 +1,175 @@
use std::fs;
use std::fs::File;
use std::io::prelude::*;
use std::io::BufWriter;
use std::path::PathBuf;
use std::time::SystemTime;
use crossbeam_channel::{Receiver, Sender};
use fun_time::fun_time;
use log::debug;
use crossbeam_channel::Receiver;
use crate::common_dir_traversal::{DirTraversalBuilder, DirTraversalResult, FileEntry, ProgressData, ToolType};
use crate::common_tool::{CommonData, CommonToolData, DeleteMethod};
use crate::common::Common;
use crate::common_dir_traversal::{DirTraversalBuilder, DirTraversalResult, FileEntry, ProgressData};
use crate::common_directory::Directories;
use crate::common_extensions::Extensions;
use crate::common_items::ExcludedItems;
use crate::common_messages::Messages;
use crate::common_traits::*;
#[derive(Eq, PartialEq, Clone, Debug)]
pub enum DeleteMethod {
None,
Delete,
}
/// Info struck with helpful information's about results
#[derive(Default)]
pub struct Info {
pub number_of_empty_files: usize,
}
impl Info {
pub fn new() -> Self {
Default::default()
}
}
/// Struct with required information's to work
pub struct EmptyFiles {
common_data: CommonToolData,
text_messages: Messages,
information: Info,
empty_files: Vec<FileEntry>,
}
impl CommonData for EmptyFiles {
fn get_cd(&self) -> &CommonToolData {
&self.common_data
}
fn get_cd_mut(&mut self) -> &mut CommonToolData {
&mut self.common_data
}
directories: Directories,
allowed_extensions: Extensions,
excluded_items: ExcludedItems,
recursive_search: bool,
delete_method: DeleteMethod,
stopped_search: bool,
}
impl EmptyFiles {
pub fn new() -> Self {
Self {
common_data: CommonToolData::new(ToolType::EmptyFiles),
information: Info::default(),
text_messages: Messages::new(),
information: Info::new(),
recursive_search: true,
allowed_extensions: Extensions::new(),
directories: Directories::new(),
excluded_items: ExcludedItems::new(),
empty_files: vec![],
delete_method: DeleteMethod::None,
stopped_search: false,
}
}
#[fun_time(message = "find_empty_files", level = "info")]
pub fn find_empty_files(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&Sender<ProgressData>>) {
self.prepare_items();
/// Finding empty files, save results to internal struct variables
pub fn find_empty_files(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&futures::channel::mpsc::UnboundedSender<ProgressData>>) {
self.directories.optimize_directories(self.recursive_search, &mut self.text_messages);
if !self.check_files(stop_receiver, progress_sender) {
self.common_data.stopped_search = true;
self.stopped_search = true;
return;
}
self.delete_files();
self.debug_print();
}
#[fun_time(message = "check_files", level = "debug")]
fn check_files(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&Sender<ProgressData>>) -> bool {
pub fn get_stopped_search(&self) -> bool {
self.stopped_search
}
pub const fn get_empty_files(&self) -> &Vec<FileEntry> {
&self.empty_files
}
pub const fn get_text_messages(&self) -> &Messages {
&self.text_messages
}
pub const fn get_information(&self) -> &Info {
&self.information
}
pub fn set_delete_method(&mut self, delete_method: DeleteMethod) {
self.delete_method = delete_method;
}
pub fn set_recursive_search(&mut self, recursive_search: bool) {
self.recursive_search = recursive_search;
}
#[cfg(target_family = "unix")]
pub fn set_exclude_other_filesystems(&mut self, exclude_other_filesystems: bool) {
self.directories.set_exclude_other_filesystems(exclude_other_filesystems);
}
pub fn set_included_directory(&mut self, included_directory: Vec<PathBuf>) -> bool {
self.directories.set_included_directory(included_directory, &mut self.text_messages)
}
pub fn set_excluded_directory(&mut self, excluded_directory: Vec<PathBuf>) {
self.directories.set_excluded_directory(excluded_directory, &mut self.text_messages);
}
pub fn set_allowed_extensions(&mut self, allowed_extensions: String) {
self.allowed_extensions.set_allowed_extensions(allowed_extensions, &mut self.text_messages);
}
pub fn set_excluded_items(&mut self, excluded_items: Vec<String>) {
self.excluded_items.set_excluded_items(excluded_items, &mut self.text_messages);
}
/// Check files for any with size == 0
fn check_files(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&futures::channel::mpsc::UnboundedSender<ProgressData>>) -> bool {
let result = DirTraversalBuilder::new()
.common_data(&self.common_data)
.root_dirs(self.directories.included_directories.clone())
.group_by(|_fe| ())
.stop_receiver(stop_receiver)
.progress_sender(progress_sender)
.minimal_file_size(0)
.maximal_file_size(0)
.directories(self.directories.clone())
.allowed_extensions(self.allowed_extensions.clone())
.excluded_items(self.excluded_items.clone())
.recursive_search(self.recursive_search)
.build()
.run();
match result {
DirTraversalResult::SuccessFiles { grouped_file_entries, warnings } => {
self.empty_files = grouped_file_entries.into_values().flatten().collect();
DirTraversalResult::SuccessFiles {
start_time,
grouped_file_entries,
warnings,
} => {
if let Some(empty_files) = grouped_file_entries.get(&()) {
self.empty_files = empty_files.clone();
}
self.information.number_of_empty_files = self.empty_files.len();
self.common_data.text_messages.warnings.extend(warnings);
debug!("Found {} empty files.", self.information.number_of_empty_files);
self.text_messages.warnings.extend(warnings);
Common::print_time(start_time, SystemTime::now(), "check_files_name".to_string());
true
}
DirTraversalResult::SuccessFolders { .. } => {
unreachable!()
}
DirTraversalResult::Stopped => false,
}
}
#[fun_time(message = "delete_files", level = "debug")]
/// Function to delete files, from filed Vector
fn delete_files(&mut self) {
match self.common_data.delete_method {
let start_time: SystemTime = SystemTime::now();
match self.delete_method {
DeleteMethod::Delete => {
for file_entry in &self.empty_files {
if fs::remove_file(&file_entry.path).is_err() {
self.common_data.text_messages.warnings.push(file_entry.path.to_string_lossy().to_string());
if fs::remove_file(file_entry.path.clone()).is_err() {
self.text_messages.warnings.push(file_entry.path.display().to_string());
}
}
}
DeleteMethod::None => {
//Just do nothing
}
_ => {
unreachable!()
}
}
Common::print_time(start_time, SystemTime::now(), "delete_files".to_string());
}
}
@ -103,50 +180,84 @@ impl Default for EmptyFiles {
}
impl DebugPrint for EmptyFiles {
#[allow(dead_code)]
#[allow(unreachable_code)]
/// Debugging printing - only available on debug build
fn debug_print(&self) {
if !cfg!(debug_assertions) {
#[cfg(not(debug_assertions))]
{
return;
}
println!("---------------DEBUG PRINT---------------");
println!("### Information's");
println!("Errors size - {}", self.text_messages.errors.len());
println!("Warnings size - {}", self.text_messages.warnings.len());
println!("Messages size - {}", self.text_messages.messages.len());
println!("### Other");
println!("Empty list size - {}", self.empty_files.len());
self.debug_print_common();
println!("Excluded items - {:?}", self.excluded_items.items);
println!("Included directories - {:?}", self.directories.included_directories);
println!("Excluded directories - {:?}", self.directories.excluded_directories);
println!("Recursive search - {}", self.recursive_search);
#[cfg(target_family = "unix")]
println!("Skip other filesystmes - {}", self.directories.exclude_other_filesystems());
println!("Delete Method - {:?}", self.delete_method);
println!("-----------------------------------------");
}
}
impl PrintResults for EmptyFiles {
fn write_results<T: Write>(&self, writer: &mut T) -> std::io::Result<()> {
writeln!(
impl SaveResults for EmptyFiles {
fn save_results_to_file(&mut self, file_name: &str) -> bool {
let start_time: SystemTime = SystemTime::now();
let file_name: String = match file_name {
"" => "results.txt".to_string(),
k => k.to_string(),
};
let file_handler = match File::create(&file_name) {
Ok(t) => t,
Err(e) => {
self.text_messages.errors.push(format!("Failed to create file {}, reason {}", file_name, e));
return false;
}
};
let mut writer = BufWriter::new(file_handler);
if let Err(e) = writeln!(
writer,
"Results of searching {:?} with excluded directories {:?} and excluded items {:?}",
self.common_data.directories.included_directories,
self.common_data.directories.excluded_directories,
self.common_data.excluded_items.get_excluded_items()
)?;
self.directories.included_directories, self.directories.excluded_directories, self.excluded_items.items
) {
self.text_messages.errors.push(format!("Failed to save results to file {}, reason {}", file_name, e));
return false;
}
if !self.empty_files.is_empty() {
writeln!(writer, "Found {} empty files.", self.information.number_of_empty_files)?;
for file_entry in &self.empty_files {
writeln!(writer, "{:?}", file_entry.path)?;
writeln!(writer, "Found {} empty files.", self.information.number_of_empty_files).unwrap();
for file_entry in self.empty_files.iter() {
writeln!(writer, "{}", file_entry.path.display()).unwrap();
}
} else {
write!(writer, "Not found any empty files.")?;
write!(writer, "Not found any empty files.").unwrap();
}
Ok(())
}
fn save_results_to_file_as_json(&self, file_name: &str, pretty_print: bool) -> std::io::Result<()> {
self.save_results_to_file_as_json_internal(file_name, &self.empty_files, pretty_print)
Common::print_time(start_time, SystemTime::now(), "save_results_to_file".to_string());
true
}
}
impl EmptyFiles {
pub const fn get_empty_files(&self) -> &Vec<FileEntry> {
&self.empty_files
}
impl PrintResults for EmptyFiles {
/// Print information's about duplicated entries
/// Only needed for CLI
fn print_results(&self) {
let start_time: SystemTime = SystemTime::now();
println!("Found {} empty files.\n", self.information.number_of_empty_files);
for file_entry in self.empty_files.iter() {
println!("{}", file_entry.path.display());
}
pub const fn get_information(&self) -> &Info {
&self.information
Common::print_time(start_time, SystemTime::now(), "print_entries".to_string());
}
}

@ -1,88 +1,106 @@
use std::collections::HashMap;
use std::collections::BTreeMap;
use std::fs;
use std::fs::DirEntry;
use std::io::Write;
use std::path::{Path, PathBuf};
use std::sync::atomic::Ordering;
use std::fs::File;
use std::io::{BufWriter, Write};
use std::path::PathBuf;
use std::time::SystemTime;
use crossbeam_channel::{Receiver, Sender};
use fun_time::fun_time;
use log::debug;
use rayon::prelude::*;
use crossbeam_channel::Receiver;
use crate::common::{check_if_stop_received, prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads};
use crate::common_dir_traversal::{common_get_entry_data, common_get_metadata_dir, common_read_dir, get_modified_time, CheckingMethod, ProgressData, ToolType};
use crate::common::Common;
use crate::common_dir_traversal::{Collect, DirTraversalBuilder, DirTraversalResult, FolderEmptiness, FolderEntry, ProgressData};
use crate::common_directory::Directories;
use crate::common_items::ExcludedItems;
use crate::common_tool::{CommonData, CommonToolData, DeleteMethod};
use crate::common_traits::{DebugPrint, PrintResults};
#[derive(Clone, Debug)]
pub struct FolderEntry {
pub path: PathBuf,
pub(crate) parent_path: Option<String>,
// Usable only when finding
pub(crate) is_empty: FolderEmptiness,
pub modified_date: u64,
}
impl FolderEntry {
pub fn get_modified_date(&self) -> u64 {
self.modified_date
}
}
use crate::common_messages::Messages;
use crate::common_traits::{DebugPrint, PrintResults, SaveResults};
/// Struct to store most basics info about all folder
pub struct EmptyFolder {
common_data: CommonToolData,
information: Info,
empty_folder_list: HashMap<String, FolderEntry>, // Path, FolderEntry
}
/// Enum with values which show if folder is empty.
/// In function "`optimize_folders`" automatically "Maybe" is changed to "Yes", so it is not necessary to put it here
#[derive(Eq, PartialEq, Copy, Clone, Debug)]
pub(crate) enum FolderEmptiness {
No,
Maybe,
delete_folders: bool,
text_messages: Messages,
excluded_items: ExcludedItems,
empty_folder_list: BTreeMap<PathBuf, FolderEntry>, // Path, FolderEntry
directories: Directories,
stopped_search: bool,
}
/// Info struck with helpful information's about results
#[derive(Default)]
pub struct Info {
pub number_of_empty_folders: usize,
}
impl Info {
pub fn new() -> Self {
Default::default()
}
}
/// Method implementation for EmptyFolder
impl EmptyFolder {
/// New function providing basics values
pub fn new() -> Self {
Self {
common_data: CommonToolData::new(ToolType::EmptyFolders),
information: Default::default(),
delete_folders: false,
text_messages: Messages::new(),
excluded_items: Default::default(),
empty_folder_list: Default::default(),
directories: Directories::new(),
stopped_search: false,
}
}
pub const fn get_empty_folder_list(&self) -> &HashMap<String, FolderEntry> {
pub fn get_stopped_search(&self) -> bool {
self.stopped_search
}
pub const fn get_empty_folder_list(&self) -> &BTreeMap<PathBuf, FolderEntry> {
&self.empty_folder_list
}
pub const fn get_text_messages(&self) -> &Messages {
&self.text_messages
}
pub const fn get_information(&self) -> &Info {
&self.information
}
#[fun_time(message = "find_empty_folders", level = "info")]
pub fn find_empty_folders(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&Sender<ProgressData>>) {
self.prepare_items();
#[cfg(target_family = "unix")]
pub fn set_exclude_other_filesystems(&mut self, exclude_other_filesystems: bool) {
self.directories.set_exclude_other_filesystems(exclude_other_filesystems);
}
pub fn set_excluded_items(&mut self, excluded_items: Vec<String>) {
self.excluded_items.set_excluded_items(excluded_items, &mut self.text_messages);
}
pub fn set_excluded_directory(&mut self, excluded_directory: Vec<PathBuf>) {
self.directories.set_excluded_directory(excluded_directory, &mut self.text_messages);
}
/// Public function used by CLI to search for empty folders
pub fn find_empty_folders(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&futures::channel::mpsc::UnboundedSender<ProgressData>>) {
self.directories.optimize_directories(true, &mut self.text_messages);
if !self.check_for_empty_folders(stop_receiver, progress_sender) {
self.common_data.stopped_search = true;
self.stopped_search = true;
return;
}
self.optimize_folders();
self.delete_files();
if self.delete_folders {
self.delete_empty_folders();
}
self.debug_print();
}
pub fn set_delete_folder(&mut self, delete_folder: bool) {
self.delete_folders = delete_folder;
}
/// Clean directory tree
/// If directory contains only 2 empty folders, then this directory should be removed instead two empty folders inside because it will produce another empty folder.
fn optimize_folders(&mut self) {
let mut new_directory_folders: HashMap<String, FolderEntry> = Default::default();
let mut new_directory_folders: BTreeMap<PathBuf, FolderEntry> = Default::default();
for (name, folder_entry) in &self.empty_folder_list {
match &folder_entry.parent_path {
@ -100,210 +118,63 @@ impl EmptyFolder {
self.information.number_of_empty_folders = self.empty_folder_list.len();
}
#[fun_time(message = "check_for_empty_folders", level = "debug")]
fn check_for_empty_folders(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&Sender<ProgressData>>) -> bool {
let mut folders_to_check: Vec<PathBuf> = self.common_data.directories.included_directories.clone();
let (progress_thread_handle, progress_thread_run, atomic_counter, _check_was_stopped) =
prepare_thread_handler_common(progress_sender, 0, 0, 0, CheckingMethod::None, self.common_data.tool_type);
let excluded_items = self.common_data.excluded_items.clone();
let directories = self.common_data.directories.clone();
let mut non_empty_folders: Vec<String> = vec![];
let mut start_folder_entries = Vec::with_capacity(folders_to_check.len());
let mut new_folder_entries_list = Vec::new();
for dir in &folders_to_check {
start_folder_entries.push(FolderEntry {
path: dir.clone(),
parent_path: None,
is_empty: FolderEmptiness::Maybe,
modified_date: 0,
});
}
while !folders_to_check.is_empty() {
if check_if_stop_received(stop_receiver) {
send_info_and_wait_for_ending_all_threads(&progress_thread_run, progress_thread_handle);
return false;
/// Function to check if folder are empty.
/// Parameter initial_checking for second check before deleting to be sure that checked folder is still empty
fn check_for_empty_folders(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&futures::channel::mpsc::UnboundedSender<ProgressData>>) -> bool {
let result = DirTraversalBuilder::new()
.root_dirs(self.directories.included_directories.clone())
.group_by(|_fe| ())
.stop_receiver(stop_receiver)
.progress_sender(progress_sender)
.directories(self.directories.clone())
.excluded_items(self.excluded_items.clone())
.collect(Collect::EmptyFolders)
.max_stage(0)
.build()
.run();
match result {
DirTraversalResult::SuccessFiles { .. } => {
unreachable!()
}
let segments: Vec<_> = folders_to_check
.into_par_iter()
.map(|current_folder| {
let mut dir_result = vec![];
let mut warnings = vec![];
let mut non_empty_folder = None;
let mut folder_entries_list = vec![];
let current_folder_as_string = current_folder.to_string_lossy().to_string();
let Some(read_dir) = common_read_dir(&current_folder, &mut warnings) else {
return (dir_result, warnings, Some(current_folder_as_string), folder_entries_list);
};
let mut counter = 0;
// Check every sub folder/file/link etc.
for entry in read_dir {
let Some(entry_data) = common_get_entry_data(&entry, &mut warnings, &current_folder) else {
continue;
};
let Ok(file_type) = entry_data.file_type() else { continue };
if file_type.is_dir() {
counter += 1;
Self::process_dir_in_dir_mode(
&current_folder,
&current_folder_as_string,
entry_data,
&directories,
&mut dir_result,
&mut warnings,
&excluded_items,
&mut non_empty_folder,
&mut folder_entries_list,
);
} else {
if non_empty_folder.is_none() {
non_empty_folder = Some(current_folder_as_string.clone());
}
}
}
if counter > 0 {
// Increase counter in batch, because usually it may be slow to add multiple times atomic value
atomic_counter.fetch_add(counter, Ordering::Relaxed);
DirTraversalResult::SuccessFolders {
start_time,
folder_entries,
warnings,
} => {
// We need to set empty folder list
#[allow(unused_mut)] // Used is later by Windows build
for (mut name, folder_entry) in folder_entries {
if folder_entry.is_empty != FolderEmptiness::No {
self.empty_folder_list.insert(name, folder_entry);
}
(dir_result, warnings, non_empty_folder, folder_entries_list)
})
.collect();
let required_size = segments.iter().map(|(segment, _, _, _)| segment.len()).sum::<usize>();
folders_to_check = Vec::with_capacity(required_size);
// Process collected data
for (segment, warnings, non_empty_folder, fe_list) in segments {
folders_to_check.extend(segment);
if !warnings.is_empty() {
self.common_data.text_messages.warnings.extend(warnings);
}
if let Some(non_empty_folder) = non_empty_folder {
non_empty_folders.push(non_empty_folder);
}
new_folder_entries_list.push(fe_list);
}
}
let mut folder_entries: HashMap<String, FolderEntry> = HashMap::with_capacity(start_folder_entries.len() + new_folder_entries_list.iter().map(Vec::len).sum::<usize>());
for fe in start_folder_entries {
folder_entries.insert(fe.path.to_string_lossy().to_string(), fe);
}
for fe_list in new_folder_entries_list {
for fe in fe_list {
folder_entries.insert(fe.path.to_string_lossy().to_string(), fe);
}
}
// Start to
for current_folder in non_empty_folders.into_iter().rev() {
Self::set_as_not_empty_folder(&mut folder_entries, &current_folder);
}
self.text_messages.warnings.extend(warnings);
for (name, folder_entry) in folder_entries {
if folder_entry.is_empty != FolderEmptiness::No {
self.empty_folder_list.insert(name, folder_entry);
Common::print_time(start_time, SystemTime::now(), "check_for_empty_folder".to_string());
true
}
DirTraversalResult::Stopped => false,
}
debug!("Found {} empty folders.", self.empty_folder_list.len());
send_info_and_wait_for_ending_all_threads(&progress_thread_run, progress_thread_handle);
true
}
pub(crate) fn set_as_not_empty_folder(folder_entries: &mut HashMap<String, FolderEntry>, current_folder: &str) {
let mut d = folder_entries.get_mut(current_folder).unwrap();
if d.is_empty == FolderEmptiness::No {
return; // Already set as non empty by one of his child
/// Deletes earlier found empty folders
fn delete_empty_folders(&mut self) {
let start_time: SystemTime = SystemTime::now();
// Folders may be deleted or require too big privileges
for name in self.empty_folder_list.keys() {
match fs::remove_dir_all(name) {
Ok(_) => (),
Err(e) => self.text_messages.warnings.push(format!("Failed to remove folder {}, reason {}", name.display(), e)),
};
}
// Loop to recursively set as non empty this and all his parent folders
loop {
d.is_empty = FolderEmptiness::No;
if d.parent_path.is_some() {
let cf = d.parent_path.clone().unwrap();
d = folder_entries.get_mut(&cf).unwrap();
if d.is_empty == FolderEmptiness::No {
break; // Already set as non empty, so one of child already set it to non empty
}
} else {
break;
}
}
Common::print_time(start_time, SystemTime::now(), "delete_files".to_string());
}
fn process_dir_in_dir_mode(
current_folder: &Path,
current_folder_as_str: &str,
entry_data: &DirEntry,
directories: &Directories,
dir_result: &mut Vec<PathBuf>,
warnings: &mut Vec<String>,
excluded_items: &ExcludedItems,
non_empty_folder: &mut Option<String>,
folder_entries_list: &mut Vec<FolderEntry>,
) {
let next_folder = entry_data.path();
if excluded_items.is_excluded(&next_folder) || directories.is_excluded(&next_folder) {
if non_empty_folder.is_none() {
*non_empty_folder = Some(current_folder_as_str.to_string());
}
return;
}
#[cfg(target_family = "unix")]
if directories.exclude_other_filesystems() {
match directories.is_on_other_filesystems(&next_folder) {
Ok(true) => return,
Err(e) => warnings.push(e),
_ => (),
}
}
let Some(metadata) = common_get_metadata_dir(entry_data, warnings, &next_folder) else {
if non_empty_folder.is_none() {
*non_empty_folder = Some(current_folder_as_str.to_string());
}
return;
};
dir_result.push(next_folder.clone());
folder_entries_list.push(FolderEntry {
path: next_folder,
parent_path: Some(current_folder_as_str.to_string()),
is_empty: FolderEmptiness::Maybe,
modified_date: get_modified_time(&metadata, warnings, current_folder, true),
});
}
#[fun_time(message = "delete_files", level = "debug")]
fn delete_files(&mut self) {
if self.get_delete_method() == DeleteMethod::None {
return;
}
let folders_to_remove = self.empty_folder_list.keys().collect::<Vec<_>>();
let errors: Vec<_> = folders_to_remove
.into_par_iter()
.filter_map(|name| {
if let Err(e) = fs::remove_dir_all(name) {
Some(format!("Failed to remove folder {name:?}, reason {e}"))
} else {
None
}
})
.collect();
self.get_text_messages_mut().errors.extend(errors);
/// Set included dir which needs to be relative, exists etc.
pub fn set_included_directory(&mut self, included_directory: Vec<PathBuf>) {
self.directories.set_included_directory(included_directory, &mut self.text_messages);
}
}
@ -314,45 +185,72 @@ impl Default for EmptyFolder {
}
impl DebugPrint for EmptyFolder {
#[allow(dead_code)]
#[allow(unreachable_code)]
fn debug_print(&self) {
if !cfg!(debug_assertions) {
#[cfg(not(debug_assertions))]
{
return;
}
println!("---------------DEBUG PRINT---------------");
println!("Number of empty folders - {}", self.information.number_of_empty_folders);
self.debug_print_common();
println!("Included directories - {:?}", self.directories.included_directories);
println!("-----------------------------------------");
}
}
impl PrintResults for EmptyFolder {
fn write_results<T: Write>(&self, writer: &mut T) -> std::io::Result<()> {
impl SaveResults for EmptyFolder {
fn save_results_to_file(&mut self, file_name: &str) -> bool {
let start_time: SystemTime = SystemTime::now();
let file_name: String = match file_name {
"" => "results.txt".to_string(),
k => k.to_string(),
};
let file_handler = match File::create(&file_name) {
Ok(t) => t,
Err(e) => {
self.text_messages.errors.push(format!("Failed to create file {}, reason {}", file_name, e));
return false;
}
};
let mut writer = BufWriter::new(file_handler);
if let Err(e) = writeln!(
writer,
"Results of searching {:?} with excluded directories {:?}",
self.directories.included_directories, self.directories.excluded_directories
) {
self.text_messages.errors.push(format!("Failed to save results to file {}, reason {}", file_name, e));
return false;
}
if !self.empty_folder_list.is_empty() {
writeln!(writer, "--------------------------Empty folder list--------------------------")?;
writeln!(writer, "Found {} empty folders", self.information.number_of_empty_folders)?;
let mut empty_folder_list = self.empty_folder_list.keys().collect::<Vec<_>>();
empty_folder_list.par_sort_unstable();
for name in empty_folder_list {
writeln!(writer, "{name}")?;
writeln!(
writer,
"-------------------------------------------------Empty folder list-------------------------------------------------"
)
.unwrap();
writeln!(writer, "Found {} empty folders", self.information.number_of_empty_folders).unwrap();
for name in self.empty_folder_list.keys() {
writeln!(writer, "{}", name.display()).unwrap();
}
} else {
write!(writer, "Not found any empty folders.")?;
write!(writer, "Not found any empty folders.").unwrap();
}
Ok(())
}
fn save_results_to_file_as_json(&self, file_name: &str, pretty_print: bool) -> std::io::Result<()> {
self.save_results_to_file_as_json_internal(file_name, &self.empty_folder_list.keys().collect::<Vec<_>>(), pretty_print)
Common::print_time(start_time, SystemTime::now(), "save_results_to_file".to_string());
true
}
}
impl CommonData for EmptyFolder {
fn get_cd(&self) -> &CommonToolData {
&self.common_data
}
fn get_cd_mut(&mut self) -> &mut CommonToolData {
&mut self.common_data
impl PrintResults for EmptyFolder {
fn print_results(&self) {
if !self.empty_folder_list.is_empty() {
println!("Found {} empty folders", self.empty_folder_list.len());
}
for name in self.empty_folder_list.keys() {
println!("{}", name.display());
}
}
}

@ -1,171 +1,171 @@
use std::fs;
use std::fs::File;
use std::io::prelude::*;
use std::path::{Path, PathBuf};
use std::io::BufWriter;
use std::path::PathBuf;
use std::time::SystemTime;
use crossbeam_channel::{Receiver, Sender};
use fun_time::fun_time;
use log::debug;
use serde::{Deserialize, Serialize};
use crossbeam_channel::Receiver;
use crate::common_dir_traversal::{Collect, DirTraversalBuilder, DirTraversalResult, ErrorType, FileEntry, ProgressData, ToolType};
use crate::common_tool::{CommonData, CommonToolData, DeleteMethod};
use crate::common::Common;
use crate::common_dir_traversal::{Collect, DirTraversalBuilder, DirTraversalResult, ErrorType, FileEntry, ProgressData};
use crate::common_directory::Directories;
use crate::common_extensions::Extensions;
use crate::common_items::ExcludedItems;
use crate::common_messages::Messages;
use crate::common_traits::*;
#[derive(Eq, PartialEq, Clone, Debug)]
pub enum DeleteMethod {
None,
Delete,
}
/// Info struck with helpful information's about results
#[derive(Default)]
pub struct Info {
pub number_of_invalid_symlinks: usize,
}
const MAX_NUMBER_OF_SYMLINK_JUMPS: i32 = 20;
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
pub struct SymlinkInfo {
pub destination_path: PathBuf,
pub type_of_error: ErrorType,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SymlinksFileEntry {
pub path: PathBuf,
pub size: u64,
pub modified_date: u64,
pub symlink_info: SymlinkInfo,
}
impl ResultEntry for SymlinksFileEntry {
fn get_path(&self) -> &Path {
&self.path
}
fn get_modified_date(&self) -> u64 {
self.modified_date
}
fn get_size(&self) -> u64 {
self.size
}
}
impl FileEntry {
fn into_symlinks_entry(self, symlink_info: SymlinkInfo) -> SymlinksFileEntry {
SymlinksFileEntry {
size: self.size,
path: self.path,
modified_date: self.modified_date,
symlink_info,
}
impl Info {
pub fn new() -> Self {
Default::default()
}
}
/// Struct with required information's to work
pub struct InvalidSymlinks {
common_data: CommonToolData,
text_messages: Messages,
information: Info,
invalid_symlinks: Vec<SymlinksFileEntry>,
invalid_symlinks: Vec<FileEntry>,
directories: Directories,
allowed_extensions: Extensions,
excluded_items: ExcludedItems,
recursive_search: bool,
delete_method: DeleteMethod,
stopped_search: bool,
}
impl InvalidSymlinks {
pub fn new() -> Self {
Self {
common_data: CommonToolData::new(ToolType::InvalidSymlinks),
information: Info::default(),
text_messages: Messages::new(),
information: Info::new(),
recursive_search: true,
allowed_extensions: Extensions::new(),
directories: Directories::new(),
excluded_items: ExcludedItems::new(),
invalid_symlinks: vec![],
delete_method: DeleteMethod::None,
stopped_search: false,
}
}
#[fun_time(message = "find_invalid_links", level = "info")]
pub fn find_invalid_links(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&Sender<ProgressData>>) {
self.prepare_items();
pub fn find_invalid_links(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&futures::channel::mpsc::UnboundedSender<ProgressData>>) {
self.directories.optimize_directories(self.recursive_search, &mut self.text_messages);
if !self.check_files(stop_receiver, progress_sender) {
self.common_data.stopped_search = true;
self.stopped_search = true;
return;
}
self.delete_files();
self.debug_print();
}
#[fun_time(message = "check_files", level = "debug")]
fn check_files(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&Sender<ProgressData>>) -> bool {
pub fn get_stopped_search(&self) -> bool {
self.stopped_search
}
pub const fn get_invalid_symlinks(&self) -> &Vec<FileEntry> {
&self.invalid_symlinks
}
pub const fn get_text_messages(&self) -> &Messages {
&self.text_messages
}
pub const fn get_information(&self) -> &Info {
&self.information
}
pub fn set_delete_method(&mut self, delete_method: DeleteMethod) {
self.delete_method = delete_method;
}
pub fn set_recursive_search(&mut self, recursive_search: bool) {
self.recursive_search = recursive_search;
}
#[cfg(target_family = "unix")]
pub fn set_exclude_other_filesystems(&mut self, exclude_other_filesystems: bool) {
self.directories.set_exclude_other_filesystems(exclude_other_filesystems);
}
pub fn set_included_directory(&mut self, included_directory: Vec<PathBuf>) -> bool {
self.directories.set_included_directory(included_directory, &mut self.text_messages)
}
pub fn set_excluded_directory(&mut self, excluded_directory: Vec<PathBuf>) {
self.directories.set_excluded_directory(excluded_directory, &mut self.text_messages);
}
pub fn set_allowed_extensions(&mut self, allowed_extensions: String) {
self.allowed_extensions.set_allowed_extensions(allowed_extensions, &mut self.text_messages);
}
pub fn set_excluded_items(&mut self, excluded_items: Vec<String>) {
self.excluded_items.set_excluded_items(excluded_items, &mut self.text_messages);
}
/// Check files for any with size == 0
fn check_files(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&futures::channel::mpsc::UnboundedSender<ProgressData>>) -> bool {
let result = DirTraversalBuilder::new()
.common_data(&self.common_data)
.root_dirs(self.directories.included_directories.clone())
.group_by(|_fe| ())
.stop_receiver(stop_receiver)
.progress_sender(progress_sender)
.collect(Collect::InvalidSymlinks)
.directories(self.directories.clone())
.allowed_extensions(self.allowed_extensions.clone())
.excluded_items(self.excluded_items.clone())
.recursive_search(self.recursive_search)
.build()
.run();
match result {
DirTraversalResult::SuccessFiles { grouped_file_entries, warnings } => {
self.invalid_symlinks = grouped_file_entries
.into_values()
.flatten()
.filter_map(|e| {
let Some((destination_path, type_of_error)) = Self::check_invalid_symlinks(&e.path) else {
return None;
};
Some(e.into_symlinks_entry(SymlinkInfo { destination_path, type_of_error }))
})
.collect();
DirTraversalResult::SuccessFiles {
start_time,
grouped_file_entries,
warnings,
} => {
if let Some(((), invalid_symlinks)) = grouped_file_entries.into_iter().next() {
self.invalid_symlinks = invalid_symlinks;
}
self.information.number_of_invalid_symlinks = self.invalid_symlinks.len();
self.common_data.text_messages.warnings.extend(warnings);
debug!("Found {} invalid symlinks.", self.information.number_of_invalid_symlinks);
self.text_messages.warnings.extend(warnings);
Common::print_time(start_time, SystemTime::now(), "check_files_name".to_string());
true
}
DirTraversalResult::SuccessFolders { .. } => unreachable!(),
DirTraversalResult::Stopped => false,
}
}
fn check_invalid_symlinks(current_file_name: &Path) -> Option<(PathBuf, ErrorType)> {
let mut destination_path = PathBuf::new();
let type_of_error;
match current_file_name.read_link() {
Ok(t) => {
destination_path.push(t);
let mut number_of_loop = 0;
let mut current_path = current_file_name.to_path_buf();
loop {
if number_of_loop == 0 && !current_path.exists() {
type_of_error = ErrorType::NonExistentFile;
break;
}
if number_of_loop == MAX_NUMBER_OF_SYMLINK_JUMPS {
type_of_error = ErrorType::InfiniteRecursion;
break;
}
current_path = match current_path.read_link() {
Ok(t) => t,
Err(_inspected) => {
// Looks that some next symlinks are broken, but we do nothing with it - TODO why they are broken
return None;
}
};
number_of_loop += 1;
}
}
Err(_inspected) => {
// Failed to load info about it
type_of_error = ErrorType::NonExistentFile;
}
}
Some((destination_path, type_of_error))
}
#[fun_time(message = "delete_files", level = "debug")]
/// Function to delete files, from filed Vector
fn delete_files(&mut self) {
match self.common_data.delete_method {
let start_time: SystemTime = SystemTime::now();
match self.delete_method {
DeleteMethod::Delete => {
for file_entry in &self.invalid_symlinks {
if fs::remove_file(&file_entry.path).is_err() {
self.common_data.text_messages.warnings.push(file_entry.path.to_string_lossy().to_string());
if fs::remove_file(file_entry.path.clone()).is_err() {
self.text_messages.warnings.push(file_entry.path.display().to_string());
}
}
}
DeleteMethod::None => {
//Just do nothing
}
_ => unreachable!(),
}
Common::print_time(start_time, SystemTime::now(), "delete_files".to_string());
}
}
@ -176,60 +176,102 @@ impl Default for InvalidSymlinks {
}
impl DebugPrint for InvalidSymlinks {
#[allow(dead_code)]
#[allow(unreachable_code)]
/// Debugging printing - only available on debug build
fn debug_print(&self) {
if !cfg!(debug_assertions) {
#[cfg(not(debug_assertions))]
{
return;
}
println!("---------------DEBUG PRINT---------------");
println!("### Information's");
println!("Errors size - {}", self.text_messages.errors.len());
println!("Warnings size - {}", self.text_messages.warnings.len());
println!("Messages size - {}", self.text_messages.messages.len());
println!("### Other");
println!("Invalid symlinks list size - {}", self.invalid_symlinks.len());
self.debug_print_common();
println!("Excluded items - {:?}", self.excluded_items.items);
println!("Included directories - {:?}", self.directories.included_directories);
println!("Excluded directories - {:?}", self.directories.excluded_directories);
println!("Recursive search - {}", self.recursive_search);
#[cfg(target_family = "unix")]
println!("Skip other filesystmes - {}", self.directories.exclude_other_filesystems());
println!("Delete Method - {:?}", self.delete_method);
println!("-----------------------------------------");
}
}
impl PrintResults for InvalidSymlinks {
fn write_results<T: Write>(&self, writer: &mut T) -> std::io::Result<()> {
impl SaveResults for InvalidSymlinks {
fn save_results_to_file(&mut self, file_name: &str) -> bool {
let start_time: SystemTime = SystemTime::now();
let file_name: String = match file_name {
"" => "results.txt".to_string(),
k => k.to_string(),
};
let file_handler = match File::create(&file_name) {
Ok(t) => t,
Err(e) => {
self.text_messages.errors.push(format!("Failed to create file {}, reason {}", file_name, e));
return false;
}
};
let mut writer = BufWriter::new(file_handler);
if let Err(e) = writeln!(
writer,
"Results of searching {:?} with excluded directories {:?} and excluded items {:?}",
self.directories.included_directories, self.directories.excluded_directories, self.excluded_items.items
) {
self.text_messages.errors.push(format!("Failed to save results to file {}, reason {}", file_name, e));
return false;
}
if !self.invalid_symlinks.is_empty() {
writeln!(writer, "Found {} invalid symlinks.", self.information.number_of_invalid_symlinks)?;
for file_entry in &self.invalid_symlinks {
writeln!(writer, "Found {} invalid symlinks.", self.information.number_of_invalid_symlinks).unwrap();
for file_entry in self.invalid_symlinks.iter() {
writeln!(
writer,
"{:?}\t\t{:?}\t\t{}",
file_entry.path,
file_entry.symlink_info.destination_path,
match file_entry.symlink_info.type_of_error {
"{}\t\t{}\t\t{}",
file_entry.path.display(),
file_entry.symlink_info.clone().expect("invalid traversal result").destination_path.display(),
match file_entry.symlink_info.clone().expect("invalid traversal result").type_of_error {
ErrorType::InfiniteRecursion => "Infinite Recursion",
ErrorType::NonExistentFile => "Non Existent File",
}
)?;
)
.unwrap();
}
} else {
write!(writer, "Not found any invalid symlinks.")?;
write!(writer, "Not found any invalid symlinks.").unwrap();
}
Ok(())
}
fn save_results_to_file_as_json(&self, file_name: &str, pretty_print: bool) -> std::io::Result<()> {
self.save_results_to_file_as_json_internal(file_name, &self.invalid_symlinks, pretty_print)
Common::print_time(start_time, SystemTime::now(), "save_results_to_file".to_string());
true
}
}
impl CommonData for InvalidSymlinks {
fn get_cd(&self) -> &CommonToolData {
&self.common_data
}
fn get_cd_mut(&mut self) -> &mut CommonToolData {
&mut self.common_data
}
}
impl InvalidSymlinks {
pub const fn get_invalid_symlinks(&self) -> &Vec<SymlinksFileEntry> {
&self.invalid_symlinks
}
impl PrintResults for InvalidSymlinks {
/// Print information's about duplicated entries
/// Only needed for CLI
fn print_results(&self) {
let start_time: SystemTime = SystemTime::now();
println!("Found {} invalid symlinks.\n", self.information.number_of_invalid_symlinks);
for file_entry in self.invalid_symlinks.iter() {
println!(
"{}\t\t{}\t\t{}",
file_entry.path.display(),
file_entry.symlink_info.clone().expect("invalid traversal result").destination_path.display(),
match file_entry.symlink_info.clone().expect("invalid traversal result").type_of_error {
ErrorType::InfiniteRecursion => "Infinite Recursion",
ErrorType::NonExistentFile => "Non Existent File",
}
);
}
pub const fn get_information(&self) -> &Info {
&self.information
Common::print_time(start_time, SystemTime::now(), "print_entries".to_string());
}
}

@ -1,7 +1,6 @@
#![allow(clippy::collapsible_else_if)]
#![allow(clippy::type_complexity)]
#![allow(clippy::needless_late_init)]
#![allow(clippy::too_many_arguments)]
#[macro_use]
extern crate bitflags;
@ -19,13 +18,11 @@ pub mod temporary;
pub mod bad_extensions;
pub mod common;
pub mod common_cache;
pub mod common_dir_traversal;
pub mod common_directory;
pub mod common_extensions;
pub mod common_items;
pub mod common_messages;
pub mod common_tool;
pub mod common_traits;
pub mod localizer_core;

@ -1,7 +1,9 @@
use std::collections::HashMap;
use i18n_embed::fluent::{fluent_language_loader, FluentLanguageLoader};
use i18n_embed::{DefaultLocalizer, LanguageLoader, Localizer};
use i18n_embed::{
fluent::{fluent_language_loader, FluentLanguageLoader},
DefaultLocalizer, LanguageLoader, Localizer,
};
use once_cell::sync::Lazy;
use rust_embed::RustEmbed;
@ -29,7 +31,6 @@ macro_rules! flc {
}
// Get the `Localizer` to be used for localizing this library.
pub fn localizer_core() -> Box<dyn Localizer> {
Box::from(DefaultLocalizer::new(&*LANGUAGE_LOADER_CORE, &Localizations))
}
@ -45,7 +46,6 @@ pub fn generate_translation_hashmap(vec: Vec<(&'static str, String)>) -> HashMap
pub fn fnc_get_similarity_very_high() -> String {
flc!("core_similarity_very_high")
}
pub fn fnc_get_similarity_minimal() -> String {
flc!("core_similarity_minimal")
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -1,218 +1,350 @@
use std::fs;
use std::fs::DirEntry;
use std::fs::{File, Metadata};
use std::io::prelude::*;
use std::io::BufWriter;
use std::path::PathBuf;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
use std::sync::Arc;
use std::thread::sleep;
use std::time::{Duration, SystemTime, UNIX_EPOCH};
use std::{fs, thread};
use crossbeam_channel::{Receiver, Sender};
use fun_time::fun_time;
use crossbeam_channel::Receiver;
use rayon::prelude::*;
use serde::Serialize;
use crate::common::{check_folder_children, check_if_stop_received, prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads};
use crate::common_dir_traversal::{common_read_dir, get_modified_time, CheckingMethod, ProgressData, ToolType};
use crate::common_tool::{CommonData, CommonToolData, DeleteMethod};
use crate::common::{Common, LOOP_DURATION};
use crate::common_directory::Directories;
use crate::common_items::ExcludedItems;
use crate::common_messages::Messages;
use crate::common_traits::*;
use crate::flc;
use crate::localizer_core::generate_translation_hashmap;
#[derive(Debug)]
pub struct ProgressData {
pub current_stage: u8,
pub max_stage: u8,
pub files_checked: usize,
}
const TEMP_EXTENSIONS: &[&str] = &[
"#",
"thumbs.db",
".bak",
"~",
".tmp",
".temp",
".ds_store",
".crdownload",
".part",
".cache",
".dmp",
".download",
".partial",
];
#[derive(Clone, Serialize, Debug)]
pub struct TemporaryFileEntry {
pub path: PathBuf,
pub modified_date: u64,
#[derive(Eq, PartialEq, Clone, Debug)]
pub enum DeleteMethod {
None,
Delete,
}
impl TemporaryFileEntry {
pub fn get_path(&self) -> &PathBuf {
&self.path
}
pub fn get_modified_date(&self) -> u64 {
self.modified_date
}
#[derive(Clone)]
pub struct FileEntry {
pub path: PathBuf,
pub modified_date: u64,
}
/// Info struck with helpful information's about results
#[derive(Default)]
pub struct Info {
pub number_of_temporary_files: usize,
}
impl Info {
pub fn new() -> Self {
Default::default()
}
}
/// Struct with required information's to work
pub struct Temporary {
common_data: CommonToolData,
text_messages: Messages,
information: Info,
temporary_files: Vec<TemporaryFileEntry>,
temporary_files: Vec<FileEntry>,
directories: Directories,
excluded_items: ExcludedItems,
recursive_search: bool,
delete_method: DeleteMethod,
stopped_search: bool,
}
impl Temporary {
pub fn new() -> Self {
Self {
common_data: CommonToolData::new(ToolType::TemporaryFiles),
information: Info::default(),
text_messages: Messages::new(),
information: Info::new(),
recursive_search: true,
directories: Directories::new(),
excluded_items: ExcludedItems::new(),
delete_method: DeleteMethod::None,
temporary_files: vec![],
stopped_search: false,
}
}
#[fun_time(message = "find_temporary_files", level = "info")]
pub fn find_temporary_files(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&Sender<ProgressData>>) {
self.prepare_items();
/// Finding temporary files, save results to internal struct variables
pub fn find_temporary_files(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&futures::channel::mpsc::UnboundedSender<ProgressData>>) {
self.directories.optimize_directories(self.recursive_search, &mut self.text_messages);
if !self.check_files(stop_receiver, progress_sender) {
self.common_data.stopped_search = true;
self.stopped_search = true;
return;
}
self.delete_files();
self.debug_print();
}
pub fn get_stopped_search(&self) -> bool {
self.stopped_search
}
pub const fn get_temporary_files(&self) -> &Vec<FileEntry> {
&self.temporary_files
}
pub const fn get_text_messages(&self) -> &Messages {
&self.text_messages
}
pub const fn get_information(&self) -> &Info {
&self.information
}
pub fn set_delete_method(&mut self, delete_method: DeleteMethod) {
self.delete_method = delete_method;
}
pub fn set_recursive_search(&mut self, recursive_search: bool) {
self.recursive_search = recursive_search;
}
#[cfg(target_family = "unix")]
pub fn set_exclude_other_filesystems(&mut self, exclude_other_filesystems: bool) {
self.directories.set_exclude_other_filesystems(exclude_other_filesystems);
}
pub fn set_included_directory(&mut self, included_directory: Vec<PathBuf>) -> bool {
self.directories.set_included_directory(included_directory, &mut self.text_messages)
}
pub fn set_excluded_directory(&mut self, excluded_directory: Vec<PathBuf>) {
self.directories.set_excluded_directory(excluded_directory, &mut self.text_messages);
}
pub fn set_excluded_items(&mut self, excluded_items: Vec<String>) {
self.excluded_items.set_excluded_items(excluded_items, &mut self.text_messages);
}
#[fun_time(message = "check_files", level = "debug")]
fn check_files(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&Sender<ProgressData>>) -> bool {
let mut folders_to_check: Vec<PathBuf> = self.common_data.directories.included_directories.clone();
fn check_files(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&futures::channel::mpsc::UnboundedSender<ProgressData>>) -> bool {
let start_time: SystemTime = SystemTime::now();
let mut folders_to_check: Vec<PathBuf> = Vec::with_capacity(1024 * 2); // This should be small enough too not see to big difference and big enough to store most of paths without needing to resize vector
let (progress_thread_handle, progress_thread_run, atomic_counter, _check_was_stopped) =
prepare_thread_handler_common(progress_sender, 0, 0, 0, CheckingMethod::None, self.common_data.tool_type);
// Add root folders for finding
for id in &self.directories.included_directories {
folders_to_check.push(id.clone());
}
//// PROGRESS THREAD START
let progress_thread_run = Arc::new(AtomicBool::new(true));
let atomic_file_counter = Arc::new(AtomicUsize::new(0));
let progress_thread_handle = if let Some(progress_sender) = progress_sender {
let progress_send = progress_sender.clone();
let progress_thread_run = progress_thread_run.clone();
let atomic_file_counter = atomic_file_counter.clone();
thread::spawn(move || loop {
progress_send
.unbounded_send(ProgressData {
current_stage: 0,
max_stage: 0,
files_checked: atomic_file_counter.load(Ordering::Relaxed) as usize,
})
.unwrap();
if !progress_thread_run.load(Ordering::Relaxed) {
break;
}
sleep(Duration::from_millis(LOOP_DURATION as u64));
})
} else {
thread::spawn(|| {})
};
//// PROGRESS THREAD END
while !folders_to_check.is_empty() {
if check_if_stop_received(stop_receiver) {
send_info_and_wait_for_ending_all_threads(&progress_thread_run, progress_thread_handle);
if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {
// End thread which send info to gui
progress_thread_run.store(false, Ordering::Relaxed);
progress_thread_handle.join().unwrap();
return false;
}
let segments: Vec<_> = folders_to_check
.into_par_iter()
.par_iter()
.map(|current_folder| {
let mut dir_result = vec![];
let mut warnings = vec![];
let mut fe_result = vec![];
let Some(read_dir) = common_read_dir(&current_folder, &mut warnings) else {
return (dir_result, warnings, fe_result);
// Read current dir childrens
let read_dir = match fs::read_dir(&current_folder) {
Ok(t) => t,
Err(e) => {
warnings.push(flc!(
"core_cannot_open_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())])
));
return (dir_result, warnings, fe_result);
}
};
// Check every sub folder/file/link etc.
for entry in read_dir {
let Ok(entry_data) = entry else {
continue;
'dir: for entry in read_dir {
let entry_data = match entry {
Ok(t) => t,
Err(e) => {
warnings.push(flc!(
"core_cannot_read_entry_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())])
));
continue 'dir;
}
};
let Ok(file_type) = entry_data.file_type() else {
continue;
let metadata: Metadata = match entry_data.metadata() {
Ok(t) => t,
Err(e) => {
warnings.push(flc!(
"core_cannot_read_metadata_dir",
generate_translation_hashmap(vec![("dir", current_folder.display().to_string()), ("reason", e.to_string())])
));
continue 'dir;
}
};
if metadata.is_dir() {
if !self.recursive_search {
continue 'dir;
}
let next_folder = current_folder.join(entry_data.file_name());
if self.directories.is_excluded(&next_folder) {
continue 'dir;
}
if self.excluded_items.is_excluded(&next_folder) {
continue 'dir;
}
#[cfg(target_family = "unix")]
if self.directories.exclude_other_filesystems() {
match self.directories.is_on_other_filesystems(&next_folder) {
Ok(true) => continue 'dir,
Err(e) => warnings.push(e.to_string()),
_ => (),
}
}
if file_type.is_dir() {
check_folder_children(
&mut dir_result,
&mut warnings,
&entry_data,
self.common_data.recursive_search,
&self.common_data.directories,
&self.common_data.excluded_items,
);
} else if file_type.is_file() {
if let Some(file_entry) = self.get_file_entry(&atomic_counter, &entry_data, &mut warnings) {
fe_result.push(file_entry);
dir_result.push(next_folder);
} else if metadata.is_file() {
atomic_file_counter.fetch_add(1, Ordering::Relaxed);
let file_name_lowercase: String = match entry_data.file_name().into_string() {
Ok(t) => t,
Err(_inspected) => {
warnings.push(flc!(
"core_file_not_utf8_name",
generate_translation_hashmap(vec![("name", entry_data.path().display().to_string())])
));
continue 'dir;
}
}
.to_lowercase();
if ![
"#",
"thumbs.db",
".bak",
"~",
".tmp",
".temp",
".ds_store",
".crdownload",
".part",
".cache",
".dmp",
".download",
".partial",
]
.iter()
.any(|f| file_name_lowercase.ends_with(f))
{
continue 'dir;
}
let current_file_name = current_folder.join(entry_data.file_name());
if self.excluded_items.is_excluded(&current_file_name) {
continue 'dir;
}
// Creating new file entry
let fe: FileEntry = FileEntry {
path: current_file_name.clone(),
modified_date: match metadata.modified() {
Ok(t) => match t.duration_since(UNIX_EPOCH) {
Ok(d) => d.as_secs(),
Err(_inspected) => {
warnings.push(flc!(
"core_file_modified_before_epoch",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string())])
));
0
}
},
Err(e) => {
warnings.push(flc!(
"core_file_no_modification_date",
generate_translation_hashmap(vec![("name", current_file_name.display().to_string()), ("reason", e.to_string())])
));
0
} // Permissions Denied
},
};
fe_result.push(fe);
}
}
(dir_result, warnings, fe_result)
})
.collect();
let required_size = segments.iter().map(|(segment, _, _)| segment.len()).sum::<usize>();
folders_to_check = Vec::with_capacity(required_size);
// Advance the frontier
folders_to_check.clear();
// Process collected data
for (segment, warnings, fe_result) in segments {
folders_to_check.extend(segment);
self.common_data.text_messages.warnings.extend(warnings);
self.text_messages.warnings.extend(warnings);
for fe in fe_result {
self.temporary_files.push(fe);
}
}
}
send_info_and_wait_for_ending_all_threads(&progress_thread_run, progress_thread_handle);
// End thread which send info to gui
progress_thread_run.store(false, Ordering::Relaxed);
progress_thread_handle.join().unwrap();
self.information.number_of_temporary_files = self.temporary_files.len();
Common::print_time(start_time, SystemTime::now(), "check_files_size".to_string());
true
}
pub fn get_file_entry(&self, atomic_counter: &Arc<AtomicUsize>, entry_data: &DirEntry, warnings: &mut Vec<String>) -> Option<TemporaryFileEntry> {
atomic_counter.fetch_add(1, Ordering::Relaxed);
let current_file_name = entry_data.path();
if self.common_data.excluded_items.is_excluded(&current_file_name) {
return None;
}
let file_name = entry_data.file_name();
let file_name_ascii_lowercase = file_name.to_ascii_lowercase();
let file_name_lowercase = file_name_ascii_lowercase.to_string_lossy();
if !TEMP_EXTENSIONS.iter().any(|f| file_name_lowercase.ends_with(f)) {
return None;
}
let Ok(metadata) = entry_data.metadata() else {
return None;
};
// Creating new file entry
Some(TemporaryFileEntry {
modified_date: get_modified_time(&metadata, warnings, &current_file_name, false),
path: current_file_name,
})
}
#[fun_time(message = "delete_files", level = "debug")]
/// Function to delete files, from filed Vector
fn delete_files(&mut self) {
match self.common_data.delete_method {
let start_time: SystemTime = SystemTime::now();
match self.delete_method {
DeleteMethod::Delete => {
let mut warnings = Vec::new();
for file_entry in &self.temporary_files {
if fs::remove_file(file_entry.path.clone()).is_err() {
warnings.push(file_entry.path.to_string_lossy().to_string());
self.text_messages.warnings.push(file_entry.path.display().to_string());
}
}
self.common_data.text_messages.warnings.extend(warnings);
}
DeleteMethod::None => {
//Just do nothing
}
_ => unreachable!(),
}
}
}
impl PrintResults for Temporary {
fn write_results<T: Write>(&self, writer: &mut T) -> std::io::Result<()> {
writeln!(
writer,
"Results of searching {:?} with excluded directories {:?} and excluded items {:?}",
self.common_data.directories.included_directories,
self.common_data.directories.excluded_directories,
self.common_data.excluded_items.get_excluded_items()
)?;
writeln!(writer, "Found {} temporary files.\n", self.information.number_of_temporary_files)?;
for file_entry in &self.temporary_files {
writeln!(writer, "{:?}", file_entry.path)?;
}
Ok(())
}
fn save_results_to_file_as_json(&self, file_name: &str, pretty_print: bool) -> std::io::Result<()> {
self.save_results_to_file_as_json_internal(file_name, &self.temporary_files, pretty_print)
Common::print_time(start_time, SystemTime::now(), "delete_files".to_string());
}
}
@ -223,31 +355,81 @@ impl Default for Temporary {
}
impl DebugPrint for Temporary {
#[allow(dead_code)]
#[allow(unreachable_code)]
fn debug_print(&self) {
if !cfg!(debug_assertions) {
#[cfg(not(debug_assertions))]
{
return;
}
println!("---------------DEBUG PRINT---------------");
println!("### Information's");
println!("Errors size - {}", self.text_messages.errors.len());
println!("Warnings size - {}", self.text_messages.warnings.len());
println!("Messages size - {}", self.text_messages.messages.len());
println!("### Other");
println!("Temporary list size - {}", self.temporary_files.len());
self.debug_print_common();
println!("Excluded items - {:?}", self.excluded_items.items);
println!("Included directories - {:?}", self.directories.included_directories);
println!("Excluded directories - {:?}", self.directories.excluded_directories);
println!("Recursive search - {}", self.recursive_search);
#[cfg(target_family = "unix")]
println!("Skip other filesystmes - {}", self.directories.exclude_other_filesystems());
println!("Delete Method - {:?}", self.delete_method);
println!("-----------------------------------------");
}
}
impl CommonData for Temporary {
fn get_cd(&self) -> &CommonToolData {
&self.common_data
}
fn get_cd_mut(&mut self) -> &mut CommonToolData {
&mut self.common_data
impl SaveResults for Temporary {
fn save_results_to_file(&mut self, file_name: &str) -> bool {
let start_time: SystemTime = SystemTime::now();
let file_name: String = match file_name {
"" => "results.txt".to_string(),
k => k.to_string(),
};
let file_handler = match File::create(&file_name) {
Ok(t) => t,
Err(e) => {
self.text_messages.errors.push(format!("Failed to create file {}, reason {}", file_name, e));
return false;
}
};
let mut writer = BufWriter::new(file_handler);
if let Err(e) = writeln!(
writer,
"Results of searching {:?} with excluded directories {:?} and excluded items {:?}",
self.directories.included_directories, self.directories.excluded_directories, self.excluded_items.items
) {
self.text_messages.errors.push(format!("Failed to save results to file {}, reason {}", file_name, e));
return false;
}
if !self.temporary_files.is_empty() {
writeln!(writer, "Found {} temporary files.", self.information.number_of_temporary_files).unwrap();
for file_entry in self.temporary_files.iter() {
writeln!(writer, "{}", file_entry.path.display()).unwrap();
}
} else {
write!(writer, "Not found any temporary files.").unwrap();
}
Common::print_time(start_time, SystemTime::now(), "save_results_to_file".to_string());
true
}
}
impl Temporary {
pub const fn get_temporary_files(&self) -> &Vec<TemporaryFileEntry> {
&self.temporary_files
}
impl PrintResults for Temporary {
fn print_results(&self) {
let start_time: SystemTime = SystemTime::now();
println!("Found {} temporary files.\n", self.information.number_of_temporary_files);
for file_entry in self.temporary_files.iter() {
println!("{}", file_entry.path.display());
}
pub const fn get_information(&self) -> &Info {
&self.information
Common::print_time(start_time, SystemTime::now(), "print_entries".to_string());
}
}

@ -1,63 +1,59 @@
[package]
name = "czkawka_gui"
version = "7.0.0"
version = "4.1.0"
authors = ["Rafał Mikrut <mikrutrafal@protonmail.com>"]
edition = "2021"
rust-version = "1.75.0"
description = "GTK frontend of Czkawka"
license = "MIT"
homepage = "https://github.com/qarmin/czkawka"
repository = "https://github.com/qarmin/czkawka"
[dependencies]
gdk4 = "0.8"
glib = "0.19"
gtk4 = { version = "0.8", default-features = false, features = ["v4_6"] }
czkawka_core = { path = "../czkawka_core", version = "4.1.0"}
gdk = "0.15.4"
glib = "0.15.10"
humansize = "2.1"
chrono = "0.4.34"
humansize = "1.1.1"
chrono = "0.4.19"
# Used for sending stop signal across threads
crossbeam-channel = "0.5"
crossbeam-channel = "0.5.4"
# To get informations about progress
futures = "0.3.21"
# For saving/loading config files to specific directories
directories-next = "2.0"
directories-next = "2.0.0"
# For opening files
open = "5.0"
open = "2.1.1"
# To get image preview
image = "0.24"
image = "0.24.1"
# To be able to use custom select
regex = "1.10"
regex = "1.5.5"
# To get image_hasher types
image_hasher = "1.2"
image_hasher = "1.0.0"
# Move files to trash
trash = "3.3"
trash = "1.3.0"
# For moving files(why std::fs doesn't have such features?)
fs_extra = "1.3"
# For moving files(why std::fs doesn't have such features)
fs_extra = "1.2.0"
# Language
i18n-embed = { version = "0.14", features = ["fluent-system", "desktop-requester"] }
i18n-embed-fl = "0.8"
rust-embed = { version = "8.2", features = ["debug-embed"] }
once_cell = "1.19"
log = "0.4.20"
handsome_logger = "0.8"
fun_time = { version = "0.3", features = ["log"] }
rayon = "1.8"
czkawka_core = { path = "../czkawka_core", version = "7.0.0", features = [] }
i18n-embed = { version = "0.13.4", features = ["fluent-system", "desktop-requester"] }
i18n-embed-fl = "0.6.4"
rust-embed = "6.4.0"
once_cell = "1.10.0"
[target.'cfg(windows)'.dependencies]
winapi = { version = "0.3.9", features = ["combaseapi", "objbase", "shobjidl_core", "windef", "winerror", "wtypesbase", "winuser"] }
[features]
default = []
heif = ["czkawka_core/heif"]
libraw = ["czkawka_core/libraw"]
[dependencies.gtk]
version = "0.15.4"
default-features = false # just in case
features = ["v3_24_9"]

@ -1,132 +0,0 @@
# Czkawka GUI
Czkawka GUI is a graphical user interface for Czkawka Core written with GTK 4.
![Screenshot from 2023-11-26 12-43-32](https://github.com/qarmin/czkawka/assets/41945903/722ed490-0be1-4dac-bcfc-182a4d0787dc)
## Requirements
Requirements depend on your platform.
Prebuilt binaries are available here - https://github.com/qarmin/czkawka/releases/
### Linux
#### Prebuild binaries
Ubuntu - `sudo apt install libgtk-4 libheif libraw ffmpeg -y`
#### Snap -
none - all needed libraries are bundled in
snap [except ffmpeg](https://github.com/snapcrafters/ffmpeg/issues/73) - https://snapcraft.io/czkawka
#### Flatpak
none - all needed libraries are bundled - https://flathub.org/apps/com.github.qarmin.czkawka
### Mac
```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install gtk4 adwaita-icon-theme ffmpeg librsvg libheif libraw
```
### Windows
All needed libraries should be bundled in zip (except ffmpeg which you need download and unpack to location
with `czkawka_gui.exe` - https://ffmpeg.org/download.html#build-windows)
You can also install the app via msys2 (webp and heif should work here) - https://www.msys2.org/#installation (czkawka
package - https://packages.msys2.org/base/mingw-w64-czkawka)
```
pacman -S mingw-w64-x86_64-czkawka-gui
```
and you can create a shortcut to `C:\msys64\mingw64\bin\czkawka_gui.exe`
## Compilation
Compiling the gui is harder than compiling cli or core, because it uses gtk4 which is written in C and also requires a
lot build and runtime dependencies.
### Requirements
| Program | Minimal version |
|:-------:|:---------------:|
| Rust | 1.75.0 |
| GTK | 4.6 |
### Linux (Ubuntu, but on other OS should work similar)
```shell
sudo apt install libgtk-4-dev libheif-dev libraw-dev -y
cargo run --release --bin czkawka_gui
# Or with support for heif and libraw
cargo run --release --bin czkawka_gui --features "heif,libraw"
```
### Mac
```shell
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install rustup gtk4 adwaita-icon-theme ffmpeg librsvg libheif libraw pkg-config
rustup-init
cargo run --release --bin czkawka_gui
# Or with support for heif and libraw
cargo run --release --bin czkawka_gui --features "heif,libraw"
```
### Windows
Currently, there is are no instructions on how to compile the app on Windows natively.</br>
You can check for CI for instructions how to cross-compile the app from linux to windows (uses prebuilt docker
image) - [CI Instructions](../.github/workflows/windows.yml)</br>
There exists a mingw recipe which you can try to convert for your
purposes - https://github.com/msys2/MINGW-packages/blob/master/mingw-w64-czkawka/PKGBUILD
## Limitations
Not all available features and/or components implemented here, this is the list of limitations:
- Snap versions does not allow to use the similar videos feature
- Windows version does not support heif and webp files with prebuilt binaries
- Prebuilt binaries for mac arm do not exist
- On Windows, text may appear very small on high resolution displays, a solution is to manually change DPI scaling for
this app, see :
- recommended
fix: [#787#issuecomment-1292253437](https://github.com/qarmin/czkawka/issues/787#issuecomment-1292253437) (modify
gtk.css),
- or this
workaround: [#867#issuecomment-1416761308](https://github.com/qarmin/czkawka/issues/863#issuecomment-1416761308) (
modify windows DPI settings for this app (this works too but the text is a bit blurry)).
## License
Code is distributed under MIT license.
Icon was created by [jannuary](https://github.com/jannuary) and licensed CC-BY-4.0.
Windows dark theme is used from project [WhiteSur](https://github.com/slypy/whitesur-gtk4-theme) with MIT license.
Some icons were taken from [ReShot](https://www.reshot.com) site and are licensed under Reshot Free License.
The program is completely free to use.
"Gratis to uczciwa cena" - "Free is a fair price"
## Name
Czkawka is a Polish word which means _hiccup_.
I chose this name because I wanted to hear people speaking other languages pronounce it, so feel free to spell it the
way you want.
This name is not as bad as it seems, because I was also thinking about using words like _żółć_, _gżegżółka_ or _żołądź_,
but I gave up on these ideas because they contained Polish characters, which would cause difficulty in searching for the
project.
At the beginning of the program creation, if the response concerning the name was unanimously negative, I prepared
myself
for a possible change of the name of the program, and the opinions were extremely mixed.

@ -1 +0,0 @@
../data/

@ -1,500 +0,0 @@
# Window titles
window_settings_title = الإعدادات
window_main_title = Czkawka
window_progress_title = المسح
window_compare_images = مقارنة الصور
# General
general_ok_button = حسناً
general_close_button = أغلق
# Main window
music_title_checkbox = العنوان
music_artist_checkbox = الفنان
music_year_checkbox = السنة
music_bitrate_checkbox = معدل
music_genre_checkbox = النوع
music_length_checkbox = طول
music_comparison_checkbox = مقارنة تقريبية
music_checking_by_tags = الوسوم
music_checking_by_content = محتوى
same_music_seconds_label = الحد الأدنى من مدة التجزئة الثانية
same_music_similarity_label = الفرق الأقصى
same_music_tooltip =
يمكن تكوين البحث عن ملفات موسيقية مشابهة بواسطة محتواها عن طريق الإعداد:
- الحد الأدنى لوقت الشظايا الذي يمكن بعدها تحديد ملفات الموسيقى على أنها
- الحد الأقصى للفارق بين جزأين تم اختبارهما
والمفتاح إلى النتائج الجيدة هو العثور على مجموعات معقولة من هذه المعلمات، عن تقديمه.
تحديد الحد الأدنى من الوقت إلى 5 ثوان والحد الأقصى للفرق إلى 1.0، سيبحث عن أجزاء متطابقة تقريبا في الملفات.
وقت 20 ثانية وفارق أقصى قدره 6.0، من ناحية أخرى، يعمل بشكل جيد من أجل العثور على تعديلات أو إصدارات حية وما إلى ذلك.
بشكل افتراضي، يتم مقارنة كل ملف موسيقي بآخر وقد يستغرق ذلك الكثير من الوقت عند اختبار العديد من الملفات، لذلك من الأفضل عادة استخدام المجلدات المرجعية وتحديد الملفات التي يجب مقارنتها مع بعضها البعض (مع نفس كمية الملفات)، مقارنة بصمات الأصابع ستكون أسرع من 4 × على الأقل من دون مجلدات مرجعية).
music_comparison_checkbox_tooltip =
يبحث عن ملفات موسيقية مماثلة باستخدام AI، الذي يستخدم تعلم الآلة لإزالة الأقواس من العبارة. على سبيل المثال، مع تمكين هذا الخيار، الملفات المعنية سوف تعتبر متكررة:
S<unk> wie<unk> dziz<unk> L.o<unk> b --- S<unk> wie<unk> dziz<unk> L.o<unk> b (Remix Lato 2021)
duplicate_case_sensitive_name = حالة حساسة
duplicate_case_sensitive_name_tooltip =
When enabled, group only records when they have exactly same name e.g. Żołd <-> Żołd
Disabling such option will group names without checking if each letter is same size e.g. żoŁD <-> Żołd
duplicate_mode_size_name_combo_box = الحجم والاسم
duplicate_mode_name_combo_box = الاسم
duplicate_mode_size_combo_box = الحجم
duplicate_mode_hash_combo_box = التجزئة
duplicate_hash_type_tooltip =
يقدم Czkawka 3 أنواع من التجزئة:
Blake3 - دالة التجزئة المشفرة. هذا هو الافتراضي لأنه سريع جدا.
CRC32 - دالة التجزئة البسيطة. وينبغي أن يكون هذا أسرع من بليك 3، ولكن نادرا ما تحدث بعض الاصطدام.
XXH3 - مشابهة جدا في الأداء وجودة التجزئة للـ Blake3 (ولكن غير مشفرة). لذلك يمكن بسهولة تبادل مثل هذه الأوضاع.
duplicate_check_method_tooltip =
في الوقت الحالي، تقدم Czkawka ثلاثة أنواع من الطرق للعثور على التكرارات:
Name - Finds الملفات التي تحمل نفس الاسم.
الحجم - العثور على الملفات التي لها نفس الحجم.
Hash - العثور على الملفات التي لها نفس المحتوى. هذا الوضع يقوم بتجزئة الملف ثم يقارن هذا التجزئة للعثور على التكرار. هذا الوضع هو أكثر الطرق أماناً للعثور على التكرار. يستخدم التطبيق بكثافة ذاكرة التخزين المؤقت، لذا يجب أن تكون المسح الثاني والمزيد لنفس البيانات أسرع بكثير من الأول.
image_hash_size_tooltip =
كل صورة تم فحصها تنتج تجزئة خاصة يمكن مقارنتها مع بعضها البعض، والاختلاف الصغير بينهما يعني أن هذه الصور متشابهة.
8 حجم التجزئة جيد جدا للعثور على صور تشبه قليلا فقط الصور الأصلية. مع مجموعة أكبر من الصور (>1000)، هذا سوف ينتج كمية كبيرة من الإيجابيات الكاذبة، لذا أوصي باستخدام حجم تجزئة أكبر في هذه الحالة.
16 هو حجم التجزئة الافتراضي الذي يمثل حلاً وسطاً جيداً بين العثور على صور مشابهة قليلاً فقط وبين حدوث عدد صغير من تصادم التجزئة.
32 و64 تجزئة لا تجد سوى صور مشابهة جداً، ولكن ينبغي ألا يكون لها تقريباً إيجابيات كاذبة (ربما باستثناء بعض الصور مع قناة ألفا).
image_resize_filter_tooltip =
To compute hash of image, the library must first resize it.
Depend on chosen algorithm, the resulting image used to calculate hash will looks a little different.
The fastest algorithm to use, but also the one which gives the worst results, is Nearest. It is enabled by default, because with 16x16 hash size lower quality it is not really visible.
With 8x8 hash size it is recommended to use a different algorithm than Nearest, to have better groups of images.
image_hash_alg_tooltip =
يمكن للمستخدمين الاختيار من واحدة من خوارزميات عديدة لحساب التجزئة.
لكل منها نقاط قوية وأضعف وسوف تعطي أحيانا نتائج أفضل وأحيانا أسوأ لصور مختلفة.
لذلك ، لتحديد أفضل واحد لك، يتطلب الاختبار اليدوي.
big_files_mode_combobox_tooltip = يسمح بالبحث عن ملفات أصغر/أكبر
big_files_mode_label = الملفات المحددة
big_files_mode_smallest_combo_box = الأصغر حجماً
big_files_mode_biggest_combo_box = الاكبر
main_notebook_duplicates = الملفات المكررة
main_notebook_empty_directories = دلائل فارغة
main_notebook_big_files = الملفات الكبيرة
main_notebook_empty_files = الملفات الفارغة
main_notebook_temporary = ملفات مؤقتة
main_notebook_similar_images = صور مشابهة
main_notebook_similar_videos = مقاطع فيديو مماثلة
main_notebook_same_music = مكرر الموسيقى
main_notebook_symlinks = الروابط الرمزية غير صالحة
main_notebook_broken_files = الملفات المكسورة
main_notebook_bad_extensions = ملحقات سيئة
main_tree_view_column_file_name = اسم الملف
main_tree_view_column_folder_name = اسم المجلد
main_tree_view_column_path = المسار
main_tree_view_column_modification = تاريخ التعديل
main_tree_view_column_size = الحجم
main_tree_view_column_similarity = تماثل
main_tree_view_column_dimensions = الأبعاد
main_tree_view_column_title = العنوان
main_tree_view_column_artist = الفنان
main_tree_view_column_year = السنة
main_tree_view_column_bitrate = معدل
main_tree_view_column_length = طول
main_tree_view_column_genre = النوع
main_tree_view_column_symlink_file_name = اسم ملف الرابط الرمزي
main_tree_view_column_symlink_folder = مجلد الرابط الرمزي
main_tree_view_column_destination_path = مسار الوجهة
main_tree_view_column_type_of_error = نوع الخطأ
main_tree_view_column_current_extension = التمديد الحالي
main_tree_view_column_proper_extensions = التمديد الصحيح
main_label_check_method = طريقة التحقق
main_label_hash_type = نوع التجزئة
main_label_hash_size = حجم التجزئة
main_label_size_bytes = الحجم (بايت)
main_label_min_size = الحد الأدنى
main_label_max_size = الحد الأقصى
main_label_shown_files = عدد الملفات المعروضة
main_label_resize_algorithm = تغيير حجم الخوارزمية
main_label_similarity = مشابهة{" " }
main_check_box_broken_files_audio = الصوت
main_check_box_broken_files_pdf = Pdf
main_check_box_broken_files_archive = أرشيف
main_check_box_broken_files_image = صورة
check_button_general_same_size = تجاهل نفس الحجم
check_button_general_same_size_tooltip = تجاهل الملفات ذات الحجم المتطابق في النتائج - عادة ما تكون هذه المكررة 1:1
main_label_size_bytes_tooltip = حجم الملفات التي سيتم استخدامها في المسح
# Upper window
upper_tree_view_included_folder_column_title = مجلدات للبحث
upper_tree_view_included_reference_column_title = المجلدات المرجعية
upper_recursive_button = متكرر
upper_recursive_button_tooltip = إذا تم تحديده، ابحث أيضا عن الملفات التي لم توضع مباشرة تحت المجلدات المختارة.
upper_manual_add_included_button = إضافة يدوي
upper_add_included_button = إضافة
upper_remove_included_button = إزالة
upper_manual_add_excluded_button = إضافة يدوي
upper_add_excluded_button = إضافة
upper_remove_excluded_button = إزالة
upper_manual_add_included_button_tooltip =
إضافة اسم الدليل للبحث باليد.
لإضافة مسارات متعددة في وقت واحد، قم بفصلها بواسطة ؛
/home/rozkaz سيضيف دليلين /home/rozkaz و /home/rozkaz
upper_add_included_button_tooltip = إضافة دليل جديد للبحث.
upper_remove_included_button_tooltip = حذف الدليل من البحث.
upper_manual_add_excluded_button_tooltip =
إضافة اسم الدليل المستبعد يدوياً.
لإضافة مسارات متعددة في وقت واحد، قم بفصلها بواسطة ؛
/home/roman;/home/krokiet سيضيف دليلين / home/roman و /home/keokiet
upper_add_excluded_button_tooltip = إضافة دليل ليتم استبعاده في البحث.
upper_remove_excluded_button_tooltip = حذف الدليل من المستبعد.
upper_notebook_items_configuration = تكوين العناصر
upper_notebook_excluded_directories = المجلدات المستبعدة
upper_notebook_included_directories = المجلدات المضمنة
upper_allowed_extensions_tooltip =
يجب أن تكون الملحقات المسموح بها مفصولة بفواصل (بشكل افتراضي كلها متاحة).
أجهزة الماكرو التالية، التي تضيف ملحقات متعددة في وقت واحد، متاحة أيضا: IMAGE، VIDEO، MUSIC، TEXT.
مثال استخدام ".exe, IMAGE, VIDEO, .rar, 7z" - وهذا يعني أن الصور (e. .jpg, png) الفيديوهات (مثلاً: avi, mp4) و ex, rar و 7z سيتم مسح الملفات.
upper_excluded_extensions_tooltip =
قائمة الملفات المعطلة التي سيتم تجاهلها في المسح.
عند استخدام الملحقات المسموح بها والمعطلة على حد سواء، هذه واحدة لها أولوية أعلى، لذلك لن يتم تحديد الملف.
upper_excluded_items_tooltip =
Excluded items must contain * wildcard and should be separated by commas.
This is slower than Excluded Directories, so use it carefully.
upper_excluded_items = البنود المستثناة:
upper_allowed_extensions = الإضافات المسموح بها:
upper_excluded_extensions = الملحقات المعطّلة:
# Popovers
popover_select_all = حدد الكل
popover_unselect_all = إلغاء تحديد الكل
popover_reverse = الاختيار العكسي
popover_select_all_except_oldest = حدد الكل باستثناء الأقدم
popover_select_all_except_newest = حدد الكل باستثناء الأحدث
popover_select_one_oldest = حدد أقدم واحد
popover_select_one_newest = حدد واحد أحدث
popover_select_custom = تحديد مخصص
popover_unselect_custom = إلغاء تحديد مخصص
popover_select_all_images_except_biggest = حدد الكل باستثناء أكبر
popover_select_all_images_except_smallest = حدد الكل باستثناء الأصغر
popover_custom_path_check_button_entry_tooltip =
Select records by path.
Example usage:
/home/pimpek/rzecz.txt can be found with /home/pim*
popover_custom_name_check_button_entry_tooltip =
حدد السجلات حسب أسماء الملفات.
استخدام مثال:
/usr/ping/pong.txt يمكن العثور عليه مع *ong*
popover_custom_regex_check_button_entry_tooltip =
حدد السجلات بواسطة Regex.
مع هذا الوضع، النص الذي تم البحث عنه هو المسار بالاسم.
مثال الاستخدام:
/usr/bin/ziemniak. يمكن العثور على xt مع /ziem[a-z]+
يستخدم هذا التطبيق الافتراضي Rust regex . يمكنك قراءة المزيد عنه هنا: https://docs.rs/regex.
popover_custom_case_sensitive_check_button_tooltip =
تمكين الكشف الحساس لحالة الأحرف.
عند تعطيل / المنزل/* يجد كلا من /HoMe/roman و /home/roman.
popover_custom_not_all_check_button_tooltip =
Prevents selecting all records in group.
This is enabled by default, because in most situations, you don't want to delete both original and duplicates files, but want to leave at least one file.
WARNING: This setting doesn't work if you have already manually selected all results in a group.
popover_custom_regex_path_label = المسار
popover_custom_regex_name_label = الاسم
popover_custom_regex_regex_label = مسار Regex + اسم
popover_custom_case_sensitive_check_button = حساسية الحالة
popover_custom_all_in_group_label = عدم تحديد جميع السجلات في المجموعة
popover_custom_mode_unselect = إلغاء تحديد مخصص
popover_custom_mode_select = تحديد مخصص
popover_sort_file_name = اسم الملف
popover_sort_folder_name = اسم المجلد
popover_sort_full_name = الاسم الكامل
popover_sort_size = الحجم
popover_sort_selection = التحديد
popover_invalid_regex = Regex غير صحيح
popover_valid_regex = Regex صالح
# Bottom buttons
bottom_search_button = البحث
bottom_select_button = حدد
bottom_delete_button = حذف
bottom_save_button = حفظ
bottom_symlink_button = Symlink
bottom_hardlink_button = Hardlink
bottom_move_button = نقل
bottom_sort_button = فرز
bottom_search_button_tooltip = بدء البحث
bottom_select_button_tooltip = حدد السجلات. يمكن معالجة الملفات/المجلدات المحددة في وقت لاحق.
bottom_delete_button_tooltip = حذف الملفات/المجلدات المحددة.
bottom_save_button_tooltip = حفظ البيانات حول البحث في الملف
bottom_symlink_button_tooltip =
إنشاء روابط رمزية.
يعمل فقط عندما يتم تحديد نتيجتين على الأقل في المجموعة.
أولا لم يتغير و الثاني و اللاحق مرتبطين بالأول.
bottom_hardlink_button_tooltip =
إنشاء روابط صلبة.
يعمل فقط عندما يتم تحديد نتيجتين على الأقل في المجموعة.
أولا لم يتغير و الثاني و اللاحق متصلين بالأول.
bottom_hardlink_button_not_available_tooltip =
Create hardlinks.
Button is disabled, because hardlinks cannot be created.
Hardlinks only works with administrator privileges on Windows, so be sure to run app as administrator.
If app already works with such privileges check for similar issues on Github.
bottom_move_button_tooltip =
ينقل الملفات إلى الدليل المختار.
ينسخ جميع الملفات إلى الدليل دون الحفاظ على شجرة الدليل.
عند محاولة نقل ملفين مع نفس الاسم إلى مجلد، سيتم فشل الثانية وإظهار الخطأ.
bottom_sort_button_tooltip = ترتيب الملفات/المجلدات وفقا للطريقة المحددة.
bottom_show_errors_tooltip = إظهار/إخفاء لوحة النص السفلية.
bottom_show_upper_notebook_tooltip = إظهار/إخفاء لوحة دفتر الملاحظات العلوية.
# Progress Window
progress_stop_button = توقف
progress_stop_additional_message = إيقاف الطلب
# About Window
about_repository_button_tooltip = رابط لصفحة المستودع مع رمز المصدر.
about_donation_button_tooltip = رابط لصفحة التبرع.
about_instruction_button_tooltip = رابط لصفحة التعليمات.
about_translation_button_tooltip = رابط إلى صفحة كراودِن مع ترجمة التطبيق. يتم دعم البولندية الرسمية والإنجليزية.
about_repository_button = المستودع
about_donation_button = تبرع
about_instruction_button = تعليمات
about_translation_button = الترجمة
# Header
header_setting_button_tooltip = فتح مربع حوار الإعدادات.
header_about_button_tooltip = فتح مربع الحوار مع معلومات حول التطبيق.
# Settings
## General
settings_number_of_threads = عدد المواضيع المستخدمة
settings_number_of_threads_tooltip = عدد المواضيع المستخدمة، 0 يعني أن جميع المواضيع المتاحة سيتم استخدامها.
settings_label_restart = تحتاج إلى إعادة تشغيل التطبيق لتطبيق الإعدادات!
settings_ignore_other_filesystems = تجاهل نظم الملفات الأخرى (Linux)
settings_ignore_other_filesystems_tooltip =
يتجاهل الملفات التي ليست في نفس نظام الملفات مثل الدلائل التي تم بحثها. يعمل
مثل خيار -xdev في العثور على أمر على Linux
settings_save_at_exit_button_tooltip = حفظ التكوين إلى الملف عند إغلاق التطبيق.
settings_load_at_start_button_tooltip =
تحميل التكوين من الملف عند فتح التطبيق.
إذا لم يتم تمكينه، سيتم استخدام الإعدادات الافتراضية.
settings_confirm_deletion_button_tooltip = إظهار مربع حوار التأكيد عند النقر على زر الحذف.
settings_confirm_link_button_tooltip = إظهار مربع حوار التأكيد عند النقر على زر الارتباط الصلب/الرمزي.
settings_confirm_group_deletion_button_tooltip = إظهار مربع حوار التحذير عند محاولة حذف جميع السجلات من المجموعة.
settings_show_text_view_button_tooltip = إظهار لوحة النص في أسفل واجهة المستخدم.
settings_use_cache_button_tooltip = استخدام ذاكرة التخزين المؤقت للملف.
settings_save_also_as_json_button_tooltip = حفظ ذاكرة التخزين المؤقت إلى تنسيق JSON (قابل للقراءة البشرية). من الممكن تعديل محتواه. الذاكرة المؤقتة من هذا الملف سيتم قراءتها تلقائيًا بواسطة التطبيق إذا كان مخبأ تنسيق ثنائي (مع امتداد بن ) مفقود.
settings_use_trash_button_tooltip = نقل الملفات إلى سلة المهملات بدلاً من حذفها بشكل دائم.
settings_language_label_tooltip = لغة واجهة المستخدم.
settings_save_at_exit_button = حفظ التكوين عند إغلاق التطبيق
settings_load_at_start_button = تحميل التكوين عند فتح التطبيق
settings_confirm_deletion_button = إظهار تأكيد مربع الحوار عند حذف أي ملفات
settings_confirm_link_button = إظهار مربع حوار تأكيد عند ربط أي ملفات بصعوبة/رموز
settings_confirm_group_deletion_button = إظهار تأكيد مربع الحوار عند حذف جميع الملفات في المجموعة
settings_show_text_view_button = إظهار لوحة النص السفلي
settings_use_cache_button = استخدام ذاكرة التخزين المؤقت
settings_save_also_as_json_button = حفظ ذاكرة التخزين المؤقت أيضا كملف JSON
settings_use_trash_button = نقل الملفات المحذوفة إلى سلة المهملات
settings_language_label = اللغة
settings_multiple_delete_outdated_cache_checkbutton = حذف إدخالات ذاكرة التخزين المؤقت القديمة تلقائياً
settings_multiple_delete_outdated_cache_checkbutton_tooltip =
Delete outdated cache results which point to non-existent files.
When enabled, app makes sure when loading records, that all records point to valid files (broken ones are ignored).
Disabling this will help when scanning files on external drives, so cache entries about them will not be purged in the next scan.
In the case of having hundred of thousands records in cache, it is suggested to enable this, which will speedup cache loading/saving at start/end of the scan.
settings_notebook_general = عمومي
settings_notebook_duplicates = مكرر
settings_notebook_images = صور مشابهة
settings_notebook_videos = فيديو مشابه
## Multiple - settings used in multiple tabs
settings_multiple_image_preview_checkbutton_tooltip = عرض المعاينة على الجانب الأيمن (عند تحديد ملف صورة).
settings_multiple_image_preview_checkbutton = عرض معاينة الصورة
settings_multiple_clear_cache_button_tooltip =
Manually clear the cache of outdated entries.
This should only be used if automatic clearing has been disabled.
settings_multiple_clear_cache_button = إزالة النتائج القديمة من ذاكرة التخزين المؤقت.
## Duplicates
settings_duplicates_hide_hard_link_button_tooltip =
Hides all files except one, if all point to the same data (are hardlinked).
Example: In the case where there are (on disk) seven files which are hardlinked to specific data and one different file with same data but a different inode, then in duplicate finder, only one unique file and one file from hardlinked ones will be shown.
settings_duplicates_minimal_size_entry_tooltip =
Set the minimal file size which will be cached.
Choosing a smaller value will generate more records. This will speedup search, but slowdown cache loading/saving.
settings_duplicates_prehash_checkbutton_tooltip =
تمكين التخزين المؤقت للتجزئة (تجزئة محسوبة من جزء صغير من الملف) مما يسمح برفض النتائج غير المكررة في وقت سابق.
يتم تعطيله بشكل افتراضي لأنه يمكن أن يتسبب في تباطؤ في بعض الحالات.
يوصى بشدة باستخدامها عند مسح مئات الألوف أو الملايين من الملفات، لأنه يمكن تسريع البحث عدة مرات.
settings_duplicates_prehash_minimal_entry_tooltip = الحجم الأدنى للإدخال المخبئ.
settings_duplicates_hide_hard_link_button = إخفاء الروابط الصلبة (فقط Linux و macOS)
settings_duplicates_prehash_checkbutton = استخدام ذاكرة التخزين المؤقت
settings_duplicates_minimal_size_cache_label = الحجم الأدنى للملفات (بالبايت) المحفوظة إلى ذاكرة التخزين المؤقت
settings_duplicates_minimal_size_cache_prehash_label = الحجم الأدنى للملفات (بالبايت) المحفوظة في ذاكرة التخزين المؤقت
## Saving/Loading settings
settings_saving_button_tooltip = حفظ الإعدادات الحالية إلى الملف.
settings_loading_button_tooltip = تحميل الإعدادات من الملف واستبدل الإعدادات الحالية بها.
settings_reset_button_tooltip = إعادة تعيين الإعدادات الحالية إلى الإعدادات الافتراضية.
settings_saving_button = حفظ التكوين
settings_loading_button = تحميل التكوين
settings_reset_button = إعادة ضبط الإعدادات
## Opening cache/config folders
settings_folder_cache_open_tooltip =
Opens the folder where the cache txt files are stored.
Modifying the cache files may cause invalid results to be shown. However, modifying path may save time when moving a big amount of files to a different location.
You can copy these files between computers to save time on scanning again for files (of course if they have similar directory structure).
In the case of problems with the cache, these files can be removed. The app will automatically regenerate them.
settings_folder_settings_open_tooltip =
Opens the folder where the Czkawka config is stored.
WARNING: Manually modifying the config may break your workflow.
settings_folder_cache_open = فتح مجلد التخزين المؤقت
settings_folder_settings_open = فتح مجلد الإعدادات
# Compute results
compute_stopped_by_user = تم إيقاف البحث من قبل المستخدم
compute_found_duplicates_hash_size = تم العثور على { $number_files } مكررة في { $number_groups } مجموعات أخذت { $size }
compute_found_duplicates_name = تم العثور على { $number_files } مكررة في { $number_groups } مجموعات
compute_found_empty_folders = تم العثور على { $number_files } مجلدات فارغة
compute_found_empty_files = تم العثور على { $number_files } ملفات فارغة
compute_found_big_files = تم العثور على { $number_files } ملف كبير
compute_found_temporary_files = تم العثور على { $number_files } ملف مؤقت
compute_found_images = تم العثور على { $number_files } صورة مشابهة في { $number_groups } مجموعات
compute_found_videos = تم العثور على { $number_files } مقاطع فيديو مماثلة في { $number_groups } مجموعات
compute_found_music = تم العثور على { $number_files } ملفات موسيقية مماثلة في { $number_groups } مجموعة
compute_found_invalid_symlinks = تم العثور على { $number_files } روابط رموزية غير صالحة
compute_found_broken_files = تم العثور على { $number_files } ملفات محطمة
compute_found_bad_extensions = تم العثور على { $number_files } ملفات ذات ملحقات غير صالحة
# Progress window
progress_scanning_general_file = فحص ملف { $file_number }
progress_scanning_extension_of_files = التحقق من امتداد الملف { $file_checked }/{ $all_files }
progress_scanning_broken_files = فحص { $file_checked }/{ $all_files } ملف
progress_scanning_video = تجزئة الفيديو { $file_checked }/{ $all_files }
progress_scanning_image = تجزئة الصورة { $file_checked }/{ $all_files }
progress_comparing_image_hashes = مقارنة { $file_checked }/{ $all_files } تجزئة الصور
progress_scanning_music_tags_end = مقارنة علامات { $file_checked }/{ $all_files } ملف الموسيقى
progress_scanning_music_tags = قراءة وسوم { $file_checked }/{ $all_files } ملف الموسيقى
progress_scanning_music_content_end = مقارنة بصمة الإصبع { $file_checked }/{ $all_files } ملف الموسيقى
progress_scanning_music_content = حساب بصمة الإصبع { $file_checked }/{ $all_files } ملف الموسيقى
progress_scanning_empty_folders = يتم فحص { $folder_number } مجلد
progress_scanning_size = حجم البحث لـ { $file_number } ملف
progress_scanning_size_name = فحص اسم وحجم ملف { $file_number }
progress_scanning_name = فحص اسم ملف { $file_number }
progress_analyzed_partial_hash = تم تحليل تجزئة جزئية ل { $file_checked }/{ $all_files } ملفات
progress_analyzed_full_hash = تم تحليل التجزئة الكاملة لـ { $file_checked }/{ $all_files } ملفات
progress_prehash_cache_loading = تحميل ذاكرة التخزين المؤقت
progress_prehash_cache_saving = حفظ ذاكرة التخزين المؤقت
progress_hash_cache_loading = تحميل ذاكرة التخزين المؤقت للتجزئة
progress_hash_cache_saving = حفظ ذاكرة التخزين المؤقت
progress_cache_loading = تحميل ذاكرة التخزين المؤقت
progress_cache_saving = حفظ ذاكرة التخزين المؤقت
progress_current_stage = المرحلة الحالية:{ "" }
progress_all_stages = جميع المراحل:{ " " }
# Saving loading
saving_loading_saving_success = حفظ التكوين إلى ملف { $name }.
saving_loading_saving_failure = فشل حفظ بيانات التكوين في الملف { $name }.
saving_loading_reset_configuration = تم مسح التكوين الحالي.
saving_loading_loading_success = تم تحميل إعدادات التطبيق بشكل صحيح.
saving_loading_invalid_string = للمفتاح "{ $key }" وجد نتيجة غير صالحة - "{ $result }" الذي ليس سلسلة.
saving_loading_invalid_int = للمفتاح "{ $key }" وجد نتيجة غير صالحة - "{ $result }" الذي ليس عددا صحيحا.
saving_loading_invalid_bool = للمفتاح "{ $key }" وجد نتيجة غير صالحة - "{ $result }" الذي ليس برعيا.
saving_loading_decode_problem_bool = فشل في فك شفرة البول من المفتاح"{ $key }" وجد{ $result }" ولكن القيم المسموح بها هي 0، 1، صحيحة أو خاطئة.
saving_loading_saving_same_keys = محاولة حفظ الإعداد مع مفتاح مكرر"{ $key }".
saving_loading_failed_to_get_home_directory = فشل في الحصول على الدليل الرئيسي لفتح/حفظ ملف الإعداد.
saving_loading_folder_config_instead_file = لا يمكن إنشاء أو فتح ملف التكوين في المسار "{ $path }" لأنه يوجد مجلد بالفعل.
saving_loading_failed_to_create_configuration_folder = فشل تكوين إنشاء مجلد الإعدادات"{ $path }"، السبب"{ $reason }".
saving_loading_failed_to_create_config_file = فشل في إنشاء ملف الإعداد"{ $path }"، السبب"{ $reason }".
saving_loading_failed_to_read_config_file = لا يمكن تحميل التكوين من "{ $path }" لأنه غير موجود أو ليس ملفا.
saving_loading_failed_to_read_data_from_file = لا يمكن قراءة البيانات من الملف"{ $path }"، السبب"{ $reason }".
saving_loading_orphan_data = تم العثور على بيانات يتيمة"{ $data }" في السطر "{ $line }".
saving_loading_not_valid = الإعداد "{ $data }" غير موجود في الإصدار الحالي للتطبيق.
# Invalid symlinks
invalid_symlink_infinite_recursion = التكرار اللامتناهي
invalid_symlink_non_existent_destination = ملف الوجهة غير موجود
# Other
selected_all_reference_folders = لا يمكن بدء البحث، عندما يتم تعيين جميع الدلائل كمجلدات مرجعية
searching_for_data = البحث عن البيانات، قد يستغرق بعض الوقت، يرجى الانتظار...
text_view_messages = الرسائل
text_view_warnings = التحذيرات
text_view_errors = أخطاء
about_window_motto = هذا البرنامج حر في الاستخدام وسوف يكون دائماً.
# Various dialog
dialogs_ask_next_time = اسأل المرة القادمة
delete_file_failed = فشل في حذف الملف { $name }، السبب { $reason }
delete_title_dialog = تأكيد حذف
delete_question_label = هل أنت متأكد من أنك تريد حذف الملفات؟
delete_all_files_in_group_title = تأكيد حذف جميع الملفات في المجموعة
delete_all_files_in_group_label1 = ويتم اختيار جميع السجلات في بعض المجموعات.
delete_all_files_in_group_label2 = هل أنت متأكد من أنك تريد حذفهم؟
delete_folder_failed = فشل في حذف المجلد { $dir } لأن المجلد غير موجود، ليس لديك إذن أو المجلد غير فارغ.
delete_items_label = { $items } سيتم حذف الملفات.
delete_items_groups_label = { $items } ملفات من { $groups } سيتم حذف المجموعات.
hardlink_failed = فشل في الربط
hard_sym_invalid_selection_title_dialog = إختيار غير صالح مع بعض المجموعات
hard_sym_invalid_selection_label_1 = في بعض المجموعات هناك رقم قياسي واحد تم اختياره وسيتم تجاهله.
hard_sym_invalid_selection_label_2 = لتتمكن من صلابة / ربط هذه الملفات، يجب اختيار نتيجتين على الأقل في المجموعة.
hard_sym_invalid_selection_label_3 = الأول في المجموعة معترف به على أنه أصلي ولا يتغير ولكن الثاني ثم يتم تعديله.
hard_sym_link_title_dialog = تأكيد الرابط
hard_sym_link_label = هل أنت متأكد من أنك تريد ربط هذه الملفات؟
move_folder_failed = فشل في نقل المجلد { $name }، السبب { $reason }
move_file_failed = فشل نقل الملف { $name }، السبب { $reason }
move_files_title_dialog = اختر مجلد تريد نقل الملفات المكررة إليه
move_files_choose_more_than_1_path = يمكن تحديد مسار واحد فقط لتكون قادرة على نسخ الملفات المكررة، المحددة { $path_number }.
move_stats = نقل بشكل صحيح { $num_files }/{ $all_files } عناصر
save_results_to_file = تم حفظ النتائج إلى ملفات txt و json في مجلد { $name }.
search_not_choosing_any_music = خطأ: يجب عليك تحديد مربع اختيار واحد على الأقل مع أنواع البحث عن الموسيقى.
search_not_choosing_any_broken_files = خطأ: يجب عليك تحديد مربع اختيار واحد على الأقل مع نوع الملفات المحددة المكسورة.
include_folders_dialog_title = مجلدات لتضمينها
exclude_folders_dialog_title = مجلدات للاستبعاد
include_manually_directories_dialog_title = إضافة دليل يدوياً
cache_properly_cleared = مسح ذاكرة التخزين المؤقت بشكل صحيح
cache_clear_duplicates_title = مسح ذاكرة التخزين المؤقت التكراري
cache_clear_similar_images_title = مسح ذاكرة التخزين المؤقت مشابهة للصور
cache_clear_similar_videos_title = مسح ذاكرة التخزين المؤقت المماثلة للفيديوهات
cache_clear_message_label_1 = هل تريد مسح ذاكرة التخزين المؤقت للإدخالات العتيقة؟
cache_clear_message_label_2 = هذه العملية ستزيل جميع إدخالات ذاكرة التخزين المؤقت التي تشير إلى ملفات غير صالحة.
cache_clear_message_label_3 = قد يؤدي هذا إلى تسريع التحميل/الحفظ إلى ذاكرة التخزين المؤقت.
cache_clear_message_label_4 = تحذير: العملية ستزيل جميع البيانات المخزنة مؤقتاً من الأقراص الخارجية الغير موصولة. لذلك سوف تحتاج كل تجزئة إلى التجديد.
# Show preview
preview_image_resize_failure = فشل تغيير حجم الصورة { $name }.
preview_image_opening_failure = فشل في فتح الصورة { $name }، السبب { $reason }
# Compare images (L is short Left, R is short Right - they can't take too much space)
compare_groups_number = المجموعة { $current_group }/{ $all_groups } ({ $images_in_group } صورة)
compare_move_left_button = ل
compare_move_right_button = ر

@ -1,500 +0,0 @@
# Window titles
window_settings_title = Настройки
window_main_title = Czkawka (Хълцук)
window_progress_title = Сканиране
window_compare_images = Сравни изображения
# General
general_ok_button = Ок
general_close_button = Затвори
# Main window
music_title_checkbox = Заглавие
music_artist_checkbox = Изпълнител
music_year_checkbox = Година
music_bitrate_checkbox = Битрейт
music_genre_checkbox = Жанр
music_length_checkbox = Продължителност
music_comparison_checkbox = Приблизително сравнение
music_checking_by_tags = Етикети
music_checking_by_content = Съдържание
same_music_seconds_label = Минимална продължителност на фрагмента в секунди
same_music_similarity_label = Максимална разлика
same_music_tooltip =
Търсенето на подобни музикални файлове по съдържание може да се конфигурира чрез настройка:
- Минималното време на фрагмента, след което музикалните файлове могат да бъдат идентифицирани като подобни
- Максимална разлика между два тествани фрагмента
Ключът към добрите резултати е да се намерят разумни комбинации от тези параметри, например.
Ако зададете минималното време на 5 s, а максималната разлика на 1,0, ще търсите почти идентични фрагменти във файловете.
От друга страна, време от 20 s и максимална разлика от 6,0 работят добре за намиране на ремикси/живи версии и т. н.
По подразбиране всеки музикален файл се сравнява един с друг и това може да отнеме много време при тестване на много файлове, така че обикновено е по-добре да се използват референтни папки и да се укаже кои файлове да се сравняват един с друг(при същото количество файлове сравняването на отпечатъци ще бъде по-бързо поне 4 пъти, отколкото без референтни папки).
music_comparison_checkbox_tooltip =
Програмата търси подобни музикални файлове с помощта на изкуствен интелект, който използва машинно обучение за премахване на скоби от фраза. Например, при активирана тази опция въпросните файлове ще се считат за дубликати:
Świędziżłób --- Świędziżłób (Remix Lato 2021)
duplicate_case_sensitive_name = Чувствително изписване
duplicate_case_sensitive_name_tooltip =
Когато е разрешено, групата записва само записи с едно и също име, напр. Żołd <-> Żołd
При деактивиране на тази опция имената ще се групират, без да се проверява дали всяка буква е с еднакъв размер, напр. żoŁD <-> Żołd
duplicate_mode_size_name_combo_box = Размер и име
duplicate_mode_name_combo_box = Име
duplicate_mode_size_combo_box = Размер
duplicate_mode_hash_combo_box = Хеш
duplicate_hash_type_tooltip =
Czkawka предлага 3 вида хешове:
Blake3 - криптографска хеш функция. Тя е избрана по подразбиране, тъй като е много бърза.
CRC32 - проста хеш функция. Тя би трябвало да е по-бърза от Blake3, но много рядко може да има някои колизии.
XXH3 - много подобна по производителност и качество на хеширане на Blake3 (но некриптографска). Така че тези режими могат лесно да се сменят.
duplicate_check_method_tooltip =
Засега Czkawka предлага три вида методи за намиране на дубликати чрез:
Име - Намира файлове с еднакво име.
Размер - Намира файлове с еднакъв размер.
Hash - Намира файлове с еднакво съдържание. Този режим хешира файла и по-късно сравнява този хеш, за да намери дубликати. Този режим е най-сигурният начин за намиране на дубликати. Приложението използва силно кеша, така че второто и следващите сканирания на едни и същи данни би трябвало да са много по-бързи от първото.
image_hash_size_tooltip =
Each checked image produces a special hash which can be compared with each other, and a small difference between them means that these images are similar.
8 hash size is quite good to find images that are only a little similar to original. With a bigger set of images (>1000), this will produce a big amount of false positives, so I recommend to use a bigger hash size in this case.
16 is the default hash size which is quite a good compromise between finding even a little similar images and having only a small amount of hash collisions.
32 and 64 hashes find only very similar images, but should have almost no false positives (maybe except some images with alpha channel).
image_resize_filter_tooltip =
To compute hash of image, the library must first resize it.
Depend on chosen algorithm, the resulting image used to calculate hash will looks a little different.
The fastest algorithm to use, but also the one which gives the worst results, is Nearest. It is enabled by default, because with 16x16 hash size lower quality it is not really visible.
With 8x8 hash size it is recommended to use a different algorithm than Nearest, to have better groups of images.
image_hash_alg_tooltip =
Потребителите могат да изберат един от многото алгоритми за изчисляване на хеша.
Всеки от тях има както силни, така и слаби страни и понякога дава по-добри, а понякога по-лоши резултати за различни изображения.
Затова, за да определите най-добрия за вас, е необходимо ръчно тестване.
big_files_mode_combobox_tooltip = Позволява търсене на най-малките/най-големите файлове
big_files_mode_label = Проверени файлове
big_files_mode_smallest_combo_box = Най-малкия
big_files_mode_biggest_combo_box = Най-големия
main_notebook_duplicates = Повтарящи се файлове
main_notebook_empty_directories = Празни директории
main_notebook_big_files = Големи файлове
main_notebook_empty_files = Празни файлове
main_notebook_temporary = Временни файлове
main_notebook_similar_images = Подобни изображения
main_notebook_similar_videos = Подобни видеа
main_notebook_same_music = Музикални дубликати
main_notebook_symlinks = Невалидни симлинкове
main_notebook_broken_files = Повредени файлове
main_notebook_bad_extensions = Повредени разширения
main_tree_view_column_file_name = Име на файла
main_tree_view_column_folder_name = Име на папката
main_tree_view_column_path = Път
main_tree_view_column_modification = Дата на промяна
main_tree_view_column_size = Размер
main_tree_view_column_similarity = Прилика
main_tree_view_column_dimensions = Размери
main_tree_view_column_title = Заглавие
main_tree_view_column_artist = Изпълнител
main_tree_view_column_year = Година
main_tree_view_column_bitrate = Битрейт
main_tree_view_column_length = Дължина
main_tree_view_column_genre = Жанр
main_tree_view_column_symlink_file_name = Име на файла на Symlink
main_tree_view_column_symlink_folder = Symlink папка
main_tree_view_column_destination_path = Път за местоположение
main_tree_view_column_type_of_error = Тип на грешка
main_tree_view_column_current_extension = Избрано разширение
main_tree_view_column_proper_extensions = Правилно разширение
main_label_check_method = Провери метод
main_label_hash_type = Хеш тип
main_label_hash_size = Хеш размер
main_label_size_bytes = Размер (байтове)
main_label_min_size = Мин
main_label_max_size = Макс
main_label_shown_files = Брой на показани файлове
main_label_resize_algorithm = Преоразмери алгоритъма
main_label_similarity = Сходство{ " " }
main_check_box_broken_files_audio = Аудио
main_check_box_broken_files_pdf = PDF
main_check_box_broken_files_archive = Архив
main_check_box_broken_files_image = Изображение
check_button_general_same_size = Игнорирай еднакъв размер
check_button_general_same_size_tooltip = Ignore files with identical size in results - usually these are 1:1 duplicates
main_label_size_bytes_tooltip = Размер на файловете, които ще се използват при сканиране
# Upper window
upper_tree_view_included_folder_column_title = Папки за търсене
upper_tree_view_included_reference_column_title = Папки за справка
upper_recursive_button = Рекурсивен
upper_recursive_button_tooltip = Ако е избрано, се търсят и файлове, които не са поставени директно в избраните папки.
upper_manual_add_included_button = Ръчно добавяне
upper_add_included_button = Добави
upper_remove_included_button = Премахни
upper_manual_add_excluded_button = Ръчно добавяне
upper_add_excluded_button = Добави
upper_remove_excluded_button = Премахни
upper_manual_add_included_button_tooltip =
Добавяне на име на директория за ръчно търсене.
За да добавите няколко пътища наведнъж, разделете ги с ;
/home/roman;/home/rozkaz ще добави две директории /home/roman и /home/rozkaz
upper_add_included_button_tooltip = Добавяне на нова директория за търсене.
upper_remove_included_button_tooltip = Изтриване на директорията от търсенето.
upper_manual_add_excluded_button_tooltip =
Добавете името на изключената директория на ръка.
За да добавите няколко пътя наведнъж, разделете ги с ;
/home/roman;/home/krokiet ще добави две директории /home/roman и /home/keokiet
upper_add_excluded_button_tooltip = Добавяне на директория, която да бъде изключена при търсене.
upper_remove_excluded_button_tooltip = Изтриване на директория от изключените.
upper_notebook_items_configuration = Конфигурация на елементите
upper_notebook_excluded_directories = Изключени директории
upper_notebook_included_directories = Включени директории
upper_allowed_extensions_tooltip =
Разрешените разширения трябва да бъдат разделени със запетаи (по подразбиране са налични всички).
Налични са и следните макроси, които добавят няколко разширения наведнъж: ИЗОБРАЖЕНИЕ, ВИДЕО, МУЗИКА, ТЕКСТ.
Пример за използване ".exe, IMAGE, VIDEO, .rar, 7z" - това означава, че ще бъдат сканирани изображения (напр. jpg, png), видеоклипове (напр. avi, mp4), файлове exe, rar и 7z.
upper_excluded_extensions_tooltip =
List of disabled files which will be ignored in scan.
When using both allowed and disabled extensions, this one has higher priority, so file will not be checked.
upper_excluded_items_tooltip =
Изключените елементи трябва да съдържат заместител * и да са разделени със запетаи.
Тази функция е по-бавна от функцията Изключени директории, затова я използвайте внимателно.
upper_excluded_items = Изключени елементи:
upper_allowed_extensions = Разрешени разширения:
upper_excluded_extensions = Disabled Extensions:
# Popovers
popover_select_all = Избери всички
popover_unselect_all = Размаркирайте всички
popover_reverse = Избери обратното
popover_select_all_except_oldest = Избери всички освен най-старото
popover_select_all_except_newest = Избери всички освен най-новото
popover_select_one_oldest = Избери най-старото
popover_select_one_newest = Избери най-новото
popover_select_custom = Избери по избор
popover_unselect_custom = Размаркирай по избор
popover_select_all_images_except_biggest = Избери всички освен най-големия
popover_select_all_images_except_smallest = Избери всички освен най-малкия
popover_custom_path_check_button_entry_tooltip =
Изберете записи по път.
Пример за използване:
/home/pimpek/rzecz.txt може да бъде намерен с /home/pim*
popover_custom_name_check_button_entry_tooltip =
Изберете записи по имена на файлове.
Пример за използване:
/usr/ping/pong.txt може да бъде намерен с *ong*
popover_custom_regex_check_button_entry_tooltip =
Избиране на записи по зададен Regex.
В този режим търсеният текст е Path with Name.
Пример за използване:
/usr/bin/ziemniak.txt може да бъде намерен с /ziem[a-z]+
В този случай се използва имплементацията на regex по подразбиране на Rust. Можете да прочетете повече за нея тук: https://docs.rs/regex.
popover_custom_case_sensitive_check_button_tooltip =
Активира откриването с отчитане на големи и малки букви.
Когато е изключено, /home/* намира както /HoMe/roman, така и /home/roman.
popover_custom_not_all_check_button_tooltip =
Предотвратява избирането на всички записи в групата.
Това е разрешено по подразбиране, тъй като в повечето ситуации не искате да изтривате и оригиналните, и дублираните файлове, а искате да оставите поне един файл.
ПРЕДУПРЕЖДЕНИЕ: Тази настройка не работи, ако вече сте избрали ръчно всички резултати в групата.
popover_custom_regex_path_label = Път
popover_custom_regex_name_label = Име
popover_custom_regex_regex_label = Regex Път + Име
popover_custom_case_sensitive_check_button = Чувствителност на буквите
popover_custom_all_in_group_label = Да не се избират всички записи в групата
popover_custom_mode_unselect = Премахване на избора по избор
popover_custom_mode_select = Избери по избор
popover_sort_file_name = Име на файла
popover_sort_folder_name = Име на папката
popover_sort_full_name = Пълно име
popover_sort_size = Размер
popover_sort_selection = Избор
popover_invalid_regex = Regex е невалиден
popover_valid_regex = Regex е валиден
# Bottom buttons
bottom_search_button = Търсене
bottom_select_button = Избери
bottom_delete_button = Изтрий
bottom_save_button = Запази
bottom_symlink_button = Симлинк
bottom_hardlink_button = Хардлинк
bottom_move_button = Премести
bottom_sort_button = Сортирай
bottom_search_button_tooltip = Започни търсене
bottom_select_button_tooltip = Изберете записи. Само избраните файлове/папки могат да бъдат обработени по-късно.
bottom_delete_button_tooltip = Изтрий избрани файлове/папки.
bottom_save_button_tooltip = Записване на данни за търсенето във файл
bottom_symlink_button_tooltip =
Създаване на символни връзки.
Работи само когато са избрани поне два резултата в група.
Първият е непроменен, а вторият и по-късните са символни връзки към първия.
bottom_hardlink_button_tooltip =
Създаване на твърди връзки.
Работи само когато са избрани поне два резултата в група.
Първият е непроменен, а вторият и по-късните са свързани с първия.
bottom_hardlink_button_not_available_tooltip =
Създаване на твърди връзки.
Бутонът е деактивиран, тъй като не могат да се създават твърди връзки.
Хардлинковете работят само с администраторски права в Windows, затова не забравяйте да стартирате приложението като администратор.
Ако приложението вече работи с такива привилегии, проверете за подобни проблеми в Github.
bottom_move_button_tooltip =
Премества файлове в избрана директория.
Той копира всички файлове в директорията, без да запазва дървото на директориите.
При опит за преместване на два файла с еднакво име в папка, вторият ще се провали и ще покаже грешка.
bottom_sort_button_tooltip = Сортира файловете/папките според избрания метод.
bottom_show_errors_tooltip = Показване/скриване на долния текстов панел.
bottom_show_upper_notebook_tooltip = Показване/скриване на горния панел на бележника.
# Progress Window
progress_stop_button = Спри
progress_stop_additional_message = Спри избраните
# About Window
about_repository_button_tooltip = Връзка към страницата на хранилището с изходния код.
about_donation_button_tooltip = Връзка към страницата за дарения.
about_instruction_button_tooltip = Връзка към страницата с инструкции.
about_translation_button_tooltip = Връзка към страницата на Crowdin с преводи на приложения. Официално се поддържат полски и английски език.
about_repository_button = Хранилище
about_donation_button = Дарение
about_instruction_button = Инструкции
about_translation_button = Преводи
# Header
header_setting_button_tooltip = Отваря диалогов прозорец за настройки.
header_about_button_tooltip = Отваря диалогов прозорец с информация за приложението.
# Settings
## General
settings_number_of_threads = Брой използвани нишки
settings_number_of_threads_tooltip = Брой използвани нишки, 0 означава, че ще бъдат използвани всички налични нишки.
settings_label_restart = Трябва да рестартирате приложението, за да приложите настройките!
settings_ignore_other_filesystems = Игнориране на други файлови системи (само за Linux)
settings_ignore_other_filesystems_tooltip =
игнорира файлове, които не са в същата файлова система като търсените директории.
Работи по същия начин като опцията -xdev в командата find в Linux
settings_save_at_exit_button_tooltip = Записване на конфигурацията във файл при затваряне на приложението.
settings_load_at_start_button_tooltip =
Зареждане на конфигурацията от файл при отваряне на приложението.
Ако не е разрешено, ще се използват настройките по подразбиране.
settings_confirm_deletion_button_tooltip = Показване на диалогов прозорец за потвърждение при натискане на бутона за изтриване.
settings_confirm_link_button_tooltip = Показване на диалогов прозорец за потвърждение, когато щракнете върху бутона за твърда/симултанна връзка.
settings_confirm_group_deletion_button_tooltip = Показване на диалогов прозорец с предупреждение при опит за изтриване на всички записи от групата.
settings_show_text_view_button_tooltip = Показване на текстовия панел в долната част на потребителския интерфейс.
settings_use_cache_button_tooltip = Използвайте кеш за файлове.
settings_save_also_as_json_button_tooltip = Записване на кеша в (разбираем за човека) формат JSON. Възможно е да променяте съдържанието му. Кешът от този файл ще бъде прочетен автоматично от приложението, ако липсва кеш в двоичен формат (с разширение bin).
settings_use_trash_button_tooltip = Премества файловете в кошчето, вместо да ги изтрие окончателно.
settings_language_label_tooltip = Език за потребителски интерфейс.
settings_save_at_exit_button = Запазване на конфигурацията при затваряне на приложението
settings_load_at_start_button = Зареждане на конфигурацията при отваряне на приложението
settings_confirm_deletion_button = Показване на диалогов прозорец за потвърждение при изтриване на файлове
settings_confirm_link_button = Показване на диалогов прозорец за потвърждение при твърди/симетрични връзки на файлове
settings_confirm_group_deletion_button = Показване на диалогов прозорец за потвърждение при изтриване на всички файлове в групата
settings_show_text_view_button = Показване на долния текстов панел
settings_use_cache_button = Използвай кеш
settings_save_also_as_json_button = Също запази леша като JSON файл
settings_use_trash_button = Премести изтритите файлове в кошчето
settings_language_label = Език
settings_multiple_delete_outdated_cache_checkbutton = Автоматично изтриване на остарелите записи в кеша
settings_multiple_delete_outdated_cache_checkbutton_tooltip =
Изтриване на остарелите резултати от кеша, които сочат към несъществуващи файлове.
Когато е разрешено, приложението се уверява, че при зареждане на записи всички записи сочат към валидни файлове (повредените се игнорират).
Деактивирането на тази функция ще помогне при сканиране на файлове на външни дискове, тъй като записите от кеша за тях няма да бъдат изчистени при следващото сканиране.
В случай че имате стотици хиляди записи в кеша, предлагаме да включите тази опция, което ще ускори зареждането/спасяването на кеша в началото/края на сканирането.
settings_notebook_general = Общи
settings_notebook_duplicates = Дубликати
settings_notebook_images = Сходни изображения
settings_notebook_videos = Сходни видеа
## Multiple - settings used in multiple tabs
settings_multiple_image_preview_checkbutton_tooltip = Показва предварителен преглед от дясната страна (при избиране на файл с изображение).
settings_multiple_image_preview_checkbutton = Показване на предварителен преглед на изображението
settings_multiple_clear_cache_button_tooltip =
Изчистете ръчно кеша от остарели записи.
Това трябва да се използва само ако автоматичното изчистване е деактивирано.
settings_multiple_clear_cache_button = Remove outdated results from cache.
## Duplicates
settings_duplicates_hide_hard_link_button_tooltip =
Скрива всички файлове с изключение на един, ако всички сочат към едни и същи данни (са твърдо свързани).
Пример: В случай, че на диска има седем файла, които са свързани с определени данни, и един различен файл със същите данни, но с различен inode, тогава в търсачката за дубликати ще бъдат показани само един уникален файл и един файл от свързаните.
settings_duplicates_minimal_size_entry_tooltip =
Задаване на минималния размер на файла, който ще се кешира.
Ако изберете по-малка стойност, ще се генерират повече записи. Това ще ускори търсенето, но ще забави зареждането/запазването на кеша.
settings_duplicates_prehash_checkbutton_tooltip =
Позволява кеширане на prehash (хеш, изчислен от малка част от файла), което позволява по-ранно отхвърляне на недублирани резултати.
По подразбиране е забранено, тъй като в някои ситуации може да доведе до забавяне на работата.
Силно се препоръчва да се използва при сканиране на стотици хиляди или милиони файлове, защото може да ускори търсенето многократно.
settings_duplicates_prehash_minimal_entry_tooltip = Минимален размер на записа в кеша.
settings_duplicates_hide_hard_link_button = Скриване на твърди връзки (само за Linux и macOS)
settings_duplicates_prehash_checkbutton = Използване на предварителен кеш
settings_duplicates_minimal_size_cache_label = Минимален размер на файловете (в байтове), записани в кеша
settings_duplicates_minimal_size_cache_prehash_label = Минимален размер на файловете (в байтове), които се записват в предварителния кеш
## Saving/Loading settings
settings_saving_button_tooltip = Записване на текущата конфигурация на настройките във файл.
settings_loading_button_tooltip = Зареждане на настройките от файл и заместване на текущата конфигурация с тях.
settings_reset_button_tooltip = Възстановяване на текущата конфигурация до тази по подразбиране.
settings_saving_button = Запазване на конфигурацията
settings_loading_button = Конфигурация за зареждане
settings_reset_button = Нулиране на конфигурацията
## Opening cache/config folders
settings_folder_cache_open_tooltip =
Отваря папката, в която се съхраняват кеш txt файловете.
Промяната на кеш файловете може да доведе до показване на невалидни резултати. Промяната на пътя обаче може да спести време при преместване на голямо количество файлове на друго място.
Можете да копирате тези файлове между компютрите, за да спестите време за повторно сканиране на файловете (разбира се, ако те имат сходна структура на директориите).
В случай на проблеми с кеша тези файлове могат да бъдат премахнати. Приложението автоматично ще ги възстанови.
settings_folder_settings_open_tooltip =
Отваря папката, в която се съхранява конфигурацията на Czkawka.
ПРЕДУПРЕЖДЕНИЕ: Ръчното модифициране на конфигурацията може да наруши работния ви процес.
settings_folder_cache_open = Отворете папката с кеш
settings_folder_settings_open = Отваряне на папката с настройки
# Compute results
compute_stopped_by_user = Търсенето е спряно от потребител
compute_found_duplicates_hash_size = Намерени са { $number_files } дубликати в { $number_groups } групи, които са отнели { $size }
compute_found_duplicates_name = Намерени са { $number_files } дубликати в { $number_groups } групи
compute_found_empty_folders = Намерени { $number_files } празни папки
compute_found_empty_files = Намерени { $number_files } празни файлове
compute_found_big_files = Намерени { $number_files } големи файлове
compute_found_temporary_files = Намерени { $number_files } временни файлове
compute_found_images = Намерени { $number_files } подобни изображения в { $number_groups } групи
compute_found_videos = Намерени { $number_files } подобни видеоклипове в { $number_groups } групи
compute_found_music = Намерени са { $number_files } подобни музикални файлове в { $number_groups } групи
compute_found_invalid_symlinks = Намерени { $number_files } невалидни симлинкове
compute_found_broken_files = Намерени { $number_files } счупени файлове
compute_found_bad_extensions = Намерени { $number_files } файлове с невалидни разширения
# Progress window
progress_scanning_general_file = Сканиране на { $file_number } файл
progress_scanning_extension_of_files = Проверка на разширението на { $file_checked }/{ $all_files } файл
progress_scanning_broken_files = Проверка на { $file_checked }/{ $all_files } файл
progress_scanning_video = Хеширане на { $file_checked }/{ $all_files } видео
progress_scanning_image = Хеширане на { $file_checked }/{ $all_files } изображение
progress_comparing_image_hashes = Сравняване на { $file_checked }/{ $all_files } хеш на изображенията
progress_scanning_music_tags_end = Сравняване на таговете на { $file_checked }/{ $all_files } музикален файл
progress_scanning_music_tags = Четене на таговете на { $file_checked }/{ $all_files } музикален файл
progress_scanning_music_content_end = Сравняване на пръстовия отпечатък на { $file_checked }/{ $all_files } музикален файл
progress_scanning_music_content = Изчисляване на пръстовия отпечатък на { $file_checked }/{ $all_files } музикален файл
progress_scanning_empty_folders = Сканиране на { $folder_number } папка
progress_scanning_size = Сканиране на размера на { $file_number } файла
progress_scanning_size_name = Сканиране на името и размера на { $file_number } файл
progress_scanning_name = Сканиране на името на { $file_number } файл
progress_analyzed_partial_hash = Анализиран частичен хеш на { $file_checked }/{ $all_files } файлове
progress_analyzed_full_hash = Анализиран пълен хеш на { $file_checked }/{ $all_files } файлове
progress_prehash_cache_loading = Loading prehash cache
progress_prehash_cache_saving = Saving prehash cache
progress_hash_cache_loading = Loading hash cache
progress_hash_cache_saving = Saving hash cache
progress_cache_loading = Loading cache
progress_cache_saving = Saving cache
progress_current_stage = Текущ етап:{ " " }
progress_all_stages = Всички етапи:{ " " }
# Saving loading
saving_loading_saving_success = Запазване на конфигурацията във файл { $name }.
saving_loading_saving_failure = Неуспешно записване на данните за конфигурацията във файла { $name }.
saving_loading_reset_configuration = Текущата конфигурация е изтрита.
saving_loading_loading_success = Правилно заредена конфигурация на приложението.
saving_loading_invalid_string = За ключа "{ $key }" е намерен невалиден резултат - "{ $result }", който не е низ.
saving_loading_invalid_int = За ключа "{ $key }" е намерен невалиден резултат - "{ $result }", който не е цяло число.
saving_loading_invalid_bool = За ключа "{ $key }" е намерен невалиден резултат - "{ $result }", който не е bool.
saving_loading_decode_problem_bool = Неуспешно декодиране на bool от ключа "{ $key }" намерено "{ $result }", но разрешените стойности са 0, 1, true или false.
saving_loading_saving_same_keys = Опит за запазване на настройка с дублиран ключ "{ $key }".
saving_loading_failed_to_get_home_directory = Не успя да получи начална директория за отваряне/записване на конфигурационен файл.
saving_loading_folder_config_instead_file = Не може да се създаде или отвори файл за запазване на конфигурация в пътя "{ $path }", защото вече има папка.
saving_loading_failed_to_create_configuration_folder = Неуспешна конфигурация за създаване на конфигурационна папка "{ $path }", причина "{ $reason }".
saving_loading_failed_to_create_config_file = Неуспешно създаване на конфигурационен файл "{ $path }", причина "{ $reason }".
saving_loading_failed_to_read_config_file = Не може да се зареди конфигурация от "{ $path }", защото тя не съществува или не е файл.
saving_loading_failed_to_read_data_from_file = Не може да се прочетат данни от файл "{ $path }", причина "{ $reason }".
saving_loading_orphan_data = Открити са данни за сираци "{ $data }" в ред "{ $line }".
saving_loading_not_valid = Настройката "{ $data }" не съществува в текущата версия на приложението.
# Invalid symlinks
invalid_symlink_infinite_recursion = Безкрайна рекурсия
invalid_symlink_non_existent_destination = Несъществуващ дестинационен файл
# Other
selected_all_reference_folders = Не може да се стартира търсене, когато всички директории са зададени като референтни папки
searching_for_data = Търсене на данни, може да отнеме известно време, моля, изчакайте...
text_view_messages = СЪОБЩЕНИЯ
text_view_warnings = ПРЕДУПРЕЖДЕНИЯ
text_view_errors = ГРЕШКИ
about_window_motto = Тази програма е безплатна за използване и винаги ще бъде такава.
# Various dialog
dialogs_ask_next_time = Попитайте следващия път
delete_file_failed = Неуспешно изтриване на файл { $name }, причина { $reason }
delete_title_dialog = Изтрий потвърждението
delete_question_label = Сигурни ли сте, че искате да изтриете файловете?
delete_all_files_in_group_title = Потвърждаване на изтриването на всички файлове в групата
delete_all_files_in_group_label1 = В някои групи се избират всички записи.
delete_all_files_in_group_label2 = Сигурни ли сте, че искате да ги изтриете?
delete_folder_failed = Не успяхте да изтриете папка { $dir }, защото папката не съществува, нямате разрешение или папката не е празна.
delete_items_label = { $items } файловете ще бъдат изтрити.
delete_items_groups_label = { $items } Файловете от { $groups } групите ще бъдат изтрити.
hardlink_failed = Неуспешно свързване с твърда връзка
hard_sym_invalid_selection_title_dialog = Невалидна селекция при някои групи
hard_sym_invalid_selection_label_1 = В някои групи е избран само един запис и той ще бъде пренебрегнат.
hard_sym_invalid_selection_label_2 = За да можете да свържете тези файлове с твърда/симетрична връзка, трябва да изберете поне два резултата в групата.
hard_sym_invalid_selection_label_3 = Първият в групата се признава за оригинален и не се променя, но вторият и следващите се променят.
hard_sym_link_title_dialog = Потвърждаване на връзката
hard_sym_link_label = Потвърждаване на връзкатаСигурни ли сте, че искате да свържете тези файлове?
move_folder_failed = Неуспешно преместване на папка { $name }, причина { $reason }
move_file_failed = Неуспешно преместване на файл { $name }, причина { $reason }
move_files_title_dialog = Изберете папката, в която искате да преместите дублираните файлове
move_files_choose_more_than_1_path = Може да се избере само един път, за да може да се копират дублираните им файлове, selected { $path_number }.
move_stats = Правилно преместени { $num_files }/{ $all_files } елементи
save_results_to_file = Saved results both to txt and json files into { $name } folder.
search_not_choosing_any_music = ГРЕШКА: Трябва да изберете поне едно квадратче за отметка с типове търсене на музика.
search_not_choosing_any_broken_files = ГРЕШКА: Трябва да изберете поне едно квадратче за отметка с тип на проверените счупени файлове.
include_folders_dialog_title = Папки, които да се включват
exclude_folders_dialog_title = Папки, които да се изключат
include_manually_directories_dialog_title = Добаеви ръчно директория
cache_properly_cleared = Правилно изчистен кеш
cache_clear_duplicates_title = Изчистване на кеша за дубликати
cache_clear_similar_images_title = Изчистване на кеша на подобни изображения
cache_clear_similar_videos_title = Изчистване на кеша на подобни видеоклипове
cache_clear_message_label_1 = Искате ли да изчистите кеша от остарели записи?
cache_clear_message_label_2 = Тази операция ще премахне всички записи в кеша, които сочат към невалидни файлове.
cache_clear_message_label_3 = Това може леко да ускори зареждането/записването в кеша.
cache_clear_message_label_4 = ПРЕДУПРЕЖДЕНИЕ: Операцията ще премахне всички кеширани данни от изключените външни дискове. Така че всеки хеш ще трябва да бъде възстановен.
# Show preview
preview_image_resize_failure = Неуспешно променяне на размера на изображението { $name }.
preview_image_opening_failure = Неуспешно отваряне на изображение { $name }, причина { $reason }
# Compare images (L is short Left, R is short Right - they can't take too much space)
compare_groups_number = Група { $current_group }/{ $all_groups } ({ $images_in_group } изображения)
compare_move_left_button = Л
compare_move_right_button = Д

@ -14,22 +14,6 @@ music_bitrate_checkbox = Přenosová rychlost
music_genre_checkbox = Žánr
music_length_checkbox = Délka
music_comparison_checkbox = Přibližné srovnání
music_checking_by_tags = Štítky
music_checking_by_content = Obsah
same_music_seconds_label = Minimální délka trvání druhého fragmentu
same_music_similarity_label = Maximální rozdíl
same_music_tooltip =
Vyhledávání podobných hudebních souborů podle jejich obsahu může být nakonfigurováno nastavením:
- Minimální doba fragmentu, po které mohou být hudební soubory identifikovány jako podobné
- Maximální rozdíl mezi dvěma testovanými fragmenty
Klíč k dobrým výsledkům je najít rozumné kombinace těchto parametrů, pro stanovení.
Nastavení minimální doby na 5 s a maximální rozdíl na 1,0 bude hledat téměř stejné fragmenty v souborech.
Čas 20 s a maximální rozdíl 6,0 na druhé straně funguje dobře pro nalezení remixů/živých verzí atd.
Ve výchozím nastavení je každý hudební soubor porovnáván mezi sebou a to může trvat dlouho při testování mnoha souborů, takže je obvykle lepší používat referenční složky a specifikovat, které soubory mají být vzájemně porovnány (se stejným množstvím souborů, porovnávání otisků prstů bude rychlejší alespoň 4x než bez referenčních složek).
music_comparison_checkbox_tooltip =
Vyhledá podobné hudební soubory pomocí AI, která používá strojové učení k odstranění závorek z fráze. Například, pokud je tato možnost povolena, příslušné soubory budou považovány za duplicitní soubory:
@ -39,7 +23,6 @@ duplicate_case_sensitive_name_tooltip =
Pokud je povoleno, skupiny pouze záznamy, pokud mají přesně stejný název, např.Żołd <-> Żołd
Zakázání takové volby bude názvy skupin bez kontroly, zda je každé písmeno stejné velikosti, např. żoŁD <-> Żołd
duplicate_mode_size_name_combo_box = Velikost a název
duplicate_mode_name_combo_box = Název
duplicate_mode_size_combo_box = Velikost
duplicate_mode_hash_combo_box = Hash
@ -60,31 +43,18 @@ duplicate_check_method_tooltip =
Hash - Najde soubory, které mají stejný obsah. Tento režim hashuje soubor a později porovnává tento hash s nalezením duplikátů. Tento režim je nejbezpečnějším způsobem, jak nalézt duplikáty. Aplikace používá mezipaměť, takže druhé a další skenování stejných dat by mělo být mnohem rychlejší než první.
image_hash_size_tooltip =
Každý zkontrolovaný obrázek vytváří speciální hash který lze porovnávat, a malý rozdíl mezi nimi znamená, že tyto obrázky jsou podobné.
8 hash velikost je docela dobrá k nalezení obrázků, které jsou jen trochu podobné originálům. S větší sadou obrázků (>1000) to vytvoří velké množství falešných pozitivních prvků, takže doporučuji v tomto případě použít větší hash velikost.
16 je výchozí velikost hashu, což je docela dobrý kompromis mezi nalezením i trochu podobných obrázků a malým množstvím hashových kolizí.
32 a 64 hash nalezly jen velmi podobné obrázky, ale neměly by mít téměř žádné falešné pohledy (možná kromě některých obrázků s alfa kanálem).
image_resize_filter_tooltip =
Pro výpočet hash obrázku musí knihovna nejprve změnit velikost.
V závislosti na zvoleném algoritmu bude výsledný obrázek použitý k výpočtu hash vypadat trochu jinak.
Czkawka nabízí změnu velikosti generovaného hash pro každý obrázek. Větší velikost hash umožňuje najít obrázky s nižším množstvím rozdílů mezi obrázky, ale je také poněkud pomalejší.
Nejrychlejší algoritmus k používání, ale také ten, který dává nejhorší výsledky, je blízko. Ve výchozím nastavení je povoleno, protože s menší kvalitou 16x16 hash není ve skutečnosti viditelná.
Výchozí hodnota pro hash je 8 bajtů, což umožňuje najít velmi podobné i různé obrázky. 16 bajtů a 32 bajtových hashů by mělo být používáno pouze pro téměř totožné obrázky. 64 byte hash by neměl být použit, kromě situací, kdy je třeba najít opravdu malé rozdíly.
image_resize_filter_tooltip = Pro výpočet hash obrázku musí knihovna nejprve změnit velikost. V závislosti na zvoleném algoritmu bude výsledný obrázek vypadat málo jinak. Nejrychlejší algoritmus k používání, ale také ten, který dává nejhorší výsledky, je blízko.
image_hash_alg_tooltip = Uživatelé si mohou vybrat z jednoho z mnoha algoritmů pro výpočet hashu. Každý z nich má silné i slabší body a někdy přinese lepší a někdy horší výsledky pro různé obrázky. Takže pro určení nejlepšího pro vás je vyžadováno ruční testování.
main_notebook_image_fast_compare = Rychlé porovnání
main_notebook_image_fast_compare_tooltip =
Urychlit hledání a porovnávání hasičů.
S velikostí hash 8x8 je doporučeno použít jiný algoritmus než nejbližší pro lepší skupiny obrázků.
image_hash_alg_tooltip =
Uživatelé si mohou vybrat z jednoho z mnoha algoritmů pro výpočet hashu.
Na rozdíl od normálního režimu - kde je každý hash porovnáván s x krát (kde x je podobnost zvolená uživatelem) - v tomto režimu, přesně bude použito jedno srovnání.
Každý má silné a slabší body a někdy přinese lepší a někdy horší výsledky pro různé obrázky.
Takže k určení nejlepšího pro vás je vyžadováno ruční testování.
big_files_mode_combobox_tooltip = Umožňuje vyhledávat malé / největší soubory
big_files_mode_label = Zaškrtnuté soubory
big_files_mode_smallest_combo_box = Nejmenší
big_files_mode_biggest_combo_box = Největší
Tato možnost je doporučena při porovnávání >10000 obrázků s jinou než 0 (Very High) podobností.
main_notebook_duplicates = Duplicitní soubory
main_notebook_empty_directories = Prázdné adresáře
main_notebook_big_files = Velké soubory
@ -124,12 +94,8 @@ main_label_max_size = Max
main_label_shown_files = Počet zobrazených souborů
main_label_resize_algorithm = Změna velikosti algoritmu
main_label_similarity = Podobnost { " " }
main_check_box_broken_files_audio = Zvuk
main_check_box_broken_files_pdf = Pdf
main_check_box_broken_files_archive = Archivovat
main_check_box_broken_files_image = Obrázek
check_button_general_same_size = Ignorovat stejnou velikost
check_button_general_same_size_tooltip = Ignorovat soubory se stejnou velikostí ve výsledcích - obvykle se jedná o 1:1 duplicitní
check_button_general_same_size_tooltip = Ignorovat výsledky souborů, které mají stejnou velikost - obvykle jde o 1:1 duplicitní
main_label_size_bytes_tooltip = Velikost souborů, které budou použity při skenování
# Upper window
upper_tree_view_included_folder_column_title = Vyhledávané složky
@ -142,20 +108,10 @@ upper_remove_included_button = Odebrat
upper_manual_add_excluded_button = Ruční přidání
upper_add_excluded_button = Přidat
upper_remove_excluded_button = Odebrat
upper_manual_add_included_button_tooltip =
Přidat název adresáře k hledání ručně.
Chcete-li přidat více cest najednou, oddělte je od ;
/home/roman;/home/rozkaz přidá dva adresáře /home/roman a /home/rozkaz
upper_manual_add_included_button_tooltip = Přidat název adresáře k hledání ručně.
upper_add_included_button_tooltip = Přidat nový adresář k vyhledávání.
upper_remove_included_button_tooltip = Odstranit adresář z hledání.
upper_manual_add_excluded_button_tooltip =
Přidejte ručně název vyloučené adresáře.
Chcete-li přidat více cest najednou, oddělte je od ;
/home/roman;/home/krokiet přidá dva adresáře /home/roman a /home/keokiet
upper_manual_add_excluded_button_tooltip = Přidejte ručně název vyloučené adresáře.
upper_add_excluded_button_tooltip = Přidat adresář, který bude při hledání vyloučen.
upper_remove_excluded_button_tooltip = Odstranit adresář z vyloučení.
upper_notebook_items_configuration = Konfigurace položek
@ -167,16 +123,11 @@ upper_allowed_extensions_tooltip =
Následující makra, která přidávají více rozšíření najednou, jsou také k dispozici: IMAGE, VIDEO, MUSIC, TEXT.
Příklad použití ".exe, IMAGE, VIDEO, .rar, 7z" - to znamená, že obrázky (např. . jpg, png), videa (např. avi, mp4), exe, rar a 7z soubory budou naskenovány.
upper_excluded_extensions_tooltip =
Seznam zakázaných souborů, které budou při skenování ignorovány.
Při používání povolených i zakázaných přípon, má tato vyšší prioritu, takže soubor nebude zaškrtnut.
upper_excluded_items_tooltip =
Vyloučené položky musí obsahovat * zástupné znaky a měly by být odděleny čárkami.
To je pomalejší než vyloučené adresáře, proto je používáme opatrně.
upper_excluded_items = Vyloučené položky:
upper_allowed_extensions = Povolená rozšíření:
upper_excluded_extensions = Zakázané rozšíření:
# Popovers
popover_select_all = Vybrat vše
popover_unselect_all = Odznačit vše
@ -225,11 +176,6 @@ popover_custom_case_sensitive_check_button = Rozlišit malá a velká písmena
popover_custom_all_in_group_label = Nesbírat všechny záznamy ve skupině
popover_custom_mode_unselect = Zrušit výběr vlastních
popover_custom_mode_select = Vybrat vlastní
popover_sort_file_name = Název souboru
popover_sort_folder_name = Název adresáře
popover_sort_full_name = Jméno a příjmení
popover_sort_size = Velikost
popover_sort_selection = Výběr
popover_invalid_regex = Regex je neplatný
popover_valid_regex = Regex je platný
# Bottom buttons
@ -240,7 +186,6 @@ bottom_save_button = Uložit
bottom_symlink_button = Symlink
bottom_hardlink_button = Hardlink
bottom_move_button = Přesunout
bottom_sort_button = Seřadit
bottom_search_button_tooltip = Začít hledání
bottom_select_button_tooltip = Vyberte záznamy. Pouze vybrané soubory/složky mohou být později zpracovány.
bottom_delete_button_tooltip = Odstranit vybrané soubory/složky.
@ -253,21 +198,14 @@ bottom_hardlink_button_tooltip =
Vytvořit hardwarové odkazy.
Funguje pouze tehdy, pokud jsou vybrány alespoň dva výsledky ve skupině.
Nejprve je nezměněna a druhé a později jsou těžce propojeny s prvními.
bottom_hardlink_button_not_available_tooltip =
Vytvořit hardwarové odkazy.
Tlačítko je zakázáno, protože hardwarové odkazy nelze vytvořit.
Hardlinky fungují pouze s oprávněními administrátora v systému Windows, tak se ujistěte, že používáte aplikaci jako administrátora.
Pokud aplikace s takovými oprávněními již funguje, podívejte se na podobné problémy na Githubu.
bottom_move_button_tooltip =
Přesune soubory do vybraného adresáře.
Zkopíruje všechny soubory do adresáře bez uchování stromu adresáře.
Při pokusu přesunout dva soubory se stejným názvem do složky, druhý selže a zobrazí chybu.
bottom_sort_button_tooltip = Seřazuje soubory/složky podle zvolené metody.
bottom_show_errors_tooltip = Zobrazit/skrýt spodní textový panel.
bottom_show_upper_notebook_tooltip = Zobrazit/skrýt horní panel sešitu.
# Progress Window
progress_stop_button = Zastavit
progress_stop_additional_message = Zastavit požadavek
# About Window
about_repository_button_tooltip = Odkaz na stránku repositáře se zdrojovým kódem.
about_donation_button_tooltip = Odkaz na stránku s darováním.
@ -286,14 +224,6 @@ header_about_button_tooltip = Otevře dialog s informacemi o aplikaci.
## General
settings_number_of_threads = Počet použitých vláken
settings_number_of_threads_tooltip = Počet použitých vláken, 0 znamená, že budou použita všechna dostupná vlákna.
settings_label_restart = Pro použití nastavení je třeba restartovat aplikaci!
settings_ignore_other_filesystems = Ignorovat ostatní souborové systémy (pouze Linux)
settings_ignore_other_filesystems_tooltip =
ignoruje soubory, které nejsou ve stejném souborovém systému jako prohledávané adresáře.
Funguje stejně jako -xdev možnost najít příkaz na Linuxu
settings_save_at_exit_button_tooltip = Uložit konfiguraci do souboru při zavření aplikace.
settings_load_at_start_button_tooltip =
Načíst konfiguraci ze souboru při otevírání aplikace.
@ -338,7 +268,7 @@ settings_multiple_image_preview_checkbutton = Zobrazit náhled obrázku
settings_multiple_clear_cache_button_tooltip =
Ručně vymazat mezipaměť zastaralých položek.
Toto by mělo být použito pouze v případě, že je zakázáno automatické vymazání.
settings_multiple_clear_cache_button = Odstranit zastaralé výsledky z mezipaměti.
settings_multiple_clear_cache_button = Odstranit zastaralé výsledky z mezipaměti obrázků
## Duplicates
@ -410,20 +340,11 @@ progress_scanning_image = Hashování { $file_checked }/{ $all_files } obrázku
progress_comparing_image_hashes = Porovnávám { $file_checked }/{ $all_files } hash obrázků
progress_scanning_music_tags_end = Porovnávání značek s { $file_checked }/{ $all_files } hudebním souborem
progress_scanning_music_tags = Čtení tagů z { $file_checked }/{ $all_files } hudebního souboru
progress_scanning_music_content_end = Porovnání otisku prstu v { $file_checked }/{ $all_files } hudebního souboru
progress_scanning_music_content = Výpočet otisku prstu { $file_checked }/{ $all_files } hudebního souboru
progress_scanning_empty_folders = Skenování { $folder_number } složky
progress_scanning_size = Skenování velikosti { $file_number } souboru
progress_scanning_size_name = Skenování jména a velikosti souboru { $file_number }
progress_scanning_name = Skenování názvu souboru { $file_number }
progress_analyzed_partial_hash = Analyzován částečný hash souborů { $file_checked }/{ $all_files }
progress_analyzed_full_hash = Analyzováno úplné hash souborů { $file_checked }/{ $all_files }
progress_prehash_cache_loading = Načítání mezipaměti rozpoznání
progress_prehash_cache_saving = Ukládání mezipaměti rozpoznání
progress_hash_cache_loading = Načítání hash keše
progress_hash_cache_saving = Ukládání keše hash
progress_cache_loading = Načítání keše
progress_cache_saving = Ukládání keše
progress_current_stage = Aktuální fáze:{ " " }
progress_all_stages = Všechny etapy:{ " " }
# Saving loading
@ -448,7 +369,6 @@ saving_loading_not_valid = Nastavení "{ $data }" v aktuální verzi aplikace ne
invalid_symlink_infinite_recursion = Nekonečná rekurze
invalid_symlink_non_existent_destination = Neexistující cílový soubor
# Other
selected_all_reference_folders = Hledání nelze spustit, pokud jsou všechny adresáře nastaveny jako referenční složky
searching_for_data = Vyhledávání dat může chvíli trvat, prosím čekejte...
text_view_messages = ZPRÁVY
text_view_warnings = VAROVÁNÍ
@ -477,9 +397,8 @@ move_file_failed = Nepodařilo se přesunout soubor { $name }, důvod { $reason
move_files_title_dialog = Vyberte složku, do které chcete přesunout duplicitní soubory
move_files_choose_more_than_1_path = Lze vybrat pouze jednu cestu, aby bylo možné zkopírovat jejich duplikované soubory, vybrané { $path_number }.
move_stats = Správně přesunuto { $num_files }/{ $all_files } položek
save_results_to_file = Uloženy výsledky do txt i json souborů do složky { $name }.
save_results_to_file = Uložené výsledky do souboru { $name }
search_not_choosing_any_music = CHYBA: Musíte vybrat alespoň jedno zaškrtávací políčko s prohledáváním hudby.
search_not_choosing_any_broken_files = CHYBA: Musíte vybrat alespoň jedno zaškrtávací políčko s typem zkontrolovaných poškozených souborů.
include_folders_dialog_title = Složky, které chcete zahrnout
exclude_folders_dialog_title = Složky k vyloučení
include_manually_directories_dialog_title = Přidat adresář ručně

@ -14,31 +14,14 @@ music_bitrate_checkbox = Bitrate
music_genre_checkbox = Genre
music_length_checkbox = Dauer
music_comparison_checkbox = Ungefährer Vergleich
music_checking_by_tags = Tags
music_checking_by_content = Inhalt
same_music_seconds_label = Minimale Dauer des Fragments, in Sekunden
same_music_similarity_label = Maximaler Unterschied
same_music_tooltip =
Die Suche nach ähnlichen Musikdateien nach dem Inhalt kann über die Einstellung konfiguriert werden:
- Die minimale Fragmentzeit, nach der Musikdateien als ähnlich identifiziert werden können
- Der maximale Unterschied zwischen zwei getesteten Fragmenten
Der Schlüssel zu guten Ergebnissen ist die Suche nach sinnvollen Kombinationen dieser Parameter. für bereitgestellt.
Wenn Sie die minimale Zeit auf 5 Sekunden und den maximalen Unterschied auf 1,0 setzen, werden fast identische Fragmente in den Dateien gesucht.
Eine Zeit von 20 Sekunden und ein maximaler Unterschied von 6.0 hingegen funktioniert gut um Remix/Live-Versionen zu finden.
Standardmäßig wird jede Musikdatei miteinander verglichen, und dies kann viel Zeit in Anspruch nehmen, wenn viele Dateien getestet werden so ist es in der Regel besser, Referenzordner zu verwenden und festzulegen, welche Dateien miteinander verglichen werden sollen (mit gleicher Dateigröße Der Vergleich von Fingerabdrücken wird mindestens 4x schneller als ohne Referenzordner sein).
music_comparison_checkbox_tooltip =
Mit Hilfe von einer KI, die maschinelles Lernen nutzt, um Klammern aus Sätzen zu entfernen, wird nach ähnlichen Musikdateien gesucht. Wenn die Option aktiviert ist, werden die folgenden Dateien zum Beispiel als Duplikate betrachtet:
Mit Hilfe von einer KI, die maschinelles Lernen nutzt, um Klammern aus Phrasen zu entfernen, wird nach ähnlichen Musikdateien gesucht. Wenn die Option aktiviert ist, werden die folgenden Dateien zum Beispiel als Duplikate betrachtet:
Świędziżłób --- Świędziżłób (Remix Lato 2021)
duplicate_case_sensitive_name = Gross-/Kleinschreibung beachten
duplicate_case_sensitive_name = Gross- /kleinschreibung beachtend
duplicate_case_sensitive_name_tooltip =
Wenn aktiviert, gruppieren Sie nur Datensätze, wenn sie genau denselben Namen haben, z. żoŁD <-> Żołd
Deaktivieren dieser Option gruppiert Namen ohne zu überprüfen, ob jeder Buchstabe die gleiche Größe wie żoŁD <-> Żołd
duplicate_mode_size_name_combo_box = Größe und Name
duplicate_mode_name_combo_box = Name
duplicate_mode_size_combo_box = Größe
duplicate_mode_hash_combo_box = Hash
@ -59,39 +42,26 @@ duplicate_check_method_tooltip =
Hash - Findet Dateien mit dem gleichen Inhalt. Dieser Modus hasht die Datei und vergleicht diese Hashes, um Duplikate zu finden. Dieser Modus ist der sicherste Weg, um Duplikate zu finden. Das Tool verwendet einen Cache, daher sollten weiteren Scans der gleichen Dateien viel schneller sein als der erste.
image_hash_size_tooltip =
Jedes geprüfte Bild erzeugt einen speziellen Hash, der miteinander verglichen werden kann und ein kleiner Unterschied zwischen ihnen bedeutet, dass diese Bilder ähnlich sind.
8 Hashgröße ist sehr gut, um Bilder zu finden, die dem Original nur ein wenig ähneln. Bei einer größeren Anzahl von Bildern (>1000), wird dies eine große Anzahl falscher Positives, also empfehle ich in diesem Fall eine größere Hashgröße.
16 ist die standardmäßige Hashgröße, die einen guten Kompromiss zwischen dem Finden von kleinen ähnlichen Bildern und einer geringen Anzahl von Hash-Kollisionen darstellt.
32 und 64 Hashes finden nur sehr ähnliche Bilder, sollten aber fast keine falschen positiven Bilder haben (vielleicht mit Ausnahme einiger Bilder mit Alphakanal).
image_resize_filter_tooltip =
Um Hash des Bildes zu berechnen, muss die Bibliothek zuerst die Größe des Hashs verändern.
Czkawka bietet an, die Länge des pro Bild generierten Hashes zu verändern. Ein längerer Hash ermöglicht es, Bilder mit geringerer Anzahl von Unterschieden zu finden, verlangsamt aber die Berechnung etwas.
Abhängig vom gewählten Algorithmus sieht das resultierende Bild, das zur Hashberechnung verwendet wird, ein wenig anders aus.
Der Standardwert für die Hashlänge ist 8 Byte, was es ermöglicht sowohl sehr ähnliche Bilder als auch sehr unterschiedliche zu finden. 16 und 32 Byte sollten nur für nahezu identische Bilder verwendet werden, 64 Byte Hashlänge nur, um "mikroskopisch" kleine Unterschiede zu finden.
image_resize_filter_tooltip = Um den Hash des Bildes zu berechnen, muss die Bibliothek zuerst die Größe des Bildes verändern. Abhängig vom gewählten Algorithmus sieht das Ergebnis wenig anders aus. Der schnellste Algorithmus zu verwenden, aber auch einer, der die schlechtesten Ergebnisse gibt ist in der Nähe.
image_hash_alg_tooltip = Benutzer können einen von mehreren Algorithmen zur Berechnung des Hashes auswählen. Jeder hat sowohl Vor- als auch Nachteile und erzeugt manchmal bessere und manchmal schlechtere Ergebnisse für verschiedene Bilder. Um den besten für Sie auszuwählen, ist eine manuelle Prüfung erforderlich.
main_notebook_image_fast_compare = Schneller Vergleich
main_notebook_image_fast_compare_tooltip =
Beschleunige die Suche und den Vergleich von Hashes.
Der schnellste zu verwendende Algorithmus, aber auch der, der die schlechtesten Ergebnisse liefert, ist in der Nähe. Sie ist standardmäßig aktiviert, da sie mit 16x16 Hash-Größe nicht wirklich sichtbar ist.
Im Gegensatz zum normalen Modus, in dem jeder Hash x-mal mit allen anderen verglichen wird (wobei x die Ähnlichkeit ist, die der Benutzer wählt) - wird in diesem Modus immer nur ein Vergleich verwendet.
Mit 8x8 Hashgröße wird empfohlen, einen anderen Algorithmus als nahe zu verwenden, um bessere Gruppen von Bildern zu haben.
image_hash_alg_tooltip =
Benutzer können aus einem von vielen Algorithmen zur Berechnung des Hashs wählen.
Jeder hat sowohl starke als auch schwächere Punkte und wird manchmal bessere und manchmal schlechtere Ergebnisse für verschiedene Bilder liefern.
Um also den besten für Sie zu ermitteln, ist eine manuelle Prüfung erforderlich.
big_files_mode_combobox_tooltip = Erlaubt die Suche nach kleinsten/größten Dateien
big_files_mode_label = Überprüfte Dateien
big_files_mode_smallest_combo_box = Die kleinsten
big_files_mode_biggest_combo_box = Die größten
main_notebook_duplicates = Gleiche Dateien
Diese Option wird empfohlen, wenn >10000 Bilder nicht mit 0 (sehr hoher) Ähnlichkeit verglichen werden.
main_notebook_duplicates = Dateien duplizieren
main_notebook_empty_directories = Leere Verzeichnisse
main_notebook_big_files = Große Dateien
main_notebook_empty_files = Leere Dateien
main_notebook_temporary = Temporäre Dateien
main_notebook_similar_images = Ähnliche Bilder
main_notebook_similar_videos = Ähnliche Videos
main_notebook_same_music = Gleiche Musik
main_notebook_same_music = Musik Duplikate
main_notebook_symlinks = Ungültige Symlinks
main_notebook_broken_files = Defekte Dateien
main_notebook_bad_extensions = Falsche Erweiterungen
@ -123,15 +93,11 @@ main_label_max_size = Max
main_label_shown_files = Anzahl der angezeigten Dateien
main_label_resize_algorithm = Algorithmus skalieren
main_label_similarity = Ähnlichkeit{ " " }
main_check_box_broken_files_audio = Ton
main_check_box_broken_files_pdf = Pdf
main_check_box_broken_files_archive = Archiv
main_check_box_broken_files_image = Bild
check_button_general_same_size = Gleiche Größe ignorieren
check_button_general_same_size_tooltip = Ignoriere Dateien mit identischer Größe in den Ergebnissen - in der Regel sind es 1:1 Duplikate
check_button_general_same_size_tooltip = Ignoriere von Ergebnissen, Dateien mit identischer Größe - normalerweise sind dies 1:1 Duplikate
main_label_size_bytes_tooltip = Größe der Dateien, die beim Scannen verwendet werden
# Upper window
upper_tree_view_included_folder_column_title = Zu durchsuchende Ordner
upper_tree_view_included_folder_column_title = Zu suchende Ordner
upper_tree_view_included_reference_column_title = Referenzordner
upper_recursive_button = Rekursiv
upper_recursive_button_tooltip = Falls ausgewählt, suchen Sie auch nach Dateien, die nicht direkt unter den ausgewählten Ordnern platziert werden.
@ -141,41 +107,26 @@ upper_remove_included_button = Entfernen
upper_manual_add_excluded_button = Manuell hinzufügen
upper_add_excluded_button = Neu
upper_remove_excluded_button = Entfernen
upper_manual_add_included_button_tooltip =
Verzeichnisname zur Suche per Hand hinzufügen.
Um mehrere Pfade gleichzeitig hinzuzufügen, trennen Sie sie durch ;
/home/roman;/home/rozkaz fügt zwei Verzeichnisse /home/roman und /home/rozkaz hinzu
upper_manual_add_included_button_tooltip = Verzeichnis zur Suche manuell hinzufügen.
upper_add_included_button_tooltip = Neues Verzeichnis zur Suche hinzufügen.
upper_remove_included_button_tooltip = Verzeichnis von der Suche löschen.
upper_manual_add_excluded_button_tooltip =
Ausgeschlossenen Verzeichnisnamen per Hand hinzufügen.
Um mehrere Pfade gleichzeitig hinzuzufügen, trennen Sie sie durch ;
/home/roman;/home/krokiet wird zwei Verzeichnisse /home/roman und /home/keokiet hinzufügen
upper_manual_add_excluded_button_tooltip = Verzeichnis manuell von der Suche ausschließen.
upper_add_excluded_button_tooltip = Verzeichnis hinzufügen, das bei der Suche ausgeschlossen werden soll.
upper_remove_excluded_button_tooltip = Ausgeschlossene Verzeichnisse löschen.
upper_notebook_items_configuration = Suchbedingungen
upper_remove_excluded_button_tooltip = Verzeichnis von ausgeschlossen löschen.
upper_notebook_items_configuration = Artikelkonfiguration
upper_notebook_excluded_directories = Ausgeschlossene Verzeichnisse
upper_notebook_included_directories = Einbezogene Verzeichnisse
upper_notebook_included_directories = Inklusive Verzeichnisse
upper_allowed_extensions_tooltip =
Erlaubte Erweiterungen müssen durch Kommas getrennt werden (standardmäßig sind alle verfügbar).
Folgende Makros, die mehrere Erweiterungen gleichzeitig hinzufügen, sind ebenfalls verfügbar: IMAGE, VIDEO, MUSIC, TEXT.
Nutzungsbeispiel ".exe, IMAGE, VIDEO, .rar, 7z" - bedeutet, dass Bilder (jpg, png ...), Videodateien (avi, mp4 ...), exe, rar und 7z gescannt werden.
upper_excluded_extensions_tooltip =
Liste der deaktivierten Dateien, die beim Scannen ignoriert werden.
Wenn sowohl erlaubte als auch deaktivierte Erweiterungen verwendet werden, hat diese eine höhere Priorität, so dass die Datei nicht ausgewählt wird.
upper_excluded_items_tooltip =
Ausgeschlossene Elemente müssen * als Platzhalter enthalten und durch Kommata getrennt werden.
Dies ist langsamer als Verzeichnisse auszuschließen, daher mit Vorsicht verwenden.
upper_excluded_items = Ausgeschlossene Elemente:
upper_allowed_extensions = Erlaubte Erweiterungen:
upper_excluded_extensions = Deaktivierte Erweiterungen:
# Popovers
popover_select_all = Alles auswählen
popover_unselect_all = Gesamte Auswahl aufheben
@ -224,11 +175,6 @@ popover_custom_case_sensitive_check_button = Groß-/Kleinschreibung beachten
popover_custom_all_in_group_label = Nicht alle Datensätze in der Gruppe auswählen
popover_custom_mode_unselect = Eigene Abwählen
popover_custom_mode_select = Eigene auswählen
popover_sort_file_name = Dateiname
popover_sort_folder_name = Verzeichnisname
popover_sort_full_name = Vollständiger Name
popover_sort_size = Größe
popover_sort_selection = Auswahl
popover_invalid_regex = Regex ist ungültig
popover_valid_regex = Regex ist gültig
# Bottom buttons
@ -239,7 +185,6 @@ bottom_save_button = Speichern
bottom_symlink_button = Symlink
bottom_hardlink_button = Hardlink
bottom_move_button = Bewegen
bottom_sort_button = Sortierung
bottom_search_button_tooltip = Suche starten
bottom_select_button_tooltip = Datensätze auswählen. Nur ausgewählte Dateien/Ordner können später verarbeitet werden.
bottom_delete_button_tooltip = Ausgewählte Dateien/Ordner löschen.
@ -252,21 +197,14 @@ bottom_hardlink_button_tooltip =
Erstelle Hardlinks.
Funktioniert nur, wenn mindestens zwei Ergebnisse einer Gruppe ausgewählt sind.
Das Erste bleibt dabei unverändert, und das Zweite und alle Weiteren werden zu Hardlinks auf das Erste umgewandelt.
bottom_hardlink_button_not_available_tooltip =
Erstellen von Hardlinks.
Button ist deaktiviert, da Hardlinks nicht erstellt werden können.
Hardlinks funktionieren nur mit Administratorrechten unter Windows, also stellen Sie sicher, dass Sie die App als Administrator ausführen.
Wenn die App bereits mit solchen Rechten arbeitet, überprüfen Sie auf Github auf ähnliche Probleme.
bottom_move_button_tooltip =
Verschiebt Dateien in den ausgewählten Ordner.
Kopiert alle Dateien in den Ordner, ohne den Verzeichnisbaum zu erhalten.
Beim Versuch, zwei Dateien mit identischem Namen in einen Ordner zu verschieben, schlägt das Kopieren der Zweiten fehl und zeigt einen Fehler an.
bottom_sort_button_tooltip = Sortiert Dateien/Ordner nach der gewählten Methode.
bottom_show_errors_tooltip = Ein-/Ausblenden des unteren Textfeldes.
bottom_show_upper_notebook_tooltip = Ein-/Ausblenden des oberen Notizbuch-Panels.
# Progress Window
progress_stop_button = Stoppen
progress_stop_additional_message = Stopp angefordert
# About Window
about_repository_button_tooltip = Link zur Repository-Seite mit Quellcode.
about_donation_button_tooltip = Link zur Spendenseite.
@ -285,14 +223,6 @@ header_about_button_tooltip = Öffnet den Dialog mit Informationen über die App
## General
settings_number_of_threads = Anzahl der verwendeten Threads
settings_number_of_threads_tooltip = Anzahl der verwendeten Threads, 0 bedeutet, dass alle verfügbaren Threads verwendet werden.
settings_label_restart = Sie müssen die App neu starten, um die Einstellungen anzuwenden!
settings_ignore_other_filesystems = Andere Dateisysteme ignorieren (nur Linux)
settings_ignore_other_filesystems_tooltip =
ignoriert Dateien, die nicht im selben Dateisystem sind wie durchsuchte Verzeichnisse.
Funktioniert genauso wie die -xdev Option beim Finden des Befehls unter Linux
settings_save_at_exit_button_tooltip = Speichert die Konfiguration in einer Datei, wenn das Programm geschlossen wird.
settings_load_at_start_button_tooltip =
Konfiguration aus der Datei laden, wenn App geöffnet wird.
@ -337,7 +267,7 @@ settings_multiple_image_preview_checkbutton = Bildvorschau anzeigen
settings_multiple_clear_cache_button_tooltip =
Leere den Cache manuell aus veralteten Einträgen.
Das sollte nur verwendet werden, wenn das automatische Löschen deaktiviert wurde.
settings_multiple_clear_cache_button = Entferne veraltete Ergebnisse aus dem Cache.
settings_multiple_clear_cache_button = Entferne veraltete Ergebnisse aus dem Bildercache
## Duplicates
@ -401,39 +331,30 @@ compute_found_invalid_symlinks = { $number_files } ungültige Symlinks gefunden
compute_found_broken_files = { $number_files } fehlerhafte Dateien gefunden
compute_found_bad_extensions = { $number_files } Dateien mit ungültigen Endungen gefunden
# Progress window
progress_scanning_general_file = Scanne { $file_number } Dateien
progress_scanning_general_file = Scanne { $file_number } Datei
progress_scanning_extension_of_files = Überprüfe Erweiterung von { $file_checked }/{ $all_files } Datei
progress_scanning_broken_files = Überprüfe { $file_checked }/{ $all_files } Datei
progress_scanning_video = Hashwerte für Videos berechnet: { $file_checked }/{ $all_files }
progress_scanning_image = Hashwerte für Bilder berechnet:{ $file_checked }/{ $all_files }
progress_scanning_video = Hashing von { $file_checked }/{ $all_files } Video
progress_scanning_image = Hashing von { $file_checked }/{ $all_files } Bild
progress_comparing_image_hashes = Vergleicht { $file_checked }/{ $all_files } Bild-Hash
progress_scanning_music_tags_end = Vergleicht Tags von { $file_checked }/{ $all_files } Musikdatei
progress_scanning_music_tags = Lese Tags von { $file_checked }/{ $all_files } Musikdatei
progress_scanning_music_content_end = Vergleiche Fingerabdruck von { $file_checked }/{ $all_files } Musikdatei
progress_scanning_music_content = Berechne Fingerabdruck von { $file_checked }/{ $all_files } Musikdatei
progress_scanning_empty_folders = Scanne { $folder_number } Ordner
progress_scanning_size = Scanne Größe der { $file_number } Dateien
progress_scanning_size_name = Scanne Namen und Größe der { $file_number } Dateien
progress_scanning_name = Scanne Name der { $file_number } Dateien
progress_analyzed_partial_hash = Teilhash von { $file_checked }/{ $all_files } Dateien analysiert
progress_analyzed_full_hash = Vollen Hash von { $file_checked } von { $all_files } Dateien analysiert
progress_prehash_cache_loading = Lade Vorhash-Cache
progress_prehash_cache_saving = Speichere Vorhash-Cache
progress_hash_cache_loading = Hash-Cache wird geladen
progress_hash_cache_saving = Speichere Hash-Cache
progress_cache_loading = Cache wird geladen
progress_cache_saving = Cache speichern
progress_current_stage = Aktueller Prozess:{ " " }
progress_all_stages = Gesamtprozess:{ " " }
progress_scanning_size = Scanne Größe der { $file_number } Datei
progress_scanning_name = Scanne Name der { $file_number } Datei
progress_analyzed_partial_hash = Analysierter Teilhash von { $file_checked }/{ $all_files } Dateien
progress_analyzed_full_hash = Analysiert voller Hash von { $file_checked }/{ $all_files } Dateien
progress_current_stage = Aktuelle Stufe:{ " " }
progress_all_stages = Alle Stufen:{ " " }
# Saving loading
saving_loading_saving_success = Konfiguration in Datei { $name } gespeichert.
saving_loading_saving_failure = Konfigurationsdaten konnten nicht in Datei { $name } gespeichert werden.
saving_loading_reset_configuration = Aktuelle Konfiguration wurde gelöscht.
saving_loading_loading_success = Richtig geladene App-Konfiguration.
saving_loading_invalid_string = Für Schlüssel "{ $key }" ungültiges Ergebnis gefunden: "{ $result }", welches keine Zeichenkette ist.
saving_loading_invalid_int = Für Schlüssel "{ $key }" ungültiges Ergebnis gefunden: "{ $result }", welches keine ganze Zahl ist.
saving_loading_invalid_bool = Für Schlüssel "{ $key }" ungültiges Ergebnis gefunden: "{ $result }", welches kein Boolean ist.
saving_loading_decode_problem_bool = Fehler beim Dekodieren von Schlüssel "{ $key }" gefunden: "{ $result }". Erlaubte Werte sind: 0, 1, true oder false.
saving_loading_invalid_string = Für Schlüssel "{ $key }" fand ungültiges Ergebnis - "{ $result }" das keine Zeichenkette ist.
saving_loading_invalid_int = Für Schlüssel "{ $key }" fand ungültiges Ergebnis - "{ $result }" das keine ganze Zahl ist.
saving_loading_invalid_bool = Für Schlüssel "{ $key }" fand ungültiges Ergebnis - "{ $result }" das kein Bool.
saving_loading_decode_problem_bool = Fehler beim Dekodieren des Bools von Schlüssel "{ $key }" gefunden "{ $result }" aber erlaubte Werte sind 0, 1, true oder false.
saving_loading_saving_same_keys = Versucht die Einstellung mit doppelter Taste "{ $key } " zu speichern.
saving_loading_failed_to_get_home_directory = Home-Verzeichnis konnte nicht zum Öffnen und Speichern der Konfigurationsdatei geladen werden.
saving_loading_folder_config_instead_file = Konfigurationsdatei im Pfad "{ $path }" kann nicht erstellt oder geöffnet werden, da bereits ein Ordner vorhanden ist.
@ -447,12 +368,11 @@ saving_loading_not_valid = Einstellung "{ $data }" existiert nicht in der aktuel
invalid_symlink_infinite_recursion = Endlose Rekursion
invalid_symlink_non_existent_destination = Nicht existierende Zieldatei
# Other
selected_all_reference_folders = Suche kann nicht gestartet werden, wenn alle Verzeichnisse als Referenzordner gesetzt sind
searching_for_data = Suche nach Daten, es kann eine Weile dauern, bitte warten...
text_view_messages = NACHRICHT
text_view_warnings = WARNUNGEN
text_view_errors = FEHLER
about_window_motto = Dieses Programm ist kostenlos zu benutzen und wird immer frei sein.
about_window_motto = Dieses Programm ist kostenlos zu benutzen und wird es immer sein.
# Various dialog
dialogs_ask_next_time = Nächstes Mal fragen
delete_file_failed = Fehler beim Entfernen der Datei { $name }, aufgrund von { $reason }
@ -476,16 +396,15 @@ move_file_failed = Fehler beim Verschieben der Datei { $name }, Grund { $reason
move_files_title_dialog = Wählen Sie den Ordner aus, in den Sie doppelte Dateien verschieben möchten
move_files_choose_more_than_1_path = Es darf nur ein Pfad ausgewählt sein, um Duplikate von dort kopieren zu können, ausgewählt sind { $path_number }.
move_stats = { $num_files }/{ $all_files } Elemente korrekt verschoben
save_results_to_file = Ergebnisse sowohl in txt als auch in json Dateien in den Ordner { $name } gespeichert.
save_results_to_file = Ergebnisse in Datei { $name } gespeichert
search_not_choosing_any_music = FEHLER: Sie müssen mindestens ein Kontrollkästchen mit Art der Musiksuche auswählen.
search_not_choosing_any_broken_files = FEHLER: Sie müssen mindestens ein Kontrollkästchen mit der Art der markierten fehlerhaften Dateien auswählen.
include_folders_dialog_title = Einbezogene Ordner
exclude_folders_dialog_title = Ausgeschlossene Ordner
include_manually_directories_dialog_title = Verzeichnis manuell hinzufügen
cache_properly_cleared = Cache vollständig geleert
cache_clear_duplicates_title = Leere Duplikate-Cache
cache_clear_similar_images_title = Leere Bilder-Cache
cache_clear_similar_videos_title = Leere Video-Cache
cache_properly_cleared = Richtig geleerter Cache
cache_clear_duplicates_title = Leere Duplikaten-Cache
cache_clear_similar_images_title = Leere ähnlichen Bildercache
cache_clear_similar_videos_title = Lösche ähnlichen Videocache
cache_clear_message_label_1 = Wollen Sie veraltete Einträge aus dem Cache löschen?
cache_clear_message_label_2 = Dieser Vorgang entfernt alle Cache-Einträge, die auf ungültige Dateien verweisen.
cache_clear_message_label_3 = Dies kann das Laden und Speichern zum Cache leicht beschleunigen.

@ -1,500 +0,0 @@
# Window titles
window_settings_title = Ρυθμίσεις
window_main_title = Czkawka (Hiccup)
window_progress_title = Σάρωση
window_compare_images = Σύγκριση Εικόνων
# General
general_ok_button = Εντάξει
general_close_button = Κλείσιμο
# Main window
music_title_checkbox = Τίτλος
music_artist_checkbox = Καλλιτέχνης
music_year_checkbox = Έτος
music_bitrate_checkbox = Ρυθμός Bit
music_genre_checkbox = Είδος
music_length_checkbox = Μήκος
music_comparison_checkbox = Κατά Προσέγγιση Σύγκριση
music_checking_by_tags = Ετικέτες
music_checking_by_content = Περιεχόμενο
same_music_seconds_label = Ελάχιστη δεύτερη διάρκεια θραύσματος
same_music_similarity_label = Μέγιστη διαφορά
same_music_tooltip =
Η αναζήτηση παρόμοιων αρχείων μουσικής με βάση το περιεχόμενό του μπορεί να ρυθμιστεί με τη ρύθμιση:
- Ο ελάχιστος χρόνος θραύσματος μετά το οποίο τα αρχεία μουσικής μπορούν να προσδιοριστούν ως παρόμοια
- Η μέγιστη διαφορά διαφοράς μεταξύ δύο δοκιμαζόμενων θραυσμάτων
Το κλειδί για καλά αποτελέσματα είναι να βρεθούν λογικοί συνδυασμοί αυτών των παραμέτρων, για παρέχονται.
Ο ορισμός του ελάχιστου χρόνου σε 5s και η μέγιστη διαφορά σε 1.0, θα αναζητήσει σχεδόν πανομοιότυπα θραύσματα στα αρχεία.
Ένας χρόνος 20 δευτερολέπτων και μια μέγιστη διαφορά 6.0, από την άλλη πλευρά, λειτουργεί καλά για την εύρεση remixes/live εκδόσεις κλπ.
Από προεπιλογή, κάθε αρχείο μουσικής συγκρίνεται μεταξύ τους και αυτό μπορεί να πάρει πολύ χρόνο κατά τη δοκιμή πολλών αρχείων, έτσι είναι συνήθως καλύτερο να χρησιμοποιήσετε φακέλους αναφοράς και να προσδιορίσετε ποια αρχεία πρέπει να συγκρίνονται μεταξύ τους (με την ίδια ποσότητα αρχείων, η σύγκριση των δακτυλικών αποτυπωμάτων θα είναι γρηγορότερη τουλάχιστον 4x από ό, τι χωρίς φακέλους αναφοράς).
music_comparison_checkbox_tooltip =
Ψάχνει για παρόμοια αρχεία μουσικής χρησιμοποιώντας AI, το οποίο χρησιμοποιεί μηχανική μάθηση για να αφαιρέσει παρένθεση από μια φράση. Για παράδειγμα, με αυτήν την επιλογή ενεργοποιημένη, τα εν λόγω αρχεία θα θεωρούνται διπλότυπα:
Swieald dzizśłob --- Swieřdzizłob (Remix Lato 2021)
duplicate_case_sensitive_name = Διάκριση Πεζών/ Κεφαλαίων
duplicate_case_sensitive_name_tooltip =
When enabled, group only records when they have exactly same name e.g. Żołd <-> Żołd
Disabling such option will group names without checking if each letter is same size e.g. żoŁD <-> Żołd
duplicate_mode_size_name_combo_box = Μέγεθος και όνομα
duplicate_mode_name_combo_box = Όνομα
duplicate_mode_size_combo_box = Μέγεθος
duplicate_mode_hash_combo_box = Κατακερματισμός
duplicate_hash_type_tooltip =
Czkawka προσφέρει 3 τύπους hashes:
Blake3 - λειτουργία κρυπτογραφικού hash. Αυτή είναι η προεπιλογή επειδή είναι πολύ γρήγορη.
CRC32 - απλή συνάρτηση hash. Αυτό θα πρέπει να είναι πιο γρήγορα από Blake3, αλλά μπορεί πολύ σπάνια να έχει κάποιες συγκρούσεις.
XXH3 - πολύ παρόμοιο στην απόδοση και την ποιότητα hash με Blake3 (αλλά μη κρυπτογραφικό).
duplicate_check_method_tooltip =
Προς το παρόν, Czkawka προσφέρει τρεις τύπους μεθόδου για να βρείτε αντίγραφα από:
Όνομα - Εύρεση αρχείων που έχουν το ίδιο όνομα.
Μέγεθος - Εύρεση αρχείων με το ίδιο μέγεθος.
Hash - Εύρεση αρχείων με το ίδιο περιεχόμενο. Αυτή η λειτουργία κατακερματίζει το αρχείο και αργότερα συγκρίνει αυτό το κατακερματισμό για να βρείτε διπλότυπα. Αυτή η λειτουργία είναι ο ασφαλέστερος τρόπος για να βρείτε διπλότυπα. Η εφαρμογή χρησιμοποιεί βαριά κρύπτη, έτσι ώστε η δεύτερη και περαιτέρω σάρωση των ίδιων δεδομένων θα πρέπει να είναι πολύ πιο γρήγορα από την πρώτη.
image_hash_size_tooltip =
Κάθε επιλεγμένη εικόνα παράγει ένα ειδικό hash το οποίο μπορεί να συγκριθεί μεταξύ τους, και μια μικρή διαφορά μεταξύ τους σημαίνει ότι αυτές οι εικόνες είναι παρόμοια.
8 μέγεθος hash είναι αρκετά καλό να βρείτε εικόνες που είναι μόνο λίγο παρόμοια με το πρωτότυπο. Με ένα μεγαλύτερο σύνολο εικόνων (>1000), αυτό θα παράγει ένα μεγάλο ποσό ψευδών θετικών, γι 'αυτό συνιστώ να χρησιμοποιήσετε ένα μεγαλύτερο μέγεθος hash σε αυτή την περίπτωση.
16 είναι το προεπιλεγμένο μέγεθος hash το οποίο είναι ένας αρκετά καλός συμβιβασμός ανάμεσα στην εύρεση ακόμη και λίγο παρόμοιες εικόνες και έχει μόνο μια μικρή ποσότητα συγκρούσεων hash.
32 και 64 hashes βρείτε μόνο παρόμοιες εικόνες, αλλά θα πρέπει να έχουν σχεδόν καμία ψευδή θετικά (ίσως εκτός από μερικές εικόνες με άλφα κανάλι).
image_resize_filter_tooltip =
Για να υπολογιστεί το hash της εικόνας, η βιβλιοθήκη πρέπει πρώτα να το αλλάξει μέγεθος.
Εξαρτάται από τον επιλεγμένο αλγόριθμο, η προκύπτουσα εικόνα που χρησιμοποιείται για τον υπολογισμό του hash θα φαίνεται λίγο διαφορετική.
Ο γρηγορότερος αλγόριθμος που χρησιμοποιείται, αλλά και εκείνος που δίνει τα χειρότερα αποτελέσματα, είναι ο Nearest. Είναι ενεργοποιημένη από προεπιλογή, επειδή με μέγεθος 16x16 hash χαμηλότερη ποιότητα δεν είναι πραγματικά ορατή.
Με μέγεθος κατακερματισμού 8x8 συνιστάται να χρησιμοποιήσετε διαφορετικό αλγόριθμο από το Nearest, για να έχετε καλύτερες ομάδες εικόνων.
image_hash_alg_tooltip =
Users can choose from one of many algorithms of calculating the hash.
Each has both strong and weaker points and will sometimes give better and sometimes worse results for different images.
So, to determine the best one for you, manual testing is required.
big_files_mode_combobox_tooltip = Επιτρέπει την αναζήτηση για μικρότερα/μεγαλύτερα αρχεία
big_files_mode_label = Ελεγχμένα αρχεία
big_files_mode_smallest_combo_box = Το Μικρότερο
big_files_mode_biggest_combo_box = Το Μεγαλύτερο
main_notebook_duplicates = Αντίγραφο Αρχείων
main_notebook_empty_directories = Άδειοι Κατάλογοι
main_notebook_big_files = Μεγάλα Αρχεία
main_notebook_empty_files = Κενά Αρχεία
main_notebook_temporary = Προσωρινά Αρχεία
main_notebook_similar_images = Παρόμοιες Εικόνες
main_notebook_similar_videos = Παρόμοια Βίντεο
main_notebook_same_music = Αντίγραφο Μουσικής
main_notebook_symlinks = Μη Έγκυρα Symlinks
main_notebook_broken_files = Κατεστραμμένα Αρχεία
main_notebook_bad_extensions = Εσφαλμένες Επεκτάσεις
main_tree_view_column_file_name = Όνομα Αρχείου
main_tree_view_column_folder_name = Όνομα Φακέλου
main_tree_view_column_path = Διαδρομή
main_tree_view_column_modification = Ημερομηνία Τροποποίησης
main_tree_view_column_size = Μέγεθος
main_tree_view_column_similarity = Ομοιότητα
main_tree_view_column_dimensions = Διαστάσεις
main_tree_view_column_title = Τίτλος
main_tree_view_column_artist = Καλλιτέχνης
main_tree_view_column_year = Έτος
main_tree_view_column_bitrate = Ρυθμός Bit
main_tree_view_column_length = Μήκος
main_tree_view_column_genre = Είδος
main_tree_view_column_symlink_file_name = Όνομα Αρχείου Συντόμευσης
main_tree_view_column_symlink_folder = Φάκελος Συντόμευσης
main_tree_view_column_destination_path = Διαδρομή Προορισμού
main_tree_view_column_type_of_error = Τύπος Σφάλματος
main_tree_view_column_current_extension = Τρέχουσα Επέκταση
main_tree_view_column_proper_extensions = Κατάλληλη Επέκταση
main_label_check_method = Έλεγχος μεθόδου
main_label_hash_type = Τύπος κατακερματισμού
main_label_hash_size = Μέγεθος κατακερματισμού
main_label_size_bytes = Μέγεθος (bytes)
main_label_min_size = Ελάχιστο
main_label_max_size = Μέγιστο
main_label_shown_files = Αριθμός εμφανιζόμενων αρχείων
main_label_resize_algorithm = Αλλαγή μεγέθους αλγορίθμου
main_label_similarity = Similarity{ " " }
main_check_box_broken_files_audio = Ήχος
main_check_box_broken_files_pdf = PDF
main_check_box_broken_files_archive = Αρχειοθέτηση
main_check_box_broken_files_image = Εικόνα
check_button_general_same_size = Αγνόηση ίδιου μεγέθους
check_button_general_same_size_tooltip = Αγνοήστε τα αρχεία με το ίδιο μέγεθος στα αποτελέσματα - συνήθως αυτά είναι 1: 1 διπλότυπα
main_label_size_bytes_tooltip = Μέγεθος αρχείων που θα χρησιμοποιηθούν κατά τη σάρωση
# Upper window
upper_tree_view_included_folder_column_title = Φάκελοι προς αναζήτηση
upper_tree_view_included_reference_column_title = Φάκελοι Αναφοράς
upper_recursive_button = Αναδρομικά
upper_recursive_button_tooltip = Αν επιλεχθεί, αναζητήστε επίσης αρχεία που δεν τοποθετούνται απευθείας σε επιλεγμένους φακέλους.
upper_manual_add_included_button = Χειροκίνητη Προσθήκη
upper_add_included_button = Προσθήκη
upper_remove_included_button = Αφαίρεση
upper_manual_add_excluded_button = Χειροκίνητη Προσθήκη
upper_add_excluded_button = Προσθήκη
upper_remove_excluded_button = Αφαίρεση
upper_manual_add_included_button_tooltip =
Προσθήκη ονόματος καταλόγου στην αναζήτηση με το χέρι.
Για να προσθέσετε πολλαπλές διαδρομές ταυτόχρονα, διαχωρίστε τις με το ;
/home/roman;/home/rozkaz θα προσθέσετε δύο καταλόγους /home/roman και /home/rozkaz
upper_add_included_button_tooltip = Προσθήκη νέου φακέλου για αναζήτηση.
upper_remove_included_button_tooltip = Διαγραφή καταλόγου από την αναζήτηση.
upper_manual_add_excluded_button_tooltip =
Προσθήκη εξαιρούμενου ονόματος καταλόγου με το χέρι.
Για να προσθέσετε πολλαπλές διαδρομές ταυτόχρονα, διαχωρίστε τις με το ;
/home/roman;/home/krokiet θα προσθέσει δύο καταλόγους /home/roman και /home/keokiet
upper_add_excluded_button_tooltip = Προσθήκη καταλόγου για να αποκλειστεί στην αναζήτηση.
upper_remove_excluded_button_tooltip = Διαγραφή καταλόγου από αποκλεισμένους.
upper_notebook_items_configuration = Ρύθμιση Στοιχείων
upper_notebook_excluded_directories = Εξαιρούμενοι Κατάλογοι
upper_notebook_included_directories = Συμπεριλαμβανόμενοι Κατάλογοι
upper_allowed_extensions_tooltip =
Οι επιτρεπόμενες επεκτάσεις πρέπει να διαχωρίζονται με κόμματα (εξ ορισμού είναι διαθέσιμες).
Τα ακόλουθα Macros, τα οποία προσθέτουν πολλαπλές επεκτάσεις ταυτόχρονα, είναι επίσης διαθέσιμα: IMAGE, VIDEO, MUSIC, TEXT.
Χρήση παράδειγμα ".exe, IMAGE, VIDEO, .rar, 7z" - αυτό σημαίνει ότι οι εικόνες (π. χ. . jpg, png), βίντεο (π.χ. avi, mp4), exe, rar και 7z αρχεία θα σαρωθούν.
upper_excluded_extensions_tooltip =
Λίστα απενεργοποιημένων αρχείων που θα αγνοηθούν κατά τη σάρωση.
Όταν χρησιμοποιείτε και τις δύο επιτρεπόμενες και απενεργοποιημένες επεκτάσεις, αυτή έχει υψηλότερη προτεραιότητα, οπότε το αρχείο δεν θα ελεγχθεί.
upper_excluded_items_tooltip =
Τα εξαιρούμενα αντικείμενα πρέπει να περιέχουν * μπαλαντέρ και πρέπει να διαχωρίζονται με κόμματα.
Αυτό είναι πιο αργό από τους Αποκλεισμένους Κατάλογους, οπότε χρησιμοποιήστε το προσεκτικά.
upper_excluded_items = Εξαιρούμενα Αντικείμενα:
upper_allowed_extensions = Επιτρεπόμενες Επεκτάσεις:
upper_excluded_extensions = Απενεργοποιημένες Επεκτάσεις:
# Popovers
popover_select_all = Επιλογή όλων
popover_unselect_all = Αποεπιλογή όλων
popover_reverse = Αντίστροφη Επιλογή
popover_select_all_except_oldest = Επιλογή όλων εκτός από το παλαιότερο
popover_select_all_except_newest = Επιλογή όλων εκτός από το νεότερο
popover_select_one_oldest = Επιλέξτε ένα παλαιότερο
popover_select_one_newest = Επιλέξτε ένα νεότερο
popover_select_custom = Επιλέξτε προσαρμοσμένο
popover_unselect_custom = Αποεπιλογή προσαρμοσμένου
popover_select_all_images_except_biggest = Επιλογή όλων εκτός από το μεγαλύτερο
popover_select_all_images_except_smallest = Επιλογή όλων εκτός των μικρότερων
popover_custom_path_check_button_entry_tooltip =
Επιλέξτε εγγραφές με διαδρομή.
Παράδειγμα χρήσης:
/home/pimpek/rzecz.txt μπορεί να βρεθεί με /home/pim*
popover_custom_name_check_button_entry_tooltip =
Επιλέξτε εγγραφές με ονόματα αρχείων.
Παράδειγμα χρήσης:
/usr/ping/pong.txt μπορεί να βρεθεί με *ong*
popover_custom_regex_check_button_entry_tooltip =
Επιλέξτε εγγραφές με καθορισμένο Regex.
Με αυτή τη λειτουργία, το κείμενο αναζήτησης είναι η διαδρομή με το όνομα.
Παράδειγμα χρήσης:
/usr/bin/ziemniak. xt μπορεί να βρεθεί με /ziem[a-z]+
Αυτό χρησιμοποιεί την προεπιλεγμένη εφαρμογή Rust regex. Μπορείτε να διαβάσετε περισσότερα για αυτό εδώ: https://docs.rs/regex.
popover_custom_case_sensitive_check_button_tooltip =
Όταν απενεργοποιηθεί το /home/* βρίσκει και το /HoMe/roman και το /home/roman.
popover_custom_not_all_check_button_tooltip =
Prevents selecting all records in group.
This is enabled by default, because in most situations, you don't want to delete both original and duplicates files, but want to leave at least one file.
WARNING: This setting doesn't work if you have already manually selected all results in a group.
popover_custom_regex_path_label = Διαδρομή
popover_custom_regex_name_label = Όνομα
popover_custom_regex_regex_label = Regex Διαδρομή + Όνομα
popover_custom_case_sensitive_check_button = Διάκριση πεζών/ κεφαλαίων
popover_custom_all_in_group_label = Να μην επιλέγονται όλες οι εγγραφές στην ομάδα
popover_custom_mode_unselect = Αποεπιλογή Προσαρμοσμένου
popover_custom_mode_select = Επιλογή Προσαρμοσμένου
popover_sort_file_name = Όνομα αρχείου
popover_sort_folder_name = Όνομα φακέλου
popover_sort_full_name = Πλήρες όνομα
popover_sort_size = Μέγεθος
popover_sort_selection = Επιλογή
popover_invalid_regex = Regex δεν είναι έγκυρο
popover_valid_regex = Regex είναι έγκυρο
# Bottom buttons
bottom_search_button = Αναζήτηση
bottom_select_button = Επιλογή
bottom_delete_button = Διαγραφή
bottom_save_button = Αποθήκευση
bottom_symlink_button = Symlink
bottom_hardlink_button = Hardlink
bottom_move_button = Μετακίνηση
bottom_sort_button = Ταξινόμηση
bottom_search_button_tooltip = Έναρξη αναζήτησης
bottom_select_button_tooltip = Επιλέξτε εγγραφές. Μόνο επιλεγμένα αρχεία/φάκελοι μπορούν να υποβληθούν σε μεταγενέστερη επεξεργασία.
bottom_delete_button_tooltip = Διαγραφή επιλεγμένων αρχείων/φακέλων.
bottom_save_button_tooltip = Αποθήκευση δεδομένων σχετικά με την αναζήτηση σε αρχείο
bottom_symlink_button_tooltip =
Δημιουργία συμβολικών συνδέσμων.
Λειτουργεί μόνο όταν επιλεγούν τουλάχιστον δύο αποτελέσματα σε μια ομάδα.
Πρώτα παραμένει αμετάβλητη και δεύτερον και αργότερα συνδέεται με την πρώτη.
bottom_hardlink_button_tooltip =
Δημιουργία hardlinks.
λειτουργεί μόνο όταν επιλεγούν τουλάχιστον δύο αποτελέσματα σε μια ομάδα.
Πρώτα παραμένει αμετάβλητη και η δεύτερη και αργότερα συνδέονται σκληρά με την πρώτη.
bottom_hardlink_button_not_available_tooltip =
Δημιουργία hardlinks. Το κουμπί
είναι απενεργοποιημένο, επειδή οι hardlinks δεν μπορούν να δημιουργηθούν.
Hardlinks λειτουργεί μόνο με δικαιώματα διαχειριστή στα Windows, οπότε φροντίστε να εκτελέσετε την εφαρμογή ως διαχειριστής.
Εάν η εφαρμογή λειτουργεί ήδη με τέτοια δικαιώματα ελέγξτε για παρόμοια ζητήματα στο Github.
bottom_move_button_tooltip =
Moves files to chosen directory.
It copies all files to the directory without preserving the directory tree.
When trying to move two files with identical name to folder, second will fail and show error.
bottom_sort_button_tooltip = Ταξινόμηση αρχείων/φακέλων σύμφωνα με την επιλεγμένη μέθοδο.
bottom_show_errors_tooltip = Εμφάνιση/Απόκρυψη πίνακα κάτω κειμένου.
bottom_show_upper_notebook_tooltip = Εμφάνιση/Απόκρυψη ανώτερου πίνακα σημειωμάτων.
# Progress Window
progress_stop_button = Διακοπή
progress_stop_additional_message = Η διακοπή ζητήθηκε
# About Window
about_repository_button_tooltip = Σύνδεσμος προς σελίδα αποθετηρίου με πηγαίο κώδικα.
about_donation_button_tooltip = Σύνδεση με τη σελίδα δωρεών.
about_instruction_button_tooltip = Σύνδεσμος στη σελίδα οδηγιών.
about_translation_button_tooltip = Σύνδεσμος προς τη σελίδα του Crowdin με μεταφράσεις εφαρμογών. Υιοθετούνται επίσημα πολωνικά και αγγλικά.
about_repository_button = Αποθετήριο
about_donation_button = Δωρεά
about_instruction_button = Οδηγίες
about_translation_button = Μετάφραση
# Header
header_setting_button_tooltip = Άνοιγμα διαλόγου ρυθμίσεων.
header_about_button_tooltip = Άνοιγμα διαλόγου με πληροφορίες σχετικά με την εφαρμογή.
# Settings
## General
settings_number_of_threads = Αριθμός χρησιμοποιημένων νημάτων
settings_number_of_threads_tooltip = Αριθμός χρησιμοποιημένων νημάτων, 0 σημαίνει ότι θα χρησιμοποιηθούν όλα τα διαθέσιμα νήματα.
settings_label_restart = Πρέπει να επανεκκινήσετε την εφαρμογή για να εφαρμόσετε τις ρυθμίσεις!
settings_ignore_other_filesystems = Αγνόηση άλλων συστημάτων αρχείων (μόνο Linux)
settings_ignore_other_filesystems_tooltip =
αγνοεί αρχεία που δεν είναι στο ίδιο σύστημα αρχείων με αναζήτηση καταλόγων.
Λειτουργεί όπως η επιλογή -xdev στην εντολή εύρεσης στο Linux
settings_save_at_exit_button_tooltip = Αποθήκευση ρυθμίσεων σε αρχείο κατά το κλείσιμο της εφαρμογής.
settings_load_at_start_button_tooltip =
Φόρτωση παραμέτρων από το αρχείο κατά το άνοιγμα της εφαρμογής.
Αν δεν είναι ενεργοποιημένη, θα χρησιμοποιηθούν οι προεπιλεγμένες ρυθμίσεις.
settings_confirm_deletion_button_tooltip = Εμφάνιση διαλόγου επιβεβαίωσης όταν κάνετε κλικ στο κουμπί διαγραφής.
settings_confirm_link_button_tooltip = Εμφάνιση διαλόγου επιβεβαίωσης όταν κάνετε κλικ στο κουμπί hard/symlink
settings_confirm_group_deletion_button_tooltip = Εμφάνιση διαλόγου προειδοποίησης όταν προσπαθείτε να διαγράψετε όλες τις εγγραφές από την ομάδα.
settings_show_text_view_button_tooltip = Εμφάνιση πίνακα κειμένου στο κάτω μέρος της διεπαφής χρήστη.
settings_use_cache_button_tooltip = Χρήση προσωρινής μνήμης αρχείων.
settings_save_also_as_json_button_tooltip = Αποθήκευση προσωρινής μνήμης σε (αναγνώσιμη από άνθρωπο) μορφή JSON. Είναι δυνατή η τροποποίηση του περιεχομένου του. Η προσωρινή μνήμη από αυτό το αρχείο θα διαβάζεται αυτόματα από την εφαρμογή αν λείπει η κρύπτη δυαδικής μορφής (με επέκταση κάδου).
settings_use_trash_button_tooltip = Μετακινεί τα αρχεία στον κάδο απορριμμάτων αντί να τα διαγράφει μόνιμα.
settings_language_label_tooltip = Γλώσσα διεπαφής χρήστη.
settings_save_at_exit_button = Αποθήκευση ρυθμίσεων κατά το κλείσιμο της εφαρμογής
settings_load_at_start_button = Φόρτωση ρυθμίσεων κατά το άνοιγμα της εφαρμογής
settings_confirm_deletion_button = Εμφάνιση διαλόγου επιβεβαίωσης κατά τη διαγραφή αρχείων
settings_confirm_link_button = Εμφάνιση διαλόγου επιβεβαίωσης όταν σκληρά/συντόμευση αρχείων
settings_confirm_group_deletion_button = Εμφάνιση διαλόγου επιβεβαίωσης κατά τη διαγραφή όλων των αρχείων της ομάδας
settings_show_text_view_button = Εμφάνιση κάτω πίνακα κειμένου
settings_use_cache_button = Χρήση προσωρινής μνήμης
settings_save_also_as_json_button = Επίσης αποθήκευση προσωρινής μνήμης ως αρχείο JSON
settings_use_trash_button = Μετακίνηση διαγραμμένων αρχείων στον κάδο απορριμμάτων
settings_language_label = Γλώσσα
settings_multiple_delete_outdated_cache_checkbutton = Αυτόματη διαγραφή ξεπερασμένων καταχωρήσεων cache
settings_multiple_delete_outdated_cache_checkbutton_tooltip =
Delete outdated cache results which point to non-existent files.
When enabled, app makes sure when loading records, that all records point to valid files (broken ones are ignored).
Disabling this will help when scanning files on external drives, so cache entries about them will not be purged in the next scan.
In the case of having hundred of thousands records in cache, it is suggested to enable this, which will speedup cache loading/saving at start/end of the scan.
settings_notebook_general = Γενικά
settings_notebook_duplicates = Διπλότυπα
settings_notebook_images = Παρόμοιες Εικόνες
settings_notebook_videos = Παρόμοια Βίντεο
## Multiple - settings used in multiple tabs
settings_multiple_image_preview_checkbutton_tooltip = Εμφανίζει την προεπισκόπηση στη δεξιά πλευρά (όταν επιλέγετε ένα αρχείο εικόνας).
settings_multiple_image_preview_checkbutton = Εμφάνιση προεπισκόπησης εικόνας
settings_multiple_clear_cache_button_tooltip =
Χειροκίνητη εκκαθάριση της λανθάνουσας μνήμης των ξεπερασμένων καταχωρήσεων.
Αυτό θα πρέπει να χρησιμοποιηθεί μόνο αν η αυτόματη εκκαθάριση έχει απενεργοποιηθεί.
settings_multiple_clear_cache_button = Κατάργηση παρωχημένων αποτελεσμάτων από τη μνήμη cache.
## Duplicates
settings_duplicates_hide_hard_link_button_tooltip =
Hides all files except one, if all point to the same data (are hardlinked).
Example: In the case where there are (on disk) seven files which are hardlinked to specific data and one different file with same data but a different inode, then in duplicate finder, only one unique file and one file from hardlinked ones will be shown.
settings_duplicates_minimal_size_entry_tooltip =
Ορίστε το ελάχιστο μέγεθος αρχείου που θα αποθηκευτεί.
Επιλέγοντας μια μικρότερη τιμή θα δημιουργήσει περισσότερες εγγραφές. Αυτό θα επιταχύνει την αναζήτηση, αλλά επιβραδύνει τη φόρτωση της λανθάνουσας μνήμης.
settings_duplicates_prehash_checkbutton_tooltip =
Ενεργοποιεί την προσωρινή αποθήκευση του prehash (ένα κατακερματισμό υπολογισμένο από ένα μικρό μέρος του αρχείου) το οποίο επιτρέπει την προηγούμενη απόρριψη μη διπλών αποτελεσμάτων.
Είναι απενεργοποιημένο από προεπιλογή επειδή μπορεί να προκαλέσει επιβραδύνσεις σε ορισμένες περιπτώσεις.
Συνιστάται ιδιαίτερα να το χρησιμοποιήσετε κατά τη σάρωση εκατοντάδων χιλιάδων ή εκατομμυρίων αρχείων, επειδή μπορεί να επιταχύνει την αναζήτηση κατά πολλές φορές.
settings_duplicates_prehash_minimal_entry_tooltip = Ελάχιστο μέγεθος της προσωρινά αποθηκευμένης καταχώρησης.
settings_duplicates_hide_hard_link_button = Απόκρυψη σκληρών συνδέσμων (μόνο Linux και macOS)
settings_duplicates_prehash_checkbutton = Χρήση προσωρινής μνήμης prehash
settings_duplicates_minimal_size_cache_label = Ελάχιστο μέγεθος των αρχείων (σε byte) αποθηκεύονται στη μνήμη cache
settings_duplicates_minimal_size_cache_prehash_label = Ελάχιστο μέγεθος των αρχείων (σε byte) αποθηκεύονται στην προσωρινή μνήμη prehash
## Saving/Loading settings
settings_saving_button_tooltip = Αποθήκευση των τρεχουσών ρυθμίσεων ρυθμίσεων στο αρχείο.
settings_loading_button_tooltip = Φόρτωση ρυθμίσεων από το αρχείο και αντικατάσταση των τρεχουσών ρυθμίσεων με αυτές.
settings_reset_button_tooltip = Επαναφορά των τρεχουσών ρυθμίσεων στην προκαθορισμένη.
settings_saving_button = Αποθήκευση διαμόρφωσης
settings_loading_button = Φόρτωση διαμόρφωσης
settings_reset_button = Επαναφορά ρύθμισης παραμέτρων
## Opening cache/config folders
settings_folder_cache_open_tooltip =
Opens the folder where the cache txt files are stored.
Modifying the cache files may cause invalid results to be shown. However, modifying path may save time when moving a big amount of files to a different location.
You can copy these files between computers to save time on scanning again for files (of course if they have similar directory structure).
In the case of problems with the cache, these files can be removed. The app will automatically regenerate them.
settings_folder_settings_open_tooltip =
Ανοίγει το φάκελο όπου αποθηκεύεται η ρύθμιση Czkawka.
ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Η χειροκίνητη τροποποίηση της ρύθμισης μπορεί να σπάσει τη ροή εργασίας σας.
settings_folder_cache_open = Άνοιγμα φακέλου cache
settings_folder_settings_open = Άνοιγμα φακέλου ρυθμίσεων
# Compute results
compute_stopped_by_user = Η αναζήτηση σταμάτησε από το χρήστη
compute_found_duplicates_hash_size = Found { $number_files } duplicates in { $number_groups } groups which took { $size }
compute_found_duplicates_name = Βρέθηκαν διπλότυπα { $number_files } σε ομάδες { $number_groups }
compute_found_empty_folders = Βρέθηκαν { $number_files } άδειοι φάκελοι
compute_found_empty_files = Βρέθηκαν { $number_files } άδεια αρχεία
compute_found_big_files = Βρέθηκαν { $number_files } μεγάλα αρχεία
compute_found_temporary_files = Βρέθηκαν { $number_files } προσωρινά αρχεία
compute_found_images = Βρέθηκαν { $number_files } παρόμοιες εικόνες σε ομάδες { $number_groups }
compute_found_videos = Βρέθηκαν { $number_files } παρόμοια βίντεο σε ομάδες { $number_groups }
compute_found_music = Βρέθηκαν { $number_files } παρόμοια αρχεία μουσικής σε ομάδες { $number_groups }
compute_found_invalid_symlinks = Βρέθηκαν { $number_files } μη έγκυρες συμβολικές συνδέσεις
compute_found_broken_files = Βρέθηκαν { $number_files } κατεστραμμένα αρχεία
compute_found_bad_extensions = Βρέθηκαν { $number_files } αρχεία με μη έγκυρες επεκτάσεις
# Progress window
progress_scanning_general_file = Σάρωση { $file_number } αρχείου
progress_scanning_extension_of_files = Έλεγχος επέκτασης αρχείου { $file_checked }/{ $all_files }
progress_scanning_broken_files = Έλεγχος αρχείου { $file_checked }/{ $all_files }
progress_scanning_video = Hashing of { $file_checked }/{ $all_files } βίντεο
progress_scanning_image = Hashing of { $file_checked }/{ $all_files } image
progress_comparing_image_hashes = Σύγκριση { $file_checked }/{ $all_files } κατακερματισμού εικόνας
progress_scanning_music_tags_end = Συγκρίνοντας ετικέτες του αρχείου μουσικής { $file_checked }/{ $all_files }
progress_scanning_music_tags = Ανάγνωση ετικετών του αρχείου μουσικής { $file_checked }/{ $all_files }
progress_scanning_music_content_end = Σύγκριση δακτυλικού αποτυπώματος του αρχείου μουσικής { $file_checked }/{ $all_files }
progress_scanning_music_content = Υπολογισμός δακτυλικού αποτυπώματος του αρχείου μουσικής { $file_checked }/{ $all_files }
progress_scanning_empty_folders = Σάρωση φακέλου { $folder_number }
progress_scanning_size = Μέγεθος σάρωσης του αρχείου { $file_number }
progress_scanning_size_name = Σάρωση ονόματος και μεγέθους αρχείου { $file_number }
progress_scanning_name = Σάρωση ονόματος αρχείου { $file_number }
progress_analyzed_partial_hash = Αναλυμένο μερικό κατακερματισμό των αρχείων { $file_checked }/{ $all_files }
progress_analyzed_full_hash = Ανάλυση πλήρους hash των { $file_checked }/{ $all_files } αρχείων
progress_prehash_cache_loading = Φόρτωση προσωρινής μνήμης
progress_prehash_cache_saving = Αποθήκευση προσωρινής μνήμης prehash
progress_hash_cache_loading = Φόρτωση προσωρινής μνήμης hash
progress_hash_cache_saving = Αποθήκευση λανθάνουσας μνήμης
progress_cache_loading = Φόρτωση προσωρινής μνήμης
progress_cache_saving = Αποθήκευση προσωρινής μνήμης
progress_current_stage = Current Stage:{ " " }
progress_all_stages = Όλα Τα Στάδια:{" " }
# Saving loading
saving_loading_saving_success = Αποθηκευμένες ρυθμίσεις για το αρχείο { $name }.
saving_loading_saving_failure = Αποτυχία αποθήκευσης δεδομένων ρύθμισης παραμέτρων στο αρχείο { $name }.
saving_loading_reset_configuration = Οι τρέχουσες ρυθμίσεις εκκαθαρίστηκαν.
saving_loading_loading_success = Τοποθετημένες ρυθμίσεις παραμέτρων εφαρμογής.
saving_loading_invalid_string = Για το κλειδί "{ $key }" βρήκε μη έγκυρο αποτέλεσμα - "{ $result }" το οποίο δεν είναι συμβολοσειρά.
saving_loading_invalid_int = Για το κλειδί "{ $key }" βρήκε μη έγκυρο αποτέλεσμα - "{ $result }" που δεν είναι ακέραιος.
saving_loading_invalid_bool = Για το κλειδί "{ $key }" βρήκε μη έγκυρο αποτέλεσμα - "{ $result }" που δεν είναι bool.
saving_loading_decode_problem_bool = Αποτυχία αποκωδικοποίησης bool από το κλειδί "{ $key }" βρέθηκε "{ $result }" αλλά οι επιτρεπόμενες τιμές είναι 0, 1, αληθείς ή ψευδείς.
saving_loading_saving_same_keys = Προσπάθεια εξοικονόμησης ρυθμίσεων με διπλό κλειδί "{ $key }".
saving_loading_failed_to_get_home_directory = Αποτυχία λήψης του αρχικού φακέλου για να ανοίξετε/αποθηκεύσετε το αρχείο ρυθμίσεων.
saving_loading_folder_config_instead_file = Αδυναμία δημιουργίας ή ανοίγματος αρχείου αποθήκευσης στη διαδρομή "{ $path }" επειδή ήδη υπάρχει φάκελος.
saving_loading_failed_to_create_configuration_folder = Αποτυχία ρύθμισης παραμέτρων για τη δημιουργία φακέλου ρυθμίσεων "{ $path }", λόγος "{ $reason }".
saving_loading_failed_to_create_config_file = Αποτυχία δημιουργίας αρχείου ρυθμίσεων "{ $path }", λόγος "{ $reason }".
saving_loading_failed_to_read_config_file = Αδυναμία φόρτωσης ρύθμισης παραμέτρων από το "{ $path }" επειδή δεν υπάρχει ή δεν είναι αρχείο.
saving_loading_failed_to_read_data_from_file = Αδυναμία ανάγνωσης δεδομένων από το αρχείο "{ $path }", λόγος "{ $reason }".
saving_loading_orphan_data = Βρέθηκαν ορφανά δεδομένα "{ $data }" στη γραμμή "{ $line }".
saving_loading_not_valid = Η ρύθμιση "{ $data }" δεν υπάρχει στην τρέχουσα έκδοση εφαρμογών.
# Invalid symlinks
invalid_symlink_infinite_recursion = Άπειρη αναδρομή
invalid_symlink_non_existent_destination = Αρχείο ανύπαρκτου προορισμού
# Other
selected_all_reference_folders = Αδυναμία έναρξης αναζήτησης, όταν όλοι οι κατάλογοι ορίζονται ως φάκελοι αναφοράς
searching_for_data = Αναζήτηση δεδομένων, μπορεί να πάρει λίγο, παρακαλώ περιμένετε...
text_view_messages = ΜΗΝΥΜΑΤΑ
text_view_warnings = ΠΡΟΕΙΔΟΠΟΙΗΣΕΙΣ
text_view_errors = ΣΦΑΛΜΑ
about_window_motto = Αυτό το πρόγραμμα είναι ελεύθερο να χρησιμοποιηθεί και πάντα θα είναι.
# Various dialog
dialogs_ask_next_time = Ερώτηση την επόμενη φορά
delete_file_failed = Αποτυχία διαγραφής αρχείου { $name }, λόγος { $reason }
delete_title_dialog = Διαγραφή επιβεβαίωσης
delete_question_label = Είστε βέβαιοι ότι θέλετε να διαγράψετε αρχεία?
delete_all_files_in_group_title = Επιβεβαίωση διαγραφής όλων των αρχείων της ομάδας
delete_all_files_in_group_label1 = Σε ορισμένες ομάδες έχουν επιλεγεί όλες οι εγγραφές.
delete_all_files_in_group_label2 = Είστε βέβαιοι ότι θέλετε να τα διαγράψετε?
delete_folder_failed = Αποτυχία διαγραφής του φακέλου { $dir } επειδή ο φάκελος δεν υπάρχει, δεν έχετε άδεια ή ο φάκελος δεν είναι κενός.
delete_items_label = { $items } τα αρχεία θα διαγραφούν.
delete_items_groups_label = { $items } τα αρχεία από τις ομάδες { $groups } θα διαγραφούν.
hardlink_failed = Αποτυχία hardlink
hard_sym_invalid_selection_title_dialog = Μη έγκυρη επιλογή με κάποιες ομάδες
hard_sym_invalid_selection_label_1 = Σε ορισμένες ομάδες έχει επιλεγεί μόνο μία εγγραφή και θα αγνοηθεί.
hard_sym_invalid_selection_label_2 = Για να είναι δυνατή η σκληρή/συσχέτιση αυτών των αρχείων, πρέπει να επιλεγούν τουλάχιστον δύο αποτελέσματα στην ομάδα.
hard_sym_invalid_selection_label_3 = Η πρώτη στην ομάδα αναγνωρίζεται ως πρωτότυπο και δεν αλλάζεται, αλλά η δεύτερη και αργότερα τροποποιείται.
hard_sym_link_title_dialog = Επιβεβαίωση συνδέσμου
hard_sym_link_label = Είστε βέβαιοι ότι θέλετε να συνδέσετε αυτά τα αρχεία?
move_folder_failed = Αποτυχία μετακίνησης του φακέλου { $name }, λόγος { $reason }
move_file_failed = Αποτυχία μετακίνησης αρχείου { $name }, λόγος { $reason }
move_files_title_dialog = Επιλέξτε φάκελο στον οποίο θέλετε να μετακινήσετε διπλότυπα αρχεία
move_files_choose_more_than_1_path = Μόνο μία διαδρομή μπορεί να επιλεγεί για να είναι σε θέση να αντιγράψει τα διπλά αρχεία τους, επιλεγμένα { $path_number }.
move_stats = Σωστά μετακινήθηκαν { $num_files }/{ $all_files } στοιχεία
save_results_to_file = Αποθηκεύτηκε αποτελέσματα τόσο σε txt και αρχεία json στο φάκελο { $name }.
search_not_choosing_any_music = ΣΦΑΛΜΑ: Πρέπει να επιλέξετε τουλάχιστον ένα πλαίσιο ελέγχου με τύπους αναζήτησης μουσικής.
search_not_choosing_any_broken_files = ΣΦΑΛΜΑ: Πρέπει να επιλέξετε τουλάχιστον ένα πλαίσιο ελέγχου με τον τύπο των επιλεγμένων κατεστραμμένων αρχείων.
include_folders_dialog_title = Φάκελοι που θα συμπεριληφθούν
exclude_folders_dialog_title = Φάκελοι προς εξαίρεση
include_manually_directories_dialog_title = Προσθήκη καταλόγου χειροκίνητα
cache_properly_cleared = Σωστό εκκαθάριση προσωρινής μνήμης
cache_clear_duplicates_title = Εκκαθάριση διπλότυπων cache
cache_clear_similar_images_title = Εκκαθάριση παρόμοιων εικόνων cache
cache_clear_similar_videos_title = Εκκαθάριση παρόμοιων βίντεο cache
cache_clear_message_label_1 = Θέλετε να καθαρίσετε την προσωρινή μνήμη των ξεπερασμένων καταχωρήσεων?
cache_clear_message_label_2 = Αυτή η λειτουργία θα καταργήσει όλες τις καταχωρήσεις προσωρινής αποθήκευσης που δείχνουν σε μη έγκυρα αρχεία.
cache_clear_message_label_3 = Αυτό μπορεί να επιταχύνει ελαφρώς τη φόρτωση/αποθήκευση στη μνήμη cache.
cache_clear_message_label_4 = ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Η λειτουργία θα αφαιρέσει όλα τα προσωρινά αποθηκευμένα δεδομένα από τις αποσυνδεδεμένες εξωτερικές μονάδες. Έτσι, κάθε hash θα πρέπει να αναγεννηθεί.
# Show preview
preview_image_resize_failure = Αποτυχία αλλαγής μεγέθους εικόνας { $name }.
preview_image_opening_failure = Αποτυχία ανοίγματος εικόνας { $name }, λόγος { $reason }
# Compare images (L is short Left, R is short Right - they can't take too much space)
compare_groups_number = Ομάδα { $current_group }/{ $all_groups } ({ $images_in_group } εικόνες)
compare_move_left_button = L
compare_move_right_button = R

@ -16,23 +16,6 @@ music_bitrate_checkbox = Bitrate
music_genre_checkbox = Genre
music_length_checkbox = Length
music_comparison_checkbox = Approximate Comparison
music_checking_by_tags = Tags
music_checking_by_content = Content
same_music_seconds_label = Minimal fragment second duration
same_music_similarity_label = Maximum difference
same_music_tooltip =
Searching for similar music files by its content can be configured by setting:
- The minimum fragment time after which music files can be identified as similar
- The maximum difference difference between two tested fragments
The key to good results is to find sensible combinations of these parameters, for provided.
Setting the minimum time to 5s and the maximum difference to 1.0, will look for almost identical fragments in the files.
A time of 20s and a maximum difference of 6.0, on the other hand, works well for finding remixes/live versions etc.
By default, each music file is compared to each other and this can take a lot of time when testing many files, so it is usually better to use reference folders and specifying which files are to be compared with each other(with same amount of files, comparing fingerprints will be faster at least 4x than without reference folders).
music_comparison_checkbox_tooltip =
It searches for similar music files using AI, which uses machine learning to remove parentheses from a phrase. For example, with this option enabled, the files in question will be considered duplicates:
@ -45,7 +28,6 @@ duplicate_case_sensitive_name_tooltip =
Disabling such option will group names without checking if each letter is same size e.g. żoŁD <-> Żołd
duplicate_mode_size_name_combo_box = Size and Name
duplicate_mode_name_combo_box = Name
duplicate_mode_size_combo_box = Size
duplicate_mode_hash_combo_box = Hash
@ -68,35 +50,24 @@ duplicate_check_method_tooltip =
Hash - Finds files which have the same content. This mode hashes the file and later compares this hash to find duplicates. This mode is the safest way to find duplicates. App heavily uses cache, so second and further scans of the same data should be a lot of faster than the first.
image_hash_size_tooltip =
Each checked image produces a special hash which can be compared with each other, and a small difference between them means that these images are similar.
8 hash size is quite good to find images that are only a little similar to original. With a bigger set of images (>1000), this will produce a big amount of false positives, so I recommend to use a bigger hash size in this case.
16 is the default hash size which is quite a good compromise between finding even a little similar images and having only a small amount of hash collisions.
32 and 64 hashes find only very similar images, but should have almost no false positives (maybe except some images with alpha channel).
image_hash_size_tooltip =
Czkawka offers changing the size of the generated hash for each image. A bigger hash size enables finding images with a lower amount of differences between images, but it is also slightly slower to use.
Default value for hash is 8 bytes, which allows finding both very similar and different images. 16 byte and 32 byte hashes should be used only for nearly identical images. 64 byte hash shouldn't be used, except in situations where you need to find really small differences.
image_resize_filter_tooltip =
To compute hash of image, the library must first resize it.
Depend on chosen algorithm, the resulting image used to calculate hash will looks a little different.
The fastest algorithm to use, but also the one which gives the worst results, is Nearest. It is enabled by default, because with 16x16 hash size lower quality it is not really visible.
With 8x8 hash size it is recommended to use a different algorithm than Nearest, to have better groups of images.
To compute hash of image, library must first resize it. Depend on chosen algorithm, resulted image will looks little different. The fastest algorithm to use, but also one which gives the worst results is Nearest.
image_hash_alg_tooltip =
Users can choose from one of many algorithms of calculating the hash.
Users can choose from one of many algorithms of calculating the hash. Each has both strong and weaker points and will sometimes give better and sometimes worse results for different images. So, to determine the best one for you, manual testing is required.
Each has both strong and weaker points and will sometimes give better and sometimes worse results for different images.
main_notebook_image_fast_compare = Fast compare
main_notebook_image_fast_compare_tooltip =
Speedup searching and comparing hashes.
So, to determine the best one for you, manual testing is required.
As opposed to normal mode - where each hash is compared to each other x times (where x is the similarity the user chose) - in this mode, exactly one comparison will be used.
big_files_mode_combobox_tooltip = Allows to search for smallest/biggest files
big_files_mode_label = Checked files
big_files_mode_smallest_combo_box = The Smallest
big_files_mode_biggest_combo_box = The Biggest
This option is recommended when comparing >10000 images with non 0 (Very High) similarity.
main_notebook_duplicates = Duplicate Files
main_notebook_empty_directories = Empty Directories
@ -140,13 +111,8 @@ main_label_shown_files = Number of shown files
main_label_resize_algorithm = Resize algorithm
main_label_similarity = Similarity{" "}
main_check_box_broken_files_audio = Audio
main_check_box_broken_files_pdf = Pdf
main_check_box_broken_files_archive = Archive
main_check_box_broken_files_image = Image
check_button_general_same_size = Ignore same size
check_button_general_same_size_tooltip = Ignore files with identical size in results - usually these are 1:1 duplicates
check_button_general_same_size_tooltip = Ignore from results, files which have identical size - usually this are 1:1 duplicates
main_label_size_bytes_tooltip = Size of files which will be used in scan
@ -164,20 +130,10 @@ upper_manual_add_excluded_button = Manual Add
upper_add_excluded_button = Add
upper_remove_excluded_button = Remove
upper_manual_add_included_button_tooltip =
Add directory name to search by hand.
To add multiple paths at once, separate them by ;
/home/roman;/home/rozkaz will add two directories /home/roman and /home/rozkaz
upper_manual_add_included_button_tooltip = Add directory name to search by hand.
upper_add_included_button_tooltip = Add new directory to search.
upper_remove_included_button_tooltip = Delete directory from search.
upper_manual_add_excluded_button_tooltip =
Add excluded directory name by hand.
To add multiple paths at once, separate them by ;
/home/roman;/home/krokiet will add two directories /home/roman and /home/keokiet
upper_manual_add_excluded_button_tooltip = Add excluded directory name by hand.
upper_add_excluded_button_tooltip = Add directory to be excluded in search.
upper_remove_excluded_button_tooltip = Delete directory from excluded.
@ -192,18 +148,12 @@ upper_allowed_extensions_tooltip =
Usage example ".exe, IMAGE, VIDEO, .rar, 7z" - this means that images (e.g. jpg, png), videos (e.g. avi, mp4), exe, rar, and 7z files will be scanned.
upper_excluded_extensions_tooltip =
List of disabled files which will be ignored in scan.
When using both allowed and disabled extensions, this one has higher priority, so file will not be checked.
upper_excluded_items_tooltip =
Excluded items must contain * wildcard and should be separated by commas.
This is slower than Excluded Directories, so use it carefully.
upper_excluded_items = Excluded Items:
upper_allowed_extensions = Allowed Extensions:
upper_excluded_extensions = Disabled Extensions:
# Popovers
@ -262,11 +212,6 @@ popover_custom_all_in_group_label = Don't select all records in group
popover_custom_mode_unselect = Unselect Custom
popover_custom_mode_select = Select Custom
popover_sort_file_name = File name
popover_sort_folder_name = Folder name
popover_sort_full_name = Full name
popover_sort_size = Size
popover_sort_selection = Selection
popover_invalid_regex = Regex is invalid
popover_valid_regex = Regex is valid
@ -279,7 +224,6 @@ bottom_save_button = Save
bottom_symlink_button = Symlink
bottom_hardlink_button = Hardlink
bottom_move_button = Move
bottom_sort_button = Sort
bottom_search_button_tooltip = Start search
bottom_select_button_tooltip = Select records. Only selected files/folders can be later processed.
@ -293,24 +237,16 @@ bottom_hardlink_button_tooltip =
Create hardlinks.
Only works when at least two results in a group are selected.
First is unchanged and second and later are hardlinked to first.
bottom_hardlink_button_not_available_tooltip =
Create hardlinks.
Button is disabled, because hardlinks cannot be created.
Hardlinks only works with administrator privileges on Windows, so be sure to run app as administrator.
If app already works with such privileges check for similar issues on Github.
bottom_move_button_tooltip =
bottom_move_button_tooltip =
Moves files to chosen directory.
It copies all files to the directory without preserving the directory tree.
When trying to move two files with identical name to folder, second will fail and show error.
bottom_sort_button_tooltip =
Sorts files/folders according to selected method.
bottom_show_errors_tooltip = Show/Hide bottom text panel.
bottom_show_upper_notebook_tooltip = Show/Hide upper notebook panel.
# Progress Window
progress_stop_button = Stop
progress_stop_additional_message = Stop requested
# About Window
about_repository_button_tooltip = Link to repository page with source code.
@ -329,17 +265,6 @@ header_about_button_tooltip = Opens dialog with info about app.
# Settings
## General
settings_number_of_threads = Number of used threads
settings_number_of_threads_tooltip = Number of used threads, 0 means that all available threads will be used.
settings_label_restart = You need to restart app to apply settings!
settings_ignore_other_filesystems = Ignore other filesystems (only Linux)
settings_ignore_other_filesystems_tooltip =
ignores files that are not in the same file system as searched directories.
Works same like -xdev option in find command on Linux
settings_save_at_exit_button_tooltip = Save configuration to file when closing app.
settings_load_at_start_button_tooltip =
Load configuration from file when opening app.
@ -388,7 +313,7 @@ settings_multiple_clear_cache_button_tooltip =
Manually clear the cache of outdated entries.
This should only be used if automatic clearing has been disabled.
settings_multiple_clear_cache_button = Remove outdated results from cache.
settings_multiple_clear_cache_button = Remove outdated results from images cache
## Duplicates
settings_duplicates_hide_hard_link_button_tooltip =
@ -469,20 +394,11 @@ progress_scanning_image = Hashing of {$file_checked}/{$all_files} image
progress_comparing_image_hashes = Comparing {$file_checked}/{$all_files} image hash
progress_scanning_music_tags_end = Comparing tags of {$file_checked}/{$all_files} music file
progress_scanning_music_tags = Reading tags of {$file_checked}/{$all_files} music file
progress_scanning_music_content_end = Comparing fingerprint of {$file_checked}/{$all_files} music file
progress_scanning_music_content = Calculating fingerprint of {$file_checked}/{$all_files} music file
progress_scanning_empty_folders = Scanning {$folder_number} folder
progress_scanning_size = Scanning size of {$file_number} file
progress_scanning_size_name = Scanning name and size of {$file_number} file
progress_scanning_name = Scanning name of {$file_number} file
progress_analyzed_partial_hash = Analyzed partial hash of {$file_checked}/{$all_files} files
progress_analyzed_full_hash = Analyzed full hash of {$file_checked}/{$all_files} files
progress_prehash_cache_loading = Loading prehash cache
progress_prehash_cache_saving = Saving prehash cache
progress_hash_cache_loading = Loading hash cache
progress_hash_cache_saving = Saving hash cache
progress_cache_loading = Loading cache
progress_cache_saving = Saving cache
progress_current_stage = Current Stage:{" "}
progress_all_stages = All Stages:{" "}
@ -514,7 +430,6 @@ invalid_symlink_infinite_recursion = Infinite recursion
invalid_symlink_non_existent_destination = Non-existent destination file
# Other
selected_all_reference_folders = Cannot start search, when all directories are set as reference folders
searching_for_data = Searching data, it may take a while, please wait...
text_view_messages = MESSAGES
text_view_warnings = WARNINGS
@ -550,10 +465,9 @@ move_files_title_dialog = Choose folder to which you want to move duplicated fil
move_files_choose_more_than_1_path = Only one path may be selected to be able to copy their duplicated files, selected {$path_number}.
move_stats = Properly moved {$num_files}/{$all_files} items
save_results_to_file = Saved results both to txt and json files into {$name} folder.
save_results_to_file = Saved results to file {$name}
search_not_choosing_any_music = ERROR: You must select at least one checkbox with music searching types.
search_not_choosing_any_broken_files = ERROR: You must select at least one checkbox with type of checked broken files.
include_folders_dialog_title = Folders to include
exclude_folders_dialog_title = Folders to exclude

@ -4,7 +4,7 @@ window_main_title = Czkawka (Hipo)
window_progress_title = Escaneando
window_compare_images = Comparar imágenes
# General
general_ok_button = Aceptar
general_ok_button = Ok
general_close_button = Cerrar
# Main window
music_title_checkbox = Título
@ -14,22 +14,6 @@ music_bitrate_checkbox = Tasa de bits
music_genre_checkbox = Género
music_length_checkbox = Duración
music_comparison_checkbox = Comparación aproximada
music_checking_by_tags = Etiquetas
music_checking_by_content = Contenido
same_music_seconds_label = Duración mínima del segundo fragmento
same_music_similarity_label = Diferencia máxima
same_music_tooltip =
Buscando archivos de música similares por su contenido se puede configurar configurando:
- El tiempo mínimo de fragmento después del cual los archivos de música pueden ser identificados como similares
- La diferencia máxima entre dos fragmentos probados
La clave para los buenos resultados es encontrar combinaciones sensatas de estos parámetros, para proporcionar.
Establecer el tiempo mínimo a 5 s y la diferencia máxima a 1.0, buscará fragmentos casi idénticos en los archivos.
Un tiempo de 20 años y una diferencia máxima de 6.0, por otro lado, funciona bien para encontrar remixes/versiones en vivo, etc.
Por defecto, cada archivo de música se compara entre sí y esto puede tomar mucho tiempo al probar muchos archivos, por lo que normalmente es mejor usar carpetas de referencia y especificar qué archivos deben compararse entre sí (con la misma cantidad de archivos, comparar las huellas dactilares será más rápido al menos 4x que sin carpetas de referencia).
music_comparison_checkbox_tooltip =
Busca archivos de música similares usando IA, que usa el aprendizaje automático para eliminar paréntesis de una frase. Por ejemplo, con esta opción activada, los archivos en cuestión se considerarán duplicados:
@ -39,7 +23,6 @@ duplicate_case_sensitive_name_tooltip =
Cuando está habilitado, agrupa registros sólo cuando tienen exactamente el mismo nombre p.ej. Żołd <-> Żołd
Deshabilitar tal opción agrupará nombres sin comprobar si cada letra tiene el mismo tamaño, p. ej. żoŁD <-> Żołd
duplicate_mode_size_name_combo_box = Tamaño y nombre
duplicate_mode_name_combo_box = Nombre
duplicate_mode_size_combo_box = Tamaño
duplicate_mode_hash_combo_box = Hash
@ -60,32 +43,19 @@ duplicate_check_method_tooltip =
Hash - Encuentra archivos con el mismo contenido. Este modo molesta el archivo y luego compara este hash para encontrar duplicados. Este modo es la forma más segura de encontrar duplicados. La aplicación utiliza mucho caché, por lo que segundo y más análisis de los mismos datos debe ser mucho más rápido que el primero.
image_hash_size_tooltip =
Cada imagen seleccionada produce un hash especial que se puede comparar entre sí y una pequeña diferencia entre ellas significa que estas imágenes son similares.
tamaño de 8 hash es bastante bueno para encontrar imágenes que son un poco similares a las originales. Con un conjunto más grande de imágenes (>1000), esto producirá una gran cantidad de falsos positivos, así que recomiendo usar un mayor tamaño de hash en este caso.
16 es el tamaño de hash predeterminado, lo cual es un buen compromiso entre encontrar incluso un poco de imágenes similares y tener sólo una pequeña cantidad de colisiones hash.
32 y 64 hashes sólo encuentran imágenes muy similares, pero no deberían tener casi falsos positivos (tal vez excepto algunas imágenes con canal alfa).
image_resize_filter_tooltip =
To compute hash of image, the library must first resize it.
Kawka ofrece cambiar el tamaño del hash generado para cada imagen. Un mayor tamaño de hash permite encontrar imágenes con una menor cantidad de diferencias entre imágenes, pero también es un poco más lento de usar.
Depend on chosen algorithm, the resulting image used to calculate hash will looks a little different.
El valor predeterminado para el hash es de 8 bytes, lo que permite encontrar imágenes muy similares y diferentes. El hash de 16 bytes y 32 bytes debe utilizarse sólo para imágenes casi idénticas. El hash de 64 bytes no debería ser usado, excepto en situaciones en las que necesita encontrar diferencias realmente pequeñas.
image_resize_filter_tooltip = Para calcular el hash de la imagen, la librería primero debe redimensionarla. Depende del algoritmo elegido, la imagen resultante se verá poco diferente. El algoritmo más rápido de usar, pero también uno que da los peores resultados es el más cercano.
image_hash_alg_tooltip = Los usuarios pueden elegir uno de los muchos algoritmos de cálculo del hash. Cada uno tiene puntos fuertes y débiles y a veces dará mejores y a veces peores resultados para diferentes imágenes. Por lo tanto, para determinar cuál es la mejor para usted, se requiere la prueba manual.
main_notebook_image_fast_compare = Comparación rápida
main_notebook_image_fast_compare_tooltip =
Acelera la búsqueda y la comparación de hashes.
The fastest algorithm to use, but also the one which gives the worst results, is Nearest. It is enabled by default, because with 16x16 hash size lower quality it is not really visible.
A diferencia del modo normal - donde cada hash es comparado entre sí x veces (donde x es la similitud elegida por el usuario) - en este modo, se utilizará exactamente una comparación.
With 8x8 hash size it is recommended to use a different algorithm than Nearest, to have better groups of images.
image_hash_alg_tooltip =
Los usuarios pueden elegir uno de los muchos algoritmos de cálculo del hash.
Cada uno tiene puntos fuertes y débiles y a veces dará mejores y a veces peores resultados para diferentes imágenes.
Así que, para determinar la mejor para ti, se requiere una prueba manual.
big_files_mode_combobox_tooltip = Permite buscar archivos más pequeños/mayores
big_files_mode_label = Archivos marcados
big_files_mode_smallest_combo_box = El más pequeño
big_files_mode_biggest_combo_box = El más grande
main_notebook_duplicates = Archivos Duplicados
Esta opción se recomienda al comparar >10000 imágenes con la similitud non 0 (Muy Alta).
main_notebook_duplicates = Duplicar archivos
main_notebook_empty_directories = Directorios vacíos
main_notebook_big_files = Archivos grandes
main_notebook_empty_files = Archivos vacíos
@ -101,7 +71,7 @@ main_tree_view_column_folder_name = Nombre de carpeta
main_tree_view_column_path = Ruta
main_tree_view_column_modification = Fecha de modificación
main_tree_view_column_size = Tamaño
main_tree_view_column_similarity = Similitud
main_tree_view_column_similarity = Similaridad
main_tree_view_column_dimensions = Dimensiones
main_tree_view_column_title = Título
main_tree_view_column_artist = Artista
@ -120,16 +90,12 @@ main_label_hash_type = Tipo de Hash
main_label_hash_size = Tamaño hash
main_label_size_bytes = Tamaño (bytes)
main_label_min_size = Mínimo
main_label_max_size = Máximo
main_label_max_size = Máx
main_label_shown_files = Número de archivos mostrados
main_label_resize_algorithm = Algoritmo de Redimensionar
main_label_similarity = Similitud{ " " }
main_check_box_broken_files_audio = Sonido
main_check_box_broken_files_pdf = Pdf
main_check_box_broken_files_archive = Guardar
main_check_box_broken_files_image = Imagen
main_label_resize_algorithm = Redimensionar algoritmo
main_label_similarity = Similarity{ " " }
check_button_general_same_size = Ignorar el mismo tamaño
check_button_general_same_size_tooltip = Ignorar archivos con idéntico tamaño en resultados - usualmente son 1:1 duplicados
check_button_general_same_size_tooltip = Ignorar de los resultados, archivos que tienen el mismo tamaño - generalmente son 1:1 duplicados
main_label_size_bytes_tooltip = Tamaño de los archivos que se utilizarán en el escaneo
# Upper window
upper_tree_view_included_folder_column_title = Carpetas a buscar
@ -142,20 +108,10 @@ upper_remove_included_button = Eliminar
upper_manual_add_excluded_button = Añadir manual
upper_add_excluded_button = Añadir
upper_remove_excluded_button = Eliminar
upper_manual_add_included_button_tooltip =
Añade el nombre del directorio para buscar a mano.
Para agregar múltiples rutas a la vez, separalas por ;
/home/roman;/home/rozkaz añadirá dos directorios /home/roman y /home/rozkaz
upper_manual_add_included_button_tooltip = Añadir el nombre del directorio para buscar a mano.
upper_add_included_button_tooltip = Añadir nuevo directorio para buscar.
upper_remove_included_button_tooltip = Eliminar directorio de la búsqueda.
upper_manual_add_excluded_button_tooltip =
Añadir el nombre del directorio excluido a mano.
Para agregar múltiples rutas a la vez, separalas por ;
/home/roman;/home/krokiet añadirá dos directorios /home/roman y /home/keokiet
upper_manual_add_excluded_button_tooltip = Añadir el nombre del directorio excluido a mano.
upper_add_excluded_button_tooltip = Añadir directorio para ser excluido en la búsqueda.
upper_remove_excluded_button_tooltip = Eliminar directorio de excluidos.
upper_notebook_items_configuration = Configuración de artículos
@ -167,16 +123,11 @@ upper_allowed_extensions_tooltip =
Las siguientes Macros, que añaden múltiples extensiones a la vez, también están disponibles: IMAGE, VIDEO, MUSIC, TEXT.
Ejemplo de uso ".exe, IMAGE, VIDEO, .rar, 7z" - esto significa que imágenes (e. . jpg, png), videos (ej: avi, mp4), archivos exe, rar, y 7z serán escaneados.
upper_excluded_extensions_tooltip =
List of disabled files which will be ignored in scan.
When using both allowed and disabled extensions, this one has higher priority, so file will not be checked.
upper_excluded_items_tooltip =
Los artículos excluidos deben contener * comodín y deben estar separados por comas.
Esto es más lento que los Directorios Excluidos, así que úselo con cuidado.
upper_excluded_items = Elementos excluidos:
upper_allowed_extensions = Extensiones permitidas:
upper_excluded_extensions = Extensiones desactivadas:
# Popovers
popover_select_all = Seleccionar todo
popover_unselect_all = Deseleccionar todo
@ -184,7 +135,7 @@ popover_reverse = Invertir selección
popover_select_all_except_oldest = Seleccionar todo excepto más antiguo
popover_select_all_except_newest = Seleccionar todo excepto el más reciente
popover_select_one_oldest = Seleccione uno más antiguo
popover_select_one_newest = Seleccione uno más nuevo
popover_select_one_newest = Seleccione un nuevo
popover_select_custom = Seleccionar personalizado
popover_unselect_custom = Deseleccionar personalizado
popover_select_all_images_except_biggest = Seleccionar todo excepto mayor
@ -225,11 +176,6 @@ popover_custom_case_sensitive_check_button = Distingue mayúsculas y minúsculas
popover_custom_all_in_group_label = No seleccionar todos los registros en el grupo
popover_custom_mode_unselect = Deseleccionar Personalizado
popover_custom_mode_select = Seleccionar Personalizado
popover_sort_file_name = Nombre de archivo
popover_sort_folder_name = Nombre de la carpeta
popover_sort_full_name = Nombre completo
popover_sort_size = Tamaño
popover_sort_selection = Selección
popover_invalid_regex = Regex no es válido
popover_valid_regex = Regex es válido
# Bottom buttons
@ -240,7 +186,6 @@ bottom_save_button = Guardar
bottom_symlink_button = Symlink
bottom_hardlink_button = Hardlink
bottom_move_button = Mover
bottom_sort_button = Ordenar
bottom_search_button_tooltip = Iniciar búsqueda
bottom_select_button_tooltip = Seleccionar registros. Sólo los archivos/carpetas seleccionados pueden ser procesados más tarde.
bottom_delete_button_tooltip = Eliminar archivos/carpetas seleccionadas.
@ -253,28 +198,21 @@ bottom_hardlink_button_tooltip =
Crear enlaces hardlinks.
Solo funciona cuando al menos dos resultados en grupo son seleccionados.
El primero no ha cambiado y el segundo y más tarde están enlazados por hardlinks a la primera.
bottom_hardlink_button_not_available_tooltip =
Crear enlaces duros.
Botón deshabilitado, porque no se pueden crear enlaces duros.
Hardlinks sólo funciona con privilegios de administrador en Windows, así que asegúrese de ejecutar la aplicación como administrador.
Si la aplicación ya funciona con dichos privilegios, compruebe si hay problemas similares en Github.
bottom_move_button_tooltip =
Mover los archivos a la carpeta elegida.
Copia todos los archivos a la carpeta sin preservar el árbol de directorios.
Al intentar mover dos archivos con el mismo nombre a la carpeta, el segundo fallará y mostrará el error.
bottom_sort_button_tooltip = Ordenar archivos/carpetas de acuerdo al método seleccionado.
bottom_show_errors_tooltip = Mostrar/Ocultar panel de texto inferior.
bottom_show_upper_notebook_tooltip = Mostrar / Ocultar panel de cuaderno superior.
# Progress Window
progress_stop_button = Parar
progress_stop_additional_message = Parar solicitado
# About Window
about_repository_button_tooltip = Enlace a la página del repositorio con código fuente.
about_donation_button_tooltip = Enlace a la página de donación.
about_instruction_button_tooltip = Enlace a la página de instrucciones.
about_translation_button_tooltip = Enlace a la página de Crowdin con traducciones de aplicaciones. Oficialmente se admiten polaco e inglés.
about_repository_button = Repositorio
about_donation_button = Donativo
about_donation_button = Donación
about_instruction_button = Instrucción
about_translation_button = Traducción
# Header
@ -286,14 +224,6 @@ header_about_button_tooltip = Abre el diálogo con información sobre la aplicac
## General
settings_number_of_threads = Número de hilos usados
settings_number_of_threads_tooltip = Número de hilos usados, 0 significa que se utilizarán todos los hilos disponibles.
settings_label_restart = ¡Necesitas reiniciar la aplicación para aplicar la configuración!
settings_ignore_other_filesystems = Ignorar otros sistemas de ficheros (sólo Linux)
settings_ignore_other_filesystems_tooltip =
ignora los archivos que no están en el mismo sistema de archivos que los directorios buscados.
Funciona igual que la opción -xdev en encontrar el comando en Linux
settings_save_at_exit_button_tooltip = Guardar configuración en archivo al cerrar la aplicación.
settings_load_at_start_button_tooltip =
Cargar la configuración desde el archivo al abrir la aplicación.
@ -329,7 +259,7 @@ settings_multiple_delete_outdated_cache_checkbutton_tooltip =
settings_notebook_general = General
settings_notebook_duplicates = Duplicados
settings_notebook_images = Imágenes similares
settings_notebook_videos = Vídeos similares
settings_notebook_videos = Vídeo similar
## Multiple - settings used in multiple tabs
@ -338,7 +268,7 @@ settings_multiple_image_preview_checkbutton = Mostrar vista previa de la imagen
settings_multiple_clear_cache_button_tooltip =
Limpiar manualmente la caché de entradas desactualizadas.
Esto solo debe utilizarse si se ha desactivado la limpieza automática.
settings_multiple_clear_cache_button = Eliminar resultados obsoletos de la caché.
settings_multiple_clear_cache_button = Eliminar resultados desactualizados de la caché de imágenes
## Duplicates
@ -410,20 +340,11 @@ progress_scanning_image = Hash de { $file_checked }/{ $all_files } imagen
progress_comparing_image_hashes = Comparando hash de imagen { $file_checked }/{ $all_files }
progress_scanning_music_tags_end = Comparando etiquetas de { $file_checked }/{ $all_files } archivo de música
progress_scanning_music_tags = Leyendo etiquetas del archivo de música { $file_checked }/{ $all_files }
progress_scanning_music_content_end = Comparando huella dactilar de { $file_checked }/{ $all_files } archivo de música
progress_scanning_music_content = Calculando huella dactilar de { $file_checked }/{ $all_files } archivo de música
progress_scanning_empty_folders = Escaneando carpeta { $folder_number }
progress_scanning_size = Escaneando tamaño del archivo { $file_number }
progress_scanning_size_name = Escaneando nombre y tamaño del archivo { $file_number }
progress_scanning_name = Escaneando nombre del archivo { $file_number }
progress_analyzed_partial_hash = Has analizado el hash parcial de { $file_checked }/{ $all_files } archivos
progress_analyzed_full_hash = Se ha analizado el hash completo de { $file_checked }/{ $all_files } archivos
progress_prehash_cache_loading = Cargando caché prehash
progress_prehash_cache_saving = Guardando caché prehash
progress_hash_cache_loading = Cargando caché hash
progress_hash_cache_saving = Guardando caché hash
progress_cache_loading = Cargando caché
progress_cache_saving = Guardando caché
progress_current_stage = Etapa actual:{ " " }
progress_all_stages = Todas las etapas:{ " " }
# Saving loading
@ -448,7 +369,6 @@ saving_loading_not_valid = La configuración "{ $data }" no existe en la versió
invalid_symlink_infinite_recursion = Recursión infinita
invalid_symlink_non_existent_destination = Archivo de destino inexistente
# Other
selected_all_reference_folders = No se puede iniciar la búsqueda, cuando todos los directorios están establecidos como carpetas de referencia
searching_for_data = Buscando datos, puede tardar un tiempo, por favor espere...
text_view_messages = MENSAJES
text_view_warnings = ADVERTENCIA
@ -477,9 +397,8 @@ move_file_failed = Error al mover el archivo { $name }, razón { $reason }
move_files_title_dialog = Elija la carpeta a la que desea mover los archivos duplicados
move_files_choose_more_than_1_path = Solo se puede seleccionar una ruta para poder copiar sus archivos duplicados, seleccionado { $path_number }.
move_stats = Mudado correctamente { $num_files }/{ $all_files } elementos
save_results_to_file = Resultados guardados en archivos txt y json en la carpeta { $name }
save_results_to_file = Resultados guardados en el archivo { $name }
search_not_choosing_any_music = ERROR: Debe seleccionar al menos una casilla de verificación con tipos de búsqueda de música.
search_not_choosing_any_broken_files = ERROR: Debe seleccionar al menos una casilla de verificación con el tipo de ficheros rotos comprobados.
include_folders_dialog_title = Carpetas a incluir
exclude_folders_dialog_title = Carpetas a excluir
include_manually_directories_dialog_title = Añadir directorio manualmente

@ -14,43 +14,26 @@ music_bitrate_checkbox = Débit binaire
music_genre_checkbox = Genre
music_length_checkbox = Longueur
music_comparison_checkbox = Comparaison approximative
music_checking_by_tags = Tags
music_checking_by_content = Contenu
same_music_seconds_label = Durée minimale de seconde de fragment
same_music_similarity_label = Différence maximale
same_music_tooltip =
La recherche de fichiers musicaux aux contenus similaires peut être configurée en définissant :
- La durée minimale d'un fragment pour que des fichiers musicaux soient identifiés comme similaires
- La différence maximale entre deux fragments testés
La clé pour arriver à de bons résultats est de trouver des combinaisons raisonnables de ces paramètres.
Fixer le temps minimum à 5 secondes et la différence maximale à 1.0, cherchera des fragments presque identiques dans les fichiers.
Un temps de 20 secondes et une différence maximale de 6.0 fonctionne bien pour trouver des remixes/versions live, etc.
Par défaut, chaque fichier musical est comparé à tous les autres et cela peut prendre beaucoup de temps lors du test de plusieurs fichier. Il est donc généralement préférable d'utiliser des dossiers de référence et de spécifier quels fichiers doivent être comparés les uns avec les autres (avec la même quantité de fichiers, la comparaison des empreintes sera au moins 4x plus rapide que sans dossier de référence).
music_comparison_checkbox_tooltip =
La recherche des fichiers de musique similaires est faite à laide d'intelligence artificielle qui utilise l'apprentissage machine pour supprimer les parenthèses dune phrase. Par exemple, avec cette option activée les fichiers en question seront considérés comme des doublons :
Il recherche des fichiers de musique similaires à l'aide d'une intelligence artificielle, qui utilise le machine learning pour supprimer les parenthèses d'une phrase, par exemple avec cette option activée, les fichiers en question seront considérés comme des doublons :
Świędziżłób --- Świędziżłób (Remix Lato 2021)
duplicate_case_sensitive_name = Sensible à la casse
duplicate_case_sensitive_name_tooltip =
Quand activé, groupe les enregistrements uniquement quand ils ont exactement le même nom, par exemple Żołd <-> Żołd
Lorsqu'il est activé, ne grouper que les enregistrements quand ils ont exactement le même nom (p. ex. Żołd <-> Żołd
Désactiver cette option va regrouper les noms sans se préocupper de la casse, par exemple żoŁD <-> Żołd
duplicate_mode_size_name_combo_box = Taille et nom
Désactiver cette option va regrouper les noms sans vérifier si chaque lettre a la même taille, par exemple żoŁD <-> Żołd
duplicate_mode_name_combo_box = Nom
duplicate_mode_size_combo_box = Taille
duplicate_mode_hash_combo_box = Hachage
duplicate_hash_type_tooltip =
Czkawka offre 3 types de hachages :
Blake3 - fonction de hachage cryptographique. Il est utilisé comme algorithme de hachage par défaut car très rapide.
Blake3 - fonction de hachage cryptographique. Il est utilisé comme algorithme de hachage par défaut, car très rapide.
CRC32 - fonction de hachage simple qui devrait être plus rapide que Blake3. Peut, très rarement, provoquer des collisions.
CRC32 - fonction de hachage simple. Cela devrait être plus rapide que Blake3, mais avec probablement de très rares collisions.
XXH3 - très similaire en terme de performances et de qualité de hachage à Blake3 mais non cryptographique. De ce fait ils peuvent facilement être changés l'un pour l'autre.
XXH3 - très similaire en terme de performances et de qualité de hachage à Blake3 (mais non cryptographique). Donc ils peuvent facilement être interchangés.
duplicate_check_method_tooltip =
Pour l'instant, Czkawka offre trois types de méthode pour trouver des doublons par:
@ -58,33 +41,20 @@ duplicate_check_method_tooltip =
Taille - Trouve des fichiers qui ont la même taille.
Hachage - Trouve des fichiers qui ont le même contenu. Ce mode permet de hacher le fichier puis de comparer ensuite le hash pour trouver les doublons. Ce mode est le moyen le plus sûr de trouver les doublons. L'application utilisant massivement le cache, les analyses suivantes des mêmes données devraient être beaucoup plus rapides que la première.
Hachage - Trouve des fichiers qui ont le même contenu. Ce mode permet de hacher le fichier et de le comparer ensuite pour trouver les doublons. Ce mode est le moyen le plus sûr de trouver les doublons. L'application utilise lourdement le cache, donc les analyses secondaires et ultérieures des mêmes données devraient être beaucoup plus rapides que la première.
image_hash_size_tooltip =
Chaque image vérifiée produit un hachage spécial qui peut être comparé les uns aux autres, et une petite différence entre elles signifie que ces images sont similaires.
La taille du hachage 8 est assez bonne pour trouver des images qui ne sont qu'un peu similaires à l'original. Avec un plus grand ensemble d'images (>1000), cela produira une grande quantité de faux positifs, donc je recommande d'utiliser une plus grande taille de hachage dans ce cas.
16 est la taille par défaut du hachage, ce qui est un bon compromis entre trouver même un peu des images similaires et n'avoir qu'une petite quantité de collisions de hachage.
32 et 64 hachages ne trouvent que des images très similaires, mais devraient avoir presque pas de faux positifs (peut-être sauf certaines images avec canal alpha).
image_resize_filter_tooltip =
To compute hash of image, the library must first resize it.
Depend on chosen algorithm, the resulting image used to calculate hash will looks a little different.
Czkawka offre une taille variable de hachage généré pour chaque image. Une taille de hachage plus importante permet de trouver des images avec moins de différences entre les images, mais un peu plus lent à utiliser.
The fastest algorithm to use, but also the one which gives the worst results, is Nearest. It is enabled by default, because with 16x16 hash size lower quality it is not really visible.
La valeur par défaut pour le hachage est de 8 octets, ce qui permet de trouver des images très similaires et différentes. Les hashs 16 octets et 32 octets ne doivent être utilisés que pour des images presque identiques. Le hash de 64 octets ne devrait pas être utilisé, sauf situation où de petites différences sont nécessaires pour trouver.
image_resize_filter_tooltip = Pour calculer le hachage de l'image, la bibliothèque doit d'abord la redimensionner. En fonction de l'algorithme choisi, l'image résultée sera peu différente. L'algorithme le plus rapide à utiliser, mais aussi celui qui donne les pires résultats est Nearest.
image_hash_alg_tooltip = Les utilisateurs peuvent choisir un des nombreux algorithmes de calcul du hachage. Chacun a des points forts et des points faibles et donnera parfois de meilleurs résultats pour des images différentes, parfois pires, afin de choisir le meilleur, des tests manuels sont nécessaires.
main_notebook_image_fast_compare = Comparaison rapide
main_notebook_image_fast_compare_tooltip =
Accélère la recherche et la comparaison des haches.
With 8x8 hash size it is recommended to use a different algorithm than Nearest, to have better groups of images.
image_hash_alg_tooltip =
Les utilisateurs peuvent choisir parmi de nombreux algorithmes pour calculer le hash.
Par opposition au mode normal - où chaque hachage est comparé à chaque fois x (où x est la similitude de l'utilisateur choisis) - dans ce mode, une comparaison sera utilisée.
Chacun a des points forts et des points faibles et donnera parfois des résultats meilleurs et parfois pires pour des images différentes.
Par conséquent, des tests manuels sont requis pour déterminer celui qui donnera le meileur résultat pour vous.
big_files_mode_combobox_tooltip = Permet de rechercher les fichiers les plus petits ou les plus grands
big_files_mode_label = Fichiers cochés
big_files_mode_smallest_combo_box = Le plus petit
big_files_mode_biggest_combo_box = Le plus grand
Cette option est recommandée lors de la comparaison de >10000 images avec la similitude non 0 (Very High) .
main_notebook_duplicates = Fichiers en double
main_notebook_empty_directories = Dossiers vides
main_notebook_big_files = Gros fichiers
@ -110,11 +80,11 @@ main_tree_view_column_bitrate = Débit binaire
main_tree_view_column_length = Longueur
main_tree_view_column_genre = Genre
main_tree_view_column_symlink_file_name = Nom du lien symbolique
main_tree_view_column_symlink_folder = Dossier du lien symbolique
main_tree_view_column_symlink_folder = Dossier Symlink
main_tree_view_column_destination_path = Chemin de destination
main_tree_view_column_type_of_error = Type d'erreur
main_tree_view_column_current_extension = Extension actuelle
main_tree_view_column_proper_extensions = Extension correcte
main_tree_view_column_proper_extensions = Propre extension
main_label_check_method = Méthode de vérification
main_label_hash_type = Type de hachage
main_label_hash_size = Taille du hachage
@ -124,15 +94,11 @@ main_label_max_size = Max
main_label_shown_files = Nombre de fichiers affichés
main_label_resize_algorithm = Algorithme de redimensionnement
main_label_similarity = Similarité{ " " }
main_check_box_broken_files_audio = Audio
main_check_box_broken_files_pdf = Pdf
main_check_box_broken_files_archive = Archiver
main_check_box_broken_files_image = Image
check_button_general_same_size = Ignorer la même taille
check_button_general_same_size_tooltip = Ignorer les fichiers avec la même taille dans les résultats - généralement ce sont des doublons 1:1
check_button_general_same_size_tooltip = Ignorer les résultats, les fichiers dont la taille est identique - généralement ce sont des doublons 1:1
main_label_size_bytes_tooltip = Taille des fichiers qui seront utilisés lors de l'analyse
# Upper window
upper_tree_view_included_folder_column_title = Dossiers dans lesquels chercher
upper_tree_view_included_folder_column_title = Dossiers à rechercher
upper_tree_view_included_reference_column_title = Dossiers de référence
upper_recursive_button = Récursif
upper_recursive_button_tooltip = Si sélectionné, rechercher également les fichiers qui ne sont pas placés directement dans les dossiers choisis.
@ -142,94 +108,74 @@ upper_remove_included_button = Retirer
upper_manual_add_excluded_button = Ajout manuel
upper_add_excluded_button = Ajouter
upper_remove_excluded_button = Retirer
upper_manual_add_included_button_tooltip =
Ajouter manuellement le nom du répertoire à rechercher.
Pour ajouter plusieurs chemins à la fois, séparez-les avec « ; »
« /home/roman;/home/rozkaz » ajoutera deux répertoires « /home/roman » et « /home/rozkaz »
upper_manual_add_included_button_tooltip = Ajouter un nom de répertoire à la recherche manuelle.
upper_add_included_button_tooltip = Ajouter un nouveau répertoire à la recherche.
upper_remove_included_button_tooltip = Supprimer le répertoire de la recherche.
upper_manual_add_excluded_button_tooltip =
Ajouter manuellement un nom de répertoire exclu.
Pour ajouter plusieurs chemins à la fois, séparez-les ave « ; »
« /home/roman;/home/krokiet » ajoutera deux répertoires « /home/roman » et « /home/keokiet »
upper_add_excluded_button_tooltip = Ajouter un répertoire à exclure de la recherche.
upper_remove_excluded_button_tooltip = Retirer le répertoire de la liste de ceux exclus.
upper_manual_add_excluded_button_tooltip = Exclure un nom de répertoire à la recherche manuelle.
upper_add_excluded_button_tooltip = Ajouter un répertoire à exclure dans la recherche.
upper_remove_excluded_button_tooltip = Supprimer le répertoire de lexclusion.
upper_notebook_items_configuration = Configuration des éléments
upper_notebook_excluded_directories = Répertoires exclus
upper_notebook_included_directories = Répertoires inclus
upper_allowed_extensions_tooltip =
Les extensions autorisées doivent être séparées par des virgules (toutes sont disponibles par défaut).
Les extensions autorisées doivent être séparées par des virgules (par défaut, toutes sont disponibles).
Les Macros suivantes, qui ajoutent plusieurs extensions à la fois, sont également disponibles : IMAGE, VIDEO, MUSIC, TEXT.
Exemple d'utilisation : « .exe, IMAGE, VIDEO, .rar, 7z » - signifie que les fichiers images (par exemple jpg, png), des vidéos (par exemple avi, mp4), exe, rar et 7z seront scannés.
upper_excluded_extensions_tooltip =
Liste des fichiers désactivés qui seront ignorés lors de l'analyse.
Lorsque vous utilisez des extensions autorisées et désactivées, celle-ci a une priorité plus élevée, donc le fichier ne sera pas vérifié.
Exemple d'utilisation ".exe, IMAGE, VIDEO, .rar, 7z" - cela signifie que les images (e. jpg, png), des vidéos (par exemple, avi, mp4), exe, rar et 7z des fichiers seront scannés.
upper_excluded_items_tooltip =
Les éléments exclus doivent contenir le caractère joker « * » et être séparés par des virgules.
Ceci est plus lent que les répertoires exclus, donc à utiliser avec prudence.
Les éléments exclus doivent contenir des caractères génériques * et doivent être séparés par des virgules.
Ceci est plus lent que les répertoires exclus, donc utilisez-les attentivement.
upper_excluded_items = Éléments exclus :
upper_allowed_extensions = Extensions autorisées :
upper_excluded_extensions = Extensions désactivées :
# Popovers
popover_select_all = Tout sélectionner
popover_unselect_all = Tout désélectionner
popover_unselect_all = Désélectionner tout
popover_reverse = Inverser la sélection
popover_select_all_except_oldest = Tout sélectionner sauf le plus ancien
popover_select_all_except_newest = Tout sélectionner sauf le plus récent
popover_select_one_oldest = Sélectionner un élément plus ancien
popover_select_one_newest = Sélectionner un élément récent
popover_select_custom = Sélection personnalisée
popover_unselect_custom = Annuler la sélection personnalisée
popover_select_one_oldest = Sélectionner un plus ancien
popover_select_one_newest = Sélectionner la version la plus récente
popover_select_custom = Sélectionner une personnalisation
popover_unselect_custom = Déselection personalisée
popover_select_all_images_except_biggest = Tout sélectionner sauf le plus gros
popover_select_all_images_except_smallest = Tout sélectionner sauf le plus petit
popover_custom_path_check_button_entry_tooltip =
Sélectionner les enregistrements par chemin.
Sélectionnez les enregistrements par chemin.
Exemple d'utilisation :
« /home/pimpek/rzecz.txt » peut être trouvé avec « /home/pim* »
/home/pimpek/rzecz.txt peut être trouvé avec /home/pim*
popover_custom_name_check_button_entry_tooltip =
Sélectionner les enregistrements par nom de fichier.
Sélectionnez les enregistrements par nom de fichier.
Exemple d'utilisation :
« /usr/ping/pong.txt » peut être trouvé avec « *ong* »
/usr/ping/pong.txt peut être trouvé avec *ong*
popover_custom_regex_check_button_entry_tooltip =
Sélectionner les enregistrements par Regex spécifié.
Sélectionnez les enregistrements par Regex spécifié.
Dans ce mode, le texte recherché est le Chemin avec le Nom.
Avec ce mode, le texte recherché est le chemin avec le nom.
Exemple d'utilisation:
« /usr/bin/ziemniak.txt » peut être trouvé avec « /ziem[a-z]+ »
Utilisation d'exemple :
/usr/bin/ziemniak. xt peut être trouvé avec /ziem[a-z]+
Cela utilise l'implémentation par défaut de Rust regex : https://docs.rs/regex.
Cela utilise l'implémentation par défaut de la regex Rust : https://docs.rs/regex.
popover_custom_case_sensitive_check_button_tooltip =
Active la détection sensible à la casse.
Si désactivé, « /home/* » trouve « /HoMe/roman » et « /home/roman ».
Si désactivé, /home/* trouve /HoMe/roman et /home/roman.
popover_custom_not_all_check_button_tooltip =
Empêche la sélection de tous les enregistrements dans le groupe.
Ceci est activé par défaut car, dans la plupart des cas, vous ne voulez pas supprimer à la fois les fichiers originaux et les doublons mais souhaitez laisser au moins un fichier.
Ceci est activé par défaut, car dans la plupart des situations, vous ne voulez pas supprimer à la fois les fichiers originaux et les doublons, mais vous voulez laisser au moins un fichier.
AVERTISSEMENT : ce réglage ne fonctionne pas si vous avez déjà sélectionné manuellement tous les résultats dans un groupe.
AVERTISSEMENT : Ce paramètre ne fonctionne pas si vous avez déjà sélectionné manuellement tous les résultats dans un groupe.
popover_custom_regex_path_label = Chemin d'accès
popover_custom_regex_name_label = Nom
popover_custom_regex_regex_label = Chemin d'accès Regex + Nom
popover_custom_regex_regex_label = Chemin de Regex + Nom
popover_custom_case_sensitive_check_button = Sensible à la casse
popover_custom_all_in_group_label = Ne pas sélectionner tous les enregistrements du groupe
popover_custom_mode_unselect = Désélectionner la personnalisation
popover_custom_mode_select = Sélectionner la personnalisation
popover_sort_file_name = Nom du fichier
popover_sort_folder_name = Nom du dossier
popover_sort_full_name = Nom complet
popover_sort_size = Taille
popover_sort_selection = Sélection
popover_invalid_regex = La regex est invalide
popover_valid_regex = La regex est valide
# Bottom buttons
@ -240,92 +186,76 @@ bottom_save_button = Enregistrer
bottom_symlink_button = Lien symbolique
bottom_hardlink_button = Lien dur
bottom_move_button = Déplacer
bottom_sort_button = Trier
bottom_search_button_tooltip = Lancer la recherche
bottom_select_button_tooltip = Sélectionnez les enregistrements. Seuls les fichiers/dossiers sélectionnés pourront être traités plus tard.
bottom_select_button_tooltip = Sélectionnez les enregistrements. Seuls les fichiers/dossiers sélectionnés peuvent être traités plus tard.
bottom_delete_button_tooltip = Supprimer les fichiers/dossiers sélectionnés.
bottom_save_button_tooltip = Enregistrer les données de la recherche dans un fichier
bottom_save_button_tooltip = Enregistrer les données de la recherche sur un fichier
bottom_symlink_button_tooltip =
Créer des liens symboliques.
Ne fonctionne que si au moins deux résultats dans un groupe sont sélectionnés.
Le premier reste inchangé, tous les suivants sont transformés en lien symbolique vers ce premier résultat.
Le premier est inchangé et le second et plus tard sont liés au premier.
bottom_hardlink_button_tooltip =
Créer des liens durs.
Ne fonctionne que si au moins deux résultats dans un groupe sont sélectionnés.
Le premier reste inchangé, tous les suivants sont transformés en lien dur vers ce premier résultat.
bottom_hardlink_button_not_available_tooltip =
Créer des liens durs.
Le bouton est désactivé car des liens durs ne peuvent être créés.
Les liens durs ne fonctionnent quavec les privilèges administrateur sous Windows, assurez-vous d'éxécuter lapplication en tant quadministrateur.
Si lapplication fonctionne déjà avec ces privilèges, vérifiez les signalements de bogues similaires sur GitHub.
Le premier est inchangé et le second et plus tard sont hardliés au premier.
bottom_move_button_tooltip =
Déplace les fichiers vers le répertoire choisi.
Ceci copie tous les fichiers dans le répertoire cible sans préserver l'arborescence du répertoire source.
Si on tente de déplacer deux fichiers avec le même nom vers le dossier, le second échouera et un message d'erreur s'affichera.
bottom_sort_button_tooltip = Trie les fichiers/dossiers selon la méthode sélectionnée.
Il copie tous les fichiers dans le répertoire sans préserver l'arborescence des répertoires.
En essayant de déplacer deux fichiers avec le même nom vers le dossier, le second échouera et affichera l'erreur.
bottom_show_errors_tooltip = Afficher/Masquer le panneau de texte du bas.
bottom_show_upper_notebook_tooltip = Afficher/Masquer le panneau supérieur du bloc-notes.
# Progress Window
progress_stop_button = Arrêter
progress_stop_additional_message = Arrêt demandé
# About Window
about_repository_button_tooltip = Lien vers la page du dépôt avec le code source.
about_donation_button_tooltip = Lien vers la page des dons.
about_instruction_button_tooltip = Lien vers la page d'instruction.
about_translation_button_tooltip = Lien vers la page Crowdin avec les traductions de lapplication. Le polonais et l'anglais sont officiellement pris en charge.
about_translation_button_tooltip = Lien vers la page Crowdin avec les traductions d'applications. Officiellement le polonais et l'anglais sont pris en charge.
about_repository_button = Dépôt
about_donation_button = Faire un don
about_instruction_button = Instructions
about_translation_button = Traduction
# Header
header_setting_button_tooltip = Ouvre la fenêtre des paramètres.
header_about_button_tooltip = Ouvre la boîte de dialogue contenant les informations sur l'application.
header_about_button_tooltip = Ouvre la boîte de dialogue avec les informations sur l'application.
# Settings
## General
settings_number_of_threads = Nombre de threads utilisés
settings_number_of_threads_tooltip = Nombre de threads utilisés. « 0 » signifie que tous les threads disponibles seront utilisés.
settings_label_restart = Vous devez redémarrer lapplication pour appliquer les réglages!
settings_ignore_other_filesystems = Ignorer les autres systèmes de fichiers (Linux uniquement)
settings_ignore_other_filesystems_tooltip =
ignore les fichiers qui ne sont pas dans le même système de fichiers que les répertoires recherchés.
Fonctionne de la même manière que l'option « -xdev » de la commande « find » sous Linux
settings_save_at_exit_button_tooltip = Enregistrer la configuration dans un fichier à la fermeture de l'application.
settings_save_at_exit_button_tooltip = Enregistrer la configuration dans un fichier lors de la fermeture de l'application.
settings_load_at_start_button_tooltip =
Charger la configuration à partir du fichier à l'ouverture de l'application.
Charger la configuration à partir du fichier lors de l'ouverture de l'application.
Si désactivé, les paramètres par défaut seront utilisés.
settings_confirm_deletion_button_tooltip = Afficher une boîte de dialogue de confirmation lorsque vous cliquez sur le bouton Supprimer.
settings_confirm_link_button_tooltip = Afficher une boîte de dialogue de confirmation lorsque vous cliquez sur le bouton « hard/symlink ».
settings_confirm_group_deletion_button_tooltip = Afficher une boîte de dialogue d'avertissement lorsque vous essayez de supprimer tous les enregistrements du groupe.
Si non activé, les paramètres par défaut seront utilisés.
settings_confirm_deletion_button_tooltip = Afficher la boîte de dialogue de confirmation lorsque vous cliquez sur le bouton Supprimer.
settings_confirm_link_button_tooltip = Afficher la boîte de dialogue de confirmation lorsque vous cliquez sur le bouton hard/symlink.
settings_confirm_group_deletion_button_tooltip = Afficher la boîte de dialogue d'avertissement lorsque vous essayez de supprimer tous les enregistrements du groupe.
settings_show_text_view_button_tooltip = Afficher le panneau de texte en bas de l'interface utilisateur.
settings_use_cache_button_tooltip = Utiliser le cache de fichiers.
settings_save_also_as_json_button_tooltip = Enregistrer le cache au format JSON (lisible par un humain). Il est possible de modifier son contenu. Le contenu de ce fichier sera lu automatiquement par l'application si le cache au format binaire (extension .bin) est manquant.
settings_save_also_as_json_button_tooltip = Enregistrer le cache au format JSON (lisible par l'homme). Il est possible de modifier son contenu. Le cache de ce fichier sera lu automatiquement par l'application si le cache du format binaire (avec l'extension de la corbeille) est manquant.
settings_use_trash_button_tooltip = Déplace les fichiers vers la corbeille au lieu de les supprimer définitivement.
settings_language_label_tooltip = Langue de l'interface utilisateur.
settings_save_at_exit_button = Enregistrer la configuration à la fermeture de l'application
settings_load_at_start_button = Charger la configuration à l'ouverture de l'application
settings_confirm_deletion_button = Afficher une boîte de dialogue de confirmation lors de la suppression de fichiers
settings_confirm_link_button = Afficher une boîte de dialogue de confirmation lorsque des liens en dur ou symboliques vers des fichiers sont créés
settings_confirm_group_deletion_button = Afficher une boîte de dialogue de confirmation lors de la suppression de tous les fichiers d'un groupe
settings_language_label_tooltip = Langue pour l'interface utilisateur.
settings_save_at_exit_button = Enregistrer la configuration lors de la fermeture de l'application
settings_load_at_start_button = Charger la configuration lors de l'ouverture de l'application
settings_confirm_deletion_button = Afficher la boîte de dialogue de confirmation lors de la suppression des fichiers
settings_confirm_link_button = Afficher la boîte de dialogue de confirmation lorsque des liens en dur/liens symboliques sont des fichiers
settings_confirm_group_deletion_button = Afficher la boîte de dialogue de confirmation lors de la suppression de tous les fichiers du groupe
settings_show_text_view_button = Afficher le panneau de texte du bas
settings_use_cache_button = Utiliser le cache
settings_save_also_as_json_button = Également enregistrer le cache en tant que fichier JSON
settings_save_also_as_json_button = Enregistrer également le cache en tant que fichier JSON
settings_use_trash_button = Déplacer les fichiers supprimés vers la corbeille
settings_language_label = Langue
settings_multiple_delete_outdated_cache_checkbutton = Supprimer automatiquement les entrées de cache obsolètes
settings_multiple_delete_outdated_cache_checkbutton_tooltip =
Supprimer du cache les résultats obsolètes pointant vers des fichiers inexistants.
Supprimer les résultats du cache obsolètes qui pointent vers des fichiers inexistants.
Lorsque cette option est activée, l'application s'assure lors du chargement des enregistrements que tous pointent vers des fichiers valides (les fichiers cassés sont ignorés).
Lorsque cette option est activée, l'application s'assure lors du chargement des enregistrements, que tous les enregistrements pointent vers des fichiers valides (les fichiers cassés sont ignorés).
Désactiver cette option facilitera l'analyse de fichiers sur des disques externes: les entrées de cache les concernant ne seront pas purgées lors de la prochaine analyse.
Désactiver ceci aidera lors de l'analyse de fichiers sur des disques externes, de sorte que les entrées de cache à leur sujet ne seront pas purgées lors de la prochaine analyse.
Il est conseillé de d'activer cette option quand des centaines de milliers d'enregistrements sont dans le cache. Ceci permettra d'accélérer le chargement et la sauvegarde du cache au démarrage et à la fin de l'analyse.
Dans le cas d'avoir des centaines de milliers de dossiers en cache, il est conseillé de l'activer, ce qui accélérera le chargement/la sauvegarde du cache au démarrage/fin de l'analyse.
settings_notebook_general = Généraux
settings_notebook_duplicates = Doublons
settings_notebook_images = Images similaires
@ -337,36 +267,36 @@ settings_multiple_image_preview_checkbutton_tooltip = Affiche l'aperçu à droit
settings_multiple_image_preview_checkbutton = Afficher l'aperçu de l'image
settings_multiple_clear_cache_button_tooltip =
Vider manuellement le cache des entrées obsolètes.
À utiliser uniquement si le nettoyage automatique a été désactivé.
settings_multiple_clear_cache_button = Supprimer les résultats périmés du cache.
Cela ne doit être utilisé que si le nettoyage automatique a été désactivé.
settings_multiple_clear_cache_button = Supprimer les résultats obsolètes du cache des images
## Duplicates
settings_duplicates_hide_hard_link_button_tooltip =
Masque tous les fichiers, sauf un, si tous pointent vers les mêmes données (avec lien en dur).
Masque tous les fichiers, sauf un, si tous pointent vers les mêmes données (sont reliés en dur).
Exemple : soient sur le disque sept fichiers reliés à des données spécifiques et un fichier différent avec les mêmes données mais un inode différent ; dans le module de recherche des doublons seuls un fichier unique et un fichier provenant des liens en dur seront affichés.
Exemple : Dans le cas où il y a (sur le disque) sept fichiers qui sont reliés à des données spécifiques et un fichier différent avec les mêmes données mais un inode différent, puis dans le moteur de recherche en double, un seul fichier unique et un seul fichier provenant de liens durs seront affichés.
settings_duplicates_minimal_size_entry_tooltip =
Définit la taille minimale du fichier qui sera mis en cache.
Choisir une valeur plus petite générera plus d'enregistrements. Cela accélérera la recherche, mais ralentira le chargement/l'enregistrement du cache.
settings_duplicates_prehash_checkbutton_tooltip =
Active la mise en cache du prehash (un hachage calculé à partir d'une petite partie du fichier) qui permet un rejet plus rapide des résultats non dupliqués.
Active la mise en cache du prehash (un hachage calculé à partir d'une petite partie du fichier) qui permet le rejet antérieur des résultats non dupliqués.
Il est désactivé par défaut car il peut causer des ralentissements dans certaines situations.
Il est fortement recommandé de l'utiliser lors de la numérisation de centaines de milliers ou de millions de fichiers, car il peut accélérer la recherche de manière géométrique.
settings_duplicates_prehash_minimal_entry_tooltip = Taille minimale de l'entrée en cache.
settings_duplicates_hide_hard_link_button = Masquer les liens en dur (Linux et macOS uniquement)
Il est fortement recommandé de l'utiliser lors de la numérisation de centaines de milliers ou de millions de fichiers, car il peut accélérer la recherche de plusieurs fois.
settings_duplicates_prehash_minimal_entry_tooltip = Taille minimale des entrées en cache.
settings_duplicates_hide_hard_link_button = Masquer les liens durs (uniquement Linux et macOS)
settings_duplicates_prehash_checkbutton = Utiliser le cache de prehash
settings_duplicates_minimal_size_cache_label = Taille minimale des fichiers (en octets) enregistrés dans le cache
settings_duplicates_minimal_size_cache_prehash_label = Taille minimale des fichiers (en octets) enregistrés dans le cache de préhachage
## Saving/Loading settings
settings_saving_button_tooltip = Enregistrez les paramètres de configuration actuels dans un fichier.
settings_loading_button_tooltip = Charger les paramètres à partir d'un fichier pour remplacer la configuration actuelle.
settings_reset_button_tooltip = Réinitialiser la configuration actuelle pour revenir à celle par défaut.
settings_saving_button_tooltip = Enregistrez la configuration des paramètres actuels dans un fichier.
settings_loading_button_tooltip = Charger les paramètres à partir du fichier et remplacer la configuration actuelle avec eux.
settings_reset_button_tooltip = Réinitialiser la configuration actuelle à la configuration par défaut.
settings_saving_button = Enregistrer la configuration
settings_loading_button = Charger la configuration
settings_reset_button = Réinitialiser la configuration
@ -374,11 +304,11 @@ settings_reset_button = Réinitialiser la configuration
## Opening cache/config folders
settings_folder_cache_open_tooltip =
Ouvre le dossier où sont stockés les fichiers « .txt » de cache.
Ouvre le dossier où sont stockés les fichiers de cache txt.
La modification des fichiers de cache peut provoquer l'affichage de résultats invalides. Cependant, la modification du chemin peut faire gagner du temps lorsque une grande quantité de fichiers est déplacée vers un autre emplacement.
La modification des fichiers de cache peut faire apparaître des résultats non valides. Cependant, la modification du chemin peut gagner du temps lorsque vous déplacez une grande quantité de fichiers vers un autre emplacement.
Vous pouvez copier ces fichiers entre ordinateurs pour gagner du temps sur une nouvelle analyse de fichiers (à condition, bien sûr, qu'ils aient une structure de répertoire similaire).
Vous pouvez copier ces fichiers entre ordinateurs pour gagner du temps sur l'analyse de nouveau pour les fichiers (bien sûr s'ils ont une structure de répertoire similaire).
En cas de problèmes avec le cache, ces fichiers peuvent être supprimés. L'application les régénèrera automatiquement.
settings_folder_settings_open_tooltip =
@ -388,19 +318,19 @@ settings_folder_settings_open_tooltip =
settings_folder_cache_open = Ouvrir le dossier de cache
settings_folder_settings_open = Ouvrir le dossier des paramètres
# Compute results
compute_stopped_by_user = La recherche a été interrompue par l'utilisateur
compute_stopped_by_user = La recherche a été arrêtée par l'utilisateur
compute_found_duplicates_hash_size = { $number_files } doublons trouvés dans { $number_groups } groupes qui ont pris { $size }
compute_found_duplicates_name = { $number_files } doublons trouvés dans { $number_groups } groupes
compute_found_duplicates_name = { $number_files } doublons trouvés dans les groupes { $number_groups }
compute_found_empty_folders = { $number_files } dossiers vides trouvés
compute_found_empty_files = { $number_files } fichiers vides trouvés
compute_found_big_files = { $number_files } gros fichiers trouvés
compute_found_big_files = { $number_files } grands fichiers trouvés
compute_found_temporary_files = { $number_files } fichiers temporaires trouvés
compute_found_images = { $number_files } images similaires trouvées dans { $number_groups } groupes
compute_found_videos = { $number_files } vidéos similaires trouvées dans { $number_groups } groupes
compute_found_music = { $number_files } fichiers de musique similaires trouvés dans { $number_groups } groupes
compute_found_images = { $number_files } images similaires trouvées dans les groupes { $number_groups }
compute_found_videos = { $number_files } vidéos similaires trouvées dans les groupes { $number_groups }
compute_found_music = { $number_files } fichiers de musique similaires trouvés dans les groupes { $number_groups }
compute_found_invalid_symlinks = { $number_files } liens symboliques invalides trouvés
compute_found_broken_files = { $number_files } fichiers cassés trouvés
compute_found_bad_extensions = { $number_files } fichiers avec des extensions invalides trouvés
compute_found_bad_extensions = { $number_files } fichiers avec des extensions non valides trouvés
# Progress window
progress_scanning_general_file = Analyse du fichier { $file_number }
progress_scanning_extension_of_files = Vérification de l'extension du fichier { $file_checked }/{ $all_files }
@ -408,92 +338,81 @@ progress_scanning_broken_files = Vérification du fichier { $file_checked }/{ $a
progress_scanning_video = Hachage de la vidéo { $file_checked }/{ $all_files }
progress_scanning_image = Hachage de l'image { $file_checked }/{ $all_files }
progress_comparing_image_hashes = Comparaison du hachage de l'image { $file_checked }/{ $all_files }
progress_scanning_music_tags_end = Comparaison des tags du fichier audio { $file_checked }/{ $all_files }
progress_scanning_music_tags = Lecture des balises du fichier audio { $file_checked }/{ $all_files }
progress_scanning_music_content_end = Comparaison de l'empreinte numérique du fichier audio { $file_checked }/{ $all_files }
progress_scanning_music_content = Calcul de l'empreinte numérique du fichier audio { $file_checked }/{ $all_files }
progress_scanning_music_tags_end = Comparaison des tags du fichier de musique { $file_checked }/{ $all_files }
progress_scanning_music_tags = Lecture des balises du fichier de musique { $file_checked }/{ $all_files }
progress_scanning_empty_folders = Analyse du dossier { $folder_number }
progress_scanning_size = Analyse de la taille du fichier { $file_number }
progress_scanning_size_name = Analyse du nom et de la taille du fichier { $file_number }
progress_scanning_name = Analyse du nom du fichier { $file_number }
progress_analyzed_partial_hash = Analyse partielle du hash de { $file_checked }/{ $all_files } fichiers
progress_analyzed_full_hash = Analyse complète du hash de { $file_checked }/{ $all_files } fichiers
progress_prehash_cache_loading = Chargement du cache du prehash
progress_prehash_cache_saving = Sauvegarde du cache du prehash
progress_hash_cache_loading = Chargement du cache de hachage
progress_hash_cache_saving = Sauvegarde du cache de hachage
progress_cache_loading = Chargement de la cache
progress_cache_saving = Sauvegarde du cache
progress_current_stage = Étape actuelle :{ " " }
progress_all_stages = Toutes les étapes :{ " " }
progress_analyzed_partial_hash = Hash partiel analysé des fichiers { $file_checked }/{ $all_files }
progress_analyzed_full_hash = Hash complet analysé des fichiers { $file_checked }/{ $all_files }
progress_current_stage = Étape actuelle:{ " " }
progress_all_stages = Toutes les étapes:{ " " }
# Saving loading
saving_loading_saving_success = Configuration enregistrée dans le fichier { $name }.
saving_loading_saving_failure = Impossible d'enregistrer les données de configuration dans le fichier { $name }.
saving_loading_reset_configuration = La configuration actuelle a été effacée.
saving_loading_loading_success = Configuration de l'application correctement chargée.
saving_loading_invalid_string = Résultat invalide trouvé pour la clé "{ $key }" - "{ $result }" n'est pas une chaîne.
saving_loading_invalid_int = Résultat invalide trouvé pour la clé "{ $key }" - "{ $result }" n'est pas un entier.
saving_loading_invalid_bool = Résultat invalide trouvé pour la clé "{ $key }" - "{ $result }" n'est pas un booléen.
saving_loading_decode_problem_bool = Impossible de décoder le booléen de la clé "{ $key }". Trouvé "{ $result }" mais les valeurs autorisées sont 0, 1, true ou false.
saving_loading_saving_same_keys = Tentative de sauvegarde du paramètre avec la clé dupliquée «{ $key }».
saving_loading_invalid_string = Pour la clé "{ $key }" trouvé résultat invalide - "{ $result }" qui n'est pas une chaîne.
saving_loading_invalid_int = Pour la clé "{ $key }" trouvé résultat invalide - "{ $result }" qui n'est pas un entier.
saving_loading_invalid_bool = Pour la clé "{ $key }" trouvé résultat invalide - "{ $result }" qui n'est pas un bool.
saving_loading_decode_problem_bool = Impossible de décoder le bool de la clé "{ $key }" trouvé "{ $result }" mais les valeurs autorisées sont 0, 1, true ou false.
saving_loading_saving_same_keys = Tentative de sauvegarde du paramètre avec la clé «{ $key }».
saving_loading_failed_to_get_home_directory = Impossible d'obtenir le répertoire racine pour ouvrir/enregistrer le fichier de configuration.
saving_loading_folder_config_instead_file = Impossible de créer ou d'ouvrir le fichier de configuration sauvegardé à l'emplacement "{ $path }" car il existe déjà un dossier.
saving_loading_failed_to_create_configuration_folder = Échec de la configuration pour créer le dossier de configuration "{ $path }". Raison : "{ $reason }".
saving_loading_failed_to_create_config_file = Impossible de créer le fichier de configuration "{ $path }". Raison : "{ $reason }".
saving_loading_folder_config_instead_file = Impossible de créer ou d'ouvrir le fichier de configuration de sauvegarde dans le chemin "{ $path }" car il existe déjà un dossier.
saving_loading_failed_to_create_configuration_folder = La configuration pour créer le dossier de configuration "{ $path }", raison "{ $reason }".
saving_loading_failed_to_create_config_file = Impossible de créer le fichier de configuration "{ $path }", raison "{ $reason }".
saving_loading_failed_to_read_config_file = Impossible de charger la configuration depuis "{ $path }" car elle n'existe pas ou n'est pas un fichier.
saving_loading_failed_to_read_data_from_file = Impossible de lire les données du fichier "{ $path }". Raison : "{ $reason }".
saving_loading_orphan_data = Données orphelines « { $data } » trouvées à la ligne « { $line } ».
saving_loading_not_valid = Le paramètre « { $data } » n'existe pas dans la version actuelle de l'application.
saving_loading_failed_to_read_data_from_file = Impossible de lire les données du fichier "{ $path }", raison "{ $reason }".
saving_loading_orphan_data = Données orphelines «{ $data }» trouvées à la ligne «{ $line }».
saving_loading_not_valid = Le paramètre «{ $data }» n'existe pas dans la version actuelle de l'application.
# Invalid symlinks
invalid_symlink_infinite_recursion = Récursion infinie
invalid_symlink_non_existent_destination = Fichier de destination inexistant
# Other
selected_all_reference_folders = Impossible de lancer la recherche quand tous les répertoires sont définis comme des répertoires de référence
searching_for_data = Recherche de données. Cela peut prendre un certain temps, veuillez patienter…
searching_for_data = Recherche de données, cela peut prendre un certain temps, veuillez patienter...
text_view_messages = MESSAGES
text_view_warnings = AVERTISSEMENTS
text_view_errors = ERREURS
about_window_motto = Ce programme peut être utilisée gratuitement et le sera toujours.
text_view_warnings = ATTENTIONS
text_view_errors = ERREUR
about_window_motto = Ce programme est gratuit et le sera toujours.
# Various dialog
dialogs_ask_next_time = Demander la prochaine fois
delete_file_failed = Impossible de supprimer le fichier { $name }. Raison : { $reason }
delete_file_failed = Impossible de supprimer le fichier { $name }, raison { $reason }
delete_title_dialog = Confirmation de la suppression
delete_question_label = Êtes-vous sûr de vouloir supprimer les fichiers ?
delete_all_files_in_group_title = Confirmation de la suppression de tous les fichiers du groupe
delete_all_files_in_group_label1 = L'ensemble des enregistrements est sélectionné dans certains groupes.
delete_all_files_in_group_label1 = Dans certains groupes, tous les enregistrements sont sélectionnés.
delete_all_files_in_group_label2 = Êtes-vous sûr de vouloir les supprimer ?
delete_folder_failed = Impossible de supprimer le dossier { $dir } car soit le dossier n'existe pas, vous n'avez pas la permission ou le dossier n'est pas vide.
delete_folder_failed = Impossible de supprimer le dossier { $dir } car le dossier n'existe pas, vous n'avez pas la permission ou le dossier n'est pas vide.
delete_items_label = { $items } fichiers seront supprimés.
delete_items_groups_label = { $items } fichiers de { $groups } groupes seront supprimés.
hardlink_failed = Impossible de créer un lien en dur
hard_sym_invalid_selection_title_dialog = Sélection invalide avec certains groupes
hard_sym_invalid_selection_label_1 = Un seul enregistrement est sélectionné dans certains groupes et il sera ignoré.
hard_sym_invalid_selection_label_2 = Au moins deux résultats au sein du groupe doivent être sélectionnés pour les relier ces par un lien en dur ou symbolique.
hard_sym_invalid_selection_label_3 = Le premier dans le groupe est reconnu comme original et n'est pas modifié mais les suivants le seront.
hardlink_failed = Impossible de relier le matériel
hard_sym_invalid_selection_title_dialog = Sélection non valide avec certains groupes
hard_sym_invalid_selection_label_1 = Dans certains groupes, il n'y a qu'un seul enregistrement sélectionné et il sera ignoré.
hard_sym_invalid_selection_label_2 = Pour être en mesure de relier ces fichiers, au moins deux résultats dans le groupe doivent être sélectionnés.
hard_sym_invalid_selection_label_3 = Le premier dans le groupe est reconnu comme original et n'est pas modifié, mais le second et plus tard sont modifiés.
hard_sym_link_title_dialog = Confirmation du lien
hard_sym_link_label = Êtes-vous sûr de vouloir relier ces fichiers ?
move_folder_failed = Impossible de déplacer le dossier { $name }. Raison : { $reason }
move_file_failed = Impossible de déplacer le fichier { $name }. Raison : { $reason }
hard_sym_link_label = Êtes-vous sûr de vouloir lier ces fichiers ?
move_folder_failed = Impossible de déplacer le dossier { $name }, raison { $reason }
move_file_failed = Impossible de déplacer le fichier { $name }, raison { $reason }
move_files_title_dialog = Choisissez le dossier dans lequel vous voulez déplacer les fichiers dupliqués
move_files_choose_more_than_1_path = Un seul chemin peut être sélectionné pour pouvoir copier leurs fichiers dupliqués. { $path_number } est sélectionné.
move_files_choose_more_than_1_path = Un seul chemin peut être sélectionné pour pouvoir copier leurs fichiers dupliqués, sélectionné { $path_number }.
move_stats = Éléments { $num_files }/{ $all_files } correctement déplacés
save_results_to_file = Résultats enregistrés dans les fichiers txt et json dans le dossier { $name }.
search_not_choosing_any_music = ERREUR : vous devez sélectionner au moins une case à cocher parmi les types de recherche de musique.
search_not_choosing_any_broken_files = ERREUR : vous devez sélectionner au moins une case à cocher parmi les types de fichiers cassés.
save_results_to_file = Résultats enregistrés dans le fichier { $name }
search_not_choosing_any_music = ERREUR : Vous devez sélectionner au moins une case à cocher avec les types de recherche de musique.
include_folders_dialog_title = Dossiers à inclure
exclude_folders_dialog_title = Dossiers à exclure
include_manually_directories_dialog_title = Ajouter un répertoire manuellement
cache_properly_cleared = Cache correctement vidé
cache_clear_duplicates_title = Purge du cache des doublons
cache_clear_similar_images_title = Purge du cache des images similaires
cache_clear_similar_videos_title = Purge du cache des vidéos similaires
cache_clear_message_label_1 = Voulez-vous vider le cache des entrées obsolètes ?
cache_clear_message_label_2 = Cette opération supprimera toutes les entrées du cache qui pointent vers des fichiers invalides.
cache_clear_message_label_3 = Cela peut légèrement accélérer le chargement et la sauvegarde dans le cache.
cache_clear_message_label_4 = AVERTISSEMENT : cette opération supprimera toutes les données mises en cache des disques externes débranchés. Chaque hachage devra donc être régénéré.
cache_clear_duplicates_title = Effacement du cache des doublons
cache_clear_similar_images_title = Nettoyage du cache des images similaires
cache_clear_similar_videos_title = Nettoyage du cache des vidéos similaires
cache_clear_message_label_1 = Voulez-vous vider le cache des entrées obsolètes?
cache_clear_message_label_2 = Cette opération supprimera toutes les entrées du cache qui pointent vers des fichiers non valides.
cache_clear_message_label_3 = Cela peut légèrement accélérer le chargement/sauvegarde dans le cache.
cache_clear_message_label_4 = AVERTISSEMENT : L'opération supprimera toutes les données mises en cache des disques externes débranchés. Chaque hachage devra donc être régénéré.
# Show preview
preview_image_resize_failure = Impossible de redimensionner l'image { $name }.
preview_image_opening_failure = Impossible d'ouvrir l'image { $name }. Raison : { $reason }
preview_image_opening_failure = Impossible d'ouvrir l'image { $name }, raison { $reason }
# Compare images (L is short Left, R is short Right - they can't take too much space)
compare_groups_number = Groupe { $current_group }/{ $all_groups } ({ $images_in_group } images)
compare_move_left_button = L

@ -14,22 +14,6 @@ music_bitrate_checkbox = Bitrate
music_genre_checkbox = Genere
music_length_checkbox = Durata
music_comparison_checkbox = Confronto approssimativo
music_checking_by_tags = Etichette
music_checking_by_content = Contenuto
same_music_seconds_label = Durata minima del frammento
same_music_similarity_label = Differenza massima
same_music_tooltip =
La ricerca di file musicali simili dal suo contenuto può essere configurata impostando:
- Il tempo minimo di frammento dopo il quale i file musicali possono essere identificati come simili
- La differenza massima tra due frammenti testati
La chiave per ottenere buoni risultati è trovare combinazioni sensate di questi parametri, per fornito.
Impostando il tempo minimo a 5s e la differenza massima a 1.0, cercherà frammenti quasi identici nei file.
Un tempo di 20 anni e una differenza massima di 6.0, d'altra parte, funziona bene per trovare remix/versioni live ecc.
Per impostazione predefinita, ogni file musicale viene confrontato tra loro e questo può richiedere molto tempo quando si testano molti file, quindi è di solito meglio usare le cartelle di riferimento e specificare quali file devono essere confrontati tra loro (con la stessa quantità di file, il confronto delle impronte digitali sarà più veloce di almeno 4x che senza cartelle di riferimento).
music_comparison_checkbox_tooltip =
Cerca file musicali simili usando l'IA, che utilizza l'apprendimento automatico per rimuovere parentesi da una frase. Ad esempio, con questa opzione abilitata, i file in questione saranno considerati duplicati:
@ -38,7 +22,6 @@ duplicate_case_sensitive_name = Case Sensitive
duplicate_case_sensitive_name_tooltip =
Se abilitato, raggruppa solo i record quando hanno esattamente lo stesso nome, ad es. Żołd <-> Żołd
La disattivazione di tale opzione raggrupperà i nomi senza controllare se ogni lettera ha le stesse dimensioni, ad esempio żoŁD <-> Żołd
duplicate_mode_size_name_combo_box = Dimensione e nome
duplicate_mode_name_combo_box = Nome
duplicate_mode_size_combo_box = Dimensione
duplicate_mode_hash_combo_box = Hash
@ -59,31 +42,18 @@ duplicate_check_method_tooltip =
Hash - Trova i file che hanno lo stesso contenuto. Questa modalità fa hash sul file e in seguito confronta questo hash per trovare i duplicati. Questa modalità è il modo più sicuro per trovare i duplicati. App usa pesantemente la cache, quindi la seconda e ulteriori scansioni degli stessi dati dovrebbero essere molto più veloce del primo.
image_hash_size_tooltip =
Ogni immagine selezionata produce un hash speciale che può essere confrontato l'uno con l'altro, e una piccola differenza tra loro significa che queste immagini sono simili.
8 hash size è abbastanza buono per trovare immagini che sono solo un po 'simili all'originale. Con un insieme più grande di immagini (>1000), questo produrrà una grande quantità di falsi positivi, quindi vi consiglio di utilizzare una dimensione di hash più grande in questo caso.
16 è la dimensione predefinita dell'hash che è abbastanza un buon compromesso tra trovare anche un po 'di immagini simili e avere solo una piccola quantità di collisioni di hash.
32 e 64 hash trovano solo immagini molto simili, ma non dovrebbero avere quasi falsi positivi (forse tranne alcune immagini con canale alfa).
image_resize_filter_tooltip =
Per calcolare l'hash dell'immagine, la libreria deve prima ridimensionarla.
Dipende dall'algoritmo scelto, l'immagine risultante utilizzata per calcolare l'hash apparirà un po' diversa.
Czkawka offre di cambiare la dimensione dell'hash generato per ogni immagine. Una dimensione di hash più grande consente di trovare immagini con una minore quantità di differenze tra le immagini, ma è anche leggermente più lenta da usare.
L'algoritmo più veloce da usare, ma anche quello che dà i peggiori risultati, è più vicino. È abilitato per impostazione predefinita, perché con 16x16 dimensioni hash di qualità inferiore non è davvero visibile.
Il valore predefinito per l'hash è di 8 byte, che permette di trovare immagini molto simili e diverse. Gli hash di 16 byte e 32 byte dovrebbero essere usati solo per immagini quasi identiche. L'hash da 64 byte non dovrebbe essere utilizzato, tranne nelle situazioni in cui è necessario trovare davvero piccole differenze.
image_resize_filter_tooltip = Per processare l'hash di un'immagine, la libreria deve prima ridimensionarla. In funzione del metodo scelto, l'immagine risultante apparirà leggermente diversa. Il metodo più veloce, ma anche quello che dà i peggiori risultati, è Nearest.
image_hash_alg_tooltip = Gli utenti possono scegliere tra uno dei molti algoritmi di calcolo dell'hash. Ognuno ha punti forti e più deboli e a volte darà risultati migliori e a volte peggiori per immagini diverse. Quindi, per determinare quello migliore per voi, test manuali è richiesto.
main_notebook_image_fast_compare = Confronto veloce
main_notebook_image_fast_compare_tooltip =
Accelerare la ricerca e confrontare hash.
Con 8x8 dimensioni di hash si consiglia di utilizzare un algoritmo diverso da quello più vicino, per avere migliori gruppi di immagini.
image_hash_alg_tooltip =
Gli utenti possono scegliere tra uno dei molti algoritmi di calcolo dell'hash.
Al contrario della modalità normale - dove ogni hash viene confrontato tra loro x volte (dove x è la somiglianza scelta dall'utente) - in questa modalità, verrà utilizzato esattamente un confronto.
Ognuno ha punti forti e più deboli e a volte darà risultati migliori e a volte peggiori per immagini diverse.
Quindi, per determinare quello migliore per te, è necessario un test manuale.
big_files_mode_combobox_tooltip = Consente di cercare file più piccoli/più grandi
big_files_mode_label = File controllati
big_files_mode_smallest_combo_box = Il Più Piccolo
big_files_mode_biggest_combo_box = Il Più Grande
Questa opzione è consigliata quando si confrontano >10000 immagini con la similitudine non 0 (Molto Alta).
main_notebook_duplicates = File duplicati
main_notebook_empty_directories = Cartelle vuote
main_notebook_big_files = Grandi file
@ -123,12 +93,8 @@ main_label_max_size = Max
main_label_shown_files = Numero di file visualizzati
main_label_resize_algorithm = Metodo di ridimensionamento
main_label_similarity = Similitudine{ " " }
main_check_box_broken_files_audio = Audio
main_check_box_broken_files_pdf = Pdf
main_check_box_broken_files_archive = Compresso
main_check_box_broken_files_image = Immagine
check_button_general_same_size = Ignora stesse dimensioni
check_button_general_same_size_tooltip = Ignora i file con dimensioni identiche nei risultati - di solito sono duplicati 1:1
check_button_general_same_size_tooltip = Nei risultati, ignora i file con le stesse dimensioni - solitamente questi sono duplicati 1:1
main_label_size_bytes_tooltip = Dimensione dei file utilizzati nella ricerca
# Upper window
upper_tree_view_included_folder_column_title = Cartelle di ricerca
@ -141,20 +107,10 @@ upper_remove_included_button = Rimuovi
upper_manual_add_excluded_button = Aggiungi manualmente
upper_add_excluded_button = Aggiungi
upper_remove_excluded_button = Rimuovi
upper_manual_add_included_button_tooltip =
Aggiungi nome directory da cercare a mano.
Per aggiungere più percorsi contemporaneamente, separarli da ;
/home/roman;/home/rozkaz aggiungerà due directory /home/roman e /home/rozkaz
upper_manual_add_included_button_tooltip = Aggiungi nome directory da cercare a mano.
upper_add_included_button_tooltip = Aggiungi nuova cartella per la ricerca
upper_remove_included_button_tooltip = Cancella cartella dalla ricerca
upper_manual_add_excluded_button_tooltip =
Aggiungi nome directory escluso a mano.
Per aggiungere più percorsi contemporaneamente, separarli da ;
/home/roman;/home/krokiet aggiungerà due directory /home/roman e /home/keokiet
upper_manual_add_excluded_button_tooltip = Aggiungi nome directory escluso a mano.
upper_add_excluded_button_tooltip = Aggiunge una cartella da escludere dalla ricerca
upper_remove_excluded_button_tooltip = Rimuove una cartella da quelle escluse
upper_notebook_items_configuration = Configurazione degli oggetti
@ -166,16 +122,11 @@ upper_allowed_extensions_tooltip =
Sono disponibili anche i seguenti Macro, che aggiungono più estensioni contemporaneamente: IMAGE, VIDEO, MUSIC, TESTO.
Esempio di utilizzo ".exe, IMAGE, VIDEO, .rar, 7z" - questo significa che le immagini (e. . jpg, png), video (ad esempio avi, mp4), exe, rar e file 7z verranno analizzati.
upper_excluded_extensions_tooltip =
Elenco dei file disabilitati che verranno ignorati nella scansione.
Quando si usano entrambe le estensioni consentite e disabilitate, questo ha la priorità maggiore, quindi il file non verrà selezionato.
upper_excluded_items_tooltip =
Gli elementi esclusi devono contenere * caratteri jolly e devono essere separati da virgole.
Questo è più lento delle directory escluse, quindi usalo attentamente.
upper_excluded_items = Voci escluse:
upper_allowed_extensions = Estensioni permesse:
upper_excluded_extensions = Estensioni Disabilitate:
# Popovers
popover_select_all = Seleziona tutto
popover_unselect_all = Deseleziona tutto
@ -224,11 +175,6 @@ popover_custom_case_sensitive_check_button = Differenzia maiuscole/minuscole
popover_custom_all_in_group_label = Non selezionare tutte le voci in un gruppo
popover_custom_mode_unselect = Deselezione personalizzata
popover_custom_mode_select = Selezione personalizzata
popover_sort_file_name = Nome del file
popover_sort_folder_name = Nome cartella
popover_sort_full_name = Nome e cognome
popover_sort_size = Dimensione
popover_sort_selection = Selezione
popover_invalid_regex = Regex non valida
popover_valid_regex = Regex valida
# Bottom buttons
@ -239,7 +185,6 @@ bottom_save_button = Salva
bottom_symlink_button = Collegamenti simbolici
bottom_hardlink_button = Collegamenti fisici
bottom_move_button = Sposta
bottom_sort_button = Ordina
bottom_search_button_tooltip = Avvia ricerca
bottom_select_button_tooltip = Seleziona record. Solo i file/cartelle selezionati possono essere elaborati in seguito.
bottom_delete_button_tooltip = Cancella i file/cartelle selezionati
@ -252,21 +197,14 @@ bottom_hardlink_button_tooltip =
Crea collegamenti fisici.
Funziona solo quando sono selezionati almeno due risultati in un gruppo.
Il primo è invariato e il secondo e poi sono hardlinked al primo.
bottom_hardlink_button_not_available_tooltip =
Crea collegamenti fisici.
Il pulsante è disabilitato, perché non è possibile creare collegamenti fisici.
I collegamenti fisici funzionano solo con i privilegi di amministratore su Windows, quindi assicurati di eseguire l'app come amministratore.
Se l'app funziona già con tali privilegi, controlla problemi simili su Github.
bottom_move_button_tooltip =
Sposta i file nella directory scelta.
Copia tutti i file nella directory senza conservare l'albero delle directory.
Quando si tenta di spostare due file con il nome identico nella cartella, il secondo fallirà e mostrerà errore.
bottom_sort_button_tooltip = Ordina file/cartelle in base al metodo selezionato.
bottom_show_errors_tooltip = Mostra/Nasconde il pannello di testo inferiore.
bottom_show_upper_notebook_tooltip = Mostra/Nasconde il pannello comandi.
# Progress Window
progress_stop_button = Ferma
progress_stop_additional_message = Interrompi richiesta
# About Window
about_repository_button_tooltip = Link alla pagina del repository con il codice sorgente.
about_donation_button_tooltip = Link alla pagina della donazione.
@ -285,14 +223,6 @@ header_about_button_tooltip = Apre la finestra delle informazioni sul programma.
## General
settings_number_of_threads = Numero di thread usati
settings_number_of_threads_tooltip = Numero di thread usati, 0 significa che tutti i thread disponibili saranno utilizzati.
settings_label_restart = È necessario riavviare l'app per applicare le impostazioni!
settings_ignore_other_filesystems = Ignora altri filesystem (solo Linux)
settings_ignore_other_filesystems_tooltip =
ignora i file che non sono nello stesso file system delle directory cercate.
Funziona come l'opzione -xdev nel comando find su Linux
settings_save_at_exit_button_tooltip = Salva la configurazione su file quando chiudi l'app.
settings_load_at_start_button_tooltip =
Carica la configurazione dal file all'apertura dell'applicazione.
@ -337,7 +267,7 @@ settings_multiple_image_preview_checkbutton = Mostra anteprima immagini
settings_multiple_clear_cache_button_tooltip =
Pulisci manualmente la cache delle voci obsolete.
Questo dovrebbe essere usato solo se la compensazione automatica è stata disabilitata.
settings_multiple_clear_cache_button = Rimuovi i risultati obsoleti dalla cache.
settings_multiple_clear_cache_button = Rimuove risultati obsoleti dalla cache delle immagini
## Duplicates
@ -409,20 +339,11 @@ progress_scanning_image = Hashing di { $file_checked }/{ $all_files } image
progress_comparing_image_hashes = Confrontando { $file_checked }/{ $all_files } hash delle immagini
progress_scanning_music_tags_end = Confrontando le etichette di { $file_checked }/{ $all_files } file musicali
progress_scanning_music_tags = Leggendo le etichette di { $file_checked }/{ $all_files } file musicali
progress_scanning_music_content_end = Confronto delle impronte digitali di { $file_checked }/{ $all_files } file musicale
progress_scanning_music_content = Calcolo dell'impronta digitale di { $file_checked }/{ $all_files } file musicale
progress_scanning_empty_folders = Verificando { $folder_number } cartelle
progress_scanning_size = Leggendo le dimensioni di { $file_number } file
progress_scanning_size_name = Scansione nome e dimensione del file { $file_number }
progress_scanning_name = Leggendo il nome di { $file_number } file
progress_analyzed_partial_hash = Analizzato gli hash parziali di { $file_checked }/{ $all_files } file
progress_analyzed_full_hash = Analizzato gli hash completi di { $file_checked }/{ $all_files } file
progress_prehash_cache_loading = Caricamento della cache prehash
progress_prehash_cache_saving = Salvataggio della cache prehash
progress_hash_cache_loading = Caricamento della cache hash
progress_hash_cache_saving = Salvataggio della cache hash
progress_cache_loading = Caricamento cache
progress_cache_saving = Salvataggio cache
progress_current_stage = Fase attuale:{ " " }
progress_all_stages = Tutte le fasi:{ " " }
# Saving loading
@ -447,7 +368,6 @@ saving_loading_not_valid = L'impostazione "{ $data }" non esiste nella versione
invalid_symlink_infinite_recursion = Ricorsione infinita
invalid_symlink_non_existent_destination = File di destinazione inesistente
# Other
selected_all_reference_folders = Impossibile avviare la ricerca, quando tutte le directory sono impostate come cartelle di riferimento
searching_for_data = Ricerca dei dati, può durare a lungo, attendere prego...
text_view_messages = MESSAGGI
text_view_warnings = ATTENZIONE
@ -476,9 +396,8 @@ move_file_failed = Spostamento file { $name } fallito, ragione { $reason }
move_files_title_dialog = Seleziona la cartella dove vuoi spostare i file duplicati
move_files_choose_more_than_1_path = Solo un percorso può essere selezionato per essere in grado di copiare i file duplicati, selezionato { $path_number }.
move_stats = { $num_files }/{ $all_files } elementi spostati con successo
save_results_to_file = Risultati salvati sia in file txt che json nella cartella { $name }.
save_results_to_file = Risultati salvati su file
search_not_choosing_any_music = ERRORE: Devi selezionare almeno una casella dei metodi di ricerca musicali.
search_not_choosing_any_broken_files = ERRORE: è necessario selezionare almeno una casella di controllo selezionando il tipo di file danneggiati.
include_folders_dialog_title = Cartelle incluse
exclude_folders_dialog_title = Cartelle escluse
include_manually_directories_dialog_title = Aggiungi cartella manualmente

@ -11,25 +11,9 @@ music_title_checkbox = タイトル
music_artist_checkbox = アーティスト
music_year_checkbox = 年
music_bitrate_checkbox = ビットレート
music_genre_checkbox = ジャンル
music_genre_checkbox = Genre
music_length_checkbox = 長さ
music_comparison_checkbox = おおよその比較
music_checking_by_tags = タグ
music_checking_by_content = コンテンツ
same_music_seconds_label = フラグメント最小秒の持続時間
same_music_similarity_label = 最大差
same_music_tooltip =
音楽ファイルの内容から類似ファイルを検索するように設定できます:
- 音楽ファイルが類似していると識別されるフラグメントの最小時間
- テストされた2つのフラグメントの最大差分
良い結果を得るための鍵は、これらのパラメータの賢明な組み合わせを見つけることです。
最小時間を5秒、最大差を1.0に設定すると、ファイル内のほとんど同じフラグメントを探します。
一方、時間を20秒、差の最大値を6.0に設定すると、リミックスやライブ・バージョンなどを探すのに効果的です。
デフォルトでは、各音楽ファイルは互いに比較され、多数のファイルをテストする場合、これは多くの時間を要します。したがって、通常、参照フォルダを使用し、どのファイルを互いに比較するかを指定する方が良いでしょう(同じ量のファイルでは、フィンガープリントの比較は参照フォルダなしよりも少なくとも 4 倍速くなります)。
music_comparison_checkbox_tooltip =
機械学習によりフレーズから括弧とその中身を除外するAIを使用して、類似の音楽ファイルを検索します。このオプションが有効な場合、例えば以下のファイルは重複とみなされます:
@ -39,7 +23,6 @@ duplicate_case_sensitive_name_tooltip =
有効な場合、グループのみレコードまったく同じ名前を持っている場合など。 Z<unk> ołd <-> Z<unk> ołd
このようなオプションを無効にすると、各文字のサイズが同じかどうかを確認せずに名前をグループ化します。例: z<unk> o<unk> D <-> Z<unk> ołd
duplicate_mode_size_name_combo_box = サイズと名前
duplicate_mode_name_combo_box = 名前
duplicate_mode_size_combo_box = サイズ
duplicate_mode_hash_combo_box = ハッシュ
@ -60,31 +43,18 @@ duplicate_check_method_tooltip =
ハッシュ - 同じ内容のファイルを探します。ファイルをハッシュ化して比較することにより重複を見つけます。このモードは、重複を見つけるための最も安全な方法です。このツールはキャッシュを多用するので、同じデータの2回目以降のスキャンは最初の時よりずっと速くなるはずです。
image_hash_size_tooltip =
Each checked image produces a special hash which can be compared with each other, and a small difference between them means that these images are similar.
8 hash size is quite good to find images that are only a little similar to original. With a bigger set of images (>1000), this will produce a big amount of false positives, so I recommend to use a bigger hash size in this case.
16 is the default hash size which is quite a good compromise between finding even a little similar images and having only a small amount of hash collisions.
32 and 64 hashes find only very similar images, but should have almost no false positives (maybe except some images with alpha channel).
image_resize_filter_tooltip =
To compute hash of image, the library must first resize it.
Czkawkaは各画像に対して生成されたハッシュのサイズの変更を提供します。 ハッシュが大きいほど画像間の差異の少ない画像を見つけることができますが、動作が少し遅くなります。
Depend on chosen algorithm, the resulting image used to calculate hash will looks a little different.
ハッシュ値のデフォルトの大きさは8バイトで、非常に類似した異なる画像を見つけることができます。 16バイトと32バイトのハッシュは、ほぼ同じ画像にのみ使用する必要があります。 本当に小さな違いを見つける必要がある状況を除いて、64 バイトのハッシュは使用するべきではありません。
image_resize_filter_tooltip = 画像のハッシュを計算するには、ライブラリはまず画像のサイズを変更する必要があります。選択されたアルゴリズムによって、結果の画像はほとんど異なります。 最速のアルゴリズムであり、かつ最も悪い結果をもたらすアルゴリズムはNearestです。
image_hash_alg_tooltip = ユーザーは多くのハッシュ方式から1つを選択することができます。 それぞれが長所と短所の両方を持っており、時には異なる画像に対してより良い結果や悪い結果を与えます。 あなたにとって最良のものを選ぶには、それらを自分自身で試す必要があります。
main_notebook_image_fast_compare = 高速な比較
main_notebook_image_fast_compare_tooltip =
ハッシュの検索・比較を高速化します。
The fastest algorithm to use, but also the one which gives the worst results, is Nearest. It is enabled by default, because with 16x16 hash size lower quality it is not really visible.
通常モードでは、各ハッシュをx回比較しますxはユーザが選択した類似度
With 8x8 hash size it is recommended to use a different algorithm than Nearest, to have better groups of images.
image_hash_alg_tooltip =
ハッシュの計算方法は、多くのアルゴリズムの中からユーザーが選択することができます。
それぞれ長所と短所があり、画像によって良い結果が出る場合もあれば、悪い結果が出る場合もあります。
そのため、最適なものを見極めるには、手動でのテストが必要です。
big_files_mode_combobox_tooltip = 最小/最大のファイルを検索できます
big_files_mode_label = チェックされたファイル
big_files_mode_smallest_combo_box = 最も小さい
big_files_mode_biggest_combo_box = 最大のもの
このオプションは、類似度が0(非常に高い) ではない1,000枚以上の画像を比較する場合に推奨されます。
main_notebook_duplicates = 重複したファイル
main_notebook_empty_directories = 空のディレクトリ
main_notebook_big_files = 大きなファイル
@ -124,12 +94,8 @@ main_label_max_size = 最大値
main_label_shown_files = 表示するファイルの数
main_label_resize_algorithm = アルゴリズムのサイズを変更
main_label_similarity = 類似度{" "}
main_check_box_broken_files_audio = 音声
main_check_box_broken_files_pdf = Pdf
main_check_box_broken_files_archive = アーカイブする
main_check_box_broken_files_image = Image
check_button_general_same_size = 同じサイズを無視
check_button_general_same_size_tooltip = 結果として同じサイズのファイルを無視 - 通常、これらは1:1重複です
check_button_general_same_size_tooltip = 同一のサイズのファイルがあった場合、結果から無視する - 通常これは1:1重複です
main_label_size_bytes_tooltip = スキャンで使用されるファイルのサイズ
# Upper window
upper_tree_view_included_folder_column_title = 検索するフォルダ
@ -142,20 +108,10 @@ upper_remove_included_button = 削除
upper_manual_add_excluded_button = 手動追加
upper_add_excluded_button = 追加
upper_remove_excluded_button = 削除
upper_manual_add_included_button_tooltip =
手動で検索するディレクトリ名を追加します。
一度に複数のパスを追加するには、 ;
/home/roman;/home/rozkazは/home/romanと/home/rozkazの2つのディレクトリを追加します。
upper_manual_add_included_button_tooltip = 検索するディレクトリ名を手動で追加します。
upper_add_included_button_tooltip = 検索に新しいディレクトリを追加します。
upper_remove_included_button_tooltip = 検索からディレクトリを削除します。
upper_manual_add_excluded_button_tooltip =
除外されたディレクトリ名を手動で追加します。
一度に複数のパスを追加するには、 ;
/home/roman;/home/krokiet は /home/roman と /home/keokiet の 2 つのディレクトリを追加します。
upper_manual_add_excluded_button_tooltip = 除外するディレクトリ名を手動で追加します。
upper_add_excluded_button_tooltip = 検索で除外するディレクトリを追加します。
upper_remove_excluded_button_tooltip = 除外されたディレクトリを削除します。
upper_notebook_items_configuration = アイテム設定
@ -167,16 +123,11 @@ upper_allowed_extensions_tooltip =
複数の拡張子を一度に追加するマクロ: IMAGE, VIDEO, MUSIC, TEXT も利用可能です。
使用例: ".exe, IMAGE, VIDEO, .rar, 7z" - これは画像jpg、pngなど、動画avi、mp4など、exe、rar、7zファイルがスキャンされることを意味します。
upper_excluded_extensions_tooltip =
スキャンで無視される無効なファイルの一覧です。
許可された拡張子と無効化された拡張子の両方を使用する場合、この拡張子の方が優先度が高いので、ファイルはチェックされません。
upper_excluded_items_tooltip =
除外された項目はワイルドカード * を含んでいる必要があり、カンマで区切る必要があります。
ディレクトリを除外するよりも遅いので注意してください。
upper_excluded_items = 除外するアイテム:
upper_allowed_extensions = 許可される拡張子:
upper_excluded_extensions = 無効なエクステンション:
# Popovers
popover_select_all = すべて選択
popover_unselect_all = すべて選択解除
@ -225,11 +176,6 @@ popover_custom_case_sensitive_check_button = 大文字と小文字を区別
popover_custom_all_in_group_label = グループ内のすべてのレコードを選択しない
popover_custom_mode_unselect = カスタム選択を解除
popover_custom_mode_select = カスタム選択
popover_sort_file_name = ファイル名
popover_sort_folder_name = フォルダー名
popover_sort_full_name = カード名義人
popover_sort_size = サイズ
popover_sort_selection = 選択
popover_invalid_regex = 正規表現が無効です
popover_valid_regex = 正規表現が有効です
# Bottom buttons
@ -240,7 +186,6 @@ bottom_save_button = 保存
bottom_symlink_button = シンボリックリンク
bottom_hardlink_button = ハードリンク
bottom_move_button = 移動
bottom_sort_button = 並び替え
bottom_search_button_tooltip = 検索を開始
bottom_select_button_tooltip = レコードを選択します。選択したファイル/フォルダのみが後で処理できます。
bottom_delete_button_tooltip = 選択したファイル/フォルダを削除します。
@ -253,21 +198,14 @@ bottom_hardlink_button_tooltip =
ハードリンクを作成します。
グループ内の2つ以上の結果が選択されている場合にのみ機能します。
最初の結果は変更されず、2番目以降の結果が最初の結果にハードリンクされます。
bottom_hardlink_button_not_available_tooltip =
ハードリンクを作成する。
ハードリンクを作成できないため、ボタンは無効になっています。
ハードリンクはWindowsの管理者権限でのみ動作するので、アプリは必ず管理者として実行してください。
アプリがすでにそのような権限で動作している場合は、Githubに同様の問題がないか確認してください。
bottom_move_button_tooltip =
選択したフォルダにファイルを移動します。
ディレクトリツリーを維持したまま、すべてのファイルをフォルダにコピーします。
同じ名前の2つのファイルをフォルダに移動しようとすると、2番目のファイルが失敗し、エラーが表示されます。
bottom_sort_button_tooltip = 選択した方法に従ってファイル/フォルダを並べ替えます。
bottom_show_errors_tooltip = 下部のエラーパネルを表示/非表示にします。
bottom_show_upper_notebook_tooltip = 上部のノートブックパネルを表示/非表示にします。
# Progress Window
progress_stop_button = 停止
progress_stop_additional_message = リクエストを停止する
# About Window
about_repository_button_tooltip = ソースコードのあるリポジトリページへのリンク
about_donation_button_tooltip = 寄付ページへのリンク
@ -286,14 +224,6 @@ header_about_button_tooltip = アプリに関する情報を含むダイアロ
## General
settings_number_of_threads = 使用されるスレッドの数
settings_number_of_threads_tooltip = 使用するスレッドの数、0 は、使用可能なすべてのスレッドが使用されることを意味します。
settings_label_restart = 設定を適用するにはアプリを再起動する必要があります!
settings_ignore_other_filesystems = 他のファイルシステムを無視(Linuxのみ)
settings_ignore_other_filesystems_tooltip =
検索されたディレクトリと同じファイルシステムにないファイルを無視します。
Linux の find コマンドで -xdev オプションのように動作します。
settings_save_at_exit_button_tooltip = 終了時に設定をファイルに保存します。
settings_load_at_start_button_tooltip =
起動時にファイルから設定を読み込みます。
@ -338,7 +268,7 @@ settings_multiple_image_preview_checkbutton = 画像のプレビューを表示
settings_multiple_clear_cache_button_tooltip =
古いキャッシュエントリを手動でクリアします。
自動クリアが無効の場合にのみ使用する必要があります。
settings_multiple_clear_cache_button = キャッシュから古い結果を削除します。
settings_multiple_clear_cache_button = 画像キャッシュから古い結果を削除
## Duplicates
@ -410,20 +340,11 @@ progress_scanning_image = { $file_checked }/{ $all_files } の画像のハッシ
progress_comparing_image_hashes = { $file_checked }/{ $all_files } 画像ハッシュの比較
progress_scanning_music_tags_end = { $file_checked }/{ $all_files } 音楽ファイルのタグの比較
progress_scanning_music_tags = { $file_checked }/{ $all_files } 音楽ファイルのタグを読み込み中
progress_scanning_music_content_end = { $file_checked }/{ $all_files } 音楽ファイルのフィンガープリントの比較
progress_scanning_music_content = { $file_checked }/{ $all_files } 音楽ファイルのフィンガープリントを計算中
progress_scanning_empty_folders = { $folder_number } フォルダをスキャン中
progress_scanning_size = { $file_number } ファイルのサイズをスキャン中
progress_scanning_size_name = 名前と { $file_number } ファイルのサイズをスキャンしています
progress_scanning_name = { $file_number } ファイルの名前をスキャン中
progress_analyzed_partial_hash = { $file_checked }/{ $all_files } ファイルの部分ハッシュを分析中
progress_analyzed_full_hash = { $file_checked }/{ $all_files } ファイルの完全ハッシュを分析中
progress_prehash_cache_loading = プレハッシュキャッシュを読み込み中
progress_prehash_cache_saving = プレハッシュキャッシュを保存しています
progress_hash_cache_loading = ハッシュキャッシュを読み込み中
progress_hash_cache_saving = ハッシュキャッシュを保存中
progress_cache_loading = キャッシュを読み込み中
progress_cache_saving = キャッシュを保存中
progress_current_stage = 現在のステージ:{ " " }
progress_all_stages = すべてのステージ:{ " " }
# Saving loading
@ -448,7 +369,6 @@ saving_loading_not_valid = 設定 "{ $data }" は現在のバージョンのア
invalid_symlink_infinite_recursion = 無限再帰性
invalid_symlink_non_existent_destination = 保存先ファイルが存在しません
# Other
selected_all_reference_folders = すべてのディレクトリが参照フォルダとして設定されている場合、検索を開始できません
searching_for_data = データを検索中、しばらくお待ちください...
text_view_messages = メッセージ
text_view_warnings = 警告
@ -477,9 +397,8 @@ move_file_failed = ファイル { $name } を移動できませんでした、
move_files_title_dialog = 重複したファイルの移動先フォルダを選択
move_files_choose_more_than_1_path = 重複したファイルをコピーするには、1つのパスのみを選択する必要があります、{ $path_number } つ選択されました。
move_stats = { $num_files }/{ $all_files } アイテムを適切に移動しました
save_results_to_file = txtファイルとjsonファイルの両方を { $name } フォルダに保存しました
save_results_to_file = ファイル { $name } に結果を保存しました
search_not_choosing_any_music = エラー: 音楽検索タイプのチェックボックスを少なくとも1つ選択する必要があります。
search_not_choosing_any_broken_files = エラー: チェックされた壊れたファイルの種類のチェックボックスを少なくとも1つ選択する必要があります。
include_folders_dialog_title = 含めるフォルダ
exclude_folders_dialog_title = 除外するフォルダ
include_manually_directories_dialog_title = ディレクトリを手動で追加

@ -1,500 +0,0 @@
# Window titles
window_settings_title = 설정
window_main_title = Czkawka (Hiccup)
window_progress_title = 스캔중
window_compare_images = 이미지 비교
# General
general_ok_button = 확인
general_close_button = 닫기
# Main window
music_title_checkbox = 제목
music_artist_checkbox = 아티스트
music_year_checkbox = 연도
music_bitrate_checkbox = 비트레이트
music_genre_checkbox = 장르
music_length_checkbox = 길이
music_comparison_checkbox = 근사값 비교
music_checking_by_tags = Tags
music_checking_by_content = Content
same_music_seconds_label = Minimal fragment second duration
same_music_similarity_label = Maximum difference
same_music_tooltip =
Searching for similar music files by its content can be configured by setting:
- The minimum fragment time after which music files can be identified as similar
- The maximum difference difference between two tested fragments
The key to good results is to find sensible combinations of these parameters, for provided.
Setting the minimum time to 5s and the maximum difference to 1.0, will look for almost identical fragments in the files.
A time of 20s and a maximum difference of 6.0, on the other hand, works well for finding remixes/live versions etc.
By default, each music file is compared to each other and this can take a lot of time when testing many files, so it is usually better to use reference folders and specifying which files are to be compared with each other(with same amount of files, comparing fingerprints will be faster at least 4x than without reference folders).
music_comparison_checkbox_tooltip =
기계학습을 통해 각 항목의 괄호를 제거합니다. 예를 들어, 다음 두 파일은 같은 파일로 인식될 것입니다.
Świędziżłób --- Świędziżłób (Remix Lato 2021)
duplicate_case_sensitive_name = 대소문자 구분
duplicate_case_sensitive_name_tooltip =
대소문자 구분이 켜져 있으면, 완전히 같은 이름만이 중복 파일로 검색됩니다. 예시: Żołd <-> Żołd
대소문자 구분이 꺼져 있으면, 대문자와 소문자 구별을 하지 않고 중복 파일을 검색합니다. 예시: żoŁD <-> Żołd
duplicate_mode_size_name_combo_box = Size and Name
duplicate_mode_name_combo_box = 파일명
duplicate_mode_size_combo_box = 파일 크기
duplicate_mode_hash_combo_box = 해시
duplicate_hash_type_tooltip =
Czkawka는 3가지 유형의 해시 함수를 지원합니다.
Blake3 - 암호화에 사용되는 해시입니다. 매우 빠르게 작동하므로, 기본값으로 설정되어 있습니다.
CRC32 - 간단한 해시 함수입니다. Blake3보다는 빠르지만, 매우 드물게 충돌이 발생합니다.
XXH3 - Black3와 해시 품질 및 성능 면에서 매우 유사하지만, 암호화에 쓰이지는 않습니다. 때문에 Black3와 실질적으로 같습니다.
duplicate_check_method_tooltip =
현재 Czkawka는 중복 파일을 찾는데 3가지 방법을 지원합니다.
파일명 - 같은 이름을 가진 파일들을 찾습니다.
파일 크기 - 같은 크기를 가진 파일들을 찾습니다.
해시 - 같은 내용을 가진 파일들을 찾습니다. 이 모드에서는 먼저 파일을 해시한 다음, 각 해시값들을 비교하여 중복 파일인지 식별합니다. 때문에 중복 파일을 찾는 데 있어 가장 확실한 방법입니다. Czkawka는 캐시에 매우 의존하므로, 같은 데이터를 두 번째 이후로 스캔하는 경우 첫 번째 스캔보다 더욱 빠르게 스캔이 이루어집니다.
image_hash_size_tooltip =
Each checked image produces a special hash which can be compared with each other, and a small difference between them means that these images are similar.
8 hash size is quite good to find images that are only a little similar to original. With a bigger set of images (>1000), this will produce a big amount of false positives, so I recommend to use a bigger hash size in this case.
16 is the default hash size which is quite a good compromise between finding even a little similar images and having only a small amount of hash collisions.
32 and 64 hashes find only very similar images, but should have almost no false positives (maybe except some images with alpha channel).
image_resize_filter_tooltip =
To compute hash of image, the library must first resize it.
Depend on chosen algorithm, the resulting image used to calculate hash will looks a little different.
The fastest algorithm to use, but also the one which gives the worst results, is Nearest. It is enabled by default, because with 16x16 hash size lower quality it is not really visible.
With 8x8 hash size it is recommended to use a different algorithm than Nearest, to have better groups of images.
image_hash_alg_tooltip =
해시를 계산하는 데 사용되는 알고리즘을 선택할 수 있습니다.
각각의 알고리즘은 장단점이 있으므로, 경우마다 더 낫거나 더 나쁜 결과를 보여줄 수 있습니다.
따라서 가장 좋은 알고리즘을 찾으려면 수동으로 테스트해 보는 것이 좋습니다.
big_files_mode_combobox_tooltip = 가장 큰 파일 또는 가장 작은 파일을 찾을 수 있습니다.
big_files_mode_label = 찾을 파일
big_files_mode_smallest_combo_box = 작은 파일
big_files_mode_biggest_combo_box = 큰 파일
main_notebook_duplicates = 중복 파일
main_notebook_empty_directories = 빈 디렉터리
main_notebook_big_files = 큰 파일
main_notebook_empty_files = 빈 파일
main_notebook_temporary = 임시 파일
main_notebook_similar_images = 비슷한 이미지
main_notebook_similar_videos = 비슷한 영상
main_notebook_same_music = 중복 음악
main_notebook_symlinks = 잘못된 심볼릭 링크
main_notebook_broken_files = 손상된 파일
main_notebook_bad_extensions = 잘못된 확장자
main_tree_view_column_file_name = 파일명
main_tree_view_column_folder_name = 폴더명
main_tree_view_column_path = 경로
main_tree_view_column_modification = 수정한 날짜
main_tree_view_column_size = 파일 크기
main_tree_view_column_similarity = 유사도
main_tree_view_column_dimensions = 크기
main_tree_view_column_title = 제목
main_tree_view_column_artist = 아티스트
main_tree_view_column_year = 연도
main_tree_view_column_bitrate = 비트레이트
main_tree_view_column_length = 길이
main_tree_view_column_genre = 장르
main_tree_view_column_symlink_file_name = 심볼릭 링크 파일명
main_tree_view_column_symlink_folder = 심볼릭 링크 폴더
main_tree_view_column_destination_path = 심볼릭 링크 대상 경로
main_tree_view_column_type_of_error = 손상 유형
main_tree_view_column_current_extension = 현재 확장자
main_tree_view_column_proper_extensions = 올바른 확장자
main_label_check_method = 확인 방법
main_label_hash_type = 해시 유형
main_label_hash_size = 해시 크기
main_label_size_bytes = 파일 크기 (바이트)
main_label_min_size = 최소
main_label_max_size = 최대
main_label_shown_files = 찾을 파일의 개수
main_label_resize_algorithm = 크기 변경 알고리즘
main_label_similarity = 유사도{ " " }
main_check_box_broken_files_audio = 음악 파일
main_check_box_broken_files_pdf = PDF
main_check_box_broken_files_archive = 압축 파일
main_check_box_broken_files_image = 이미지
check_button_general_same_size = 같은 파일크기 무시
check_button_general_same_size_tooltip = Ignore files with identical size in results - usually these are 1:1 duplicates
main_label_size_bytes_tooltip = 스캔할 파일의 크기입니다.
# Upper window
upper_tree_view_included_folder_column_title = 검색할 폴더
upper_tree_view_included_reference_column_title = 기준 폴더
upper_recursive_button = 재귀
upper_recursive_button_tooltip = 켜져 있으면, 하위 폴더 내부의 파일까지 검색합니다.
upper_manual_add_included_button = 수동 추가
upper_add_included_button = 추가
upper_remove_included_button = 제거
upper_manual_add_excluded_button = 수동 추가
upper_add_excluded_button = 추가
upper_remove_excluded_button = 제거
upper_manual_add_included_button_tooltip =
직접 검색할 경로를 입력합니다.
여러 경로를 입력하고자 한다면, ';'로 구분하세요.
'/home/roman;/home/rozkaz' 를 입력하면, '/home/roman'와 '/home/rozkaz'가 추가됩니다.
upper_add_included_button_tooltip = 검색할 디렉터리를 추가합니다.
upper_remove_included_button_tooltip = 검색할 디렉터리에서 제거합니다.
upper_manual_add_excluded_button_tooltip =
직접 제외할 경로를 입력합니다.
여러 경로를 입력하고자 한다면, ';'로 구분하세요.
'/home/roman;/home/krokiet' 를 입력하면, '/home/roman'와 '/home/krokiet'가 추가됩니다.
upper_add_excluded_button_tooltip = 제외할 디렉터리를 추가합니다.
upper_remove_excluded_button_tooltip = 제외할 디렉터리에서 제거합니다.
upper_notebook_items_configuration = 항목 설정
upper_notebook_excluded_directories = 제외할 디렉터리
upper_notebook_included_directories = 검색할 디렉터리
upper_allowed_extensions_tooltip =
허용할 확장자는 콤마(',')를 통해 구분해야 합니다. (기본값인 경우 모든 확장자를 허용합니다.)
IMAGE, VIDEO, MUSIC, TEXT를 입력할 경우 해당하는 파일을 모두 지칭할 수 있습니다.
예시: ".exe, IMAGE, VIDEO, .rar, 7z" - 이와 같이 입력하면, 이미지 파일(예. jpg, png), 영상 파일(예. avi, mp4), exe, rar, 그리고 7z 파일을 검색합니다.
upper_excluded_extensions_tooltip =
List of disabled files which will be ignored in scan.
When using both allowed and disabled extensions, this one has higher priority, so file will not be checked.
upper_excluded_items_tooltip =
제외할 항목은 반드시 '*' 와일드카드 문자를 사용해서 추가해야 하며, 콤마(',')로 구분되어야 합니다.
디렉터리를 직접 제외하는 것보다 느립니다. 주의해서 사용하세요.
upper_excluded_items = 제외할 항목:
upper_allowed_extensions = 허용할 확장자:
upper_excluded_extensions = Disabled Extensions:
# Popovers
popover_select_all = 모두 선택
popover_unselect_all = 모두 선택 해제
popover_reverse = 선택 반전
popover_select_all_except_oldest = 가장 오래된 파일 제외하고 모두 선택
popover_select_all_except_newest = 가장 최신인 파일 제외하고 모두 선택
popover_select_one_oldest = 가장 오래된 파일 선택
popover_select_one_newest = 가장 최신인 파일 선택
popover_select_custom = 사용자 지정 선택
popover_unselect_custom = 사용자 지정 선택 해제
popover_select_all_images_except_biggest = 가장 큰 파일 제외하고 모두 선택
popover_select_all_images_except_smallest = 가장 작은 파일 제외하고 모두 선택
popover_custom_path_check_button_entry_tooltip =
경로를 기준으로 선택합니다.
사용 예시:
'/home/pimpek/rzecz.txt' 파일을 선택하려면 '/home/pim*'와 같이 입력하세요.
popover_custom_name_check_button_entry_tooltip =
파일 이름을 기준으로 선택합니다.
사용 예시:
'/usr/ping/pong.txt' 파일을 선택하려면 '*ong*'와 같이 입력하세요.
popover_custom_regex_check_button_entry_tooltip =
정규표현식을 이용해 선택합니다.
이 모드에서는 경로와 이름 모두가 정규표현식에 의해 검색됩니다.
사용 예시:
'/usr/bin/ziemniak.txt' 파일을 선택하려면 '/ziem[a-z]+'와 같이 입력하세요.
정규 표현식은 Rust 언어에 내장된 구현체를 사용합니다. 더 알고 싶다면 https://docs.rs/regex를 방문하세요.
popover_custom_case_sensitive_check_button_tooltip =
대소문자를 구분할 지 여부를 선택합니다.
만일 꺼져 있으면, '/home/*'은 '/HoMe/roman'과 '/home/roman'를 모두 선택합니다.
popover_custom_not_all_check_button_tooltip =
한 그룹에 있는 모든 항목이 선택되는 것을 방지합니다.
이 옵션은 기본적으로 켜져 있습니다. 대부분의 경우, 원본과 중복 파일을 전부 선택하여 삭제하는 것은 원하지 않는 동작일 것입니다. 즉 각 그룹에서 최소한 하나의 항목은 삭제하지 않고 남겨놓게 됩니다.
경고! 이 설정은 수동으로 그룹의 모든 파일을 이미 선택해 놓았다면 작동하지 않습니다!
popover_custom_regex_path_label = 경로
popover_custom_regex_name_label = 파일명
popover_custom_regex_regex_label = 경로 및 파일 정규표현식
popover_custom_case_sensitive_check_button = 대소문자 구별
popover_custom_all_in_group_label = 그룹의 모든 항목을 선택하지 않음
popover_custom_mode_unselect = 사용자 지정 선택 해제
popover_custom_mode_select = 사용자 지정 선택
popover_sort_file_name = 파일 이름
popover_sort_folder_name = 폴더 이름
popover_sort_full_name = 본인 이름
popover_sort_size = 파일 크기
popover_sort_selection = 선택
popover_invalid_regex = 정규표현식이 유효하지 않습니다.
popover_valid_regex = 정규표현식이 유효합니다.
# Bottom buttons
bottom_search_button = 검색
bottom_select_button = 선택
bottom_delete_button = 삭제
bottom_save_button = 저장
bottom_symlink_button = 심볼릭 링크
bottom_hardlink_button = 하드 링크
bottom_move_button = 이동
bottom_sort_button = 종류
bottom_search_button_tooltip = 검색을 시작합니다.
bottom_select_button_tooltip = 항목을 선택합니다. 오직 선택된 것만이 처리됩니다.
bottom_delete_button_tooltip = 선택된 파일 또는 폴더를 삭제합니다.
bottom_save_button_tooltip = 검색 결과를 파일로 저장합니다.
bottom_symlink_button_tooltip =
심볼릭 링크를 생성합니다.
그룹 내에서 최소한 2개의 파일이 선택되어 있어야 합니다.
첫 번째 파일은 그대로 남으며, 두 번째 이후 파일은 첫 번째 파일로 향하는 심볼릭 링크가 됩니다.
bottom_hardlink_button_tooltip =
하드 링크를 생성합니다.
그룹 내에서 최소한 2개의 파일이 선택되어 있어야 합니다.
첫 번째 파일은 그대로 남으며, 두 번째 이후 파일은 첫 번째 파일로 향하는 하드 링크가 됩니다.
bottom_hardlink_button_not_available_tooltip =
하드 링크를 생성합니다.
현재 하드 링크를 만들 수 없어 버튼이 비활성화되었습니다.
Windows에서 하드 링크는 관리자 권한으로만 만들 수 있습니다. 프로그램이 관리자 권한으로 실행되었는지 확인하세요.
만일 프로그램이 이미 관리자 권한으로 실행되었다면, Github에서 비슷한 이슈가 있는지 확인해보세요.
bottom_move_button_tooltip =
선택된 디렉터리로 파일을 이동합니다.
이 동작은 원본이 위치한 경로를 전부 무시하고, 선택한 경로로 파일을 전부 복사합니다.
만일 2개 이상의 파일이 같은 이름을 가지고 있다면, 첫 번째 이후의 파일은 복사에 실패하고 오류 메시지를 보여줄 것입니다.
bottom_sort_button_tooltip = 파일/폴더를 선택한 방법으로 정렬합니다.
bottom_show_errors_tooltip = 하단 텍스트 패널을 보이거나 숨깁니다.
bottom_show_upper_notebook_tooltip = 상단 패널을 보이거나 숨깁니다.
# Progress Window
progress_stop_button = 정지
progress_stop_additional_message = 정지 요청됨
# About Window
about_repository_button_tooltip = 소스 코드가 있는 리포지토리 페이지 링크입니다.
about_donation_button_tooltip = 기부 페이지 링크입니다.
about_instruction_button_tooltip = 사용방법 페이지 링크입니다.
about_translation_button_tooltip = 번역을 위한 Crowdin 페이지 링크입니다. 공식적으로 지원되는 언어는 폴란드어와 영어입니다.
about_repository_button = 리포지토리
about_donation_button = 기부
about_instruction_button = 사용방법
about_translation_button = 번역
# Header
header_setting_button_tooltip = 설정창을 엽니다.
header_about_button_tooltip = 이 앱에 대한 정보창을 엽니다.
# Settings
## General
settings_number_of_threads = 스레드 수
settings_number_of_threads_tooltip = 사용할 스레드 수입니다. 0이면 가능한 최대 스레드를 사용합니다.
settings_label_restart = 이 설정을 적용하려면 프로그램을 재시작해야 합니다!
settings_ignore_other_filesystems = 다른 파일시스템 무시(Linux에서만)
settings_ignore_other_filesystems_tooltip =
검색할 디렉터리와 파일시스템이 다른 디렉터리를 무시합니다.
Linux의 find 명령에서 -xdev 옵션을 준 것과 동일하게 동작합니다.
settings_save_at_exit_button_tooltip = 프로그램 종료 시에 설정을 저장합니다.
settings_load_at_start_button_tooltip =
프로그램을 열 때 저장된 설정을 불러옵니다.
꺼져 있다면, 기본 설정으로 프로그램을 시작합니다.
settings_confirm_deletion_button_tooltip = 삭제 버튼을 누를 때 확인창을 띄웁니다.
settings_confirm_link_button_tooltip = 하드 링크/심볼릭 링크 버튼을 누를 때 확인창을 띄웁니다.
settings_confirm_group_deletion_button_tooltip = 그룹의 모든 항목을 삭제할 경우 경고창을 보여줍니다.
settings_show_text_view_button_tooltip = UI 하단에 텍스트 패널을 보여줍니다.
settings_use_cache_button_tooltip = 파일 캐시를 사용합니다.
settings_save_also_as_json_button_tooltip = 캐시를 (사람이 읽을 수 있는) JSON 포맷으로 저장합니다. 캐시 내용을 수정할 수 있습니다. 만일 bin 확장자를 가진 바이너리 캐시 파일이 없으면, JSON 캐시가 프로그램 시작 시에 대신 로드됩니다.
settings_use_trash_button_tooltip = 파일을 영구 삭제하는 대신 휴지통으로 이동합니다.
settings_language_label_tooltip = UI에 표시될 언어를 설정합니다.
settings_save_at_exit_button = 프로그램을 닫을 때 설정을 저장
settings_load_at_start_button = 프로그램을 열 때 설정을 불러오기
settings_confirm_deletion_button = 항목 삭제 시에 확인창 띄우기
settings_confirm_link_button = 항목 심볼릭 링크/하드 링크 설정시에 확인창 띄우기
settings_confirm_group_deletion_button = 그룹 내의 모든 항목 삭제 시 경고창 띄우기
settings_show_text_view_button = 하단 텍스트 패널 표시하기
settings_use_cache_button = 캐시 사용
settings_save_also_as_json_button = 캐시를 JSON 포맷으로도 저장
settings_use_trash_button = 삭제된 파일을 휴지통으로 이동
settings_language_label = 언어
settings_multiple_delete_outdated_cache_checkbutton = 만료된 파일을 캐시에서 자동으로 삭제
settings_multiple_delete_outdated_cache_checkbutton_tooltip =
더 이상 존재하지 않는 파일에 대한 정보를 캐시에서 삭제합니다.
이 옵션이 켜져 있으면, 프로그램은 존재하는 파일만이 캐시에 남도록 할 것입니다(망가진 파일은 무시됩니다).
이 옵션을 끄는 것은 외장 저장장치에 존재하는 파일을 스캔했을 때, 외장 저장장치에 있는 파일에 대한 캐시를 보존하는 데 도움이 됩니다.
만일 수백~수천 개의 파일에 해당하는 정보가 캐시에 있다면 이 옵션을 켜는 것을 추천합니다. 이 경우 캐시를 저장하거나 불러오는 시간이 빨라집니다.
settings_notebook_general = 일반
settings_notebook_duplicates = 중복 파일
settings_notebook_images = 유사한 이미지
settings_notebook_videos = 유사한 영상
## Multiple - settings used in multiple tabs
settings_multiple_image_preview_checkbutton_tooltip = 이미지 파일을 선택하면 우측에 미리보기를 보여줍니다.
settings_multiple_image_preview_checkbutton = 이미지 미리보기 표시
settings_multiple_clear_cache_button_tooltip =
더 이상 존재하지 않는 파일을 캐시에서 제거합니다.
캐시를 자동으로 정리하는 옵션이 꺼져 있을 때만 사용하세요.
settings_multiple_clear_cache_button = Remove outdated results from cache.
## Duplicates
settings_duplicates_hide_hard_link_button_tooltip =
하나의 파일에 대한 여러 개의 하드 링크가 존재할 경우, 그 중 하나만을 표시합니다.
예: 만일 특정한 파일에 대한 7개의 하드 링크가 디스크에 존재하고, 그 중 하나가 다른 inode를 갖는다면, 결과창에는 1개의 파일과 1개의 하드 링크만이 표시됩니다.
settings_duplicates_minimal_size_entry_tooltip =
캐시에 추가되기 위한 최소 파일 사이즈를 설정합니다.
이 값이 작을 수록 더 많은 파일이 캐시에 저장됩니다. 이 경우 검색은 더 빨라지지만, 캐시 저장 및 불러오기는 느려집니다.
settings_duplicates_prehash_checkbutton_tooltip =
사전 해시(파일 일부만으로 계산되는 해시)에 대한 캐싱을 허용하여, 중복이 아닌 파일을 더 빠르게 결과에서 제거합니다.
이 옵션은 일부 상황에서 검색을 느리게 하기 때문에, 기본적으로 꺼져 있습니다.
만일 수백~수천 개 이상의 파일처럼 매우 많은 파일을 여러 번 검색하는 경우, 이 기능을 반드시 켜는 것을 추천합니다.
settings_duplicates_prehash_minimal_entry_tooltip = 캐싱을 위한 최소 파일크기입니다.
settings_duplicates_hide_hard_link_button = 하드 링크 숨기기 (Linux 및 macOS)
settings_duplicates_prehash_checkbutton = 사전 해시 캐싱하기
settings_duplicates_minimal_size_cache_label = 캐싱하기 위한 최소 파일 크기 (바이트)
settings_duplicates_minimal_size_cache_prehash_label = 사전 해시를 캐싱하기 위한 최소 파일 크기 (바이트)
## Saving/Loading settings
settings_saving_button_tooltip = 현재 설정을 파일에 저장합니다.
settings_loading_button_tooltip = 저장된 설정을 불러와 현재 설정을 덮어씁니다.
settings_reset_button_tooltip = 설정을 기본값으로 되돌립니다.
settings_saving_button = 설정 저장
settings_loading_button = 설정 불러오기
settings_reset_button = 설정 초기화
## Opening cache/config folders
settings_folder_cache_open_tooltip =
캐시 파일이 저장되는 폴더를 엽니다.
캐시 파일을 편집하는 경우 유효하지 않은 결과가 표시될 수 있습니다. 다만, 많은 양의 파일이 다른 곳으로 이동되었다면 캐시 내의 경로를 수정하는 것이 도움이 됩니다.
만일 비슷한 디렉터리 구조를 가지는 경우, 캐시 파일을 복사하여 다른 컴퓨터에서도 같은 캐시를 재활용할 수 있습니다.
만일 캐시에 문제가 발생한다면 이 폴더의 파일들을 지우십시오. 그렇게 하면 프로그램이 다시 캐시 파일을 생성합니다.
settings_folder_settings_open_tooltip =
Czkawka의 설정 파일이 있는 폴더를 엽니다.
경고! 설정 파일을 수동으로 편집하는 경우 원치 않는 동작이 일어날 수 있습니다.
settings_folder_cache_open = 캐시 폴더 열기
settings_folder_settings_open = 설정 폴더 열기
# Compute results
compute_stopped_by_user = 사용자에 의해 검색이 중단됨.
compute_found_duplicates_hash_size = 총 { $number_groups }개의 그룹, { $number_files }개의 중복 파일을 찾음. 총 크기 { $size }
compute_found_duplicates_name = 총 { $number_groups }개의 그룹, { $number_files }개의 중복 파일을 찾음.
compute_found_empty_folders = 총 { $number_files }개의 빈 폴더를 찾음.
compute_found_empty_files = 총 { $number_files }개의 빈 파일을 찾음.
compute_found_big_files = 총 { $number_files }개의 큰 파일을 찾음.
compute_found_temporary_files = 총 { $number_files }개의 임시 파일을 찾음.
compute_found_images = 총 { $number_groups }개의 그룹, { $number_files }개의 유사한 이미지를 찾음.
compute_found_videos = 총 { $number_groups }개의 그룹, { $number_files }개의 유사한 영상을 찾음.
compute_found_music = 총 { $number_groups }개의 그룹, { $number_files }개의 유사한 음악 파일을 찾음.
compute_found_invalid_symlinks = 총 { $number_files } 개의 유효하지 않은 심볼릭 링크를 찾음.
compute_found_broken_files = { $number_files }개의 손상된 파일을 찾음.
compute_found_bad_extensions = 총 { $number_files }개의 잘못된 확장자를 가진 파일을 찾음.
# Progress window
progress_scanning_general_file = { $file_number }개의 파일 스캔 중
progress_scanning_extension_of_files = { $file_checked }/{ $all_files }개 파일의 확장자 점검 중
progress_scanning_broken_files = { $file_checked }/{ $all_files }개 파일 점검 중
progress_scanning_video = { $file_checked }/{ $all_files }개 영상 해시 계산 중
progress_scanning_image = { $file_checked }/{ $all_files }개 이미지 해시 계산 중
progress_comparing_image_hashes = { $file_checked }/{ $all_files }개 이미지 해시 비교 중
progress_scanning_music_tags_end = { $file_checked }/{ $all_files }개 음악 파일 태그 검색 중
progress_scanning_music_tags = { $file_checked }/{ $all_files }개 음악 파일 태그 읽는 중
progress_scanning_music_content_end = Comparing fingerprint of { $file_checked }/{ $all_files } music file
progress_scanning_music_content = Calculating fingerprint of { $file_checked }/{ $all_files } music file
progress_scanning_empty_folders = { $folder_number }개 폴더 검색 중
progress_scanning_size = { $file_number }개 파일의 크기 스캔 중
progress_scanning_size_name = Scanning name and size of { $file_number } file
progress_scanning_name = { $file_number }개 파일의 이름 스캔 중
progress_analyzed_partial_hash = { $file_checked }/{ $all_files }개 파일의 부분 해시 계산 중
progress_analyzed_full_hash = { $file_checked }/{ $all_files }개 파일의 전체 해시 계산 중
progress_prehash_cache_loading = Loading prehash cache
progress_prehash_cache_saving = Saving prehash cache
progress_hash_cache_loading = Loading hash cache
progress_hash_cache_saving = Saving hash cache
progress_cache_loading = Loading cache
progress_cache_saving = Saving cache
progress_current_stage = 현재 단계:{ " " }
progress_all_stages = 전체 단계:{ " " }
# Saving loading
saving_loading_saving_success = 파일 { $name }에 설정 저장함.
saving_loading_saving_failure = 파일 { $name }에 설정 저장 실패.
saving_loading_reset_configuration = 현재 설정이 초기화됨.
saving_loading_loading_success = 앱 설정 불러오기 성공.
saving_loading_invalid_string = 키 "{ $key }"의 값이 올바르지 않습니다. "{ $result }"는 string이 아닙니다.
saving_loading_invalid_int = 키 "{ $key }"의 값이 올바르지 않습니다. "{ $result }"는 integer가 아닙니다.
saving_loading_invalid_bool = 키 "{ $key }"의 값이 올바르지 않습니다. "{ $result }"은 bool이 아닙니다.
saving_loading_decode_problem_bool = 키 "{ $key }"의 값을 bool로 해석할 수 없습니다. 허용된 값은 0, 1, true, false 중 하나이지만 실제 값이 "{ $result }"입니다.
saving_loading_saving_same_keys = 키 "{ $key }"가 중복되어 있습니다.
saving_loading_failed_to_get_home_directory = 설정 파일을 저장 또는 불러오기 위한 홈 디렉터리를 찾을 수 없습니다.saving_loading_folder_config_instead_file = "{ $path }"에 있는 설정 파일을 열거나 설정 파일을 생성할 수 없습니다. 파일과 같은 이름의 폴더가 존재합니다.
saving_loading_folder_config_instead_file = "{ $path }"에 설정 파일을 만들거나 열 수 없습니다. 이미 같은 이름의 폴더가 존재합니다.
saving_loading_failed_to_create_configuration_folder = 설정 폴더를 "{ $path }"에 생성할 수 없습니다. 이유: "{ $reason }".
saving_loading_failed_to_create_config_file = "{ $path }" 파일에 설정을 저장할 수 없습니다. 이유: "{ $reason }".
saving_loading_failed_to_read_config_file = "{ $path }" 파일에서 설정을 불러올 수 없습니다. 파일이 없거나, 파일이 아닙니다.
saving_loading_failed_to_read_data_from_file = "{ $path }" 파일을 읽을 수 없습니다. 이유: "{ $reason }".
saving_loading_orphan_data = { $line }번 행에 고아 데이터 "{ $data }"가 있습니다.
saving_loading_not_valid = 설정 "{ $data }"은 현재 프로그램 버전에 존재하지 않습니다.
# Invalid symlinks
invalid_symlink_infinite_recursion = 무한 재귀
invalid_symlink_non_existent_destination = 목표 파일이 없음
# Other
selected_all_reference_folders = 모든 디렉터리가 기준 폴더이므로, 검색을 시작할 수 없습니다.
searching_for_data = 검색 중. 잠시만 기다려주세요...
text_view_messages = 알림
text_view_warnings = 경고
text_view_errors = 오류
about_window_motto = 이 프로그램은 무료이며, 앞으로도 항상 그럴 것이다.
# Various dialog
dialogs_ask_next_time = 다음에도 묻기
delete_file_failed = { $name } 파일 삭제 실패. 이유: { $reason }
delete_title_dialog = 삭제 확인
delete_question_label = 정말로 파일들을 삭제합니까?
delete_all_files_in_group_title = 그룹의 모든 파일 삭제 확인
delete_all_files_in_group_label1 = 일부 그룹 내에 있는 모든 파일이 선택되어 있습니다.
delete_all_files_in_group_label2 = 정말로 해당 파일을 모두 삭제합니까?
delete_folder_failed = { $dir } 폴더가 존재하지 않거나, 권한이 없거나, 폴더가 비어있지 않아 삭제할 수 없습니다.
delete_items_label = { $items }개의 파일이 삭제됩니다.
delete_items_groups_label = { $groups }개 그룹에서 { $items }개의 파일이 삭제됩니다.
hardlink_failed = 하드 링크 생성 실패
hard_sym_invalid_selection_title_dialog = 일부 그룹의 선택이 유효하지 않습니다.
hard_sym_invalid_selection_label_1 = 일부 그룹에서 1개의 항목만이 선택되었으며, 해당 항목은 무시됩니다.
hard_sym_invalid_selection_label_2 = 하드 링크/심볼릭 링크를 생성하려면, 그룹 내에서 최소 2개의 파일이 선택되어야 합니다.
hard_sym_invalid_selection_label_3 = 그룹 내의 첫 번째가 원본으로 설정되며, 나머지는 수정될 것입니다.
hard_sym_link_title_dialog = 링크 생성 확인
hard_sym_link_label = 정말로 해당 파일들을 링크합니까?
move_folder_failed = { $name } 폴더 이동 실패. 이유: { $reason }
move_file_failed = { $name } 파일 이동 실패. 이유: { $reason }
move_files_title_dialog = 중복 파일을 이동할 폴더를 선택하세요.
move_files_choose_more_than_1_path = 중복 파일을 복사할 1개의 폴더만 지정해야 하지만, { $path_number }개의 경로를 선택했습니다.
move_stats = { $num_files }/{ $all_files }개의 항목을 이동함
save_results_to_file = Saved results both to txt and json files into { $name } folder.
search_not_choosing_any_music = 경고: 최소한 하나의 검색 방법을 선택해야 합니다.
search_not_choosing_any_broken_files = 경고: 최소한 하나 이상의 검색할 파일 분류를 선택해야 합니다.
include_folders_dialog_title = 검색할 폴더 추가
exclude_folders_dialog_title = 제외할 폴더 추가
include_manually_directories_dialog_title = 수동으로 디렉터리 추가
cache_properly_cleared = 캐시를 성공적으로 정리했습니다.
cache_clear_duplicates_title = 중복 파일 캐시 정리
cache_clear_similar_images_title = 유사한 이미지 캐시 정리
cache_clear_similar_videos_title = 유사한 영상 캐시 정리
cache_clear_message_label_1 = 유효하지 않은 캐시 항목을 제거할까요?
cache_clear_message_label_2 = 이 동작은 더 이상 유효하지 않은 파일에 대한 캐시 항목을 제거합니다.
cache_clear_message_label_3 = 이를 통해 더 빠른 캐시 저장/불러오기가 가능할 수 있습니다.
cache_clear_message_label_4 = 경고! 이 동작은 연결되지 않은 외장 저장장치에 위치한 모든 항목을 제거합니다. 따라서 해당 파일들에 대한 캐시는 다시 생성되어야 합니다.
# Show preview
preview_image_resize_failure = { $name } 이미지 크기 조정 실패.
preview_image_opening_failure = { $name } 이미지 열기 실패. 이유: { $reason }
# Compare images (L is short Left, R is short Right - they can't take too much space)
compare_groups_number = 그룹 { $current_group }/{ $all_groups } ({ $images_in_group } 이미지)
compare_move_left_button = 이전
compare_move_right_button = 다음

@ -1,500 +0,0 @@
# Window titles
window_settings_title = Instellingen
window_main_title = Czkawka (Hiccup)
window_progress_title = Scannen
window_compare_images = Vergelijk afbeeldingen
# General
general_ok_button = OK
general_close_button = Afsluiten
# Main window
music_title_checkbox = Aanspreektitel
music_artist_checkbox = Kunstenaar
music_year_checkbox = jaar
music_bitrate_checkbox = Bitsnelheid
music_genre_checkbox = genre
music_length_checkbox = longueur
music_comparison_checkbox = Geschatte vergelijking
music_checking_by_tags = Labels
music_checking_by_content = Inhoud
same_music_seconds_label = Minimale fragment tweede duur
same_music_similarity_label = Maximum verschil
same_music_tooltip =
Zoeken naar vergelijkbare muziekbestanden door de inhoud ervan kan worden geconfigureerd door instelling:
- De minimale fragmenttijd waarna muziekbestanden kunnen worden geïdentificeerd als vergelijkbaar
- Het maximale verschil tussen twee geteste fragmenten
De sleutel tot goede resultaten is om verstandige combinaties van deze parameters te vinden, voor opgegeven.
Instelling van de minimale tijd op 5 en het maximale verschil op 1.0, zal zoeken naar bijna identieke fragmenten in de bestanden.
Een tijd van 20 en een maximaal verschil van 6,0 werkt daarentegen goed voor het vinden van remixes/live versies, enz.
Standaard wordt elk muziekbestand met elkaar vergeleken en dit kan veel tijd in beslag nemen bij het testen van veel bestanden, dus is het meestal beter om referentie-mappen te gebruiken en aan te geven welke bestanden met elkaar moeten worden vergeleken (met dezelfde hoeveelheid bestanden, Het vergelijken van vingerafdrukken is sneller dan zonder referentiemateriaal).
music_comparison_checkbox_tooltip =
Het zoekt naar vergelijkbare muziekbestanden met behulp van AI, die machine-leren gebruikt om haakjes uit een zin te verwijderen. Bijvoorbeeld met deze optie ingeschakeld de bestanden in kwestie zullen als duplicaten worden beschouwd:
SØ wieľdzizive b --- S000000wie.pldzizľb (Remix Lato 2021)
duplicate_case_sensitive_name = Kist gevoelig
duplicate_case_sensitive_name_tooltip =
Wanneer ingeschakeld, groep alleen records wanneer ze precies dezelfde naam hebben, b.v. Zit ołd <-> ZØ ołd
Uitschakelen van een dergelijke optie zal namen groeperen zonder te controleren of elke letter hetzelfde formaat heeft, bijv. zghaoŁD <-> Zit ołd
duplicate_mode_size_name_combo_box = Grootte en naam
duplicate_mode_name_combo_box = naam
duplicate_mode_size_combo_box = Grootte
duplicate_mode_hash_combo_box = Toegangssleutel
duplicate_hash_type_tooltip =
Czkawka biedt 3 soorten hashes:
Blake3 - cryptografische hash-functie. Dit is de standaard omdat het erg snel is.
CRC32 - eenvoudige hashfunctie. Dit zou sneller moeten zijn dan Blake3, maar kan zeer zelden een botsing veroorzaken.
XXH3 - erg vergelijkbaar in prestaties en hashkwaliteit naar Blake3 (maar niet-cryptografie). Dergelijke modi kunnen dus eenvoudig worden verwisseld.
duplicate_check_method_tooltip =
Op dit moment biedt Czkawka drie soorten methode aan om duplicaten te vinden door:
Naam - Gevonden bestanden met dezelfde naam.
Grootte - Gevonden bestanden die dezelfde grootte hebben.
Hash - Gevonden bestanden die dezelfde inhoud hebben. Deze modus hashet het bestand en vergelijkt deze hash later om duplicaten te vinden. Deze modus is de veiligste manier om duplicaten te vinden. App gebruikt zwaar cache, dus de tweede en verdere scans van dezelfde gegevens zou veel sneller moeten zijn dan de eerste.
image_hash_size_tooltip =
Elke gecontroleerde afbeelding produceert een speciale hash die met elkaar kan worden vergeleken en een klein verschil tussen hen betekent dat deze afbeeldingen vergelijkbaar zijn.
8 hash size is vrij goed om afbeeldingen te vinden die maar een beetje lijken op origineel. Met een grotere set afbeeldingen (>1000) levert dit een grote hoeveelheid valse positieven op. Dus ik raad in dit geval aan een grotere hashgrootte te gebruiken.
16 is de standaard hash-afmeting, wat een heel goed compromis is tussen het vinden van zelfs een beetje gelijksoortige afbeeldingen en het hebben van slechts een klein aantal hash-botsingen.
32 en 64 hashes vinden slechts zeer gelijksoortige afbeeldingen, maar zouden bijna geen valse positieve motieven moeten hebben (behalve sommige afbeeldingen met alpha kanaal).
image_resize_filter_tooltip =
Om hash van de afbeelding te berekenen, moet de bibliotheek deze eerst grootschalen.
Afhankelijk van het gekozen algoritme, zal de uiteindelijke afbeelding die gebruikt wordt om hash te berekenen er een beetje anders uitzien.
Het snelste algoritme te gebruiken, maar ook het algoritme dat de slechtste resultaten geeft, is het dichtstbijst. Het is standaard ingeschakeld, want met 16x16 hash grootte is het niet echt zichtbaar.
met 8x8 hash grootte is het raadzaam om een ander algoritme te gebruiken dan Nearest, om betere groepen afbeeldingen te hebben.
image_hash_alg_tooltip =
Gebruikers kunnen kiezen uit een van de vele algoritmes om de hash te berekenen.
Elk van deze punten heeft sterke en zwakke punten en zal soms betere en soms slechtere resultaten opleveren voor verschillende afbeeldingen.
Dus om het beste voor u te bepalen, is handmatige test vereist.
big_files_mode_combobox_tooltip = Maakt het mogelijk om naar kleinste/grootste bestanden te zoeken
big_files_mode_label = Gecontroleerde bestanden
big_files_mode_smallest_combo_box = De Kleinste
big_files_mode_biggest_combo_box = De Grootste
main_notebook_duplicates = Dupliceer Bestanden
main_notebook_empty_directories = Lege mappen
main_notebook_big_files = Grote bestanden
main_notebook_empty_files = Lege bestanden
main_notebook_temporary = Tijdelijke bestanden
main_notebook_similar_images = Vergelijkbare afbeeldingen
main_notebook_similar_videos = Soortgelijke video's
main_notebook_same_music = Muziek duplicaten
main_notebook_symlinks = Ongeldige Symlinks
main_notebook_broken_files = Kapotte Bestanden
main_notebook_bad_extensions = Slechte extensies
main_tree_view_column_file_name = File Name
main_tree_view_column_folder_name = Map Naam
main_tree_view_column_path = Pad
main_tree_view_column_modification = Wijziging datum
main_tree_view_column_size = Grootte
main_tree_view_column_similarity = Vergelijkbaarheid
main_tree_view_column_dimensions = Mål
main_tree_view_column_title = Aanspreektitel
main_tree_view_column_artist = Kunstenaar
main_tree_view_column_year = jaar
main_tree_view_column_bitrate = Bitsnelheid
main_tree_view_column_length = longueur
main_tree_view_column_genre = genre
main_tree_view_column_symlink_file_name = Symlink bestandsnaam
main_tree_view_column_symlink_folder = Symlink map
main_tree_view_column_destination_path = Bestemming pad
main_tree_view_column_type_of_error = Type fout
main_tree_view_column_current_extension = Huidige extensie
main_tree_view_column_proper_extensions = Proper Extensie
main_label_check_method = Controleer methode
main_label_hash_type = Soort hash
main_label_hash_size = Hash grootte
main_label_size_bytes = Grootte (bytes)
main_label_min_size = Min.
main_label_max_size = Max.
main_label_shown_files = Aantal getoonde bestanden
main_label_resize_algorithm = Algoritme aanpassen
main_label_similarity = Similarity{ " " }
main_check_box_broken_files_audio = Geluid
main_check_box_broken_files_pdf = PDF
main_check_box_broken_files_archive = Archief
main_check_box_broken_files_image = Afbeelding
check_button_general_same_size = Negeer dezelfde grootte
check_button_general_same_size_tooltip = Bestanden met identieke grootte in resultaten negeren - meestal zijn deze 1:1 duplicaten
main_label_size_bytes_tooltip = Grootte van bestanden die zullen worden gebruikt in scan
# Upper window
upper_tree_view_included_folder_column_title = Mappen om te zoeken
upper_tree_view_included_reference_column_title = Referentie Mappen
upper_recursive_button = Recursief
upper_recursive_button_tooltip = Indien geselecteerd, zoek ook naar bestanden die niet direct onder de gekozen mappen worden geplaatst.
upper_manual_add_included_button = Handmatig toevoegen
upper_add_included_button = Toevoegen
upper_remove_included_button = Verwijderen
upper_manual_add_excluded_button = Handmatig toevoegen
upper_add_excluded_button = Toevoegen
upper_remove_excluded_button = Verwijderen
upper_manual_add_included_button_tooltip =
Voeg mapnaam toe om met de hand te zoeken.
Om meerdere paden tegelijk toe te voegen, scheiden ze met ;
/home/roman;/home/rozkaz zal twee mappen / home/roman en /home/rozkaz toevoegen
upper_add_included_button_tooltip = Voeg nieuwe map toe om te zoeken.
upper_remove_included_button_tooltip = Map verwijderen uit zoekopdracht.
upper_manual_add_excluded_button_tooltip =
Voeg uitgesloten mapnaam met de hand toe.
Om meerdere paden tegelijk toe te voegen, scheid ze met
/home/roman;/home/krokiet zal twee mappen / home/roman en /home/keokiet toevoegen
upper_add_excluded_button_tooltip = Voeg map toe om uitgesloten te worden in zoekopdracht.
upper_remove_excluded_button_tooltip = Verwijder map van uitgesloten.
upper_notebook_items_configuration = Artikelen configuratie
upper_notebook_excluded_directories = Uitgesloten Mappen
upper_notebook_included_directories = Inbegrepen Mappen
upper_allowed_extensions_tooltip =
Toegestane extensies moeten door komma's gescheiden worden (standaard zijn alle beschikbaar).
De volgende macro's die meerdere extensies in één keer toevoegen, zijn ook beschikbaar: IMAGE, VIDEO, MUSIC, TEXT.
Gebruiksgebruik voorbeeld ".exe, IMAGE, VIDEO, .rar, 7z" - dit betekent dat afbeeldingen (e. . jpg, png), video's (bijv. avi, mp4), exe, rr en 7z bestanden worden gescand.
upper_excluded_extensions_tooltip =
Lijst van uitgeschakelde bestanden die genegeerd zullen worden in scan.
Wanneer gebruik wordt gemaakt van toegestane en uitgeschakelde extensies, heeft deze hogere prioriteit, dus het bestand zal niet worden gecontroleerd.
upper_excluded_items_tooltip =
Uitgesloten items moeten * jokertekens bevatten en moeten gescheiden worden door komma's.
Dit is langzamer dan uitgesloten mappen, dus gebruik het zorgvuldig.
upper_excluded_items = Uitgesloten artikelen:
upper_allowed_extensions = Toegestane extensies:
upper_excluded_extensions = Uitgeschakelde extensies:
# Popovers
popover_select_all = Alles selecteren
popover_unselect_all = Selectie ongedaan maken
popover_reverse = Omgekeerde selectie
popover_select_all_except_oldest = Alles selecteren behalve oudste
popover_select_all_except_newest = Selecteer alles behalve nieuwste
popover_select_one_oldest = Selecteer één oudste
popover_select_one_newest = Selecteer een nieuwste
popover_select_custom = Selecteer aangepaste
popover_unselect_custom = Aangepaste deselecteer ongedaan maken
popover_select_all_images_except_biggest = Alles selecteren behalve de grootste
popover_select_all_images_except_smallest = Selecteer alles behalve de kleinste
popover_custom_path_check_button_entry_tooltip =
Records per pad selecteren.
Voorbeeld gebruik:
/home/pimpek/rzecz.txt kan worden gevonden met /home/pim*
popover_custom_name_check_button_entry_tooltip =
Records selecteren op bestandnamen.
Voorbeeld gebruik:
/usr/ping/pong.txt kan worden gevonden met *ong*
popover_custom_regex_check_button_entry_tooltip =
Select records by specified Regex.
In this mode is searched text Path with Name.
Voorbeeld use usage:
/usr/bin/ziemniak. xt kan gevonden worden met /ziem[a-z]+
Dit gebruikt de standaard Rust regex implementatie. Je kunt hier meer over lezen: https://docs.rs/regex.
popover_custom_case_sensitive_check_button_tooltip =
Maakt hoofdlettergevoelige detectie mogelijk.
Wanneer uitgeschakeld /home/* vindt zowel /HoMe/roman en /home/roman.
popover_custom_not_all_check_button_tooltip =
Voorkomt dat alle records in de groep worden geselecteerd.
Dit is standaard ingeschakeld, omdat in de meeste situaties u wilt niet zowel origineel als duplicaten verwijderen, maar ten minste één bestand achterlaten.
WAARSCHUWING: Deze instelling werkt niet als je al handmatig alle resultaten hebt geselecteerd in een groep.
popover_custom_regex_path_label = Pad
popover_custom_regex_name_label = naam
popover_custom_regex_regex_label = Regex pad + naam
popover_custom_case_sensitive_check_button = Hoofdletter gevoelig
popover_custom_all_in_group_label = Niet alle records in groep selecteren
popover_custom_mode_unselect = Aangepaste deselecteren
popover_custom_mode_select = Selecteer aangepast
popover_sort_file_name = Bestandsnaam is vereist
popover_sort_folder_name = Folder Name
popover_sort_full_name = Volledige naam
popover_sort_size = Grootte
popover_sort_selection = Selectie
popover_invalid_regex = Regex is ongeldig
popover_valid_regex = Regex is geldig
# Bottom buttons
bottom_search_button = Zoeken
bottom_select_button = Selecteren
bottom_delete_button = Verwijderen
bottom_save_button = Opslaan
bottom_symlink_button = Symlink
bottom_hardlink_button = Hardlink
bottom_move_button = Verplaatsen
bottom_sort_button = Sorteren
bottom_search_button_tooltip = Zoeken starten
bottom_select_button_tooltip = Selecteer records. Alleen geselecteerde bestanden/mappen kunnen later worden verwerkt.
bottom_delete_button_tooltip = Verwijder geselecteerde bestanden/mappen.
bottom_save_button_tooltip = Gegevens opslaan van zoekopdracht naar bestand
bottom_symlink_button_tooltip =
Maak symbolische links.
Werkt alleen wanneer ten minste twee resultaten in een groep zijn geselecteerd.
De eerste is ongewijzigd en de tweede is symgekoppeld naar eerst.
bottom_hardlink_button_tooltip =
Maak hardlinks.
Werkt alleen wanneer ten minste twee resultaten in een groep worden geselecteerd.
De eerste is ongewijzigd en de tweede keer en later zijn vastgekoppeld aan eerst.
bottom_hardlink_button_not_available_tooltip =
Maak hardlinks.
Knop is uitgeschakeld, omdat hardlinks niet kunnen worden gemaakt.
Hardlinks werkt alleen met beheerdersrechten op Windows, dus zorg ervoor dat je de app als administrator gebruikt.
Als de app al werkt met dergelijke privileges controle op gelijksoortige issues op Github.
bottom_move_button_tooltip =
Verplaatst bestanden naar de gekozen map.
Het kopieert alle bestanden naar de map zonder de mapstructuur te bewaren.
Wanneer twee bestanden met dezelfde naam naar de map worden verplaatst, zal de tweede mislukt en de fout worden weergegeven.
bottom_sort_button_tooltip = Sorteert bestanden/mappen op de geselecteerde methode.
bottom_show_errors_tooltip = Onderste tekstvenster tonen/verbergen
bottom_show_upper_notebook_tooltip = Toon/Verberg bovenste notitieboekpaneel.
# Progress Window
progress_stop_button = Stoppen
progress_stop_additional_message = Stop aangevraagd
# About Window
about_repository_button_tooltip = Link naar de repository pagina met broncode.
about_donation_button_tooltip = Link naar donatie pagina.
about_instruction_button_tooltip = Link naar instructiepagina.
about_translation_button_tooltip = Link naar de Crowdin pagina met appvertalingen. Officieel worden Pools en Engels ondersteund.
about_repository_button = Bewaarplaats
about_donation_button = Donatie
about_instruction_button = Instructie
about_translation_button = Vertaling
# Header
header_setting_button_tooltip = Opent instellingen dialoogvenster.
header_about_button_tooltip = Opent dialoogvenster met info over app.
# Settings
## General
settings_number_of_threads = Aantal gebruikte threads
settings_number_of_threads_tooltip = Aantal gebruikte threads, 0 betekent dat alle beschikbare threads zullen worden gebruikt.
settings_label_restart = U moet de app herstarten om de instellingen toe te passen!
settings_ignore_other_filesystems = Negeer andere bestandssystemen (alleen Linux)
settings_ignore_other_filesystems_tooltip =
negeert bestanden die niet in hetzelfde bestandssysteem zitten als gezochte mappen.
Werkt dezelfde als -xdev optie in het zoekcommando voor Linux
settings_save_at_exit_button_tooltip = Configuratie opslaan in bestand bij het sluiten van de app.
settings_load_at_start_button_tooltip =
Laad de configuratie van het bestand bij het openen van de app.
Indien niet ingeschakeld, worden standaard instellingen gebruikt.
settings_confirm_deletion_button_tooltip = Bevestigingsvenster tonen bij het klikken op de knop verwijderen.
settings_confirm_link_button_tooltip = Toon bevestigingsvenster bij het klikken op de hard/symlink knop.
settings_confirm_group_deletion_button_tooltip = Waarschuwingsvenster weergeven wanneer geprobeerd wordt om alle records uit de groep te verwijderen.
settings_show_text_view_button_tooltip = Tekstpaneel aan de onderkant van de gebruikersinterface weergeven.
settings_use_cache_button_tooltip = Gebruik bestandscache.
settings_save_also_as_json_button_tooltip = Cache opslaan in (menselijk leesbaar) JSON formaat. Het is mogelijk om de inhoud te wijzigen. Cache van dit bestand wordt automatisch gelezen door de app als er een binaire cache (met bin extensie) ontbreekt.
settings_use_trash_button_tooltip = Verplaatst bestanden naar prullenbak in plaats daarvan ze permanent te verwijderen.
settings_language_label_tooltip = Taal voor de gebruikersinterface.
settings_save_at_exit_button = Configuratie opslaan bij het sluiten van app
settings_load_at_start_button = Laad configuratie bij het openen van app
settings_confirm_deletion_button = Toon bevestigingsdialoog bij het verwijderen van bestanden
settings_confirm_link_button = Melding bevestigen bij hard/symlinks van bestanden
settings_confirm_group_deletion_button = Toon het bevestigingsvenster bij het verwijderen van alle bestanden in de groep
settings_show_text_view_button = Toon onderaan tekstpaneel
settings_use_cache_button = Gebruik cache
settings_save_also_as_json_button = Sla ook de cache op als JSON-bestand
settings_use_trash_button = Verwijderde bestanden verplaatsen naar prullenbak
settings_language_label = Taal
settings_multiple_delete_outdated_cache_checkbutton = Verouderde cache vermeldingen automatisch verwijderen
settings_multiple_delete_outdated_cache_checkbutton_tooltip =
Verwijder verouderde cacheresultaten die verwijzen naar niet-bestaande bestanden.
Indien ingeschakeld, zorgt de app ervoor dat bij het laden van records, dat alle records naar geldige bestanden verwijzen (gebroken bestanden worden genegeerd).
Dit uitschakelen zal helpen bij het scannen van bestanden op externe schijven, dus cache-items over deze zullen niet worden gewist in de volgende scan.
In het geval van honderdduizenden records in de cache, het wordt aangeraden om dit in te schakelen, dit zal de cache laden/opslaan aan het starten/einde van de scan versnellen.
settings_notebook_general = Algemeen
settings_notebook_duplicates = Duplicaten
settings_notebook_images = Vergelijkbare afbeeldingen
settings_notebook_videos = Gelijkaardige Video
## Multiple - settings used in multiple tabs
settings_multiple_image_preview_checkbutton_tooltip = Toont voorbeeld aan rechterkant (bij het selecteren van een afbeeldingsbestand).
settings_multiple_image_preview_checkbutton = Toon voorvertoning afbeelding
settings_multiple_clear_cache_button_tooltip =
Handmatig de cache van verouderde items wissen.
Dit mag alleen worden gebruikt als automatisch wissen is uitgeschakeld.
settings_multiple_clear_cache_button = Verwijder verouderde resultaten uit de cache.
## Duplicates
settings_duplicates_hide_hard_link_button_tooltip =
Verbergt alle bestanden behalve één, als alle naar dezelfde gegevens verwijst (zijn hardlinked).
Voorbeeld: In het geval waar er (op schijf) zeven bestanden zijn die zijn gekoppeld aan specifieke data en één ander bestand met dezelfde gegevens, maar een andere inode, dan in dubbele zoeker, slechts één uniek bestand en één bestand van de hardgelinkte bestanden zullen worden weergegeven.
settings_duplicates_minimal_size_entry_tooltip =
Stel de minimale bestandsgrootte in die gecached zal worden.
kiezen van een kleinere waarde zal meer records genereren. Dit zal het zoeken versnellen, maar de cache aan het laden/opslaan.
settings_duplicates_prehash_checkbutton_tooltip =
Hiermee kan het cachen van prehash (een hash berekend van een klein deel van het bestand) eerder verwijderen van niet-gedupliceerde resultaten.
Het is standaard uitgeschakeld omdat het in sommige situaties vertraging kan veroorzaken.
Het is sterk aanbevolen om het te gebruiken bij het scannen van honderdduizenden of miljoen bestanden, omdat het zoeken meerdere keren kan versnellen.
settings_duplicates_prehash_minimal_entry_tooltip = Minimale grootte van gecachete invoer.
settings_duplicates_hide_hard_link_button = Verberg harde links (alleen Linux en macOS)
settings_duplicates_prehash_checkbutton = Gebruik prehash cache
settings_duplicates_minimal_size_cache_label = Minimale bestandsgrootte (in bytes) opgeslagen in de cache
settings_duplicates_minimal_size_cache_prehash_label = Minimale grootte van bestanden (in bytes) opgeslagen naar prehash cache
## Saving/Loading settings
settings_saving_button_tooltip = De huidige instellingen configuratie opslaan in bestand.
settings_loading_button_tooltip = Laad de instellingen uit het bestand en vervang de huidige configuratie.
settings_reset_button_tooltip = De huidige configuratie terugzetten naar de standaard.
settings_saving_button = Configuratie opslaan
settings_loading_button = Laad configuratie
settings_reset_button = Reset configuratie
## Opening cache/config folders
settings_folder_cache_open_tooltip =
Opent de map waar de cache txt bestanden zijn opgeslagen.
Het wijzigen van de cachebestanden kan ervoor zorgen dat ongeldige resultaten worden getoond. Het wijzigen van een pad kan echter tijd besparen bij het verplaatsen van een grote hoeveelheid bestanden naar een andere locatie.
U kunt deze bestanden tussen computers kopiëren om tijd te besparen bij het scannen van bestanden (van natuurlijk als ze een vergelijkbare directory structuur hebben).
In geval van problemen met de cache kunnen deze bestanden worden verwijderd. De app zal ze automatisch opnieuw genereren.
settings_folder_settings_open_tooltip =
Opent de map waar de Czkawka config is opgeslagen.
WAARSCHUWING: Handmatig wijzigen van de configuratie kan uw workflow verbreken.
settings_folder_cache_open = Open cachemap
settings_folder_settings_open = Instellingenmap openen
# Compute results
compute_stopped_by_user = Zoeken is gestopt door gebruiker
compute_found_duplicates_hash_size = Gevonden { $number_files } duplicaten in { $number_groups } groepen die { $size } namen
compute_found_duplicates_name = Gevonden { $number_files } duplicaten in { $number_groups } groepen
compute_found_empty_folders = Gevonden { $number_files } lege mappen
compute_found_empty_files = Gevonden { $number_files } lege bestanden
compute_found_big_files = Gevonden { $number_files } grote bestanden
compute_found_temporary_files = Gevonden { $number_files } tijdelijke bestanden
compute_found_images = Gevonden { $number_files } soortgelijke afbeeldingen in { $number_groups } groepen
compute_found_videos = Gevonden { $number_files } vergelijkbare video's in { $number_groups } groepen
compute_found_music = Gevonden { $number_files } vergelijkbare muziekbestanden in { $number_groups } groepen
compute_found_invalid_symlinks = Gevonden { $number_files } ongeldige symlinks
compute_found_broken_files = Gevonden { $number_files } gebroken bestanden
compute_found_bad_extensions = { $number_files } bestanden met ongeldige extensies gevonden
# Progress window
progress_scanning_general_file = Scannen van { $file_number } bestand
progress_scanning_extension_of_files = Extensie van { $file_checked }/{ $all_files } bestand controleren
progress_scanning_broken_files = Controleren { $file_checked }/{ $all_files } bestand
progress_scanning_video = Hashing van { $file_checked }/{ $all_files } video
progress_scanning_image = Hashing van { $file_checked }/{ $all_files } afbeelding
progress_comparing_image_hashes = Vergelijk { $file_checked }/{ $all_files } afbeelding hash
progress_scanning_music_tags_end = Tags vergelijken van { $file_checked }/{ $all_files } muziekbestand
progress_scanning_music_tags = Leestags van { $file_checked }/{ $all_files } muziekbestand
progress_scanning_music_content_end = Vingerafdruk van { $file_checked }/{ $all_files } muziekbestand vergelijken
progress_scanning_music_content = Vingerafdruk berekenen van { $file_checked }/{ $all_files } muziekbestand
progress_scanning_empty_folders = Scannen { $folder_number } map
progress_scanning_size = Scannen grootte van { $file_number } bestand
progress_scanning_size_name = Scannen van naam en grootte van { $file_number } bestand
progress_scanning_name = Scannen van naam { $file_number } bestand
progress_analyzed_partial_hash = Geanalyseerde gedeeltelijke hash van { $file_checked }/{ $all_files } bestanden
progress_analyzed_full_hash = Volledige hash van { $file_checked }/{ $all_files } bestanden geanalyseerd
progress_prehash_cache_loading = Prehash cache laden
progress_prehash_cache_saving = Opslaan van prehash cache
progress_hash_cache_loading = hash-cache laden
progress_hash_cache_saving = hash cache opslaan
progress_cache_loading = Cache laden
progress_cache_saving = Cache opslaan
progress_current_stage = Current Stage:{ " " }
progress_all_stages = All Stages:{ " " }
# Saving loading
saving_loading_saving_success = Configuratie opgeslagen in bestand { $name }.
saving_loading_saving_failure = Kan configuratiegegevens niet opslaan in bestand { $name }.
saving_loading_reset_configuration = Huidige configuratie is gewist.
saving_loading_loading_success = Goed geladen app configuratie.
saving_loading_invalid_string = Voor sleutel "{ $key }" vond een ongeldig resultaat - "{ $result }" wat geen string is.
saving_loading_invalid_int = Voor sleutel "{ $key }" vond een ongeldig resultaat - "{ $result }" wat geen geheel getal is.
saving_loading_invalid_bool = Voor sleutel "{ $key }" vond een ongeldig resultaat - "{ $result }" wat geen baas is.
saving_loading_decode_problem_bool = Kan bool van sleutel niet decoderen "{ $key }" gevonden "{ $result }" maar toegestane waarden zijn 0, 1, waar of onwaar.
saving_loading_saving_same_keys = Proberen de instelling op te slaan met de gedupliceerde sleutel "{ $key }".
saving_loading_failed_to_get_home_directory = Fout bij het ophalen van de home directory naar configuratiebestand openen/opslaan.
saving_loading_folder_config_instead_file = Kan configuratiebestand niet aanmaken of openen in pad "{ $path }" omdat er al een map is.
saving_loading_failed_to_create_configuration_folder = Configuratie mislukt om configuratiemap "{ $path }", reden "{ $reason } " te maken.
saving_loading_failed_to_create_config_file = Fout bij het aanmaken van het configuratiebestand "{ $path }", reden "{ $reason }".
saving_loading_failed_to_read_config_file = Kan configuratie niet laden van "{ $path }" omdat deze niet bestaat of geen bestand is.
saving_loading_failed_to_read_data_from_file = Kan gegevens niet lezen van bestand "{ $path }", reden "{ $reason }".
saving_loading_orphan_data = orphan data gevonden "{ $data }" in regel "{ $line }".
saving_loading_not_valid = Instelling "{ $data }" bestaat niet in de huidige versie van de app.
# Invalid symlinks
invalid_symlink_infinite_recursion = Oneindige recursie
invalid_symlink_non_existent_destination = Niet-bestaand doelbestand
# Other
selected_all_reference_folders = Kan zoeken niet starten, als alle mappen als referentie mappen zijn ingesteld
searching_for_data = Gegevens zoeken, het kan een tijdje duren, even wachten...
text_view_messages = BERICHTEN
text_view_warnings = LET OP
text_view_errors = FOUTEN
about_window_motto = Dit programma is gratis te gebruiken en zal dat altijd zijn.
# Various dialog
dialogs_ask_next_time = Volgende keer vragen
delete_file_failed = Kan het bestand { $name }niet verwijderen, reden { $reason }
delete_title_dialog = Bevestiging verwijderen
delete_question_label = Weet u zeker dat u bestanden wilt verwijderen?
delete_all_files_in_group_title = Bevestiging van het verwijderen van alle bestanden in groep
delete_all_files_in_group_label1 = In sommige groepen worden alle records geselecteerd.
delete_all_files_in_group_label2 = Weet u zeker dat u deze wilt verwijderen?
delete_folder_failed = Kan de map { $dir } niet verwijderen omdat de map niet bestaat, u hebt geen toestemming of de map is niet leeg.
delete_items_label = { $items } bestanden worden verwijderd.
delete_items_groups_label = { $items } bestanden van { $groups } groepen worden verwijderd.
hardlink_failed = Hardlink mislukt
hard_sym_invalid_selection_title_dialog = Ongeldige selectie met sommige groepen
hard_sym_invalid_selection_label_1 = In sommige groepen is er slechts één record geselecteerd en zal worden genegeerd.
hard_sym_invalid_selection_label_2 = Om deze bestanden hard/sym te kunnen koppelen, moeten ten minste twee resultaten in de groep worden geselecteerd.
hard_sym_invalid_selection_label_3 = Eerst wordt de groep als origineel erkend en niet veranderd, en vervolgens worden de tweede wijzigingen aangebracht.
hard_sym_link_title_dialog = Bevestiging link
hard_sym_link_label = Weet u zeker dat u deze bestanden wilt koppelen?
move_folder_failed = Map { $name }kon niet verplaatst worden, reden { $reason }
move_file_failed = Kon bestand niet verplaatsen { $name }, reden { $reason }
move_files_title_dialog = Kies de map waarnaar u gedupliceerde bestanden wilt verplaatsen
move_files_choose_more_than_1_path = Er kan slechts één pad geselecteerd zijn om hun gedupliceerde bestanden te kopiëren, geselecteerde { $path_number }.
move_stats = Naar behoren verplaatst { $num_files }/{ $all_files } items
save_results_to_file = Opgeslagen resultaten zowel in txt als in json bestanden in { $name } map.
search_not_choosing_any_music = FOUT: U moet ten minste één selectievakje met muziekinstypes selecteren.
search_not_choosing_any_broken_files = FOUT: U moet ten minste één selectievakje selecteren met type van aangevinkte bestanden.
include_folders_dialog_title = Mappen om op te nemen
exclude_folders_dialog_title = Mappen om uit te sluiten
include_manually_directories_dialog_title = Voeg map handmatig toe
cache_properly_cleared = Cache op juiste wijze gewist
cache_clear_duplicates_title = Duplicaten cache wissen
cache_clear_similar_images_title = Leeg soortgelijke afbeeldingen-cache
cache_clear_similar_videos_title = Leeg soortgelijke video cache
cache_clear_message_label_1 = Wilt u de cache van verouderde items wissen?
cache_clear_message_label_2 = Deze actie zal alle cache-items verwijderen die naar ongeldige bestanden wijzen.
cache_clear_message_label_3 = Dit kan de laden/opslaan enigszins versnellen.
cache_clear_message_label_4 = WAARSCHUWING: De bewerking zal alle opgeslagen data van externe schijven verwijderen. Daarom zal elke hash opnieuw moeten worden gegenereerd.
# Show preview
preview_image_resize_failure = Formaat wijzigen van afbeelding { $name } is mislukt.
preview_image_opening_failure = Kan afbeelding { $name }niet openen, reden { $reason }
# Compare images (L is short Left, R is short Right - they can't take too much space)
compare_groups_number = Groep { $current_group }/{ $all_groups } ({ $images_in_group } afbeeldingen)
compare_move_left_button = L
compare_move_right_button = R

@ -14,22 +14,6 @@ music_bitrate_checkbox = Bitrate
music_genre_checkbox = Sjanger
music_length_checkbox = Lengde
music_comparison_checkbox = Omtrentlig sammenligning
music_checking_by_tags = Tagger
music_checking_by_content = Innhold
same_music_seconds_label = Minste fragment andre varighet
same_music_similarity_label = Maksimal differanse
same_music_tooltip =
Søker etter lignende musikkfiler av innholdet kan konfigureres ved å gå inn:
- Minimumsfragmenteringstiden etter hvilken musikkfiler som kan identifiseres som lignende
- Maksimal forskjell mellom to testede fragmenter
Nøkkelen til gode resultater er å finne fornuftige kombinasjoner av disse parametrene, for utlevert.
Angir minimum tid til 5 s og maksimal forskjell til 1,0, vil se etter nesten identiske fragmenter i filene.
En tid på 20 s og en maksimal forskjell på 6.0, for den andre siden fungerer bra for å finne remikser/levende versjoner osv.
Som standard kan hver musikkfil sammenlignes med hverandre, og dette kan ta mye tid når du tester mange filer, slik at det vanligvis er bedre å bruke referanselapper og spesifisere hvilke filer som skal sammenlignes med hverandre (med samme mengde filer, å sammenligne fingeravtrykk vil være raskere minst 4 x enn uten referansemapper).
music_comparison_checkbox_tooltip =
Den søker etter lignende musikkfiler ved hjelp av AI, som bruker maskiner til å fjerne parenteser fra et frase. For eksempel, med dette alternativet er aktivert. filene du vil bli betraktet som duplikater:
@ -39,7 +23,6 @@ duplicate_case_sensitive_name_tooltip =
Når aktivert, vil du bare gruppere når de har nøyaktig samme navn, f.eks. Żołd <-> Żołd
Deaktivering av en slik opsjon vil gi deg egne navn uten å sjekke om hver bokstav er like stort, f.eks. żoŁD <-> Żołd
duplicate_mode_size_name_combo_box = Størrelse og navn
duplicate_mode_name_combo_box = Navn
duplicate_mode_size_combo_box = Størrelse
duplicate_mode_hash_combo_box = Hash
@ -60,31 +43,18 @@ duplicate_check_method_tooltip =
Hash - Finner filer med samme innhold. Denne modusen ligner filen og senere sammenligner dette hashen for å finne duplikater. Denne modusen er den sikreste måten å finne duplikater. Appen bruker stort, så sekund og ytterligere skanninger av de samme dataene bør være mye raskere enn det første.
image_hash_size_tooltip =
Hvert avmerkede bilde gir en spesiell hash som kan sammenlignes med hverandre, og en liten forskjell mellom dem betyr at disse bildene er like.
8 hash-størrelse er ganske bra for å finne bilder som er litt likt original. Med et større sett med bilder (>1000) vil dette gi svært mange falske positive. Derfor anbefaler jeg å bruke en større hash-størrelse i denne saken.
16 er standard hash-størrelse som er et godt kompromiss mellom å finne selv små lignende bilder og å ha bare en liten mengde hash-kollisjoner.
32 og 64 hashes finner bare lignende bilder, men bør ha nesten ingen falske positiver (kanskje unntatt bilder med alfa-kanal).
image_resize_filter_tooltip =
To compute hash of image, the library must first resize it.
Tsjekkia tilbyr å endre størrelsen på den genererte hashen for hvert bilde. En større hashstørrelse gjør det mulig å finne bilder med lavere forskjeller mellom bilder, men den er også litt langsommere å bruke.
Depend on chosen algorithm, the resulting image used to calculate hash will looks a little different.
Standardverdi for hash er 8 byte, noe som tillater å finne både svært like og forskjellige bilder. 16 byte og 32 byte hashes skal bare brukes ved nesten identiske bilder. 64 byte hash skal ikke brukes, unntatt i situasjoner hvor du må finne veldig små forskjeller.
image_resize_filter_tooltip = For å beregne hash med bilde må biblioteket først endre størrelsen på det. Avhengig av valgt algoritme, resulterte i et bilde vil se lite annet ut. Den raskeste algoritmen å bruke, men også den som gir de verste resultatene, er Nearest.
image_hash_alg_tooltip = Brukere kan velge mellom en av mange algoritmer i beregningen av hashen. Hver har både sterke og svakere poeng, og vil i noen tilfeller gi bedre og noen ganger verre resultater for ulike bilder. Derfor er det nødvendig med manuell testing for å bestemme det beste for deg.
main_notebook_image_fast_compare = Rask sammenligning
main_notebook_image_fast_compare_tooltip =
Speedup søk og sammenligner hashes.
The fastest algorithm to use, but also the one which gives the worst results, is Nearest. It is enabled by default, because with 16x16 hash size lower quality it is not really visible.
I motsetning til normal modus - der hver hash sammenlignes med hverandre x ganger (der x er brukerens chose) - i denne modusen, nøyaktig en sammenligning vil bli brukt.
With 8x8 hash size it is recommended to use a different algorithm than Nearest, to have better groups of images.
image_hash_alg_tooltip =
Brukere kan velge mellom en av mange algoritmer i beregningen av hashen.
Hver har både sterke og svakere poeng, og vil noen ganger gi bedre og noen ganger verre resultater for ulike bilder.
Så for å bestemme det beste for deg, kreves manuell testing.
big_files_mode_combobox_tooltip = Lar deg søke etter minste/største filer
big_files_mode_label = Avmerkede filer
big_files_mode_smallest_combo_box = Den minste
big_files_mode_biggest_combo_box = Den største
Dette alternativet anbefales ved sammenligning av >10000 bilder med ikke-0 (Svært høy) likhet.
main_notebook_duplicates = Dupliser filer
main_notebook_empty_directories = Tomme mapper
main_notebook_big_files = Store filer
@ -124,12 +94,8 @@ main_label_max_size = Maks
main_label_shown_files = Antall filer som vises
main_label_resize_algorithm = Endre algoritmen
main_label_similarity = Similarity{ " " }
main_check_box_broken_files_audio = Lyd
main_check_box_broken_files_pdf = Pdf
main_check_box_broken_files_archive = Arkiv
main_check_box_broken_files_image = Bilde
check_button_general_same_size = Ignorer samme størrelse
check_button_general_same_size_tooltip = Ignorer filer med identisk størrelse i resultater - vanligvis disse er 1:1 duplikater
check_button_general_same_size_tooltip = Ignorer fra resultatene, filer som har identisk størrelse - vanligvis dette er 1:1 duplikater
main_label_size_bytes_tooltip = Størrelse på filer som vil bli brukt i skanning
# Upper window
upper_tree_view_included_folder_column_title = Mapper å søke etter
@ -142,20 +108,10 @@ upper_remove_included_button = Fjern
upper_manual_add_excluded_button = Manuelt legg til
upper_add_excluded_button = Legg til
upper_remove_excluded_button = Fjern
upper_manual_add_included_button_tooltip =
Legg til mappenavn for å søke etter hånd.
For å legge til flere baner samtidig, separer dem med ;
/home/roman;/home/rozkaz vil legge til to kataloger /home/roman og /home/rozkaz
upper_manual_add_included_button_tooltip = Legg til mappenavn for å søke etter hånd.
upper_add_included_button_tooltip = Legg til ny mappe i søk.
upper_remove_included_button_tooltip = Slett mappen fra søk.
upper_manual_add_excluded_button_tooltip =
Legg til ekskludert mappenavn for hånd.
For å legge til flere baner på en gang, separer dem med ;
/home/roman;/home/krokiet vil legge til to kataloger /home/roman and /home/keokiet
upper_manual_add_excluded_button_tooltip = Legg til ekskludert mappenavn for hånd.
upper_add_excluded_button_tooltip = Legg til mappe som skal utelukkes i søk.
upper_remove_excluded_button_tooltip = Slett mappen fra ekskludert.
upper_notebook_items_configuration = Konfigurasjon av elementer
@ -167,16 +123,11 @@ upper_allowed_extensions_tooltip =
Følgende makroer, som legger til flere utvidelser samtidig, er også tilgjengelige: IMAGE, VIDEO, MUSIC, TEXT.
Bruk eksempel ".exe, IMAGE, VIDEO, .rar, 7z" - dette betyr at bilder (e. . jpg, png), videoer (f.eks. avi, mp4), exe, rar og 7z filer vil bli skannet.
upper_excluded_extensions_tooltip =
Liste over deaktiverte filer som vil bli ignorert i skanning.
Ved bruk av både tillatte og deaktiverte utvidelser, har denne prioriteten høyere enn prioritet, så filen vil ikke bli sjekket.
upper_excluded_items_tooltip =
Ekskluderte elementer må inneholde * jokertegn og bør separeres med komma.
Dette er tregere enn ekskluderte kataloger, så bruk den med forsiktighet.
upper_excluded_items = Ekskluderte elementer:
upper_allowed_extensions = Tillatte utvidelser:
upper_excluded_extensions = Deaktiverte utvidelser:
# Popovers
popover_select_all = Velg alle
popover_unselect_all = Fjern alle valg
@ -225,11 +176,6 @@ popover_custom_case_sensitive_check_button = Skill store og små bokstaver
popover_custom_all_in_group_label = Ikke velg alle poster i gruppen
popover_custom_mode_unselect = Avvelg egendefinert
popover_custom_mode_select = Velg egendefinert
popover_sort_file_name = Filnavn
popover_sort_folder_name = Mappenavn
popover_sort_full_name = Fullt navn
popover_sort_size = Størrelse
popover_sort_selection = Utvalg
popover_invalid_regex = Regex er ugyldig
popover_valid_regex = Regex er gyldig
# Bottom buttons
@ -240,7 +186,6 @@ bottom_save_button = Save
bottom_symlink_button = Symlink
bottom_hardlink_button = Hardlink
bottom_move_button = Flytt
bottom_sort_button = Sorter
bottom_search_button_tooltip = Starte søk
bottom_select_button_tooltip = Velg oppføringer. Bare valgte filer/mapper kan bli behandlet senere.
bottom_delete_button_tooltip = Slett valgte filer/mapper.
@ -253,21 +198,14 @@ bottom_hardlink_button_tooltip =
Opprette fastkoblinger.
Virker bare når minst to resultater i en gruppe er valgt.
Først er uendret og annet og senere er vanskelig knyttet til først.
bottom_hardlink_button_not_available_tooltip =
Opprett faste koblinger.
Knappen er deaktivert, fordi faste koblinger ikke kan opprettes.
Faste koblinger fungerer bare med administratorrettigheter i Windows, så pass på at du kjører programmet som administrator.
Hvis programmet allerede fungerer med slike privilegier, sjekk om lignende problemer er observert på GitHub.
bottom_move_button_tooltip =
Flytter filer til valgt mappe.
Den kopierer alle filer til mappen uten å lagre mappetreet.
Når du prøver å flytte to filer med identisk navn til mappe, vil det andre feile og vise feil.
bottom_sort_button_tooltip = Sorter filer/mapper etter valgt metode.
bottom_show_errors_tooltip = Vis/Skjul bunntekstpanelet.
bottom_show_upper_notebook_tooltip = Vis/Skjul øvre notebook panel.
# Progress Window
progress_stop_button = Stopp
progress_stop_additional_message = Stopp forespurt
# About Window
about_repository_button_tooltip = Link til pakkesiden med kildekoden.
about_donation_button_tooltip = Lenke til donasjonssiden.
@ -286,14 +224,6 @@ header_about_button_tooltip = Åpner dialog med info om app.
## General
settings_number_of_threads = Antall brukte tråder
settings_number_of_threads_tooltip = Antall brukte tråder. 0 betyr at alle tilgjengelige tråder vil bli brukt.
settings_label_restart = Start programmet på nytt for å bruke innstillingene!
settings_ignore_other_filesystems = Ignorer andre filsystemer (bare Linux)
settings_ignore_other_filesystems_tooltip =
ignorerer filer som ikke er i samme filsystem som søk-kataloger.
Fungerer samme som -xdev alternativet i å finne kommandoen på Linux
settings_save_at_exit_button_tooltip = Lagre konfigurasjon som fil når appen lukkes.
settings_load_at_start_button_tooltip =
Last inn konfigurasjon fra filen når du åpner appen.
@ -338,7 +268,7 @@ settings_multiple_image_preview_checkbutton = Vis forhåndsvisning av bilde
settings_multiple_clear_cache_button_tooltip =
Manuelt tømmer hurtigbufferen av utdaterte oppføringer.
Dette bør bare brukes hvis automatisk tømming er deaktivert.
settings_multiple_clear_cache_button = Fjern utdaterte resultater fra mellomlager.
settings_multiple_clear_cache_button = Fjern utdaterte resultater fra bilde-cache
## Duplicates
@ -410,20 +340,11 @@ progress_scanning_image = Hashing av { $file_checked }/{ $all_files } bilde
progress_comparing_image_hashes = Sammenligner { $file_checked }/{ $all_files } bilde-hash
progress_scanning_music_tags_end = Sammenligner tagger med { $file_checked }/{ $all_files } musikkfil
progress_scanning_music_tags = Leser tagger på { $file_checked }/{ $all_files } musikkfil
progress_scanning_music_content_end = Sammenligner fingeravtrykk på { $file_checked }/{ $all_files } musikkfil
progress_scanning_music_content = Beregner fingeravtrykk på { $file_checked }/{ $all_files } musikkfil
progress_scanning_empty_folders = Skanner { $folder_number } mappe
progress_scanning_size = Skanner størrelse på { $file_number } fil
progress_scanning_size_name = Skanning av navn og størrelse på { $file_number } fil
progress_scanning_name = Skanning av navn på { $file_number } fil
progress_analyzed_partial_hash = Analyserte delvis hash med { $file_checked }/{ $all_files } filer
progress_analyzed_full_hash = Analyserte full hash med { $file_checked }/{ $all_files } filer
progress_prehash_cache_loading = Laster prehash cache
progress_prehash_cache_saving = Lagrer prehash-cache
progress_hash_cache_loading = Laster hash-cache
progress_hash_cache_saving = Lagrer hurtigbufferen for hash
progress_cache_loading = Laster cache
progress_cache_saving = Lagrer cachen
progress_current_stage = Gjeldende trinn: { " " }
progress_all_stages = Alle stadier:{ " " }
# Saving loading
@ -448,7 +369,6 @@ saving_loading_not_valid = Setter "{ $data }" finnes ikke i gjeldende appversjon
invalid_symlink_infinite_recursion = Uendelig rekursjon
invalid_symlink_non_existent_destination = Ikke-eksisterende målfil
# Other
selected_all_reference_folders = Kan ikke starte søk, når alle kataloger er angitt som referanselapper
searching_for_data = Søker data, det kan ta en stund, vennligst vent...
text_view_messages = MELDINGER
text_view_warnings = ADVARSELSER
@ -477,9 +397,8 @@ move_file_failed = Kunne ikke flytte filen { $name }, årsak { $reason }
move_files_title_dialog = Velg mappen du vil flytte dupliserte filer til
move_files_choose_more_than_1_path = Bare én sti kan velges for å kunne kopiere sine dupliserte filer, valgt { $path_number }.
move_stats = Flott flyttet { $num_files }/{ $all_files } elementer
save_results_to_file = Lagrede resultater både i txt og json-filer i { $name } mappe.
save_results_to_file = Lagrede resultater i filen { $name }
search_not_choosing_any_music = FEIL: Du må velge minst en avkrysningsboks med musikk som søker.
search_not_choosing_any_broken_files = FEIL: Du må velge minst en avkrysningsboks med sjekket ødelagte filer.
include_folders_dialog_title = Mapper å inkludere
exclude_folders_dialog_title = Mapper som skal ekskluderes
include_manually_directories_dialog_title = Legg til mappe manuelt

@ -14,22 +14,6 @@ music_bitrate_checkbox = Bitrate
music_genre_checkbox = Gatunek
music_length_checkbox = Długość
music_comparison_checkbox = Przybliżone Porównywanie
music_checking_by_tags = Tagi
music_checking_by_content = Zawartość
same_music_seconds_label = Minimalny fragment drugi czas trwania
same_music_similarity_label = Maksymalna różnica
same_music_tooltip =
Wyszukiwanie podobnych plików muzycznych przez jego zawartość można skonfigurować przez ustawienie:
- Minimalny czas fragmentu, po którym pliki muzyczne mogą być zidentyfikowane jako podobne
- Maksymalna różnica między dwoma testowanymi fragmentami
Kluczem do dobrych wyników jest znalezienie rozsądnych kombinacji tych parametrów, do dostarczania.
Ustawianie minimalnego czasu na 5s i maksymalnej różnicy na 1.0, będzie szukać prawie identycznych fragmentów w plikach.
Czas 20s i maksymalna różnica 6.0, z drugiej strony, dobrze działa w poszukiwaniu remiksów/wersji na żywo itp.
Domyślnie każdy plik muzyczny jest porównywany ze sobą, co może zająć dużo czasu podczas testowania wielu plików, więc zwykle lepiej jest używać folderów referencyjnych i określać, które pliki mają być porównywane ze sobą (z taką samą ilością plików, porównywanie odcisków palców będzie szybsze niż bez folderów referencyjnych).
music_comparison_checkbox_tooltip =
Wyszukuje podobne pliki muzyczne za pomocą AI, która używa nauki maszynowej, aby usunąć nawiasy z frazy. Na przykład, z tą opcją włączoną, rozpatrywane pliki będą traktowane jako duplikaty:
@ -39,18 +23,17 @@ duplicate_case_sensitive_name_tooltip =
Gdy włączone, grupowe rekordy tylko wtedy, gdy mają dokładnie taką samą nazwę, np. Żołd <-> Żołd
Wyłączenie tej opcji spowoduje grupowanie nazw bez sprawdzania, czy każda litera ma ten sam rozmiar, np. żoŁD <-> Żołd
duplicate_mode_size_name_combo_box = Rozmiar i nazwa
duplicate_mode_name_combo_box = Nazwa
duplicate_mode_size_combo_box = Rozmiar
duplicate_mode_hash_combo_box = Hash
duplicate_hash_type_tooltip =
Czkawka oferuje 3 rodzaje hashów:
Czkawka oferuje 3 typy hashów:
Blake3 - kryptograficzna funkcja skrótu. Jest to wartość domyślna, ponieważ jest bardzo szybka.
Blake3 - kryptograficzna funkcja skrótu. Domyślnie używane, ponieważ jest bardzo szybkie.
CRC32 - prosta funkcja haszująca. Powinno to być szybsze od Blake3, ale bardzo rzadko może to prowadzić do kolizji.
CRC32 - prosta funkcja haszująca. Powinna być szybsza niż Blake3, lecz bardzo rzadko może prowadzić do kolizji haszów.
XXH3 - bardzo podobna pod względem wydajności i jakości hashu do Blake3 (ale niekryptograficzna). Tak więc takie tryby mogą być łatwo wymienione.
XXH3 - bardzo podobna pod względem wydajności i jakości do Blake3 (lecz nie jest kryptograficzna).
duplicate_check_method_tooltip =
Na razie Czkawka oferuje trzy typy metod do znalezienia duplikatów przez:
@ -60,31 +43,18 @@ duplicate_check_method_tooltip =
Hash - Znajduje pliki, które mają tę samą zawartość. Ten tryb haszuje plik, a następnie porównuje utworzony skrót(hash) aby znaleźć duplikaty. Ten tryb jest najbezpieczniejszym sposobem na znalezienie duplikatów. Aplikacja używa pamięci podręcznej, więc drugie i kolejne skanowanie tych samych danych powinno być dużo szybsze niż za pierwszym razem.
image_hash_size_tooltip =
Każdy zaznaczony obraz tworzy specjalny skrót, który można porównać ze sobą, a niewielka różnica między nimi oznacza, że obrazy te są podobne.
8 hashh rozmiar jest dość dobry do wyszukiwania obrazów, które są tylko trochę podobne do oryginału. Dzięki większemu zestawowi zdjęć (>1000), spowoduje to uzyskanie dużej ilości fałszywych dodatnich, więc zalecam użycie większego rozmiaru skrótu w tym przypadku.
16 to domyślny rozmiar hasha, który jest dość dobrym kompromisem między znalezieniem nawet nieco podobnych obrazów a zaledwie niewielką ilością kolizji haszujących.
32 i 64 hashy znajdują tylko bardzo podobne obrazy, ale nie powinny mieć prawie żadnych fałszywych pozytywnych (może z wyjątkiem niektórych obrazów z kanałem alfa).
image_resize_filter_tooltip =
Aby obliczyć skrót obrazu, biblioteka musi najpierw zmienić jego rozmiar.
Czkawka oferuje zmianę rozmiaru wygenerowanego hashu dla każdego obrazu. Większy rozmiar umożliwia wyszukiwanie plików z mniejszą ilością różnic między innymi obrazami, ale jest również nieco wolniejszy w użyciu.
Dołącz do wybranego algorytmu, wynikowy obraz użyty do obliczenia skrótu będzie wyglądał nieco inaczej.
Domyślna wartość 8 bajtów jest dla znacznej większości przypadków wystarczająca, dlatego jest opcją domyslną, jednak w razie konieczności znalezienia identycznych obrazów z jeszcze większą dokładnością, należy użyć większego haszu.
image_resize_filter_tooltip = By obliczyć hash obrazu, biblioteka musi najpierw go zmniejszyć. W zależności od wybranego algorytmu, obraz będzie wyglądał nieco inaczej. Najszybszym, lecz za razem dającym najgorsze efekty jest algorytm Nearest.
image_hash_alg_tooltip = Użytkownicy mogą wybrać jeden z wielu algorytmów obliczania haszu. Każda z nich ma zarówno silne jak i słabsze punkty i czasami przyniesie lepsze i czasami gorsze wyniki w odniesieniu do różnych obrazów. W związku z tym, aby określić najlepszy dla siebie, wymagane jest ręczne testowanie każdego z nich.
main_notebook_image_fast_compare = Szybkie porównywanie
main_notebook_image_fast_compare_tooltip =
Przyśpieszenie wyszukiwania i porównywania hashów.
Najszybszy algorytm do użycia, ale także ten, który daje najgorsze wyniki, jest najbardziej potrzebny. Domyślnie jest włączona, ponieważ przy rozmiarze skrótu 16x16 jego jakość nie jest naprawdę widoczna.
W przeciwieństwie do normalnego trybu - w którym każdy skrót jest porównywany ze sobą x razy (gdzie x jest podobieństwem wybranym przez użytkownika) - w tym trybie, dokładnie jedno porównanie zostanie wykonane.
Przy rozmiarze skrótu 8x8 zaleca się użycie innego algorytmu niż najbliższy, aby mieć lepsze grupy obrazów.
image_hash_alg_tooltip =
Użytkownicy mogą wybrać jeden z wielu algorytmów obliczania hashu.
Każdy ma zarówno mocniejsze jak i słabsze punkty i czasami daje lepsze a czasami gorsze wyniki dla różnych obrazów.
Najlepiej jest samemu potestować jaki algorytm ma najlepsze wyniki(może to nie być zawsze dobrze widoczne).
big_files_mode_combobox_tooltip = Pozwala na wyszukiwanie najmniejszych lub największych plików
big_files_mode_label = Sprawdzane pliki
big_files_mode_smallest_combo_box = Najmniejsze
big_files_mode_biggest_combo_box = Największe
Ta opcja jest zalecana podczas porównywania >10000 obrazów z podobieństwem innym niż 0 (Bardzo wysokie).
main_notebook_duplicates = Duplikaty
main_notebook_empty_directories = Puste Katalogi
main_notebook_big_files = Duże Pliki
@ -124,12 +94,8 @@ main_label_max_size = Max
main_label_shown_files = Liczba wyświetlanych plików
main_label_resize_algorithm = Algorytm zmiany rozmiaru
main_label_similarity = Podobieństwo{ " " }
main_check_box_broken_files_audio = Audio
main_check_box_broken_files_pdf = Pdf
main_check_box_broken_files_archive = Archiwa
main_check_box_broken_files_image = Obraz
check_button_general_same_size = Ignoruj identyczny rozmiar
check_button_general_same_size_tooltip = Ignoruj pliki o identycznym rozmiarze w wynikach - zazwyczaj są to duplikaty 1:1
check_button_general_same_size_tooltip = Wyrzuca z wyników skanowania pliki, które posiadają identyczny rozmiar, po to by w wynikach zostały tylko niemal identyczne rekordy.
main_label_size_bytes_tooltip = Rozmiar plików które będą zawarte przy przeszukiwaniu
# Upper window
upper_tree_view_included_folder_column_title = Foldery do Przeszukania
@ -142,20 +108,10 @@ upper_remove_included_button = Usuń
upper_manual_add_excluded_button = Ręcznie Dodaj
upper_add_excluded_button = Dodaj
upper_remove_excluded_button = Usuń
upper_manual_add_included_button_tooltip =
Dodaj nazwę katalogu do ręcznego wyszukiwania.
Aby dodać wiele ścieżek na raz, należy je oddzielić za pomocą średnika ;
/home/roman;/home/rozkaz doda dwa katalogi /home/roman i /home/rozkaz
upper_manual_add_included_button_tooltip = Dodaj nazwę katalogu do ręcznego wyszukiwania.
upper_add_included_button_tooltip = Dodaje wybrany folder do przeskanowania.
upper_remove_included_button_tooltip = Usuwa zaznaczony folder z listy do skanowania.
upper_manual_add_excluded_button_tooltip =
Dodaj ręcznie katalog do listy wykluczonych.
Aby dodać wiele ścieżek na raz, oddziel je średnikiem ;
/home/roman;/home/krokiet doda dwa katalogi /home/roman i /home/keokiet
upper_manual_add_excluded_button_tooltip = Dodaj ręcznie wyodrębnioną nazwę katalogu.
upper_add_excluded_button_tooltip = Dodaje wybrany folder do ignorowanych.
upper_remove_excluded_button_tooltip = Usuwa zaznaczony folder z ignorowanych.
upper_notebook_items_configuration = Konfiguracja Skanowania
@ -167,16 +123,11 @@ upper_allowed_extensions_tooltip =
Istnieją makra, które umożliwiają dołączenie za jednym razem określonych typów plików IMAGE, VIDEO, MUSIC, TEXT.
Przykład użycia ".exe, IMAGE, VIDEO, .rar, 7z" - oznacza że obrazy (np. jpg, png), filmy (np. avi, mp4), exe, rar i 7z zostaną sprawdzone.
upper_excluded_extensions_tooltip =
Lista wyłączonych plików, które zostaną zignorowane w skanowaniu.
Gdy używasz zarówno dozwolonych, jak i wyłączonych rozszerzeń, ten ma wyższy priorytet, więc plik nie zostanie sprawdzony.
upper_excluded_items_tooltip =
Wykluczone elementy muszą zawierać znak * (który odpowiada za dowolny ciąg znaków) i powinny być oddzielone przecinkami.
Jest to wolniejszy sposób od zwykłego wykluczania katalogów, więc należy używać go ostrożnie.
upper_excluded_items = Ignorowane Obiekty:
upper_allowed_extensions = Dozwolone Rozszerzenia:
upper_excluded_extensions = Wyłączone rozszerzenia:
# Popovers
popover_select_all = Zaznacz wszystko
popover_unselect_all = Odznacz wszystko
@ -225,11 +176,6 @@ popover_custom_case_sensitive_check_button = Rozróżniaj wielkość liter
popover_custom_all_in_group_label = Nie zaznaczaj wszystkich rekordów w grupie
popover_custom_mode_unselect = Własne odznaczanie
popover_custom_mode_select = Własne zaznaczanie
popover_sort_file_name = Nazwa pliku
popover_sort_folder_name = Nazwa katalogu
popover_sort_full_name = Pełna nazwa
popover_sort_size = Rozmiar
popover_sort_selection = Zaznaczanie
popover_invalid_regex = Regex jest niepoprawny
popover_valid_regex = Regex jest poprawny
# Bottom buttons
@ -240,7 +186,6 @@ bottom_save_button = Zapisz
bottom_symlink_button = Symlink
bottom_hardlink_button = Hardlink
bottom_move_button = Przenieś
bottom_sort_button = Sortuj
bottom_search_button_tooltip = Rozpocznij wyszukiwanie
bottom_select_button_tooltip = Wybierz rekordy. Tylko wybrane pliki/foldery mogą być później przetwarzane.
bottom_delete_button_tooltip = Usuń zaznaczone elementy.
@ -253,21 +198,14 @@ bottom_hardlink_button_tooltip =
Tworzenie twardych linków.
Działa tylko wtedy, gdy wybrano co najmniej dwa rekordy w grupie.
Pierwszy jest niezmieniony, drugi i następny jest dowiązywany z pierwszym.
bottom_hardlink_button_not_available_tooltip =
Tworzenie twardych dowiązań.
Przycisk jest zablokowany, gdyż stworzenie twardego dowiązania nie jest możliwe.
Dowiązanie tego rodzaju może tworzyć administrator w systemie Windows, więc należy upewnić się że aplikacja jest uruchomiona przez z tymi uprawnieniami.
Jeśli aplikacja działa z nimi, należy przeszukać issues w Githubie celem znalezienia możliwych rozwiązań danego problemu.
bottom_move_button_tooltip =
Przenosi pliki do wybranego katalogu.
Kopiuje wszystkie pliki do katalogu bez zachowania struktury plików.
Podczas próby przeniesienia dwóch plików o identycznej nazwie do folderu, drugi plik nie zostanie przeniesiony i pojawi się błąd.
bottom_sort_button_tooltip = Sortuje pliki/foldery zgodnie z wybraną metodą.
bottom_show_errors_tooltip = Pokaż/Ukryj dolny panel tekstowy.
bottom_show_upper_notebook_tooltip = Pokazuje/ukrywa górny panel.
# Progress Window
progress_stop_button = Stop
progress_stop_additional_message = Przerywanie skanowania
# About Window
about_repository_button_tooltip = Link do repozytorium z kodem źródłowym
about_donation_button_tooltip = Link do strony z dotacjami.
@ -286,14 +224,6 @@ header_about_button_tooltip = Otwórz okno z informacjami o programie.
## General
settings_number_of_threads = Liczba używanych wątków
settings_number_of_threads_tooltip = Liczba używanych wątków, 0 oznacza, że zostaną użyte wszystkie dostępne wątki.
settings_label_restart = Musisz ponownie uruchomić aplikację, aby aplikacja zaciągnęła nowe ustawienia!
settings_ignore_other_filesystems = Ignoruj inne systemy plików (tylko Linux)
settings_ignore_other_filesystems_tooltip =
ignoruje pliki, które nie są w tym samym systemie plików co przeszukiwane katalogi.
Działa tak samo jak opcja -xdev w komendzie find na Linux
settings_save_at_exit_button_tooltip = Zapisz konfigurację do pliku podczas zamykania aplikacji.
settings_load_at_start_button_tooltip =
Wczytaj konfigurację z pliku podczas otwierania aplikacji.
@ -338,7 +268,7 @@ settings_multiple_image_preview_checkbutton = Pokazuj podgląd obrazów
settings_multiple_clear_cache_button_tooltip =
Ręcznie wyczyść pamięć podręczną przestarzałych wpisów.
To powinno być używane tylko wtedy, gdy automatyczne czyszczenie zostało wyłączone.
settings_multiple_clear_cache_button = Usuń nieaktualne wyniki z pamięci podręcznej.
settings_multiple_clear_cache_button = Usuń nieaktualne dane z pamięci podręcznej
## Duplicates
@ -410,20 +340,11 @@ progress_scanning_image = Hashowanie { $file_checked }/{ $all_files } obrazu
progress_comparing_image_hashes = Porównywanie { $file_checked }/{ $all_files } hashu obrazu
progress_scanning_music_tags_end = Porównywanie tagów { $file_checked }/{ $all_files } pliku audio
progress_scanning_music_tags = Sczytywanie tagów { $file_checked }/{ $all_files } pliku audio
progress_scanning_music_content_end = Porównywanie odcisku palca { $file_checked }/{ $all_files } pliku muzycznego
progress_scanning_music_content = Obliczanie odcisku palca { $file_checked }/{ $all_files } pliku muzycznego
progress_scanning_empty_folders = Przeszukiwanie { $folder_number } folderu
progress_scanning_size = Sprawdzanie rozmiaru { $file_number } pliku
progress_scanning_size_name = Skanowanie nazwy i rozmiaru pliku { $file_number }
progress_scanning_name = Sprawdzanie nazwy { $file_number } pliku
progress_analyzed_partial_hash = Obliczanie częściowego hashu { $file_checked }/{ $all_files } pliku
progress_analyzed_full_hash = Obliczanie pełnego hashu { $file_checked }/{ $all_files } pliku
progress_prehash_cache_loading = Ładowanie pamięci podręcznej prehashu
progress_prehash_cache_saving = Zapisywanie pamięci podręcznej prehashu
progress_hash_cache_loading = Ładowanie pamięci podręcznej hash
progress_hash_cache_saving = Zapisywanie pamięci podręcznej skrótu
progress_cache_loading = Ładowanie pamięci podręcznej
progress_cache_saving = Zapisywanie pamięci podręcznej
progress_current_stage = Aktualny Etap:{ " " }
progress_all_stages = Wszystkie Etapy:{ " " }
# Saving loading
@ -448,7 +369,6 @@ saving_loading_not_valid = Ustawienie "{ $data }" nie istnieje w bieżącej wers
invalid_symlink_infinite_recursion = Nieskończona rekurencja
invalid_symlink_non_existent_destination = Nieistniejący docelowy plik
# Other
selected_all_reference_folders = Nie można rozpocząć wyszukiwania, gdy wszystkie katalogi są ustawione jako foldery źródłowe (referencyjne)
searching_for_data = Przeszukiwanie dysku, może to potrwać chwilę, proszę czekać...
text_view_messages = WIADOMOŚCI
text_view_warnings = OSTRZEŻENIA
@ -481,9 +401,8 @@ move_file_failed = Nie można przenieść pliku { $name }, powód { $reason }
move_files_title_dialog = Wybierz folder, do którego zostaną przeniesione pliki
move_files_choose_more_than_1_path = Tylko jedna ścieżka może być wybrana, aby móc skopiować zduplikowane pliki, wybrano { $path_number }.
move_stats = Poprawnie przeniesiono { $num_files }/{ $all_files } elementów
save_results_to_file = Zapisano wyniki zarówno do plików txt, jak i json w folderze { $name }.
save_results_to_file = Zapisano wyniki do pliku { $name }
search_not_choosing_any_music = BŁĄD: Musisz zaznaczyć przynajmniej jeden pole, według którego będą wyszukiwane podobne pliki muzyczne.
search_not_choosing_any_broken_files = BŁĄD: Musisz wybrać co najmniej jedno pole wyboru z rodzajem uszkodzonych plików.
include_folders_dialog_title = Foldery do przeszukiwania
exclude_folders_dialog_title = Foldery do ignorowania
include_manually_directories_dialog_title = Dodaj katalogi ręcznie

@ -14,88 +14,60 @@ music_bitrate_checkbox = Taxa de bits
music_genre_checkbox = Género
music_length_checkbox = Comprimento
music_comparison_checkbox = Comparação aproximada
music_checking_by_tags = Etiquetas
music_checking_by_content = Conteúdo
same_music_seconds_label = Duração mínima do fragmento segundo tempo
same_music_similarity_label = Diferença máxima
same_music_tooltip =
Procurar por arquivos de música semelhantes por seu conteúdo pode ser configurado pela configuração:
- Tempo mínimo de fragmento depois do qual os arquivos de música podem ser identificados como semelhantes
- A diferença máxima entre dois fragmentos testados
A chave para bons resultados é encontrar combinações sensíveis desses parâmetros, para fornecido.
Definir o tempo mínimo para 5s e a diferença máxima para 1.0, irá procurar fragmentos quase idênticos nos arquivos.
Um tempo de 20s e uma diferença máxima de 6.0, por outro lado, funciona bem para encontrar versões remixes/ao vivo, etc.
Por padrão, cada arquivo de música é comparado entre si, e isso pode levar muito tempo para testar muitos arquivos, portanto, é geralmente melhor usar pastas de referência e especificar quais arquivos devem ser comparados (com a mesma quantidade de arquivos, A comparação de impressões digitais será mais rápida pelo menos 4 vezes do que nas pastas de referência).
music_comparison_checkbox_tooltip =
Ele busca arquivos de música semelhantes usando IA, que usa aprendizado de máquina para remover parênteses duma frase. Por exemplo, com esta opção ativada, os arquivos em questão serão considerados duplicatas:
Ele procura arquivos de música semelhantes usando AI, que usa aprendizado de máquina para remover parênteses de uma frase. Por exemplo, com essa opção habilitada, os arquivos em questão serão considerados duplicatas:
Świędziżłób --- Świędziżłób (Remix Lato 2021)
duplicate_case_sensitive_name = Sensível a maiúsculas e minúsculas
duplicate_case_sensitive_name = Sensível a Maiúsculas e Minúsculas
duplicate_case_sensitive_name_tooltip =
Quando ativado, o grupo só registra quando eles têm o mesmo nome, por exemplo, Żołd <-> Żołd
Quando ativado, grupo apenas registo quando têm exatamente o mesmo nome, por exemplo. Żołd <-> ŻołdżoŁD <-> Żołd
Desativar esta opção agrupará os nomes sem verificar se cada letra é do mesmo tamanho, por exemplo, żoŁD <-> Żołd
duplicate_mode_size_name_combo_box = Tamanho e Nome
Desabilitar tal opção irá agrupar nomes sem verificar se cada letra tem o mesmo tamanho, por exemplo, żoŁD <-> Żołd
duplicate_mode_name_combo_box = Nome
duplicate_mode_size_combo_box = Tamanho
duplicate_mode_hash_combo_box = Hash
duplicate_hash_type_tooltip =
Blake3 - função de hash criptográfico. Este é o padrão, pois é muito rápido.
Czkawka oferece 3 tipos de hashes:
Blake3 - função hash criptográfica. Este é o padrão porque é muito rápido.
CRC32 - função de hash simples. Isto deve ser mais rápido que Blake3, mas pode muito raramente ter algumas colisões.
CRC32 - função hash simples. Isto deveria ser mais rápido do que o Blake3, mas muito raramente pode ter algumas colisões.
XXH3 - muito semelhante em desempenho e qualidade de hash ao Blake3 (mas não criptográfico). Logo, tais modos podem ser facilmente intercambiáveis.
XXH3 - muito similar em desempenho e qualidade de hash do Blake3 (mas não criptográfico). Então, esses modos podem ser facilmente interalterados.
duplicate_check_method_tooltip =
Por ora, o Czkawka oferece três tipos de métodos para encontrar duplicatas:
Por enquanto, Czkawka oferece três tipos de métodos para encontrar duplicados por:
Nome - Acha arquivos que têm o mesmo nome.
Nome - Localiza arquivos que têm o mesmo nome.
Tamanho - Acha arquivos que têm o mesmo tamanho.
Tamanho - Localiza arquivos que têm o mesmo tamanho.
Hash - Acha arquivos que têm o mesmo conteúdo. Este modo faz o hash do arquivo e entção compara este hash para achar duplicatas. Este modo é o jeito mais seguro de achar duplicatas. O aplicativo usa muito cache, logo, a segunda e outras varreduras dos mesmos dados devem ser muito mais rápidas que a primeira.
Hash - Localiza arquivos que têm o mesmo conteúdo. Este modo de hashing o arquivo e, mais tarde, compara este hash para encontrar duplicatas. Este modo é a maneira mais segura de encontrar duplicatas. O app usa o cache pesado, então as verificações de segundo e mais longo dados devem ser muito mais rápidas do que o primeiro.
image_hash_size_tooltip =
Cada imagem marcada produz um hash especial que pode ser comparado entre si. e uma pequena diferença entre eles significa que essas imagens são parecidas. O tamanho hash
8 é muito bom para encontrar imagens que são apenas um pouco semelhantes ao original. Com um maior conjunto de imagens (>1000), isso irá produzir uma grande quantidade de falsos positivos, então eu recomendo usar um tamanho de hash maior neste caso.
16 é o tamanho hash padrão que é um bom compromisso entre encontrar até mesmo algumas imagens semelhantes e ter apenas uma pequena quantidade de colisões hash.
32 e 64 hashes só encontram imagens muito semelhantes, mas quase não devem ter falsos positivos (talvez, exceto algumas imagens com o canal alfa).
image_resize_filter_tooltip =
To compute hash of image, the library must first resize it.
Depend on chosen algorithm, the resulting image used to calculate hash will looks a little different.
The fastest algorithm to use, but also the one which gives the worst results, is Nearest. It is enabled by default, because with 16x16 hash size lower quality it is not really visible.
With 8x8 hash size it is recommended to use a different algorithm than Nearest, to have better groups of images.
image_hash_alg_tooltip =
Os usuários podem escolher entre um dos muitos algoritmos de cálculo do hash.
Cada um tem pontos fortes e fracos e por vezes darão resultados melhores e por vezes piores para imagens diferentes.
Logo, para determinar o melhor para você, são precisos testes manuais.
big_files_mode_combobox_tooltip = Permite a busca de arquivos menores/maiores
big_files_mode_label = Arquivos verificados
big_files_mode_smallest_combo_box = O menor
big_files_mode_biggest_combo_box = O maior
main_notebook_duplicates = Arquivos duplicados
main_notebook_empty_directories = Diretórios vazios
main_notebook_big_files = Arquivos grandes
main_notebook_empty_files = Arquivos vazios
main_notebook_temporary = Arquivos temporários
main_notebook_similar_images = Imagens semelhantes
main_notebook_similar_videos = Vídeos semelhantes
main_notebook_same_music = Músicas duplicadas
main_notebook_symlinks = Ligação simbólica inválida
main_notebook_broken_files = Arquivos quebrados
Czkawka oferece alterar o tamanho do hash gerado para cada imagem. Um tamanho de hash maior permite encontrar imagens com uma quantidade menor de diferenças entre imagens, mas também é um pouco mais lento para usar.
O valor padrão para hash é 8 bytes, o que permite encontrar imagens muito semelhantes e diferentes. 16 bytes e 32 bytes de hashes devem ser usados apenas para imagens quase idênticas. O hash de 64 bytes não deve ser usado, exceto em situações em que você precisa encontrar diferenças realmente pequenas.
image_resize_filter_tooltip = Para calcular o hash de imagem, a biblioteca deve primeiro redimensioná-la. Depende no algoritmo escolhido, a imagem resultante parecerá pouco diferente. O algoritmo mais rápido para usar, mas também aquele que dá os piores resultados é mais rápido.
image_hash_alg_tooltip = Os usuários podem escolher entre muitos algoritmos para calcular o hash. Cada um tem pontos fortes e fracos e, às vezes, dá resultados melhores e por vezes piores para diferentes imagens. Então, para determinar a melhor para você, testes manuais são necessários.
main_notebook_image_fast_compare = Comparação rápida
main_notebook_image_fast_compare_tooltip =
Acelerar busca e comparação de hashes.
Em oposição ao modo normal - onde cada hash é comparado entre si x vezes (onde x é a similaridade que o usuário escolheu) - neste modo, Será utilizada exactamente uma comparação.
Esta opção é recomendada quando se compara >10000 imagens com non 0 (muito alta) similaridade.
main_notebook_duplicates = Arquivos Duplicados
main_notebook_empty_directories = Diretórios Vazios
main_notebook_big_files = Arquivos Grandes
main_notebook_empty_files = Arquivos Vazios
main_notebook_temporary = Arquivos Temporários
main_notebook_similar_images = Imagens Semelhantes
main_notebook_similar_videos = Vídeos Similares
main_notebook_same_music = Músicas Duplicadas
main_notebook_symlinks = Link Simbólico Inválido
main_notebook_broken_files = Arquivos Quebrados
main_notebook_bad_extensions = Extensões inválidas
main_tree_view_column_file_name = Nome do arquivo
main_tree_view_column_folder_name = Nome do diretório
main_tree_view_column_folder_name = Nome da pasta
main_tree_view_column_path = Caminho
main_tree_view_column_modification = Data de modificação
main_tree_view_column_size = Tamanho
@ -107,9 +79,9 @@ main_tree_view_column_year = Ano
main_tree_view_column_bitrate = Taxa de bits
main_tree_view_column_length = Comprimento
main_tree_view_column_genre = Género
main_tree_view_column_symlink_file_name = Nome do arquivo de ligação simbólica
main_tree_view_column_symlink_folder = Diretório da ligação simbólica
main_tree_view_column_destination_path = Caminho de destino
main_tree_view_column_symlink_file_name = Nome do arquivo Symlink
main_tree_view_column_symlink_folder = Pasta Symlink
main_tree_view_column_destination_path = Caminho de Destino
main_tree_view_column_type_of_error = Tipo de erro
main_tree_view_column_current_extension = Extensão atual
main_tree_view_column_proper_extensions = Extensão adequada
@ -122,40 +94,26 @@ main_label_max_size = Máximo
main_label_shown_files = Número de arquivos exibidos
main_label_resize_algorithm = Redimensionar algoritmo
main_label_similarity = Similaridade{ " " }
main_check_box_broken_files_audio = Áudio
main_check_box_broken_files_pdf = Pdf
main_check_box_broken_files_archive = Arquivar
main_check_box_broken_files_image = Imagem
check_button_general_same_size = Ignorar o mesmo tamanho
check_button_general_same_size_tooltip = Ignorar arquivos com tamanho idêntico nos resultados - geralmente estes são duplicados 1:1
check_button_general_same_size_tooltip = Ignorar dos resultados, arquivos que têm tamanho idêntico - geralmente isto são duplicados 1:1
main_label_size_bytes_tooltip = Tamanho dos arquivos que serão usados na verificação
# Upper window
upper_tree_view_included_folder_column_title = Diretórios para buscar
upper_tree_view_included_reference_column_title = Diretórios de referência
upper_tree_view_included_folder_column_title = Pastas para Pesquisar
upper_tree_view_included_reference_column_title = Pastas de referência
upper_recursive_button = Recursiva
upper_recursive_button_tooltip = Se selecionado, buscar também arquivos que não são postos diretamente nas pastas escolhidas.
upper_manual_add_included_button = Adição manual
upper_recursive_button_tooltip = Se selecionado, pesquisar também por arquivos que não são colocados diretamente nas pastas escolhidas.
upper_manual_add_included_button = Adicionar Manual
upper_add_included_button = Adicionar
upper_remove_included_button = Excluir
upper_manual_add_excluded_button = Adição manual
upper_manual_add_excluded_button = Adicionar Manual
upper_add_excluded_button = Adicionar
upper_remove_excluded_button = Excluir
upper_manual_add_included_button_tooltip =
Adicionar o nome do diretório à mão.
Para adicionar vários caminhos de uma vez, separe-os por ;
/home/roman;/home/rozkaz adicionará dois diretórios /home/roman e /home/rozkaz
upper_add_included_button_tooltip = Adicionar novo diretório à busca.
upper_manual_add_included_button_tooltip = Adicione o nome do diretório à mão.
upper_add_included_button_tooltip = Adicionar novo diretório à pesquisa.
upper_remove_included_button_tooltip = Excluir diretório da busca.
upper_manual_add_excluded_button_tooltip =
Adicionar o nome de diretório excluído à mão.
Para adicionar vários caminhos de uma vez, separe-os por ;
/home/roman;/home/krokiet adicionará dois diretórios /home/roman e /home/keokiet
upper_add_excluded_button_tooltip = Adicionar diretório a ser excluído na busca.
upper_remove_excluded_button_tooltip = Excluir diretório da exclusão.
upper_manual_add_excluded_button_tooltip = Adicione nome de diretório excluído à mão.
upper_add_excluded_button_tooltip = Adicionar diretório a ser excluído na pesquisa.
upper_remove_excluded_button_tooltip = Diretório excluído para exclusão.
upper_notebook_items_configuration = Configuração dos itens
upper_notebook_excluded_directories = Diretórios excluídos
upper_notebook_included_directories = Diretórios incluídos
@ -164,112 +122,95 @@ upper_allowed_extensions_tooltip =
Os seguintes Macros, que adicionam várias extensões de uma só vez, também estão disponíveis: IMAGE, VIDEO, MUSIC, TEXT.
Exemplo de uso ".exe, IMAGE, VIDEO, .rar, 7z" - isto significa que as imagens (e. . jpg, png), vídeos (por exemplo, avi, mp4), exe, rar e arquivos 7z serão escaneados.
upper_excluded_extensions_tooltip =
Lista de arquivos desabilitados que serão ignorados na verificação.
Ao usar extensões permitidas e desativadas, este tem maior prioridade, então o arquivo não será marcado.
Exemplo de uso ".exe, IMAGE, VIDEO, .rar, 7z" - isto significa que as imagens (e. . jpg, png), vídeos (por exemplo, avi, mp4), exe, rar, e 7z arquivos serão escaneados.
upper_excluded_items_tooltip =
Itens excluídos devem conter * curinga e devem ser separados por vírgulas.
Isto é mais lento do que a exclusão de diretórios, logo, use-o com cuidado.
upper_excluded_items = Itens excluídos:
Isto é mais lento do que os diretórios excluídos, então use-o com cuidado.
upper_excluded_items = Itens Excluídos:
upper_allowed_extensions = Extensões permitidas:
upper_excluded_extensions = Extensões desabilitadas:
# Popovers
popover_select_all = Selecionar todos
popover_unselect_all = Desmarcar todos
popover_reverse = Seleção inversa
popover_select_all_except_oldest = Selecionar todos, exceto os mais antigos
popover_select_all_except_newest = Selecionar todos, exceto os mais recentes
popover_select_one_oldest = Selecionar um mais antigo
popover_select_one_newest = Selecionar um mais recente
popover_select_custom = Selecionar um customizado
popover_unselect_custom = Desmarcar customizado
popover_select_one_oldest = Selecione um mais antigo
popover_select_one_newest = Selecione um mais recente
popover_select_custom = Selecionar um personalizado
popover_unselect_custom = Desmarcar personalizado
popover_select_all_images_except_biggest = Selecionar tudo, exceto o maior
popover_select_all_images_except_smallest = Selecionar tudo, exceto o menor
popover_select_all_images_except_smallest = Selecionar todos, exceto menor
popover_custom_path_check_button_entry_tooltip =
Selecionar registros por caminho.
Selecione registros por caminho.
Exemplo de uso:
/home/pimpek/rzecz.txt pode ser achado com /home/pim*
/home/pimpek/rzecz.txt pode ser encontrado com /home/pim*
popover_custom_name_check_button_entry_tooltip =
Selecionar registros por nomes de arquivos.
Selecione registros por nomes de arquivos.
Exemplo de uso:
/usr/ping/pong.txt pode ser achado com *ong*
/usr/ping/pong.txt pode ser encontrado com *ong*
popover_custom_regex_check_button_entry_tooltip =
Selecionar registros por Regex especificada.
Selecione registros por Regex especificado.
Com este modo, o texto buscado é o caminho com o nome.
Com este modo, o texto pesquisado é o caminho com o nome.
Exemplo de uso:
/usr/bin/ziemniak.txt pode ser achado com /ziem[a-z]+
/usr/bin/ziemniak. O xt pode ser encontrado com /ziem[a-z]+
Ele usa a implementação regex padrão do Rust. Você pode ler mais sobre isso aqui: https://docs.rs/regex.
popover_custom_case_sensitive_check_button_tooltip =
Ativa a deteção sensível a maiúsculas e minúsculas.
Habilita a detecção diferenciada de maiúsculas de minúsculas.
Quando desativado, /home/* acha ambos /HoMe/roman e /home/roman.
Quando desabilitado /home/* encontra ambos /HoMe/roman e /home/roman.
popover_custom_not_all_check_button_tooltip =
Impede a seleção de todo registro no grupo.
Impede selecionar todos os registros no grupo.
Isto está ativado por padrão, pois na maioria das situações, você não quer apagar ambos arquivos originais e duplicados, mas quer deixar ao menos um arquivo.
Isto está habilitado por padrão, porque na maioria das situações, você não quer apagar arquivos originais e duplicados, mas quer deixar pelo menos um arquivo.
AVISO: Esta configuração não funciona se você já selecionou manualmente todos os resultados num grupo.
AVISO: Essa configuração não funciona se você já selecionou manualmente todos os resultados em um grupo.
popover_custom_regex_path_label = Caminho
popover_custom_regex_name_label = Nome
popover_custom_regex_regex_label = Caminho da Regex + nome
popover_custom_case_sensitive_check_button = Sensível a maiúsculas e minúsculas
popover_custom_all_in_group_label = Não selecionar todo registro no grupo
popover_custom_mode_unselect = Desmarcar customizado
popover_custom_mode_select = Selecionar customizado
popover_sort_file_name = Nome do ficheiro
popover_sort_folder_name = Nome da pasta
popover_sort_full_name = Nome Completo
popover_sort_size = Tamanho
popover_sort_selection = Seleção
popover_invalid_regex = Regex inválida
popover_valid_regex = Regex é válida
popover_custom_regex_regex_label = Caminho Regex + Nome
popover_custom_case_sensitive_check_button = Maiúsculas e minúsculas
popover_custom_all_in_group_label = Não selecionar todos os registros no grupo
popover_custom_mode_unselect = Desmarcar Personalizado
popover_custom_mode_select = Selecionar personalizado
popover_invalid_regex = Regex inválido
popover_valid_regex = Regex é válido
# Bottom buttons
bottom_search_button = Buscar
bottom_search_button = Pesquisa
bottom_select_button = Selecionar
bottom_delete_button = Excluir
bottom_save_button = Guardar
bottom_symlink_button = Ligação simbólica
bottom_hardlink_button = Ligação hardlink
bottom_move_button = Mover
bottom_sort_button = Ordenar
bottom_search_button_tooltip = Iniciar busca
bottom_select_button_tooltip = Selecionar registros. Só arquivos/diretórios selecionados podem ser processados posteriormente.
bottom_delete_button_tooltip = Excluir arquivos/diretórios selecionados.
bottom_save_button_tooltip = Guardar dados sobre a busca em arquivo
bottom_symlink_button = Symlink
bottom_hardlink_button = Hardlink
bottom_move_button = Mover-se
bottom_search_button_tooltip = Iniciar procura
bottom_select_button_tooltip = Selecione registros. Apenas arquivos/pastas selecionadas podem ser processados posteriormente.
bottom_delete_button_tooltip = Excluir arquivos/pastas selecionadas.
bottom_save_button_tooltip = Salvar dados sobre a pesquisa em arquivo
bottom_symlink_button_tooltip =
Criar ligações simbólicas. Só funciona quando ao menos dois resultados num grupo são selecionados.
O primeiro é inalterado, e no segundo e mais tarde é feita a ligação simbólica para o primeiro.
Criar links simbólicos.
só funciona quando pelo menos dois resultados em um grupo são selecionados.
O primeiro é inalterado e o segundo e mais tarde são associados aos primeiros pontos simbólicos.
bottom_hardlink_button_tooltip =
Criar ligações hardlinks.
Só funciona quando ao menos dois resultados num grupo são selecionados.
O primeiro é inalterado, e no segundo e posterior é feito o hardlink ao primeiro.
bottom_hardlink_button_not_available_tooltip =
Criar ligações hardlinks.
O botão está desativado, pois ligações hardlinks não podem ser criadas.
Hardlinks só funcionam com privilégios de administrador no Windows, logo, certifique-se de executar o aplicativo como administrador.
Se o aplicativo já funciona com tais privilégios, verifique se há questões semelhantes no GitHub.
Criar links hardlinks.
Só funciona quando pelo menos dois resultados em um grupo são selecionados.
O primeiro é inalterado e o segundo e posterior são vinculados ao primeiro.
bottom_move_button_tooltip =
Move arquivos para o diretório escolhido.
Ele copia todos os arquivos para o diretório sem preservar a árvore de diretório.
Ao tentar mover dois arquivos com nome idêntico para o diretório, a segunda falhará e exibirá um erro.
bottom_sort_button_tooltip = Ordena arquivos/pastas de acordo com o método selecionado.
bottom_show_errors_tooltip = Exibir/ocultar painel de texto inferior.
bottom_show_upper_notebook_tooltip = Exibir/ocultar painel superior do caderno.
Quando tentar mover dois arquivos com nome idêntico para a pasta, a segunda irá falhar e mostrar erro.
bottom_show_errors_tooltip = Mostrar/ocultar painel de texto inferior.
bottom_show_upper_notebook_tooltip = Mostrar/ocultar painel superior do caderno.
# Progress Window
progress_stop_button = Parar
progress_stop_additional_message = Parada pedida
progress_stop_button = Interromper
# About Window
about_repository_button_tooltip = Link para a página do repositório com o código-fonte.
about_donation_button_tooltip = Link para a página de doação.
about_instruction_button_tooltip = Link para a página de instrução.
about_translation_button_tooltip = Link para a página do Crowdin com traduções do aplicativo. Oficialmente, polonês e inglês são suportados.
about_translation_button_tooltip = Link para a página do Crowdin com traduções de aplicativo. Oficialmente polonês e inglês são suportados.
about_repository_button = Repositório
about_donation_button = Doação
about_instruction_button = Instrução
@ -283,211 +224,192 @@ header_about_button_tooltip = Abre diálogo com informações sobre o aplicativo
## General
settings_number_of_threads = Número de threads usadas
settings_number_of_threads_tooltip = Numero de thread usadas. Zero significa que toda thread disponível será usada.
settings_label_restart = Você tem de reiniciar o aplicativo para aplicar as configurações!
settings_ignore_other_filesystems = Ignorar outros sistemas de arquivos (só Linux)
settings_ignore_other_filesystems_tooltip =
Ignora arquivos que não estão no mesmo sistema de arquivos que os diretórios buscados.
Funciona como a opção -xdev no comando find no Linux
settings_save_at_exit_button_tooltip = Guardar configuração em arquivo ao fechar o aplicativo.
settings_save_at_exit_button_tooltip = Salvar configuração em arquivo ao fechar o aplicativo.
settings_load_at_start_button_tooltip =
Carregar configuração do arquivo ao abrir aplicativo.
Se não estiver ativado, as configurações padrão serão usadas.
settings_confirm_deletion_button_tooltip = Exibir diálogo de confirmação ao clicar no botão excluir.
settings_confirm_link_button_tooltip = Exibir diálogo de confirmação ao clicar no botão de ligação hardlink/simbólica.
settings_confirm_group_deletion_button_tooltip = Exibir caixa de diálogo de aviso ao tentar excluir todo registro do grupo.
Se não estiver habilitado, as configurações padrão serão usadas.
settings_confirm_deletion_button_tooltip = Mostrar diálogo de confirmação ao clicar no botão excluir.
settings_confirm_link_button_tooltip = Mostrar diálogo de confirmação ao clicar no botão hard/simbólica.
settings_confirm_group_deletion_button_tooltip = Mostrar caixa de diálogo de aviso ao tentar excluir todos os registros do grupo.
settings_show_text_view_button_tooltip = Exibir painel de texto na parte inferior da interface do usuário.
settings_use_cache_button_tooltip = Usar cache de arquivos.
settings_save_also_as_json_button_tooltip = Salvar cache no formato JSON (legível por humanos). É possível modificar o seu conteúdo. O cache deste arquivo será lido automaticamente pelo aplicativo se o cache de formato binário (com extensão bin) estiver faltando.
settings_use_trash_button_tooltip = Move arquivos para a lixeira em vez de os excluir para sempre.
settings_language_label_tooltip = Idioma para a interface de usuário.
settings_save_at_exit_button = Guardar configuração ao fechar o aplicativo
settings_load_at_start_button = Carregar configuração ao abrir o aplicativo
settings_confirm_deletion_button = Exibir diálogo de confirmação ao excluir qualquer arquivo
settings_confirm_link_button = Exibir a caixa de diálogo de confirmação ao fazer a ligação hardlink/simbólica de qualquer arquivo
settings_confirm_group_deletion_button = Exibir diálogo de confirmação ao apagar todo arquivo no grupo
settings_show_text_view_button = Exibir painel de texto inferior
settings_use_cache_button_tooltip = Usar cache de arquivo.
settings_save_also_as_json_button_tooltip = Salvar cache no formato JSON (legível humana). É possível modificar seu conteúdo. Cache deste arquivo será lido automaticamente pelo aplicativo se o cache de formato binário (com extensão bin) estiver faltando.
settings_use_trash_button_tooltip = Move arquivos para a lixeira em vez de excluí-los permanentemente.
settings_language_label_tooltip = Idioma para interface de usuário.
settings_save_at_exit_button = Salvar configuração ao fechar o app
settings_load_at_start_button = Carregar configuração ao abrir aplicativo
settings_confirm_deletion_button = Mostrar diálogo de confirmação quando apagar qualquer arquivo
settings_confirm_link_button = Mostrar a caixa de diálogo de confirmação quando vincular qualquer arquivo
settings_confirm_group_deletion_button = Mostrar diálogo de confirmação quando apagar todos os arquivos no grupo
settings_show_text_view_button = Mostrar painel de texto inferior
settings_use_cache_button = Usar cache
settings_save_also_as_json_button = Também guardar o cache como arquivo JSON
settings_use_trash_button = Mover os arquivos excluídos para a lixeira
settings_save_also_as_json_button = Também salvar o cache como arquivo JSON
settings_use_trash_button = Mover os arquivos apagados para a lixeira
settings_language_label = Idioma
settings_multiple_delete_outdated_cache_checkbutton = Excluir entradas de cache desatualizadas automaticamente
settings_multiple_delete_outdated_cache_checkbutton_tooltip =
Excluir resultados de cache desatualizados que apontam para arquivos inexistentes.
Quando ativado, o aplicativo garante que ao carregar os registros, todos os registros apontem para arquivos válidos (aqueles com problemas são ignorados).
Quando ativado, o aplicativo garante que ao carregar os registros, todos os registros apontam para arquivos válidos (aqueles com problemas são ignorados).
Desativar isto ajudará ao escanear arquivos em unidades externas, então as entradas de cache sobre eles não serão removidas na próxima verificação.
Desativar isso ajudará ao escanear arquivos em unidades externas, então as entradas de cache sobre eles não serão removidas na próxima verificação.
No caso de ter centenas de milhares de registros no cache, é sugerido ativar isto, o que acelerará o carregamento/armazenamento de cache/salvamento no início/fim do escaneamento.
settings_notebook_general = Geral
No caso de ter centenas de milhares de registros no cache, é sugerido para habilitar isso, o que irá acelerar o carregamento de cache/salvamento ao iniciar/final do escaneamento.
settings_notebook_general = Gerais
settings_notebook_duplicates = Duplicados
settings_notebook_images = Imagens semelhantes
settings_notebook_videos = Vídeo semelhante
settings_notebook_images = Imagens Semelhantes
settings_notebook_videos = Vídeo similar
## Multiple - settings used in multiple tabs
settings_multiple_image_preview_checkbutton_tooltip = Exibe pré-visualização no lado direito (ao selecionar um arquivo de imagem).
settings_multiple_image_preview_checkbutton = Exibir pré-visualização da imagem
settings_multiple_image_preview_checkbutton = Mostrar pré-visualização da imagem
settings_multiple_clear_cache_button_tooltip =
Limpar manualmente o cache de entradas desatualizadas.
Isto só deve ser usado se a limpeza automática houver sido desativada.
settings_multiple_clear_cache_button = Remover resultados desatualizados do cache.
Isto só deve ser usado se a limpeza automática tiver sido desativada.
settings_multiple_clear_cache_button = Remover resultados desatualizados do cache de imagens
## Duplicates
settings_duplicates_hide_hard_link_button_tooltip =
Oculta todos os arquivos, exceto um, se todos apontarem para os mesmos dados (são ligados por hardlink).
Oculta todos os arquivos, exceto um, se todos apontarem para os mesmos dados (são hardlinked).
Exemplo: No caso de existirem (em disco) sete arquivos que são vinculados por hardlink a dados específicos e um arquivo diferente com os mesmos dados, mas um inode diferente, em seguida no achador de duplicatas, só um arquivo único e um arquivo dos que foi feita a ligação hardlink serão exibidos.
Exemplo: No caso de existirem (em disco) sete arquivos que são vinculados a dados específicos e um arquivo diferente com os mesmos dados, mas um arquivo diferente, em seguida no localizador duplicado, somente um arquivo exclusivo e um arquivo de links físicos serão mostrados.
settings_duplicates_minimal_size_entry_tooltip =
Definir o tamanho mínimo do arquivo que será armazenado em cache.
Defina o tamanho mínimo do arquivo que será armazenado em cache.
Escolher um valor menor gerará mais registros. Isto acelerará a busca, mas diminuirá o carregamento/armazenamento do cache.
Escolher um valor menor irá gerar mais registros. Isso acelerará a pesquisa, mas diminuirá o carregamento/salvamento do cache.
settings_duplicates_prehash_checkbutton_tooltip =
Permite o cache de pré-hash (um hash calculado a partir duma pequena parte do arquivo) que permite a demissão de resultados não duplicados anteriormente.
Permite o cache de pré-hash (um hash calculado a partir de uma pequena parte do arquivo) que permite a demissão anterior de resultados não duplicados.
Está desativado por padrão, pois pode causar lentidões nalguns casos.
está desabilitado por padrão porque pode causar lentidões em algumas situações.
É altamente recomendado o usar ao escanear centenas de milhares ou milhões de arquivos, pois pode acelerar a pesquisa em várias vezes.
É altamente recomendado usá-lo para escanear centenas de milhares de arquivos ou milhões, porque pode acelerar a pesquisa várias vezes.
settings_duplicates_prehash_minimal_entry_tooltip = Tamanho mínimo da entrada em cache.
settings_duplicates_hide_hard_link_button = Ocultar ligações hardlink (só Linux e macOS)
settings_duplicates_hide_hard_link_button = Ocultar links rígidos (somente Linux e macOS)
settings_duplicates_prehash_checkbutton = Usar cache de pré-hash
settings_duplicates_minimal_size_cache_label = Tamanho mínimo dos arquivos (em bytes) guardados no cache
settings_duplicates_minimal_size_cache_prehash_label = Tamanho mínimo dos arquivos (em bytes) guardados no cache de pré-hash
settings_duplicates_minimal_size_cache_label = Tamanho mínimo dos arquivos (em bytes) salvos no cache
settings_duplicates_minimal_size_cache_prehash_label = Tamanho mínimo dos arquivos (em bytes) salvos no cache de pré-hash
## Saving/Loading settings
settings_saving_button_tooltip = Guardar as configurações atuais em arquivo.
settings_saving_button_tooltip = Salve as configurações atuais no arquivo.
settings_loading_button_tooltip = Carregar configurações de arquivo e substituir a configuração atual por elas.
settings_reset_button_tooltip = Redefinir a configuração atual para a padrão.
settings_saving_button = Guardar configuração
settings_saving_button = Salvar configuração
settings_loading_button = Carregar configuração
settings_reset_button = Redefinir configuração
## Opening cache/config folders
settings_folder_cache_open_tooltip =
Abre o diretório onde os arquivos txt são armazenados.
Abre a pasta onde os arquivos txt são armazenados.
Modificar os arquivos de cache pode fazer com que resultados inválidos sejam exibidos. Porém, modificar o caminho pode economizar tempo ao mover uma grande quantidade de arquivos para um local diferente.
Modificar os arquivos de cache pode fazer com que resultados inválidos sejam mostrados. No entanto, modificar o caminho pode economizar tempo quando mover uma grande quantidade de arquivos para um local diferente.
Você pode copiar esses arquivos entre computadores para economizar tempo em outra verficação de arquivos (claro, se eles tiverem uma estrutura de diretórios semelhante).
Você pode copiar esses arquivos entre computadores para economizar tempo na verificação novamente de arquivos (claro, se eles tiverem uma estrutura de diretórios semelhante).
No caso de problemas com o cache, esses arquivos podem ser removidos. O aplicativo os regenerará automaticamente.
No caso de problemas com o cache, esses arquivos podem ser removidos. O aplicativo irá regenerá-los automaticamente.
settings_folder_settings_open_tooltip =
Abre o diretório onde a configuração do Czkawka está armazenada.
Abre a pasta onde a configuração do Czkawka está armazenada.
AVISO: Modificar manualmente a configuração pode quebrar seu fluxo de trabalho.
settings_folder_cache_open = Abrir diretório do cache
settings_folder_settings_open = Abrir diretório de configurações
settings_folder_cache_open = Abrir pasta cache
settings_folder_settings_open = Abrir pasta de configurações
# Compute results
compute_stopped_by_user = A busca foi parada pelo usuário
compute_found_duplicates_hash_size = Achadas { $number_files } duplicatas em { $number_groups } grupos que levaram { $size }
compute_found_duplicates_name = Achadas { $number_files } duplicatas em { $number_groups } grupos
compute_found_empty_folders = Achados { $number_files } diretórios vazios
compute_found_empty_files = Achados { $number_files } arquivos vazios
compute_found_big_files = Achados { $number_files } arquivos grandes
compute_found_temporary_files = Achados { $number_files } arquivos temporários
compute_found_images = Achadas { $number_files } imagens similares em { $number_groups } grupos
compute_found_videos = Achados { $number_files } vídeos similares em { $number_groups } grupos
compute_found_music = Achados { $number_files } arquivos de música similares em { $number_groups } grupos
compute_found_invalid_symlinks = Achadas { $number_files } ligações simbólicas inválidas
compute_found_broken_files = Achados { $number_files } arquivos quebrados
compute_found_bad_extensions = Achados { $number_files } arquivos com extensões inválidas
compute_stopped_by_user = A pesquisa foi interrompida pelo usuário
compute_found_duplicates_hash_size = Encontrados { $number_files } duplicados em { $number_groups } grupos que se tiveram { $size }
compute_found_duplicates_name = Encontrado { $number_files } duplicados em { $number_groups } grupos
compute_found_empty_folders = Encontradas { $number_files } pastas vazias
compute_found_empty_files = Encontrado { $number_files } arquivos vazios
compute_found_big_files = Encontrado { $number_files } arquivos grandes
compute_found_temporary_files = Encontrado { $number_files } arquivos temporários
compute_found_images = Encontrado { $number_files } imagens similares em { $number_groups } grupos
compute_found_videos = Encontrados { $number_files } vídeos similares em { $number_groups } grupos
compute_found_music = Encontrado { $number_files } arquivos de música similares em { $number_groups } grupos
compute_found_invalid_symlinks = Encontrado { $number_files } links simbólicos inválidos
compute_found_broken_files = Encontrado { $number_files } arquivos quebrados
compute_found_bad_extensions = Encontrados { $number_files } arquivos com extensões inválidas
# Progress window
progress_scanning_general_file = Escaneando { $file_number } arquivo
progress_scanning_extension_of_files = Verificando extensão de { $file_checked }/{ $all_files } de arquivo
progress_scanning_broken_files = Verificando { $file_checked }/{ $all_files } arquivo
progress_scanning_video = Hash de { $file_checked }/{ $all_files } vídeo
progress_scanning_image = Hash de { $file_checked }/{ $all_files } imagem
progress_comparing_image_hashes = Comparando de { $file_checked }/{ $all_files } hash de imagem
progress_scanning_music_tags_end = Comparando etiquetas de { $file_checked }/{ $all_files } arquivo de música
progress_scanning_video = Hashing de { $file_checked }/{ $all_files } vídeo
progress_scanning_image = Hashing de { $file_checked }/{ $all_files } imagem
progress_comparing_image_hashes = Comparação de { $file_checked }/{ $all_files } hash de imagem
progress_scanning_music_tags_end = Comparar etiquetas de { $file_checked }/{ $all_files } arquivo de música
progress_scanning_music_tags = Lendo etiquetas de { $file_checked }/{ $all_files } arquivo de música
progress_scanning_music_content_end = Comparação de impressão digital de { $file_checked }/{ $all_files } arquivo de música
progress_scanning_music_content = Calculando impressão digital de { $file_checked }/{ $all_files } arquivo de música
progress_scanning_empty_folders = Verificando { $folder_number } diretório
progress_scanning_empty_folders = Verificando { $folder_number } pasta
progress_scanning_size = Verificando tamanho de { $file_number } arquivo
progress_scanning_size_name = Verificando nome e tamanho de { $file_number } arquivo
progress_scanning_name = Verificando nome de { $file_number } arquivo
progress_analyzed_partial_hash = Hash parcial analisado de { $file_checked }/{ $all_files } arquivos
progress_analyzed_full_hash = Hash completo analisado de { $file_checked }/{ $all_files } arquivos
progress_prehash_cache_loading = Carregando cache de pré-hash
progress_prehash_cache_saving = Salvando cache pré-hash
progress_hash_cache_loading = Carregando cache de hash
progress_hash_cache_saving = Salvando cache de hash
progress_cache_loading = Carregando cache
progress_cache_saving = Salvando cache
progress_current_stage = Estágio atual:{ " " }
progress_all_stages = Todo estágio:{ " " }
progress_all_stages = Todos os Stages:{ " " }
# Saving loading
saving_loading_saving_success = Configuração guardada no arquivo { $name }.
saving_loading_saving_failure = Falha ao guardar dados de configuração no arquivo { $name }.
saving_loading_saving_success = Configuração salva no arquivo { $name }.
saving_loading_saving_failure = Falha ao salvar dados de configuração no arquivo { $name }.
saving_loading_reset_configuration = A configuração atual foi limpa.
saving_loading_loading_success = Configuração de aplicativo devidamente carregada.
saving_loading_invalid_string = Para a chave "{ $key }" foi achado um resultado inválido — "{ $result }" que não é uma string.
saving_loading_invalid_int = Para a chave "{ $key }" foi achado um resultado inválido — "{ $result }" que não é um inteiro.
saving_loading_invalid_bool = Para a chave "{ $key }" foi achado um resultado inválido — "{ $result }" que não é um bool.
saving_loading_decode_problem_bool = Falha ao decodificar o bool da chave "{ $key }" achado "{ $result }", mas valores permitidos são 0, 1, verdadeiro ou falso.
saving_loading_saving_same_keys = Tentando guardar a configuração com chave duplicada "{ $key }".
saving_loading_failed_to_get_home_directory = Falha ao obter o diretório inicial para abrir/guardar o arquivo de configuração.
saving_loading_folder_config_instead_file = Não se pode criar ou abrir o arquivo de configuração no caminho "{ $path }", pois já existe um diretório.
saving_loading_failed_to_create_configuration_folder = Falha ao criar o diretório de configuração "{ $path }", razão "{ $reason }".
saving_loading_failed_to_create_config_file = Falha ao criar o arquivo de configuração "{ $path }", razão "{ $reason }".
saving_loading_failed_to_read_config_file = Não se pode carregar a configuração de "{ $path }", pois ela não existe ou não é um arquivo.
saving_loading_failed_to_read_data_from_file = Não se pode ler dados do arquivo "{ $path }", razão "{ $reason }".
saving_loading_orphan_data = Dados órfãos achados "{ $data }" na linha "{ $line }".
saving_loading_not_valid = A configuração "{ $data }" não existe na versão atual do aplicativo.
saving_loading_loading_success = Configuração de aplicativo carregada adequadamente.
saving_loading_invalid_string = Para a chave "{ $key }" encontrou um resultado inválido - "{ $result }" que não é uma string.
saving_loading_invalid_int = Para a chave "{ $key }" encontrou um resultado inválido - "{ $result }" que não é um inteiro.
saving_loading_invalid_bool = Para a chave "{ $key }" encontrou um resultado inválido - "{ $result }" que não é um bool.
saving_loading_decode_problem_bool = Falha ao decodificar o bool da chave "{ $key }" encontrado "{ $result }" mas valores permitidos são 0, 1, verdadeiro ou falso.
saving_loading_saving_same_keys = Tentando salvar a configuração com chave duplicada "{ $key }".
saving_loading_failed_to_get_home_directory = Falha ao obter o diretório inicial para abrir/salvar o arquivo de configuração.
saving_loading_folder_config_instead_file = Não é possível criar ou abrir o arquivo de configuração no caminho "{ $path }" porque já existe uma pasta.
saving_loading_failed_to_create_configuration_folder = Falha ao criar a pasta de configuração "{ $path }", reason "{ $reason }".
saving_loading_failed_to_create_config_file = Falha ao criar o arquivo de configuração "{ $path }", reason "{ $reason }".
saving_loading_failed_to_read_config_file = Não foi possível carregar a configuração a partir de "{ $path }" porque ela não existe ou não é um arquivo.
saving_loading_failed_to_read_data_from_file = Não é possível ler dados do arquivo "{ $path }", reason "{ $reason }".
saving_loading_orphan_data = Dados órfãos encontrados "{ $data }" na linha "{ $line }".
saving_loading_not_valid = Definir "{ $data }" não existe na versão atual do aplicativo.
# Invalid symlinks
invalid_symlink_infinite_recursion = Recursão infinita
invalid_symlink_non_existent_destination = Arquivo de destino não existe
invalid_symlink_infinite_recursion = Infinito recursão
invalid_symlink_non_existent_destination = Arquivo de destino inexistente
# Other
selected_all_reference_folders = Não se pode iniciar a busca quando todo diretório está definido como pasta de referência
searching_for_data = Buscando dados, pode demorar um pouco, aguarde...
text_view_messages = MENSAGENS
text_view_warnings = AVISOS
searching_for_data = Procurando dados, pode demorar um pouco, por favor, aguarde...
text_view_messages = MENSAGEM
text_view_warnings = ATENÇÕES
text_view_errors = ERROS
about_window_motto = Este programa é gratuito para o uso e sempre será.
# Various dialog
dialogs_ask_next_time = Perguntar na próxima vez
dialogs_ask_next_time = Perguntar da próxima vez
delete_file_failed = Falha ao excluir o arquivo { $name }, razão { $reason }
delete_title_dialog = Confirmação de exclusão
delete_question_label = Tem certeza de que quer excluir arquivos?
delete_all_files_in_group_title = Confirmação da exclusão de todo arquivo no grupo
delete_all_files_in_group_label1 = Em alguns grupos todo registro está selecionado.
delete_all_files_in_group_label2 = Tem certeza de que quer os excluir?
delete_folder_failed = Falha ao excluir a pasta { $dir }, pois a pasta não existe, você não tem permissão ou a pasta não está vazia.
delete_question_label = Tem certeza de que deseja excluir arquivos?
delete_all_files_in_group_title = Confirmação de excluir todos os arquivos no grupo
delete_all_files_in_group_label1 = Em alguns grupos todos os registros estão selecionados.
delete_all_files_in_group_label2 = Tem certeza que deseja apagá-los?
delete_folder_failed = Falha ao excluir a pasta { $dir } porque a pasta não existe, você não tem permissão ou a pasta não está vazia.
delete_items_label = { $items } arquivos serão excluídos.
delete_items_groups_label = { $items } arquivos de { $groups } grupos serão excluídos.
hardlink_failed = Falha na ligação
hardlink_failed = Falha no hardlink
hard_sym_invalid_selection_title_dialog = Seleção inválida com alguns grupos
hard_sym_invalid_selection_label_1 = Em alguns grupos há um registro selecionado e ele será ignorado.
hard_sym_invalid_selection_label_2 = Para poder ligar estes arquivos, ao menos dois resultados no grupo têm de ser selecionados.
hard_sym_invalid_selection_label_3 = O primeiro no grupo é reconhecido como original e não é mudado, mas o segundo e posterior são modificados.
hard_sym_invalid_selection_label_1 = Em alguns grupos há apenas um registro selecionado e será ignorado.
hard_sym_invalid_selection_label_2 = Para ser capaz de vincular estes arquivos, pelo menos dois resultados no grupo precisam ser selecionados.
hard_sym_invalid_selection_label_3 = O primeiro no grupo é reconhecido como original e não é alterado, mas o segundo e mais tarde são modificados.
hard_sym_link_title_dialog = Link de confirmação
hard_sym_link_label = Tem certeza de que quer vincular estes arquivos?
hard_sym_link_label = Tem certeza que deseja vincular esses arquivos?
move_folder_failed = Falha ao mover a pasta { $name }, razão { $reason }
move_file_failed = Falha ao mover o arquivo { $name }, razão { $reason }
move_files_title_dialog = Escolha a pasta para a qual você quer mover arquivos duplicados
move_files_choose_more_than_1_path = Só um caminho pode ser selecionado para poder copiar seus arquivos duplicados, selecionado { $path_number }.
move_files_title_dialog = Escolha a pasta para a qual você deseja mover arquivos duplicados
move_files_choose_more_than_1_path = Apenas um caminho pode ser selecionado para poder copiar os arquivos duplicados selecionados: { $path_number }.
move_stats = Devidamente movidos { $num_files }/{ $all_files } itens
save_results_to_file = Resultados salvos tanto para arquivos txt quanto json na pasta { $name }.
search_not_choosing_any_music = ERRO: Você deve selecionar ao menos uma caixa de seleção com tipos de busca de música.
search_not_choosing_any_broken_files = ERRO: Você deve selecionar ao menos uma caixa de seleção com tipo de arquivos quebrados.
save_results_to_file = Resultados salvos no arquivo { $name }
search_not_choosing_any_music = ERRO: Você deve selecionar pelo menos uma caixa de seleção com tipos de busca de música.
include_folders_dialog_title = Pastas para incluir
exclude_folders_dialog_title = Pastas para excluir
include_manually_directories_dialog_title = Adicionar diretório manualmente
cache_properly_cleared = Cache devidamente limpo
cache_clear_duplicates_title = Limpando o cache de duplicatas
cache_clear_similar_images_title = Limpando o cache de imagens similares
cache_clear_similar_videos_title = Limpando o cache de vídeos similares
cache_clear_message_label_1 = Quer limpar o cache de entradas desatualizadas?
cache_clear_message_label_2 = Esta operação removerá toda entrada de cache que aponta para arquivos inválidos.
cache_clear_duplicates_title = Limpando cache duplicados
cache_clear_similar_images_title = Limpando cache de imagens similares
cache_clear_similar_videos_title = Limpando cache de vídeos similares
cache_clear_message_label_1 = Deseja limpar o cache de entradas desatualizadas?
cache_clear_message_label_2 = Esta operação removerá todas as entradas de cache que apontam para arquivos inválidos.
cache_clear_message_label_3 = Isto pode acelerar um pouco o carregamento/salvamento para o cache.
cache_clear_message_label_4 = AVISO: A operação removerá todo dado em cache de unidades externas desconectadas. Logo, cada hash terá de ser regenerado.
cache_clear_message_label_4 = AVISO: Operação irá remover todos os dados em cache de unidades externas desconectadas. Então cada hash precisará ser regenerado.
# Show preview
preview_image_resize_failure = Falha ao redimensionar a imagem { $name }.
preview_image_opening_failure = Falha ao abrir a imagem { $name }, razão { $reason }

@ -1,500 +0,0 @@
# Window titles
window_settings_title = Setări
window_main_title = Czkawka (Hiccup)
window_progress_title = Scanare
window_compare_images = Compară imaginile
# General
general_ok_button = Ok
general_close_button = Inchide
# Main window
music_title_checkbox = Titlu
music_artist_checkbox = Artist
music_year_checkbox = An
music_bitrate_checkbox = Bitrate
music_genre_checkbox = Gen
music_length_checkbox = Lungime
music_comparison_checkbox = Comparație aproximativă
music_checking_by_tags = Etichete
music_checking_by_content = Conținut
same_music_seconds_label = Fragment minim a doua durată
same_music_similarity_label = Diferența maximă
same_music_tooltip =
Căutarea fişierelor muzicale similare după conţinutul său poate fi configurată prin setarea:
- Timpul minim de fragment după care fişierele muzicale pot fi identificate ca fiind similare
- Diferenţa maximă între două fragmente testate
Cheia pentru rezultate bune este de a găsi combinaţii rezonabile ale acestor parametri, pentru furnizare.
Setarea timpului minim la 5 s și diferența maximă la 1.0, va căuta fragmente aproape identice în fișiere.
O perioadă de 20 de ani și o diferență maximă de 6,0, pe de altă parte, funcționează bine pentru a găsi remixuri/versiuni live etc.
În mod implicit, fiecare fișier muzical este comparat unul cu altul și acest lucru poate dura mult timp când testezi mai multe fișiere, astfel încât este de obicei mai bine să se utilizeze dosare de referință și să se precizeze care fișiere trebuie comparate între ele (cu același volum de fișiere; compararea amprentelor digitale va fi mai rapidă de cel puțin 4x decât fără dosare de referință).
music_comparison_checkbox_tooltip =
Caută fișiere muzicale similare folosind AI, care folosește învățarea mașinăriei pentru a elimina paranteze dintr-o frază. De exemplu, cu această opțiune activată, fișierele în cauză vor fi considerate duplicate:
Remix Lato 2021)
duplicate_case_sensitive_name = Sensibil la caz
duplicate_case_sensitive_name_tooltip =
Când este activată, grupul înregistrează doar atunci când are exact același nume, de ex. Trunchiul <-> Z<unk> ołd
Dezactivarea acestei opțiuni va grupa numele fără a verifica dacă fiecare literă are aceeași mărime, de ex. z<unk> oŁD <-> Z<unk> ołd
duplicate_mode_size_name_combo_box = Dimensiune și nume
duplicate_mode_name_combo_box = Nume
duplicate_mode_size_combo_box = Dimensiune
duplicate_mode_hash_combo_box = Hash
duplicate_hash_type_tooltip =
Czkawka oferă 3 tipuri de hash-uri:
Blake3 - funcţie criptografică hash. Acesta este implicit pentru că este foarte rapid.
CRC32 - funcţia simplă de hash. Acest lucru ar trebui să fie mai rapid decât Blake3, dar foarte rar poate avea unele coliziuni.
XXH3 - foarte asemănător din punct de vedere al performanței și al calității hash-ului cu Blake3 (dar non-criptografic). Astfel de moduri pot fi ușor interschimbate.
duplicate_check_method_tooltip =
Deocamdată, Czkawka oferă trei tipuri de metode pentru a găsi duplicate după:
Nume - Găseşte fişiere care au acelaşi nume.
Dimensiune - Găseşte fişiere cu aceeaşi dimensiune.
Hash - Găseşte fişiere care au acelaşi conţinut. Acest mod hashează fişierul şi mai târziu compară acest hash pentru a găsi duplicate. Acest mod este cel mai sigur mod de a găsi duplicate. Aplicaţiile folosesc foarte mult cache, astfel încât scanările de la secundă şi mai departe ale aceloraşi date ar trebui să fie mult mai rapide decât primul.
image_hash_size_tooltip =
Fiecare imagine verificată produce un hash special, care poate fi comparat între ele, si o diferenta mica intre ele inseamna ca aceste imagini sunt similare.
dimensiunea de 8 hash este destul de bună pentru a găsi imagini care sunt doar puţin similare cu originalul. Cu un set mai mare de imagini (>1000), acesta va produce o cantitate mare de fals pozitiv, Aşa că vă recomand să utilizaţi o mărime mai mare de hash în acest caz.
16 este dimensiunea implicită a hash-ului care este un compromis destul de bun între a găsi chiar și imagini similare și a avea doar o mică coliziune a hash-ului.
32 și 64 de hash-uri găsesc doar imagini foarte similare, dar nu ar trebui să aibă aproape nicio poziție falsă (poate cu excepția unor imagini cu un canal alfa).
image_resize_filter_tooltip =
Pentru a calcula hash of imagine, biblioteca trebuie mai întâi să o redimensioneze.
În funcție de algoritmul ales, imaginea rezultată folosită pentru a calcula hash va arăta puțin diferit.
Cel mai rapid algoritm de utilizat, dar şi cel care dă cele mai slabe rezultate, este Nearest. Acesta este activat în mod implicit, deoarece cu dimensiunea de 16x16 a hash-ului este de calitate mai mică decât cea vizibilă.
Cu dimensiunea hash de 8x8 este recomandat să se folosească un algoritm diferit de Nearest, pentru a avea grupuri mai bune de imagini.
image_hash_alg_tooltip =
Utilizatorii pot alege unul dintre multele algoritmi de calculare a hash-ului.
Fiecare are atât puncte puternice, cât şi puncte mai slabe şi va da uneori rezultate mai bune şi uneori mai proaste pentru imagini diferite.
Deci, pentru a determina cel mai bun dintre voi, este necesară testarea manuală.
big_files_mode_combobox_tooltip = Permite căutarea celor mai mici/mai mari fişiere
big_files_mode_label = Fișiere verificate
big_files_mode_smallest_combo_box = Cel mai mic
big_files_mode_biggest_combo_box = Miggest
main_notebook_duplicates = Fișiere duplicate
main_notebook_empty_directories = Dosare goale
main_notebook_big_files = Fișiere mari
main_notebook_empty_files = Fișiere goale
main_notebook_temporary = Fișiere temporare
main_notebook_similar_images = Imagini similare
main_notebook_similar_videos = Video similare
main_notebook_same_music = Duplicate Muzică
main_notebook_symlinks = Simboluri invalide
main_notebook_broken_files = Fișiere defecte
main_notebook_bad_extensions = Extensii rele
main_tree_view_column_file_name = Numele fișierului
main_tree_view_column_folder_name = Nume folder
main_tree_view_column_path = Cale
main_tree_view_column_modification = Data modificării
main_tree_view_column_size = Dimensiune
main_tree_view_column_similarity = Similaritate
main_tree_view_column_dimensions = Dimensiuni
main_tree_view_column_title = Titlu
main_tree_view_column_artist = Artist
main_tree_view_column_year = An
main_tree_view_column_bitrate = Bitrate
main_tree_view_column_length = Lungime
main_tree_view_column_genre = Gen
main_tree_view_column_symlink_file_name = Numele fișierului Symlink
main_tree_view_column_symlink_folder = Dosar Symlink
main_tree_view_column_destination_path = Calea destinației
main_tree_view_column_type_of_error = Tip de eroare
main_tree_view_column_current_extension = Extensia curentă
main_tree_view_column_proper_extensions = Extensie corectă
main_label_check_method = Metoda de verificare
main_label_hash_type = Tip hash
main_label_hash_size = Dimensiune hash
main_label_size_bytes = Dimensiune (octeți)
main_label_min_size = Minim
main_label_max_size = Maxim
main_label_shown_files = Numărul de fișiere afișate
main_label_resize_algorithm = Redimensionare algoritm
main_label_similarity = Similarity{ " " }
main_check_box_broken_files_audio = Audio
main_check_box_broken_files_pdf = Pdf
main_check_box_broken_files_archive = Arhivează
main_check_box_broken_files_image = Imagine
check_button_general_same_size = Ignoră aceeași dimensiune
check_button_general_same_size_tooltip = Ignoră fișierele cu rezultate de dimensiune identică - de obicei, acestea sunt de 1:1 duplicate
main_label_size_bytes_tooltip = Dimensiunea fişierelor care vor fi utilizate în scanare
# Upper window
upper_tree_view_included_folder_column_title = Dosare de căutat
upper_tree_view_included_reference_column_title = Dosare de referință
upper_recursive_button = Recursiv
upper_recursive_button_tooltip = Dacă este selectat, caută și fișiere care nu sunt plasate direct în dosarele alese.
upper_manual_add_included_button = Adăugare manuală
upper_add_included_button = Adăugare
upper_remove_included_button = Elimină
upper_manual_add_excluded_button = Adăugare manuală
upper_add_excluded_button = Adăugare
upper_remove_excluded_button = Elimină
upper_manual_add_included_button_tooltip =
Adăugați numele directorului pentru a căuta manual.
Pentru a adăuga căi multiple simultan, separați-le de ;
/home/roman;/home/rozkaz va adăuga două directoare /home/roman și /home/rozkaz
upper_add_included_button_tooltip = Adăugați un nou director pentru căutare.
upper_remove_included_button_tooltip = Ștergeți directorul de căutare.
upper_manual_add_excluded_button_tooltip =
Adaugă numele folderului exclus manual.
Pentru a adăuga căi multiple simultan, separați-le de ;
/home/roman;/home/krokiet va adăuga două directoare /home/roman și /home/keokiet
upper_add_excluded_button_tooltip = Adauga directorul pentru a fi exclus in cautare.
upper_remove_excluded_button_tooltip = Ştergeţi directorul din excludere.
upper_notebook_items_configuration = Configurare articole
upper_notebook_excluded_directories = Dosare excluse
upper_notebook_included_directories = Dosare incluse
upper_allowed_extensions_tooltip =
Extensiile permise trebuie separate prin virgulă (implicit toate sunt disponibile).
Următoarele macro care adaugă simultan extensii multiple sunt de asemenea disponibile: IMAGE, VIDEO, MUSIC, TEXT.
Foloseste exemplul ".exe, IMAGE, VIDEO, .rar, 7z" - asta inseamna ca imaginile (e. . fișiere jpg, png), videoclipuri (de ex. avi, mp4), exe, rar și 7z vor fi scanate.
upper_excluded_extensions_tooltip =
Lista fişierelor dezactivate care vor fi ignorate în scanare.
La utilizarea extensiilor permise și dezactivate, aceasta are prioritate mai mare, deci fișierul nu va fi verificat.
upper_excluded_items_tooltip =
Elementele excluse trebuie sa contina * wildcard si sa fie separate prin virgule.
Acest lucru este mai lent decat directoarele excluse, asa ca il folositi cu atentie.
upper_excluded_items = Elemente excluse:
upper_allowed_extensions = Extensii permise:
upper_excluded_extensions = Extensii dezactivate:
# Popovers
popover_select_all = Selectează tot
popover_unselect_all = Deselectează tot
popover_reverse = Selectare inversă
popover_select_all_except_oldest = Selectează toate cu excepția celor mai vechi
popover_select_all_except_newest = Selectează toate cu excepția celor noi
popover_select_one_oldest = Selectează unul mai vechi
popover_select_one_newest = Selectaţi unul dintre cele mai noi
popover_select_custom = Selectare particularizată
popover_unselect_custom = Deselectare particularizată
popover_select_all_images_except_biggest = Selectează toate cu excepția celui mai mare
popover_select_all_images_except_smallest = Selectează toate cu excepția celor mici
popover_custom_path_check_button_entry_tooltip =
Selectaţi înregistrările după cale.
Exemplu de utilizare:
/home/pimpek/rzecz.txt poate fi găsit cu /home/pim*
popover_custom_name_check_button_entry_tooltip =
Selectaţi înregistrările cu numele fişierelor.
Exemplu de utilizare:
/usr/ping/pong.txt poate fi găsit cu *ong*
popover_custom_regex_check_button_entry_tooltip =
Selectaţi înregistrările specificate de Regex.
Cu acest mod, textul căutat este calea cu numele.
Exemplu de utilizare:
/usr/bin/ziemniak. xt poate fi găsit cu /ziem[a-z]+
Acest lucru folosește implementările implicite Rust regex. Puteți citi mai multe despre ele aici: https://docs.rs/regex.
popover_custom_case_sensitive_check_button_tooltip =
Activează detectarea cazurilor sensibile.
Când este dezactivat /home/* găsește atât /HoMe/roman cât și /home/roman.
popover_custom_not_all_check_button_tooltip =
Previne selectarea tuturor înregistrărilor din grup.
Aceasta este activată în mod implicit, deoarece în majoritatea situațiilor, nu doriţi să ştergeţi atât fişierele originale, cât şi duplicate, dar doriţi să lăsaţi cel puţin un fişier.
ATENŢIE: Această setare nu funcţionează dacă aţi selectat deja manual toate rezultatele într-un grup.
popover_custom_regex_path_label = Cale
popover_custom_regex_name_label = Nume
popover_custom_regex_regex_label = Cale Regex + Nume
popover_custom_case_sensitive_check_button = Sensibil la caz
popover_custom_all_in_group_label = Nu selectaţi toate înregistrările în grup
popover_custom_mode_unselect = Deselectare particularizată
popover_custom_mode_select = Selectare particularizată
popover_sort_file_name = Nume fișier
popover_sort_folder_name = Nume dosar
popover_sort_full_name = Numele complet
popover_sort_size = Dimensiune
popover_sort_selection = Selecţie
popover_invalid_regex = Regex nu este valid
popover_valid_regex = Regex este valid
# Bottom buttons
bottom_search_button = Caută
bottom_select_button = Selectare
bottom_delete_button = Ștergere
bottom_save_button = Salvează
bottom_symlink_button = Symlink
bottom_hardlink_button = Hardlink
bottom_move_button = Mutare
bottom_sort_button = Sortează
bottom_search_button_tooltip = Începe căutarea
bottom_select_button_tooltip = Selectaţi înregistrările. Numai fişierele/dosarele selectate pot fi procesate ulterior.
bottom_delete_button_tooltip = Ştergeţi fişierele/dosarele selectate.
bottom_save_button_tooltip = Salvează datele despre căutare în fișier
bottom_symlink_button_tooltip =
Creaţi link-uri simbolice.
Funcţionează numai atunci când cel puţin două rezultate într-un grup sunt selectate.
Prima este neschimbată, iar a doua și mai târziu simpatizează cu primul.
bottom_hardlink_button_tooltip =
Creează link-uri hardware.
Funcţionează numai atunci când cel puţin două rezultate sunt selectate într-un grup.
Prima este neschimbată, iar a doua și mai târziu sunt greu legate mai întâi.
bottom_hardlink_button_not_available_tooltip =
Creează link-uri hardware.
Butonul este dezactivat, deoarece hardlink-urile nu pot fi create.
Legăturile fizice funcționează doar cu privilegii de administrator pe Windows, așa că asigură-te că rulezi aplicația ca administrator.
Dacă aplicația funcționează deja cu astfel de privilegii verificați pentru probleme similare pe Giwhere,
bottom_move_button_tooltip =
Mută fișierele în directorul ales.
Copiază toate fișierele în director fără a păstra directorul arborescent.
Când se încearcă mutarea a două fișiere cu nume identic în folder, al doilea va eșua și va afișa eroarea.
bottom_sort_button_tooltip = Sortează fișierele/dosarele în funcție de metoda selectată.
bottom_show_errors_tooltip = Arată/ascunde panoul de text de jos.
bottom_show_upper_notebook_tooltip = Arată/Ascunde panoul de notebook-uri de sus.
# Progress Window
progress_stop_button = Oprește
progress_stop_additional_message = Oprire solicitată
# About Window
about_repository_button_tooltip = Link către pagina de depozit cu codul sursă.
about_donation_button_tooltip = Link la pagina de donare.
about_instruction_button_tooltip = Link către pagina de instrucțiuni.
about_translation_button_tooltip = Link catre pagina Crowdin cu traducerea aplicatiilor. Oficial, limba poloneza si engleza sunt suportate.
about_repository_button = Depozit
about_donation_button = Donație
about_instruction_button = Instrucțiuni
about_translation_button = Traducere
# Header
header_setting_button_tooltip = Deschide dialogul de setări.
header_about_button_tooltip = Deschide dialogul cu informații despre aplicație.
# Settings
## General
settings_number_of_threads = Numar discutii folosite
settings_number_of_threads_tooltip = Numărul de teme folosite, 0 înseamnă că vor fi folosite toate temele disponibile.
settings_label_restart = Trebuie să reporniți aplicația pentru a aplica setările!
settings_ignore_other_filesystems = Ignorați alte sisteme de fișiere (doar Linux)
settings_ignore_other_filesystems_tooltip =
ignoră fişierele care nu se află în acelaşi sistem de fişiere ca şi directoarele căutate.
Funcţionează la fel ca opţiunea -xdev în găsirea comenzii în Linux
settings_save_at_exit_button_tooltip = Salvați configurația în fișier la închiderea aplicației.
settings_load_at_start_button_tooltip =
Încarcă configurația din fișier la deschiderea aplicației.
Dacă nu este activată, se vor folosi setările implicite.
settings_confirm_deletion_button_tooltip = Afișați caseta de confirmare când faceți clic pe butonul de ștergere.
settings_confirm_link_button_tooltip = Afișați caseta de confirmare când faceți clic pe butonul hard/symlink.
settings_confirm_group_deletion_button_tooltip = Arată dialogul de avertizare când se încearcă ștergerea tuturor înregistrărilor din grup.
settings_show_text_view_button_tooltip = Arată panoul de text în partea de jos a interfeței utilizatorului.
settings_use_cache_button_tooltip = Foloseşte cache-ul fişierelor.
settings_save_also_as_json_button_tooltip = Salvează cache-ul în formatul JSON (citibil uman). Este posibil să îi modifici conținutul. Geocutia din acest fişier va fi citită automat de aplicaţie dacă nu există geocutie în format binar (cu extensie bin)
settings_use_trash_button_tooltip = Mută fișierele la gunoi în loc să le ștergi definitiv.
settings_language_label_tooltip = Limba interfeței utilizatorului.
settings_save_at_exit_button = Salvați configurația la închiderea aplicației
settings_load_at_start_button = Încarcă configurația la deschiderea aplicației
settings_confirm_deletion_button = Arată dialog de confirmare la ștergerea oricăror fișiere
settings_confirm_link_button = Arată dialog de confirmare atunci când fişierele hard/symlink
settings_confirm_group_deletion_button = Arată dialog de confirmare la ștergerea tuturor fișierelor din grup
settings_show_text_view_button = Arată panoul de text jos
settings_use_cache_button = Utilizare geocutie
settings_save_also_as_json_button = De asemenea, salvează cache-ul ca fișier JSON
settings_use_trash_button = Mută fișierele șterse în gunoi
settings_language_label = Limba
settings_multiple_delete_outdated_cache_checkbutton = Şterge automat intrările învechite
settings_multiple_delete_outdated_cache_checkbutton_tooltip =
Ştergeţi rezultatele învechite ale geocutiei care indică fişierele inexistente.
Atunci când este activată, aplicația se asigură la încărcarea înregistrărilor, că toate înregistrările indică către fișiere valide (cele decongelate sunt ignorate).
Dezactivarea acestui lucru va ajuta la scanarea fişierelor pe unităţi externe, astfel încât intrările de cache despre acestea nu vor fi şterse în următoarea scanare.
În cazul în care există sute de mii de înregistrări în cache; se sugerează să activezi acest lucru, care va încărca/salva cache-ul la start/end al scanării.
settings_notebook_general = Generalități
settings_notebook_duplicates = Duplicate
settings_notebook_images = Imagini similare
settings_notebook_videos = Video similar
## Multiple - settings used in multiple tabs
settings_multiple_image_preview_checkbutton_tooltip = Afișează previzualizarea în partea dreaptă (când se selectează un fișier imagine).
settings_multiple_image_preview_checkbutton = Arată previzualizarea imaginii
settings_multiple_clear_cache_button_tooltip =
Curăță manual cache-ul intrărilor învechite.
Acest lucru ar trebui folosit doar dacă curățarea automată a fost dezactivată.
settings_multiple_clear_cache_button = Elimină rezultatele învechite din geocutie.
## Duplicates
settings_duplicates_hide_hard_link_button_tooltip =
Ascunde toate fişierele, cu excepţia unuia, dacă toate arată spre aceleaşi date (sunt conectate).
Exemplu: În cazul în care sunt (pe disc) şapte fişiere care sunt greu legate de date specifice şi un fişier diferit cu aceleaşi date, dar un alt inventar, apoi în duplicat va fi afișat un singur fișier unic și un fișier de la cele hardlink-ului.
settings_duplicates_minimal_size_entry_tooltip =
Setaţi dimensiunea minimă a fişierului care va fi memorată în cache.
Alegerea unei valori mai mici va genera mai multe înregistrări. (Automatic Translation) Aceasta va accelera căutarea, dar va încetini încărcarea/salvarea cache-ului.
settings_duplicates_prehash_checkbutton_tooltip =
Permite stocarea în cache a prehash (un hash calculat dintr-o mică parte a fișierului) care permite concedierea mai timpurie a rezultatelor nereplicate.
este dezactivat implicit deoarece poate cauza încetiniri în unele situații.
Este foarte recomandat sa il utilizezi cand scanezi sute de mii sau milioane de fisiere, pentru ca poate accelera cautarea de mai multe ori.
settings_duplicates_prehash_minimal_entry_tooltip = Dimensiunea minimă a intrării în cache
settings_duplicates_hide_hard_link_button = Ascunde link-urile hard (doar Linux și macOS)
settings_duplicates_prehash_checkbutton = Foloseste cache-ul prehash
settings_duplicates_minimal_size_cache_label = Dimensiunea minimă a fişierelor (în octeţi) salvate în cache
settings_duplicates_minimal_size_cache_prehash_label = Dimensiunea minimă a fişierelor (în octeţi) salvate în cache de prehash
## Saving/Loading settings
settings_saving_button_tooltip = Salvați setările curente în fișier.
settings_loading_button_tooltip = Încarcă setările din fișier și înlocuiește configurația curentă cu ele.
settings_reset_button_tooltip = Resetați configurația curentă la cea implicită.
settings_saving_button = Salvează configurația
settings_loading_button = Încarcă configurația
settings_reset_button = Resetare configurație
## Opening cache/config folders
settings_folder_cache_open_tooltip =
Deschide folderul unde sunt stocate fișierele txt cache-ul.
Modificarea fișierelor de cache poate duce la afișarea unor rezultate invalide. Cu toate acestea, modificarea traiectoriei poate salva timpul atunci când mutați un număr mare de fișiere într-o locație diferită.
Puteţi copia aceste fişiere între computere pentru a salva timp la scanarea din nou pentru fişiere (desigur, dacă au o structură de directoare similară).
În caz de probleme cu geocutia, aceste fişiere pot fi şterse. Aplicaţia le va regenera automat.
settings_folder_settings_open_tooltip =
Deschide folderul unde este stocată configurația Czkawka.
AVERTISMENT: Modificarea manuală a configurației poate rupe fluxul de lucru.
settings_folder_cache_open = Deschide dosarul cache
settings_folder_settings_open = Deschide folderul de setări
# Compute results
compute_stopped_by_user = Căutarea a fost oprită de utilizator
compute_found_duplicates_hash_size = Am găsit { $number_files } duplicate în { $number_groups } grupuri care au luat { $size }
compute_found_duplicates_name = Am găsit { $number_files } duplicate în grupurile { $number_groups }
compute_found_empty_folders = Foldere goale { $number_files }
compute_found_empty_files = Fisiere goale gasite { $number_files }
compute_found_big_files = Fisiere mari gasite { $number_files }
compute_found_temporary_files = Fișiere temporare găsite { $number_files }
compute_found_images = S-au găsit imagini similare { $number_files } în grupurile { $number_groups }
compute_found_videos = S-au găsit videoclipuri similare { $number_files } în grupurile { $number_groups }
compute_found_music = Am găsit { $number_files } fişiere muzicale similare în grupurile { $number_groups }
compute_found_invalid_symlinks = { $number_files } link-uri simbolice invalide găsite
compute_found_broken_files = Fișiere defecte { $number_files } găsite
compute_found_bad_extensions = Fișiere { $number_files } cu extensii invalide
# Progress window
progress_scanning_general_file = Se scanează fişierul { $file_number }
progress_scanning_extension_of_files = Se verifică extensia fișierului { $file_checked }/{ $all_files }
progress_scanning_broken_files = Se verifică fişierul { $file_checked }/{ $all_files }
progress_scanning_video = Hashing of { $file_checked }/{ $all_files } video
progress_scanning_image = Hashing of { $file_checked }/{ $all_files } image
progress_comparing_image_hashes = Comparare hash imagine { $file_checked }/{ $all_files }
progress_scanning_music_tags_end = Compararea etichetelor fișierului de muzică { $file_checked }/{ $all_files }
progress_scanning_music_tags = Citirea etichetelor din fişierul de muzică { $file_checked }/{ $all_files }
progress_scanning_music_content_end = Compararea amprentelor fișierului de muzică { $file_checked }/{ $all_files }
progress_scanning_music_content = Calcularea amprentei fişierului de muzică { $file_checked }/{ $all_files }
progress_scanning_empty_folders = Se scanează directorul { $folder_number }
progress_scanning_size = Dimensiune scanare fișier { $file_number }
progress_scanning_size_name = Se scanează numele și dimensiunea fișierului { $file_number }
progress_scanning_name = Se scanează numele fișierului { $file_number }
progress_analyzed_partial_hash = S-a analizat hash-ul parțial al fișierelor { $file_checked }/{ $all_files }
progress_analyzed_full_hash = A fost analizat hash complet al fişierelor { $file_checked }/{ $all_files }
progress_prehash_cache_loading = Se încarcă cache-ul prehash
progress_prehash_cache_saving = Salvare cache prehash
progress_hash_cache_loading = Încărcare cache hash
progress_hash_cache_saving = Salvare cache hash
progress_cache_loading = Se încarcă geocutia
progress_cache_saving = Salvare geocutie
progress_current_stage = Current Stage:{ " " }
progress_all_stages = All Stages:{ " " }
# Saving loading
saving_loading_saving_success = Configurație salvată în fișierul { $name }.
saving_loading_saving_failure = Salvarea datelor de configurare în fișierul { $name } a eșuat.
saving_loading_reset_configuration = Configurația curentă a fost ștearsă.
saving_loading_loading_success = Configurare aplicație încărcată corespunzător.
saving_loading_invalid_string = Pentru cheia "{ $key }" a găsit un rezultat nevalid - "{ $result }" care nu este un șir.
saving_loading_invalid_int = Pentru cheia "{ $key }" a găsit un rezultat invalid - "{ $result }" care nu este un număr întreg.
saving_loading_invalid_bool = Pentru cheia "{ $key }" a găsit rezultat nevalid - "{ $result }" care nu este un bool.
saving_loading_decode_problem_bool = Nu s-a reușit decodificarea boolului de la tasta "{ $key }" găsit "{ $result }" dar valorile permise sunt 0, 1, adevărat sau false.
saving_loading_saving_same_keys = Se încearcă salvarea setării cu cheie duplicată "{ $key }".
saving_loading_failed_to_get_home_directory = Nu s-a putut obține directorul acasă pentru a deschide/salva fișierul de configurare.
saving_loading_folder_config_instead_file = Nu se poate crea sau deschide fișierul de configurare în calea "{ $path }" deoarece există deja un dosar.
saving_loading_failed_to_create_configuration_folder = Nu s-a reuşit configurarea pentru a crea folderul de configurare "{ $path }", motivul "{ $reason }".
saving_loading_failed_to_create_config_file = Nu s-a putut crea fișierul de configurare "{ $path }", motivul "{ $reason }".
saving_loading_failed_to_read_config_file = Nu se poate încărca configurația din "{ $path }" deoarece nu există sau nu este un fișier.
saving_loading_failed_to_read_data_from_file = Datele din fişierul "{ $path }", motivul "{ $reason }".
saving_loading_orphan_data = Am găsit date orfane "{ $data }" în rândul "{ $line }".
saving_loading_not_valid = Setarea "{ $data }" nu există în versiunea curentă a aplicației.
# Invalid symlinks
invalid_symlink_infinite_recursion = Recepţie infinită
invalid_symlink_non_existent_destination = Fișier destinație inexistent
# Other
selected_all_reference_folders = Nu se poate începe căutarea, atunci când toate directoarele sunt setate ca dosare de referință
searching_for_data = Se caută date, poate dura ceva timp, vă rugăm așteptați...
text_view_messages = MESAJE
text_view_warnings = ATENȚIONĂRI
text_view_errors = EROARE
about_window_motto = Acest program este liber de utilizat și va fi întotdeauna.
# Various dialog
dialogs_ask_next_time = Întreabă data viitoare
delete_file_failed = Nu s-a reușit ștergerea fișierului { $name }, motivul { $reason }
delete_title_dialog = Ștergeți confirmarea
delete_question_label = Sunteţi sigur că doriţi să ştergeţi fişierele?
delete_all_files_in_group_title = Confirmarea ștergerii tuturor fișierelor din grup
delete_all_files_in_group_label1 = In unele grupuri, toate inregistrarile sunt selectate.
delete_all_files_in_group_label2 = Sunteţi sigur că doriţi să le ştergeţi?
delete_folder_failed = Nu s-a reușit ștergerea dosarului { $dir } deoarece directorul nu există, nu aveți permisiunea sau folderul nu este gol.
delete_items_label = { $items } fișiere vor fi șterse.
delete_items_groups_label = { $items } fișiere din grupurile { $groups } vor fi șterse.
hardlink_failed = Eșuare la hardlink
hard_sym_invalid_selection_title_dialog = Selecţie invalidă cu unele grupuri
hard_sym_invalid_selection_label_1 = În unele grupuri există doar o înregistrare selectată și va fi ignorată.
hard_sym_invalid_selection_label_2 = Pentru a putea lega hard/sym aceste fișiere, cel puțin două rezultate în grup trebuie să fie selectate.
hard_sym_invalid_selection_label_3 = Prima în grup este recunoscută ca fiind originală şi nu se modifică, dar se modifică a doua şi mai târziu.
hard_sym_link_title_dialog = Confirmare link
hard_sym_link_label = Sunteţi sigur că doriţi să conectaţi aceste fişiere?
move_folder_failed = Nu s-a reușit mutarea dosarului { $name }, motivul { $reason }
move_file_failed = Nu s-a reușit mutarea fișierului { $name }, motivul { $reason }
move_files_title_dialog = Alegeți directorul în care doriți să mutați fișierele duplicate
move_files_choose_more_than_1_path = Poate fi selectată doar o singură cale pentru a putea copia fişierele duplicate, selectate { $path_number }.
move_stats = Elemente corect mutate { $num_files }/{ $all_files }
save_results_to_file = Rezultate salvate atât pentru fişierele txt cât şi pentru fişierele json în directorul { $name }.
search_not_choosing_any_music = EROARE: Trebuie să selectaţi cel puţin o casetă cu tipuri de căutare de muzică.
search_not_choosing_any_broken_files = EROARE: Trebuie să selectaţi cel puţin o casetă de selectare cu tipul de fişiere bifate.
include_folders_dialog_title = Dosare de inclus
exclude_folders_dialog_title = Dosare de exclus
include_manually_directories_dialog_title = Adaugă director manual
cache_properly_cleared = Geocutie golită corect
cache_clear_duplicates_title = Golire duplicate cache
cache_clear_similar_images_title = Curăță cache imagini similare
cache_clear_similar_videos_title = Curățare cache video similar
cache_clear_message_label_1 = Vrei să ştergi memoria cache a intrărilor învechite?
cache_clear_message_label_2 = Această operaţie va elimina toate intrările din cache-ul care indică fişiere invalide.
cache_clear_message_label_3 = Aceasta poate încărca/salva uşor accelerat în cache.
cache_clear_message_label_4 = AVERTISMENT: Operația va elimina toate datele stocate în cache din unplugged external drive. Deci fiecare hash va trebui să fie regenerat.
# Show preview
preview_image_resize_failure = Redimensionarea imaginii { $name } a eșuat.
preview_image_opening_failure = Nu s-a reușit deschiderea imaginii { $name }, motivul { $reason }
# Compare images (L is short Left, R is short Right - they can't take too much space)
compare_groups_number = Grup { $current_group }/{ $all_groups } ({ $images_in_group } imagini)
compare_move_left_button = l
compare_move_right_button = R

@ -14,22 +14,6 @@ music_bitrate_checkbox = Битрейт
music_genre_checkbox = Жанр
music_length_checkbox = Длительность
music_comparison_checkbox = Приблизительное сравнение
music_checking_by_tags = Теги
music_checking_by_content = Содержание
same_music_seconds_label = Минимальная длительность второго фрагмента
same_music_similarity_label = Максимальная разница
same_music_tooltip =
Поиск похожих музыкальных файлов по его содержимому может быть настроен с помощью настройки:
- Минимальное время фрагмента, после которого музыкальные файлы можно определить как похожие
- Максимальная разница между двумя проверенными фрагментами
Ключ к хорошим результатам - найти разумные комбинации этих параметров, для предоставленных.
Установка минимального времени на 5 секунд, а максимальная разница в 1.0, будет искать практически идентичные фрагменты файлов.
Время 20 секунд и максимальная разница в 6,0, с другой стороны, хорошо подходит для поиска ремиксов/версий и т.д.
По умолчанию, каждый музыкальный файл сравнивается друг с другом, и это может занять много времени при тестировании множества файлов, поэтому обычно лучше использовать справочные папки и указать, какие файлы следует сравнивать друг с другом (одинаковое количество файлов), сравнение отпечатков пальцев будет быстрее по крайней мере на 4х, чем без ссылочных папок).
music_comparison_checkbox_tooltip =
Ищет похожие музыкальные файлы с помощью ИИ, использующего машинное обучение для удаления скобок из фраз. Например, если эта опция включена, следующие файлы будут считаться дубликатами:
@ -39,7 +23,6 @@ duplicate_case_sensitive_name_tooltip =
При включённой опции записи группируются, только если у них полностью совпадают имена с точностью до каждого символа. Например, «ХИТ Дискотека» не совпадёт с «хит дискотека».
При отключённой опции записи группируются вне зависимости от того, заглавные или строчные буквы использовались при написании. Например, «ХИТ Дискотека», «хит дискотека», «хИт ДиСкОтЕКа» будут эквивалентны.
duplicate_mode_size_name_combo_box = Размер и имя
duplicate_mode_name_combo_box = Имя
duplicate_mode_size_combo_box = Размер
duplicate_mode_hash_combo_box = Хэш
@ -60,31 +43,18 @@ duplicate_check_method_tooltip =
Хэш — ищет файлы с одинаковым содержимым. Этот режим хэширует файл, а затем сравнивает хэш для поиска дубликатов. Этот режим является самым надёжным способом поиска. Приложение активно использует кэш, поэтому второе и последующие сканирования одних и тех же данных должны быть намного быстрее, чем первое.
image_hash_size_tooltip =
Каждое проверяемое изображение производит специальный хэш, который можно сравнить друг с другом, и небольшая разница между ними означает, что эти изображения аналогичны.
8 размер хэша достаточно хорош, чтобы найти изображения, которые немного похожи на оригинал. С большим набором изображений (>1000), это приведет к большому количеству ложных срабатываний, поэтому в данном случае я рекомендую использовать больший размер хэша.
16 - это размер хэша по умолчанию, который является хорошим компромиссом между нахождением даже немного похожих изображений и наличием лишь небольшого количества хэш-коллизий.
32 и 64 хэши находят только очень похожие изображения, но не должны иметь ложных срабатываний (может быть, за исключением некоторых изображений с альфа-каналом).
image_resize_filter_tooltip =
Чтобы вычислить хэш изображения, библиотека должна в первую очередь изменить его размеры.
В зависимости от выбранного алгоритма результирующее изображение, используемое для вычисления хэша, выглядит немного другое.
Czkawka позволяет задать размер сгенерированного хэша для каждого изображения. Чем больше размер хэша, тем более точные совпадения изображений будут находиться (с меньшим количеством различий), но это будет занимать немного больше времени.
Самый быстрый алгоритм использования, но также тот алгоритм, который дает худший результат, это Nearest. Он включен по умолчанию, потому что с меньшим качеством в размере 16x16 хэш он не видим.
Размер хэша по умолчанию — 8 байт, что позволяет найти и похожие, и слегка различающиеся изображения. 16 и 32 байт хэша следует использовать для обнаружения почти одинаковых изображений. Хэш размером 64 байт должен использоваться лишь в тех случаях, когда необходимо отфильтровать только изображения с микроскопическими различиями.
image_resize_filter_tooltip = Чтобы вычислить хэш изображения, библиотека должна сначала его перемасштабировать. В зависимости от выбранного алгоритма получившееся изображение может выглядеть немного по-разному. Метод ближайших соседей самый быстрый, но даёт худшие результаты.
image_hash_alg_tooltip = Пользователи могут выбрать один из множества алгоритмов вычисления хэша. Каждый из них имеет как сильные, так и слабые стороны и иногда даёт лучшие или худшие результаты для разных изображений. Для получения наилучших результатов следует протестировать алгоритмы вручную.
main_notebook_image_fast_compare = Быстрое сравнение
main_notebook_image_fast_compare_tooltip =
Ускорение поиска и сравнения хэшей.
Если размер хэша 8x8, рекомендуется использовать другой алгоритм, чем Nearest, чтобы иметь лучшие группы изображений.
image_hash_alg_tooltip =
Пользователи могут выбрать один из многих алгоритмов вычисления хэша.
В отличие от обычного режима, где каждый хэш сравнивается друг с другом X раз (где X — это сходство, заданное пользователем), в этом режиме будет использоваться ровно одно сравнение.
Каждый имеет сильные и слабые точки и иногда даёт более качественные и иногда хуже результаты для разных изображений.
Поэтому для определения наилучшего из вас, требуется ручное тестирование.
big_files_mode_combobox_tooltip = Поиск наименьших/наибольших файлов
big_files_mode_label = Проверенные файлы
big_files_mode_smallest_combo_box = Самый маленький
big_files_mode_biggest_combo_box = Крупнейший
Этот параметр рекомендуется использовать при сравнении >10000 изображений с ненулевым (очень высоким) сходством.
main_notebook_duplicates = Файлы-дубликаты
main_notebook_empty_directories = Пустые папки
main_notebook_big_files = Большие файлы
@ -101,7 +71,7 @@ main_tree_view_column_folder_name = Имя папки
main_tree_view_column_path = Путь
main_tree_view_column_modification = Дата изменения
main_tree_view_column_size = Размер
main_tree_view_column_similarity = Сходство
main_tree_view_column_similarity = Схожесть
main_tree_view_column_dimensions = Размеры
main_tree_view_column_title = Заголовок
main_tree_view_column_artist = Исполнитель
@ -122,43 +92,29 @@ main_label_size_bytes = Размер (байт)
main_label_min_size = Мин
main_label_max_size = Макс
main_label_shown_files = Количество отображаемых файлов
main_label_resize_algorithm = Алгоритм масштабирования
main_label_resize_algorithm = Алгоритм перемасштабирования
main_label_similarity = Сходство{" "}
main_check_box_broken_files_audio = Звук
main_check_box_broken_files_pdf = Pdf
main_check_box_broken_files_archive = Архивировать
main_check_box_broken_files_image = Изображение
check_button_general_same_size = Игнорировать одинаковый размер
check_button_general_same_size_tooltip = Игнорировать файлы с одинаковым размером в результатах - обычно это 1:1 дубликаты
check_button_general_same_size_tooltip = Игнорировать в результатах файлы, имеющие одинаковый размер: обычно это точные дубликаты
main_label_size_bytes_tooltip = Размер файлов, которые будут просканированы
# Upper window
upper_tree_view_included_folder_column_title = Папки для поиска
upper_tree_view_included_reference_column_title = Содержит оригиналы
upper_recursive_button = В подпапках
upper_tree_view_included_reference_column_title = Папки подлинников
upper_recursive_button = Рекурсивный
upper_recursive_button_tooltip = При включённой опции будут также искаться файлы, не находящиеся непосредственно в корне выбранной папки, т. е. в других подпапках данной папки и их подпапках.
upper_manual_add_included_button = Прописать вручную
upper_manual_add_included_button = Добавить вручную
upper_add_included_button = Добавить
upper_remove_included_button = Удалить
upper_manual_add_excluded_button = Ручное добавление
upper_add_excluded_button = Добавить
upper_remove_excluded_button = Удалить
upper_manual_add_included_button_tooltip =
Добавьте имя каталога для поиска вручную.
Чтобы добавить несколько путей одновременно, разделите их на ;
/home/roman;/home/rozkaz добавит два каталога /home/roman и /home/rozkaz
upper_manual_add_included_button_tooltip = Добавить вручную имя каталога для поиска.
upper_add_included_button_tooltip = Добавить новый каталог для поиска.
upper_remove_included_button_tooltip = Исключить каталог из поиска.
upper_manual_add_excluded_button_tooltip =
Добавьте вручную исключенное имя каталога.
Чтобы добавить несколько путей одновременно, разделите их на ;
/home/roman;/home/krokiet добавит два каталога /home/roman и /home/keokiet
upper_manual_add_excluded_button_tooltip = Добавить вручную имя каталога, исключаемого из поиска.
upper_add_excluded_button_tooltip = Добавить каталог, исключаемый из поиска.
upper_remove_excluded_button_tooltip = Убрать каталог из исключенных.
upper_notebook_items_configuration = Параметры поиска
upper_notebook_items_configuration = Конфигурация элементов
upper_notebook_excluded_directories = Исключённые каталоги
upper_notebook_included_directories = Включённые каталоги
upper_allowed_extensions_tooltip =
@ -167,16 +123,11 @@ upper_allowed_extensions_tooltip =
Макросы IMAGE, VIDEO, MUSIC, TEXT добавляют сразу несколько расширений.
Пример использования: «.exe, IMAGE, VIDEO, .rar, 7z» — это означает, что будут сканироваться файлы изображений (напр. jpg, png), видео (напр. avi, mp4), exe, rar и 7z.
upper_excluded_extensions_tooltip =
Список отключенных файлов, которые будут игнорироваться в сканировании.
При использовании разрешенных и отключенных расширений этот файл имеет более высокий приоритет, поэтому файл не будет проверяться.
upper_excluded_items_tooltip =
Исключаемые элементы должны содержать маску «*» и быть разделены запятыми.
Это медленнее, чем «Исключённые каталоги», поэтому используйте осторожно.
upper_excluded_items = Исключённые элементы:
upper_allowed_extensions = Допустимые расширения:
upper_excluded_extensions = Отключенные расширения:
# Popovers
popover_select_all = Выбрать все
popover_unselect_all = Снять выделение
@ -225,11 +176,6 @@ popover_custom_case_sensitive_check_button = С учётом регистра
popover_custom_all_in_group_label = Не выбирать все записи в группе
popover_custom_mode_unselect = Снять выбор
popover_custom_mode_select = Выбрать произвольный
popover_sort_file_name = Имя файла
popover_sort_folder_name = Название папки
popover_sort_full_name = Полное имя
popover_sort_size = Размер
popover_sort_selection = Выбранные объекты
popover_invalid_regex = Некорректное регулярное выражение
popover_valid_regex = Корректное регулярное выражение
# Bottom buttons
@ -240,7 +186,6 @@ bottom_save_button = Сохранить
bottom_symlink_button = Симв. ссылка
bottom_hardlink_button = Жёст. ссылка
bottom_move_button = Переместить
bottom_sort_button = Сортировать
bottom_search_button_tooltip = Начать поиск
bottom_select_button_tooltip = Выберите записи. Только выбранные файлы/папки будут доступны для последующей обработки.
bottom_delete_button_tooltip = Удалить выбранные файлы/папки.
@ -253,21 +198,14 @@ bottom_hardlink_button_tooltip =
Создать жёсткие ссылки.
Работает, только когда выбрано не менее двух результатов в группе.
Первый результат оставляется, а второй и последующие делаются жёсткими ссылками на первый.
bottom_hardlink_button_not_available_tooltip =
Создание жестких ссылок.
Кнопка отключена, так как невозможно создать жёсткие ссылки.
Связи работают только с правами администратора в Windows, поэтому не забудьте запустить приложение от имени администратора.
Если приложение уже работает с такими привилегиями, проверьте аналогичные проблемы на Github.
bottom_move_button_tooltip =
Перемещение файлов в выбранный каталог.
Копирует все файлы в папку без сохранения структуры дерева каталогов.
При попытке переместить два файла с одинаковым именем в одну и ту же папку второй не будет перемещён и появится сообщение об ошибке.
bottom_sort_button_tooltip = Сортировка файлов/папок по выбранному методу.
bottom_show_errors_tooltip = Показать/скрыть нижнюю текстовую панель.
bottom_show_upper_notebook_tooltip = Показать/скрыть верхнюю панель блокнота.
# Progress Window
progress_stop_button = Остановить
progress_stop_additional_message = Стоп запрошен
# About Window
about_repository_button_tooltip = Ссылка на страницу репозитория с исходным кодом.
about_donation_button_tooltip = Ссылка на страницу пожертвований.
@ -286,14 +224,6 @@ header_about_button_tooltip = Открыть окно с информацией
## General
settings_number_of_threads = Количество использованных тем
settings_number_of_threads_tooltip = Количество используемых потоков. Установите 0, чтобы использовать все доступные потоки.
settings_label_restart = Вам нужно перезапустить приложение, чтобы применить настройки!
settings_ignore_other_filesystems = Игнорировать другие файловые системы (только Linux)
settings_ignore_other_filesystems_tooltip =
игнорирует файлы, которые находятся в той же файловой системе, что и поисковые директории.
Работает так же, как и команда 'xdev' в команде 'находить'
settings_save_at_exit_button_tooltip = Сохранить конфигурацию в файл при закрытии приложения.
settings_load_at_start_button_tooltip =
Загрузить конфигурацию из файла при открытии приложения.
@ -334,11 +264,11 @@ settings_notebook_videos = Похожие видео
## Multiple - settings used in multiple tabs
settings_multiple_image_preview_checkbutton_tooltip = Показывать предварительный просмотр справа (при выборе файла изображения).
settings_multiple_image_preview_checkbutton = Показывать предпросмотр изображения
settings_multiple_image_preview_checkbutton = Предпросмотр изображения
settings_multiple_clear_cache_button_tooltip =
Очистка устаревших записей кэша вручную.
Следует использовать только в том случае, если автоматическая очистка отключена.
settings_multiple_clear_cache_button = Удалить устаревшие результаты из кэша.
settings_multiple_clear_cache_button = Удалить устаревшие результаты из кэша изображений
## Duplicates
@ -410,20 +340,11 @@ progress_scanning_image = Хэширование изображения: { $file
progress_comparing_image_hashes = Сравнение хэша изображений: { $file_checked }/{ $all_files }
progress_scanning_music_tags_end = Сравнение тегов { $file_checked }/{ $all_files } музыкального файла
progress_scanning_music_tags = Чтение тэгов музыкальных файлов: { $file_checked }/{ $all_files }
progress_scanning_music_content_end = Сравнение отпечатка пальца из { $file_checked }/{ $all_files } музыкального файла
progress_scanning_music_content = Вычисление отпечатка пальца из { $file_checked }/{ $all_files } музыкального файла
progress_scanning_empty_folders = Сканирование папки { $folder_number }
progress_scanning_size = Сканирование размера файла { $file_number }
progress_scanning_size_name = Сканирование имени и размера файла { $file_number }
progress_scanning_name = Сканирование имени файла { $file_number }
progress_analyzed_partial_hash = Анализ частичного хэша файла { $file_checked }/{ $all_files }
progress_analyzed_full_hash = Анализ полного хэша файла { $file_checked }/{ $all_files }
progress_prehash_cache_loading = Загрузка кэша prehash
progress_prehash_cache_saving = Сохранение кэша prehash
progress_hash_cache_loading = Загрузка хеш-кэша
progress_hash_cache_saving = Сохранение хэша
progress_cache_loading = Загрузка кэша
progress_cache_saving = Сохранение кэша
progress_current_stage = Текущий этап:{ " " }
progress_all_stages = Все этапы:{ " " }
# Saving loading
@ -448,7 +369,6 @@ saving_loading_not_valid = Параметра «{ $data }» не существ
invalid_symlink_infinite_recursion = Бесконечная рекурсия
invalid_symlink_non_existent_destination = Не найден конечный файл
# Other
selected_all_reference_folders = Невозможно начать поиск, когда все каталоги установлены как папки со ссылками
searching_for_data = Поиск данных может занять некоторое время — пожалуйста, подождите...
text_view_messages = СООБЩЕНИЯ
text_view_warnings = ПРЕДУПРЕЖДЕНИЯ
@ -477,9 +397,8 @@ move_file_failed = Не удалось переместить файл { $name }
move_files_title_dialog = Выберите папку, в которую вы хотите переместить дублирующиеся файлы
move_files_choose_more_than_1_path = Можно выбрать только один путь для копирования дубликатов файлов, но выбрано { $path_number }.
move_stats = Удалось переместить без ошибок элементов: { $num_files }/{ $all_files }
save_results_to_file = Результаты сохранены в txt и json файлах в папке { $name }.
save_results_to_file = Результаты сохранены в файл { $name }
search_not_choosing_any_music = ОШИБКА: Необходимо выбрать как минимум один флажок с типами поиска музыки.
search_not_choosing_any_broken_files = ОШИБКА: Вы должны выбрать хотя бы один флажок с типом проверенных ошибочных файлов.
include_folders_dialog_title = Папки для включения
exclude_folders_dialog_title = Папки для исключения
include_manually_directories_dialog_title = Добавить папку вручную

@ -1,500 +0,0 @@
# Window titles
window_settings_title = Inställningar
window_main_title = Czkawka (Hiccup)
window_progress_title = Scannar
window_compare_images = Jämför bilder
# General
general_ok_button = Ok
general_close_button = Stäng
# Main window
music_title_checkbox = Titel
music_artist_checkbox = Artist
music_year_checkbox = År
music_bitrate_checkbox = Bitrate
music_genre_checkbox = Genre
music_length_checkbox = Längd
music_comparison_checkbox = Ungefärlig jämförelse
music_checking_by_tags = Taggar
music_checking_by_content = Innehåll
same_music_seconds_label = Minsta fragment sekund varaktighet
same_music_similarity_label = Maximal skillnad
same_music_tooltip =
Sökning efter liknande musikfiler genom dess innehåll kan konfigureras genom att ställa in:
- Minsta fragmenttid efter vilken musikfiler kan identifieras som liknande
- Maximal skillnad mellan två testade fragment
Nyckeln till bra resultat är att hitta förnuftiga kombinationer av dessa parametrar, för tillhandahållen.
Att ställa in den minsta tiden till 5s och den maximala skillnaden till 1.0, kommer att leta efter nästan identiska fragment i filerna.
En tid på 20-talet och en maximal skillnad på 6,0, å andra sidan, fungerar bra för att hitta remixer/live-versioner etc.
Som standard jämförs varje musikfil med varandra och detta kan ta mycket tid vid testning av många filer, så är det oftast bättre att använda referensmappar och ange vilka filer som ska jämföras med varandra(med samma mängd filer, Att jämföra fingeravtryck kommer att vara snabbare minst 4x än utan referensmappar).
music_comparison_checkbox_tooltip =
Den söker efter liknande musikfiler med AI, som använder maskininlärning för att ta bort parenteser från en fras. Till exempel, med detta alternativ aktiverat, filerna i fråga kommer att betraktas som dubbletter:
Świędziżłób --- Świędziżłób (Remix Lato 2021)
duplicate_case_sensitive_name = Skiftlägeskänslig
duplicate_case_sensitive_name_tooltip =
När detta är aktiverat spelar gruppen bara in när de har exakt samma namn t.ex. Żołd <-> Żołd
Inaktivera sådana alternativ kommer gruppnamn utan att kontrollera om varje bokstav är samma storlek t.ex. żoŁD <-> Żołd
duplicate_mode_size_name_combo_box = Storlek och namn
duplicate_mode_name_combo_box = Namn
duplicate_mode_size_combo_box = Storlek
duplicate_mode_hash_combo_box = Hash
duplicate_hash_type_tooltip =
Czkawka erbjuder 3 typer av hash:
Blake3 - kryptografisk hash-funktion. Detta är standard eftersom det är mycket snabbt.
CRC32 - enkel hash-funktion. Detta bör vara snabbare än Blake3, men kan mycket sällan ha några kollisioner.
XXH3 - mycket lik i prestanda och hashkvalitet till Blake3 (men icke-kryptografisk). Så, sådana lägen kan lätt bytas ut.
duplicate_check_method_tooltip =
För tillfället erbjuder Czkawka tre typer av metoder för att hitta dubbletter av:
Namn - Hittar filer som har samma namn.
Storlek - Hittar filer som har samma storlek.
Hash - Hittar filer som har samma innehåll. Detta läge hashar filen och senare jämför denna hash för att hitta dubbletter. Detta läge är det säkraste sättet att hitta dubbletter. Appen använder starkt cache, så andra och ytterligare skanningar av samma data bör vara mycket snabbare än den första.
image_hash_size_tooltip =
Varje kontrollerad bild ger en speciell hash som kan jämföras med varandra, och en liten skillnad mellan dem innebär att dessa bilder är liknande.
8 hash storlek är ganska bra att hitta bilder som bara är lite liknande till originalet. Med en större uppsättning bilder (>1000), kommer detta att producera en stor mängd falska positiva, så jag rekommenderar att använda en större hash storlek i detta fall.
16 är standard hashstorlek vilket är en ganska bra kompromiss mellan att hitta även lite liknande bilder och att bara ha en liten mängd hashkollisioner.
32 och 64 hashen finner endast mycket liknande bilder, men bör ha nästan inga falska positiva (kanske förutom vissa bilder med alfa-kanal).
image_resize_filter_tooltip =
För att beräkna hash av bilden, måste biblioteket först ändra storlek på den.
Beroende på vald algoritm kommer den resulterande bilden som används för att beräkna hash att se lite annorlunda ut.
Den snabbaste algoritmen att använda, men också den som ger de sämsta resultaten, är nära! Det är aktiverat som standard, eftersom med 16x16 hash storlek lägre kvalitet är det inte riktigt synligt.
Med 8x8 hashstorlek rekommenderas att använda en annan algoritm än Närmaste för att få bättre grupper av bilder.
image_hash_alg_tooltip =
Användare kan välja mellan en av många algoritmer för att beräkna hash.
Var och en har både starka och svagare punkter och ger ibland bättre och ibland sämre resultat för olika bilder.
Så, för att bestämma den bästa för dig krävs manuell testning.
big_files_mode_combobox_tooltip = Gör det möjligt att söka efter minsta/största filer
big_files_mode_label = Markerade filer
big_files_mode_smallest_combo_box = Den minsta
big_files_mode_biggest_combo_box = Den största
main_notebook_duplicates = Duplicera filer
main_notebook_empty_directories = Tomma kataloger
main_notebook_big_files = Stora filer
main_notebook_empty_files = Tomma filer
main_notebook_temporary = Tillfälliga filer
main_notebook_similar_images = Liknande bilder
main_notebook_similar_videos = Liknande videor
main_notebook_same_music = Musik Duplicerar
main_notebook_symlinks = Ogiltiga Symlinks
main_notebook_broken_files = Trasiga filer
main_notebook_bad_extensions = Dåliga tillägg
main_tree_view_column_file_name = Filnamn
main_tree_view_column_folder_name = Mappens namn
main_tree_view_column_path = Sökväg
main_tree_view_column_modification = Senast ändrad
main_tree_view_column_size = Storlek
main_tree_view_column_similarity = Likhet
main_tree_view_column_dimensions = Dimensioner
main_tree_view_column_title = Titel
main_tree_view_column_artist = Artist
main_tree_view_column_year = År
main_tree_view_column_bitrate = Bitrate
main_tree_view_column_length = Längd
main_tree_view_column_genre = Genre
main_tree_view_column_symlink_file_name = Symlink filnamn
main_tree_view_column_symlink_folder = Symlink mapp
main_tree_view_column_destination_path = Målsökvägen
main_tree_view_column_type_of_error = Typ av fel
main_tree_view_column_current_extension = Nuvarande tillägg
main_tree_view_column_proper_extensions = Rätt tillägg
main_label_check_method = Kontrollera metod
main_label_hash_type = Hash typ
main_label_hash_size = Hashstorlek
main_label_size_bytes = Storlek (bytes)
main_label_min_size = Min
main_label_max_size = Max
main_label_shown_files = Antal visade filer
main_label_resize_algorithm = Ändra storlek på algoritm
main_label_similarity = Similarity{ " " }
main_check_box_broken_files_audio = Ljud
main_check_box_broken_files_pdf = Pdf
main_check_box_broken_files_archive = Arkiv
main_check_box_broken_files_image = Bild
check_button_general_same_size = Ignorera samma storlek
check_button_general_same_size_tooltip = Ignorera filer med samma storlek i resultat - vanligtvis är dessa 1:1 dubbletter
main_label_size_bytes_tooltip = Storlek på filer som kommer att användas vid skanning
# Upper window
upper_tree_view_included_folder_column_title = Mappar att söka
upper_tree_view_included_reference_column_title = Referens mappar
upper_recursive_button = Rekursiv
upper_recursive_button_tooltip = Om vald, sök även efter filer som inte placeras direkt under valda mappar.
upper_manual_add_included_button = Manuell Lägg till
upper_add_included_button = Lägg till
upper_remove_included_button = Ta bort
upper_manual_add_excluded_button = Manuell Lägg till
upper_add_excluded_button = Lägg till
upper_remove_excluded_button = Ta bort
upper_manual_add_included_button_tooltip =
Lägg till katalognamn för att söka för hand.
För att lägga till flera sökvägar samtidigt, separera dem med ;
/home/roman;/home/rozkaz lägger till två kataloger /home/roman och /home/rozkaz
upper_add_included_button_tooltip = Lägg till ny katalog att söka.
upper_remove_included_button_tooltip = Ta bort katalog från sökning.
upper_manual_add_excluded_button_tooltip =
Lägg till exkluderat katalognamn för hand.
För att lägga till flera sökvägar samtidigt, separera dem med ;
/home/roman;/home/krokiet kommer att lägga till två kataloger /home/roman och /home/keokiet
upper_add_excluded_button_tooltip = Lägg till katalog som ska exkluderas i sökningen.
upper_remove_excluded_button_tooltip = Ta bort katalog från utesluten.
upper_notebook_items_configuration = Objekt konfiguration
upper_notebook_excluded_directories = Uteslutna kataloger
upper_notebook_included_directories = Inkluderade kataloger
upper_allowed_extensions_tooltip =
Tillåtna tillägg måste separeras med kommatecken (som standard alla är tillgängliga).
Följande makron som lägger till flera tillägg samtidigt, finns också: IMAGE, VIDEO, MUSIC, TEXT.
Användningsexempel ".exe, IMAGE, VIDEO, .rar, 7z" - det betyder att bilder (e. . jpg, png), videor (t.ex. avi, mp4), exe, rar, och 7z filer kommer att skannas.
upper_excluded_extensions_tooltip =
Lista över inaktiverade filer som kommer att ignoreras i skanning.
Vid användning av både tillåtna och inaktiverade tillägg har denna högre prioritet, så filen kommer inte att kontrolleras.
upper_excluded_items_tooltip =
Exkluderade artiklar måste innehålla * jokertecken och bör separeras med kommatecken.
Detta är långsammare än uteslutna kataloger, så använd det noggrant.
upper_excluded_items = Exkluderade objekt:
upper_allowed_extensions = Tillåtna tillägg:
upper_excluded_extensions = Inaktiverade tillägg:
# Popovers
popover_select_all = Radera
popover_unselect_all = Avmarkera alla
popover_reverse = Omvänd markering
popover_select_all_except_oldest = Välj alla utom äldsta
popover_select_all_except_newest = Välj alla utom nyaste
popover_select_one_oldest = Välj en äldsta
popover_select_one_newest = Välj en nyaste
popover_select_custom = Välj anpassad
popover_unselect_custom = Avmarkera anpassade
popover_select_all_images_except_biggest = Välj alla utom största
popover_select_all_images_except_smallest = Välj alla utom minsta
popover_custom_path_check_button_entry_tooltip =
Välj poster efter sökväg.
Exempel användning:
/home/pimpek/rzecz.txt hittas med /home/pim*
popover_custom_name_check_button_entry_tooltip =
Välj poster efter filnamn.
Exempel användning:
/usr/ping/pong.txt finns med *ong*
popover_custom_regex_check_button_entry_tooltip =
Välj poster efter specificerad Regex.
Med detta läge är sökord sökväg med namn.
Exempel användning:
/usr/bin/ziemniak. xt kan hittas med /ziem[a-z]+
Detta använder Rust regex-implementationen. Du kan läsa mer om det här: https://docs.rs/regex.
popover_custom_case_sensitive_check_button_tooltip =
Aktiverar skiftlägeskänslig detektion.
När du inaktiverat /home/* hittar du både /HoMe/roman och /home/roman.
popover_custom_not_all_check_button_tooltip =
Förhindrar att alla poster väljs i grupp.
Detta är aktiverat som standard, eftersom i de flesta situationer, du inte vill ta bort både original och dubbletter filer, men vill lämna minst en fil.
VARNING: Den här inställningen fungerar inte om du redan manuellt har valt alla resultat i en grupp.
popover_custom_regex_path_label = Sökväg
popover_custom_regex_name_label = Namn
popover_custom_regex_regex_label = Regex sökväg + namn
popover_custom_case_sensitive_check_button = Skiftlägeskänslighet
popover_custom_all_in_group_label = Välj inte alla poster i gruppen
popover_custom_mode_unselect = Avmarkera anpassad
popover_custom_mode_select = Välj anpassad
popover_sort_file_name = Filnamn
popover_sort_folder_name = Mapp namn
popover_sort_full_name = Fullständigt namn
popover_sort_size = Storlek
popover_sort_selection = Markerat
popover_invalid_regex = Regex är ogiltigt
popover_valid_regex = Regex är giltigt
# Bottom buttons
bottom_search_button = Sökning
bottom_select_button = Välj
bottom_delete_button = Radera
bottom_save_button = Save
bottom_symlink_button = Symlink
bottom_hardlink_button = Hardlink
bottom_move_button = Flytta
bottom_sort_button = Sortera
bottom_search_button_tooltip = Starta sökning
bottom_select_button_tooltip = Välj poster. Endast valda filer/mappar kan senare bearbetas.
bottom_delete_button_tooltip = Ta bort markerade filer/mappar.
bottom_save_button_tooltip = Spara data om sökning till fil
bottom_symlink_button_tooltip =
Skapa symboliska länkar.
Fungerar endast när minst två resultat i en grupp väljs.
Först är oförändrad och andra och senare är symanknutna till först.
bottom_hardlink_button_tooltip =
Skapa hardlinks.
Fungerar endast när minst två resultat i en grupp är valda.
Först är oförändrad och andra och senare är hårt länkade till först.
bottom_hardlink_button_not_available_tooltip =
Skapa hardlinks.
Knappen är inaktiverad, eftersom hardlinks inte kan skapas.
Hårdlänkar fungerar bara med administratörsrättigheter i Windows, så se till att köra appen som administratör.
Om appen redan fungerar med sådana rättigheter kontrollera liknande problem på Github.
bottom_move_button_tooltip =
Flyttar filer till vald katalog.
Det kopierar alla filer till katalogen utan att bevara katalogträdet.
När du försöker flytta två filer med identiskt namn till mappen kommer det andra att misslyckas och visa fel.
bottom_sort_button_tooltip = Sortera filer/mappar enligt vald metod.
bottom_show_errors_tooltip = Visa/Dölj undertextpanelen.
bottom_show_upper_notebook_tooltip = Visa/Dölj övre anteckningsbokspanelen.
# Progress Window
progress_stop_button = Stoppa
progress_stop_additional_message = Stoppa begärd
# About Window
about_repository_button_tooltip = Länk till utvecklingskatalogen med källkod.
about_donation_button_tooltip = Länk till donationssidan.
about_instruction_button_tooltip = Länk till instruktionssidan.
about_translation_button_tooltip = Länk till Crowdin sida med appöversättningar. Officiellt stöds polska och engelska.
about_repository_button = Filförråd
about_donation_button = Donationer
about_instruction_button = Instruktion
about_translation_button = Översättning
# Header
header_setting_button_tooltip = Öppnar dialogrutan för inställningar.
header_about_button_tooltip = Öppnar dialog med info om app.
# Settings
## General
settings_number_of_threads = Antal använda trådar
settings_number_of_threads_tooltip = Antal gängor, 0 betyder att alla gängor kommer att användas.
settings_label_restart = Du måste starta om appen för att tillämpa inställningar!
settings_ignore_other_filesystems = Ignorera andra filsystem (endast Linux)
settings_ignore_other_filesystems_tooltip =
ignorerar filer som inte finns i samma filsystem som sökta kataloger.
Fungerar samma som -xdev alternativ för att hitta kommandot på Linux
settings_save_at_exit_button_tooltip = Spara konfigurationen till fil när appen stängs.
settings_load_at_start_button_tooltip =
Ladda konfigurationen från filen när appen öppnas.
Om den inte är aktiverad kommer standardinställningarna att användas.
settings_confirm_deletion_button_tooltip = Visa bekräftelsedialog när du klickar på knappen ta bort.
settings_confirm_link_button_tooltip = Visa bekräftelsedialog när du klickar på den hårda/symboliska länkknappen.
settings_confirm_group_deletion_button_tooltip = Visa varningsdialog när du försöker ta bort alla poster från gruppen.
settings_show_text_view_button_tooltip = Visa textpanelen längst ner i användargränssnittet.
settings_use_cache_button_tooltip = Använd filcache.
settings_save_also_as_json_button_tooltip = Spara cache till (läsbar) JSON-format. Det är möjligt att ändra dess innehåll. Cache från denna fil kommer att läsas automatiskt av appen om binärt format cache (med bin extension) saknas.
settings_use_trash_button_tooltip = Flyttar filer till papperskorgen istället ta bort dem permanent.
settings_language_label_tooltip = Språk för användargränssnitt.
settings_save_at_exit_button = Spara konfiguration när appen stängs
settings_load_at_start_button = Ladda konfiguration när appen öppnas
settings_confirm_deletion_button = Visa bekräftelsedialog vid borttagning av filer
settings_confirm_link_button = Visa bekräftelsedialog när hårda/symboliska länkar filer
settings_confirm_group_deletion_button = Visa bekräftelsedialog när alla filer tas bort i grupp
settings_show_text_view_button = Visa längst ned textpanel
settings_use_cache_button = Använd cache
settings_save_also_as_json_button = Spara även cache som JSON-fil
settings_use_trash_button = Flytta raderade filer till papperskorgen
settings_language_label = Language
settings_multiple_delete_outdated_cache_checkbutton = Ta bort föråldrade cache-poster automatiskt
settings_multiple_delete_outdated_cache_checkbutton_tooltip =
Ta bort föråldrade cacheresultat som pekar på obefintliga filer.
När den är aktiverad, se till att appen när du laddar poster, att alla poster pekar på giltiga filer (trasiga dem ignoreras).
Att inaktivera detta kommer att hjälpa när du skannar filer på externa enheter, så cacheposter om dem kommer inte att rensas i nästa skanning.
När det gäller att ha hundratusentals poster i cache, det föreslås för att aktivera detta, vilket kommer att påskynda cache-inläsning/spara vid start/slut av sökningen.
settings_notebook_general = Info
settings_notebook_duplicates = Dubbletter
settings_notebook_images = Liknande bilder
settings_notebook_videos = Liknande video
## Multiple - settings used in multiple tabs
settings_multiple_image_preview_checkbutton_tooltip = Visar förhandsgranskning på höger sida (vid val av bildfil).
settings_multiple_image_preview_checkbutton = Visa förhandsgranskning av bild
settings_multiple_clear_cache_button_tooltip =
Rensa cache manuellt för föråldrade poster.
Detta bör endast användas om automatisk rensning har inaktiverats.
settings_multiple_clear_cache_button = Ta bort föråldrade resultat från cachen.
## Duplicates
settings_duplicates_hide_hard_link_button_tooltip =
Döljer alla filer utom en, om alla pekar på samma data (är hardlinked).
Exempel: I det fall där det finns (på disk) sju filer som är hårdkopplade till specifika data och en annan fil med samma data men ett annat inode, i dubblettsökare, kommer endast en unik fil och en fil från hårdlänkade att visas.
settings_duplicates_minimal_size_entry_tooltip =
Ange minimal filstorlek som kommer att cachelagras.
Att välja ett mindre värde kommer att generera fler poster. Detta kommer att snabba upp sökningen, men bromsa cache-laddning/spara.
settings_duplicates_prehash_checkbutton_tooltip =
Aktiverar cachelagring av prehash (en hash beräknad från en liten del av filen) vilket tillåter tidigare avfärdande av icke-duplicerade resultat.
Det är inaktiverat som standard eftersom det kan orsaka nedgångar i vissa situationer.
Det rekommenderas starkt att använda det när du skannar hundratusentals eller miljoner filer, eftersom det kan påskynda sökningen flera gånger.
settings_duplicates_prehash_minimal_entry_tooltip = Minimal storlek på cachad post.
settings_duplicates_hide_hard_link_button = Dölj hårda länkar (endast Linux och macOS)
settings_duplicates_prehash_checkbutton = Använd prehash cache
settings_duplicates_minimal_size_cache_label = Minimal storlek på filer (i bytes) sparade i cache
settings_duplicates_minimal_size_cache_prehash_label = Minimal storlek på filer (i bytes) sparade för att kunna använda cache
## Saving/Loading settings
settings_saving_button_tooltip = Spara konfigurationen för nuvarande inställningar till filen.
settings_loading_button_tooltip = Ladda inställningar från fil och ersätta den aktuella konfigurationen med dem.
settings_reset_button_tooltip = Återställ den aktuella konfigurationen till standardkonfigurationen.
settings_saving_button = Spara konfiguration
settings_loading_button = Ladda konfiguration
settings_reset_button = Återställ konfiguration
## Opening cache/config folders
settings_folder_cache_open_tooltip =
Öppnar mappen där cache-txt-filer lagras.
Ändring av cache-filer kan leda till att ogiltiga resultat visas. Dock kan ändra sökvägen spara tid när du flyttar en stor mängd filer till en annan plats.
Du kan kopiera dessa filer mellan datorer för att spara tid på skanning igen för filer (naturligtvis om de har liknande katalogstruktur).
Vid problem med cachen kan dessa filer tas bort. Appen kommer automatiskt att regenerera dem.
settings_folder_settings_open_tooltip =
Öppnar mappen där Czkawka-konfigurationen lagras.
VARNING: Manuellt modifierande av konfigurationen kan bryta ditt arbetsflöde.
settings_folder_cache_open = Öppna cachemapp
settings_folder_settings_open = Öppna inställningsmapp
# Compute results
compute_stopped_by_user = Sökandet stoppades av användaren
compute_found_duplicates_hash_size = Hittade { $number_files } dubbletter i { $number_groups } grupper som tog { $size }
compute_found_duplicates_name = Hittade { $number_files } dubbletter i { $number_groups } grupper
compute_found_empty_folders = Hittade { $number_files } tomma mappar
compute_found_empty_files = Hittades { $number_files } tomma filer
compute_found_big_files = Hittade { $number_files } stora filer
compute_found_temporary_files = Hittade { $number_files } tillfälliga filer
compute_found_images = Hittade { $number_files } liknande bilder i { $number_groups } grupper
compute_found_videos = Hittade { $number_files } liknande videoklipp i { $number_groups } grupper
compute_found_music = Hittade { $number_files } liknande musik filer i { $number_groups } grupper
compute_found_invalid_symlinks = Hittade { $number_files } ogiltiga symboliska länkar
compute_found_broken_files = Hittades { $number_files } trasiga filer
compute_found_bad_extensions = Hittades { $number_files } filer med ogiltiga tillägg
# Progress window
progress_scanning_general_file = Scanning { $file_number } fil
progress_scanning_extension_of_files = Kontrollerar tillägg till { $file_checked }/{ $all_files } fil
progress_scanning_broken_files = Kontrollerar { $file_checked }/{ $all_files } fil
progress_scanning_video = Hashning av { $file_checked }/{ $all_files } video
progress_scanning_image = Hashning av { $file_checked }/{ $all_files } bild
progress_comparing_image_hashes = Jämföra { $file_checked }/{ $all_files } bildhash
progress_scanning_music_tags_end = Jämföra taggar för { $file_checked }/{ $all_files } musikfil
progress_scanning_music_tags = Lästaggar för { $file_checked }/{ $all_files } musikfil
progress_scanning_music_content_end = Jämföra fingeravtryck av { $file_checked }/{ $all_files } musikfil
progress_scanning_music_content = Beräknar fingeravtryck av { $file_checked }/{ $all_files } musikfil
progress_scanning_empty_folders = Skannar { $folder_number } mappen
progress_scanning_size = Skannar storleken på { $file_number } fil
progress_scanning_size_name = Skannar namn och storlek på { $file_number } fil
progress_scanning_name = Skannar namn på { $file_number } fil
progress_analyzed_partial_hash = Analyserade partiella hash av { $file_checked }/{ $all_files } filer
progress_analyzed_full_hash = Analyserad full hash av { $file_checked }/{ $all_files } filer
progress_prehash_cache_loading = Laddar prehash cache
progress_prehash_cache_saving = Sparar Omfattande cache
progress_hash_cache_loading = Laddar hash-cache
progress_hash_cache_saving = Sparar hash-cache
progress_cache_loading = Laddar cache
progress_cache_saving = Sparar cache
progress_current_stage = Nuvarande steg:{ " " }
progress_all_stages = Alla etapper:{ " " }
# Saving loading
saving_loading_saving_success = Sparad konfiguration till filen { $name }.
saving_loading_saving_failure = Det gick inte att spara konfigurationsdata till filen { $name }.
saving_loading_reset_configuration = Aktuell konfiguration har rensats.
saving_loading_loading_success = Korrekt laddad app-konfiguration.
saving_loading_invalid_string = För nyckel "{ $key }" hittade ogiltigt resultat - "{ $result }" vilket inte är en sträng.
saving_loading_invalid_int = För nyckeln "{ $key }" hittade ogiltigt resultat - "{ $result }" vilket inte är ett heltal.
saving_loading_invalid_bool = För nyckel "{ $key }" hittade ogiltigt resultat - "{ $result }" vilket inte är en bool.
saving_loading_decode_problem_bool = Det gick inte att avkoda Bollen från nyckel "{ $key }" hittade "{ $result }" men tillåtna värden är 0, 1, sanna eller falska.
saving_loading_saving_same_keys = Försöker spara inställningen med duplicerad nyckel "{ $key }".
saving_loading_failed_to_get_home_directory = Det gick inte att hämta hemkatalogen till att öppna/spara konfigurationsfil.
saving_loading_folder_config_instead_file = Kan inte skapa eller öppna spara konfigurationsfilen i sökvägen "{ $path }" eftersom det redan finns en mapp.
saving_loading_failed_to_create_configuration_folder = Det gick inte att skapa konfigurationsmappen "{ $path }", orsak "{ $reason }".
saving_loading_failed_to_create_config_file = Det gick inte att skapa konfigurationsfil "{ $path }", orsak "{ $reason }".
saving_loading_failed_to_read_config_file = Kan inte ladda konfiguration från "{ $path }" eftersom den inte finns eller inte är en fil.
saving_loading_failed_to_read_data_from_file = Kan inte läsa data från fil "{ $path }", anledning "{ $reason }".
saving_loading_orphan_data = Hittade föräldralösa data "{ $data }" i rad "{ $line }".
saving_loading_not_valid = Inställningen "{ $data }" finns inte i nuvarande appversion.
# Invalid symlinks
invalid_symlink_infinite_recursion = Oändlig recursion
invalid_symlink_non_existent_destination = Icke-existerande målfil
# Other
selected_all_reference_folders = Kan inte börja söka, när alla kataloger är inställda som referensmappar
searching_for_data = Söker data, det kan ta en stund, vänta...
text_view_messages = MEDDELANDEN
text_view_warnings = VARNINGAR
text_view_errors = FEL
about_window_motto = Detta program är gratis att använda och kommer alltid att vara.
# Various dialog
dialogs_ask_next_time = Fråga nästa gång
delete_file_failed = Det gick inte att ta bort filen { $name } varför { $reason }
delete_title_dialog = Ta bort bekräftelse
delete_question_label = Är du säker på att du vill ta bort filer?
delete_all_files_in_group_title = Bekräftelse av att ta bort alla filer i grupp
delete_all_files_in_group_label1 = I vissa grupper är alla poster valda.
delete_all_files_in_group_label2 = Är du säker på att du vill radera dem?
delete_folder_failed = Det gick inte att ta bort mappen { $dir } eftersom mappen inte existerar, du har inte behörighet eller mappen är inte tom.
delete_items_label = { $items } filer kommer att tas bort.
delete_items_groups_label = { $items } filer från { $groups } grupper kommer att raderas.
hardlink_failed = Det gick inte att hardlink
hard_sym_invalid_selection_title_dialog = Ogiltigt val med vissa grupper
hard_sym_invalid_selection_label_1 = I vissa grupper finns det bara en post vald och den kommer att ignoreras.
hard_sym_invalid_selection_label_2 = För att kunna länka dessa filer måste minst två resultat i gruppen väljas.
hard_sym_invalid_selection_label_3 = Först i grupp känns igen som original och ändras inte, men andra och senare ändras.
hard_sym_link_title_dialog = Länkbekräftelse
hard_sym_link_label = Är du säker på att du vill länka dessa filer?
move_folder_failed = Det gick inte att flytta mappen { $name } anledning { $reason }
move_file_failed = Det gick inte att flytta filen { $name } anledning { $reason }
move_files_title_dialog = Välj mapp som du vill flytta duplicerade filer till
move_files_choose_more_than_1_path = Endast en sökväg kan väljas för att kunna kopiera sina duplicerade filer, valda { $path_number }.
move_stats = Korrekt flyttad { $num_files }/{ $all_files } objekt
save_results_to_file = Sparade resultat både till txt och json filer i { $name } mapp.
search_not_choosing_any_music = FEL: Du måste välja minst en kryssruta med söktyper för musik.
search_not_choosing_any_broken_files = FEL: Du måste välja minst en kryssruta med typ av markerade trasiga filer.
include_folders_dialog_title = Mappar att inkludera
exclude_folders_dialog_title = Mappar att exkludera
include_manually_directories_dialog_title = Lägg till katalog manuellt
cache_properly_cleared = Rensad cache
cache_clear_duplicates_title = Rensar dubbletter cache
cache_clear_similar_images_title = Rensar liknande bildcache
cache_clear_similar_videos_title = Rensar liknande videoklipp cache
cache_clear_message_label_1 = Vill du rensa cachen för föråldrade inlägg?
cache_clear_message_label_2 = Denna åtgärd kommer att ta bort alla cache-poster som pekar på ogiltiga filer.
cache_clear_message_label_3 = Detta kan något speedup ladda/spara till cache.
cache_clear_message_label_4 = VARNING: Åtgärden kommer att ta bort alla cachade data från frånkopplade externa enheter. Så varje hash kommer att behöva regenereras.
# Show preview
preview_image_resize_failure = Kunde inte ändra storlek på bild { $name }.
preview_image_opening_failure = Det gick inte att öppna bilden { $name } skäl { $reason }
# Compare images (L is short Left, R is short Right - they can't take too much space)
compare_groups_number = Grupp { $current_group }/{ $all_groups } ({ $images_in_group } bilder)
compare_move_left_button = L
compare_move_right_button = R

@ -1,533 +0,0 @@
# Window titles
window_settings_title = Ayarlar
window_main_title = Czkawka (Hıçkırık)
window_progress_title = Taranıyor...
window_compare_images = Resimleri Karşılaştır
# General
general_ok_button = Tamam
general_close_button = Kapat
# Main window
music_title_checkbox = Başlık
music_artist_checkbox = Sanatçı
music_year_checkbox = Yıl
music_bitrate_checkbox = Bit-hızı
music_genre_checkbox = Müzik Türü
music_length_checkbox = Uzunluk
music_comparison_checkbox = Yaklaşık Karşılaştırma
music_checking_by_tags = Etiketler
music_checking_by_content = İçerik
same_music_seconds_label = Minimal parça saniyesel süresi
same_music_similarity_label = Maksimum fark
same_music_tooltip =
Searching for similar music files by its content can be configured by setting:
- The minimum fragment time after which music files can be identified as similar
- The maximum difference difference between two tested fragments
The key to good results is to find sensible combinations of these parameters, for provided.
Setting the minimum time to 5s and the maximum difference to 1.0, will look for almost identical fragments in the files.
A time of 20s and a maximum difference of 6.0, on the other hand, works well for finding remixes/live versions etc.
By default, each music file is compared to each other and this can take a lot of time when testing many files, so it is usually better to use reference folders and specifying which files are to be compared with each other(with same amount of files, comparing fingerprints will be faster at least 4x than without reference folders).
music_comparison_checkbox_tooltip =
Yapay zeka kullanarak benzer müzik dosyalarını arar.
Örneğin, bir tümcenin parantezlerini kaldırmak için makine öğrenimini kullanır.
Bu seçenek etkinleştirildiğinde, söz konusu dosyalar kopya olarak kabul edilecektir:
Geççek <--> Geççek (Tarkan 2022)
duplicate_case_sensitive_name = Büyük/Küçük harfe Duyarlı
duplicate_case_sensitive_name_tooltip =
Etkinleştirilse, dosya adları tam olarak aynı olduğunda eşleştirilir
ve bir grup oluşturulur.
fatih.kavalci <--> fatih.kavalci
Etkisizleştirilirse, her bir harfin büyük/küçük yazılıp yazılmadığını
denetlemeden aynı adları eşleyip grup oluşturur.
fatih.kavalci <--> FatiH.KaVaLCi
duplicate_mode_size_name_combo_box = Boyut ve Ad Karşılaştırma
duplicate_mode_name_combo_box = Ad Karşılaştırma
duplicate_mode_size_combo_box = Boyut Karşılaştırma
duplicate_mode_hash_combo_box = Özet Değeri
duplicate_hash_type_tooltip =
Czkawka, 3 tür Sabit Uzunlukta Çıktı (SUÇ) üretimi sunar:
Blake3 - kriptografik SUÇ üretim işlevi. Bu varsayılandır çünkü çok hızlıdır.
CRC32 - basit SUÇ üretim işlevi. Bu, Blake3'ten daha hızlı olmalıdır,
ancak kimi zaman çakışmalar olabilir.
XXH3 - performans ve benzersiz SUÇ üretim kalitesi açısından Blake3'e çok benzer
(ancak kriptografik değildir). Böylece, bu tür modlar kolayca değiştirilebilir.
duplicate_check_method_tooltip =
Czkawka, eş dosyaları bulmak için şimdilik üç tür yöntem sunar:
Ad Karşılaştırma - Aynı ada sahip dosyaları bulur.
Boyut Karşılaştırma - Aynı boyuta sahip dosyaları bulur.
Hash (SUÇ) Karşılaştırma - Aynı içeriğe sahip dosyaları bulur. Bu mod her dosya için
veri analizi sonucu sabit uzunlukta benzersiz birer çıktı üretir ve daha sonra eş doşyaları
bulmak için bu çıktıları karşılaştırır. Bu mod, eş dosyaları bulmanın en güvenli yoludur.
Czkawka, önbelleği yoğun olarak kullanır. Bu nedenle aynı verilerin ikinci ve sonraki taramaları
ilkinden çok daha hızlı olmalıdır.
image_hash_size_tooltip =
Each checked image produces a special hash which can be compared with each other, and a small difference between them means that these images are similar.
8 hash size is quite good to find images that are only a little similar to original. With a bigger set of images (>1000), this will produce a big amount of false positives, so I recommend to use a bigger hash size in this case.
16 is the default hash size which is quite a good compromise between finding even a little similar images and having only a small amount of hash collisions.
32 and 64 hashes find only very similar images, but should have almost no false positives (maybe except some images with alpha channel).
image_resize_filter_tooltip =
To compute hash of image, the library must first resize it.
Depend on chosen algorithm, the resulting image used to calculate hash will looks a little different.
The fastest algorithm to use, but also the one which gives the worst results, is Nearest. It is enabled by default, because with 16x16 hash size lower quality it is not really visible.
With 8x8 hash size it is recommended to use a different algorithm than Nearest, to have better groups of images.
image_hash_alg_tooltip =
Kullanıcılar, SUÇ oluşturmanın birçok algoritmasından birini seçebilir.
Her birinin hem güçlü hem de zayıf noktaları vardır ve farklı görüntüler için
bazen daha iyi, bazen daha kötü sonuçlar verir. Bu nedenle, size göre en iyisini belirlemek için
elle test gereklidir.
big_files_mode_combobox_tooltip = Boyut bakımından En Büyük/En Küçük dosyaları aramaya izin verir.
big_files_mode_label = Denetim şekli
big_files_mode_smallest_combo_box = En Küçük
big_files_mode_biggest_combo_box = En Büyük
main_notebook_duplicates = Eş Dosyalar
main_notebook_empty_directories = Boş Dizinler
main_notebook_big_files = Büyük/Küçük Dosyalar
main_notebook_empty_files = Boş Dosyalar
main_notebook_temporary = Geçici Dosyalar
main_notebook_similar_images = Benzer Resimler
main_notebook_similar_videos = Benzer Videolar
main_notebook_same_music = Müzik Kopyaları
main_notebook_symlinks = Geçersiz Sembolik Bağlar
main_notebook_broken_files = Bozuk Dosyalar
main_notebook_bad_extensions = Hatalı Uzantılar
main_tree_view_column_file_name = Dosya Adı
main_tree_view_column_folder_name = Klasör Adı
main_tree_view_column_path = Yol
main_tree_view_column_modification = Düzenleme Tarihi
main_tree_view_column_size = Boyut
main_tree_view_column_similarity = Benzerlik
main_tree_view_column_dimensions = En x Boy
main_tree_view_column_title = Başlık
main_tree_view_column_artist = Sanatçı
main_tree_view_column_year = Yıl
main_tree_view_column_bitrate = Bit-hızı
main_tree_view_column_length = Uzunluk
main_tree_view_column_genre = Tür
main_tree_view_column_symlink_file_name = Sembolik Bağ Dosyası Adı
main_tree_view_column_symlink_folder = Sembolik Bağlantı Klasörü
main_tree_view_column_destination_path = Hedef Yol
main_tree_view_column_type_of_error = Hata türü
main_tree_view_column_current_extension = Geçerli Uzantı
main_tree_view_column_proper_extensions = Uygun Uzantı
main_label_check_method = Denetim yöntemi:
main_label_hash_type = SUÇ türü:
main_label_hash_size = SURÇ boyutu:
main_label_size_bytes = Boyut (bayt):
main_label_min_size = Min
main_label_max_size = Max
main_label_shown_files = Gösterilecek Dosya Sayısı:
main_label_resize_algorithm = Yeniden boyutlandırma algoritması:
main_label_similarity = Benzerlik: { " " }
main_check_box_broken_files_audio = Ses
main_check_box_broken_files_pdf = Pdf
main_check_box_broken_files_archive = Arşiv
main_check_box_broken_files_image = Resim
check_button_general_same_size = Aynı boyutu yok say
check_button_general_same_size_tooltip = Ignore files with identical size in results - usually these are 1:1 duplicates
main_label_size_bytes_tooltip = Taramada kullanılacak dosyaların boyutu
# Upper window
upper_tree_view_included_folder_column_title = Aranacak Klasörler
upper_tree_view_included_reference_column_title = Başvuru Klasörleri
upper_recursive_button = Özyinelemeli
upper_recursive_button_tooltip = Seçilirse, doğrudan "Aranacak Klasörler" listesindeki dizin altında yer almayan (alt dizinlerdeki dosyaları da) arar.
upper_manual_add_included_button = Dizin Gir...
upper_add_included_button = Ekle
upper_remove_included_button = Kaldır
upper_manual_add_excluded_button = Dizin Gir...
upper_add_excluded_button = Ekle
upper_remove_excluded_button = Kaldır
upper_manual_add_included_button_tooltip =
Arama yapılacak dizin yolunu doğrudan yazın.
Aynı anda birden fazla girdi eklemek için bunları ";" ile ayırın.
/home/fatih;/home/kavalci girdisi biri /home/fatih öteki /home/kavalci
olmak üzere iki dizin ekleyecektir.
upper_add_included_button_tooltip = "Aranacak Klasörler" listesine yeni bir dizin ekler.
upper_remove_included_button_tooltip = Seçili dizini "Aranacak Klasörler" listesinden kaldırır.
upper_manual_add_excluded_button_tooltip =
Hariç tutulacak dizin yolunu doğrudan yazın.
Aynı anda birden fazla girdi eklemek için bunları ";" ile ayırın.
/home/fatih;/home/kavalci girdisi biri /home/fatih öteki /home/kavalci
olmak üzere iki dizin ekleyecektir.
upper_add_excluded_button_tooltip = "Hariç Tutulacak Klasörler" listesine yeni bir dizin ekler.
upper_remove_excluded_button_tooltip = Seçili dizini "Hariç Tutulacak Klasörler" listesinden kaldırır.
upper_notebook_items_configuration = Öğe Yapılandırması
upper_notebook_excluded_directories = Hariç Tutulan Dizinler
upper_notebook_included_directories = Aranacak Dizinler
upper_allowed_extensions_tooltip =
İzin verilen uzantılar virgülle ayrılmalıdır (varsayılan olarak her uzantı kullanılır).
Aynı anda birden fazla (aynı tür) uzantı ekleyen makrolar da kullanılabilir: IMAGE, VIDEO, MUSIC, TEXT.
Kullanım örneği: ".exe, IMAGE, VIDEO, .rar, .7z" -- Bu girdi, resimlerin (ör. jpg, png ...),
videoların (ör. avi, mp4 ...), exe, rar ve 7z dosyalarının taranacağı anlamına gelir.
upper_excluded_extensions_tooltip =
List of disabled files which will be ignored in scan.
When using both allowed and disabled extensions, this one has higher priority, so file will not be checked.
upper_excluded_items_tooltip =
Hariç tutulan öğeler * joker karakterini içermeli ve virgülle ayrılmalıdır.
Bu işlev, Hariç Tutulan Dizinlerden daha yavaştır, bu yüzden dikkatli kullanın.
upper_excluded_items = Hariç Tutulan Öğeler:
upper_allowed_extensions = İzin Verilen Uzantılar:
upper_excluded_extensions = Disabled Extensions:
# Popovers
popover_select_all = Tümünü seç
popover_unselect_all = Tümünün seçimini kaldır
popover_reverse = Seçimi Ters Çevir
popover_select_all_except_oldest = En eski olan hariç hepsini seç
popover_select_all_except_newest = En yeni olan hariç hepsini seç
popover_select_one_oldest = En eski olanı seç
popover_select_one_newest = En yeni olanı seç
popover_select_custom = Özel girdi ile seçim yap
popover_unselect_custom = Özel girdi ile seçimi kaldır
popover_select_all_images_except_biggest = En büyük olan hariç hepsini seç
popover_select_all_images_except_smallest = En küçük olan hariç hepsini seç
popover_custom_path_check_button_entry_tooltip =
Kayıtları, kısmi yol girdisine göre seçer.
Örnek kullanım:
/home/fatih/kavalci.txt dosyası, /home/fat* girdisi ile bulunabilir
popover_custom_name_check_button_entry_tooltip =
Kayıtları, kısmi dosya adı girdisine göre seçer.
Örnek kullanım:
/home/fatih/kavalci.txt dosyası, *val* girdisi ile bulunabilir
popover_custom_regex_check_button_entry_tooltip =
Kayıtları, belirtilen Regex girdisine göre seçer.
Bu mod ile aranan metin, tam yol dosya adıdır.
Örnek kullanım:
/home/fatih/kavalcı.txt dosyası, h/ka[a-z]+ ile bulunabilir
Bu işlev, varsayılan Rust regex uygulamasını kullanır.
Daha fazla bilgi için bakınız: https://docs.rs/regex.
popover_custom_case_sensitive_check_button_tooltip =
Büyük/Küçük harfe duyarlı algılamayı etkinleştirir.
Etkisizleştirilir ise;
/home/fatih/* girdisi, hem /home/fatih/ hem de /home/FaTiH dizinlerini algılar.
popover_custom_not_all_check_button_tooltip =
Gruptaki tüm kayıtların seçilmesini engeller.
Bu varsayılan olarak etkindir. Çünkü, çoğu durumda hem asıl dosyayı hem de kopyaları
silmek istemezsiniz. En az bir dosya bırakmak istersiniz.
UYARI: Bir gruptaki tüm sonuçlar zaten elle seçilmiş ise bu ayar çalışmaz.
popover_custom_regex_path_label = Yol
popover_custom_regex_name_label = Ad
popover_custom_regex_regex_label = Regex Yolu + Adı
popover_custom_case_sensitive_check_button = Büyük/Küçük harfe duyarlı
popover_custom_all_in_group_label = Gruptaki tüm kayıtları seçme
popover_custom_mode_unselect = Özel Girdi ile Seçimi Kaldır
popover_custom_mode_select = Özel Girdi ile Seç
popover_sort_file_name = Dosya adı
popover_sort_folder_name = Klasör adı
popover_sort_full_name = Tam ad
popover_sort_size = Boyut
popover_sort_selection = Seçim
popover_invalid_regex = Regex geçersiz (hatalı)
popover_valid_regex = Regex geçerli (doğru)
# Bottom buttons
bottom_search_button = Ara
bottom_select_button = Seç
bottom_delete_button = Sil
bottom_save_button = Kaydet
bottom_symlink_button = Sembolik bağlantı
bottom_hardlink_button = Sabit bağlantı
bottom_move_button = Taşı
bottom_sort_button = Sırala
bottom_search_button_tooltip = Aramayı başlatır.
bottom_select_button_tooltip = Kayıtları seçer. Yalnızca seçilen dosyalara/klasörlere işlem uygulanabilir.
bottom_delete_button_tooltip = Seçili dosyaları/klasörleri siler.
bottom_save_button_tooltip = Aramayla ilgili verileri dosyaya kaydeder.
bottom_symlink_button_tooltip =
Sembolik bağlantılar oluşturur.
Yalnızca bir gruptaki en az iki sonuç seçildiğinde çalışır.
Birincisi değişmez, ikincisi ve sonrası birinciye sembolik olarak bağlanır.
bottom_hardlink_button_tooltip =
Sabit bağlantılar oluşturur.
Yalnızca bir gruptaki en az iki sonuç seçildiğinde çalışır.
Birincisi değişmez, ikincisi ve sonrası birinciye sabit olarak bağlanır.
bottom_hardlink_button_not_available_tooltip =
Hardlinkler oluştur.
Düğme devre dışı, çünkü hardlinkler oluşturulamaz.
Hardlinkler Windows üzerinde yalnızca administrator ayrıcalıklarıyla çalışır, bu yüzden uygulamayı yönetici olarak çalıştırdığınızdan emin olun.
Eğer uygulama zaten yeterli ayrıcalıklarla çalışıyorsa Github üzerindeki benzer sorunları gözden geçirin.
bottom_move_button_tooltip =
Dosyaları seçilen dizine taşır.
Dizin ağacını korumadan tüm dosyaları dizine taşır.
Aynı ada sahip iki dosyayı klasöre taşımaya çalışırken, ikincisi başarısız olur ve hata gösterir.
bottom_sort_button_tooltip = Dosyaları/Dizinleri seçilen metoda göre sırala.
bottom_show_errors_tooltip = Alt çıktı panelini göster/gizle.
bottom_show_upper_notebook_tooltip = Üst denetim panelini göster/gizle.
# Progress Window
progress_stop_button = Durdur
progress_stop_additional_message = İşlem durduruldu.
# About Window
about_repository_button_tooltip = Kaynak kodu depo sayfasına bağlanır.
about_donation_button_tooltip = Bağış sayfasına bağlanır.
about_instruction_button_tooltip = Kullanım yönergeleri sayfasına bağlanır.
about_translation_button_tooltip = Czkawka çevirileriyle Crowdin sayfasına bağlanır. Resmi olarak Lehçe ve İngilizce desteklenmektedir.
about_repository_button = Depo
about_donation_button = Bağış
about_instruction_button = Yönerge
about_translation_button = Çeviri
# Header
header_setting_button_tooltip = Ayarlar iletişim kutusunu açar.
header_about_button_tooltip = Czkawka hakkında bilgi içeren iletişim kutusunu açar.
# Settings
## General
settings_number_of_threads = Kullanılan iş parçacığı sayısı
settings_number_of_threads_tooltip = Kullanılan iş parçacığı sayısı, 0 tüm uygun iş parçacıklarının kullanılacağı anlamına gelir.
settings_label_restart = Ayarları uygulamak için uygulamayı yeniden başlatmanız gerekir!
settings_ignore_other_filesystems = Öteki dosya sistemlerini yoksay (sadece Linux)
settings_ignore_other_filesystems_tooltip =
Aranan dizinlerle aynı dosya sisteminde olmayan dosyaları yoksayar.
Linux'ta find komutundaki -xdev seçeneği ile aynı şekilde çalışır.
settings_save_at_exit_button_tooltip = Uygulamayı kapatırken yapılandırmayı dosyaya kaydeder.
settings_load_at_start_button_tooltip =
Uygulamayı açarken yapılandırmayı dosyadan yükler.
Etkinleştirilmezse, varsayılan ayarlar kullanılır.
settings_confirm_deletion_button_tooltip = Sil düğmesine tıklandığında onay iletişim kutusunu gösterir.
settings_confirm_link_button_tooltip = Sabit/sembolik bağlantı düğmesine tıklandığında onay iletişim kutusunu göster.
settings_confirm_group_deletion_button_tooltip = Gruptan tüm kayıtları silmeye çalışırken uyarı iletişim kutusunu gösterir.
settings_show_text_view_button_tooltip = Kullanıcı arayüzünün altında çıktı panelini gösterir.
settings_use_cache_button_tooltip = Dosya önbelleğini kullanır.
settings_save_also_as_json_button_tooltip =
Önbelleği (kullanıcı tarafından okunabilir) JSON biçiminde kaydeder.
İçeriğini değiştirmek mümkündür. İkili biçim önbelleği (bin uzantılı) eksikse,
bu dosyadaki önbellek uygulama tarafından otomatik olarak okunacaktır.
settings_use_trash_button_tooltip = Dosyaları kalıcı olarak silmek yerine çöp kutusuna taşır.
settings_language_label_tooltip = Kullanıcı arayüzü dilini değiştirir.
settings_save_at_exit_button = Uygulamayı kapatırken yapılandırmayı kaydet
settings_load_at_start_button = Uygulamayı açarken yapılandırmayı yükle
settings_confirm_deletion_button = Herhangi bir dosyayı silerken onay iletişim kutusunu göster
settings_confirm_link_button = Herhangi bir dosyaya sabit/sembolik bağlantı yapıldığında onay iletişim kutusunu göster
settings_confirm_group_deletion_button = Gruptaki tüm dosyaları silerken onay iletişim kutusunu göster
settings_show_text_view_button = Alt çıktı panelini göster
settings_use_cache_button = Önbelleği kullan
settings_save_also_as_json_button = Önbelleği JSON dosyası olarak da kaydet
settings_use_trash_button = Silinen dosyaları çöp kutusuna taşı
settings_language_label = Dil
settings_multiple_delete_outdated_cache_checkbutton = Güncel olmayan önbellek girişlerini otomatik olarak sil
settings_multiple_delete_outdated_cache_checkbutton_tooltip =
Var olmayan dosyalara işaret eden eski önbellek girdilerini siler.
Etkinleştirildiğinde, uygulama kayıtları yüklerken tüm kayıtların geçerli dosyalara
işaret etmesini sağlar (bozuk olanlar yoksayılır).
Bunu devre dışı bırakmak, harici sürücülerdeki dosyaları tararken yardımcı olacaktır,
bu nedenle bunlarla ilgili önbellek girdileri bir sonraki taramada temizlenmez.
Önbellekte yüzbinlerce kayıt olması durumunda, taramanın başlangıcında/sonunda
önbellek yükleme/kaydetme işlemini hızlandıracak olan bu özelliği etkinleştirmeniz önerilir.
settings_notebook_general = Genel
settings_notebook_duplicates = Eş Dosyalar
settings_notebook_images = Benzer Resimler
settings_notebook_videos = Benzer Videolar
## Multiple - settings used in multiple tabs
settings_multiple_image_preview_checkbutton_tooltip = Sağ tarafta önizlemeyi gösterir (bir resim dosyası seçiliyken).
settings_multiple_image_preview_checkbutton = Resim önizlemesini göster
settings_multiple_clear_cache_button_tooltip =
Güncel olmayan girişlerin önbelleğini el ile temizleyin.
Bu, yalnızca otomatik temizleme devre dışı bırakılmışsa kullanılmalıdır.
settings_multiple_clear_cache_button = Remove outdated results from cache.
## Duplicates
settings_duplicates_hide_hard_link_button_tooltip =
Hepsi aynı verilere işaret ediyorsa (sabit bağlantılıysa), biri dışındaki tüm dosyaları gizler.
Örnek: (Diskte) belirli verilere sabit bağlantılı yedi dosya ve aynı veriye ancak farklı
bir düğüme sahip bir farklı dosya olması durumunda, yinelenen bulucuda yalnızca bir benzersiz dosya ve
sabit bağlantılı dosyalardan bir dosya gösterilecektir.
settings_duplicates_minimal_size_entry_tooltip =
Önbelleğe alınacak minimum dosya boyutunu ayarlayın.
Daha küçük bir değer seçmek daha fazla kayıt üretecektir.
Bu, aramayı hızlandıracak, ancak önbellek yüklemeyi/kaydetmeyi yavaşlatacaktır.
settings_duplicates_prehash_checkbutton_tooltip =
Yinelenmeyen sonuçların daha önce reddedilmesine izin veren kısmi-SUÇ
(dosyanın küçük bir bölümünden hesaplanan bir SUÇ) değerinin önbelleğe alınmasını sağlar.
Bazı durumlarda yavaşlamaya neden olabileceğinden varsayılan olarak devre dışıdır.
Aramayı birden çok kez hızlandırabileceğinden, yüz binlerce veya milyonlarca dosyayı
tararken kullanılması şiddetle tavsiye edilir.
settings_duplicates_prehash_minimal_entry_tooltip = Önbelleğe alınacak girişlerin minimum boyutu.
settings_duplicates_hide_hard_link_button = Sabit bağlantıları gizle (yalnızca Linux ve macOS)
settings_duplicates_prehash_checkbutton = kısmi-SUÇ önbelleği kullan
settings_duplicates_minimal_size_cache_label = Önbelleğe kaydedilen minimum dosya boyutu (bayt cinsinden):
settings_duplicates_minimal_size_cache_prehash_label = kısmi-SUÇ önbelleğine kaydedilen minimum dosya boyutu (bayt cinsinden):
## Saving/Loading settings
settings_saving_button_tooltip = Geçerli ayar yapılandırmasını dosyaya kaydeder.
settings_loading_button_tooltip = Dosyadan ayarları yükler ve geçerli yapılandırmayı bunlarla değiştirir.
settings_reset_button_tooltip = Geçerli yapılandırmayı varsayılana sıfırlar.
settings_saving_button = Yapılandırmayı kaydet
settings_loading_button = Yapılandırma yükle
settings_reset_button = Yapılandırmayı sıfırla
## Opening cache/config folders
settings_folder_cache_open_tooltip =
Önbellek txt dosyalarının depolandığı klasörü açar.
Önbellek dosyalarının değiştirilmesi geçersiz sonuçların gösterilmesine neden olabilir.
Ancak, büyük miktarda dosyayı farklı bir konuma taşırken yolu değiştirmek zaman kazandırabilir.
Dosyaları tekrar taramaktan zaman kazanmak için bu dosyaları bilgisayarlar arasında
kopyalayabilirsiniz (tabii ki benzer dizin yapısına sahiplerse).
Önbellekte sorun olması durumunda bu dosyalar kaldırılabilir. Uygulama onları
otomatik olarak yeniden oluşturacaktır.
settings_folder_settings_open_tooltip =
Czkawka yapılandırmasının depolandığı klasörü açar.
UYARI: Yapılandırmayı elle değiştirmek iş akışınızı bozabilir.
settings_folder_cache_open = Önbellek klasörünü aç
settings_folder_settings_open = Ayarlar klasörünü aç
# Compute results
compute_stopped_by_user = Arama, kullanıcı tarafından durduruldu.
compute_found_duplicates_hash_size = { $number_groups } grupta, { $size } yer kaplayan, toplam { $number_files } adet kopya bulundu.
compute_found_duplicates_name = { $number_groups } grupta, { $number_files } adet kopya bulundu.
compute_found_empty_folders = { $number_files } adet boş klasör bulundu.
compute_found_empty_files = { $number_files } adet boş dosya bulundu.
compute_found_big_files = { $number_files } adet büyük/küçük dosya bulundu.
compute_found_temporary_files = { $number_files } adet geçici dosya bulundu.
compute_found_images = { $number_groups } grupta, { $number_files } adet benzer resim bulundu.
compute_found_videos = { $number_groups } grupta, { $number_files } adet benzer video bulundu.
compute_found_music = { $number_groups } grupta, { $number_files } adet benzer müzik dosyası bulundu.
compute_found_invalid_symlinks = { $number_files } adet geçersiz sembolik bağlantı bulundu.
compute_found_broken_files = { $number_files } adet bozuk dosya bulundu.
compute_found_bad_extensions = { $number_files } adet geçersiz uzantıya sahip dosya bulundu.
# Progress window
progress_scanning_general_file = { $file_number } dosya tarandı.
progress_scanning_extension_of_files = { $file_checked }/{ $all_files } dosyanın uzantısı kontrol edildi.
progress_scanning_broken_files = { $file_checked }/{ $all_files } dosya kontrol edildi.
progress_scanning_video = { $file_checked }/{ $all_files } videonun SUÇ kaydı oluşturuldu. ;-)
progress_scanning_image = { $file_checked }/{ $all_files } resmin SURÇ kaydı oluşturuldu. ;-)
progress_comparing_image_hashes = { $file_checked }/{ $all_files } resim SURÇ kaydı karşılaştırıldı.
progress_scanning_music_tags_end = { $file_checked }/{ $all_files } müzik dosyasının etiketleri karşılaştırıldı.
progress_scanning_music_tags = { $file_checked }/{ $all_files } müzik dosyasının etiketleri okundu.
progress_scanning_music_content_end = Müzik dosyası { $file_checked }/{ $all_files } için parmak izi karşılaştırılıyor
progress_scanning_music_content = Müzik dosyası { $file_checked }/{ $all_files } için parmak izi hesaplanıyor
progress_scanning_empty_folders = { $folder_number } klasör tarandı.
progress_scanning_size = { $file_number } dosyanın boyutu tarandı.
progress_scanning_size_name = { $file_number } dosyasının ismi ve boyutu aranıyor
progress_scanning_name = { $file_number } dosyanın adı tarandı.
progress_analyzed_partial_hash = { $file_checked }/{ $all_files } dosyanın kısmi-SUÇ kaydı analiz edildi. ;-)
progress_analyzed_full_hash = { $file_checked }/{ $all_files } dosyanın tam SUÇ kaydı analiz edildi. ;-)
progress_prehash_cache_loading = Loading prehash cache
progress_prehash_cache_saving = Saving prehash cache
progress_hash_cache_loading = Loading hash cache
progress_hash_cache_saving = Saving hash cache
progress_cache_loading = Loading cache
progress_cache_saving = Saving cache
progress_current_stage = Geçerli Aşama: { " " }
progress_all_stages = Tüm Aşamalar: { " " }
# Saving loading
saving_loading_saving_success = Yapılandırma { $name } dosyasına kaydedildi.
saving_loading_saving_failure = Yapılandırma verileri { $name } dosyasına kaydedilemedi.
saving_loading_reset_configuration = Geçerli yapılandırma temizlendi.
saving_loading_loading_success = Uygulama yapılandırması düzgünce yüklendi.
saving_loading_invalid_string = "{ $key }" anahtarı için geçersiz sonuç bulundu. "{ $result }" bir dize(tümce) değil.
saving_loading_invalid_int = "{ $key }" anahtarı için geçersiz sonuç bulundu. "{ $result }" tam sayı değil.
saving_loading_invalid_bool = "{ $key }" anahtarı için geçersiz sonuç bulundu. "{ $result }" D/Y türünde değil.
saving_loading_decode_problem_bool = "{ $key }" anahtarından D/Y kodu çözülemedi, "{ $result }" bulundu ancak izin verilen değerler 0, 1, doğru veya yanlış.
saving_loading_saving_same_keys = Ayar, yinelenen "{ $key }" anahtarıyla kaydedilmeye çalışılıyor.
saving_loading_failed_to_get_home_directory = Yapılandırma dosyasını açmak/kaydetmek için /home dizinine erşilemedi.
saving_loading_folder_config_instead_file = "{ $path }" yolunda kaydetme yapılandırma dosyası oluşturulamıyor veya açılamıyor çünkü zaten bir klasör var.
saving_loading_failed_to_create_configuration_folder = Yapılandırma klasörü "{ $path }" dizini oluşturulamadı, nedeni: "{ $reason }".
saving_loading_failed_to_create_config_file = "{ $path }" dizininde yapılandırma dosyası oluşturulamadı, nedeni: "{ $reason }".
saving_loading_failed_to_read_config_file = "{ $path }" dizininden yapılandırma dosyası yüklenemiyor, böyle dosya yok ya da bir dosya değil.
saving_loading_failed_to_read_data_from_file = "{ $path }" dosyasından veri okunamıyor, nedeni: "{ $reason }".
saving_loading_orphan_data = "{ $line }" satırda "{ $data }" ilişiksiz veri bulundu.
saving_loading_not_valid = "{ $data }" ayarı geçerli uygulama sürümünde bulunmuyor.
# Invalid symlinks
invalid_symlink_infinite_recursion = Sonsuz özyineleme
invalid_symlink_non_existent_destination = Var olmayan hedef dosya
# Other
selected_all_reference_folders = Tüm dizinler, "Başvuru Klasörü" olarak ayarlandığında arama başlatılamaz.
searching_for_data = İşleminiz yürütülüyor, bu biraz zaman alabilir, lütfen bekleyin...
text_view_messages = MESAJLAR
text_view_warnings = UYARILAR
text_view_errors = HATALAR
about_window_motto = Bu programın kullanımı ücretsizdir ve her zaman öyle kalacaktır.
# Various dialog
dialogs_ask_next_time = Bir dahaki sefere sor
delete_file_failed = { $name } dosyası silinemedi, nedeni: { $reason }
delete_title_dialog = Silmeyi onaylayın.
delete_question_label = Dosyaları silmek istediğinizden emin misiniz?
delete_all_files_in_group_title = Gruptaki tüm dosyaları silmeyi onaylayın.
delete_all_files_in_group_label1 = Kimi gruplarda tüm kayıtlar seçilir.
delete_all_files_in_group_label2 = Bunları silmek istediğinizden emin misiniz?
delete_folder_failed = { $dir } klasörü; bulunmadığı, izniniz olmadığı veya klasör boş olmadığı için silinemedi.
delete_items_label = { $items } dosya silinecek.
delete_items_groups_label = { $groups } gruptan { $items } dosya silinecek.
hardlink_failed = Sabit bağlantı kurulamadı.
hard_sym_invalid_selection_title_dialog = Kimi gruplarda geçersiz seçim
hard_sym_invalid_selection_label_1 = Bazı gruplarda sadece bir kayıt seçilmiştir ve bu kayıt yok sayılacaktır.
hard_sym_invalid_selection_label_2 = Bu dosyaları sabit/sembolik bağlayabilmek için gruptaki en az iki sonucun seçilmesi gerekir.
hard_sym_invalid_selection_label_3 = Gruptaki ilk resim asıl olarak tanınır ve değiştirilmez, ancak ikinci ve sonrakiler değiştirilir.
hard_sym_link_title_dialog = Bağlantı vermeyi onaylayın
hard_sym_link_label = Bu dosyaları bağlamak istediğinizden emin misiniz?
move_folder_failed = { $name } klasörü taşınamadı, nedeni: { $reason }
move_file_failed = { $name } dosyası taşınamadı, nedeni: { $reason }
move_files_title_dialog = Eş dosyaları taşımak istediğiniz klasörü seçin
move_files_choose_more_than_1_path = Eş dosyaları taşıyabilmek için yalnızca bir yol seçilebilir, { $path_number } seçildi.
move_stats = { $num_files }/{ $all_files } öğe düzgün şekilde taşındı.
save_results_to_file = Saved results both to txt and json files into { $name } folder.
search_not_choosing_any_music = HATA: Müzik araması için en az bir onay kutusu seçmelisiniz.
search_not_choosing_any_broken_files = HATA: Bozuk dosya araması için en az bir onay kutusu seçmelisiniz.
include_folders_dialog_title = Aranacak Klasörler
exclude_folders_dialog_title = Hariç Tutulan Klasörler
include_manually_directories_dialog_title = Dizini elle ekle
cache_properly_cleared = Önbellek, uygun şekilde temizlendi.
cache_clear_duplicates_title = Eş dosyalar önbelleğini temizle
cache_clear_similar_images_title = Benzer resimler önbelleğini temizle
cache_clear_similar_videos_title = Benzer videolar önbelleğini temizle
cache_clear_message_label_1 = Güncel olmayan girişleri önbellekten temizlemek istiyor musunuz?
cache_clear_message_label_2 = Bu işlem, geçersiz dosyalara işaret eden tüm önbellek girişlerini kaldıracak.
cache_clear_message_label_3 = Bu, önbelleğe yükleme/kaydetme işlemini biraz hızlandırabilir.
cache_clear_message_label_4 = UYARI: İşlem, takılı olmayan harici sürücülerden önbelleğe alınmış tüm verileri kaldıracaktır. Yani her SUÇ kaydının yeniden oluşturulması gerekecek. ;-)
# Show preview
preview_image_resize_failure = { $name } adlı resim yeniden boyutlandırılamadı.
preview_image_opening_failure = { $name } adlı resim dosyasıılamadı, nedeni: { $reason }
# Compare images (L is short Left, R is short Right - they can't take too much space)
compare_groups_number = Grup: { $current_group }/{ $all_groups } ({ $images_in_group } resim)
compare_move_left_button = <-
compare_move_right_button = ->

@ -8,28 +8,12 @@ general_ok_button = Гаразд
general_close_button = Закрити
# Main window
music_title_checkbox = Найменування
music_artist_checkbox = Виконавець
music_artist_checkbox = Художник
music_year_checkbox = Рік
music_bitrate_checkbox = Бітрейт
music_genre_checkbox = Жанр
music_length_checkbox = Тривалість
music_comparison_checkbox = Приблизне порівняння
music_checking_by_tags = Мітки
music_checking_by_content = Зміст
same_music_seconds_label = Мінімальна тривалість фрагменту
same_music_similarity_label = Максимальна різниця
same_music_tooltip =
Пошук подібних музичних файлів за його вмістом може бути налаштований за налаштуванням:
- Мінімальний час фрагменту, після якого музичні файли можна визначити як схожий
- Максимальна різниця між двома тестовими фрагментами
—Що ключові з хороших результатів - знайти розумні комбінації цих параметрів, за умов.
Встановлення мінімального часу на 5 сек і максимальна різниця складає 1.0, буде шукати майже однакові фрагменти у файлах.
Час 20 і максимальна різниця в 6.0, з іншого боку, добре працює для пошуку реміксиксів/живу версії і т. д.
За замовчуванням, кожен музичний файл порівнюється один з одним, і це може зайняти багато часу при тестуванні багатьох файлів, так що використовувати референтні папки і вказати, які файли слід порівнювати один з одним (з тією ж кількістю файлів, порівняння відбитків пальців буде швидше 4x, ніж без стандартних папок).
music_comparison_checkbox_tooltip =
Шукає схожі музичні файли за допомогою ШІ, що використовує машинне навчання для видалення дужок із фраз. Наприклад, якщо ця опція увімкнена, наступні файли будуть вважатися дублікатами:
@ -39,7 +23,6 @@ duplicate_case_sensitive_name_tooltip =
Коли увімкнено, записи групуються, тільки якщо вони повністю збігаються імена з точністю до кожного символу. Наприклад, «ХІТ Дискотека» не збігається з "хіт дискотека".
Коли вимкнено, записи групуються незалежно від того, великі або малі літери використовувалися при написанні. Наприклад, «ХІТ Дискотека», «хіт дискотека», «хІт ДиСкОтЕКа» будуть еквівалентні.
duplicate_mode_size_name_combo_box = Розмір і ім'я
duplicate_mode_name_combo_box = Ім'я
duplicate_mode_size_combo_box = Розмір
duplicate_mode_hash_combo_box = Хеш
@ -60,31 +43,18 @@ duplicate_check_method_tooltip =
Хеш шукає файли з однаковим вмістом. Цей режим хешує файл, а потім порівнює хеш для пошуку дублікатів. Цей режим є найнадійнішим способом пошуку. Додаток активно використовує кеш, тому друге та подальші сканування одних і тих же даних повинні бути набагато швидшими, ніж перше.
image_hash_size_tooltip =
Кожне перевірене зображення видає спеціальний хеш, який можна порівнювати один з одним, і невелика різниця між ними означає, що ці зображення є схожими.
8 хешів дуже добре знайти зображення, які є трохи схожими на оригінал. При великому наборі зображень (>1000) значення дає велику кількість хибних позитивних результатів, так що я рекомендую використовувати більший розмір хешу у цьому випадку.
16 - це хеш за замовчуванням, який є досить хороший компроміс між пошуком навіть мало схожих зображень і маючи тільки невелику кількість хеш-зіткнень.
32 і 64 пеші знайдуть лише дуже схожі зображення, але не повинні мати практично неправильних позитивних результатів (можливо, окрім деяких зображень з альфа каналом).
image_resize_filter_tooltip =
To compute hash of image, the library must first resize it.
Depend on chosen algorithm, the resulting image used to calculate hash will looks a little different.
Czkawka дозволяє задати розмір хешу для кожного зображення. Чим більший розмір хеша, тим точніші збіги зображень будуть перебувати (з меншою кількістю відмінностей), але це буде займати трохи більше часу.
The fastest algorithm to use, but also the one which gives the worst results, is Nearest. It is enabled by default, because with 16x16 hash size lower quality it is not really visible.
Розмір хеша за замовчуванням — 8 байт, що дозволяє знайти і схожі, і злегка різні зображення. 16 та 32 байт хешу слід використовувати для виявлення майже однакових зображень. Хеш розміром 64 байт повинен використовуватися лише у випадках, коли необхідно відфільтрувати лише зображення з мікроскопічними відмінностями.
image_resize_filter_tooltip = Щоб обчислити хеш зображення, бібліотека має спочатку його перемасштабувати. Залежно від обраного алгоритму зображення може виглядати трохи по-різному. Метод найближчих сусідів найшвидший, але дає найгірші результати.
image_hash_alg_tooltip = Користувачі можуть вибирати один з багатьох алгоритмів обчислення. Кожен має сильні та слабкі точки, і іноді дасть кращі результати для різних зображень. Таким чином, щоб обрати найкраще, необхідно ручне тестування.
main_notebook_image_fast_compare = Швидко порівняти
main_notebook_image_fast_compare_tooltip =
Прискорення пошуку та порівняння хешів.
With 8x8 hash size it is recommended to use a different algorithm than Nearest, to have better groups of images.
image_hash_alg_tooltip =
Користувачі можуть вибирати з одного з багатьох алгоритмів обчислення хешу.
На відміну від звичайного режиму, де кожен хеш порівнюється один з одним X раз (де X — це подібність, задана користувачем), в цьому режимі буде використовуватися одне порівняння.
Кожен з них має і сильні і слабкі точки, і іноді може призвести до кращого і іноді гірших результатів для різних зображень.
Таким чином, щоб визначити найкращу для вас, потрібно ручне тестування.
big_files_mode_combobox_tooltip = Дозволяє шукати найменші або найбільші файли
big_files_mode_label = Перевірені файли
big_files_mode_smallest_combo_box = Найменший
big_files_mode_biggest_combo_box = Найбільший
Цей параметр рекомендується використовувати при порівнянні >10000 зображень з ненульовою (дуже високою) схожістю.
main_notebook_duplicates = Файли-дублікати
main_notebook_empty_directories = Порожні каталоги
main_notebook_big_files = Великі файли
@ -122,43 +92,29 @@ main_label_size_bytes = Розмір (байт)
main_label_min_size = Мін
main_label_max_size = Макс
main_label_shown_files = Кількість показаних файлів
main_label_resize_algorithm = Алгоритм масштабування
main_label_similarity = Подібність{ " " }
main_check_box_broken_files_audio = Звук
main_check_box_broken_files_pdf = Pdf
main_check_box_broken_files_archive = Архів
main_check_box_broken_files_image = Зображення
main_label_resize_algorithm = Алгоритм перемасштабування
main_label_similarity = Подібність{ " " }
check_button_general_same_size = Ігнорувати однаковий розмір
check_button_general_same_size_tooltip = Ігнорувати файли з однаковим розміром у результаті - зазвичай це 1:1 дублікатів
check_button_general_same_size_tooltip = Ігнорувати в результатах файли, що мають однаковий розмір: зазвичай це точні дублікати
main_label_size_bytes_tooltip = Розмір файлів, які будуть проскановані
# Upper window
upper_tree_view_included_folder_column_title = Папки для пошуку
upper_tree_view_included_reference_column_title = Містить оригінали
upper_tree_view_included_reference_column_title = Папки оригіналів
upper_recursive_button = Рекурсивний
upper_recursive_button_tooltip = Коли увімкнено, будуть шукатися файли, що не знаходяться безпосередньо в корені вибраної папки, тобто в інших підпапках даної папки та їх підпапках.
upper_manual_add_included_button = Прописати вручну
upper_manual_add_included_button = Додати вручну
upper_add_included_button = Додати
upper_remove_included_button = Видалити
upper_manual_add_excluded_button = Ручне додавання
upper_add_excluded_button = Додати
upper_remove_excluded_button = Видалити
upper_manual_add_included_button_tooltip =
Додавати назву теки для пошуку вручну.
Додайте декілька шляхів відразу, розділіть їх
/home/roman;/home/rozkaz буде додано дві папки/home/roman and /home/rozkaz
upper_manual_add_included_button_tooltip = Додати назву каталогу для пошуку вручну.
upper_add_included_button_tooltip = Додати нову директорію для пошуку.
upper_remove_included_button_tooltip = Видалити директорію з пошуку.
upper_manual_add_excluded_button_tooltip =
Додавати виключені назви директорії.
Додайте декілька шляхів одночасно, відокремте їх ;
/home/roman;/home/krokiet додасть дві папки/home/roman та /home/keokiet
upper_manual_add_excluded_button_tooltip = Додати вручну ім'я каталогу, який виключається з пошуку.
upper_add_excluded_button_tooltip = Додати каталог, який виключається з пошуку.
upper_remove_excluded_button_tooltip = Видалити каталог з виключених.
upper_notebook_items_configuration = Параметри пошуку
upper_notebook_items_configuration = Налаштування елементів
upper_notebook_excluded_directories = Виключені каталоги
upper_notebook_included_directories = Включені каталоги
upper_allowed_extensions_tooltip =
@ -167,16 +123,11 @@ upper_allowed_extensions_tooltip =
Макроси IMAGE, VIDEO, MUSIC, TEXT додають одразу кілька розширень.
Приклад використання: «.exe, IMAGE, VIDEO, .rar, 7z» — це означає, що будуть скануватися файли зображень (напр. jpg, png), відео (напр. avi, mp4), exe, rar і 7z.
upper_excluded_extensions_tooltip =
Список вимкнених файлів, які будуть ігноруватися при скануванні.
При використанні дозволених і вимкнених розширень, цей файл має більший пріоритет, тому файл не буде відмітити.
upper_excluded_items_tooltip =
Виключені елементи повинні містити маску «*» і бути розділені комами.
Це повільніше, ніж «Виключені каталоги», тому використовуйте обережно.
upper_excluded_items = Виключені елементи:
upper_allowed_extensions = Дозволені розширення:
upper_excluded_extensions = Вимкнені розширення:
# Popovers
popover_select_all = Виділити все
popover_unselect_all = Прибрати всі
@ -225,11 +176,6 @@ popover_custom_case_sensitive_check_button = З урахуванням регі
popover_custom_all_in_group_label = Не вибирати усі записи в групі
popover_custom_mode_unselect = Зняти вибір
popover_custom_mode_select = Вибрати власний
popover_sort_file_name = Ім'я файлу
popover_sort_folder_name = Назва папки
popover_sort_full_name = Повне ім'я
popover_sort_size = Розмір
popover_sort_selection = Вибрані об'єкти
popover_invalid_regex = Неприпустимий регулярний вираз
popover_valid_regex = Коректний регулярний вираз
# Bottom buttons
@ -240,7 +186,6 @@ bottom_save_button = Зберегти
bottom_symlink_button = Симв. посилання
bottom_hardlink_button = Жорст. посилання
bottom_move_button = Перемістити
bottom_sort_button = Сортування
bottom_search_button_tooltip = Почати пошук
bottom_select_button_tooltip = Виберіть запис. Тільки вибрані файли/папки будуть доступні для подальшої обробки.
bottom_delete_button_tooltip = Видалити вибрані файли/папки.
@ -253,21 +198,14 @@ bottom_hardlink_button_tooltip =
Створити жорсткі посилання.
Працює лише тоді, коли вибрано не менше двох результатів у групі.
Перший результат залишається, а другий та наступні робляться жорсткими посиланнями на перший.
bottom_hardlink_button_not_available_tooltip =
Створити Жорсткі посилання.
кнопка вимкнена, тому що не може бути створена.
Жорсткі посилання працюють тільки з правами адміністратора на Windows, тому не забудьте запустити додаток як адміністратор.
Якщо додаток вже працює з такими привілеями для подібних проблем на GitHub.
bottom_move_button_tooltip =
Переміщення файлів до вибраного каталогу.
Копіює всі файли в теку без збереження структури дерева каталогів.
При спробі перемістити два файли з однаковим ім'ям в ту саму теку другий не буде переміщений, і з'явиться повідомлення про помилку.
bottom_sort_button_tooltip = Сортує файли/теки відповідно до вибраного методу.
bottom_show_errors_tooltip = Показати/приховати нижню текстову панель.
bottom_show_upper_notebook_tooltip = Показати/приховати верхню панель блокнота.
# Progress Window
progress_stop_button = Зупинити
progress_stop_additional_message = Припинити запит
# About Window
about_repository_button_tooltip = Посилання на сторінку репозиторію з вихідним кодом.
about_donation_button_tooltip = Посилання на сторінку пожертви.
@ -286,14 +224,6 @@ header_about_button_tooltip = Відкриває діалогове вікно
## General
settings_number_of_threads = Кількість використаних тем
settings_number_of_threads_tooltip = Кількість використаних потоків; встановіть 0, щоб використовувати всі доступні потоки.
settings_label_restart = Щоб застосувати параметри, необхідно перезапустити додаток!
settings_ignore_other_filesystems = Ігнорувати інші файлові системи (лише Linux)
settings_ignore_other_filesystems_tooltip =
ігнорує файли, які не знаходяться в одній файловій системі, як пошукові каталоги.
Працює те саме, що і параметр -xdev у пошуку команди на Linux
settings_save_at_exit_button_tooltip = Зберегти конфігурацію в файл під час закриття додатку.
settings_load_at_start_button_tooltip =
Завантажити конфігурацію з файлу під час відкриття програми.
@ -313,7 +243,7 @@ settings_confirm_deletion_button = Показувати вікно підтве
settings_confirm_link_button = Показувати вікно підтвердження при складній/символьних посилань будь-які файли
settings_confirm_group_deletion_button = Показувати вікно підтвердження при видаленні всіх файлів групи
settings_show_text_view_button = Показувати нижню текстову панель
settings_use_cache_button = Використовувати кеш
settings_use_cache_button = Використання кешу
settings_save_also_as_json_button = Також зберегти кеш у файл JSON
settings_use_trash_button = Перемістити видалені файли в смітник
settings_language_label = Мова
@ -338,7 +268,7 @@ settings_multiple_image_preview_checkbutton = Показати попередн
settings_multiple_clear_cache_button_tooltip =
Очищення застарілих записів кешу вручну.
Слід використовувати лише в тому випадку, якщо автоматичне очищення вимкнено.
settings_multiple_clear_cache_button = Видалити застарілі результати з кешу.
settings_multiple_clear_cache_button = Видалити застарілі результати з кешу зображень
## Duplicates
@ -410,20 +340,11 @@ progress_scanning_image = Хешування зображення: { $file_check
progress_comparing_image_hashes = Порівняння хешу зображення: { $file_checked }/{ $all_files }
progress_scanning_music_tags_end = Порівняння тегів музичного файлу: { $file_checked }/{ $all_files }
progress_scanning_music_tags = Читання тегів музичного файлу: { $file_checked }/{ $all_files }
progress_scanning_music_content_end = Порівняння відбитку пальця { $file_checked }/{ $all_files } музичного файлу
progress_scanning_music_content = Розрахунок відбитку пальця { $file_checked }/{ $all_files } музичного файлу
progress_scanning_empty_folders = Сканування теки { $folder_number }
progress_scanning_size = Сканування розміру файлу { $file_number }
progress_scanning_size_name = Сканування назви і розміру файлу { $file_number }
progress_scanning_name = Сканування імені файлу { $file_number }
progress_analyzed_partial_hash = Аналіз часткового хешу файлу { $file_checked }/{ $all_files }
progress_analyzed_full_hash = Аналіз повного хешу файлу { $file_checked }/{ $all_files }
progress_prehash_cache_loading = Завантаження цільового кешу
progress_prehash_cache_saving = Збереження цілковитого кешу
progress_hash_cache_loading = Завантаження схованки
progress_hash_cache_saving = Збереження кешу кешу
progress_cache_loading = Завантаження кешу
progress_cache_saving = Збереження кешу
progress_current_stage = Поточний етап: { " " }
progress_all_stages = Усі етапи: { " " }
# Saving loading
@ -448,7 +369,6 @@ saving_loading_not_valid = Параметр «{ $data }» не існує в п
invalid_symlink_infinite_recursion = Нескінченна рекурсія
invalid_symlink_non_existent_destination = Неіснуючий файл призначення
# Other
selected_all_reference_folders = Неможливо почати пошук, коли всі каталоги встановлені як папки з орієнтирами
searching_for_data = Пошук даних може зайняти деякий час — будь ласка, зачекайте...
text_view_messages = ПОВІДОМЛЕННЯ
text_view_warnings = ПОПЕРЕДЖЕННЯ
@ -477,9 +397,8 @@ move_file_failed = Не вдалося перемістити файл { $name }
move_files_title_dialog = Виберіть теку, в яку хочете перемістити дубльовані файли
move_files_choose_more_than_1_path = Можна вибрати лише один шлях для копіювання дублікатів файлів, але вибрано { $path_number }.
move_stats = Вдалося перемістити без помилок елементів: { $num_files }/{ $all_files }
save_results_to_file = Збережено результати як з txt, так і з json файлів в теку { $name }.
save_results_to_file = Збережені результати до файлу { $name }
search_not_choosing_any_music = Помилка: Ви повинні вибрати принаймні один прапорець з типами пошуку музики.
search_not_choosing_any_broken_files = ПОМИЛКА: Ви повинні вибрати принаймні один прапорець з типом пошкоджених файлів.
include_folders_dialog_title = Теки для включення
exclude_folders_dialog_title = Теки для виключення
include_manually_directories_dialog_title = Додати теку вручну

@ -4,7 +4,7 @@ window_main_title = Czkawka
window_progress_title = 正在扫描
window_compare_images = 比较图像
# General
general_ok_button = 确定
general_ok_button = 好的
general_close_button = 关闭
# Main window
music_title_checkbox = 标题
@ -14,77 +14,47 @@ music_bitrate_checkbox = 码率
music_genre_checkbox = 流派
music_length_checkbox = 长度
music_comparison_checkbox = 近似比较
music_checking_by_tags = 标签
music_checking_by_content = 内容
same_music_seconds_label = 最小分片秒持续时间
same_music_similarity_label = 最大差异
same_music_tooltip =
通过设置以下内容,可以配置按其内容搜索类似的音乐文件:
- 可以识别音乐文件为类似文件的最小碎片时间
- 两个测试片段之间的最大差异度
找到这些参数的合理组合是获得好结果的关键。
将最小时间设置为5秒最大差异度设置为1.0,将寻找几乎相同的文件碎片。
另一方面20秒的时间和6.0的最大差异度可以很好地找到混音/现场版本等内容。
默认情况下,每个音乐文件都会与其他音乐文件进行比较,当测试许多文件时,这可能需要很长时间,因此通常最好使用参考文件夹并指定要相互比较的文件(如有相同数量的文件则比较指纹至少比不使用参考文件夹快4倍)。
music_comparison_checkbox_tooltip =
它使用AI搜索类似的音乐文件利用机器学习从短语中移除括号。例如启用此选项后相关的文件将被视为重复文件
它使用 AI搜索类似的音乐文件它使用机器学习从短语中删除括号。 例如,启用此选项, 所涉文件将被视为重复:
Świędziżłób --- Świędziżłób (Remix Lato 2021)
duplicate_case_sensitive_name = 区分大小写
duplicate_case_sensitive_name_tooltip =
启用时,仅当记录具有完全相同的名称时才进行分组,例如 Żołd <-> Żołd
启用时,仅当记录具有完全相同的名称时分组,例如 Żołd <-> Żołd
禁用此选项将不检查每个字母是否具有相同的大小写,例如 żoŁD <-> Żołd
duplicate_mode_size_name_combo_box = 大小和名称
禁用这种选项将不会检查每封字母是否相同的大小,例如 żoŁD <-> Żołd
duplicate_mode_name_combo_box = 名称
duplicate_mode_size_combo_box = 大小
duplicate_mode_hash_combo_box = 哈希
duplicate_hash_type_tooltip =
Czkawka提供3种哈希类型
Blake3 - 加密散列函数。这是默认选项,因为它非常快。
Blake3 - 加密散列函数。 这是默认值,因为它很快。
CRC32 - 简单的散列函数。这应该比Blake3更快但极少情况下可能会有一些冲突
CRC32 - 简单的散列函数。 这应该比Blake3更快但可能很少发生碰撞
XXH3 - 与Blake3非常相似性能和哈希质量也很高但不是加密的。因此这些模式可以很容易地互换使用
XXH3 - 在性能和散列质量方面非常相似的 Blake3 (但非加密法) 。所以这种模式可以很容易地进行交流
duplicate_check_method_tooltip =
目前Czkawka提供三种方法来查找重复
名称 - 查找名称相同的文件。
名称 - 查找具有相同名称的文件。
大小 - 查找大小相同的文件。
哈希 - 查找内容相同的文件。 这种模式会对文件进行哈希计算,然后将哈希值进行比较以查找重复项。这种模式是查找重复项的最安全方法。应用程序大量使用缓存,因此对相同数据进行的第二次及更多次扫描应比第一次更快
哈希-查找内容相同的文件。 此模式将文件哈希,然后比较此哈希以找到重复。此模式是找到重复的最安全方法。 应用大量使用缓存,所以第二和进一步扫描同一数据应该比第一个更快一些
image_hash_size_tooltip =
每张选中的图像都产生了一个可相互比较的特殊哈希。 两者之间的小差别意味着这些图像是相似的。
8 散列尺寸非常适合于找到仅略类似于原始图像的图像。 有了更大的一组图像 (>1000),这将产生大量虚假的正数, 所以我建议在这种情况下使用更大的散列尺寸。
16是默认的散列尺寸它是一个很好的折衷既使找到了一些小相似的图像又仅有少量的散列碰撞。
32和64 散列只找到非常相似的图像,但是几乎不应该有假正数 (可能只有一些带着Alpha 通道的图像)。
image_resize_filter_tooltip =
要计算图像散列,库必须首先调整大小。
在选定的算法上花费, 用来计算散列的结果图像看起来有点不同。
Czkawka提供改变每个图像生成的散列大小的功能。 散列尺寸较大,可以找到图像之间差异较小的图像,但使用速度也稍慢一些。
最快使用的算法也是结果最差的算法是Nearest。 默认情况下启用它因为16x16散列大小较低的质量并不真正可见。
散列的默认值为8字节这样可以找到非常相似和不同的图像。 16 字节和32 字节哈希值只能用于几乎完全相同的图像。 64 字节散列不应使用,除非您需要找到真正小的差异。
image_resize_filter_tooltip = 要计算图像散列,库必须首先调整大小。在选定的算法上停用,结果图像看起来没有什么不同。 使用最快的算法但结果最差的算法是Nearest。
image_hash_alg_tooltip = 用户可以从计算哈希的许多算法中选择一个。 每一个国家都有强大和弱点,有时会给不同的形象带来更好、有时甚至更糟的结果。 因此,为了确定您最好的测试,需要手动测试。
main_notebook_image_fast_compare = 快速比较
main_notebook_image_fast_compare_tooltip =
加快搜索和比较哈希。
使用 8x8 散列大小建议使用不同于Nearest的算法来拥有更好的图像组。
image_hash_alg_tooltip =
用户可以从许多计算哈希值的算法中选择一种。
与正常模式相反在这种模式下每次散列被比较为彼此x次(x是用户选择的相似性) 只会使用一个比较。
每种算法都有强项和弱项,对于不同的图像,有时结果更好,有时结果更差。
因此,为了确定最适合你的算法,需要进行人工测试。
big_files_mode_combobox_tooltip = 允许搜索最小/最大的文件
big_files_mode_label = 已检查的文件
big_files_mode_smallest_combo_box = 最小的
big_files_mode_biggest_combo_box = 最大的
在比较非0(Very High)相似性时,建议使用此选项。
main_notebook_duplicates = 重复文件
main_notebook_empty_directories = 空目录
main_notebook_big_files = 大文件
@ -124,17 +94,13 @@ main_label_max_size = 最大值
main_label_shown_files = 显示的文件数
main_label_resize_algorithm = 调整算法
main_label_similarity = 相似性:{" "}
main_check_box_broken_files_audio = 音频
main_check_box_broken_files_pdf = PDF
main_check_box_broken_files_archive = 归档
main_check_box_broken_files_image = 图像
check_button_general_same_size = 忽略相同的大小
check_button_general_same_size_tooltip = 忽略结果中相同大小的文件 - 通常是 1:1 重复
check_button_general_same_size_tooltip = 从结果忽略相同大小的文件 - 通常是 1:1 重复
main_label_size_bytes_tooltip = 将用于扫描的文件大小
# Upper window
upper_tree_view_included_folder_column_title = 要搜索的文件夹
upper_tree_view_included_reference_column_title = 参考文件夹
upper_recursive_button = 递归
upper_recursive_button = 递归
upper_recursive_button_tooltip = 如果选中,也可以搜索未直接置于选定文件夹下的文件。
upper_manual_add_included_button = 手动添加
upper_add_included_button = 添加
@ -142,46 +108,31 @@ upper_remove_included_button = 删除
upper_manual_add_excluded_button = 手动添加
upper_add_excluded_button = 添加
upper_remove_excluded_button = 删除
upper_manual_add_included_button_tooltip =
手动添加目录名。
如需一次性添加多个路径,请用分号;分隔它们
填写 /home/roman;/home/krokiet 将添加 /home/roman 和 /home/kookiet 两个目录
upper_manual_add_included_button_tooltip = 手动添加目录名。
upper_add_included_button_tooltip = 添加新目录进行搜索。
upper_remove_included_button_tooltip = 从搜索中删除目录。
upper_manual_add_excluded_button_tooltip =
手动添加要排除的目录名称。
如需一次性添加多个路径,请用分号;分隔它们
填写 /home/roman;/home/krokiet 将添加 /home/roman 和 /home/kookiet 两个目录
upper_add_excluded_button_tooltip = 添加在搜索中排除的目录。
upper_manual_add_excluded_button_tooltip = 手动添加排除的目录名称。
upper_add_excluded_button_tooltip = 添加要排除在搜索中的目录。
upper_remove_excluded_button_tooltip = 从排除中删除目录。
upper_notebook_items_configuration = 项目配置
upper_notebook_excluded_directories = 排除的目录
upper_notebook_included_directories = 包含的目录
upper_allowed_extensions_tooltip =
允许的文件扩展名必须用逗号分隔(默认情况下全部可用)。
还提供以下可同时添加多个扩展名的宏IMAGE图片、VIDEO视频、MUSIC音乐、TEXT文本
允许的扩展必须用逗号分隔(默认所有可用)。
使用示例:".exe, IMAGE, VIDEO, .rar, 7z"这意味着将扫描图片文件例如jpg、png、视频文件例如avi、mp4、exe、rar和7z文件。
upper_excluded_extensions_tooltip =
在扫描中忽略的已禁用文件列表。
同时添加多个扩展的下列宏也可用: IMAGE, VIDEO, MUSIC, TEXT
在使用允许和禁用的扩展时,这个扩展具有更高的优先级,所以文件将不会被检查
使用示例".exe, IMAGE, VIDEO, .rar, 7z" - 这意味着图像(e). . jpg、png、视频(例如avi、mp4)、ex、rar和7z 文件将被扫描。
upper_excluded_items_tooltip =
排除的项目必须包含 * 通配符,并用逗号分隔。
与排除目录相比,这种方式较慢,因此请小心使用。
排除的项目必须包含 * 通配符,并且应该用逗号分隔。
这比排除的目录慢,所以请仔细使用。
upper_excluded_items = 排除的项目:
upper_allowed_extensions = 允许的扩展:
upper_excluded_extensions = 已禁用扩展:
# Popovers
popover_select_all = 全部选择
popover_unselect_all = 取消
popover_select_all = 选择所有
popover_unselect_all = 取消选择所有
popover_reverse = 反向选择
popover_select_all_except_oldest = 选择除最以外的所有选项
popover_select_all_except_oldest = 选择除最以外的所有选项
popover_select_all_except_newest = 选择除最新以外的所有选项
popover_select_one_oldest = 选择一个最旧的
popover_select_one_newest = 选择一个最新的
@ -193,31 +144,31 @@ popover_custom_path_check_button_entry_tooltip =
通过路径选择记录。
示例用法:
/home/pimpek/rzecz.txt 可以通过 /home/pim* 找到
/home/pimpek/rzecz.txt可以通过 /home/pim* 找到
popover_custom_name_check_button_entry_tooltip =
按文件名选择记录。
示例用法:
/usr/ping/pong.txt 可以通过 *ong* 找到。
/usr/ping/pong.txt可以在 *ong* 中找到。
popover_custom_regex_check_button_entry_tooltip =
按指定的正则表达式选择记录。
通过指定的 Regex选择记录。
使用此模式,搜索的文本是带有名称的路径。
使用这种模式,搜索的文本是名的路径。
示例用法:
可以使用 /ziem[a-z]+ 查找 /usr/bin/ziemniak.txt
/usr/bin/ziemniak。 xt 可以通过 /ziem[a-z]+
这使用默认的Rust正则表达式实现。 您可以在此处阅读有关它的更多信息https://docs.rs/regex。
找到。这使用默认的 Rust regex 实现。你可以在这里阅读更多关于它的信息https://docs.rs/regex。
popover_custom_case_sensitive_check_button_tooltip =
启用大小写检测。
启用区分大小写检测。
该选项禁用时,/home/* 将同时找到 /HoMe/roman 和 /home/roman。
当禁用/home/* 同时找到 /HoMe/roman 和 /home/roman。
popover_custom_not_all_check_button_tooltip =
禁止在分组中选择所有记录。
这是默认启用的,因为在大多数情况下, 您不想删除原始文件和重复文件,而是想留下至少一个文件。
这是默认启用的,因为在大多数情况下, 您不想删除原始文件和重复文件,但想保留至少一个文件。
警告:如果您已经手动选择了一个组中的所有结果,则此设置不起作用
警告:如果您已经手动选择了一个组中的所有结果,此设置将无法工作
popover_custom_regex_path_label = 路径
popover_custom_regex_name_label = 名称
popover_custom_regex_regex_label = 正则表达式路径 + 名称
@ -225,11 +176,6 @@ popover_custom_case_sensitive_check_button = 区分大小写
popover_custom_all_in_group_label = 不在组中选择所有记录
popover_custom_mode_unselect = 取消选择自定义
popover_custom_mode_select = 选择自定义
popover_sort_file_name = 文件名称
popover_sort_folder_name = 文件夹名称
popover_sort_full_name = 全名
popover_sort_size = 大小
popover_sort_selection = 选择
popover_invalid_regex = 正则表达式无效
popover_valid_regex = 正则表达式有效
# Bottom buttons
@ -237,37 +183,29 @@ bottom_search_button = 搜索
bottom_select_button = 选择
bottom_delete_button = 删除
bottom_save_button = 保存
bottom_symlink_button = 软链接
bottom_hardlink_button = 硬链接
bottom_symlink_button = Symlink
bottom_hardlink_button = Hardlink
bottom_move_button = 移动
bottom_sort_button = 排序
bottom_search_button_tooltip = 开始搜索
bottom_select_button_tooltip = 选择记录。只能稍后处理选定的文件/文件夹。
bottom_delete_button_tooltip = 删除选中的文件/文件夹。
bottom_save_button_tooltip = 保存搜索数据到文件
bottom_symlink_button_tooltip =
创建链接。
有在至少选择了一组中的两个结果时才起作用
第一个结果保持不变,第二个及后续结果都会被软链接到第一个结果上
创建符号链接。
能在选择组中至少两个结果时生效
第一个不变,第二个和以后两个都是对称的
bottom_hardlink_button_tooltip =
创建硬链接。
只有在至少选择了一组中的两个结果时才起作用。
第一个结果保持不变,第二个及后续结果都会被硬链接到第一个结果上。
bottom_hardlink_button_not_available_tooltip =
创建硬链接。
按钮已禁用,因为无法创建硬链接。
在 Windows 上,只有使用管理员权限才能使用硬链接,所以请确保以管理员身份运行该应用程序。
如果应用程序已经具有管理员权限,请在 Github 上查找类似的问题。
只在选定组中至少两个结果时有效。
第一个不变,第二个和第二个后来是与第一个联系在一起的。
bottom_move_button_tooltip =
移动文件到选定的目录。
它复制所有文件到目录,而不保留目录树。
试图将两个具有相同名称的文件移动到文件夹时,第二个将失败并显示错误。
bottom_sort_button_tooltip = 根据选定的方法排序文件/文件夹。
bottom_show_errors_tooltip = 显示/隐藏底部文本面板。
bottom_show_upper_notebook_tooltip = 显示/隐藏主笔记本面板。
# Progress Window
progress_stop_button = 停止
progress_stop_additional_message = 停止请求
# About Window
about_repository_button_tooltip = 链接到源代码的仓库页面。
about_donation_button_tooltip = 链接到捐赠页面。
@ -286,14 +224,6 @@ header_about_button_tooltip = 打开包含应用程序信息的对话框。
## General
settings_number_of_threads = 使用的线程数
settings_number_of_threads_tooltip = 使用的线程数0表示所有可用线程都将被使用。
settings_label_restart = 您需要重新启动应用才能应用设置!
settings_ignore_other_filesystems = 忽略其它文件系统 (仅限Linux)
settings_ignore_other_filesystems_tooltip =
忽略与搜索的目录不在同一个文件系统中的文件。
在 Linux 上查找命令时类似-xdev选项
settings_save_at_exit_button_tooltip = 关闭应用时将配置保存到文件。
settings_load_at_start_button_tooltip =
打开应用程序时从文件加载配置。
@ -305,7 +235,7 @@ settings_confirm_group_deletion_button_tooltip = 尝试从群组中删除所有
settings_show_text_view_button_tooltip = 在用户界面底部显示文本面板。
settings_use_cache_button_tooltip = 使用文件缓存。
settings_save_also_as_json_button_tooltip = 保存缓存为 (人类可读) JSON 格式。可以修改其内容。 如果缺少二进制格式缓存(带bin extensional),此文件的缓存将被应用自动读取。
settings_use_trash_button_tooltip = 将文件移至回收站,而不是将其永久删除。
settings_use_trash_button_tooltip = 将文件移至回收站,而将其永久删除。
settings_language_label_tooltip = 用户界面的语言。
settings_save_at_exit_button = 关闭应用时保存配置
settings_load_at_start_button = 打开应用程序时加载配置
@ -319,13 +249,13 @@ settings_use_trash_button = 移动已删除的文件到回收站
settings_language_label = 语言
settings_multiple_delete_outdated_cache_checkbutton = 自动删除过时的缓存条目
settings_multiple_delete_outdated_cache_checkbutton_tooltip =
删除指向不存在文件的过缓存结果。
删除指向不存在文件的过缓存结果。
当启用时,应用程序确保在加载记录时所有记录都指向有效文件(无法访问的文件将被忽略)
如果启用,应用会确保当加载记录时,所有记录都指向有效的文件(被忽略的文件)
禁用此功能将有助于扫描外部驱动器上的文件时,避免在下一次扫描时清除与其相关的缓存条目。
禁用这将有助于扫描外部驱动器上的文件,所以在下次扫描中不会清除有关它们的缓存条目。
如果缓存中有数十万条记录,则建议启用此功能,这将加快扫描开始/结束时的缓存加载/保存速度
在缓存中拥有成千上万条记录的情况下, 建议启用这个选项,这将加速扫描开始/结束时的缓存加载/保存
settings_notebook_general = 概况
settings_notebook_duplicates = 重复项
settings_notebook_images = 相似图像
@ -338,28 +268,28 @@ settings_multiple_image_preview_checkbutton = 显示图像预览
settings_multiple_clear_cache_button_tooltip =
手动清除过时条目的缓存。
仅在禁用自动清除时才使用。
settings_multiple_clear_cache_button = 从缓存中删除过时的结果
settings_multiple_clear_cache_button = 从图像缓存中删除过时的结果
## Duplicates
settings_duplicates_hide_hard_link_button_tooltip =
隐藏除一个以外的所有文件,如果所有文件都指向同一数据(即为硬链接)
隐藏除一个之外的所有文件,如果所有文件都指向相同的数据(是硬链接)
例如,在磁盘上有七个文件都硬链接到特定数据,并且还有一个不同的文件,其数据相同,但索引节点不同,那么在重复文件查找器中,只会显示一个唯一的文件和一个硬链接文件。
示例:在存在(磁盘) 的情况下,七个文件与特定数据有硬链接,一个不同的文件具有相同的数据但不同的内涵, 然后在重复的查找器中,将只显示一个唯一的文件和一个来自硬链接的文件。
settings_duplicates_minimal_size_entry_tooltip =
设置将缓存的最小文件大小。
设置将缓存的最小文件大小。
选择较小的值将会生成更多的记录。这将加快搜索速度,但会减慢缓存的加载/保存速度
选择一个较小的值将生成更多的记录。 这将加速搜索,但减缓缓缓存加载/保存
settings_duplicates_prehash_checkbutton_tooltip =
启用预散列缓存(从文件的一小部分计算出的哈希),以便更早地排除非重复结果。
启用封存(从文件的一小部分计算的散列) 的缓存,允许提早撤销不重复的结果。
默认情况下禁用它,因为在某些情况下可能会导致减慢速度
默认情况下禁用它,因为它会导致某些情况下的减速
强烈建议在扫描数十万或100万个文件时使用它因为它可以将搜索加速多倍
强烈建议在扫描数十万或100万个文件时使用它因为它可以多次加速搜索
settings_duplicates_prehash_minimal_entry_tooltip = 缓存条目的最小尺寸。
settings_duplicates_hide_hard_link_button = 隐藏硬链接 (仅限Linux 和 macOS)
settings_duplicates_prehash_checkbutton = 使用捕捉缓存
settings_duplicates_minimal_size_cache_label = 保存到缓存的最小文件大小 (字节)
settings_duplicates_minimal_size_cache_label = 保存到缓存的文件最小大小 (字节)
settings_duplicates_minimal_size_cache_prehash_label = 文件最小尺寸(字节) 保存到逮捕缓存
## Saving/Loading settings
@ -374,56 +304,47 @@ settings_reset_button = 重置配置
## Opening cache/config folders
settings_folder_cache_open_tooltip =
打开存储缓存txt文件的文件夹。
打开存储缓存txt文件的文件夹。
修改缓存文件可能会导致显示无效结果。然而,当将大量文件移动到另一个位置时,修改路径可能会节省时间。
修改缓存文件可能会导致显示无效结果。 然而,当将大量文件移动到另一个位置时,修改路径可能会节省时间。
您可以在计算机之间复制这些文件,以节省再次扫描文件的时间(当然,如果它们具有相似的目录结构)
您可以在计算机之间复制这些文件以便在扫描文件时节省时间(当然,如果它们具有类似的目录结构)
如果出现缓存问题,可以删除这些文件。应用程序将自动重新生成它们。
如果缓存出现问题,这些文件可以被删除。应用程序将自动重新生成它们。
settings_folder_settings_open_tooltip =
打开保存Czkawka配置的文件夹。
警告:手动修改配置可能会破坏您的工作流
警告:手动修改配置可能会破坏您的工作流。
settings_folder_cache_open = 打开缓存文件夹
settings_folder_settings_open = 打开设置文件夹
# Compute results
compute_stopped_by_user = 搜索已被用户停止
compute_found_duplicates_hash_size = 在 { $number_groups } 个组中发现 { $number_files } 个重复项,占用了 { $size } 的空间
compute_found_duplicates_name = 在 { $number_groups } 个组中发现 { $number_files } 个重复项
compute_found_empty_folders = 找到 { $number_files } 空文件夹
compute_found_empty_files = 找到 { $number_files } 空文件
compute_found_big_files = 找到 { $number_files } 大文件
compute_found_temporary_files = 找到 { $number_files } 临时文件
compute_found_images = 在 { $number_groups } 组中找到 { $number_files } 相似图像
compute_found_videos = 在 { $number_groups } 组中找到 { $number_files } 相似视频
compute_found_music = 在 { $number_groups } 组中找到 { $number_files } 类似的音乐文件
compute_found_invalid_symlinks = 找到 { $number_files } 无效的符号链接
compute_found_broken_files = 找到 { $number_files } 损坏的文件
compute_found_bad_extensions = 找到 { $number_files } 文件,其扩展名无效
compute_found_duplicates_hash_size = 在 { $number_groups } 组中找到 { $number_files } 重复,被带去了 { $size }
compute_found_duplicates_name = 找到 { $number_files } 重复的 { $number_groups } 组
compute_found_empty_folders = 找到 { $number_files } 空文件夹
compute_found_empty_files = 找到 { $number_files } 空文件
compute_found_big_files = 找到 { $number_files } 大文件
compute_found_temporary_files = 找到 { $number_files } 临时文件
compute_found_images = 在 { $number_groups } 组中找到 { $number_files } 相似图像
compute_found_videos = 在 { $number_groups } 组中找到 { $number_files } 相似视频
compute_found_music = 在 { $number_groups } 组中找到 { $number_files } 类似的音乐文件
compute_found_invalid_symlinks = 找到 { $number_files } 无效的符号链接
compute_found_broken_files = 找到 { $number_files } 损坏的文件
compute_found_bad_extensions = 找到 { $number_files } 文件,其扩展名无效
# Progress window
progress_scanning_general_file = 正在扫描 { $file_number } 文件
progress_scanning_extension_of_files = 正在检查 { $file_checked }/{ $all_files } 文件的扩展名
progress_scanning_broken_files = 正在检查 { $file_checked }/{ $all_files } 文件
progress_scanning_general_file = 正在扫描 { $file_number } 文件
progress_scanning_extension_of_files = 检查扩展名 { $file_checked }/{ $all_files } 文件
progress_scanning_broken_files = 正在检查 { $file_checked }/{ $all_files } 文件
progress_scanning_video = 散列 { $file_checked }/{ $all_files } 视频
progress_scanning_image = 散列 { $file_checked }/{ $all_files } 图像
progress_comparing_image_hashes = 正在比较 { $file_checked }/{ $all_files } 个图像的哈希
progress_scanning_music_tags_end = 正在对比 { $file_checked }/{ $all_files } 个音乐文件标签
progress_scanning_music_tags = 正在读取 { $file_checked }/{ $all_files } 个音乐文件标签
progress_scanning_music_content_end = 正在比较 { $file_checked }/{ $all_files } 个音乐文件指纹
progress_scanning_music_content = 正在计算 { $file_checked }/{ $all_files } 个音乐文件指纹
progress_scanning_empty_folders = 正在扫描 { $folder_number } 个文件夹
progress_scanning_size = 正在扫描 { $file_number } 个文件的大小
progress_scanning_size_name = 正在扫描 { $file_number } 个文件的名称和大小
progress_scanning_name = 正在扫描 { $file_number } 个文件的名称
progress_analyzed_partial_hash = 分析了 { $file_checked }/{ $all_files } 个文件的部分哈希
progress_analyzed_full_hash = 分析了 { $file_checked }/{ $all_files } 个文件的完整哈希值
progress_prehash_cache_loading = 正在加载逮捕缓存
progress_prehash_cache_saving = 正在保存抓取缓存
progress_hash_cache_loading = 加载散列缓存
progress_hash_cache_saving = 保存哈希缓存
progress_cache_loading = 加载缓存
progress_cache_saving = 正在保存缓存
progress_comparing_image_hashes = 比较 { $file_checked }/{ $all_files } 图像哈希
progress_scanning_music_tags_end = 对比标签 { $file_checked }/{ $all_files } 音乐文件
progress_scanning_music_tags = 正在读取标签 { $file_checked }/{ $all_files } 音乐文件
progress_scanning_empty_folders = 正在扫描 { $folder_number } 文件夹
progress_scanning_size = 正在扫描文件大小 { $file_number }
progress_scanning_name = 正在扫描 { $file_number } 文件的名称
progress_analyzed_partial_hash = 分析了 { $file_checked }/{ $all_files } 文件的部分哈希
progress_analyzed_full_hash = 分析了 { $file_checked }/{ $all_files } 文件的完整哈希值
progress_current_stage = 当前阶段:{ " " }
progress_all_stages = 所有阶段:{ " " }
# Saving loading
@ -442,18 +363,17 @@ saving_loading_failed_to_create_configuration_folder = 无法创建配置文件
saving_loading_failed_to_create_config_file = 无法创建配置文件 "{ $path }", 原因"{ $reason }".
saving_loading_failed_to_read_config_file = 无法从 "{ $path }" 加载配置,因为它不存在或不是文件。
saving_loading_failed_to_read_data_from_file = 无法从文件读取数据"{ $path }", 原因"{ $reason }".
saving_loading_orphan_data = 在行 “{ $line }” 中发现了孤立数据 “{ $data }”
saving_loading_orphan_data = 在行中发现了孤儿数据“{ $data }”,{ $line }"
saving_loading_not_valid = 设置“{ $data }”在当前应用版本中不存在。
# Invalid symlinks
invalid_symlink_infinite_recursion = 无限递归性
invalid_symlink_non_existent_destination = 目标文件不存在
# Other
selected_all_reference_folders = 当所有目录被设置为参考文件夹时,无法开始搜索
searching_for_data = 正在搜索数据,可能需要一段时间,请稍候...
text_view_messages = 消息
text_view_warnings = 警告
text_view_errors = 错误
about_window_motto = 本程序永久免费
about_window_motto = 这个程序可以自由使用,并将永远使用
# Various dialog
dialogs_ask_next_time = 下次询问
delete_file_failed = 删除文件 { $name } 失败,原因 { $reason }
@ -464,7 +384,7 @@ delete_all_files_in_group_label1 = 在某些组中,所有记录都被选中。
delete_all_files_in_group_label2 = 您确定要删除它们吗?
delete_folder_failed = 无法删除文件夹 { $dir } ,因为文件夹不存在,您没有权限,或者文件夹不是空的。
delete_items_label = { $items } 文件将被删除。
delete_items_groups_label = 来自 { $groups } 中的 { $items } 个文件将被删除。
delete_items_groups_label = { $items } 文件来自 { $groups } 组将被删除。
hardlink_failed = 硬链接失败
hard_sym_invalid_selection_title_dialog = 对某些组的选择无效
hard_sym_invalid_selection_label_1 = 在某些组中,只选择了一个记录,它将被忽略。
@ -476,10 +396,9 @@ move_folder_failed = 无法移动文件夹 { $name }, 原因 { $reason }
move_file_failed = 移动文件 { $name } 失败,原因 { $reason }
move_files_title_dialog = 选择要移动重复文件的文件夹
move_files_choose_more_than_1_path = 只能选择一个路径来复制重复的文件,选择 { $path_number }。
move_stats = 正确移动 { $num_files }/{ $all_files } 项目
save_results_to_file = 结果保存到 txt 和 json 文件 { $name } 文件夹。
move_stats = 正确移动 { $num_files }/{ $all_files } 项目
save_results_to_file = 结果保存到文件 { $name }
search_not_choosing_any_music = 错误:您必须选择至少一个带有音乐搜索类型的复选框。
search_not_choosing_any_broken_files = 错误:您必须选择至少一个带有选中文件类型的复选框。
include_folders_dialog_title = 要包含的文件夹
exclude_folders_dialog_title = 要排除的文件夹
include_manually_directories_dialog_title = 手动添加目录
@ -492,7 +411,7 @@ cache_clear_message_label_2 = 此操作将删除所有指向无效文件的缓
cache_clear_message_label_3 = 这可能会稍微加速加载/保存到缓存。
cache_clear_message_label_4 = 警告:操作将从未接入的外部驱动器中移除所有缓存数据。所以每个散列都需要重新生成。
# Show preview
preview_image_resize_failure = 调整图像 { $name } 的大小失败
preview_image_resize_failure = 调整图像大小失败 { $name }
preview_image_opening_failure = 打开镜像 { $name } 失败,原因 { $reason }
# Compare images (L is short Left, R is short Right - they can't take too much space)
compare_groups_number = 组 { $current_group }/{ $all_groups } ({ $images_in_group } 图像)

@ -1,105 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
enable-background="new 0 0 512 512"
viewBox="0 0 512 512"
version="1.1"
id="svg16"
sodipodi:docname="czk_hide_down.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
>
<defs
id="defs20" />
<sodipodi:namedview
id="namedview18"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="1.1656213"
inkscape:cx="202.89608"
inkscape:cy="232.92298"
inkscape:window-width="1920"
inkscape:window-height="1016"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="g14" />
<g
fill="#f2f2f2"
id="g14">
<rect
style="fill:#666666;fill-rule:evenodd;stroke-width:1.0905"
id="rect44"
width="446.01709"
height="77.321869"
x="35.979671"
y="12.962944" />
<rect
style="fill:#cccccc;fill-rule:evenodd;stroke-width:0.916437"
id="rect44-9"
width="426.74094"
height="57.075775"
x="45.104263"
y="22.958824" />
<rect
style="fill:#666666;fill-rule:evenodd;stroke-width:1.0905"
id="rect44-2"
width="446.01709"
height="77.321869"
x="35.747097"
y="107.06576" />
<rect
style="fill:#cccccc;fill-rule:evenodd;stroke-width:0.916437"
id="rect44-9-4"
width="426.74094"
height="57.075775"
x="44.87167"
y="117.06164" />
<rect
style="fill:#666666;fill-rule:evenodd;stroke-width:1.0905"
id="rect44-90"
width="446.01709"
height="77.321869"
x="37.098015"
y="198.83862" />
<rect
style="fill:#cccccc;fill-rule:evenodd;stroke-width:0.916437"
id="rect44-9-6"
width="426.74094"
height="57.075775"
x="46.22261"
y="208.8345" />
<rect
style="fill:#666666;stroke-width:1.2011"
id="rect621"
width="91.626091"
height="115.46206"
x="215.91461"
y="286.19522" />
<rect
style="fill:#cccccc"
id="rect621-2"
width="74.477417"
height="98.46283"
x="224.32861"
y="293.36823" />
<path
d="m 168.23517,342.06965 94.54786,0.18875 94.54787,0.18877 -47.4374,81.78647 -47.4374,81.78648 -47.11046,-81.97523 z"
stroke-linejoin="round"
stroke-width="1.43794"
id="path12"
style="fill:#666666" />
<path
d="m 184.17275,349.94172 79.03401,0.15778 79.03401,0.15779 -39.65365,68.36656 -39.65365,68.36657 -39.38036,-68.52435 z"
stroke-linejoin="round"
stroke-width="1.202"
id="path12-1"
style="fill:#cccccc" />
</g>
</svg>
<svg enable-background="new 0 0 512 512" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><g fill="#f2f2f2"><g transform="scale(-1)"><path d="m-482.28412-262.13965h445.9397v55.947498h-445.9397z"/><path d="m-481.87442-189.59436h445.9397v55.947498h-445.9397z"/><path d="m-481.91937-119.8358h445.9397v55.947498h-445.9397z"/><path d="m-299.72827-409.45209h72.003258v120.28382h-72.003258z" stroke-linejoin="round" stroke-width="1.202"/></g><path d="m308.54577 151.46475-76.35538-20.40233-76.35538-20.40234 55.84663-55.924531 55.84663-55.9245349 20.50875 76.3268659z" stroke-linejoin="round" stroke-width="1.202" transform="matrix(-.96661942 .25621649 -.25621649 -.96661942 520.391596 416.430997)"/></g></svg>

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 711 B

@ -1,113 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
enable-background="new 0 0 512 512"
viewBox="0 0 512 512"
version="1.1"
id="svg16"
sodipodi:docname="czk_hide_up.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
>
<defs
id="defs20" />
<sodipodi:namedview
id="namedview18"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="1.1656213"
inkscape:cx="202.89609"
inkscape:cy="272.38692"
inkscape:window-width="1920"
inkscape:window-height="1016"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="g14" />
<g
fill="#f2f2f2"
id="g14">
<rect
style="fill:#666666;fill-rule:evenodd;stroke-width:1.0905"
id="rect44"
width="446.01709"
height="77.321869"
x="-482.88254"
y="-506.02011"
transform="scale(-1)" />
<rect
style="fill:#cccccc;fill-rule:evenodd;stroke-width:0.916437"
id="rect44-9"
width="426.74094"
height="57.075775"
x="-473.75793"
y="-496.02423"
transform="scale(-1)" />
<rect
style="fill:#666666;fill-rule:evenodd;stroke-width:1.0905"
id="rect44-2"
width="446.01709"
height="77.321869"
x="-483.11511"
y="-411.9173"
transform="scale(-1)" />
<rect
style="fill:#cccccc;fill-rule:evenodd;stroke-width:0.916437"
id="rect44-9-4"
width="426.74094"
height="57.075775"
x="-473.99054"
y="-401.92142"
transform="scale(-1)" />
<rect
style="fill:#666666;fill-rule:evenodd;stroke-width:1.0905"
id="rect44-90"
width="446.01709"
height="77.321869"
x="-481.76419"
y="-320.14444"
transform="scale(-1)" />
<rect
style="fill:#cccccc;fill-rule:evenodd;stroke-width:0.916437"
id="rect44-9-6"
width="426.74094"
height="57.075775"
x="-472.63959"
y="-310.14856"
transform="scale(-1)" />
<rect
style="fill:#666666;stroke-width:1.2011"
id="rect621"
width="91.626091"
height="115.46206"
x="-302.9476"
y="-232.78784"
transform="scale(-1)" />
<rect
style="fill:#cccccc"
id="rect621-2"
width="74.477417"
height="98.46283"
x="-294.5336"
y="-225.61484"
transform="scale(-1)" />
<path
d="m 350.62703,176.91341 -94.54786,-0.18875 -94.54787,-0.18877 47.4374,-81.786466 47.4374,-81.78648 47.11046,81.97523 z"
stroke-linejoin="round"
stroke-width="1.43794"
id="path12"
style="fill:#666666" />
<path
d="m 334.68945,169.04134 -79.03401,-0.15778 -79.03401,-0.15779 39.65365,-68.36656 39.65365,-68.366566 39.38036,68.524346 z"
stroke-linejoin="round"
stroke-width="1.202"
id="path12-1"
style="fill:#cccccc" />
</g>
</svg>
<svg enable-background="new 0 0 512 512" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><g fill="#f2f2f2"><path d="m35.678684 234.14333h445.9397v55.947498h-445.9397z"/><path d="m36.08836 306.68863h445.9397v55.947498h-445.9397z"/><path d="m36.043407 376.44717h445.9397v55.947498h-445.9397z"/><g stroke-linejoin="round" stroke-width="1.202"><path d="m215.5412 88.627167h72.003258v120.28382h-72.003258z"/><path d="m308.54577 151.46475-76.35538-20.40233-76.35538-20.40234 55.84663-55.924531 55.84663-55.9245349 20.50875 76.3268659z" transform="matrix(.96661944 -.25621644 .25621644 .96661944 -5.122098 81.64821)"/></g></g></svg>

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 634 B

@ -1,107 +1 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg enable-background="new 0 0 256 256" version="1.1" viewBox="0 0 256 256" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<style type="text/css">
.st0{fill:#FFB69F;}
.st1{fill:#72C2E9;}
.st2{fill:#C2E5FF;}
.st3{fill:#FC5D3D;}
.st4{fill:#AFAFAF;}
.st5{fill:#FFCBC3;}
.st6{fill:#F0C020;}
.st7{fill:#F8E5B0;}
.st8{fill:#EFEFEF;}
.st9{fill:#EEC21E;}
.st10{fill:#FFFFFF;}
.st11{fill:#F1BF21;}
.st12{fill:#E8A61E;}
.st13{fill:#7D7B79;}
.st14{fill:#B34F33;}
.st15{fill:#F8E5B2;}
.st16{fill:#C5E5FE;}
.st17{fill:#4C4944;}
.st18{fill:#4BA5C8;}
.st19{fill:#AFAEAF;}
.st20{fill:#CF941C;}
.st21{fill:#7C7B7A;}
.st22{fill:#FAE0E1;}
.st23{fill:#13BF6D;}
.st24{fill:#76FFBB;}
.st25{fill:#F2E1D7;}
.st26{fill:#878787;}
.st27{fill:#F9E5AF;}
.st28{fill:#E8A61F;}
.st29{fill:none;stroke:#000000;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st30{fill:#EFEFF0;}
.st31{fill:#E8A61B;}
.st32{fill:#EFEFEE;}
.st33{fill:#4C4945;}
.st34{fill:#EA8F7D;}
.st35{fill:#D6C0B3;}
.st36{fill:#EEC120;}
</style>
<path class="st6" d="m145.7 107.8-37.89 37.89c-5.07 5.07-13.62 3.76-16.96-2.56-2.12-4.02-1.48-9.13 1.9-12.5l11.85-11.86 14.18-14.18 11.86-11.85c3.37-3.38 8.48-4.01 12.5-1.9 6.35 3.35 7.62 11.9 2.56 16.96z"/>
<path class="st6" d="m225.46 119.67c-3.871-1.279-7.869-2.397-10.114-12.066-2.067 8.906-5.38 10.502-10.114 12.066 7.722 2.551 8.887 6.776 10.114 12.066 2.115-9.118 5.615-10.579 10.114-12.066z"/>
<path class="st6" d="m50.79 119.67c-3.871-1.279-7.869-2.397-10.114-12.066-2.067 8.906-5.38 10.502-10.114 12.066 7.722 2.551 8.887 6.776 10.114 12.066 2.116-9.118 5.616-10.579 10.114-12.066z"/>
<path class="st6" d="m138.12 204.76c-3.871-1.279-7.869-2.397-10.114-12.066-2.067 8.906-5.38 10.502-10.114 12.066 7.722 2.551 8.887 6.776 10.114 12.066 2.116-9.119 5.616-10.579 10.114-12.066z"/>
<path class="st6" d="m138.12 51.218c-3.871-1.279-7.869-2.397-10.114-12.066-2.067 8.906-5.38 10.502-10.114 12.066 7.722 2.551 8.887 6.776 10.114 12.066 2.116-9.118 5.616-10.579 10.114-12.066z"/>
<path class="st19" d="m80.62 197.41c10.4 27.7-12.96 55.81-41.74 51.06-2.77-0.45-3.82-3.88-1.84-5.85l22.59-22.59-23.65-23.66-22.59 22.59c-1.99 1.99-5.42 0.9-5.87-1.86-4.74-28.99 23.7-52.17 51.11-41.76l32.22-32.21c3.34 6.32 11.89 7.63 16.96 2.56l1.3-1.3 3.62 3.62c2.95 2.95 5.38 6.38 7.17 10.12l-39.28 39.28z"/>
<path class="st8" d="m71.256 219.76c-1.343-0.321-2.171-1.671-1.85-3.013 2.045-8.537-0.886-14.44-3.394-21.116-0.345-0.918-0.12-1.953 0.573-2.646l35.737-35.738c0.977-0.977 2.559-0.977 3.535 0 0.977 0.976 0.977 2.559 0 3.535l-34.591 34.592c2.43 6.348 5.283 13.011 3.002 22.537-0.322 1.349-1.676 2.17-3.012 1.849z"/>
<path class="st19" d="m237.86 71.98c-10.95 10.94-26.89 13.82-40.47 8.66l-39.25 39.25c-3.74-1.79-7.17-4.22-10.12-7.17l-3.62-3.62 1.3-1.3c5.06-5.06 3.79-13.61-2.56-16.96l32.26-32.27c-4.94-13.17-2.43-28.65 7.72-39.5 9.09-9.69 21.94-13.55 34.02-11.56 2.77 0.45 3.82 3.88 1.84 5.85l-22.59 22.59 23.65 23.66 22.59-22.59c1.99-1.99 5.42-0.9 5.87 1.86 1.91 11.68-1.63 24.08-10.64 33.1z"/>
<path class="st8" d="m157.28 105.83c-0.977-0.976-0.977-2.559 0-3.535l6.944-6.944c0.977-0.977 2.559-0.977 3.535 0 0.977 0.976 0.977 2.559 0 3.535l-6.944 6.944c-0.976 0.976-2.558 0.976-3.535 0zm14.015-14.016c-0.977-0.976-0.977-2.559 0-3.535l21.692-21.692c0.696-0.695 1.736-0.919 2.654-0.57 6.776 2.571 12.403 5.446 21.134 3.377 1.342-0.319 2.69 0.513 3.009 1.856s-0.513 2.69-1.856 3.009c-9.607 2.275-16.205-0.505-22.556-2.986l-20.542 20.542c-0.976 0.975-2.558 0.975-3.535-1e-3z"/>
<path class="st1" d="m247.94 208.98c-18.997 4.958-33.986 19.925-38.965 38.954-7.563-0.897-14.894-4.23-20.685-10.031l-56.707-56.707c-4.472-4.462-7.647-10.052-9.198-16.181v-0.011c-0.601-2.384-1.435-4.683-2.489-6.877-1.793-3.734-4.219-7.162-7.173-10.116l-3.618-3.618 35.294-35.294 3.618 3.618c2.954 2.954 6.382 5.38 10.116 7.173 2.194 1.044 4.494 1.877 6.877 2.489h0.011c6.128 1.551 11.719 4.726 16.181 9.198l56.707 56.718c5.801 5.781 9.145 13.122 10.031 20.685z"/>
<path class="st1" d="m247.94 208.97c-19.03 4.98-33.99 19.96-38.96 38.96-7.57-0.89-14.9-4.23-20.69-10.03l-56.7-56.7c-4.48-4.47-7.65-10.06-9.2-16.19v-0.01c-0.6-2.38-1.44-4.68-2.49-6.87-1.79-3.74-4.22-7.17-7.17-10.12l-3.62-3.62 35.29-35.29 3.62 3.62c2.95 2.95 6.38 5.38 10.12 7.17 2.19 1.04 4.49 1.88 6.87 2.49h0.01c6.13 1.55 11.72 4.72 16.18 9.2l56.71 56.71c5.8 5.78 9.15 13.12 10.03 20.68z"/>
<path class="st6" d="m237.91 237.9c-7.9 7.91-18.63 11.25-28.93 10.03 4.97-19 19.93-33.98 38.96-38.96v0.01c1.25 10.12-2.09 20.99-10.03 28.92z"/>
<path class="st16" d="m231.42 203c-1.055-1.908-2.273-3.42-3.709-4.848-0.978-0.975-0.979-2.558-5e-3 -3.535 0.976-0.978 2.559-0.979 3.536-5e-3 1.775 1.77 3.265 3.639 4.553 5.967 0.668 1.208 0.23 2.729-0.978 3.398-1.201 0.666-2.726 0.235-3.397-0.977zm-10.781-11.922-49.478-49.477c-2.649-2.656-5.981-4.548-9.637-5.472-6.672-1.694-12.835-4.664-18.318-8.827-1.1-0.835-1.314-2.403-0.479-3.503 0.836-1.1 2.401-1.315 3.503-0.479 4.947 3.756 10.506 6.436 16.523 7.962 4.529 1.146 8.661 3.493 11.946 6.786l49.475 49.475c0.977 0.976 0.977 2.559 0 3.535-0.977 0.977-2.559 0.977-3.535 0z"/>
<polygon class="st19" points="118.78 104.59 104.6 118.77 42.201 56.367 31.959 53.213 7.814 29.069 29.079 7.804 53.224 31.948 56.642 42.454"/>
<polygon class="st19" points="118.78 104.59 104.6 118.77 42.2 56.37 31.96 53.21 7.81 29.07 29.08 7.8 53.22 31.95 56.64 42.45"/>
<path d="m217.88 107.01c-0.62-2.675-4.445-2.668-5.064 0-1.864 8.027-4.463 8.886-8.397 10.187-2.369 0.782-2.375 4.152 0 4.937 6.535 2.159 7.276 5.352 8.397 10.185 0.623 2.681 4.442 2.68 5.065 0 1.862-8.027 4.603-8.932 8.397-10.185 2.369-0.783 2.375-4.153 0-4.937-3.646-1.201-6.492-1.978-8.398-10.187zm-2.48 17.017c-0.92-1.552-2.199-3.02-4.07-4.303 1.513-1.038 2.868-2.447 4.028-4.533 1.173 2.112 2.508 3.51 3.887 4.497-1.439 1.012-2.73 2.368-3.845 4.339z"/>
<path d="m38.144 132.32c0.623 2.681 4.442 2.68 5.065 0 1.862-8.027 4.603-8.932 8.397-10.185 2.369-0.783 2.375-4.153 0-4.937-3.645-1.2-6.491-1.977-8.397-10.186-0.62-2.675-4.445-2.668-5.064 0-1.864 8.027-4.463 8.886-8.397 10.187-2.369 0.782-2.375 4.152 0 4.937 6.534 2.158 7.274 5.351 8.396 10.184zm2.542-17.127c1.173 2.112 2.508 3.51 3.888 4.497-1.439 1.011-2.731 2.368-3.846 4.339-0.92-1.552-2.199-3.02-4.07-4.303 1.513-1.038 2.868-2.447 4.028-4.533z"/>
<path d="m138.94 202.29c-3.645-1.2-6.491-1.977-8.397-10.186-0.62-2.675-4.445-2.668-5.064 0-1.864 8.027-4.463 8.886-8.397 10.187-2.369 0.782-2.375 4.152 0 4.937 6.535 2.159 7.276 5.352 8.397 10.185 0.623 2.681 4.442 2.68 5.065 0 1.862-8.027 4.603-8.932 8.397-10.185 2.369-0.784 2.374-4.154-1e-3 -4.938zm-10.877 6.831c-0.92-1.552-2.199-3.02-4.07-4.303 1.513-1.038 2.868-2.447 4.028-4.533 1.173 2.112 2.508 3.51 3.888 4.497-1.439 1.011-2.731 2.368-3.846 4.339z"/>
<path d="m117.08 53.687c6.535 2.159 7.276 5.352 8.397 10.185 0.623 2.681 4.442 2.68 5.065 0 1.862-8.027 4.603-8.932 8.397-10.185 2.369-0.783 2.375-4.153 0-4.937-3.645-1.2-6.491-1.977-8.397-10.186-0.62-2.675-4.445-2.668-5.064 0-1.864 8.027-4.463 8.886-8.397 10.187-2.37 0.782-2.376 4.152-1e-3 4.936zm10.939-6.942c1.173 2.112 2.508 3.51 3.888 4.497-1.439 1.011-2.731 2.368-3.846 4.339-0.92-1.552-2.199-3.02-4.07-4.303 1.514-1.038 2.868-2.447 4.028-4.533z"/>
<path d="m152.9 170.61c-0.977 0.976-0.977 2.559 0 3.535l42.71 42.71c0.977 0.977 2.559 0.977 3.535 0 0.977-0.976 0.977-2.559 0-3.535l-42.71-42.71c-0.976-0.976-2.558-0.976-3.535 0z"/>
<path d="m216.87 199.14c0.977-0.976 0.977-2.559 0-3.535l-42.71-42.71c-0.977-0.977-2.559-0.977-3.535 0-0.977 0.976-0.977 2.559 0 3.535l42.71 42.71c0.977 0.976 2.559 0.976 3.535 0z"/>
<path d="m80.76 66.58c0.97-0.98 0.97-2.56 0-3.54-0.95-0.94-2.59-0.94-3.53 0-0.941 0.922-1.032 2.507 0 3.54 0.978 0.976 2.557 0.973 3.53 0z"/>
<path d="m180.29 130.67c-0.98 0.97-0.98 2.56 0 3.53 0.964 0.985 2.558 0.993 3.529 0 0.98-0.97 0.98-2.56 0-3.53-0.939-0.95-2.59-0.95-3.529 0z"/>
<path d="m239.67 186.52-48.78-48.78c-0.939-0.94-2.59-0.94-3.53 0-0.964 0.965-0.982 2.548-0.01 3.52 0 0.01 0.01 0.01 0.01 0.01l48.78 48.79c4.7 4.68 7.811 10.6 9 17.1-17.922 5.478-32.353 19.591-37.97 37.97-6.51-1.2-12.43-4.31-17.11-9l-56.7-56.7c-4.149-4.14-7.1-9.33-8.55-15.02v-0.02c-2.601-10.366-8.244-16.081-12.164-20 23.651-23.651 16.879-16.88 31.754-31.75l1.851 1.85c2.37 2.37 5.01 4.414 7.873 6.093 8.017 4.718 11.775 3.547 18.886 7.767 1.14 0.68 2.75 0.26 3.42-0.88 0.7-1.173 0.325-2.708-0.87-3.42-5.815-3.444-9.454-3.769-13.005-5.035l35.485-35.495c8.993 3.026 19.059 2.822 28.17-0.87 5.03-2.04 9.55-5.03 13.42-8.9 0.17-0.17 0.34-0.34 0.5-0.52 0.96-0.99 0.93-2.58-0.061-3.53-0.96-0.93-2.609-0.9-3.539 0.06-0.06 0.069-0.366 0.401-0.44 0.45-10.349 10.334-25.252 12.865-37.81 8.09-0.9-0.34-1.98-0.1-2.66 0.57l-37.937 37.948c-3.064-1.662-5.779-3.754-7.893-5.868l-1.866-1.865c4.927-5.422 4.342-13.805-0.924-18.575l30.17-30.17c0.689-0.69 0.91-1.73 0.57-2.65-4.625-12.32-2.269-26.792 7.199-36.91 8.545-9.095 20.529-12.688 31.79-10.8 0.746 0.111 1.039 1.027 0.48 1.61l-22.59 22.59c-0.971 0.98-0.971 2.56 0 3.54l23.649 23.66c0.94 0.94 2.58 0.95 3.54 0l22.59-22.59c0.577-0.575 1.519-0.233 1.631 0.5 0.758 4.627 0.617 9.478-0.561 14.31-0.333 1.351 0.479 2.688 1.83 3.02 1.32 0.34 2.7-0.51 3.02-1.83 1.313-5.352 1.532-10.863 0.65-16.31-0.818-4.865-6.764-6.606-10.11-3.23l-20.818 20.82-20.12-20.12 20.83-20.82c3.423-3.392 1.543-9.317-3.21-10.09-12.978-2.145-26.671 2.09-36.24 12.32-10.221 10.921-13.402 26.526-8.78 40.56l-29.958 29.958c-4.711-1.648-10.116-0.491-13.689 3.094l-10.091 10.091-30.952-30.953c-0.94-0.94-2.59-0.94-3.53 0-0.98 0.98-0.98 2.56 0 3.54l30.947 30.947-10.64 10.64-60.637-60.637c-0.29-0.29-0.64-0.5-1.03-0.62l-9.659-2.97-21.931-21.94 17.73-17.73 21.95 21.95 3.229 9.93c0.12 0.38 0.33 0.72 0.61 1l15.291 15.28c0.939 0.95 2.58 0.95 3.529 0 1.002-1.001 0.948-2.584 0-3.53l-14.859-14.86-3.23-9.93c-0.12-0.38-0.33-0.72-0.609-1l-24.151-24.14c-0.94-0.95-2.59-0.95-3.53 0l-21.27 21.26c-0.932 0.931-1.017 2.503 0 3.54l24.149 24.14c0.29 0.29 0.641 0.5 1.03 0.63l9.65 2.97 60.197 60.197-10.083 10.082c-3.593 3.583-4.749 8.99-3.097 13.697l-29.906 29.897c-28.849-9.703-57.875 14.787-52.93 45.049 0.778 4.766 6.678 6.655 10.105 3.225l20.823-20.821 20.114 20.124-20.818 20.818c-3.432 3.415-1.564 9.315 3.196 10.088 30.2 4.981 54.677-23.882 45.03-52.874l35.524-35.525c0.359 1.008 0.674 2.03 0.933 3.062l0.01 0.02c1.65 6.57 5.061 12.57 9.85 17.35l56.7 56.7c14.51 14.507 38.327 14.848 53.157-1e-3 14.508-14.488 14.834-38.36-4e-3 -53.148zm-145.15-54.123 37.892-37.892c2.936-2.945 7.914-3.297 11.264-0.253 3.337 3.039 3.609 8.428 0.255 11.777 0 0-37.789 37.795-37.887 37.892-3.893 3.891-10.431 2.87-12.981-1.958-1.652-3.13-1.053-7.063 1.457-9.566zm-16.24 65.892c9.694 25.817-12.009 52.167-38.999 47.713-0.759-0.123-1.011-1.078-0.473-1.614l22.59-22.59c0.977-0.976 0.977-2.559 1e-3 -3.535l-23.649-23.66c-0.976-0.977-2.56-0.977-3.536 0l-22.592 22.59c-0.555 0.554-1.512 0.253-1.635-0.496-4.424-27.062 22.101-48.762 47.756-39.02 0.917 0.348 1.958 0.127 2.655-0.569l30.123-30.114c4.689 5.202 13.08 5.897 18.576 0.922 2.348 2.348 5.061 4.84 7.727 9.756l-37.97 37.971c-0.694 0.693-0.918 1.728-0.574 2.646zm157.86 37.844c-6.382 6.39-14.953 9.767-23.877 9.52 5.138-15.823 17.581-28.264 33.404-33.4 0.245 8.807-3.197 17.556-9.527 23.88z"/>
<path d="m245.47 61.29c-1.17-0.65-2.75-0.18-3.4 0.98-0.659 1.21-0.22 2.73 0.98 3.4 1.246 0.672 2.747 0.207 3.4-0.98 0.655-1.189 0.251-2.7-0.98-3.4z"/>
</svg>
<svg clip-rule="evenodd" fill-rule="evenodd" height="6.82666in" image-rendering="optimizeQuality" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" viewBox="0 0 6.82666 6.82666" width="6.82666in" xmlns="http://www.w3.org/2000/svg"><path d="m3.78058 3.28619 1.35743-1.36923.264201-.145.00073228-.00039764.452665-.517402-.282799-.285232-.513031.456598-.00033465.00070079-.143799.266465-1.35837 1.3702.223268.223299" fill="#ddd"/><path d="m5.71585 1.11319.139732.140969-.452634.517433-.00073228.00040158-.264201.145031-1.35746 1.36923-.118433-.118433c.0000315-.00003543 2.05493-2.05583 2.05373-2.05463z" fill="#d1d3d4"/><path d="m0 0h.63539v.425224h-.63539z" fill="#ad1f2c" transform="matrix(.707107 .707107 -.707107 .707107 3.1342 3.24636)"/><path d="m0 0h.97752v2.5033h-.97752z" fill="#be1e2d" transform="matrix(.707107 .707107 -.707107 .707107 2.71258 3.42609)"/><path d="m0 0h.97752v.428894h-.97752z" fill="#be1e2d" transform="matrix(.707107 .707107 -.707107 .707107 3.31652 2.8221)"/><path d="m0 0h.48876v2.5033h-.48876z" fill="#ad1f2c" transform="matrix(.707107 .707107 -.707107 .707107 3.05821 3.77169)"/><path d="m0 0h.317697v.425224h-.317697z" fill="#a11d2b" transform="matrix(.707107 .707107 -.707107 .707107 3.35886 3.47099)"/><path d="m0 0h.48876v.428894h-.48876z" fill="#ad1f2c" transform="matrix(.707107 .707107 -.707107 .707107 3.66214 3.16771)"/><path d="m3.66215 3.16775.118402.118433" fill="#a7a9ac"/><path d="m0 0h.162929v1.93961h-.162929z" fill="#a11d2b" transform="matrix(.707107 .707107 -.707107 .707107 2.79265 3.92203)"/><path d="m0 0h.081465v1.93961h-.081465z" fill="#931a2b" transform="matrix(.707107 .707107 -.707107 .707107 2.85025 3.97963)"/><path d="m4.73271 4.21738-2.12366-2.12309c.111-.305098.0441654-.660268-.200598-.904965-.237567-.2375-.579201-.307465-.878134-.209933l.360598.360531c.130165.130134.130165.341098 0 .471232l-.0801654.0801654c-.130165.130134-.341201.130134-.471335 0l-.360598-.360531c-.0975669.298835-.0275669.640398.209965.877898.244768.244701.600031.3115.905201.200567l2.12363 2.12313c-.111.305098-.0441654.660268.200598.904965.237567.2375.579201.307465.878134.209933l-.360598-.360531c-.130165-.130134-.130165-.341098 0-.471232l.0801654-.0801654c.130165-.130134.341201-.130134.471335 0l.360598.360531c.0975669-.298835.0275669-.640398-.209965-.877898-.244732-.244732-.6-.311531-.905165-.200598z" fill="#dde3e7"/><path d="m4.73271 4.21738-2.12363-2.12309c.111-.305098.0441654-.660268-.200598-.904965-.237567-.2375-.579201-.307465-.878134-.209933l.360598.360531c.130165.130134.130165.341098 0 .471232l-.0399016.0399016 3.12456 3.12456.0402992-.0402677c.130165-.130134.341201-.130134.471335 0l.360598.360531c.0975669-.298835.0275669-.640398-.209965-.877898-.244728-.244732-.599996-.311531-.905161-.200598z" fill="#cacfd1"/><path d="m0 0h6.82666v6.82666h-6.82666z" fill="none"/></svg>

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save