mirror of
https://github.com/arsenetar/dupeguru.git
synced 2026-01-27 17:11:39 +00:00
Compare commits
59 Commits
47dbe805bb
...
4.2.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
c408873d20
|
|||
|
bbcdfbf698
|
|||
|
8cee1a9467
|
|||
|
448d33dcb6
|
|||
|
8d414cadac
|
|||
|
f902ee889a
|
|||
|
bc89e71935
|
|||
|
17b83c8001
|
|||
|
0f845ee67a
|
|||
|
d40e32a143
|
|||
|
1bc206e62d
|
|||
|
106a0feaba
|
|||
|
984e0c4094
|
|||
|
9321e811d7
|
|||
|
a64fcbfb5c
|
|||
|
cff07a12d6
|
|||
|
|
b9c7832c4a | ||
|
b9dfeac2f3
|
|||
| efc99eee96 | |||
|
|
ff7733bb73 | ||
|
4b2fbe87ea
|
|||
| 9e4b41feb5 | |||
|
cbfa8720f1
|
|||
|
a02c5e5b9b
|
|||
|
35e6ffd6af
|
|||
|
e957f840da
|
|||
|
85e22089bd
|
|||
|
b7d68b4458
|
|||
|
8f440603ee
|
|||
|
5d8e559ca3
|
|||
|
2c11eecf97
|
|||
|
02803f738b
|
|||
|
db27e6a645
|
|||
|
c9c35cc60d
|
|||
|
880205dbc8
|
|||
|
6456e64328
|
|||
|
f6a0c0cc6d
|
|||
|
eb57d269fc
|
|||
| 34f41dc522 | |||
|
|
77460045c4 | ||
|
|
9753afba74 | ||
|
|
1ea108fc2b | ||
|
|
2f02a6010d | ||
|
b80489fd66
|
|||
|
1d60e124ee
|
|||
|
e22d7d2fc9
|
|||
|
0a0694e095
|
|||
|
3da9d5d869
|
|||
|
78fb052d77
|
|||
|
9805cba10d
|
|||
|
4c3dfe2f1f
|
|||
|
b0baa5bfd6
|
|||
| 22996ee914 | |||
|
|
31ec9c667f | ||
|
3045361243
|
|||
|
809116c764
|
|||
|
83f401595d
|
|||
|
814d145366
|
|||
|
efb76c7686
|
13
.github/FUNDING.yml
vendored
Normal file
13
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: arsenetar
|
||||
patreon: # Replace with a single Patreon username
|
||||
open_collective: # Replace with a single Open Collective username
|
||||
ko_fi: # Replace with a single Ko-fi username
|
||||
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||
liberapay: # Replace with a single Liberapay username
|
||||
issuehunt: # Replace with a single IssueHunt username
|
||||
otechie: # Replace with a single Otechie username
|
||||
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
|
||||
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
||||
8
.github/workflows/codeql-analysis.yml
vendored
8
.github/workflows/codeql-analysis.yml
vendored
@@ -2,12 +2,12 @@ name: "CodeQL"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
branches: [master]
|
||||
pull_request:
|
||||
# The branches below must be a subset of the branches above
|
||||
branches: [ master ]
|
||||
branches: [master]
|
||||
schedule:
|
||||
- cron: '24 20 * * 2'
|
||||
- cron: "24 20 * * 2"
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
@@ -21,7 +21,7 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
language: [ 'cpp', 'python' ]
|
||||
language: ["cpp", "python"]
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
|
||||
32
.github/workflows/default.yml
vendored
32
.github/workflows/default.yml
vendored
@@ -4,19 +4,19 @@ name: Default CI/CD
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
branches: [master]
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
branches: [master]
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Set up Python 3.9
|
||||
- name: Set up Python 3.10
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: 3.9
|
||||
python-version: "3.10"
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
@@ -28,10 +28,10 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Set up Python 3.9
|
||||
- name: Set up Python 3.10
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: 3.9
|
||||
python-version: "3.10"
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
@@ -45,16 +45,20 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-latest, macos-latest, windows-latest]
|
||||
python-version: [3.6, 3.7, 3.8, 3.9]
|
||||
python-version: [3.7, 3.8, 3.9, "3.10"]
|
||||
exclude:
|
||||
- os: macos-latest
|
||||
python-version: 3.6
|
||||
python-version: 3.7
|
||||
- os: macos-latest
|
||||
python-version: 3.7
|
||||
- os: windows-latest
|
||||
python-version: 3.6
|
||||
python-version: 3.8
|
||||
- os: macos-latest
|
||||
python-version: 3.9
|
||||
- os: windows-latest
|
||||
python-version: 3.7
|
||||
- os: windows-latest
|
||||
python-version: 3.8
|
||||
- os: windows-latest
|
||||
python-version: 3.9
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
@@ -72,3 +76,9 @@ jobs:
|
||||
- name: Run tests
|
||||
run: |
|
||||
pytest core hscommon
|
||||
- name: Upload Artifacts
|
||||
if: matrix.os == 'ubuntu-latest'
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: modules ${{ matrix.python-version }}
|
||||
path: ${{ github.workspace }}/**/*.so
|
||||
|
||||
124
.gitignore
vendored
124
.gitignore
vendored
@@ -1,29 +1,111 @@
|
||||
.DS_Store
|
||||
__pycache__
|
||||
*.egg-info
|
||||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
|
||||
# C extensions
|
||||
*.so
|
||||
|
||||
# Distribution / packaging
|
||||
.Python
|
||||
build/
|
||||
develop-eggs/
|
||||
dist/
|
||||
downloads/
|
||||
eggs/
|
||||
.eggs/
|
||||
lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
var/
|
||||
wheels/
|
||||
share/python-wheels/
|
||||
*.egg-info/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
MANIFEST
|
||||
|
||||
# PyInstaller
|
||||
# Usually these files are written by a python script from a template
|
||||
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||
*.manifest
|
||||
*.spec
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
pip-delete-this-directory.txt
|
||||
|
||||
# Unit test / coverage reports
|
||||
htmlcov/
|
||||
.tox/
|
||||
.nox/
|
||||
.coverage
|
||||
.coverage.*
|
||||
.cache
|
||||
nosetests.xml
|
||||
coverage.xml
|
||||
*.cover
|
||||
*.py,cover
|
||||
.hypothesis/
|
||||
.pytest_cache/
|
||||
cover/
|
||||
|
||||
# Translations
|
||||
*.mo
|
||||
*.waf*
|
||||
.lock-waf*
|
||||
.tox
|
||||
/tags
|
||||
#*.pot
|
||||
|
||||
build
|
||||
dist
|
||||
env*
|
||||
/deps
|
||||
cocoa/autogen
|
||||
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
|
||||
__pypackages__/
|
||||
|
||||
/run.py
|
||||
/cocoa/*/Info.plist
|
||||
/cocoa/*/build
|
||||
# Environments
|
||||
.env
|
||||
.venv
|
||||
env*/
|
||||
venv/
|
||||
ENV/
|
||||
env.bak/
|
||||
venv.bak/
|
||||
|
||||
# mypy
|
||||
.mypy_cache/
|
||||
.dmypy.json
|
||||
dmypy.json
|
||||
|
||||
# Pyre type checker
|
||||
.pyre/
|
||||
|
||||
# pytype static type analyzer
|
||||
.pytype/
|
||||
|
||||
# Cython debug symbols
|
||||
cython_debug/
|
||||
|
||||
# macOS
|
||||
.DS_Store
|
||||
|
||||
# Visual Studio Code
|
||||
.vscode/*
|
||||
!.vscode/settings.json
|
||||
#!.vscode/tasks.json
|
||||
#!.vscode/launch.json
|
||||
!.vscode/extensions.json
|
||||
!.vscode/*.code-snippets
|
||||
|
||||
# Local History for Visual Studio Code
|
||||
.history/
|
||||
|
||||
# Built Visual Studio Code Extensions
|
||||
*.vsix
|
||||
|
||||
# dupeGuru Specific
|
||||
/qt/*_rc.py
|
||||
/help/*/conf.py
|
||||
/help/*/changelog.rst
|
||||
/transifex
|
||||
cocoa/autogen
|
||||
/cocoa/*/Info.plist
|
||||
/cocoa/*/build
|
||||
|
||||
*.pyd
|
||||
*.exe
|
||||
*.spec
|
||||
|
||||
.vscode
|
||||
*.waf*
|
||||
.lock-waf*
|
||||
/tags
|
||||
1
.sonarcloud.properties
Normal file
1
.sonarcloud.properties
Normal file
@@ -0,0 +1 @@
|
||||
sonar.python.version=3.7, 3.8, 3.9, 3.10
|
||||
27
.tx/config
27
.tx/config
@@ -1,26 +1,27 @@
|
||||
[main]
|
||||
host = https://www.transifex.com
|
||||
|
||||
[dupeguru-1.core]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/core.po
|
||||
source_file = locale/core.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[dupeguru-1.columns]
|
||||
[o:voltaicideas:p:dupeguru-1:r:columns]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/columns.po
|
||||
source_file = locale/columns.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[dupeguru-1.ui]
|
||||
[o:voltaicideas:p:dupeguru-1:r:core]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/core.po
|
||||
source_file = locale/core.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[o:voltaicideas:p:dupeguru-1:r:qtlib]
|
||||
file_filter = qtlib/locale/<lang>/LC_MESSAGES/qtlib.po
|
||||
source_file = qtlib/locale/qtlib.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[o:voltaicideas:p:dupeguru-1:r:ui]
|
||||
file_filter = locale/<lang>/LC_MESSAGES/ui.po
|
||||
source_file = locale/ui.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[dupeguru-1.qtlib]
|
||||
file_filter = qtlib/locale/<lang>/LC_MESSAGES/qtlib.po
|
||||
source_file = qtlib/locale/qtlib.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
10
.vscode/extensions.json
vendored
Normal file
10
.vscode/extensions.json
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
// List of extensions which should be recommended for users of this workspace.
|
||||
"recommendations": [
|
||||
"redhat.vscode-yaml",
|
||||
"ms-python.vscode-pylance",
|
||||
"ms-python.python"
|
||||
],
|
||||
// List of extensions recommended by VS Code that should not be recommended for users of this workspace.
|
||||
"unwantedRecommendations": []
|
||||
}
|
||||
12
.vscode/settings.json
vendored
Normal file
12
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"python.formatting.provider": "black",
|
||||
"cSpell.words": [
|
||||
"Dupras",
|
||||
"hscommon"
|
||||
],
|
||||
"python.languageServer": "Pylance",
|
||||
"yaml.schemaStore.enable": true,
|
||||
"yaml.schemas": {
|
||||
"https://json.schemastore.org/github-workflow.json": ".github/workflows/*.yml"
|
||||
}
|
||||
}
|
||||
88
CONTRIBUTING.md
Normal file
88
CONTRIBUTING.md
Normal file
@@ -0,0 +1,88 @@
|
||||
# Contributing to dupeGuru
|
||||
|
||||
The following is a set of guidelines and information for contributing to dupeGuru.
|
||||
|
||||
#### Table of Contents
|
||||
|
||||
[Things to Know Before Starting](#things-to-know-before-starting)
|
||||
|
||||
[Ways to Contribute](#ways-to-contribute)
|
||||
* [Reporting Bugs](#reporting-bugs)
|
||||
* [Suggesting Enhancements](#suggesting-enhancements)
|
||||
* [Localization](#localization)
|
||||
* [Code Contribution](#code-contribution)
|
||||
* [Pull Requests](#pull-requests)
|
||||
|
||||
[Style Guides](#style-guides)
|
||||
* [Git Commit Messages](#git-commit-messages)
|
||||
* [Python Style Guide](#python-style-guide)
|
||||
* [Documentation Style Guide](#documentation-style-guide)
|
||||
|
||||
[Additional Notes](#additional-notes)
|
||||
* [Issue and Pull Request Labels](#issue-and-pull-request-labels)
|
||||
|
||||
## Things to Know Before Starting
|
||||
**TODO**
|
||||
## Ways to contribute
|
||||
### Reporting Bugs
|
||||
**TODO**
|
||||
### Suggesting Enhancements
|
||||
**TODO**
|
||||
### Localization
|
||||
**TODO**
|
||||
### Code Contribution
|
||||
**TODO**
|
||||
### Pull Requests
|
||||
Please follow these steps to have your contribution considered by the maintainers:
|
||||
|
||||
1. Keep Pull Request specific to one feature or bug.
|
||||
2. Follow the [style guides](#style-guides)
|
||||
3. After you submit your pull request, verify that all [status checks](https://help.github.com/articles/about-status-checks/) are passing <details><summary>What if the status checks are failing?</summary>If a status check is failing, and you believe that the failure is unrelated to your change, please leave a comment on the pull request explaining why you believe the failure is unrelated. A maintainer will re-run the status check for you. If we conclude that the failure was a false positive, then we will open an issue to track that problem with our status check suite.</details>
|
||||
|
||||
While the prerequisites above must be satisfied prior to having your pull request reviewed, the reviewer(s) may ask you to complete additional design work, tests, or other changes before your pull request can be ultimately accepted.
|
||||
|
||||
## Style Guides
|
||||
### Git Commit Messages
|
||||
- Use the present tense ("Add feature" not "Added feature")
|
||||
- Use the imperative mood ("Move cursor to..." not "Moves cursor to...")
|
||||
- Limit the first line to 72 characters or less
|
||||
- Reference issues and pull requests liberally after the first line
|
||||
|
||||
### Python Style Guide
|
||||
- All files are formatted with [Black](https://github.com/psf/black)
|
||||
- Follow [PEP 8](https://peps.python.org/pep-0008/) as much as practical
|
||||
- Pass [flake8](https://flake8.pycqa.org/en/latest/) linting
|
||||
- Include [PEP 484](https://peps.python.org/pep-0484/) type hints (new code)
|
||||
|
||||
### Documentation Style Guide
|
||||
**TODO**
|
||||
|
||||
## Additional Notes
|
||||
### Issue and Pull Request Labels
|
||||
This section lists and describes the various labels used with issues and pull requests. Each of the labels is listed with a search link as well.
|
||||
|
||||
#### Issue Type and Status
|
||||
| Label name | Search | Description |
|
||||
|------------|--------|-------------|
|
||||
| `enhancement` | [search](https://github.com/arsenetar/dupeguru/issues?q=is%3Aopen+is%3Aissue+label%3Aenhancement) | Feature requests and enhancements. |
|
||||
| `bug` | [search](https://github.com/arsenetar/dupeguru/issues?q=is%3Aopen+is%3Aissue+label%3Abug) | Bug reports. |
|
||||
| `duplicate` | [search](https://github.com/arsenetar/dupeguru/issues?q=is%3Aopen+is%3Aissue+label%3Aduplicate) | Issue is a duplicate of existing issue. |
|
||||
| `needs-reproduction` | [search](https://github.com/arsenetar/dupeguru/issues?q=is%3Aopen+is%3Aissue+label%3Aneeds-reproduction) | A bug that has not been able to be reproduced. |
|
||||
| `needs-information` | [search](https://github.com/arsenetar/dupeguru/issues?q=is%3Aopen+is%3Aissue+label%3Aneeds-information) | More information needs to be collected about these problems or feature requests (e.g. steps to reproduce). |
|
||||
| `blocked` | [search](https://github.com/arsenetar/dupeguru/issues?q=is%3Aopen+is%3Aissue+label%3Ablocked) | Issue blocked by other issues. |
|
||||
| `beginner` | [search](https://github.com/arsenetar/dupeguru/issues?q=is%3Aopen+is%3Aissue+label%3Abeginner) | Less complex issues for users who want to start contributing. |
|
||||
|
||||
#### Category Labels
|
||||
| Label name | Search | Description |
|
||||
|------------|--------|-------------|
|
||||
| `3rd party` | [search](https://github.com/arsenetar/dupeguru/issues?q=is%3Aopen+is%3Aissue+label%3A%223rd%20party%22) | Related to a 3rd party dependency. |
|
||||
| `crash` | [search](https://github.com/arsenetar/dupeguru/issues?q=is%3Aopen+is%3Aissue+label%3Acrash) | Related to crashes (complete, or unhandled). |
|
||||
| `documentation` | [search](https://github.com/arsenetar/dupeguru/issues?q=is%3Aopen+is%3Aissue+label%3Adocumentation) | Related to any documentation. |
|
||||
| `linux` | [search](https://github.com/arsenetar/dupeguru/issues?q=is%3Aopen+is%3Aissue+label%3linux) | Related to running on Linux. |
|
||||
| `mac` | [search](https://github.com/arsenetar/dupeguru/issues?q=is%3Aopen+is%3Aissue+label%3Amac) | Related to running on macOS. |
|
||||
| `performance` | [search](https://github.com/arsenetar/dupeguru/issues?q=is%3Aopen+is%3Aissue+label%3Aperformance) | Related to the performance. |
|
||||
| `ui` | [search](https://github.com/arsenetar/dupeguru/issues?q=is%3Aopen+is%3Aissue+label%3Aui)| Related to the visual design. |
|
||||
| `windows` | [search](https://github.com/arsenetar/dupeguru/issues?q=is%3Aopen+is%3Aissue+label%3Awindows) | Related to running on Windows. |
|
||||
|
||||
#### Pull Request Labels
|
||||
None at this time, if the volume of Pull Requests increase labels may be added to manage.
|
||||
@@ -1,3 +1,6 @@
|
||||
recursive-include core *.h
|
||||
recursive-include core *.m
|
||||
include run.py
|
||||
graft locale
|
||||
graft help
|
||||
graft qtlib/locale
|
||||
4
Makefile
4
Makefile
@@ -1,7 +1,7 @@
|
||||
PYTHON ?= python3
|
||||
PYTHON_VERSION_MINOR := $(shell ${PYTHON} -c "import sys; print(sys.version_info.minor)")
|
||||
PYRCC5 ?= pyrcc5
|
||||
REQ_MINOR_VERSION = 6
|
||||
REQ_MINOR_VERSION = 7
|
||||
PREFIX ?= /usr/local
|
||||
|
||||
# Window compatability via Msys2
|
||||
@@ -53,7 +53,7 @@ pyc: | env
|
||||
${VENV_PYTHON} -m compileall ${packages}
|
||||
|
||||
reqs:
|
||||
ifneq ($(shell test $(PYTHON_VERSION_MINOR) -gt $(REQ_MINOR_VERSION); echo $$?),0)
|
||||
ifneq ($(shell test $(PYTHON_VERSION_MINOR) -ge $(REQ_MINOR_VERSION); echo $$?),0)
|
||||
$(error "Python 3.${REQ_MINOR_VERSION}+ required. Aborting.")
|
||||
endif
|
||||
ifndef NO_VENV
|
||||
|
||||
@@ -36,7 +36,7 @@ For windows instructions see the [Windows Instructions](Windows.md).
|
||||
For macos instructions (qt version) see the [macOS Instructions](macos.md).
|
||||
|
||||
### Prerequisites
|
||||
* [Python 3.6+][python]
|
||||
* [Python 3.7+][python]
|
||||
* PyQt5
|
||||
|
||||
### System Setup
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- [Python 3.6+][python]
|
||||
- [Python 3.7+][python]
|
||||
- [Visual Studio 2019][vs] or [Visual Studio Build Tools 2019][vsBuildTools] with the Windows 10 SDK
|
||||
- [nsis][nsis] (for installer creation)
|
||||
- [msys2][msys2] (for using makefile method)
|
||||
@@ -16,7 +16,7 @@ After installing python it is recommended to update setuptools before compiling
|
||||
More details on setting up python for compiling packages on windows can be found on the [python wiki][pythonWindowsCompilers] Take note of the required vc++ versions.
|
||||
|
||||
### With build.py (preferred)
|
||||
To build with a different python version 3.6 vs 3.8 or 32 bit vs 64 bit specify that version instead of -3.8 to the `py` command below. If you want to build additional versions while keeping all virtual environments setup use a different location for each virtual environment.
|
||||
To build with a different python version 3.7 vs 3.8 or 32 bit vs 64 bit specify that version instead of -3.8 to the `py` command below. If you want to build additional versions while keeping all virtual environments setup use a different location for each virtual environment.
|
||||
|
||||
$ cd <dupeGuru directory>
|
||||
$ py -3.8 -m venv .\env
|
||||
|
||||
104
build.py
104
build.py
@@ -4,19 +4,17 @@
|
||||
# which should be included with this package. The terms are also available at
|
||||
# http://www.gnu.org/licenses/gpl-3.0.html
|
||||
|
||||
import os
|
||||
import os.path as op
|
||||
from pathlib import Path
|
||||
import sys
|
||||
from optparse import OptionParser
|
||||
import shutil
|
||||
from multiprocessing import Pool
|
||||
|
||||
from setuptools import setup, Extension
|
||||
|
||||
from setuptools import sandbox
|
||||
from hscommon import sphinxgen
|
||||
from hscommon.build import (
|
||||
add_to_pythonpath,
|
||||
print_and_do,
|
||||
move_all,
|
||||
fix_qt_resource_file,
|
||||
)
|
||||
from hscommon import loc
|
||||
@@ -31,7 +29,8 @@ def parse_args():
|
||||
dest="clean",
|
||||
help="Clean build folder before building",
|
||||
)
|
||||
parser.add_option("--doc", action="store_true", dest="doc", help="Build only the help file")
|
||||
parser.add_option("--doc", action="store_true", dest="doc", help="Build only the help file (en)")
|
||||
parser.add_option("--alldoc", action="store_true", dest="all_doc", help="Build only the help file in all languages")
|
||||
parser.add_option("--loc", action="store_true", dest="loc", help="Build only localization")
|
||||
parser.add_option(
|
||||
"--updatepot",
|
||||
@@ -61,16 +60,16 @@ def parse_args():
|
||||
return options
|
||||
|
||||
|
||||
def build_help():
|
||||
print("Generating Help")
|
||||
current_path = op.abspath(".")
|
||||
help_basepath = op.join(current_path, "help", "en")
|
||||
help_destpath = op.join(current_path, "build", "help")
|
||||
changelog_path = op.join(current_path, "help", "changelog")
|
||||
def build_one_help(language):
|
||||
print("Generating Help in {}".format(language))
|
||||
current_path = Path(".").absolute()
|
||||
changelog_path = current_path.joinpath("help", "changelog")
|
||||
tixurl = "https://github.com/arsenetar/dupeguru/issues/{}"
|
||||
confrepl = {"language": "en"}
|
||||
changelogtmpl = op.join(current_path, "help", "changelog.tmpl")
|
||||
conftmpl = op.join(current_path, "help", "conf.tmpl")
|
||||
changelogtmpl = current_path.joinpath("help", "changelog.tmpl")
|
||||
conftmpl = current_path.joinpath("help", "conf.tmpl")
|
||||
help_basepath = current_path.joinpath("help", language)
|
||||
help_destpath = current_path.joinpath("build", "help", language)
|
||||
confrepl = {"language": language}
|
||||
sphinxgen.gen(
|
||||
help_basepath,
|
||||
help_destpath,
|
||||
@@ -82,16 +81,23 @@ def build_help():
|
||||
)
|
||||
|
||||
|
||||
def build_help():
|
||||
languages = ["en", "de", "fr", "hy", "ru", "uk"]
|
||||
# Running with Pools as for some reason sphinx seems to cross contaminate the output otherwise
|
||||
with Pool(len(languages)) as p:
|
||||
p.map(build_one_help, languages)
|
||||
|
||||
|
||||
def build_qt_localizations():
|
||||
loc.compile_all_po(op.join("qtlib", "locale"))
|
||||
loc.merge_locale_dir(op.join("qtlib", "locale"), "locale")
|
||||
loc.compile_all_po(Path("qtlib", "locale"))
|
||||
loc.merge_locale_dir(Path("qtlib", "locale"), "locale")
|
||||
|
||||
|
||||
def build_localizations():
|
||||
loc.compile_all_po("locale")
|
||||
build_qt_localizations()
|
||||
locale_dest = op.join("build", "locale")
|
||||
if op.exists(locale_dest):
|
||||
locale_dest = Path("build", "locale")
|
||||
if locale_dest.exists():
|
||||
shutil.rmtree(locale_dest)
|
||||
shutil.copytree("locale", locale_dest, ignore=shutil.ignore_patterns("*.po", "*.pot"))
|
||||
|
||||
@@ -99,57 +105,35 @@ def build_localizations():
|
||||
def build_updatepot():
|
||||
print("Building .pot files from source files")
|
||||
print("Building core.pot")
|
||||
loc.generate_pot(["core"], op.join("locale", "core.pot"), ["tr"])
|
||||
loc.generate_pot(["core"], Path("locale", "core.pot"), ["tr"])
|
||||
print("Building columns.pot")
|
||||
loc.generate_pot(["core"], op.join("locale", "columns.pot"), ["coltr"])
|
||||
loc.generate_pot(["core"], Path("locale", "columns.pot"), ["coltr"])
|
||||
print("Building ui.pot")
|
||||
# When we're not under OS X, we don't want to overwrite ui.pot because it contains Cocoa locs
|
||||
# We want to merge the generated pot with the old pot in the most preserving way possible.
|
||||
ui_packages = ["qt", op.join("cocoa", "inter")]
|
||||
loc.generate_pot(ui_packages, op.join("locale", "ui.pot"), ["tr"], merge=True)
|
||||
ui_packages = ["qt", Path("cocoa", "inter")]
|
||||
loc.generate_pot(ui_packages, Path("locale", "ui.pot"), ["tr"], merge=True)
|
||||
print("Building qtlib.pot")
|
||||
loc.generate_pot(["qtlib"], op.join("qtlib", "locale", "qtlib.pot"), ["tr"])
|
||||
loc.generate_pot(["qtlib"], Path("qtlib", "locale", "qtlib.pot"), ["tr"])
|
||||
|
||||
|
||||
def build_mergepot():
|
||||
print("Updating .po files using .pot files")
|
||||
loc.merge_pots_into_pos("locale")
|
||||
loc.merge_pots_into_pos(op.join("qtlib", "locale"))
|
||||
# loc.merge_pots_into_pos(op.join("cocoalib", "locale"))
|
||||
loc.merge_pots_into_pos(Path("qtlib", "locale"))
|
||||
# loc.merge_pots_into_pos(Path("cocoalib", "locale"))
|
||||
|
||||
|
||||
def build_normpo():
|
||||
loc.normalize_all_pos("locale")
|
||||
loc.normalize_all_pos(op.join("qtlib", "locale"))
|
||||
# loc.normalize_all_pos(op.join("cocoalib", "locale"))
|
||||
loc.normalize_all_pos(Path("qtlib", "locale"))
|
||||
# loc.normalize_all_pos(Path("cocoalib", "locale"))
|
||||
|
||||
|
||||
def build_pe_modules():
|
||||
print("Building PE Modules")
|
||||
exts = [
|
||||
Extension(
|
||||
"_block",
|
||||
[
|
||||
op.join("core", "pe", "modules", "block.c"),
|
||||
op.join("core", "pe", "modules", "common.c"),
|
||||
],
|
||||
),
|
||||
Extension(
|
||||
"_cache",
|
||||
[
|
||||
op.join("core", "pe", "modules", "cache.c"),
|
||||
op.join("core", "pe", "modules", "common.c"),
|
||||
],
|
||||
),
|
||||
]
|
||||
exts.append(Extension("_block_qt", [op.join("qt", "pe", "modules", "block.c")]))
|
||||
setup(
|
||||
script_args=["build_ext", "--inplace"],
|
||||
ext_modules=exts,
|
||||
)
|
||||
move_all("_block_qt*", op.join("qt", "pe"))
|
||||
move_all("_block*", op.join("core", "pe"))
|
||||
move_all("_cache*", op.join("core", "pe"))
|
||||
# Leverage setup.py to build modules
|
||||
sandbox.run_setup("setup.py", ["build_ext", "--inplace"])
|
||||
|
||||
|
||||
def build_normal():
|
||||
@@ -160,20 +144,22 @@ def build_normal():
|
||||
print("Building localizations")
|
||||
build_localizations()
|
||||
print("Building Qt stuff")
|
||||
print_and_do("pyrcc5 {0} > {1}".format(op.join("qt", "dg.qrc"), op.join("qt", "dg_rc.py")))
|
||||
fix_qt_resource_file(op.join("qt", "dg_rc.py"))
|
||||
print_and_do("pyrcc5 {0} > {1}".format(Path("qt", "dg.qrc"), Path("qt", "dg_rc.py")))
|
||||
fix_qt_resource_file(Path("qt", "dg_rc.py"))
|
||||
build_help()
|
||||
|
||||
|
||||
def main():
|
||||
if sys.version_info < (3, 6):
|
||||
sys.exit("Python < 3.6 is unsupported.")
|
||||
if sys.version_info < (3, 7):
|
||||
sys.exit("Python < 3.7 is unsupported.")
|
||||
options = parse_args()
|
||||
if options.clean and op.exists("build"):
|
||||
if options.clean and Path("build").exists():
|
||||
shutil.rmtree("build")
|
||||
if not op.exists("build"):
|
||||
os.mkdir("build")
|
||||
if not Path("build").exists():
|
||||
Path("build").mkdir()
|
||||
if options.doc:
|
||||
build_one_help("en")
|
||||
elif options.all_doc:
|
||||
build_help()
|
||||
elif options.loc:
|
||||
build_localizations()
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
__version__ = "4.1.1"
|
||||
__version__ = "4.2.1"
|
||||
__appname__ = "dupeGuru"
|
||||
|
||||
36
core/app.py
36
core/app.py
@@ -138,6 +138,8 @@ class DupeGuru(Broadcaster):
|
||||
self.app_mode = AppMode.STANDARD
|
||||
self.discarded_file_count = 0
|
||||
self.exclude_list = ExcludeList()
|
||||
hash_cache_file = op.join(self.appdata, "hash_cache.db")
|
||||
fs.filesdb.connect(hash_cache_file)
|
||||
self.directories = directories.Directories(self.exclude_list)
|
||||
self.results = results.Results(self)
|
||||
self.ignore_list = IgnoreList()
|
||||
@@ -293,6 +295,7 @@ class DupeGuru(Broadcaster):
|
||||
def _job_completed(self, jobid):
|
||||
if jobid == JobType.SCAN:
|
||||
self._results_changed()
|
||||
fs.filesdb.commit()
|
||||
if not self.results.groups:
|
||||
self.view.show_message(tr("No duplicates found."))
|
||||
else:
|
||||
@@ -308,11 +311,14 @@ class DupeGuru(Broadcaster):
|
||||
self.problem_dialog.refresh()
|
||||
self.view.show_problem_dialog()
|
||||
else:
|
||||
msg = {
|
||||
JobType.COPY: tr("All marked files were copied successfully."),
|
||||
JobType.MOVE: tr("All marked files were moved successfully."),
|
||||
JobType.DELETE: tr("All marked files were successfully sent to Trash."),
|
||||
}[jobid]
|
||||
if jobid == JobType.COPY:
|
||||
msg = tr("All marked files were copied successfully.")
|
||||
elif jobid == JobType.MOVE:
|
||||
msg = tr("All marked files were moved successfully.")
|
||||
elif jobid == JobType.DELETE and self.deletion_options.direct:
|
||||
msg = tr("All marked files were deleted successfully.")
|
||||
else:
|
||||
msg = tr("All marked files were successfully sent to Trash.")
|
||||
self.view.show_message(msg)
|
||||
|
||||
def _job_error(self, jobid, err):
|
||||
@@ -417,6 +423,9 @@ class DupeGuru(Broadcaster):
|
||||
except FileNotFoundError:
|
||||
pass # we don't care
|
||||
|
||||
def clear_hash_cache(self):
|
||||
fs.filesdb.clear()
|
||||
|
||||
def copy_or_move(self, dupe, copy: bool, destination: str, dest_type: DestType):
|
||||
source_path = dupe.path
|
||||
location_path = first(p for p in self.directories if dupe.path in p)
|
||||
@@ -532,12 +541,12 @@ class DupeGuru(Broadcaster):
|
||||
return
|
||||
if not self.selected_dupes:
|
||||
return
|
||||
dupe = self.selected_dupes[0]
|
||||
group = self.results.get_group_of_duplicate(dupe)
|
||||
ref = group.ref
|
||||
cmd = cmd.replace("%d", str(dupe.path))
|
||||
cmd = cmd.replace("%r", str(ref.path))
|
||||
match = re.match(r'"([^"]+)"(.*)', cmd)
|
||||
dupes = self.selected_dupes
|
||||
refs = [self.results.get_group_of_duplicate(dupe).ref for dupe in dupes]
|
||||
for dupe, ref in zip(dupes, refs):
|
||||
dupe_cmd = cmd.replace("%d", str(dupe.path))
|
||||
dupe_cmd = dupe_cmd.replace("%r", str(ref.path))
|
||||
match = re.match(r'"([^"]+)"(.*)', dupe_cmd)
|
||||
if match is not None:
|
||||
# This code here is because subprocess. Popen doesn't seem to accept, under Windows,
|
||||
# executable paths with spaces in it, *even* when they're enclosed in "". So this is
|
||||
@@ -546,7 +555,7 @@ class DupeGuru(Broadcaster):
|
||||
path, exename = op.split(exepath)
|
||||
subprocess.Popen(exename + args, shell=True, cwd=path)
|
||||
else:
|
||||
subprocess.Popen(cmd, shell=True)
|
||||
subprocess.Popen(dupe_cmd, shell=True)
|
||||
|
||||
def load(self):
|
||||
"""Load directory selection and ignore list from files in appdata.
|
||||
@@ -748,6 +757,9 @@ class DupeGuru(Broadcaster):
|
||||
self.exclude_list.save_to_xml(p)
|
||||
self.notify("save_session")
|
||||
|
||||
def close(self):
|
||||
fs.filesdb.close()
|
||||
|
||||
def save_as(self, filename):
|
||||
"""Save results in ``filename``.
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ import logging
|
||||
from hscommon.jobprogress import job
|
||||
from hscommon.path import Path
|
||||
from hscommon.util import FileOrPath
|
||||
from hscommon.trans import tr
|
||||
|
||||
from . import fs
|
||||
|
||||
@@ -182,8 +183,12 @@ class Directories:
|
||||
"""
|
||||
if fileclasses is None:
|
||||
fileclasses = [fs.File]
|
||||
file_count = 0
|
||||
for path in self._dirs:
|
||||
for file in self._get_files(path, fileclasses=fileclasses, j=j):
|
||||
file_count += 1
|
||||
if type(j) != job.NullJob:
|
||||
j.set_progress(-1, tr("Collected {} files to scan").format(file_count))
|
||||
yield file
|
||||
|
||||
def get_folders(self, folderclass=None, j=job.nulljob):
|
||||
@@ -193,9 +198,13 @@ class Directories:
|
||||
"""
|
||||
if folderclass is None:
|
||||
folderclass = fs.Folder
|
||||
folder_count = 0
|
||||
for path in self._dirs:
|
||||
from_folder = folderclass(path)
|
||||
for folder in self._get_folders(from_folder, j):
|
||||
folder_count += 1
|
||||
if type(j) != job.NullJob:
|
||||
j.set_progress(-1, tr("Collected {} folders to scan").format(folder_count))
|
||||
yield folder
|
||||
|
||||
def get_state(self, path):
|
||||
|
||||
@@ -24,6 +24,7 @@ from hscommon.jobprogress import job
|
||||
) = range(3)
|
||||
|
||||
JOB_REFRESH_RATE = 100
|
||||
PROGRESS_MESSAGE = tr("%d matches found from %d groups")
|
||||
|
||||
|
||||
def getwords(s):
|
||||
@@ -248,10 +249,11 @@ def getmatches(
|
||||
match_flags.append(MATCH_SIMILAR_WORDS)
|
||||
if no_field_order:
|
||||
match_flags.append(NO_FIELD_ORDER)
|
||||
j.start_job(len(word_dict), tr("0 matches found"))
|
||||
j.start_job(len(word_dict), PROGRESS_MESSAGE % (0, 0))
|
||||
compared = defaultdict(set)
|
||||
result = []
|
||||
try:
|
||||
word_count = 0
|
||||
# This whole 'popping' thing is there to avoid taking too much memory at the same time.
|
||||
while word_dict:
|
||||
items = word_dict.popitem()[1]
|
||||
@@ -266,7 +268,8 @@ def getmatches(
|
||||
result.append(m)
|
||||
if len(result) >= LIMIT:
|
||||
return result
|
||||
j.add_progress(desc=tr("%d matches found") % len(result))
|
||||
word_count += 1
|
||||
j.add_progress(desc=PROGRESS_MESSAGE % (len(result), word_count))
|
||||
except MemoryError:
|
||||
# This is the place where the memory usage is at its peak during the scan.
|
||||
# Just continue the process with an incomplete list of matches.
|
||||
@@ -285,17 +288,21 @@ def getmatches_by_contents(files, bigsize=0, j=job.nulljob):
|
||||
"""
|
||||
size2files = defaultdict(set)
|
||||
for f in files:
|
||||
if f.size:
|
||||
size2files[f.size].add(f)
|
||||
del files
|
||||
possible_matches = [files for files in size2files.values() if len(files) > 1]
|
||||
del size2files
|
||||
result = []
|
||||
j.start_job(len(possible_matches), tr("0 matches found"))
|
||||
j.start_job(len(possible_matches), PROGRESS_MESSAGE % (0, 0))
|
||||
group_count = 0
|
||||
for group in possible_matches:
|
||||
for first, second in itertools.combinations(group, 2):
|
||||
if first.is_ref and second.is_ref:
|
||||
continue # Don't spend time comparing two ref pics together.
|
||||
if first.size == 0 and second.size == 0:
|
||||
# skip md5 for zero length files
|
||||
result.append(Match(first, second, 100))
|
||||
continue
|
||||
if first.md5partial == second.md5partial:
|
||||
if bigsize > 0 and first.size > bigsize:
|
||||
if first.md5samples == second.md5samples:
|
||||
@@ -303,7 +310,8 @@ def getmatches_by_contents(files, bigsize=0, j=job.nulljob):
|
||||
else:
|
||||
if first.md5 == second.md5:
|
||||
result.append(Match(first, second, 100))
|
||||
j.add_progress(desc=tr("%d matches found") % len(result))
|
||||
group_count += 1
|
||||
j.add_progress(desc=PROGRESS_MESSAGE % (len(result), group_count))
|
||||
return result
|
||||
|
||||
|
||||
|
||||
@@ -507,7 +507,6 @@ if ISWINDOWS:
|
||||
def has_sep(regexp):
|
||||
return "\\" + sep in regexp
|
||||
|
||||
|
||||
else:
|
||||
|
||||
def has_sep(regexp):
|
||||
|
||||
138
core/fs.py
138
core/fs.py
@@ -14,7 +14,11 @@
|
||||
import hashlib
|
||||
from math import floor
|
||||
import logging
|
||||
import sqlite3
|
||||
from threading import Lock
|
||||
from typing import Any
|
||||
|
||||
from hscommon.path import Path
|
||||
from hscommon.util import nonone, get_file_ext
|
||||
|
||||
__all__ = [
|
||||
@@ -78,6 +82,82 @@ class OperationError(FSError):
|
||||
cls_message = "Operation on '{name}' failed."
|
||||
|
||||
|
||||
class FilesDB:
|
||||
|
||||
create_table_query = "CREATE TABLE IF NOT EXISTS files (path TEXT PRIMARY KEY, size INTEGER, mtime_ns INTEGER, entry_dt DATETIME, md5 BLOB, md5partial BLOB)"
|
||||
drop_table_query = "DROP TABLE files;"
|
||||
select_query = "SELECT {key} FROM files WHERE path=:path AND size=:size and mtime_ns=:mtime_ns"
|
||||
insert_query = """
|
||||
INSERT INTO files (path, size, mtime_ns, entry_dt, {key}) VALUES (:path, :size, :mtime_ns, datetime('now'), :value)
|
||||
ON CONFLICT(path) DO UPDATE SET size=:size, mtime_ns=:mtime_ns, entry_dt=datetime('now'), {key}=:value;
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
self.conn = None
|
||||
self.cur = None
|
||||
self.lock = None
|
||||
|
||||
def connect(self, path):
|
||||
# type: (str, ) -> None
|
||||
|
||||
self.conn = sqlite3.connect(path, check_same_thread=False)
|
||||
self.cur = self.conn.cursor()
|
||||
self.cur.execute(self.create_table_query)
|
||||
self.lock = Lock()
|
||||
|
||||
def clear(self):
|
||||
# type: () -> None
|
||||
|
||||
with self.lock:
|
||||
self.cur.execute(self.drop_table_query)
|
||||
self.cur.execute(self.create_table_query)
|
||||
|
||||
def get(self, path, key):
|
||||
# type: (Path, str) -> bytes
|
||||
|
||||
stat = path.stat()
|
||||
size = stat.st_size
|
||||
mtime_ns = stat.st_mtime_ns
|
||||
|
||||
with self.lock:
|
||||
self.cur.execute(self.select_query.format(key=key), {"path": str(path), "size": size, "mtime_ns": mtime_ns})
|
||||
result = self.cur.fetchone()
|
||||
|
||||
if result:
|
||||
return result[0]
|
||||
|
||||
return None
|
||||
|
||||
def put(self, path, key, value):
|
||||
# type: (Path, str, Any) -> None
|
||||
|
||||
stat = path.stat()
|
||||
size = stat.st_size
|
||||
mtime_ns = stat.st_mtime_ns
|
||||
|
||||
with self.lock:
|
||||
self.cur.execute(
|
||||
self.insert_query.format(key=key),
|
||||
{"path": str(path), "size": size, "mtime_ns": mtime_ns, "value": value},
|
||||
)
|
||||
|
||||
def commit(self):
|
||||
# type: () -> None
|
||||
|
||||
with self.lock:
|
||||
self.conn.commit()
|
||||
|
||||
def close(self):
|
||||
# type: () -> None
|
||||
|
||||
with self.lock:
|
||||
self.cur.close()
|
||||
self.conn.close()
|
||||
|
||||
|
||||
filesdb = FilesDB() # Singleton
|
||||
|
||||
|
||||
class File:
|
||||
"""Represents a file and holds metadata to be used for scanning."""
|
||||
|
||||
@@ -107,10 +187,32 @@ class File:
|
||||
result = self.INITIAL_INFO[attrname]
|
||||
return result
|
||||
|
||||
def _calc_md5(self):
|
||||
# type: () -> bytes
|
||||
|
||||
with self.path.open("rb") as fp:
|
||||
md5 = hashlib.md5()
|
||||
# The goal here is to not run out of memory on really big files. However, the chunk
|
||||
# size has to be large enough so that the python loop isn't too costly in terms of
|
||||
# CPU.
|
||||
CHUNK_SIZE = 1024 * 1024 # 1 mb
|
||||
filedata = fp.read(CHUNK_SIZE)
|
||||
while filedata:
|
||||
md5.update(filedata)
|
||||
filedata = fp.read(CHUNK_SIZE)
|
||||
return md5.digest()
|
||||
|
||||
def _calc_md5partial(self):
|
||||
# type: () -> bytes
|
||||
|
||||
# This offset is where we should start reading the file to get a partial md5
|
||||
# For audio file, it should be where audio data starts
|
||||
def _get_md5partial_offset_and_size(self):
|
||||
return (0x4000, 0x4000) # 16Kb
|
||||
offset, size = (0x4000, 0x4000)
|
||||
|
||||
with self.path.open("rb") as fp:
|
||||
fp.seek(offset)
|
||||
partialdata = fp.read(size)
|
||||
return hashlib.md5(partialdata).digest()
|
||||
|
||||
def _read_info(self, field):
|
||||
# print(f"_read_info({field}) for {self}")
|
||||
@@ -120,28 +222,20 @@ class File:
|
||||
self.mtime = nonone(stats.st_mtime, 0)
|
||||
elif field == "md5partial":
|
||||
try:
|
||||
with self.path.open("rb") as fp:
|
||||
offset, size = self._get_md5partial_offset_and_size()
|
||||
fp.seek(offset)
|
||||
partialdata = fp.read(size)
|
||||
md5 = hashlib.md5(partialdata)
|
||||
self.md5partial = md5.digest()
|
||||
except Exception:
|
||||
pass
|
||||
self.md5partial = filesdb.get(self.path, "md5partial")
|
||||
if self.md5partial is None:
|
||||
self.md5partial = self._calc_md5partial()
|
||||
filesdb.put(self.path, "md5partial", self.md5partial)
|
||||
except Exception as e:
|
||||
logging.warning("Couldn't get md5partial for %s: %s", self.path, e)
|
||||
elif field == "md5":
|
||||
try:
|
||||
with self.path.open("rb") as fp:
|
||||
md5 = hashlib.md5()
|
||||
filedata = fp.read(CHUNK_SIZE)
|
||||
while filedata:
|
||||
md5.update(filedata)
|
||||
filedata = fp.read(CHUNK_SIZE)
|
||||
# FIXME For python 3.8 and later
|
||||
# while filedata := fp.read(CHUNK_SIZE):
|
||||
# md5.update(filedata)
|
||||
self.md5 = md5.digest()
|
||||
except Exception:
|
||||
pass
|
||||
self.md5 = filesdb.get(self.path, "md5")
|
||||
if self.md5 is None:
|
||||
self.md5 = self._calc_md5()
|
||||
filesdb.put(self.path, "md5", self.md5)
|
||||
except Exception as e:
|
||||
logging.warning("Couldn't get md5 for %s: %s", self.path, e)
|
||||
elif field == "md5samples":
|
||||
try:
|
||||
with self.path.open("rb") as fp:
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
* Created On: 2010-01-30
|
||||
* Copyright 2014 Hardcoded Software (http://www.hardcoded.net)
|
||||
*
|
||||
* This software is licensed under the "BSD" License as described in the "LICENSE" file,
|
||||
* which should be included with this package. The terms are also available at
|
||||
* http://www.hardcoded.net/licenses/bsd_license
|
||||
* This software is licensed under the "BSD" License as described in the
|
||||
* "LICENSE" file, which should be included with this package. The terms are
|
||||
* also available at http://www.hardcoded.net/licenses/bsd_license
|
||||
*/
|
||||
|
||||
#include "common.h"
|
||||
@@ -17,8 +17,7 @@ static PyObject *DifferentBlockCountError;
|
||||
/* Returns a 3 sized tuple containing the mean color of 'image'.
|
||||
* image: a PIL image or crop.
|
||||
*/
|
||||
static PyObject* getblock(PyObject *image)
|
||||
{
|
||||
static PyObject *getblock(PyObject *image) {
|
||||
int i, totr, totg, totb;
|
||||
Py_ssize_t pixel_count;
|
||||
PyObject *ppixels;
|
||||
@@ -30,7 +29,7 @@ static PyObject* getblock(PyObject *image)
|
||||
}
|
||||
|
||||
pixel_count = PySequence_Length(ppixels);
|
||||
for (i=0; i<pixel_count; i++) {
|
||||
for (i = 0; i < pixel_count; i++) {
|
||||
PyObject *ppixel, *pr, *pg, *pb;
|
||||
int r, g, b;
|
||||
|
||||
@@ -65,8 +64,7 @@ static PyObject* getblock(PyObject *image)
|
||||
/* Returns the difference between the first block and the second.
|
||||
* It returns an absolute sum of the 3 differences (RGB).
|
||||
*/
|
||||
static int diff(PyObject *first, PyObject *second)
|
||||
{
|
||||
static int diff(PyObject *first, PyObject *second) {
|
||||
int r1, g1, b1, r2, b2, g2;
|
||||
PyObject *pr, *pg, *pb;
|
||||
pr = PySequence_ITEM(first, 0);
|
||||
@@ -93,7 +91,7 @@ static int diff(PyObject *first, PyObject *second)
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(block_getblocks2_doc,
|
||||
"Returns a list of blocks (3 sized tuples).\n\
|
||||
"Returns a list of blocks (3 sized tuples).\n\
|
||||
\n\
|
||||
image: A PIL image to base the blocks on.\n\
|
||||
block_count_per_side: This integer determine the number of blocks the function will return.\n\
|
||||
@@ -101,8 +99,7 @@ If it is 10, for example, 100 blocks will be returns (10 width, 10 height). The
|
||||
necessarely cover square areas. The area covered by each block will be proportional to the image\n\
|
||||
itself.\n");
|
||||
|
||||
static PyObject* block_getblocks2(PyObject *self, PyObject *args)
|
||||
{
|
||||
static PyObject *block_getblocks2(PyObject *self, PyObject *args) {
|
||||
int block_count_per_side, width, height, block_width, block_height, ih;
|
||||
PyObject *image;
|
||||
PyObject *pimage_size, *pwidth, *pheight;
|
||||
@@ -128,23 +125,23 @@ static PyObject* block_getblocks2(PyObject *self, PyObject *args)
|
||||
block_width = max(width / block_count_per_side, 1);
|
||||
block_height = max(height / block_count_per_side, 1);
|
||||
|
||||
result = PyList_New(block_count_per_side * block_count_per_side);
|
||||
result = PyList_New((Py_ssize_t)block_count_per_side * block_count_per_side);
|
||||
if (result == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (ih=0; ih<block_count_per_side; ih++) {
|
||||
for (ih = 0; ih < block_count_per_side; ih++) {
|
||||
int top, bottom, iw;
|
||||
top = min(ih*block_height, height-block_height);
|
||||
top = min(ih * block_height, height - block_height);
|
||||
bottom = top + block_height;
|
||||
for (iw=0; iw<block_count_per_side; iw++) {
|
||||
for (iw = 0; iw < block_count_per_side; iw++) {
|
||||
int left, right;
|
||||
PyObject *pbox;
|
||||
PyObject *pmethodname;
|
||||
PyObject *pcrop;
|
||||
PyObject *pblock;
|
||||
|
||||
left = min(iw*block_width, width-block_width);
|
||||
left = min(iw * block_width, width - block_width);
|
||||
right = left + block_width;
|
||||
pbox = inttuple(4, left, top, right, bottom);
|
||||
pmethodname = PyUnicode_FromString("crop");
|
||||
@@ -161,7 +158,7 @@ static PyObject* block_getblocks2(PyObject *self, PyObject *args)
|
||||
Py_DECREF(result);
|
||||
return NULL;
|
||||
}
|
||||
PyList_SET_ITEM(result, ih*block_count_per_side+iw, pblock);
|
||||
PyList_SET_ITEM(result, ih * block_count_per_side + iw, pblock);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -169,19 +166,19 @@ static PyObject* block_getblocks2(PyObject *self, PyObject *args)
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(block_avgdiff_doc,
|
||||
"Returns the average diff between first blocks and seconds.\n\
|
||||
"Returns the average diff between first blocks and seconds.\n\
|
||||
\n\
|
||||
If the result surpasses limit, limit + 1 is returned, except if less than min_iterations\n\
|
||||
iterations have been made in the blocks.\n");
|
||||
|
||||
static PyObject* block_avgdiff(PyObject *self, PyObject *args)
|
||||
{
|
||||
static PyObject *block_avgdiff(PyObject *self, PyObject *args) {
|
||||
PyObject *first, *second;
|
||||
int limit, min_iterations;
|
||||
Py_ssize_t count;
|
||||
int sum, i, result;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "OOii", &first, &second, &limit, &min_iterations)) {
|
||||
if (!PyArg_ParseTuple(args, "OOii", &first, &second, &limit,
|
||||
&min_iterations)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -196,7 +193,7 @@ static PyObject* block_avgdiff(PyObject *self, PyObject *args)
|
||||
}
|
||||
|
||||
sum = 0;
|
||||
for (i=0; i<count; i++) {
|
||||
for (i = 0; i < count; i++) {
|
||||
int iteration_count;
|
||||
PyObject *item1, *item2;
|
||||
|
||||
@@ -206,7 +203,8 @@ static PyObject* block_avgdiff(PyObject *self, PyObject *args)
|
||||
sum += diff(item1, item2);
|
||||
Py_DECREF(item1);
|
||||
Py_DECREF(item2);
|
||||
if ((sum > limit*iteration_count) && (iteration_count >= min_iterations)) {
|
||||
if ((sum > limit * iteration_count) &&
|
||||
(iteration_count >= min_iterations)) {
|
||||
return PyLong_FromLong(limit + 1);
|
||||
}
|
||||
}
|
||||
@@ -224,8 +222,7 @@ static PyMethodDef BlockMethods[] = {
|
||||
{NULL, NULL, 0, NULL} /* Sentinel */
|
||||
};
|
||||
|
||||
static struct PyModuleDef BlockDef = {
|
||||
PyModuleDef_HEAD_INIT,
|
||||
static struct PyModuleDef BlockDef = {PyModuleDef_HEAD_INIT,
|
||||
"_block",
|
||||
NULL,
|
||||
-1,
|
||||
@@ -233,12 +230,9 @@ static struct PyModuleDef BlockDef = {
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL
|
||||
};
|
||||
NULL};
|
||||
|
||||
PyObject *
|
||||
PyInit__block(void)
|
||||
{
|
||||
PyObject *PyInit__block(void) {
|
||||
PyObject *m = PyModule_Create(&BlockDef);
|
||||
if (m == NULL) {
|
||||
return NULL;
|
||||
@@ -246,7 +240,8 @@ PyInit__block(void)
|
||||
|
||||
NoBlocksError = PyErr_NewException("_block.NoBlocksError", NULL, NULL);
|
||||
PyModule_AddObject(m, "NoBlocksError", NoBlocksError);
|
||||
DifferentBlockCountError = PyErr_NewException("_block.DifferentBlockCountError", NULL, NULL);
|
||||
DifferentBlockCountError =
|
||||
PyErr_NewException("_block.DifferentBlockCountError", NULL, NULL);
|
||||
PyModule_AddObject(m, "DifferentBlockCountError", DifferentBlockCountError);
|
||||
|
||||
return m;
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
#include "common.h"
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <CoreGraphics/CoreGraphics.h>
|
||||
#import <ImageIO/ImageIO.h>
|
||||
|
||||
#define RADIANS( degrees ) ( degrees * M_PI / 180 )
|
||||
|
||||
|
||||
@@ -77,15 +77,22 @@ class Scanner:
|
||||
self.discarded_file_count = 0
|
||||
|
||||
def _getmatches(self, files, j):
|
||||
if self.size_threshold or self.scan_type in {
|
||||
if (
|
||||
self.size_threshold
|
||||
or self.large_size_threshold
|
||||
or self.scan_type
|
||||
in {
|
||||
ScanType.CONTENTS,
|
||||
ScanType.FOLDERS,
|
||||
}:
|
||||
}
|
||||
):
|
||||
j = j.start_subjob([2, 8])
|
||||
for f in j.iter_with_progress(files, tr("Read size of %d/%d files")):
|
||||
f.size # pre-read, makes a smoother progress if read here (especially for bundles)
|
||||
if self.size_threshold:
|
||||
files = [f for f in files if f.size >= self.size_threshold]
|
||||
if self.large_size_threshold:
|
||||
files = [f for f in files if f.size <= self.large_size_threshold]
|
||||
if self.scan_type in {ScanType.CONTENTS, ScanType.FOLDERS}:
|
||||
return engine.getmatches_by_contents(files, bigsize=self.big_file_size_threshold, j=j)
|
||||
else:
|
||||
@@ -202,5 +209,6 @@ class Scanner:
|
||||
scan_type = ScanType.FILENAME
|
||||
scanned_tags = {"artist", "title"}
|
||||
size_threshold = 0
|
||||
large_size_threshold = 0
|
||||
big_file_size_threshold = 0
|
||||
word_weighting = False
|
||||
|
||||
@@ -530,10 +530,6 @@ class TestCaseGetMatches:
|
||||
|
||||
|
||||
class TestCaseGetMatchesByContents:
|
||||
def test_dont_compare_empty_files(self):
|
||||
o1, o2 = no(size=0), no(size=0)
|
||||
assert not getmatches_by_contents([o1, o2])
|
||||
|
||||
def test_big_file_partial_hashes(self):
|
||||
smallsize = 1
|
||||
bigsize = 100 * 1024 * 1024 # 100MB
|
||||
|
||||
@@ -56,6 +56,8 @@ def test_default_settings(fake_fileexists):
|
||||
eq_(s.mix_file_kind, True)
|
||||
eq_(s.word_weighting, False)
|
||||
eq_(s.match_similar_words, False)
|
||||
eq_(s.size_threshold, 0)
|
||||
eq_(s.large_size_threshold, 0)
|
||||
eq_(s.big_file_size_threshold, 0)
|
||||
|
||||
|
||||
@@ -142,6 +144,50 @@ def test_content_scan_compare_sizes_first(fake_fileexists):
|
||||
eq_(len(s.get_dupe_groups(f)), 0)
|
||||
|
||||
|
||||
def test_ignore_file_size(fake_fileexists):
|
||||
s = Scanner()
|
||||
s.scan_type = ScanType.CONTENTS
|
||||
small_size = 10 # 10KB
|
||||
s.size_threshold = 0
|
||||
large_size = 100 * 1024 * 1024 # 100MB
|
||||
s.large_size_threshold = 0
|
||||
f = [
|
||||
no("smallignore1", small_size - 1),
|
||||
no("smallignore2", small_size - 1),
|
||||
no("small1", small_size),
|
||||
no("small2", small_size),
|
||||
no("large1", large_size),
|
||||
no("large2", large_size),
|
||||
no("largeignore1", large_size + 1),
|
||||
no("largeignore2", large_size + 1),
|
||||
]
|
||||
f[0].md5 = f[0].md5partial = f[0].md5samples = "smallignore"
|
||||
f[1].md5 = f[1].md5partial = f[1].md5samples = "smallignore"
|
||||
f[2].md5 = f[2].md5partial = f[2].md5samples = "small"
|
||||
f[3].md5 = f[3].md5partial = f[3].md5samples = "small"
|
||||
f[4].md5 = f[4].md5partial = f[4].md5samples = "large"
|
||||
f[5].md5 = f[5].md5partial = f[5].md5samples = "large"
|
||||
f[6].md5 = f[6].md5partial = f[6].md5samples = "largeignore"
|
||||
f[7].md5 = f[7].md5partial = f[7].md5samples = "largeignore"
|
||||
|
||||
r = s.get_dupe_groups(f)
|
||||
# No ignores
|
||||
eq_(len(r), 4)
|
||||
# Ignore smaller
|
||||
s.size_threshold = small_size
|
||||
r = s.get_dupe_groups(f)
|
||||
eq_(len(r), 3)
|
||||
# Ignore larger
|
||||
s.size_threshold = 0
|
||||
s.large_size_threshold = large_size
|
||||
r = s.get_dupe_groups(f)
|
||||
eq_(len(r), 3)
|
||||
# Ignore both
|
||||
s.size_threshold = small_size
|
||||
r = s.get_dupe_groups(f)
|
||||
eq_(len(r), 2)
|
||||
|
||||
|
||||
def test_big_file_partial_hashes(fake_fileexists):
|
||||
s = Scanner()
|
||||
s.scan_type = ScanType.CONTENTS
|
||||
|
||||
@@ -1,3 +1,42 @@
|
||||
=== 4.2.1 (2022-03-25)
|
||||
* Default to English on unsupported system language (#976)
|
||||
* Fix image viewer zoom datatype issue (#978)
|
||||
* Fix errors from window change event (#937, #980)
|
||||
* Fix deprecation warning from SQLite
|
||||
* Enforce minimum Windows version in installer (#983)
|
||||
* Fix help path for local files
|
||||
* Drop python 3.6 support
|
||||
* VS Code project settings added, yaml validation for GitHub actions
|
||||
|
||||
=== 4.2.0 (2021-01-24)
|
||||
|
||||
* Add Malay and Turkish
|
||||
* Add dark style for windows (#900)
|
||||
* Add caching md5 file hashes (#942)
|
||||
* Add feature to partially hash large files, with user adjustable preference (#908)
|
||||
* Add portable mode (store settings next to executable)
|
||||
* Add file association for .dupeguru files on windows
|
||||
* Add ability to pass .dupeguru file to load on startup (#902)
|
||||
* Add ability to reveal in explorer/finder (#895)
|
||||
* Switch audio tag processing from hsaudiotag to mutagen (#440)
|
||||
* Add ability to use Qt dialogs instead of native OS dialogs for some file selection operations
|
||||
* Add OS and Python details to error dialog to assist in troubleshooting
|
||||
* Add preference to ignore large files with threshold (#430)
|
||||
* Fix error on close from DetailsPanel (#857, #873)
|
||||
* Change reference background color (#894, #898)
|
||||
* Remove stripping of unicode characters when matching names (#879)
|
||||
* Fix exception when deleting in delta view (#863, #905)
|
||||
* Fix dupes only view not updating after re-prioritize results (#757, #910, #911)
|
||||
* Fix ability to drag'n'drop file/folder with certain characters in name (#897)
|
||||
* Fix window position opening partially offscreen (#653)
|
||||
* Fix TypeError is photo mode (#551)
|
||||
* Change message for when files are deleted directly (#904)
|
||||
* Add more feedback during scan (#700)
|
||||
* Add Python version check to build.py (#589)
|
||||
* General code cleanups
|
||||
* Improvements to using standardized build tooling
|
||||
* Moved CI/CD to github actions, added codeql, SonarCloud
|
||||
|
||||
=== 4.1.1 (2021-03-21)
|
||||
|
||||
* Add Japanese
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Häufig gestellte Fragen
|
||||
==========================
|
||||
|
||||
.. topic:: What is |appname|?
|
||||
.. topic:: What is dupeGuru?
|
||||
|
||||
.. only:: edition_se
|
||||
|
||||
@@ -25,7 +25,7 @@ Häufig gestellte Fragen
|
||||
|
||||
.. topic:: Was sind die Demo-Einschränkungen von dupeGuru?
|
||||
|
||||
Keine, |appname| ist `Fairware <http://open.hardcoded.net/about/>`_.
|
||||
Keine, dupeGuru ist `Fairware <http://open.hardcoded.net/about/>`_.
|
||||
|
||||
.. topic:: Die Markierungsbox einer Datei, die ich löschen möchte, ist deaktiviert. Was muss ich tun?
|
||||
|
||||
|
||||
@@ -1,21 +1,13 @@
|
||||
|appname| Hilfe
|
||||
dupeGuru Hilfe
|
||||
===============
|
||||
|
||||
.. only:: edition_se
|
||||
|
||||
Dieses Dokument ist auch auf `Englisch <http://www.hardcoded.net/dupeguru/help/en/>`__ und `Französisch <http://www.hardcoded.net/dupeguru/help/fr/>`__ verfügbar.
|
||||
|
||||
.. only:: edition_me
|
||||
|
||||
Dieses Dokument ist auch auf `Englisch <http://www.hardcoded.net/dupeguru/help/en/>`__ und `Französisch <http://www.hardcoded.net/dupeguru_me/help/fr/>`__ verfügbar.
|
||||
|
||||
.. only:: edition_pe
|
||||
|
||||
Dieses Dokument ist auch auf `Englisch <http://www.hardcoded.net/dupeguru/help/en/>`__ und `Französisch <http://www.hardcoded.net/dupeguru_pe/help/fr/>`__ verfügbar.
|
||||
Dieses Dokument ist auch auf `Englisch <http://dupeguru.voltaicideas.net/help/en/>`__ und `Französisch <http://dupeguru.voltaicideas.net/help/fr/>`__ verfügbar.
|
||||
|
||||
.. only:: edition_se or edition_me
|
||||
|
||||
|appname| ist ein Tool zum Auffinden von Duplikaten auf Ihrem Computer. Es kann entweder Dateinamen oder Inhalte scannen. Der Dateiname-Scan stellt einen lockeren Suchalgorithmus zur Verfügung, der sogar Duplikate findet, die nicht den exakten selben Namen haben.
|
||||
dupeGuru ist ein Tool zum Auffinden von Duplikaten auf Ihrem Computer. Es kann entweder Dateinamen oder Inhalte scannen. Der Dateiname-Scan stellt einen lockeren Suchalgorithmus zur Verfügung, der sogar Duplikate findet, die nicht den exakten selben Namen haben.
|
||||
|
||||
.. only:: edition_pe
|
||||
|
||||
@@ -23,7 +15,7 @@
|
||||
|
||||
Obwohl dupeGuru auch leicht ohne Dokumentation genutzt werden kann, ist es sinnvoll die Hilfe zu lesen. Wenn Sie nach einer Führung für den ersten Duplikatscan suchen, werfen Sie einen Blick auf die :doc:`Schnellstart <quick_start>` Sektion
|
||||
|
||||
Es ist eine gute Idee |appname| aktuell zu halten. Sie können die neueste Version auf der `homepage`_ finden.
|
||||
Es ist eine gute Idee dupeGuru aktuell zu halten. Sie können die neueste Version auf der http://dupeguru.voltaicideas.net finden.
|
||||
|
||||
Inhalte:
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ a community around this project.
|
||||
|
||||
So, whatever your skills, if you're interested in contributing to dupeGuru, please do so. Normally,
|
||||
this documentation should be enough to get you started, but if it isn't, then **please**,
|
||||
`let me know`_ because it's a problem that I'm committed to fix. If there's any situation where you'd
|
||||
open a discussion at https://github.com/arsenetar/dupeguru/discussions. If there's any situation where you'd
|
||||
wish to contribute but some doubt you're having prevent you from going forward, please contact me.
|
||||
I'd much prefer to spend the time figuring out with you whether (and how) you can contribute than
|
||||
taking the chance of missing that opportunity.
|
||||
@@ -82,10 +82,9 @@ agree on what should be added to the documentation.
|
||||
dupeGuru. For more information about how to do that, you can refer to the `translator guide`_.
|
||||
|
||||
.. _been open source: https://www.hardcoded.net/articles/free-as-in-speech-fair-as-in-trade
|
||||
.. _let me know: mailto:hsoft@hardcoded.net
|
||||
.. _Source code repository: https://github.com/hsoft/dupeguru
|
||||
.. _Issue Tracker: https://github.com/hsoft/dupeguru/issues
|
||||
.. _Issue labels meaning: https://github.com/hsoft/dupeguru/wiki/issue-labels
|
||||
.. _Source code repository: https://github.com/arsenetar/dupeguru
|
||||
.. _Issue Tracker: https://github.com/arsenetar/issues
|
||||
.. _Issue labels meaning: https://github.com/arsenetar/wiki/issue-labels
|
||||
.. _Sphinx: http://sphinx-doc.org/
|
||||
.. _reST: http://en.wikipedia.org/wiki/ReStructuredText
|
||||
.. _translator guide: https://github.com/hsoft/dupeguru/wiki/Translator-Guide
|
||||
.. _translator guide: https://github.com/arsenetar/wiki/Translator-Guide
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
hscommon.jobprogress.qt
|
||||
=======================
|
||||
|
||||
.. automodule:: hscommon.jobprogress.qt
|
||||
|
||||
.. autosummary::
|
||||
|
||||
Progress
|
||||
|
||||
.. autoclass:: Progress
|
||||
:members:
|
||||
|
||||
@@ -151,8 +151,6 @@ delete files" option that is offered to you when you activate Send to Trash. Thi
|
||||
files to the Trash, but delete them immediately. In some cases, for example on network storage
|
||||
(NAS), this has been known to work when normal deletion didn't.
|
||||
|
||||
If this fail, `HS forums`_ might be of some help.
|
||||
|
||||
Why is Picture mode's contents scan so slow?
|
||||
--------------------------------------------
|
||||
|
||||
@@ -178,7 +176,6 @@ Preferences are stored elsewhere:
|
||||
* Linux: ``~/.config/Hardcoded Software/dupeGuru.conf``
|
||||
* Mac OS X: In the built-in ``defaults`` system, as ``com.hardcoded-software.dupeguru``
|
||||
|
||||
.. _HS forums: https://forum.hardcoded.net/
|
||||
.. _Github: https://github.com/hsoft/dupeguru
|
||||
.. _open an issue: https://github.com/hsoft/dupeguru/wiki/issue-labels
|
||||
.. _Github: https://github.com/arsenetar/dupeguru
|
||||
.. _open an issue: https://github.com/arsenetar/dupeguru/wiki/issue-labels
|
||||
|
||||
|
||||
@@ -3,11 +3,11 @@ dupeGuru help
|
||||
|
||||
This help document is also available in these languages:
|
||||
|
||||
* `French <http://www.hardcoded.net/dupeguru/help/fr>`__
|
||||
* `German <http://www.hardcoded.net/dupeguru/help/de>`__
|
||||
* `Armenian <http://www.hardcoded.net/dupeguru/help/hy>`__
|
||||
* `Russian <http://www.hardcoded.net/dupeguru/help/ru>`__
|
||||
* `Ukrainian <http://www.hardcoded.net/dupeguru/help/uk>`__
|
||||
* `French <http://dupeguru.voltaicideas.net/help/fr>`__
|
||||
* `German <http://dupeguru.voltaicideas.net/help/de>`__
|
||||
* `Armenian <http://dupeguru.voltaicideas.net/help/hy>`__
|
||||
* `Russian <http://dupeguru.voltaicideas.net/help/ru>`__
|
||||
* `Ukrainian <http://dupeguru.voltaicideas.net/help/uk>`__
|
||||
|
||||
dupeGuru is a tool to find duplicate files on your computer. It has three
|
||||
modes, Standard, Music and Picture, with each mode having its own scan types
|
||||
@@ -42,4 +42,4 @@ Indices and tables
|
||||
* :ref:`genindex`
|
||||
* :ref:`search`
|
||||
|
||||
.. _homepage: https://www.hardcoded.net/dupeguru
|
||||
.. _homepage: https://dupeguru.voltaicideas.net/
|
||||
|
||||
@@ -3,7 +3,7 @@ Foire aux questions
|
||||
|
||||
.. contents::
|
||||
|
||||
Qu'est-ce que |appname|?
|
||||
Qu'est-ce que dupeGuru?
|
||||
------------------------
|
||||
|
||||
.. only:: edition_se
|
||||
|
||||
@@ -1,21 +1,13 @@
|
||||
Aide |appname|
|
||||
Aide dupeGuru
|
||||
===============
|
||||
|
||||
.. only:: edition_se
|
||||
|
||||
Ce document est aussi disponible en `anglais <http://www.hardcoded.net/dupeguru/help/en/>`__, en `allemand <http://www.hardcoded.net/dupeguru/help/de/>`__ et en `arménien <http://www.hardcoded.net/dupeguru/help/hy/>`__.
|
||||
|
||||
.. only:: edition_me
|
||||
|
||||
Ce document est aussi disponible en `anglais <http://www.hardcoded.net/dupeguru_me/help/en/>`__, en `allemand <http://www.hardcoded.net/dupeguru_me/help/de/>`__ et en `arménien <http://www.hardcoded.net/dupeguru_me/help/hy/>`__.
|
||||
|
||||
.. only:: edition_pe
|
||||
|
||||
Ce document est aussi disponible en `anglais <http://www.hardcoded.net/dupeguru_pe/help/en/>`__, en `allemand <http://www.hardcoded.net/dupeguru_pe/help/de/>`__ et en `arménien <http://www.hardcoded.net/dupeguru_pe/help/hy/>`__.
|
||||
Ce document est aussi disponible en `anglais <http://dupeguru.voltaicideas.net/help/en/>`__, en `allemand <http://dupeguru.voltaicideas.net/help/de/>`__ et en `arménien <http://dupeguru.voltaicideas.net/help/hy/>`__.
|
||||
|
||||
.. only:: edition_se or edition_me
|
||||
|
||||
|appname| est un outil pour trouver des doublons parmi vos fichiers. Il peut comparer soit les noms de fichiers, soit le contenu. Le comparateur de nom de fichier peut trouver des doublons même si les noms ne sont pas exactement pareils.
|
||||
dupeGuru est un outil pour trouver des doublons parmi vos fichiers. Il peut comparer soit les noms de fichiers, soit le contenu. Le comparateur de nom de fichier peut trouver des doublons même si les noms ne sont pas exactement pareils.
|
||||
|
||||
.. only:: edition_pe
|
||||
|
||||
@@ -23,7 +15,7 @@ Aide |appname|
|
||||
|
||||
Bien que dupeGuru puisse être utilisé sans lire l'aide, une telle lecture vous permettra de bien comprendre comment l'application fonctionne. Pour un guide rapide pour une première utilisation, référez vous à la section :doc:`Démarrage Rapide <quick_start>`.
|
||||
|
||||
C'est toujours une bonne idée de garder |appname| à jour. Vous pouvez télécharger la dernière version sur sa `page web`_.
|
||||
C'est toujours une bonne idée de garder dupeGuru à jour. Vous pouvez télécharger la dernière version sur sa http://dupeguru.voltaicideas.net.
|
||||
|
||||
Contents:
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Հաճախ Տրվող Հարցեր
|
||||
==========================
|
||||
|
||||
.. topic:: Ի՞նչ է |appname|-ը:
|
||||
.. topic:: Ի՞նչ է dupeGuru-ը:
|
||||
|
||||
.. only:: edition_se
|
||||
|
||||
|
||||
@@ -1,21 +1,13 @@
|
||||
|appname| help
|
||||
dupeGuru help
|
||||
===============
|
||||
|
||||
.. only:: edition_se
|
||||
|
||||
Այս փաստաթուղթը հասանելի է նաև՝ `Ֆրանսերեն <http://www.hardcoded.net/dupeguru/help/fr/>`__ և `Գերմաներեն <http://www.hardcoded.net/dupeguru/help/de/>`__.
|
||||
|
||||
.. only:: edition_me
|
||||
|
||||
Այս փաստաթուղթը հասանելի է նաև՝ `Ֆրանսերեն <http://www.hardcoded.net/dupeguru_me/help/fr/>`__ և `Գերմաներեն <http://www.hardcoded.net/dupeguru_me/help/de/>`__.
|
||||
|
||||
.. only:: edition_pe
|
||||
|
||||
Այս փաստաթուղթը հասանելի է նաև՝ `Ֆրանսերեն <http://www.hardcoded.net/dupeguru_pe/help/fr/>`__ և `Գերմաներեն <http://www.hardcoded.net/dupeguru_pe/help/de/>`__.
|
||||
Այս փաստաթուղթը հասանելի է նաև՝ `Ֆրանսերեն <http://dupeguru.voltaicideas.net/help/fr/>`__ և `Գերմաներեն <http://dupeguru.voltaicideas.net/help/de/>`__.
|
||||
|
||||
.. only:: edition_se or edition_me
|
||||
|
||||
|appname| ծրագիր է՝ գտնելու կրկնօրինակ ունեցող ֆայլեր Ձեր համակարգչում: Այն կարող է անգամ ստուգել ֆայլի անունները կան բովանդակությունը: Ֆայլի անվան ստուգման հնարավորությունները ոչ ճշգրիտ համընկման ալգորիթմով, որը կարող է գտնել ֆայլի անվան կրկնօրինակներ, անգամ եթե դրանք նույնը չեն:
|
||||
dupeGuru ծրագիր է՝ գտնելու կրկնօրինակ ունեցող ֆայլեր Ձեր համակարգչում: Այն կարող է անգամ ստուգել ֆայլի անունները կան բովանդակությունը: Ֆայլի անվան ստուգման հնարավորությունները ոչ ճշգրիտ համընկման ալգորիթմով, որը կարող է գտնել ֆայլի անվան կրկնօրինակներ, անգամ եթե դրանք նույնը չեն:
|
||||
|
||||
.. only:: edition_pe
|
||||
|
||||
@@ -23,7 +15,7 @@
|
||||
|
||||
Չնայած dupeGuru-ն կարող է հեշտությամբ օգտագործվել առանց օգնության, այնուհանդերձ եթե կարդաք այս ֆայլը, այն մեծապես կօգնի Ձեզ ընկալելու ծրագրի աշխատանքը: Եթե Դուք նայում եք ձեռնարկը կրկնօրինակների առաջին ստուգման համար, ապա կարող եք ընտրել :doc:`Արագ Սկիզբ <quick_start>` հատվածը:
|
||||
|
||||
Շատ լավ միտք է պահելու |appname| թարմացված: Կարող եք բեռնել վեբ կայքի համապատասխան էջից `homepage`_:
|
||||
Շատ լավ միտք է պահելու dupeGuru թարմացված: Կարող եք բեռնել վեբ կայքի համապատասխան էջից http://dupeguru.voltaicideas.net:
|
||||
|
||||
Պարունակությունը.
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Часто задаваемые вопросы
|
||||
==========================
|
||||
|
||||
.. topic:: Что такое |appname|?
|
||||
.. topic:: Что такое dupeGuru?
|
||||
|
||||
.. only:: edition_se
|
||||
|
||||
|
||||
@@ -1,21 +1,11 @@
|
||||
|appname| help
|
||||
dupeGuru help
|
||||
===============
|
||||
|
||||
.. only:: edition_se
|
||||
|
||||
Этот документ также доступна на `французском <http://www.hardcoded.net/dupeguru/help/fr/>`__, `немецком <http://www.hardcoded.net/dupeguru/help/de/>`__ и `армянский <http://www.hardcoded.net/dupeguru/help/hy/>`__.
|
||||
|
||||
.. only:: edition_me
|
||||
|
||||
Этот документ также доступна на `французском <http://www.hardcoded.net/dupeguru_me/help/fr/>`__, `немецкий <http://www.hardcoded.net/dupeguru_me/help/de/>`__ и `армянский <http://www.hardcoded.net/dupeguru_me/help/hy/>`__.
|
||||
|
||||
.. only:: edition_pe
|
||||
|
||||
Этот документ также доступна на `французском <http://www.hardcoded.net/dupeguru_pe/help/fr/>`__, `немецкий <http://www.hardcoded.net/dupeguru_pe/help/de/>`__ и `армянский <http://www.hardcoded.net/dupeguru_pe/help/hy/>`__.
|
||||
Этот документ также доступна на `французском <http://dupeguru.voltaicideas.net/help/fr/>`__, `немецком <http://dupeguru.voltaicideas.net/help/de/>`__ и `армянский <http://dupeguru.voltaicideas.net/help/hy/>`__.
|
||||
|
||||
.. only:: edition_se or edition_me
|
||||
|
||||
|appname| есть инструмент для поиска дубликатов файлов на вашем компьютере. Он может сканировать либо имен файлов или содержимого.Имя файла функций сканирования нечеткого соответствия алгоритма, который позволяет найти одинаковые имена файлов, даже если они не совсем то же самое.
|
||||
dupeGuru есть инструмент для поиска дубликатов файлов на вашем компьютере. Он может сканировать либо имен файлов или содержимого.Имя файла функций сканирования нечеткого соответствия алгоритма, который позволяет найти одинаковые имена файлов, даже если они не совсем то же самое.
|
||||
|
||||
.. only:: edition_pe
|
||||
|
||||
@@ -23,7 +13,7 @@
|
||||
|
||||
Хотя dupeGuru может быть легко использована без документации, чтение этого файла поможет вам освоить его. Если вы ищете руководство для вашей первой дублировать сканирования, вы можете взглянуть на раздел :doc:`Быстрый <quick_start>` Начало.
|
||||
|
||||
Это хорошая идея, чтобы сохранить |appname| обновлен. Вы можете скачать последнюю версию на своей `homepage`_.
|
||||
Это хорошая идея, чтобы сохранить dupeGuru обновлен. Вы можете скачать последнюю версию на своей http://dupeguru.voltaicideas.net.
|
||||
Содержание:
|
||||
|
||||
.. toctree::
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Часті питання
|
||||
==========================
|
||||
|
||||
.. topic:: Що таке |appname|?
|
||||
.. topic:: Що таке dupeGuru?
|
||||
|
||||
.. only:: edition_se
|
||||
|
||||
|
||||
@@ -1,21 +1,13 @@
|
||||
|appname| help
|
||||
dupeGuru help
|
||||
===============
|
||||
|
||||
.. only:: edition_se
|
||||
|
||||
Цей документ також доступна на `французькому <http://www.hardcoded.net/dupeguru/help/fr/>`__, `німецький <http://www.hardcoded.net/dupeguru/help/de/>`__ і `Вірменський <http://www.hardcoded.net/dupeguru/help/hy/>`__.
|
||||
|
||||
.. only:: edition_me
|
||||
|
||||
Цей документ також доступна на `французькому <http://www.hardcoded.net/dupeguru_me/help/fr/>`__, `німецький <http://www.hardcoded.net/dupeguru_me/help/de/>`__ і `Вірменський <http://www.hardcoded.net/dupeguru_me/help/hy/>`__.
|
||||
|
||||
.. only:: edition_pe
|
||||
|
||||
Цей документ також доступна на `французькому <http://www.hardcoded.net/dupeguru_pe/help/fr/>`__, `німецький <http://www.hardcoded.net/dupeguru_pe/help/de/>`__ і `Вірменський <http://www.hardcoded.net/dupeguru_pe/help/hy/>`__.
|
||||
Цей документ також доступна на `французькому <http://dupeguru.voltaicideas.net/help/fr/>`__, `німецький <http://dupeguru.voltaicideas.net/help/de/>`__ і `Вірменський <http://dupeguru.voltaicideas.net/help/hy/>`__.
|
||||
|
||||
.. only:: edition_se or edition_me
|
||||
|
||||
|appname| це інструмент для пошуку дублікатів файлів на вашому комп'ютері. Він може сканувати або імен файлів або вмісту. Файл функцій сканування нечіткого відповідності алгоритму, який дозволяє знайти однакові імена файлів, навіть якщо вони не зовсім те ж саме.
|
||||
dupeGuru це інструмент для пошуку дублікатів файлів на вашому комп'ютері. Він може сканувати або імен файлів або вмісту. Файл функцій сканування нечіткого відповідності алгоритму, який дозволяє знайти однакові імена файлів, навіть якщо вони не зовсім те ж саме.
|
||||
|
||||
.. only:: edition_pe
|
||||
|
||||
@@ -23,7 +15,7 @@
|
||||
|
||||
Хоча dupeGuru може бути легко використана без документації, читання цього файлу допоможе вам освоїти його. Якщо ви шукаєте керівництво для вашої першої дублювати сканування, ви можете поглянути на: :doc:`Quick Start <quick_start>`
|
||||
|
||||
Це гарна ідея, щоб зберегти |appname| оновлено. Ви можете завантажити останню версію на своєму `homepage`_.
|
||||
Це гарна ідея, щоб зберегти dupeGuru оновлено. Ви можете завантажити останню версію на своєму http://dupeguru.voltaicideas.net.
|
||||
|
||||
Contents:
|
||||
|
||||
|
||||
@@ -63,7 +63,6 @@ try:
|
||||
appname = proxy.bundleInfo_("CFBundleName")
|
||||
return op.join(base, appname)
|
||||
|
||||
|
||||
except ImportError:
|
||||
try:
|
||||
from PyQt5.QtCore import QUrl, QStandardPaths
|
||||
|
||||
@@ -139,8 +139,6 @@ class Job:
|
||||
self._progress = progress
|
||||
if self._progress > self._currmax:
|
||||
self._progress = self._currmax
|
||||
if self._progress < 0:
|
||||
self._progress = 0
|
||||
self._do_update(desc)
|
||||
|
||||
|
||||
|
||||
@@ -1,52 +0,0 @@
|
||||
# Created By: Virgil Dupras
|
||||
# Created On: 2009-09-14
|
||||
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
|
||||
#
|
||||
# This software is licensed under the "GPLv3" License as described in the "LICENSE" file,
|
||||
# which should be included with this package. The terms are also available at
|
||||
# http://www.gnu.org/licenses/gpl-3.0.html
|
||||
|
||||
from PyQt5.QtCore import pyqtSignal, Qt, QTimer
|
||||
from PyQt5.QtWidgets import QProgressDialog
|
||||
|
||||
from . import performer
|
||||
|
||||
|
||||
class Progress(QProgressDialog, performer.ThreadedJobPerformer):
|
||||
finished = pyqtSignal(["QString"])
|
||||
|
||||
def __init__(self, parent):
|
||||
flags = Qt.CustomizeWindowHint | Qt.WindowTitleHint | Qt.WindowSystemMenuHint
|
||||
QProgressDialog.__init__(self, "", "Cancel", 0, 100, parent, flags)
|
||||
self.setModal(True)
|
||||
self.setAutoReset(False)
|
||||
self.setAutoClose(False)
|
||||
self._timer = QTimer()
|
||||
self._jobid = ""
|
||||
self._timer.timeout.connect(self.updateProgress)
|
||||
|
||||
def updateProgress(self):
|
||||
# the values might change before setValue happens
|
||||
last_progress = self.last_progress
|
||||
last_desc = self.last_desc
|
||||
if not self._job_running or last_progress is None:
|
||||
self._timer.stop()
|
||||
self.close()
|
||||
if not self.job_cancelled:
|
||||
self.finished.emit(self._jobid)
|
||||
return
|
||||
if self.wasCanceled():
|
||||
self.job_cancelled = True
|
||||
return
|
||||
if last_desc:
|
||||
self.setLabelText(last_desc)
|
||||
self.setValue(last_progress)
|
||||
|
||||
def run(self, jobid, title, target, args=()):
|
||||
self._jobid = jobid
|
||||
self.reset()
|
||||
self.setLabelText("")
|
||||
self.run_threaded(target, args)
|
||||
self.setWindowTitle(title)
|
||||
self.show()
|
||||
self._timer.start(500)
|
||||
@@ -4,7 +4,7 @@
|
||||
# which should be included with this package. The terms are also available at
|
||||
# http://www.gnu.org/licenses/gpl-3.0.html
|
||||
|
||||
import os.path as op
|
||||
from pathlib import Path
|
||||
import re
|
||||
|
||||
from .build import read_changelog_file, filereplace
|
||||
@@ -48,9 +48,9 @@ def gen(
|
||||
if confrepl is None:
|
||||
confrepl = {}
|
||||
if confpath is None:
|
||||
confpath = op.join(basepath, "conf.tmpl")
|
||||
confpath = Path(basepath, "conf.tmpl")
|
||||
if changelogtmpl is None:
|
||||
changelogtmpl = op.join(basepath, "changelog.tmpl")
|
||||
changelogtmpl = Path(basepath, "changelog.tmpl")
|
||||
changelog = read_changelog_file(changelogpath)
|
||||
tix = tixgen(tixurl)
|
||||
rendered_logs = []
|
||||
@@ -62,13 +62,13 @@ def gen(
|
||||
rendered = CHANGELOG_FORMAT.format(version=log["version"], date=log["date_str"], description=description)
|
||||
rendered_logs.append(rendered)
|
||||
confrepl["version"] = changelog[0]["version"]
|
||||
changelog_out = op.join(basepath, "changelog.rst")
|
||||
changelog_out = Path(basepath, "changelog.rst")
|
||||
filereplace(changelogtmpl, changelog_out, changelog="\n".join(rendered_logs))
|
||||
if op.exists(confpath):
|
||||
conf_out = op.join(basepath, "conf.py")
|
||||
if Path(confpath).exists():
|
||||
conf_out = Path(basepath, "conf.py")
|
||||
filereplace(confpath, conf_out, **confrepl)
|
||||
# Call the sphinx_build function, which is the same as doing sphinx-build from cli
|
||||
try:
|
||||
sphinx_build([basepath, destpath])
|
||||
sphinx_build([str(basepath), str(destpath)])
|
||||
except SystemExit:
|
||||
print("Sphinx called sys.exit(), but we're cancelling it because we don't actually want to exit")
|
||||
|
||||
@@ -45,7 +45,7 @@ class _ActualThread(threading.Thread):
|
||||
self._lock = threading.Lock()
|
||||
self._run = True
|
||||
self.lastrowid = -1
|
||||
self.setDaemon(True)
|
||||
self.daemon = True
|
||||
self.start()
|
||||
|
||||
def _query(self, query):
|
||||
|
||||
@@ -58,6 +58,7 @@ def get_locale_name(lang):
|
||||
"it": "it_IT",
|
||||
"ja": "ja_JP",
|
||||
"ko": "ko_KR",
|
||||
"ms": "ms_MY",
|
||||
"nl": "nl_NL",
|
||||
"pl_PL": "pl_PL",
|
||||
"pt_BR": "pt_BR",
|
||||
@@ -149,7 +150,9 @@ def install_gettext_trans_under_qt(base_folder, lang=None):
|
||||
if not lang:
|
||||
lang = str(QLocale.system().name())[:2]
|
||||
localename = get_locale_name(lang)
|
||||
if localename is not None:
|
||||
if localename is None:
|
||||
lang = "en"
|
||||
localename = get_locale_name(lang)
|
||||
try:
|
||||
locale.setlocale(locale.LC_ALL, localename)
|
||||
except locale.Error:
|
||||
|
||||
@@ -226,7 +226,7 @@ def format_time_decimal(seconds):
|
||||
|
||||
|
||||
SIZE_DESC = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB")
|
||||
SIZE_VALS = tuple(1024 ** i for i in range(1, 9))
|
||||
SIZE_VALS = tuple(1024**i for i in range(1, 9))
|
||||
|
||||
|
||||
def format_size(size, decimal=0, forcepower=-1, showdesc=True):
|
||||
@@ -258,7 +258,7 @@ def format_size(size, decimal=0, forcepower=-1, showdesc=True):
|
||||
if decimal == 0:
|
||||
divided_size = ceil(divided_size)
|
||||
else:
|
||||
divided_size = ceil(divided_size * (10 ** decimal)) / (10 ** decimal)
|
||||
divided_size = ceil(divided_size * (10**decimal)) / (10**decimal)
|
||||
if negative:
|
||||
divided_size *= -1
|
||||
result = size_format % divided_size
|
||||
|
||||
@@ -36,88 +36,96 @@ msgstr ""
|
||||
msgid "Sending to Trash"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:287
|
||||
#: core\app.py:289
|
||||
msgid "A previous action is still hanging in there. You can't start a new one yet. Wait a few seconds, then try again."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:297
|
||||
#: core\app.py:300
|
||||
msgid "No duplicates found."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:312
|
||||
#: core\app.py:315
|
||||
msgid "All marked files were copied successfully."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:313
|
||||
#: core\app.py:317
|
||||
msgid "All marked files were moved successfully."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:314
|
||||
#: core\app.py:319
|
||||
msgid "All marked files were deleted successfully."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:321
|
||||
msgid "All marked files were successfully sent to Trash."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:320
|
||||
#: core\app.py:326
|
||||
msgid "Could not load file: {}"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:376
|
||||
#: core\app.py:382
|
||||
msgid "'{}' already is in the list."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:378
|
||||
#: core\app.py:384
|
||||
msgid "'{}' does not exist."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:386
|
||||
#: core\app.py:392
|
||||
msgid "All selected %d matches are going to be ignored in all subsequent scans. Continue?"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:460
|
||||
#: core\app.py:469
|
||||
msgid "Select a directory to copy marked files to"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:462
|
||||
#: core\app.py:471
|
||||
msgid "Select a directory to move marked files to"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:501
|
||||
#: core\app.py:510
|
||||
msgid "Select a destination for your exported CSV"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:507 core\app.py:761 core\app.py:771
|
||||
#: core\app.py:516 core\app.py:771 core\app.py:781
|
||||
msgid "Couldn't write to file: {}"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:530
|
||||
#: core\app.py:539
|
||||
msgid "You have no custom command set up. Set it up in your preferences."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:688 core\app.py:700
|
||||
#: core\app.py:695 core\app.py:707
|
||||
msgid "You are about to remove %d files from results. Continue?"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:736
|
||||
#: core\app.py:743
|
||||
msgid "{} duplicate groups were changed by the re-prioritization."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:780
|
||||
#: core\app.py:790
|
||||
msgid "The selected directories contain no scannable file."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:793
|
||||
#: core\app.py:803
|
||||
msgid "Collecting files to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:840
|
||||
#: core\app.py:850
|
||||
msgid "%s (%d discarded)"
|
||||
msgstr ""
|
||||
|
||||
#: core\engine.py:251 core\engine.py:294
|
||||
msgid "0 matches found"
|
||||
#: core\directories.py:191
|
||||
msgid "Collected {} files to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\engine.py:269 core\engine.py:306
|
||||
msgid "%d matches found"
|
||||
#: core\directories.py:207
|
||||
msgid "Collected {} folders to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\engine.py:27
|
||||
msgid "%d matches found from %d groups"
|
||||
msgstr ""
|
||||
|
||||
#: core\gui\deletion_options.py:71
|
||||
@@ -220,15 +228,15 @@ msgstr ""
|
||||
msgid " filter: %s"
|
||||
msgstr ""
|
||||
|
||||
#: core\scanner.py:85
|
||||
#: core\scanner.py:90
|
||||
msgid "Read size of %d/%d files"
|
||||
msgstr ""
|
||||
|
||||
#: core\scanner.py:109
|
||||
#: core\scanner.py:116
|
||||
msgid "Read metadata of %d/%d files"
|
||||
msgstr ""
|
||||
|
||||
#: core\scanner.py:147
|
||||
#: core\scanner.py:154
|
||||
msgid "Almost done! Fiddling with results..."
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@ msgstr "Kopíruji"
|
||||
msgid "Sending to Trash"
|
||||
msgstr "Vyhazuji do koše"
|
||||
|
||||
#: core\app.py:308
|
||||
#: core\app.py:289
|
||||
msgid ""
|
||||
"A previous action is still hanging in there. You can't start a new one yet. "
|
||||
"Wait a few seconds, then try again."
|
||||
@@ -55,35 +55,39 @@ msgstr ""
|
||||
"Předchozí akce stále nebyla ukončena. Novou zatím nemůžete spustit. Počkejte"
|
||||
" pár sekund a zkuste to znovu."
|
||||
|
||||
#: core\app.py:318
|
||||
#: core\app.py:300
|
||||
msgid "No duplicates found."
|
||||
msgstr "Nebyli nalezeny žádné duplicity."
|
||||
|
||||
#: core\app.py:333
|
||||
#: core\app.py:315
|
||||
msgid "All marked files were copied successfully."
|
||||
msgstr "Všechny označené soubory byly úspěšně zkopírovány."
|
||||
|
||||
#: core\app.py:334
|
||||
#: core\app.py:317
|
||||
msgid "All marked files were moved successfully."
|
||||
msgstr "Všechny označené soubory byly úspěšně přesunuty."
|
||||
|
||||
#: core\app.py:335
|
||||
#: core\app.py:319
|
||||
msgid "All marked files were deleted successfully."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:321
|
||||
msgid "All marked files were successfully sent to Trash."
|
||||
msgstr "Všechny označené soubory byly úspěšně odeslány do koše."
|
||||
|
||||
#: core\app.py:343
|
||||
#: core\app.py:326
|
||||
msgid "Could not load file: {}"
|
||||
msgstr "Soubor se nepodařilo načíst: {}"
|
||||
|
||||
#: core\app.py:399
|
||||
#: core\app.py:382
|
||||
msgid "'{}' already is in the list."
|
||||
msgstr "'{}' již je v seznamu."
|
||||
|
||||
#: core\app.py:401
|
||||
#: core\app.py:384
|
||||
msgid "'{}' does not exist."
|
||||
msgstr "'{}' neexistuje."
|
||||
|
||||
#: core\app.py:410
|
||||
#: core\app.py:392
|
||||
msgid ""
|
||||
"All selected %d matches are going to be ignored in all subsequent scans. "
|
||||
"Continue?"
|
||||
@@ -91,60 +95,64 @@ msgstr ""
|
||||
"Všech %d vybraných shod bude v následujících hledáních ignorováno. "
|
||||
"Pokračovat?"
|
||||
|
||||
#: core\app.py:486
|
||||
#: core\app.py:469
|
||||
msgid "Select a directory to copy marked files to"
|
||||
msgstr "Vyberte adresář, do kterého chcete zkopírovat označené soubory"
|
||||
|
||||
#: core\app.py:487
|
||||
#: core\app.py:471
|
||||
msgid "Select a directory to move marked files to"
|
||||
msgstr "Vyberte adresář, kam chcete přesunout označené soubory"
|
||||
|
||||
#: core\app.py:527
|
||||
#: core\app.py:510
|
||||
msgid "Select a destination for your exported CSV"
|
||||
msgstr "Vyberte cíl pro exportovaný soubor CSV"
|
||||
|
||||
#: core\app.py:534 core\app.py:801 core\app.py:811
|
||||
#: core\app.py:516 core\app.py:771 core\app.py:781
|
||||
msgid "Couldn't write to file: {}"
|
||||
msgstr "Nelze zapisovat do souboru: {}"
|
||||
|
||||
#: core\app.py:559
|
||||
#: core\app.py:539
|
||||
msgid "You have no custom command set up. Set it up in your preferences."
|
||||
msgstr ""
|
||||
"Nedefinoval jste žádný uživatelský příkaz. Nadefinujete ho v předvolbách."
|
||||
|
||||
#: core\app.py:727 core\app.py:740
|
||||
#: core\app.py:695 core\app.py:707
|
||||
msgid "You are about to remove %d files from results. Continue?"
|
||||
msgstr "Chystáte se z výsledků odstranit %d souborů. Pokračovat?"
|
||||
|
||||
#: core\app.py:774
|
||||
#: core\app.py:743
|
||||
msgid "{} duplicate groups were changed by the re-prioritization."
|
||||
msgstr "{} duplicitní skupiny byly změněny změně priorit."
|
||||
|
||||
#: core\app.py:821
|
||||
#: core\app.py:790
|
||||
msgid "The selected directories contain no scannable file."
|
||||
msgstr "Vybrané adresáře neobsahují žádné soubory vhodné k prohledávání."
|
||||
|
||||
#: core\app.py:835
|
||||
#: core\app.py:803
|
||||
msgid "Collecting files to scan"
|
||||
msgstr "Shromažďuji prohlížené soubory"
|
||||
|
||||
#: core\app.py:891
|
||||
#: core\app.py:850
|
||||
msgid "%s (%d discarded)"
|
||||
msgstr "%s (%d vyřazeno)"
|
||||
|
||||
#: core\engine.py:244 core\engine.py:288
|
||||
msgid "0 matches found"
|
||||
msgstr "Nalezeno 0 shod"
|
||||
#: core\directories.py:191
|
||||
msgid "Collected {} files to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\engine.py:262 core\engine.py:296
|
||||
msgid "%d matches found"
|
||||
msgstr "Nalezeno %d shod"
|
||||
#: core\directories.py:207
|
||||
msgid "Collected {} folders to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\gui\deletion_options.py:73
|
||||
#: core\engine.py:27
|
||||
msgid "%d matches found from %d groups"
|
||||
msgstr ""
|
||||
|
||||
#: core\gui\deletion_options.py:71
|
||||
msgid "You are sending {} file(s) to the Trash."
|
||||
msgstr "Posíláte-{} soubory do koše."
|
||||
|
||||
#: core\gui\exclude_list_table.py:15
|
||||
#: core\gui\exclude_list_table.py:14
|
||||
msgid "Regular Expressions"
|
||||
msgstr "Regulární výrazy"
|
||||
|
||||
@@ -176,15 +184,15 @@ msgstr "Obsah"
|
||||
msgid "Analyzed %d/%d pictures"
|
||||
msgstr "Analyzováno %d/%d snímků"
|
||||
|
||||
#: core\pe\matchblock.py:181
|
||||
#: core\pe\matchblock.py:177
|
||||
msgid "Performed %d/%d chunk matches"
|
||||
msgstr "Provedeno %d/%d porovnání bloků"
|
||||
|
||||
#: core\pe\matchblock.py:191
|
||||
#: core\pe\matchblock.py:185
|
||||
msgid "Preparing for matching"
|
||||
msgstr "Připravuji porovnávání"
|
||||
|
||||
#: core\pe\matchblock.py:244
|
||||
#: core\pe\matchblock.py:234
|
||||
msgid "Verified %d/%d matches"
|
||||
msgstr "Ověřeno %d/%d shod"
|
||||
|
||||
@@ -232,23 +240,23 @@ msgstr "Nejnovější"
|
||||
msgid "Oldest"
|
||||
msgstr "Nejstarší"
|
||||
|
||||
#: core\results.py:142
|
||||
#: core\results.py:134
|
||||
msgid "%d / %d (%s / %s) duplicates marked."
|
||||
msgstr "%d / %d (%s / %s) duplicit označeno."
|
||||
|
||||
#: core\results.py:149
|
||||
#: core\results.py:141
|
||||
msgid " filter: %s"
|
||||
msgstr " filtr: %s"
|
||||
|
||||
#: core\scanner.py:85
|
||||
#: core\scanner.py:90
|
||||
msgid "Read size of %d/%d files"
|
||||
msgstr "Read size of %d/%d files"
|
||||
|
||||
#: core\scanner.py:109
|
||||
#: core\scanner.py:116
|
||||
msgid "Read metadata of %d/%d files"
|
||||
msgstr "Načtena metadata %d/%d souborů"
|
||||
|
||||
#: core\scanner.py:147
|
||||
#: core\scanner.py:154
|
||||
msgid "Almost done! Fiddling with results..."
|
||||
msgstr "Skoro hotovo! Fidlování s výsledky..."
|
||||
|
||||
|
||||
@@ -937,3 +937,43 @@ msgstr "Všeobecné"
|
||||
#: qt\preferences_dialog.py:286
|
||||
msgid "Display"
|
||||
msgstr "Zobrazit"
|
||||
|
||||
#: qt\se\preferences_dialog.py:70
|
||||
msgid "Partially hash files bigger than"
|
||||
msgstr ""
|
||||
|
||||
#: qt\se\preferences_dialog.py:80
|
||||
msgid "MB"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:163
|
||||
msgid "Use native OS dialogs"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:166
|
||||
msgid ""
|
||||
"For actions such as file/folder selection use the OS native dialogs.\n"
|
||||
"Some native dialogs have limited functionality."
|
||||
msgstr ""
|
||||
|
||||
#: qt\se\preferences_dialog.py:68
|
||||
msgid "Ignore files larger than"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:135 qt\app.py:293
|
||||
msgid "Clear Cache"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:294
|
||||
msgid ""
|
||||
"Do you really want to clear the cache? This will remove all cached file "
|
||||
"hashes and picture analysis."
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:299
|
||||
msgid "Cache cleared."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:173
|
||||
msgid "Use dark style"
|
||||
msgstr ""
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
# Translators:
|
||||
# Andrew Senetar <arsenetar@gmail.com>, 2021
|
||||
# Fuan <jcfrt@posteo.net>, 2021
|
||||
# Robert M, 2021
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Fuan <jcfrt@posteo.net>, 2021\n"
|
||||
"Last-Translator: Robert M, 2021\n"
|
||||
"Language-Team: German (https://www.transifex.com/voltaicideas/teams/116153/de/)\n"
|
||||
"Language: de\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -47,7 +48,7 @@ msgstr "Kopiere"
|
||||
msgid "Sending to Trash"
|
||||
msgstr "Verschiebe in den Papierkorb"
|
||||
|
||||
#: core\app.py:308
|
||||
#: core\app.py:289
|
||||
msgid ""
|
||||
"A previous action is still hanging in there. You can't start a new one yet. "
|
||||
"Wait a few seconds, then try again."
|
||||
@@ -55,36 +56,40 @@ msgstr ""
|
||||
"Eine vorherige Aktion ist noch in der Bearbeitung. Sie können noch keine "
|
||||
"Neue starten. Warten Sie einige Sekunden und versuchen es erneut."
|
||||
|
||||
#: core\app.py:318
|
||||
#: core\app.py:300
|
||||
msgid "No duplicates found."
|
||||
msgstr "Keine Duplikate gefunden."
|
||||
|
||||
#: core\app.py:333
|
||||
#: core\app.py:315
|
||||
msgid "All marked files were copied successfully."
|
||||
msgstr "Alle markierten Dateien wurden erfolgreich kopiert."
|
||||
|
||||
#: core\app.py:334
|
||||
#: core\app.py:317
|
||||
msgid "All marked files were moved successfully."
|
||||
msgstr "Alle markierten Dateien wurden erfolgreich verschoben."
|
||||
|
||||
#: core\app.py:335
|
||||
#: core\app.py:319
|
||||
msgid "All marked files were deleted successfully."
|
||||
msgstr "Alle markierten Dateien wurden erfolgreich gelöscht."
|
||||
|
||||
#: core\app.py:321
|
||||
msgid "All marked files were successfully sent to Trash."
|
||||
msgstr ""
|
||||
"Alle markierten Dateien wurden erfolgreich in den Papierkorb verschoben."
|
||||
|
||||
#: core\app.py:343
|
||||
#: core\app.py:326
|
||||
msgid "Could not load file: {}"
|
||||
msgstr "Konnte Datei {} nicht laden."
|
||||
|
||||
#: core\app.py:399
|
||||
#: core\app.py:382
|
||||
msgid "'{}' already is in the list."
|
||||
msgstr "'{}' ist bereits in der Liste."
|
||||
|
||||
#: core\app.py:401
|
||||
#: core\app.py:384
|
||||
msgid "'{}' does not exist."
|
||||
msgstr "'{}' existiert nicht."
|
||||
|
||||
#: core\app.py:410
|
||||
#: core\app.py:392
|
||||
msgid ""
|
||||
"All selected %d matches are going to be ignored in all subsequent scans. "
|
||||
"Continue?"
|
||||
@@ -92,65 +97,69 @@ msgstr ""
|
||||
"Alle %d ausgewählten Dateien werden in zukünftigen Scans ignoriert. "
|
||||
"Fortfahren?"
|
||||
|
||||
#: core\app.py:486
|
||||
#: core\app.py:469
|
||||
msgid "Select a directory to copy marked files to"
|
||||
msgstr ""
|
||||
"Wählen Sie ein Verzeichnis aus, in das markierte Dateien kopiert werden "
|
||||
"sollen"
|
||||
|
||||
#: core\app.py:487
|
||||
#: core\app.py:471
|
||||
msgid "Select a directory to move marked files to"
|
||||
msgstr ""
|
||||
"Wählen Sie ein Verzeichnis aus, in das markierte Dateien verschoben werden "
|
||||
"sollen"
|
||||
|
||||
#: core\app.py:527
|
||||
#: core\app.py:510
|
||||
msgid "Select a destination for your exported CSV"
|
||||
msgstr "Zielverzeichnis für den CSV Export angeben"
|
||||
|
||||
#: core\app.py:534 core\app.py:801 core\app.py:811
|
||||
#: core\app.py:516 core\app.py:771 core\app.py:781
|
||||
msgid "Couldn't write to file: {}"
|
||||
msgstr "Konnte Datei {} nicht schreiben."
|
||||
|
||||
#: core\app.py:559
|
||||
#: core\app.py:539
|
||||
msgid "You have no custom command set up. Set it up in your preferences."
|
||||
msgstr ""
|
||||
"Sie haben noch keinen Befehl erstellt. Bitte dies in den Einstellungen vornehmen.\n"
|
||||
"Bsp.: \"C:\\Program Files\\Diff\\Diff.exe\" \"%d\" \"%r\""
|
||||
|
||||
#: core\app.py:727 core\app.py:740
|
||||
#: core\app.py:695 core\app.py:707
|
||||
msgid "You are about to remove %d files from results. Continue?"
|
||||
msgstr "%d Dateien werden aus der Ergebnisliste entfernt. Fortfahren?"
|
||||
|
||||
#: core\app.py:774
|
||||
#: core\app.py:743
|
||||
msgid "{} duplicate groups were changed by the re-prioritization."
|
||||
msgstr "{} Duplikat-Gruppen wurden durch die Neu-Priorisierung geändert."
|
||||
|
||||
#: core\app.py:821
|
||||
#: core\app.py:790
|
||||
msgid "The selected directories contain no scannable file."
|
||||
msgstr "Ausgewählte Ordner enthalten keine scannbaren Dateien."
|
||||
|
||||
#: core\app.py:835
|
||||
#: core\app.py:803
|
||||
msgid "Collecting files to scan"
|
||||
msgstr "Sammle zu scannende Dateien..."
|
||||
|
||||
#: core\app.py:891
|
||||
#: core\app.py:850
|
||||
msgid "%s (%d discarded)"
|
||||
msgstr "%s (%d verworfen)"
|
||||
|
||||
#: core\engine.py:244 core\engine.py:288
|
||||
msgid "0 matches found"
|
||||
msgstr "0 Übereinstimmungen gefunden"
|
||||
#: core\directories.py:191
|
||||
msgid "Collected {} files to scan"
|
||||
msgstr "{} Dateien für Scan gesammelt"
|
||||
|
||||
#: core\engine.py:262 core\engine.py:296
|
||||
msgid "%d matches found"
|
||||
msgstr "%d Übereinstimmungen gefunden"
|
||||
#: core\directories.py:207
|
||||
msgid "Collected {} folders to scan"
|
||||
msgstr "{} Ordner für Scan gesammelt"
|
||||
|
||||
#: core\gui\deletion_options.py:73
|
||||
#: core\engine.py:27
|
||||
msgid "%d matches found from %d groups"
|
||||
msgstr "%d Treffer in %d Gruppen gefunden"
|
||||
|
||||
#: core\gui\deletion_options.py:71
|
||||
msgid "You are sending {} file(s) to the Trash."
|
||||
msgstr "Verschiebe {} Datei(en) in den Papierkorb."
|
||||
|
||||
#: core\gui\exclude_list_table.py:15
|
||||
#: core\gui\exclude_list_table.py:14
|
||||
msgid "Regular Expressions"
|
||||
msgstr "Reguläre Ausdrücke"
|
||||
|
||||
@@ -182,15 +191,15 @@ msgstr "Inhalt"
|
||||
msgid "Analyzed %d/%d pictures"
|
||||
msgstr "Analysiere Bild %d/%d"
|
||||
|
||||
#: core\pe\matchblock.py:181
|
||||
#: core\pe\matchblock.py:177
|
||||
msgid "Performed %d/%d chunk matches"
|
||||
msgstr "%d/%d Chunk-Matches ausgeführt"
|
||||
|
||||
#: core\pe\matchblock.py:191
|
||||
#: core\pe\matchblock.py:185
|
||||
msgid "Preparing for matching"
|
||||
msgstr "Bereite Matching vor"
|
||||
|
||||
#: core\pe\matchblock.py:244
|
||||
#: core\pe\matchblock.py:234
|
||||
msgid "Verified %d/%d matches"
|
||||
msgstr "%d/%d verifizierte Übereinstimmungen"
|
||||
|
||||
@@ -238,23 +247,23 @@ msgstr "Neuste"
|
||||
msgid "Oldest"
|
||||
msgstr "Älterste"
|
||||
|
||||
#: core\results.py:142
|
||||
#: core\results.py:134
|
||||
msgid "%d / %d (%s / %s) duplicates marked."
|
||||
msgstr "%d / %d (%s / %s) Duplikate markiert."
|
||||
|
||||
#: core\results.py:149
|
||||
#: core\results.py:141
|
||||
msgid " filter: %s"
|
||||
msgstr " Filter: %s"
|
||||
|
||||
#: core\scanner.py:85
|
||||
#: core\scanner.py:90
|
||||
msgid "Read size of %d/%d files"
|
||||
msgstr "Lese Größe von %d/%d Dateien"
|
||||
|
||||
#: core\scanner.py:109
|
||||
#: core\scanner.py:116
|
||||
msgid "Read metadata of %d/%d files"
|
||||
msgstr "Lese Metadaten von %d/%d Dateien"
|
||||
|
||||
#: core\scanner.py:147
|
||||
#: core\scanner.py:154
|
||||
msgid "Almost done! Fiddling with results..."
|
||||
msgstr "Fast fertig! Arrangiere Ergebnisse..."
|
||||
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
# Translators:
|
||||
# Andrew Senetar <arsenetar@gmail.com>, 2021
|
||||
# Fuan <jcfrt@posteo.net>, 2021
|
||||
# Robert M, 2021
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Fuan <jcfrt@posteo.net>, 2021\n"
|
||||
"Last-Translator: Robert M, 2021\n"
|
||||
"Language-Team: German (https://www.transifex.com/voltaicideas/teams/116153/de/)\n"
|
||||
"Language: de\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -946,3 +947,45 @@ msgstr "Allgemeines"
|
||||
#: qt\preferences_dialog.py:286
|
||||
msgid "Display"
|
||||
msgstr "Anzeige"
|
||||
|
||||
#: qt\se\preferences_dialog.py:70
|
||||
msgid "Partially hash files bigger than"
|
||||
msgstr "Dateien partiell hashen die größer sind als"
|
||||
|
||||
#: qt\se\preferences_dialog.py:80
|
||||
msgid "MB"
|
||||
msgstr "MB"
|
||||
|
||||
#: qt\preferences_dialog.py:163
|
||||
msgid "Use native OS dialogs"
|
||||
msgstr "Benutzer System-eigene Dialoge"
|
||||
|
||||
#: qt\preferences_dialog.py:166
|
||||
msgid ""
|
||||
"For actions such as file/folder selection use the OS native dialogs.\n"
|
||||
"Some native dialogs have limited functionality."
|
||||
msgstr ""
|
||||
"Benutzer System-eigene Dialoge für Aktionen wie Datei/Ordern-Auswahl\n"
|
||||
"Manche System-eigene Dialoge sind in ihren Funktionen limitiert."
|
||||
|
||||
#: qt\se\preferences_dialog.py:68
|
||||
msgid "Ignore files larger than"
|
||||
msgstr "Ignoriere Dateien größer als"
|
||||
|
||||
#: qt\app.py:135 qt\app.py:293
|
||||
msgid "Clear Cache"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:294
|
||||
msgid ""
|
||||
"Do you really want to clear the cache? This will remove all cached file "
|
||||
"hashes and picture analysis."
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:299
|
||||
msgid "Cache cleared."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:173
|
||||
msgid "Use dark style"
|
||||
msgstr ""
|
||||
|
||||
@@ -48,7 +48,7 @@ msgstr "Αντιγραφή"
|
||||
msgid "Sending to Trash"
|
||||
msgstr "Αποστολή στα σκουπίδια"
|
||||
|
||||
#: core\app.py:308
|
||||
#: core\app.py:289
|
||||
msgid ""
|
||||
"A previous action is still hanging in there. You can't start a new one yet. "
|
||||
"Wait a few seconds, then try again."
|
||||
@@ -56,94 +56,102 @@ msgstr ""
|
||||
"Μια προηγούμενη ενέργεια είναι σε εξέλιξη. Δεν μπορείτε να ξεκινήσετε "
|
||||
"καινούργια ακόμα. Περιμένετε λίγα δευτερόλεπτα, έπειτα προσπαθήστε ξανά."
|
||||
|
||||
#: core\app.py:318
|
||||
#: core\app.py:300
|
||||
msgid "No duplicates found."
|
||||
msgstr "Δεν βρέθηκαν διπλότυπα."
|
||||
|
||||
#: core\app.py:333
|
||||
#: core\app.py:315
|
||||
msgid "All marked files were copied successfully."
|
||||
msgstr "Όλα τα επιλεγμένα αρχεία αντιγράφηκαν επιτυχώς."
|
||||
|
||||
#: core\app.py:334
|
||||
#: core\app.py:317
|
||||
msgid "All marked files were moved successfully."
|
||||
msgstr "Όλα τα επιλεγμένα αρχεία μετακινήθηκαν επιτυχώς."
|
||||
|
||||
#: core\app.py:335
|
||||
#: core\app.py:319
|
||||
msgid "All marked files were deleted successfully."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:321
|
||||
msgid "All marked files were successfully sent to Trash."
|
||||
msgstr "Όλα τα επιλεγμένα αρχεία στάλθηκαν με επιτυχία στον κάδο."
|
||||
|
||||
#: core\app.py:343
|
||||
#: core\app.py:326
|
||||
msgid "Could not load file: {}"
|
||||
msgstr "Δεν ήταν δυνατή η φόρτωση του αρχείου: {}"
|
||||
|
||||
#: core\app.py:399
|
||||
#: core\app.py:382
|
||||
msgid "'{}' already is in the list."
|
||||
msgstr "'{}' υπάρχει ήδη στη λίστα."
|
||||
|
||||
#: core\app.py:401
|
||||
#: core\app.py:384
|
||||
msgid "'{}' does not exist."
|
||||
msgstr "'{}' δεν υπάρχει."
|
||||
|
||||
#: core\app.py:410
|
||||
#: core\app.py:392
|
||||
msgid ""
|
||||
"All selected %d matches are going to be ignored in all subsequent scans. "
|
||||
"Continue?"
|
||||
msgstr ""
|
||||
"Όλα τα επιλεγμένα %d στοιχεία θα αγνοηθούν σε μελλοντικές σαρώσεις.Συνέχεια;"
|
||||
|
||||
#: core\app.py:486
|
||||
#: core\app.py:469
|
||||
msgid "Select a directory to copy marked files to"
|
||||
msgstr "Επιλέξτε έναν κατάλογο για να αντιγράψετε επισημασμένα αρχεία."
|
||||
|
||||
#: core\app.py:487
|
||||
#: core\app.py:471
|
||||
msgid "Select a directory to move marked files to"
|
||||
msgstr "Επιλέξτε έναν κατάλογο για να μετακινήσετε τα επισημασμένα αρχεία."
|
||||
|
||||
#: core\app.py:527
|
||||
#: core\app.py:510
|
||||
msgid "Select a destination for your exported CSV"
|
||||
msgstr "Επιλέξτε έναν προορισμό για το εξαγόμενο CSV σας"
|
||||
|
||||
#: core\app.py:534 core\app.py:801 core\app.py:811
|
||||
#: core\app.py:516 core\app.py:771 core\app.py:781
|
||||
msgid "Couldn't write to file: {}"
|
||||
msgstr "Δεν ήταν δυνατή η εγγραφή στο αρχείο: {}"
|
||||
|
||||
#: core\app.py:559
|
||||
#: core\app.py:539
|
||||
msgid "You have no custom command set up. Set it up in your preferences."
|
||||
msgstr "Δεν έχετε ορίσει ειδική εντολή. Ρυθμίστε τη στις προτιμήσεις σας. "
|
||||
|
||||
#: core\app.py:727 core\app.py:740
|
||||
#: core\app.py:695 core\app.py:707
|
||||
msgid "You are about to remove %d files from results. Continue?"
|
||||
msgstr "Πρόκειται να αφαιρέσετε %d αρχεία από τα αποτελέσματα. Συνέχεια;"
|
||||
|
||||
#: core\app.py:774
|
||||
#: core\app.py:743
|
||||
msgid "{} duplicate groups were changed by the re-prioritization."
|
||||
msgstr "{} ομάδες διπλοτύπων άλλαξαν από το επαναπροσδιορισμό."
|
||||
|
||||
#: core\app.py:821
|
||||
#: core\app.py:790
|
||||
msgid "The selected directories contain no scannable file."
|
||||
msgstr "Οι επιλεγμένοι φάκελοι δεν περιέχουν σαρώσιμα αρχεία."
|
||||
|
||||
#: core\app.py:835
|
||||
#: core\app.py:803
|
||||
msgid "Collecting files to scan"
|
||||
msgstr "Συλλογή αρχείων για σάρωση"
|
||||
|
||||
#: core\app.py:891
|
||||
#: core\app.py:850
|
||||
msgid "%s (%d discarded)"
|
||||
msgstr "%s (%d απορρίφθηκαν)"
|
||||
|
||||
#: core\engine.py:244 core\engine.py:288
|
||||
msgid "0 matches found"
|
||||
msgstr "0 διπλότυπα βρέθηκαν"
|
||||
#: core\directories.py:191
|
||||
msgid "Collected {} files to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\engine.py:262 core\engine.py:296
|
||||
msgid "%d matches found"
|
||||
msgstr "Βρέθηκαν %d διπλότυπα"
|
||||
#: core\directories.py:207
|
||||
msgid "Collected {} folders to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\gui\deletion_options.py:73
|
||||
#: core\engine.py:27
|
||||
msgid "%d matches found from %d groups"
|
||||
msgstr ""
|
||||
|
||||
#: core\gui\deletion_options.py:71
|
||||
msgid "You are sending {} file(s) to the Trash."
|
||||
msgstr "Στέλνετε {} αρχεία στα σκουπίδια."
|
||||
|
||||
#: core\gui\exclude_list_table.py:15
|
||||
#: core\gui\exclude_list_table.py:14
|
||||
msgid "Regular Expressions"
|
||||
msgstr "Κανονικές εκφράσεις"
|
||||
|
||||
@@ -175,15 +183,15 @@ msgstr "Περιεχόμενα"
|
||||
msgid "Analyzed %d/%d pictures"
|
||||
msgstr "Ανάλυση %d/%d εικόνων"
|
||||
|
||||
#: core\pe\matchblock.py:181
|
||||
#: core\pe\matchblock.py:177
|
||||
msgid "Performed %d/%d chunk matches"
|
||||
msgstr "Εκτέλεση %d/%d μερικής ταυτοποίησης"
|
||||
|
||||
#: core\pe\matchblock.py:191
|
||||
#: core\pe\matchblock.py:185
|
||||
msgid "Preparing for matching"
|
||||
msgstr "Προετοιμασία για σύγκριση"
|
||||
|
||||
#: core\pe\matchblock.py:244
|
||||
#: core\pe\matchblock.py:234
|
||||
msgid "Verified %d/%d matches"
|
||||
msgstr "Πιστοποίηση %d/%d ταυτόσημων"
|
||||
|
||||
@@ -231,23 +239,23 @@ msgstr "Νεώτερο"
|
||||
msgid "Oldest"
|
||||
msgstr "Παλαιότερο"
|
||||
|
||||
#: core\results.py:142
|
||||
#: core\results.py:134
|
||||
msgid "%d / %d (%s / %s) duplicates marked."
|
||||
msgstr "%d / %d (%s / %s) επιλεγμένα διπλότυπα."
|
||||
|
||||
#: core\results.py:149
|
||||
#: core\results.py:141
|
||||
msgid " filter: %s"
|
||||
msgstr " φίλτρο: %s"
|
||||
|
||||
#: core\scanner.py:85
|
||||
#: core\scanner.py:90
|
||||
msgid "Read size of %d/%d files"
|
||||
msgstr "Ανάγνωση μεγέθους %d/%d αρχείων"
|
||||
|
||||
#: core\scanner.py:109
|
||||
#: core\scanner.py:116
|
||||
msgid "Read metadata of %d/%d files"
|
||||
msgstr "Ανάγνωση μεταδεδομένων των %d/%d αρχείων"
|
||||
|
||||
#: core\scanner.py:147
|
||||
#: core\scanner.py:154
|
||||
msgid "Almost done! Fiddling with results..."
|
||||
msgstr "Σχεδόν τελείωσα! Παιχνίδι με αποτελέσματα ..."
|
||||
|
||||
|
||||
@@ -954,3 +954,43 @@ msgstr "Γενικός"
|
||||
#: qt\preferences_dialog.py:286
|
||||
msgid "Display"
|
||||
msgstr "Απεικόνιση"
|
||||
|
||||
#: qt\se\preferences_dialog.py:70
|
||||
msgid "Partially hash files bigger than"
|
||||
msgstr ""
|
||||
|
||||
#: qt\se\preferences_dialog.py:80
|
||||
msgid "MB"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:163
|
||||
msgid "Use native OS dialogs"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:166
|
||||
msgid ""
|
||||
"For actions such as file/folder selection use the OS native dialogs.\n"
|
||||
"Some native dialogs have limited functionality."
|
||||
msgstr ""
|
||||
|
||||
#: qt\se\preferences_dialog.py:68
|
||||
msgid "Ignore files larger than"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:135 qt\app.py:293
|
||||
msgid "Clear Cache"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:294
|
||||
msgid ""
|
||||
"Do you really want to clear the cache? This will remove all cached file "
|
||||
"hashes and picture analysis."
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:299
|
||||
msgid "Cache cleared."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:173
|
||||
msgid "Use dark style"
|
||||
msgstr ""
|
||||
|
||||
@@ -47,7 +47,7 @@ msgstr "Copiando"
|
||||
msgid "Sending to Trash"
|
||||
msgstr "Enviando a la Papelera"
|
||||
|
||||
#: core\app.py:308
|
||||
#: core\app.py:289
|
||||
msgid ""
|
||||
"A previous action is still hanging in there. You can't start a new one yet. "
|
||||
"Wait a few seconds, then try again."
|
||||
@@ -55,36 +55,40 @@ msgstr ""
|
||||
"Una acción previa sigue ejecutándose. No puede abrir una nueva todavía. "
|
||||
"Espere unos segundos y vuelva a intentarlo."
|
||||
|
||||
#: core\app.py:318
|
||||
#: core\app.py:300
|
||||
msgid "No duplicates found."
|
||||
msgstr "No se han encontrado duplicados."
|
||||
|
||||
#: core\app.py:333
|
||||
#: core\app.py:315
|
||||
msgid "All marked files were copied successfully."
|
||||
msgstr ""
|
||||
"Todos los ficheros seleccionados han sido copiados satisfactoriamente."
|
||||
|
||||
#: core\app.py:334
|
||||
#: core\app.py:317
|
||||
msgid "All marked files were moved successfully."
|
||||
msgstr "Todos los ficheros seleccionados se han movidos satisfactoriamente."
|
||||
|
||||
#: core\app.py:335
|
||||
#: core\app.py:319
|
||||
msgid "All marked files were deleted successfully."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:321
|
||||
msgid "All marked files were successfully sent to Trash."
|
||||
msgstr "Todo los ficheros marcados se han enviado a la papelera exitosamente."
|
||||
|
||||
#: core\app.py:343
|
||||
#: core\app.py:326
|
||||
msgid "Could not load file: {}"
|
||||
msgstr "No se pudo cargar el archivo: {}"
|
||||
|
||||
#: core\app.py:399
|
||||
#: core\app.py:382
|
||||
msgid "'{}' already is in the list."
|
||||
msgstr "'{}' ya está en la lista."
|
||||
|
||||
#: core\app.py:401
|
||||
#: core\app.py:384
|
||||
msgid "'{}' does not exist."
|
||||
msgstr "'{}' no existe."
|
||||
|
||||
#: core\app.py:410
|
||||
#: core\app.py:392
|
||||
msgid ""
|
||||
"All selected %d matches are going to be ignored in all subsequent scans. "
|
||||
"Continue?"
|
||||
@@ -92,59 +96,63 @@ msgstr ""
|
||||
"Todas las %d coincidencias seleccionadas van a ser ignoradas en las "
|
||||
"subsiguientes exploraciones. ¿Continuar?"
|
||||
|
||||
#: core\app.py:486
|
||||
#: core\app.py:469
|
||||
msgid "Select a directory to copy marked files to"
|
||||
msgstr "Seleccione un directorio donde desee copiar los archivos marcados"
|
||||
|
||||
#: core\app.py:487
|
||||
#: core\app.py:471
|
||||
msgid "Select a directory to move marked files to"
|
||||
msgstr "Seleccione un directorio al que desee mover los archivos marcados"
|
||||
|
||||
#: core\app.py:527
|
||||
#: core\app.py:510
|
||||
msgid "Select a destination for your exported CSV"
|
||||
msgstr "Seleccionar un destino para el CSV seleccionado"
|
||||
|
||||
#: core\app.py:534 core\app.py:801 core\app.py:811
|
||||
#: core\app.py:516 core\app.py:771 core\app.py:781
|
||||
msgid "Couldn't write to file: {}"
|
||||
msgstr "No se pudo escribir en el archivo: {}"
|
||||
|
||||
#: core\app.py:559
|
||||
#: core\app.py:539
|
||||
msgid "You have no custom command set up. Set it up in your preferences."
|
||||
msgstr "No hay comandos configurados. Establézcalos en sus preferencias."
|
||||
|
||||
#: core\app.py:727 core\app.py:740
|
||||
#: core\app.py:695 core\app.py:707
|
||||
msgid "You are about to remove %d files from results. Continue?"
|
||||
msgstr "Está a punto de eliminar %d ficheros de resultados. ¿Continuar?"
|
||||
|
||||
#: core\app.py:774
|
||||
#: core\app.py:743
|
||||
msgid "{} duplicate groups were changed by the re-prioritization."
|
||||
msgstr "{} grupos de duplicados han sido cambiados por la re-priorización"
|
||||
|
||||
#: core\app.py:821
|
||||
#: core\app.py:790
|
||||
msgid "The selected directories contain no scannable file."
|
||||
msgstr "Las carpetas seleccionadas no contienen ficheros para explorar."
|
||||
|
||||
#: core\app.py:835
|
||||
#: core\app.py:803
|
||||
msgid "Collecting files to scan"
|
||||
msgstr "Recopilando ficheros a explorar"
|
||||
|
||||
#: core\app.py:891
|
||||
#: core\app.py:850
|
||||
msgid "%s (%d discarded)"
|
||||
msgstr "%s (%d descartados)"
|
||||
|
||||
#: core\engine.py:244 core\engine.py:288
|
||||
msgid "0 matches found"
|
||||
msgstr "0 coincidencias"
|
||||
#: core\directories.py:191
|
||||
msgid "Collected {} files to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\engine.py:262 core\engine.py:296
|
||||
msgid "%d matches found"
|
||||
msgstr "%d coincidencias encontradas"
|
||||
#: core\directories.py:207
|
||||
msgid "Collected {} folders to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\gui\deletion_options.py:73
|
||||
#: core\engine.py:27
|
||||
msgid "%d matches found from %d groups"
|
||||
msgstr ""
|
||||
|
||||
#: core\gui\deletion_options.py:71
|
||||
msgid "You are sending {} file(s) to the Trash."
|
||||
msgstr "Enviando {} fichero(s) a la Papelera"
|
||||
|
||||
#: core\gui\exclude_list_table.py:15
|
||||
#: core\gui\exclude_list_table.py:14
|
||||
msgid "Regular Expressions"
|
||||
msgstr "Expresiones regulares"
|
||||
|
||||
@@ -177,15 +185,15 @@ msgstr "Contenido"
|
||||
msgid "Analyzed %d/%d pictures"
|
||||
msgstr "Analizadas %d/%d imágenes"
|
||||
|
||||
#: core\pe\matchblock.py:181
|
||||
#: core\pe\matchblock.py:177
|
||||
msgid "Performed %d/%d chunk matches"
|
||||
msgstr "Realizado %d/%d trozos coincidentes"
|
||||
|
||||
#: core\pe\matchblock.py:191
|
||||
#: core\pe\matchblock.py:185
|
||||
msgid "Preparing for matching"
|
||||
msgstr "Preparando para coincidencias"
|
||||
|
||||
#: core\pe\matchblock.py:244
|
||||
#: core\pe\matchblock.py:234
|
||||
msgid "Verified %d/%d matches"
|
||||
msgstr "Verificadas %d/%d coincidencias"
|
||||
|
||||
@@ -233,23 +241,23 @@ msgstr "El más nuevo"
|
||||
msgid "Oldest"
|
||||
msgstr "El más antiguo"
|
||||
|
||||
#: core\results.py:142
|
||||
#: core\results.py:134
|
||||
msgid "%d / %d (%s / %s) duplicates marked."
|
||||
msgstr "%d / %d (%s / %s) duplicados marcados."
|
||||
|
||||
#: core\results.py:149
|
||||
#: core\results.py:141
|
||||
msgid " filter: %s"
|
||||
msgstr "filtro: %s"
|
||||
|
||||
#: core\scanner.py:85
|
||||
#: core\scanner.py:90
|
||||
msgid "Read size of %d/%d files"
|
||||
msgstr "Tamaño de lectura de %d/%d ficheros"
|
||||
|
||||
#: core\scanner.py:109
|
||||
#: core\scanner.py:116
|
||||
msgid "Read metadata of %d/%d files"
|
||||
msgstr "Leyendo metadatos de %d/%d ficheros"
|
||||
|
||||
#: core\scanner.py:147
|
||||
#: core\scanner.py:154
|
||||
msgid "Almost done! Fiddling with results..."
|
||||
msgstr "¡Casi termino! Jugando con los resultados..."
|
||||
|
||||
|
||||
@@ -947,3 +947,43 @@ msgstr "General"
|
||||
#: qt\preferences_dialog.py:286
|
||||
msgid "Display"
|
||||
msgstr "Visualización"
|
||||
|
||||
#: qt\se\preferences_dialog.py:70
|
||||
msgid "Partially hash files bigger than"
|
||||
msgstr ""
|
||||
|
||||
#: qt\se\preferences_dialog.py:80
|
||||
msgid "MB"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:163
|
||||
msgid "Use native OS dialogs"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:166
|
||||
msgid ""
|
||||
"For actions such as file/folder selection use the OS native dialogs.\n"
|
||||
"Some native dialogs have limited functionality."
|
||||
msgstr ""
|
||||
|
||||
#: qt\se\preferences_dialog.py:68
|
||||
msgid "Ignore files larger than"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:135 qt\app.py:293
|
||||
msgid "Clear Cache"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:294
|
||||
msgid ""
|
||||
"Do you really want to clear the cache? This will remove all cached file "
|
||||
"hashes and picture analysis."
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:299
|
||||
msgid "Cache cleared."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:173
|
||||
msgid "Use dark style"
|
||||
msgstr ""
|
||||
|
||||
@@ -47,7 +47,7 @@ msgstr "Copie en cours"
|
||||
msgid "Sending to Trash"
|
||||
msgstr "Envoi de fichiers à la corbeille"
|
||||
|
||||
#: core\app.py:308
|
||||
#: core\app.py:289
|
||||
msgid ""
|
||||
"A previous action is still hanging in there. You can't start a new one yet. "
|
||||
"Wait a few seconds, then try again."
|
||||
@@ -55,95 +55,103 @@ msgstr ""
|
||||
"Une action précédente est encore en cours. Attendez quelques secondes avant "
|
||||
"d'en repartir une nouvelle."
|
||||
|
||||
#: core\app.py:318
|
||||
#: core\app.py:300
|
||||
msgid "No duplicates found."
|
||||
msgstr "Aucun doublon trouvé."
|
||||
|
||||
#: core\app.py:333
|
||||
#: core\app.py:315
|
||||
msgid "All marked files were copied successfully."
|
||||
msgstr "Tous les fichiers marqués ont été copiés correctement."
|
||||
|
||||
#: core\app.py:334
|
||||
#: core\app.py:317
|
||||
msgid "All marked files were moved successfully."
|
||||
msgstr "Tous les fichiers marqués ont été déplacés correctement."
|
||||
|
||||
#: core\app.py:335
|
||||
#: core\app.py:319
|
||||
msgid "All marked files were deleted successfully."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:321
|
||||
msgid "All marked files were successfully sent to Trash."
|
||||
msgstr ""
|
||||
"Tous les fichiers marqués ont été correctement envoyés à la corbeille."
|
||||
|
||||
#: core\app.py:343
|
||||
#: core\app.py:326
|
||||
msgid "Could not load file: {}"
|
||||
msgstr "Impossible d'ouvrir le fichier: {}"
|
||||
|
||||
#: core\app.py:399
|
||||
#: core\app.py:382
|
||||
msgid "'{}' already is in the list."
|
||||
msgstr "'{}' est déjà dans la liste."
|
||||
|
||||
#: core\app.py:401
|
||||
#: core\app.py:384
|
||||
msgid "'{}' does not exist."
|
||||
msgstr "'{}' n'existe pas."
|
||||
|
||||
#: core\app.py:410
|
||||
#: core\app.py:392
|
||||
msgid ""
|
||||
"All selected %d matches are going to be ignored in all subsequent scans. "
|
||||
"Continue?"
|
||||
msgstr "%d fichiers seront ignorés des prochains scans. Continuer?"
|
||||
|
||||
#: core\app.py:486
|
||||
#: core\app.py:469
|
||||
msgid "Select a directory to copy marked files to"
|
||||
msgstr "Sélectionnez un dossier vers lequel copier les fichiers marqués."
|
||||
|
||||
#: core\app.py:487
|
||||
#: core\app.py:471
|
||||
msgid "Select a directory to move marked files to"
|
||||
msgstr "Sélectionnez un dossier vers lequel déplacer les fichiers marqués."
|
||||
|
||||
#: core\app.py:527
|
||||
#: core\app.py:510
|
||||
msgid "Select a destination for your exported CSV"
|
||||
msgstr "Choisissez une destination pour votre exportation CSV"
|
||||
|
||||
#: core\app.py:534 core\app.py:801 core\app.py:811
|
||||
#: core\app.py:516 core\app.py:771 core\app.py:781
|
||||
msgid "Couldn't write to file: {}"
|
||||
msgstr "Impossible d'écrire le fichier: {}"
|
||||
|
||||
#: core\app.py:559
|
||||
#: core\app.py:539
|
||||
msgid "You have no custom command set up. Set it up in your preferences."
|
||||
msgstr ""
|
||||
"Vous n'avez pas de commande personnalisée. Ajoutez-la dans vos préférences."
|
||||
|
||||
#: core\app.py:727 core\app.py:740
|
||||
#: core\app.py:695 core\app.py:707
|
||||
msgid "You are about to remove %d files from results. Continue?"
|
||||
msgstr "%d fichiers seront retirés des résultats. Continuer?"
|
||||
|
||||
#: core\app.py:774
|
||||
#: core\app.py:743
|
||||
msgid "{} duplicate groups were changed by the re-prioritization."
|
||||
msgstr "{} groupes de doublons ont été modifiés par la re-prioritisation."
|
||||
|
||||
#: core\app.py:821
|
||||
#: core\app.py:790
|
||||
msgid "The selected directories contain no scannable file."
|
||||
msgstr "Les dossiers sélectionnés ne contiennent pas de fichiers valides."
|
||||
|
||||
#: core\app.py:835
|
||||
#: core\app.py:803
|
||||
msgid "Collecting files to scan"
|
||||
msgstr "Collecte des fichiers à scanner"
|
||||
|
||||
#: core\app.py:891
|
||||
#: core\app.py:850
|
||||
msgid "%s (%d discarded)"
|
||||
msgstr "%s (%d hors-groupe)"
|
||||
|
||||
#: core\engine.py:244 core\engine.py:288
|
||||
msgid "0 matches found"
|
||||
msgstr "0 paires trouvées"
|
||||
#: core\directories.py:191
|
||||
msgid "Collected {} files to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\engine.py:262 core\engine.py:296
|
||||
msgid "%d matches found"
|
||||
msgstr "%d paires trouvées"
|
||||
#: core\directories.py:207
|
||||
msgid "Collected {} folders to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\gui\deletion_options.py:73
|
||||
#: core\engine.py:27
|
||||
msgid "%d matches found from %d groups"
|
||||
msgstr ""
|
||||
|
||||
#: core\gui\deletion_options.py:71
|
||||
msgid "You are sending {} file(s) to the Trash."
|
||||
msgstr "Vous envoyez {} fichier(s) à la corbeille."
|
||||
|
||||
#: core\gui\exclude_list_table.py:15
|
||||
#: core\gui\exclude_list_table.py:14
|
||||
msgid "Regular Expressions"
|
||||
msgstr "Expressions régulières"
|
||||
|
||||
@@ -177,15 +185,15 @@ msgstr "Contenu"
|
||||
msgid "Analyzed %d/%d pictures"
|
||||
msgstr "Analyzé %d/%d images"
|
||||
|
||||
#: core\pe\matchblock.py:181
|
||||
#: core\pe\matchblock.py:177
|
||||
msgid "Performed %d/%d chunk matches"
|
||||
msgstr "%d/%d blocs d'images comparés"
|
||||
|
||||
#: core\pe\matchblock.py:191
|
||||
#: core\pe\matchblock.py:185
|
||||
msgid "Preparing for matching"
|
||||
msgstr "Préparation pour la comparaison"
|
||||
|
||||
#: core\pe\matchblock.py:244
|
||||
#: core\pe\matchblock.py:234
|
||||
msgid "Verified %d/%d matches"
|
||||
msgstr "Vérifié %d/%d paires"
|
||||
|
||||
@@ -233,23 +241,23 @@ msgstr "Plus récent"
|
||||
msgid "Oldest"
|
||||
msgstr "Moins récent"
|
||||
|
||||
#: core\results.py:142
|
||||
#: core\results.py:134
|
||||
msgid "%d / %d (%s / %s) duplicates marked."
|
||||
msgstr "%d / %d (%s / %s) doublons marqués."
|
||||
|
||||
#: core\results.py:149
|
||||
#: core\results.py:141
|
||||
msgid " filter: %s"
|
||||
msgstr " filtre: %s"
|
||||
|
||||
#: core\scanner.py:85
|
||||
#: core\scanner.py:90
|
||||
msgid "Read size of %d/%d files"
|
||||
msgstr "Lu la taille de %d/%d fichiers"
|
||||
|
||||
#: core\scanner.py:109
|
||||
#: core\scanner.py:116
|
||||
msgid "Read metadata of %d/%d files"
|
||||
msgstr "Lu les métadonnées de %d/%d fichiers"
|
||||
|
||||
#: core\scanner.py:147
|
||||
#: core\scanner.py:154
|
||||
msgid "Almost done! Fiddling with results..."
|
||||
msgstr "Bientôt terminé! Bidouille des résultats..."
|
||||
|
||||
|
||||
@@ -942,3 +942,43 @@ msgstr "Général"
|
||||
#: qt\preferences_dialog.py:286
|
||||
msgid "Display"
|
||||
msgstr "Affichage"
|
||||
|
||||
#: qt\se\preferences_dialog.py:70
|
||||
msgid "Partially hash files bigger than"
|
||||
msgstr ""
|
||||
|
||||
#: qt\se\preferences_dialog.py:80
|
||||
msgid "MB"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:163
|
||||
msgid "Use native OS dialogs"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:166
|
||||
msgid ""
|
||||
"For actions such as file/folder selection use the OS native dialogs.\n"
|
||||
"Some native dialogs have limited functionality."
|
||||
msgstr ""
|
||||
|
||||
#: qt\se\preferences_dialog.py:68
|
||||
msgid "Ignore files larger than"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:135 qt\app.py:293
|
||||
msgid "Clear Cache"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:294
|
||||
msgid ""
|
||||
"Do you really want to clear the cache? This will remove all cached file "
|
||||
"hashes and picture analysis."
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:299
|
||||
msgid "Cache cleared."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:173
|
||||
msgid "Use dark style"
|
||||
msgstr ""
|
||||
|
||||
@@ -48,7 +48,7 @@ msgstr "Պատճենվում է"
|
||||
msgid "Sending to Trash"
|
||||
msgstr "Ուղարկվում է Աղբարկղ"
|
||||
|
||||
#: core\app.py:308
|
||||
#: core\app.py:289
|
||||
msgid ""
|
||||
"A previous action is still hanging in there. You can't start a new one yet. "
|
||||
"Wait a few seconds, then try again."
|
||||
@@ -56,95 +56,103 @@ msgstr ""
|
||||
"Նախորդ գործողությունը դեռևս ձեռադրում է այստեղ: Չեք կարող սկսել մեկ ուրիշը: "
|
||||
"Սպասեք մի քանի վայրկյան և կրկին փորձեք:"
|
||||
|
||||
#: core\app.py:318
|
||||
#: core\app.py:300
|
||||
msgid "No duplicates found."
|
||||
msgstr "Կրկնօրինակներ չկան:"
|
||||
|
||||
#: core\app.py:333
|
||||
#: core\app.py:315
|
||||
msgid "All marked files were copied successfully."
|
||||
msgstr "Բոլոր նշված ֆայլերը հաջողությամբ պատճենվել են:"
|
||||
|
||||
#: core\app.py:334
|
||||
#: core\app.py:317
|
||||
msgid "All marked files were moved successfully."
|
||||
msgstr "Բոլոր նշված ֆայլերը հաջողությամբ տեղափոխվել են:"
|
||||
|
||||
#: core\app.py:335
|
||||
#: core\app.py:319
|
||||
msgid "All marked files were deleted successfully."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:321
|
||||
msgid "All marked files were successfully sent to Trash."
|
||||
msgstr "Բոլոր նշված ֆայլերը հաջողությամբ Ջնջվել են:"
|
||||
|
||||
#: core\app.py:343
|
||||
#: core\app.py:326
|
||||
msgid "Could not load file: {}"
|
||||
msgstr "Հնարավոր չէ բեռնել ֆայլը: {}"
|
||||
|
||||
#: core\app.py:399
|
||||
#: core\app.py:382
|
||||
msgid "'{}' already is in the list."
|
||||
msgstr "'{}'-ը արդեն առկա է ցանկում:"
|
||||
|
||||
#: core\app.py:401
|
||||
#: core\app.py:384
|
||||
msgid "'{}' does not exist."
|
||||
msgstr "'{}'-ը գոյություն չունի:"
|
||||
|
||||
#: core\app.py:410
|
||||
#: core\app.py:392
|
||||
msgid ""
|
||||
"All selected %d matches are going to be ignored in all subsequent scans. "
|
||||
"Continue?"
|
||||
msgstr ""
|
||||
"Ընտրված %d համընկնումները կանտեսվեն հետագա բոլոր ստուգումներից: Շարունակե՞լ:"
|
||||
|
||||
#: core\app.py:486
|
||||
#: core\app.py:469
|
||||
msgid "Select a directory to copy marked files to"
|
||||
msgstr "Ընտրեք գրացուցակ, որտեղ ցանկանում եք պատճենել նշված ֆայլերը"
|
||||
|
||||
#: core\app.py:487
|
||||
#: core\app.py:471
|
||||
msgid "Select a directory to move marked files to"
|
||||
msgstr ""
|
||||
"Խնդրում ենք ընտրել գրացուցակ, որտեղ ցանկանում եք տեղափոխել նշված ֆայլերը"
|
||||
|
||||
#: core\app.py:527
|
||||
#: core\app.py:510
|
||||
msgid "Select a destination for your exported CSV"
|
||||
msgstr "Ընտրեք նպատակակետ ձեր արտահանված CSV- ի համար"
|
||||
|
||||
#: core\app.py:534 core\app.py:801 core\app.py:811
|
||||
#: core\app.py:516 core\app.py:771 core\app.py:781
|
||||
msgid "Couldn't write to file: {}"
|
||||
msgstr "Չէր կարող գրել է ֆայլը: {}"
|
||||
|
||||
#: core\app.py:559
|
||||
#: core\app.py:539
|
||||
msgid "You have no custom command set up. Set it up in your preferences."
|
||||
msgstr "Դուք չեք կատարել Հրամանի ընտրություն: Կատարեք այն կարգավորումներում:"
|
||||
|
||||
#: core\app.py:727 core\app.py:740
|
||||
#: core\app.py:695 core\app.py:707
|
||||
msgid "You are about to remove %d files from results. Continue?"
|
||||
msgstr "Դուք պատրաստվում եք ջնջելու %d ֆայլեր: Շարունակե՞լ:"
|
||||
|
||||
#: core\app.py:774
|
||||
#: core\app.py:743
|
||||
msgid "{} duplicate groups were changed by the re-prioritization."
|
||||
msgstr "{} կրկնօրինակ խմբերը փոխվել են առաջնահերթության կարգով:"
|
||||
|
||||
#: core\app.py:821
|
||||
#: core\app.py:790
|
||||
msgid "The selected directories contain no scannable file."
|
||||
msgstr "Ընտրված թղթապանակները պարունակում են չստուգվող ֆայլ:"
|
||||
|
||||
#: core\app.py:835
|
||||
#: core\app.py:803
|
||||
msgid "Collecting files to scan"
|
||||
msgstr "Հավաքվում են ֆայլեր՝ ստուգելու համար"
|
||||
|
||||
#: core\app.py:891
|
||||
#: core\app.py:850
|
||||
msgid "%s (%d discarded)"
|
||||
msgstr "%s (%d անպիտան)"
|
||||
|
||||
#: core\engine.py:244 core\engine.py:288
|
||||
msgid "0 matches found"
|
||||
msgstr "0 համընկնում է գտնվել"
|
||||
#: core\directories.py:191
|
||||
msgid "Collected {} files to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\engine.py:262 core\engine.py:296
|
||||
msgid "%d matches found"
|
||||
msgstr "%d համընկնում է գտնվել"
|
||||
#: core\directories.py:207
|
||||
msgid "Collected {} folders to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\gui\deletion_options.py:73
|
||||
#: core\engine.py:27
|
||||
msgid "%d matches found from %d groups"
|
||||
msgstr ""
|
||||
|
||||
#: core\gui\deletion_options.py:71
|
||||
msgid "You are sending {} file(s) to the Trash."
|
||||
msgstr "Դուք {} ֆայլ եք ուղարկում աղբարկղ:"
|
||||
|
||||
#: core\gui\exclude_list_table.py:15
|
||||
#: core\gui\exclude_list_table.py:14
|
||||
msgid "Regular Expressions"
|
||||
msgstr "Կանոնավոր արտահայտություններ"
|
||||
|
||||
@@ -176,15 +184,15 @@ msgstr "Բովանդակություն"
|
||||
msgid "Analyzed %d/%d pictures"
|
||||
msgstr "Ստուգվում է %d/%d նկարները"
|
||||
|
||||
#: core\pe\matchblock.py:181
|
||||
#: core\pe\matchblock.py:177
|
||||
msgid "Performed %d/%d chunk matches"
|
||||
msgstr "Կատարվում է %d/%d տվյալի համընկնում"
|
||||
|
||||
#: core\pe\matchblock.py:191
|
||||
#: core\pe\matchblock.py:185
|
||||
msgid "Preparing for matching"
|
||||
msgstr "Նախապատրաստեցվում է համընկնումը"
|
||||
|
||||
#: core\pe\matchblock.py:244
|
||||
#: core\pe\matchblock.py:234
|
||||
msgid "Verified %d/%d matches"
|
||||
msgstr "Ստուգում է %d/%d համընկնումները"
|
||||
|
||||
@@ -232,23 +240,23 @@ msgstr "Նորագույնը"
|
||||
msgid "Oldest"
|
||||
msgstr "Ամենահինը"
|
||||
|
||||
#: core\results.py:142
|
||||
#: core\results.py:134
|
||||
msgid "%d / %d (%s / %s) duplicates marked."
|
||||
msgstr "%d / %d (%s / %s) նշված կրկնօրինակներ:"
|
||||
|
||||
#: core\results.py:149
|
||||
#: core\results.py:141
|
||||
msgid " filter: %s"
|
||||
msgstr "ֆիլտր. %s"
|
||||
|
||||
#: core\scanner.py:85
|
||||
#: core\scanner.py:90
|
||||
msgid "Read size of %d/%d files"
|
||||
msgstr "Կարդալ %d/%d ֆայլերի չափը"
|
||||
|
||||
#: core\scanner.py:109
|
||||
#: core\scanner.py:116
|
||||
msgid "Read metadata of %d/%d files"
|
||||
msgstr "Կարդալ %d/%d ֆայլերի մետատվյալները"
|
||||
|
||||
#: core\scanner.py:147
|
||||
#: core\scanner.py:154
|
||||
msgid "Almost done! Fiddling with results..."
|
||||
msgstr "Գրեթե արված է! Արդյունքների կազմակերպում..."
|
||||
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
# Translators:
|
||||
# Andrew Senetar <arsenetar@gmail.com>, 2021
|
||||
# Fuan <jcfrt@posteo.net>, 2021
|
||||
# Emanuele, 2021
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Fuan <jcfrt@posteo.net>, 2021\n"
|
||||
"Last-Translator: Emanuele, 2021\n"
|
||||
"Language-Team: Italian (https://www.transifex.com/voltaicideas/teams/116153/it/)\n"
|
||||
"Language: it\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -48,7 +49,7 @@ msgstr "Copia in corso"
|
||||
msgid "Sending to Trash"
|
||||
msgstr "Spostamento nel cestino"
|
||||
|
||||
#: core\app.py:308
|
||||
#: core\app.py:289
|
||||
msgid ""
|
||||
"A previous action is still hanging in there. You can't start a new one yet. "
|
||||
"Wait a few seconds, then try again."
|
||||
@@ -56,35 +57,39 @@ msgstr ""
|
||||
"Un'azione precedente è ancora in corso. Non puoi cominciarne una nuova. "
|
||||
"Aspetta qualche secondo e quindi riprova."
|
||||
|
||||
#: core\app.py:318
|
||||
#: core\app.py:300
|
||||
msgid "No duplicates found."
|
||||
msgstr "Non sono stati trovati dei duplicati."
|
||||
|
||||
#: core\app.py:333
|
||||
#: core\app.py:315
|
||||
msgid "All marked files were copied successfully."
|
||||
msgstr "Tutti i file marcati sono stati copiati correttamente."
|
||||
|
||||
#: core\app.py:334
|
||||
#: core\app.py:317
|
||||
msgid "All marked files were moved successfully."
|
||||
msgstr "Tutti i file marcati sono stati spostati correttamente."
|
||||
|
||||
#: core\app.py:335
|
||||
#: core\app.py:319
|
||||
msgid "All marked files were deleted successfully."
|
||||
msgstr "Tutti i file marcati sono stati cancellati correttamente."
|
||||
|
||||
#: core\app.py:321
|
||||
msgid "All marked files were successfully sent to Trash."
|
||||
msgstr "Tutti i file marcati sono stati spostati nel cestino."
|
||||
|
||||
#: core\app.py:343
|
||||
#: core\app.py:326
|
||||
msgid "Could not load file: {}"
|
||||
msgstr "Impossibile caricare il file: {}"
|
||||
|
||||
#: core\app.py:399
|
||||
#: core\app.py:382
|
||||
msgid "'{}' already is in the list."
|
||||
msgstr "'{}' è già nella lista."
|
||||
|
||||
#: core\app.py:401
|
||||
#: core\app.py:384
|
||||
msgid "'{}' does not exist."
|
||||
msgstr "'{}' non esiste."
|
||||
|
||||
#: core\app.py:410
|
||||
#: core\app.py:392
|
||||
msgid ""
|
||||
"All selected %d matches are going to be ignored in all subsequent scans. "
|
||||
"Continue?"
|
||||
@@ -92,62 +97,66 @@ msgstr ""
|
||||
"Tutti i %d elementi che coincidono verranno ignorati in tutte le scansioni "
|
||||
"successive. Continuare?"
|
||||
|
||||
#: core\app.py:486
|
||||
#: core\app.py:469
|
||||
msgid "Select a directory to copy marked files to"
|
||||
msgstr "Seleziona una directory in cui desideri copiare i file contrassegnati"
|
||||
|
||||
#: core\app.py:487
|
||||
#: core\app.py:471
|
||||
msgid "Select a directory to move marked files to"
|
||||
msgstr ""
|
||||
"Seleziona una directory in cui desideri spostare i file contrassegnati"
|
||||
|
||||
#: core\app.py:527
|
||||
#: core\app.py:510
|
||||
msgid "Select a destination for your exported CSV"
|
||||
msgstr "Seleziona una destinazione per il file CSV"
|
||||
|
||||
#: core\app.py:534 core\app.py:801 core\app.py:811
|
||||
#: core\app.py:516 core\app.py:771 core\app.py:781
|
||||
msgid "Couldn't write to file: {}"
|
||||
msgstr "Impossibile modificare il file: {}"
|
||||
|
||||
#: core\app.py:559
|
||||
#: core\app.py:539
|
||||
msgid "You have no custom command set up. Set it up in your preferences."
|
||||
msgstr ""
|
||||
"Non hai impostato nessun comando personalizzato. Impostalo nelle tue "
|
||||
"preferenze."
|
||||
|
||||
#: core\app.py:727 core\app.py:740
|
||||
#: core\app.py:695 core\app.py:707
|
||||
msgid "You are about to remove %d files from results. Continue?"
|
||||
msgstr "Stai per rimuovere %d file dai risultati. Continuare?"
|
||||
|
||||
#: core\app.py:774
|
||||
#: core\app.py:743
|
||||
msgid "{} duplicate groups were changed by the re-prioritization."
|
||||
msgstr "{} gruppi duplicati sono stati cambiati dalla nuova priorirità"
|
||||
|
||||
#: core\app.py:821
|
||||
#: core\app.py:790
|
||||
msgid "The selected directories contain no scannable file."
|
||||
msgstr "Le cartelle selezionate non contengono file da scansionare."
|
||||
|
||||
#: core\app.py:835
|
||||
#: core\app.py:803
|
||||
msgid "Collecting files to scan"
|
||||
msgstr "Raccolta file da scansionare"
|
||||
|
||||
#: core\app.py:891
|
||||
#: core\app.py:850
|
||||
msgid "%s (%d discarded)"
|
||||
msgstr "%s (%d scartati)"
|
||||
|
||||
#: core\engine.py:244 core\engine.py:288
|
||||
msgid "0 matches found"
|
||||
msgstr "Nessun duplicato trovato"
|
||||
#: core\directories.py:191
|
||||
msgid "Collected {} files to scan"
|
||||
msgstr "Raccolti {} file da scansionare"
|
||||
|
||||
#: core\engine.py:262 core\engine.py:296
|
||||
msgid "%d matches found"
|
||||
msgstr "Trovato/i %d duplicato/i"
|
||||
#: core\directories.py:207
|
||||
msgid "Collected {} folders to scan"
|
||||
msgstr "Raccolte {} cartelle da scansionare"
|
||||
|
||||
#: core\gui\deletion_options.py:73
|
||||
#: core\engine.py:27
|
||||
msgid "%d matches found from %d groups"
|
||||
msgstr "%d corrispondeze trovate da %d gruppi"
|
||||
|
||||
#: core\gui\deletion_options.py:71
|
||||
msgid "You are sending {} file(s) to the Trash."
|
||||
msgstr "Stai spostando {} file al Cestino."
|
||||
|
||||
#: core\gui\exclude_list_table.py:15
|
||||
#: core\gui\exclude_list_table.py:14
|
||||
msgid "Regular Expressions"
|
||||
msgstr "Espressioni regolari"
|
||||
|
||||
@@ -181,15 +190,15 @@ msgstr "Contenuti"
|
||||
msgid "Analyzed %d/%d pictures"
|
||||
msgstr "Analizzate %d/%d immagini"
|
||||
|
||||
#: core\pe\matchblock.py:181
|
||||
#: core\pe\matchblock.py:177
|
||||
msgid "Performed %d/%d chunk matches"
|
||||
msgstr "Effettuate %d/%d comparazioni sui sottogruppi di immagini"
|
||||
|
||||
#: core\pe\matchblock.py:191
|
||||
#: core\pe\matchblock.py:185
|
||||
msgid "Preparing for matching"
|
||||
msgstr "Preparazione per la comparazione"
|
||||
|
||||
#: core\pe\matchblock.py:244
|
||||
#: core\pe\matchblock.py:234
|
||||
msgid "Verified %d/%d matches"
|
||||
msgstr "Verificate %d/%d somiglianze"
|
||||
|
||||
@@ -237,23 +246,23 @@ msgstr "Il più nuovo"
|
||||
msgid "Oldest"
|
||||
msgstr "Il più vecchio"
|
||||
|
||||
#: core\results.py:142
|
||||
#: core\results.py:134
|
||||
msgid "%d / %d (%s / %s) duplicates marked."
|
||||
msgstr "%d / %d (%s / %s) duplicati marcati."
|
||||
|
||||
#: core\results.py:149
|
||||
#: core\results.py:141
|
||||
msgid " filter: %s"
|
||||
msgstr " filtro: %s"
|
||||
|
||||
#: core\scanner.py:85
|
||||
#: core\scanner.py:90
|
||||
msgid "Read size of %d/%d files"
|
||||
msgstr "Lettura dimensione di %d/%d file"
|
||||
|
||||
#: core\scanner.py:109
|
||||
#: core\scanner.py:116
|
||||
msgid "Read metadata of %d/%d files"
|
||||
msgstr "Lettura metadata di %d/%d files"
|
||||
|
||||
#: core\scanner.py:147
|
||||
#: core\scanner.py:154
|
||||
msgid "Almost done! Fiddling with results..."
|
||||
msgstr "Quasi finito! Sto organizzando i risultati..."
|
||||
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
# Translators:
|
||||
# Andrew Senetar <arsenetar@gmail.com>, 2021
|
||||
# Fuan <jcfrt@posteo.net>, 2021
|
||||
# Emanuele, 2021
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Fuan <jcfrt@posteo.net>, 2021\n"
|
||||
"Last-Translator: Emanuele, 2021\n"
|
||||
"Language-Team: Italian (https://www.transifex.com/voltaicideas/teams/116153/it/)\n"
|
||||
"Language: it\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -951,3 +952,45 @@ msgstr "Generale"
|
||||
#: qt\preferences_dialog.py:286
|
||||
msgid "Display"
|
||||
msgstr "Schermo"
|
||||
|
||||
#: qt\se\preferences_dialog.py:70
|
||||
msgid "Partially hash files bigger than"
|
||||
msgstr "Calcola hash parziale di file più grandi di"
|
||||
|
||||
#: qt\se\preferences_dialog.py:80
|
||||
msgid "MB"
|
||||
msgstr "MB"
|
||||
|
||||
#: qt\preferences_dialog.py:163
|
||||
msgid "Use native OS dialogs"
|
||||
msgstr "Usa le finestre di dialogo native del Sistema Operativo"
|
||||
|
||||
#: qt\preferences_dialog.py:166
|
||||
msgid ""
|
||||
"For actions such as file/folder selection use the OS native dialogs.\n"
|
||||
"Some native dialogs have limited functionality."
|
||||
msgstr ""
|
||||
"Per azioni come selezione di file/cartelle usa le finestre di dialogo native del Sistema Operativo.\n"
|
||||
"Alcune finestre di dialogo native hanno funzionalità limitate."
|
||||
|
||||
#: qt\se\preferences_dialog.py:68
|
||||
msgid "Ignore files larger than"
|
||||
msgstr "Ignora file più grandi di"
|
||||
|
||||
#: qt\app.py:135 qt\app.py:293
|
||||
msgid "Clear Cache"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:294
|
||||
msgid ""
|
||||
"Do you really want to clear the cache? This will remove all cached file "
|
||||
"hashes and picture analysis."
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:299
|
||||
msgid "Cache cleared."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:173
|
||||
msgid "Use dark style"
|
||||
msgstr ""
|
||||
|
||||
@@ -44,99 +44,107 @@ msgstr "コピー中"
|
||||
msgid "Sending to Trash"
|
||||
msgstr "ごみ箱に送信します"
|
||||
|
||||
#: core\app.py:308
|
||||
#: core\app.py:289
|
||||
msgid ""
|
||||
"A previous action is still hanging in there. You can't start a new one yet. "
|
||||
"Wait a few seconds, then try again."
|
||||
msgstr "前のアクションはまだそこにぶら下がっています。 まだ新しいものを始めることはできません。 数秒待ってから、再試行してください。"
|
||||
|
||||
#: core\app.py:318
|
||||
#: core\app.py:300
|
||||
msgid "No duplicates found."
|
||||
msgstr "重複は見つかりませんでした。"
|
||||
|
||||
#: core\app.py:333
|
||||
#: core\app.py:315
|
||||
msgid "All marked files were copied successfully."
|
||||
msgstr "マークされたファイルはすべて正常にコピーされました。"
|
||||
|
||||
#: core\app.py:334
|
||||
#: core\app.py:317
|
||||
msgid "All marked files were moved successfully."
|
||||
msgstr "マークされたファイルはすべて正常に移動されました。"
|
||||
|
||||
#: core\app.py:335
|
||||
#: core\app.py:319
|
||||
msgid "All marked files were deleted successfully."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:321
|
||||
msgid "All marked files were successfully sent to Trash."
|
||||
msgstr "マークされたファイルはすべてごみ箱に正常に送信されました。"
|
||||
|
||||
#: core\app.py:343
|
||||
#: core\app.py:326
|
||||
msgid "Could not load file: {}"
|
||||
msgstr "ファイルを読み込めませんでした:{}"
|
||||
|
||||
#: core\app.py:399
|
||||
#: core\app.py:382
|
||||
msgid "'{}' already is in the list."
|
||||
msgstr "「{}」既にリストに含まれています。"
|
||||
|
||||
#: core\app.py:401
|
||||
#: core\app.py:384
|
||||
msgid "'{}' does not exist."
|
||||
msgstr "'{}' 存在しません。"
|
||||
|
||||
#: core\app.py:410
|
||||
#: core\app.py:392
|
||||
msgid ""
|
||||
"All selected %d matches are going to be ignored in all subsequent scans. "
|
||||
"Continue?"
|
||||
msgstr "選択した%d個の一致は、以降のすべてのスキャンで無視されます。 継続する?"
|
||||
|
||||
#: core\app.py:486
|
||||
#: core\app.py:469
|
||||
msgid "Select a directory to copy marked files to"
|
||||
msgstr "マークされたファイルをコピーするディレクトリを選択してください"
|
||||
|
||||
#: core\app.py:487
|
||||
#: core\app.py:471
|
||||
msgid "Select a directory to move marked files to"
|
||||
msgstr "マークされたファイルを移動するディレクトリを選択してください"
|
||||
|
||||
#: core\app.py:527
|
||||
#: core\app.py:510
|
||||
msgid "Select a destination for your exported CSV"
|
||||
msgstr "エクスポートしたCSVの宛先を選択します。"
|
||||
|
||||
#: core\app.py:534 core\app.py:801 core\app.py:811
|
||||
#: core\app.py:516 core\app.py:771 core\app.py:781
|
||||
msgid "Couldn't write to file: {}"
|
||||
msgstr "ファイルに書き込めませんでした:{}"
|
||||
|
||||
#: core\app.py:559
|
||||
#: core\app.py:539
|
||||
msgid "You have no custom command set up. Set it up in your preferences."
|
||||
msgstr "カスタムコマンドは設定されていません。 お好みで設定してください。"
|
||||
|
||||
#: core\app.py:727 core\app.py:740
|
||||
#: core\app.py:695 core\app.py:707
|
||||
msgid "You are about to remove %d files from results. Continue?"
|
||||
msgstr "結果から%d個のファイルを削除しようとしています。 継続する?"
|
||||
|
||||
#: core\app.py:774
|
||||
#: core\app.py:743
|
||||
msgid "{} duplicate groups were changed by the re-prioritization."
|
||||
msgstr "{}重複するグループは、再優先順位付けによって変更されました。"
|
||||
|
||||
#: core\app.py:821
|
||||
#: core\app.py:790
|
||||
msgid "The selected directories contain no scannable file."
|
||||
msgstr "選択したディレクトリにはスキャン可能なファイルが含まれていません。"
|
||||
|
||||
#: core\app.py:835
|
||||
#: core\app.py:803
|
||||
msgid "Collecting files to scan"
|
||||
msgstr "スキャンするファイルを収集しています"
|
||||
|
||||
#: core\app.py:891
|
||||
#: core\app.py:850
|
||||
msgid "%s (%d discarded)"
|
||||
msgstr "%s (%d 廃棄)"
|
||||
|
||||
#: core\engine.py:244 core\engine.py:288
|
||||
msgid "0 matches found"
|
||||
msgstr "一致するものが見つかりません"
|
||||
#: core\directories.py:191
|
||||
msgid "Collected {} files to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\engine.py:262 core\engine.py:296
|
||||
msgid "%d matches found"
|
||||
msgstr "%d の一致が見つかりました"
|
||||
#: core\directories.py:207
|
||||
msgid "Collected {} folders to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\gui\deletion_options.py:73
|
||||
#: core\engine.py:27
|
||||
msgid "%d matches found from %d groups"
|
||||
msgstr ""
|
||||
|
||||
#: core\gui\deletion_options.py:71
|
||||
msgid "You are sending {} file(s) to the Trash."
|
||||
msgstr "{}個のファイルをゴミ箱に送信しています"
|
||||
|
||||
#: core\gui\exclude_list_table.py:15
|
||||
#: core\gui\exclude_list_table.py:14
|
||||
msgid "Regular Expressions"
|
||||
msgstr "正規表現"
|
||||
|
||||
@@ -168,15 +176,15 @@ msgstr "内容"
|
||||
msgid "Analyzed %d/%d pictures"
|
||||
msgstr "%d/%d 枚の写真を分析しました"
|
||||
|
||||
#: core\pe\matchblock.py:181
|
||||
#: core\pe\matchblock.py:177
|
||||
msgid "Performed %d/%d chunk matches"
|
||||
msgstr "チャンクマッチを%d/%d回実行しました"
|
||||
|
||||
#: core\pe\matchblock.py:191
|
||||
#: core\pe\matchblock.py:185
|
||||
msgid "Preparing for matching"
|
||||
msgstr "マッチングの準備"
|
||||
|
||||
#: core\pe\matchblock.py:244
|
||||
#: core\pe\matchblock.py:234
|
||||
msgid "Verified %d/%d matches"
|
||||
msgstr "%d/%d件の一致を確認"
|
||||
|
||||
@@ -224,23 +232,23 @@ msgstr "最新"
|
||||
msgid "Oldest"
|
||||
msgstr "最古"
|
||||
|
||||
#: core\results.py:142
|
||||
#: core\results.py:134
|
||||
msgid "%d / %d (%s / %s) duplicates marked."
|
||||
msgstr "%d / %d (%s / %s)マークされた重複。"
|
||||
|
||||
#: core\results.py:149
|
||||
#: core\results.py:141
|
||||
msgid " filter: %s"
|
||||
msgstr "フィルタ: %s"
|
||||
|
||||
#: core\scanner.py:85
|
||||
#: core\scanner.py:90
|
||||
msgid "Read size of %d/%d files"
|
||||
msgstr "%d/%dファイルのサイズを読み取った"
|
||||
|
||||
#: core\scanner.py:109
|
||||
#: core\scanner.py:116
|
||||
msgid "Read metadata of %d/%d files"
|
||||
msgstr "%d/%dファイルのメタデータを読み取った"
|
||||
|
||||
#: core\scanner.py:147
|
||||
#: core\scanner.py:154
|
||||
msgid "Almost done! Fiddling with results..."
|
||||
msgstr "ほぼ完了しました! 結果をいじっています..."
|
||||
|
||||
|
||||
@@ -925,3 +925,43 @@ msgstr "一般"
|
||||
#: qt\preferences_dialog.py:286
|
||||
msgid "Display"
|
||||
msgstr "表示"
|
||||
|
||||
#: qt\se\preferences_dialog.py:70
|
||||
msgid "Partially hash files bigger than"
|
||||
msgstr ""
|
||||
|
||||
#: qt\se\preferences_dialog.py:80
|
||||
msgid "MB"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:163
|
||||
msgid "Use native OS dialogs"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:166
|
||||
msgid ""
|
||||
"For actions such as file/folder selection use the OS native dialogs.\n"
|
||||
"Some native dialogs have limited functionality."
|
||||
msgstr ""
|
||||
|
||||
#: qt\se\preferences_dialog.py:68
|
||||
msgid "Ignore files larger than"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:135 qt\app.py:293
|
||||
msgid "Clear Cache"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:294
|
||||
msgid ""
|
||||
"Do you really want to clear the cache? This will remove all cached file "
|
||||
"hashes and picture analysis."
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:299
|
||||
msgid "Cache cleared."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:173
|
||||
msgid "Use dark style"
|
||||
msgstr ""
|
||||
|
||||
@@ -45,99 +45,107 @@ msgstr "복사중"
|
||||
msgid "Sending to Trash"
|
||||
msgstr "휴지통으로 보내기"
|
||||
|
||||
#: core\app.py:308
|
||||
#: core\app.py:289
|
||||
msgid ""
|
||||
"A previous action is still hanging in there. You can't start a new one yet. "
|
||||
"Wait a few seconds, then try again."
|
||||
msgstr "이전 작업이 여전히 거기에 걸려 있습니다. 아직 새로운 것을 시작할 수 없습니다. 몇 초 후에 다시 시도하십시오."
|
||||
|
||||
#: core\app.py:318
|
||||
#: core\app.py:300
|
||||
msgid "No duplicates found."
|
||||
msgstr "중복 파일이 없습니다."
|
||||
|
||||
#: core\app.py:333
|
||||
#: core\app.py:315
|
||||
msgid "All marked files were copied successfully."
|
||||
msgstr "표시된 모든 파일이 성공적으로 복사되었습니다."
|
||||
|
||||
#: core\app.py:334
|
||||
#: core\app.py:317
|
||||
msgid "All marked files were moved successfully."
|
||||
msgstr "표시된 모든 파일이 성공적으로 이동되었습니다."
|
||||
|
||||
#: core\app.py:335
|
||||
#: core\app.py:319
|
||||
msgid "All marked files were deleted successfully."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:321
|
||||
msgid "All marked files were successfully sent to Trash."
|
||||
msgstr "표시된 모든 파일이 성공적으로 휴지통으로 전송되었습니다."
|
||||
|
||||
#: core\app.py:343
|
||||
#: core\app.py:326
|
||||
msgid "Could not load file: {}"
|
||||
msgstr "파일을로드 할 수 없습니다 : {}"
|
||||
|
||||
#: core\app.py:399
|
||||
#: core\app.py:382
|
||||
msgid "'{}' already is in the list."
|
||||
msgstr "'{}' 는 이미 목록에 있습니다."
|
||||
|
||||
#: core\app.py:401
|
||||
#: core\app.py:384
|
||||
msgid "'{}' does not exist."
|
||||
msgstr "'{}' 가 존재하지 않습니다."
|
||||
|
||||
#: core\app.py:410
|
||||
#: core\app.py:392
|
||||
msgid ""
|
||||
"All selected %d matches are going to be ignored in all subsequent scans. "
|
||||
"Continue?"
|
||||
msgstr "선택된 %d개의 일치 항목은 모든 후속 검색에서 무시됩니다. 계속하다?"
|
||||
|
||||
#: core\app.py:486
|
||||
#: core\app.py:469
|
||||
msgid "Select a directory to copy marked files to"
|
||||
msgstr "표시된 파일을 복사 할 디렉토리를 선택하십시오"
|
||||
|
||||
#: core\app.py:487
|
||||
#: core\app.py:471
|
||||
msgid "Select a directory to move marked files to"
|
||||
msgstr "표시된 파일을 이동할 디렉토리를 선택하십시오"
|
||||
|
||||
#: core\app.py:527
|
||||
#: core\app.py:510
|
||||
msgid "Select a destination for your exported CSV"
|
||||
msgstr "내 보낸 CSV의 대상을 선택하십시오"
|
||||
|
||||
#: core\app.py:534 core\app.py:801 core\app.py:811
|
||||
#: core\app.py:516 core\app.py:771 core\app.py:781
|
||||
msgid "Couldn't write to file: {}"
|
||||
msgstr "파일에 쓸 수 없습니다 : {}"
|
||||
|
||||
#: core\app.py:559
|
||||
#: core\app.py:539
|
||||
msgid "You have no custom command set up. Set it up in your preferences."
|
||||
msgstr "사용자 지정 명령을 설정하지 않았습니다. 기본 설정에서 설정하십시오."
|
||||
|
||||
#: core\app.py:727 core\app.py:740
|
||||
#: core\app.py:695 core\app.py:707
|
||||
msgid "You are about to remove %d files from results. Continue?"
|
||||
msgstr "결과에서 %d 개의 파일을 제거하려고합니다. 계속하다?"
|
||||
|
||||
#: core\app.py:774
|
||||
#: core\app.py:743
|
||||
msgid "{} duplicate groups were changed by the re-prioritization."
|
||||
msgstr "{} 개의 중복 그룹이 우선 순위 재 지정으로 변경되었습니다."
|
||||
|
||||
#: core\app.py:821
|
||||
#: core\app.py:790
|
||||
msgid "The selected directories contain no scannable file."
|
||||
msgstr "선택한 디렉토리에 스캔 가능한 파일이 없습니다."
|
||||
|
||||
#: core\app.py:835
|
||||
#: core\app.py:803
|
||||
msgid "Collecting files to scan"
|
||||
msgstr "스캔 할 파일 수집"
|
||||
|
||||
#: core\app.py:891
|
||||
#: core\app.py:850
|
||||
msgid "%s (%d discarded)"
|
||||
msgstr "%s (%d 폐기)"
|
||||
|
||||
#: core\engine.py:244 core\engine.py:288
|
||||
msgid "0 matches found"
|
||||
msgstr "일치하는 항목이 없습니다"
|
||||
#: core\directories.py:191
|
||||
msgid "Collected {} files to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\engine.py:262 core\engine.py:296
|
||||
msgid "%d matches found"
|
||||
msgstr "%d개의 일치 항목을 찾았습니다."
|
||||
#: core\directories.py:207
|
||||
msgid "Collected {} folders to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\gui\deletion_options.py:73
|
||||
#: core\engine.py:27
|
||||
msgid "%d matches found from %d groups"
|
||||
msgstr ""
|
||||
|
||||
#: core\gui\deletion_options.py:71
|
||||
msgid "You are sending {} file(s) to the Trash."
|
||||
msgstr "{}개의 파일을 휴지통으로 보내고 있습니다."
|
||||
|
||||
#: core\gui\exclude_list_table.py:15
|
||||
#: core\gui\exclude_list_table.py:14
|
||||
msgid "Regular Expressions"
|
||||
msgstr "정규식"
|
||||
|
||||
@@ -169,15 +177,15 @@ msgstr "내용"
|
||||
msgid "Analyzed %d/%d pictures"
|
||||
msgstr "%d/%d 사진 분석"
|
||||
|
||||
#: core\pe\matchblock.py:181
|
||||
#: core\pe\matchblock.py:177
|
||||
msgid "Performed %d/%d chunk matches"
|
||||
msgstr "%d/%d 청크 매치 수행"
|
||||
|
||||
#: core\pe\matchblock.py:191
|
||||
#: core\pe\matchblock.py:185
|
||||
msgid "Preparing for matching"
|
||||
msgstr "매칭 준비"
|
||||
|
||||
#: core\pe\matchblock.py:244
|
||||
#: core\pe\matchblock.py:234
|
||||
msgid "Verified %d/%d matches"
|
||||
msgstr "%d/%d 일치 확인"
|
||||
|
||||
@@ -225,23 +233,23 @@ msgstr "최신"
|
||||
msgid "Oldest"
|
||||
msgstr "가장 오래된"
|
||||
|
||||
#: core\results.py:142
|
||||
#: core\results.py:134
|
||||
msgid "%d / %d (%s / %s) duplicates marked."
|
||||
msgstr "%d / %d (%s / %s) 개의 중복이 표시되었습니다."
|
||||
|
||||
#: core\results.py:149
|
||||
#: core\results.py:141
|
||||
msgid " filter: %s"
|
||||
msgstr "필터: %s"
|
||||
|
||||
#: core\scanner.py:85
|
||||
#: core\scanner.py:90
|
||||
msgid "Read size of %d/%d files"
|
||||
msgstr "%d/%d 개의 파일을 읽을 수 있습니다."
|
||||
|
||||
#: core\scanner.py:109
|
||||
#: core\scanner.py:116
|
||||
msgid "Read metadata of %d/%d files"
|
||||
msgstr "%d/%d 개 파일의 메타 데이터를 읽었습니다."
|
||||
|
||||
#: core\scanner.py:147
|
||||
#: core\scanner.py:154
|
||||
msgid "Almost done! Fiddling with results..."
|
||||
msgstr "거의 완료되었습니다! 결과를 만지작 거리는 중..."
|
||||
|
||||
|
||||
@@ -927,3 +927,43 @@ msgstr "일반"
|
||||
#: qt\preferences_dialog.py:286
|
||||
msgid "Display"
|
||||
msgstr "디스플레이"
|
||||
|
||||
#: qt\se\preferences_dialog.py:70
|
||||
msgid "Partially hash files bigger than"
|
||||
msgstr ""
|
||||
|
||||
#: qt\se\preferences_dialog.py:80
|
||||
msgid "MB"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:163
|
||||
msgid "Use native OS dialogs"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:166
|
||||
msgid ""
|
||||
"For actions such as file/folder selection use the OS native dialogs.\n"
|
||||
"Some native dialogs have limited functionality."
|
||||
msgstr ""
|
||||
|
||||
#: qt\se\preferences_dialog.py:68
|
||||
msgid "Ignore files larger than"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:135 qt\app.py:293
|
||||
msgid "Clear Cache"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:294
|
||||
msgid ""
|
||||
"Do you really want to clear the cache? This will remove all cached file "
|
||||
"hashes and picture analysis."
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:299
|
||||
msgid "Cache cleared."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:173
|
||||
msgid "Use dark style"
|
||||
msgstr ""
|
||||
|
||||
122
locale/ms/LC_MESSAGES/columns.po
Normal file
122
locale/ms/LC_MESSAGES/columns.po
Normal file
@@ -0,0 +1,122 @@
|
||||
# Translators:
|
||||
# Yaya - Nurul Azeera Hidayah @ Muhammad Nur Hidayat Yasuyoshi (MNH48) <admin@mnh48.moe>, 2021
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Yaya - Nurul Azeera Hidayah @ Muhammad Nur Hidayat Yasuyoshi (MNH48) <admin@mnh48.moe>, 2021\n"
|
||||
"Language-Team: Malay (https://www.transifex.com/voltaicideas/teams/116153/ms/)\n"
|
||||
"Language: ms\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#: core\gui\ignore_list_table.py:19 core\gui\ignore_list_table.py:20
|
||||
#: core\gui\problem_table.py:18
|
||||
msgid "File Path"
|
||||
msgstr "Laluan Fail"
|
||||
|
||||
#: core\gui\problem_table.py:19
|
||||
msgid "Error Message"
|
||||
msgstr "Mesej Ralat"
|
||||
|
||||
#: core\me\prioritize.py:23
|
||||
msgid "Duration"
|
||||
msgstr "Tempoh"
|
||||
|
||||
#: core\me\prioritize.py:30 core\me\result_table.py:23
|
||||
msgid "Bitrate"
|
||||
msgstr "Kadar Bit"
|
||||
|
||||
#: core\me\prioritize.py:37
|
||||
msgid "Samplerate"
|
||||
msgstr "Kadar Sampel"
|
||||
|
||||
#: core\me\result_table.py:19 core\pe\result_table.py:19 core\prioritize.py:92
|
||||
#: core\se\result_table.py:19
|
||||
msgid "Filename"
|
||||
msgstr "Nama Fail"
|
||||
|
||||
#: core\me\result_table.py:20 core\pe\result_table.py:20 core\prioritize.py:75
|
||||
#: core\se\result_table.py:20
|
||||
msgid "Folder"
|
||||
msgstr "Folder"
|
||||
|
||||
#: core\me\result_table.py:21
|
||||
msgid "Size (MB)"
|
||||
msgstr "Saiz (MB)"
|
||||
|
||||
#: core\me\result_table.py:22
|
||||
msgid "Time"
|
||||
msgstr "Masa"
|
||||
|
||||
#: core\me\result_table.py:24
|
||||
msgid "Sample Rate"
|
||||
msgstr "Kadar Sampel"
|
||||
|
||||
#: core\me\result_table.py:25 core\pe\result_table.py:22 core\prioritize.py:65
|
||||
#: core\se\result_table.py:22
|
||||
msgid "Kind"
|
||||
msgstr "Jenis"
|
||||
|
||||
#: core\me\result_table.py:26 core\pe\result_table.py:25
|
||||
#: core\prioritize.py:163 core\se\result_table.py:23
|
||||
msgid "Modification"
|
||||
msgstr "Pengubahsuaian"
|
||||
|
||||
#: core\me\result_table.py:27
|
||||
msgid "Title"
|
||||
msgstr "Tajuk"
|
||||
|
||||
#: core\me\result_table.py:28
|
||||
msgid "Artist"
|
||||
msgstr "Artis"
|
||||
|
||||
#: core\me\result_table.py:29
|
||||
msgid "Album"
|
||||
msgstr "Album"
|
||||
|
||||
#: core\me\result_table.py:30
|
||||
msgid "Genre"
|
||||
msgstr "Genre"
|
||||
|
||||
#: core\me\result_table.py:31
|
||||
msgid "Year"
|
||||
msgstr "Tahun"
|
||||
|
||||
#: core\me\result_table.py:32
|
||||
msgid "Track Number"
|
||||
msgstr "Nombor Runut"
|
||||
|
||||
#: core\me\result_table.py:33
|
||||
msgid "Comment"
|
||||
msgstr "Komen"
|
||||
|
||||
#: core\me\result_table.py:34 core\pe\result_table.py:26
|
||||
#: core\se\result_table.py:24
|
||||
msgid "Match %"
|
||||
msgstr "% Padanan"
|
||||
|
||||
#: core\me\result_table.py:35 core\se\result_table.py:25
|
||||
msgid "Words Used"
|
||||
msgstr "Perkataan Diguna"
|
||||
|
||||
#: core\me\result_table.py:36 core\pe\result_table.py:27
|
||||
#: core\se\result_table.py:26
|
||||
msgid "Dupe Count"
|
||||
msgstr "Jumlah Duplikasi"
|
||||
|
||||
#: core\pe\prioritize.py:23 core\pe\result_table.py:23
|
||||
msgid "Dimensions"
|
||||
msgstr "Dimensi"
|
||||
|
||||
#: core\pe\result_table.py:21 core\se\result_table.py:21
|
||||
msgid "Size (KB)"
|
||||
msgstr "Saiz (KB)"
|
||||
|
||||
#: core\pe\result_table.py:24
|
||||
msgid "EXIF Timestamp"
|
||||
msgstr "Cap Masa EXIF"
|
||||
|
||||
#: core\prioritize.py:156
|
||||
msgid "Size"
|
||||
msgstr "Saiz"
|
||||
267
locale/ms/LC_MESSAGES/core.po
Normal file
267
locale/ms/LC_MESSAGES/core.po
Normal file
@@ -0,0 +1,267 @@
|
||||
# Translators:
|
||||
# Yaya - Nurul Azeera Hidayah @ Muhammad Nur Hidayat Yasuyoshi (MNH48) <admin@mnh48.moe>, 2021
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Yaya - Nurul Azeera Hidayah @ Muhammad Nur Hidayat Yasuyoshi (MNH48) <admin@mnh48.moe>, 2021\n"
|
||||
"Language-Team: Malay (https://www.transifex.com/voltaicideas/teams/116153/ms/)\n"
|
||||
"Language: ms\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#: core\app.py:42
|
||||
msgid "There are no marked duplicates. Nothing has been done."
|
||||
msgstr "Tiada duplikasi yang ditandai. Tiada apa yang dilakukan."
|
||||
|
||||
#: core\app.py:43
|
||||
msgid "There are no selected duplicates. Nothing has been done."
|
||||
msgstr "Tiada duplikasi yang dipilih. Tiada apa yang dilakukan."
|
||||
|
||||
#: core\app.py:44
|
||||
msgid ""
|
||||
"You're about to open many files at once. Depending on what those files are "
|
||||
"opened with, doing so can create quite a mess. Continue?"
|
||||
msgstr ""
|
||||
"Anda bakal membuka banyak fail serentak. Bergantung kepada apa yang "
|
||||
"digunakan untuk membuka fail tersebut, ia mungkin menyebabkan sepah. Ingin "
|
||||
"teruskan?"
|
||||
|
||||
#: core\app.py:71
|
||||
msgid "Scanning for duplicates"
|
||||
msgstr "Mengimbas untuk duplikasi"
|
||||
|
||||
#: core\app.py:72
|
||||
msgid "Loading"
|
||||
msgstr "Memuatkan"
|
||||
|
||||
#: core\app.py:73
|
||||
msgid "Moving"
|
||||
msgstr "Memindahkan"
|
||||
|
||||
#: core\app.py:74
|
||||
msgid "Copying"
|
||||
msgstr "Menyalinkan"
|
||||
|
||||
#: core\app.py:75
|
||||
msgid "Sending to Trash"
|
||||
msgstr "Menghantarkan ke Tong Sampah"
|
||||
|
||||
#: core\app.py:289
|
||||
msgid ""
|
||||
"A previous action is still hanging in there. You can't start a new one yet. "
|
||||
"Wait a few seconds, then try again."
|
||||
msgstr ""
|
||||
"Tindakan sebelum ini masih tergantung. Anda tidak boleh mulakan yang baharu "
|
||||
"lagi. Tunggu beberapa saat, kemudian cuba lagi."
|
||||
|
||||
#: core\app.py:300
|
||||
msgid "No duplicates found."
|
||||
msgstr "Tiada duplikasi dijumpai."
|
||||
|
||||
#: core\app.py:315
|
||||
msgid "All marked files were copied successfully."
|
||||
msgstr "Semua fail yang ditandai telah berjaya disalin."
|
||||
|
||||
#: core\app.py:317
|
||||
msgid "All marked files were moved successfully."
|
||||
msgstr "Semua fail yang ditandai telah berjaya dipindah."
|
||||
|
||||
#: core\app.py:319
|
||||
msgid "All marked files were deleted successfully."
|
||||
msgstr "Semua fail yang ditandai telah berjaya dipadam."
|
||||
|
||||
#: core\app.py:321
|
||||
msgid "All marked files were successfully sent to Trash."
|
||||
msgstr "Semua fail yang ditandai telah berjaya dihantar ke Tong Sampah."
|
||||
|
||||
#: core\app.py:326
|
||||
msgid "Could not load file: {}"
|
||||
msgstr "Tidak mampu memuatkan fail: {}"
|
||||
|
||||
#: core\app.py:382
|
||||
msgid "'{}' already is in the list."
|
||||
msgstr "'{}' sudah ada dalam senarai."
|
||||
|
||||
#: core\app.py:384
|
||||
msgid "'{}' does not exist."
|
||||
msgstr "'{}' tidak wujud."
|
||||
|
||||
#: core\app.py:392
|
||||
msgid ""
|
||||
"All selected %d matches are going to be ignored in all subsequent scans. "
|
||||
"Continue?"
|
||||
msgstr ""
|
||||
"Kesemua %d padanan yang dipilih akan diabaikan dalam semua imbasan "
|
||||
"terkemudian. Ingin teruskan?"
|
||||
|
||||
#: core\app.py:469
|
||||
msgid "Select a directory to copy marked files to"
|
||||
msgstr "Pilih direktori dituju untuk salin fail yang ditandai"
|
||||
|
||||
#: core\app.py:471
|
||||
msgid "Select a directory to move marked files to"
|
||||
msgstr "Pilih direktori dituju untuk pindah fail yang ditandai"
|
||||
|
||||
#: core\app.py:510
|
||||
msgid "Select a destination for your exported CSV"
|
||||
msgstr "Pilih tempat tujuan untuk eksport CSV anda"
|
||||
|
||||
#: core\app.py:516 core\app.py:771 core\app.py:781
|
||||
msgid "Couldn't write to file: {}"
|
||||
msgstr "Tidak mampu menulis ke fail: {}"
|
||||
|
||||
#: core\app.py:539
|
||||
msgid "You have no custom command set up. Set it up in your preferences."
|
||||
msgstr ""
|
||||
"Anda tidak ada perintah tersuai ditetapkan. Tetapkannya melalui menu "
|
||||
"keutamaan anda."
|
||||
|
||||
#: core\app.py:695 core\app.py:707
|
||||
msgid "You are about to remove %d files from results. Continue?"
|
||||
msgstr "Anda bakal mengalih keluar %d fail dari keputusan. Ingin teruskan?"
|
||||
|
||||
#: core\app.py:743
|
||||
msgid "{} duplicate groups were changed by the re-prioritization."
|
||||
msgstr "{} kumpulan duplikasi telah diubah oleh pengutamaan semula."
|
||||
|
||||
#: core\app.py:790
|
||||
msgid "The selected directories contain no scannable file."
|
||||
msgstr "Direktori yang dipilih tidak mempunyai fail yang boleh diimbas."
|
||||
|
||||
#: core\app.py:803
|
||||
msgid "Collecting files to scan"
|
||||
msgstr "Mengumpulkan fail untuk diimbas"
|
||||
|
||||
#: core\app.py:850
|
||||
msgid "%s (%d discarded)"
|
||||
msgstr "%s (%d dibuang)"
|
||||
|
||||
#: core\directories.py:191
|
||||
msgid "Collected {} files to scan"
|
||||
msgstr "{} fail dikumpulkan untuk diimbas"
|
||||
|
||||
#: core\directories.py:207
|
||||
msgid "Collected {} folders to scan"
|
||||
msgstr "{} folder dikumpulkan untuk diimbas"
|
||||
|
||||
#: core\engine.py:27
|
||||
msgid "%d matches found from %d groups"
|
||||
msgstr "%d padanan dijumpai dari %d kumpulan"
|
||||
|
||||
#: core\gui\deletion_options.py:71
|
||||
msgid "You are sending {} file(s) to the Trash."
|
||||
msgstr "Anda menghantar {} fail ke Tong Sampah."
|
||||
|
||||
#: core\gui\exclude_list_table.py:14
|
||||
msgid "Regular Expressions"
|
||||
msgstr "Ungkapan Nalar"
|
||||
|
||||
#: core\gui\ignore_list_dialog.py:25
|
||||
msgid "Do you really want to remove all %d items from the ignore list?"
|
||||
msgstr ""
|
||||
"Adakah anda pasti anda ingin alih keluar kesemua %d item dari senarai abai?"
|
||||
|
||||
#: core\me\scanner.py:20 core\se\scanner.py:16
|
||||
msgid "Filename"
|
||||
msgstr "Nama Fail"
|
||||
|
||||
#: core\me\scanner.py:21
|
||||
msgid "Filename - Fields"
|
||||
msgstr "Nama Fail - Medan"
|
||||
|
||||
#: core\me\scanner.py:22
|
||||
msgid "Filename - Fields (No Order)"
|
||||
msgstr "Nama Fail - Medan (Tiada Tertib)"
|
||||
|
||||
#: core\me\scanner.py:23
|
||||
msgid "Tags"
|
||||
msgstr "Tag"
|
||||
|
||||
#: core\me\scanner.py:24 core\pe\scanner.py:21 core\se\scanner.py:17
|
||||
msgid "Contents"
|
||||
msgstr "Kandungan"
|
||||
|
||||
#: core\pe\matchblock.py:72
|
||||
msgid "Analyzed %d/%d pictures"
|
||||
msgstr "%d / %d gambar dianalisis"
|
||||
|
||||
#: core\pe\matchblock.py:177
|
||||
msgid "Performed %d/%d chunk matches"
|
||||
msgstr "%d / %d padanan ketulan dilaksanakan"
|
||||
|
||||
#: core\pe\matchblock.py:185
|
||||
msgid "Preparing for matching"
|
||||
msgstr "Membuat persediaan untuk pemadanan"
|
||||
|
||||
#: core\pe\matchblock.py:234
|
||||
msgid "Verified %d/%d matches"
|
||||
msgstr "%d / %d padanan disahkan"
|
||||
|
||||
#: core\pe\matchexif.py:19
|
||||
msgid "Read EXIF of %d/%d pictures"
|
||||
msgstr "EXIF bagi %d / %d gambar dibaca"
|
||||
|
||||
#: core\pe\scanner.py:22
|
||||
msgid "EXIF Timestamp"
|
||||
msgstr "Cap masa EXIF"
|
||||
|
||||
#: core\prioritize.py:70
|
||||
msgid "None"
|
||||
msgstr "Tiada"
|
||||
|
||||
#: core\prioritize.py:100
|
||||
msgid "Ends with number"
|
||||
msgstr "Tamat dengan nombor"
|
||||
|
||||
#: core\prioritize.py:101
|
||||
msgid "Doesn't end with number"
|
||||
msgstr "Tidak tamat dengan nombor"
|
||||
|
||||
#: core\prioritize.py:102
|
||||
msgid "Longest"
|
||||
msgstr "Terpanjang"
|
||||
|
||||
#: core\prioritize.py:103
|
||||
msgid "Shortest"
|
||||
msgstr "Terpendek"
|
||||
|
||||
#: core\prioritize.py:140
|
||||
msgid "Highest"
|
||||
msgstr "Tertinggi"
|
||||
|
||||
#: core\prioritize.py:140
|
||||
msgid "Lowest"
|
||||
msgstr "Terendah"
|
||||
|
||||
#: core\prioritize.py:169
|
||||
msgid "Newest"
|
||||
msgstr "Terbaru"
|
||||
|
||||
#: core\prioritize.py:169
|
||||
msgid "Oldest"
|
||||
msgstr "Terlama"
|
||||
|
||||
#: core\results.py:134
|
||||
msgid "%d / %d (%s / %s) duplicates marked."
|
||||
msgstr "%d / %d (%s / %s) duplikasi ditandai."
|
||||
|
||||
#: core\results.py:141
|
||||
msgid " filter: %s"
|
||||
msgstr "penapis: %s"
|
||||
|
||||
#: core\scanner.py:90
|
||||
msgid "Read size of %d/%d files"
|
||||
msgstr "Saiz bagi %d / %d gambar dibaca"
|
||||
|
||||
#: core\scanner.py:116
|
||||
msgid "Read metadata of %d/%d files"
|
||||
msgstr "Metadata bagi %d / %d gambar dibaca"
|
||||
|
||||
#: core\scanner.py:154
|
||||
msgid "Almost done! Fiddling with results..."
|
||||
msgstr "Hampir selesai! Menyusun keputusan..."
|
||||
|
||||
#: core\se\scanner.py:18
|
||||
msgid "Folders"
|
||||
msgstr "Folder"
|
||||
990
locale/ms/LC_MESSAGES/ui.po
Normal file
990
locale/ms/LC_MESSAGES/ui.po
Normal file
@@ -0,0 +1,990 @@
|
||||
# Translators:
|
||||
# Yaya - Nurul Azeera Hidayah @ Muhammad Nur Hidayat Yasuyoshi (MNH48) <admin@mnh48.moe>, 2022
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Yaya - Nurul Azeera Hidayah @ Muhammad Nur Hidayat Yasuyoshi (MNH48) <admin@mnh48.moe>, 2022\n"
|
||||
"Language-Team: Malay (https://www.transifex.com/voltaicideas/teams/116153/ms/)\n"
|
||||
"Language: ms\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#: qt/app.py:81
|
||||
msgid "Quit"
|
||||
msgstr "Keluar"
|
||||
|
||||
#: qt/app.py:82 qt/preferences_dialog.py:116
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Options"
|
||||
msgstr "Pilihan"
|
||||
|
||||
#: qt/app.py:83 qt/ignore_list_dialog.py:32
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Ignore List"
|
||||
msgstr "Senarai Abai"
|
||||
|
||||
#: qt/app.py:84 qt/app.py:179 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Clear Picture Cache"
|
||||
msgstr "Kosongkan Cache Gambar"
|
||||
|
||||
#: qt/app.py:85 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "dupeGuru Help"
|
||||
msgstr "Bantuan dupeGuru"
|
||||
|
||||
#: qt/app.py:86 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "About dupeGuru"
|
||||
msgstr "Mengenai dupeGuru"
|
||||
|
||||
#: qt/app.py:87
|
||||
msgid "Open Debug Log"
|
||||
msgstr "Buka Log Nyahpepijat"
|
||||
|
||||
#: qt/app.py:180 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Do you really want to remove all your cached picture analysis?"
|
||||
msgstr ""
|
||||
"Adakah anda pasti anda ingin alih keluar kesemua analisis gambar cache anda?"
|
||||
|
||||
#: qt/app.py:184
|
||||
msgid "Picture cache cleared."
|
||||
msgstr "Cache gambar dikosongkan."
|
||||
|
||||
#: qt/app.py:251
|
||||
msgid "{} file (*.{})"
|
||||
msgstr "{} fail (*.{})"
|
||||
|
||||
#: qt/deletion_options.py:30 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Deletion Options"
|
||||
msgstr "Pilihan Pemadaman"
|
||||
|
||||
#: qt/deletion_options.py:35 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Link deleted files"
|
||||
msgstr "Pautkan fail dipadam"
|
||||
|
||||
#: qt/deletion_options.py:37 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid ""
|
||||
"After having deleted a duplicate, place a link targeting the reference file "
|
||||
"to replace the deleted file."
|
||||
msgstr ""
|
||||
"Setelah duplikasi dipadam, letak pautan menuju fail rujukan untuk "
|
||||
"menggantikan fail dipadam."
|
||||
|
||||
#: qt/deletion_options.py:44
|
||||
msgid "Hardlink"
|
||||
msgstr "Pautan Keras"
|
||||
|
||||
#: qt/deletion_options.py:44
|
||||
msgid "Symlink"
|
||||
msgstr "Pautan Bersimbol"
|
||||
|
||||
#: qt/deletion_options.py:48
|
||||
msgid " (unsupported)"
|
||||
msgstr " (tidak disokong)"
|
||||
|
||||
#: qt/deletion_options.py:49 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Directly delete files"
|
||||
msgstr "Padam fail secara terus"
|
||||
|
||||
#: qt/deletion_options.py:51 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid ""
|
||||
"Instead of sending files to trash, delete them directly. This option is "
|
||||
"usually used as a workaround when the normal deletion method doesn't work."
|
||||
msgstr ""
|
||||
"Padam fail secara terus dan bukannya hantar fail ke tong sampah. Pilihan ini"
|
||||
" selalunya digunakan sebagai penyelesaian apabila kaedah pemadaman biasa "
|
||||
"tidak berjaya."
|
||||
|
||||
#: qt/deletion_options.py:59 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Proceed"
|
||||
msgstr "Teruskan"
|
||||
|
||||
#: qt/deletion_options.py:60 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Cancel"
|
||||
msgstr "Batal"
|
||||
|
||||
#: qt/details_table.py:16 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Attribute"
|
||||
msgstr "Atribut"
|
||||
|
||||
#: qt/details_table.py:16 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Selected"
|
||||
msgstr "Dipilih"
|
||||
|
||||
#: qt/details_table.py:16 qt/directories_model.py:24
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Reference"
|
||||
msgstr "Rujukan"
|
||||
|
||||
#: qt/directories_dialog.py:64 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Load Results..."
|
||||
msgstr "Muatkan Keputusan..."
|
||||
|
||||
#: qt/directories_dialog.py:65 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Results Window"
|
||||
msgstr "Tetingkap Keputusan"
|
||||
|
||||
#: qt/directories_dialog.py:66
|
||||
msgid "Add Folder..."
|
||||
msgstr "Tambah Folder..."
|
||||
|
||||
#: qt/directories_dialog.py:74 qt/result_window.py:100
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "File"
|
||||
msgstr "Fail"
|
||||
|
||||
#: qt/directories_dialog.py:76 qt/result_window.py:108
|
||||
msgid "View"
|
||||
msgstr "Lihat"
|
||||
|
||||
#: qt/directories_dialog.py:78 qt/result_window.py:110
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Help"
|
||||
msgstr "Bantuan"
|
||||
|
||||
#: qt/directories_dialog.py:80 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Load Recent Results"
|
||||
msgstr "Muatkan Keputusan Baru-baru Ini"
|
||||
|
||||
#: qt/directories_dialog.py:116 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Application Mode:"
|
||||
msgstr "Mod Aplikasi:"
|
||||
|
||||
#: qt/directories_dialog.py:121 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Music"
|
||||
msgstr "Muzik"
|
||||
|
||||
#: qt/directories_dialog.py:121 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Picture"
|
||||
msgstr "Gambar"
|
||||
|
||||
#: qt/directories_dialog.py:121 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Standard"
|
||||
msgstr "Piawai"
|
||||
|
||||
#: qt/directories_dialog.py:128 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Scan Type:"
|
||||
msgstr "Jenis Imbasan:"
|
||||
|
||||
#: qt/directories_dialog.py:135
|
||||
msgid "More Options"
|
||||
msgstr "Pilihan Lanjutan"
|
||||
|
||||
#: qt/directories_dialog.py:139 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Select folders to scan and press \"Scan\"."
|
||||
msgstr "Pilih folder untuk imbas dan tekan \"Imbas\"."
|
||||
|
||||
#: qt/directories_dialog.py:163 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Load Results"
|
||||
msgstr "Muatkan Keputusan"
|
||||
|
||||
#: qt/directories_dialog.py:166 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Scan"
|
||||
msgstr "Imbas"
|
||||
|
||||
#: qt/directories_dialog.py:230
|
||||
msgid "Unsaved results"
|
||||
msgstr "Keputusan belum disimpan"
|
||||
|
||||
#: qt/directories_dialog.py:231 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "You have unsaved results, do you really want to quit?"
|
||||
msgstr ""
|
||||
"Anda mempunyai keputusan yang belum disimpan, adakah anda pasti anda ingin "
|
||||
"keluar?"
|
||||
|
||||
#: qt/directories_dialog.py:239 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Select a folder to add to the scanning list"
|
||||
msgstr "Pilih folder untuk tambah ke senarai imbasan"
|
||||
|
||||
#: qt/directories_dialog.py:266 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Select a results file to load"
|
||||
msgstr "Pilih fail keputusan untuk dimuatkan"
|
||||
|
||||
#: qt/directories_dialog.py:267
|
||||
msgid "All Files (*.*)"
|
||||
msgstr "Semua Fail (*.*)"
|
||||
|
||||
#: qt/directories_dialog.py:267 qt/result_window.py:311
|
||||
msgid "dupeGuru Results (*.dupeguru)"
|
||||
msgstr "Keputusan dupeGuru (*.dupeguru)"
|
||||
|
||||
#: qt/directories_dialog.py:278
|
||||
msgid "Start a new scan"
|
||||
msgstr "Mulakan imbasan baharu"
|
||||
|
||||
#: qt/directories_dialog.py:279 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "You have unsaved results, do you really want to continue?"
|
||||
msgstr ""
|
||||
"Anda mempunyai keputusan yang belum disimpan, adakah anda pasti anda ingin "
|
||||
"teruskan?"
|
||||
|
||||
#: qt/directories_model.py:23 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Name"
|
||||
msgstr "Nama"
|
||||
|
||||
#: qt/directories_model.py:23 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "State"
|
||||
msgstr "Keadaan"
|
||||
|
||||
#: qt/directories_model.py:24 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Excluded"
|
||||
msgstr "Dikecualikan"
|
||||
|
||||
#: qt/directories_model.py:24 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Normal"
|
||||
msgstr "Biasa"
|
||||
|
||||
#: qt/ignore_list_dialog.py:45 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Remove Selected"
|
||||
msgstr "Alih Keluar yang Dipilih"
|
||||
|
||||
#: qt/ignore_list_dialog.py:46 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Clear"
|
||||
msgstr "Kosongkan"
|
||||
|
||||
#: qt/ignore_list_dialog.py:47 qt/problem_dialog.py:61
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Close"
|
||||
msgstr "Tutup"
|
||||
|
||||
#: qt/me/details_dialog.py:18 qt/pe/details_dialog.py:24
|
||||
#: qt/result_window.py:56 qt/result_window.py:192 qt/se/details_dialog.py:18
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Details"
|
||||
msgstr "Maklumat"
|
||||
|
||||
#: qt/me/preferences_dialog.py:30 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Tags to scan:"
|
||||
msgstr "Tag untuk diimbas:"
|
||||
|
||||
#: qt/me/preferences_dialog.py:36 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Track"
|
||||
msgstr "Runut"
|
||||
|
||||
#: qt/me/preferences_dialog.py:38 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Artist"
|
||||
msgstr "Artis"
|
||||
|
||||
#: qt/me/preferences_dialog.py:40 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Album"
|
||||
msgstr "Album"
|
||||
|
||||
#: qt/me/preferences_dialog.py:42 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Title"
|
||||
msgstr "Tajuk"
|
||||
|
||||
#: qt/me/preferences_dialog.py:44 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Genre"
|
||||
msgstr "Genre"
|
||||
|
||||
#: qt/me/preferences_dialog.py:46 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Year"
|
||||
msgstr "Tahun"
|
||||
|
||||
#: qt/me/preferences_dialog.py:50 qt/se/preferences_dialog.py:30
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Word weighting"
|
||||
msgstr "Pemberatan perkataan"
|
||||
|
||||
#: qt/me/preferences_dialog.py:52 qt/se/preferences_dialog.py:32
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Match similar words"
|
||||
msgstr "Padan perkataan serupa"
|
||||
|
||||
#: qt/me/preferences_dialog.py:54 qt/pe/preferences_dialog.py:21
|
||||
#: qt/se/preferences_dialog.py:34 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Can mix file kind"
|
||||
msgstr "Boleh campur jenis fail"
|
||||
|
||||
#: qt/me/preferences_dialog.py:56 qt/pe/preferences_dialog.py:23
|
||||
#: qt/se/preferences_dialog.py:36 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Use regular expressions when filtering"
|
||||
msgstr "Guna ungkapan nalar ketika menapis"
|
||||
|
||||
#: qt/me/preferences_dialog.py:58 qt/pe/preferences_dialog.py:25
|
||||
#: qt/se/preferences_dialog.py:38 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Remove empty folders on delete or move"
|
||||
msgstr "Alih keluar folder kosong semasa pemadaman atau pemindahan"
|
||||
|
||||
#: qt/me/preferences_dialog.py:60 qt/pe/preferences_dialog.py:27
|
||||
#: qt/se/preferences_dialog.py:59 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Ignore duplicates hardlinking to the same file"
|
||||
msgstr "Abaikan duplikasi yang paut keras ke fail yang sama"
|
||||
|
||||
#: qt/me/preferences_dialog.py:62 qt/pe/preferences_dialog.py:29
|
||||
#: qt/se/preferences_dialog.py:62 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Debug mode (restart required)"
|
||||
msgstr "Mod nyahpepijat (perlu mula semula)"
|
||||
|
||||
#: qt/pe/preferences_dialog.py:19 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Match pictures of different dimensions"
|
||||
msgstr "Padan gambar dengan dimensi berlainan"
|
||||
|
||||
#: qt/preferences_dialog.py:43
|
||||
msgid "Filter Hardness:"
|
||||
msgstr "Kekuatan Penapis:"
|
||||
|
||||
#: qt/preferences_dialog.py:69
|
||||
msgid "More Results"
|
||||
msgstr "Lebihkan Keputusan"
|
||||
|
||||
#: qt/preferences_dialog.py:74
|
||||
msgid "Fewer Results"
|
||||
msgstr "Kurang Keputusan"
|
||||
|
||||
#: qt/preferences_dialog.py:81
|
||||
msgid "Font size:"
|
||||
msgstr "Saiz fon:"
|
||||
|
||||
#: qt/preferences_dialog.py:85
|
||||
msgid "Language:"
|
||||
msgstr "Bahasa:"
|
||||
|
||||
#: qt/preferences_dialog.py:91 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Copy and Move:"
|
||||
msgstr "Salin dan Pindah:"
|
||||
|
||||
#: qt/preferences_dialog.py:94 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Right in destination"
|
||||
msgstr "Dalam tempat tujuan"
|
||||
|
||||
#: qt/preferences_dialog.py:95 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Recreate relative path"
|
||||
msgstr "Cipta semula laluan relatif"
|
||||
|
||||
#: qt/preferences_dialog.py:96 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Recreate absolute path"
|
||||
msgstr "Cipta semula laluan mutlak"
|
||||
|
||||
#: qt/preferences_dialog.py:99
|
||||
msgid "Custom Command (arguments: %d for dupe, %r for ref):"
|
||||
msgstr "Perintah Tersuai (argumen: %d untuk duplikasi, %r untuk rujukan):"
|
||||
|
||||
#: qt/preferences_dialog.py:174
|
||||
msgid "dupeGuru has to restart for language changes to take effect."
|
||||
msgstr "dupeGuru perlu mula semula untuk menerima kesan perubahan bahasa."
|
||||
|
||||
#: qt/prioritize_dialog.py:75 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Re-Prioritize duplicates"
|
||||
msgstr "Pengutamaan semula duplikasi"
|
||||
|
||||
#: qt/prioritize_dialog.py:79 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid ""
|
||||
"Add criteria to the right box and click OK to send the dupes that correspond"
|
||||
" the best to these criteria to their respective group's reference position. "
|
||||
"Read the help file for more information."
|
||||
msgstr ""
|
||||
"Tambah kriteria di kotak kanan dan klik OK untuk hantar duplikasi yang "
|
||||
"paling sepadan dengan kriteria tersebut ke kedudukan rujukan kumpulan "
|
||||
"masing-masing. Baca fail bantuan untuk maklumat lanjut."
|
||||
|
||||
#: qt/problem_dialog.py:33 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Problems!"
|
||||
msgstr "Masalah!"
|
||||
|
||||
#: qt/problem_dialog.py:37 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid ""
|
||||
"There were problems processing some (or all) of the files. The cause of "
|
||||
"these problems are described in the table below. Those files were not "
|
||||
"removed from your results."
|
||||
msgstr ""
|
||||
"Terdapat masalah semasa memproses sesetengah (atau kesemua) fail. Penyebab "
|
||||
"masalah ini diterangkan dalam jadual di bawah. Fail tersebut tidak dialih "
|
||||
"keluar dari keputusan anda."
|
||||
|
||||
#: qt/problem_dialog.py:56
|
||||
msgid "Reveal Selected"
|
||||
msgstr "Dedahkan yang Dipilih"
|
||||
|
||||
#: qt/result_window.py:57 qt/result_window.py:104 qt/result_window.py:167
|
||||
#: qt/result_window.py:191 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Actions"
|
||||
msgstr "Tindakan"
|
||||
|
||||
#: qt/result_window.py:58 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Show Dupes Only"
|
||||
msgstr "Tunjuk Duplikasi Sahaja"
|
||||
|
||||
#: qt/result_window.py:59 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Show Delta Values"
|
||||
msgstr "Tunjuk Nilai Delta"
|
||||
|
||||
#: qt/result_window.py:60
|
||||
msgid "Send Marked to Recycle Bin..."
|
||||
msgstr "Hantar yang Ditandai ke Tong Sampah..."
|
||||
|
||||
#: qt/result_window.py:61 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Move Marked to..."
|
||||
msgstr "Pindah yang Ditandai ke..."
|
||||
|
||||
#: qt/result_window.py:62 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Copy Marked to..."
|
||||
msgstr "Salin yang Ditandai ke..."
|
||||
|
||||
#: qt/result_window.py:63 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Remove Marked from Results"
|
||||
msgstr "Alih Keluar yang Ditandai dari Keputusan"
|
||||
|
||||
#: qt/result_window.py:64 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Re-Prioritize Results..."
|
||||
msgstr "Pengutamaan Semula Keputusan..."
|
||||
|
||||
#: qt/result_window.py:67 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Remove Selected from Results"
|
||||
msgstr "Alih Keluar yang Dipilih dari Keputusan"
|
||||
|
||||
#: qt/result_window.py:71 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Add Selected to Ignore List"
|
||||
msgstr "Tambah yang Dipilih ke Senarai Abai"
|
||||
|
||||
#: qt/result_window.py:75 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Make Selected into Reference"
|
||||
msgstr "Jadikan yang Dipilih menjadi Rujukan"
|
||||
|
||||
#: qt/result_window.py:77 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Open Selected with Default Application"
|
||||
msgstr "Buka yang Dipilih dengan Aplikasi Lalai"
|
||||
|
||||
#: qt/result_window.py:80
|
||||
msgid "Open Containing Folder of Selected"
|
||||
msgstr "Buka Folder yang Mengandungi yang Dipilih"
|
||||
|
||||
#: qt/result_window.py:82 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Rename Selected"
|
||||
msgstr "Namakan Semula yang Dipilih"
|
||||
|
||||
#: qt/result_window.py:83 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Mark All"
|
||||
msgstr "Tanda Semua"
|
||||
|
||||
#: qt/result_window.py:84 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Mark None"
|
||||
msgstr "Tanda Kosong"
|
||||
|
||||
#: qt/result_window.py:85 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Invert Marking"
|
||||
msgstr "Terbalikkan Penandaan"
|
||||
|
||||
#: qt/result_window.py:86 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Mark Selected"
|
||||
msgstr "Tanda yang Dipilih"
|
||||
|
||||
#: qt/result_window.py:87
|
||||
msgid "Export To HTML"
|
||||
msgstr "Eksport ke HTML"
|
||||
|
||||
#: qt/result_window.py:88
|
||||
msgid "Export To CSV"
|
||||
msgstr "Eksport ke CSV"
|
||||
|
||||
#: qt/result_window.py:89 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Save Results..."
|
||||
msgstr "Simpan Keputusan..."
|
||||
|
||||
#: qt/result_window.py:90 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Invoke Custom Command"
|
||||
msgstr "Guna Perintah Tersuai"
|
||||
|
||||
#: qt/result_window.py:102
|
||||
msgid "Mark"
|
||||
msgstr "Tanda"
|
||||
|
||||
#: qt/result_window.py:106 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Columns"
|
||||
msgstr "Lajur"
|
||||
|
||||
#: qt/result_window.py:163
|
||||
msgid "Reset to Defaults"
|
||||
msgstr "Tetap Semula ke Lalai"
|
||||
|
||||
#: qt/result_window.py:185
|
||||
msgid "{} Results"
|
||||
msgstr "{} Keputusan"
|
||||
|
||||
#: qt/result_window.py:193 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Dupes Only"
|
||||
msgstr "Duplikasi Sahaja"
|
||||
|
||||
#: qt/result_window.py:194
|
||||
msgid "Delta Values"
|
||||
msgstr "Nilai Delta"
|
||||
|
||||
#: qt/result_window.py:310 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Select a file to save your results to"
|
||||
msgstr "Pilih fail untuk simpan keputusan anda"
|
||||
|
||||
#: qt/se/preferences_dialog.py:41
|
||||
msgid "Ignore files smaller than"
|
||||
msgstr "Abaikan fail lebih kecil dari"
|
||||
|
||||
#: qt/se/preferences_dialog.py:52 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "KB"
|
||||
msgstr "KB"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "%@ Results"
|
||||
msgstr "%@ Keputusan"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Action"
|
||||
msgstr "Tindakan"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Add New Folder..."
|
||||
msgstr "Tambah Folder Baharu..."
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Advanced"
|
||||
msgstr "Lanjutan"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Automatically check for updates"
|
||||
msgstr "Periksa kemas kini secara automatik"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Basic"
|
||||
msgstr "Asas"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Bring All to Front"
|
||||
msgstr "Bawa Semua ke Hadapan"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Check for update..."
|
||||
msgstr "Periksa kemas kini..."
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Close Window"
|
||||
msgstr "Tutup Tetingkap"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Copy"
|
||||
msgstr "Salin"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Custom command (arguments: %d for dupe, %r for ref):"
|
||||
msgstr "Perintah tersuai (argumen: %d untuk duplikasi, %r untuk rujukan):"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Cut"
|
||||
msgstr "Potong"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Delta"
|
||||
msgstr "Delta"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Details of Selected File"
|
||||
msgstr "Maklumat Fail yang Dipilih"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Details Panel"
|
||||
msgstr "Panel Maklumat"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Directories"
|
||||
msgstr "Direktori"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "dupeGuru"
|
||||
msgstr "dupeGuru"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "dupeGuru Preferences"
|
||||
msgstr "Keutamaan dupeGuru"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "dupeGuru Results"
|
||||
msgstr "Keputusan dupeGuru"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "dupeGuru Website"
|
||||
msgstr "Laman Sesawang dupeGuru"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Edit"
|
||||
msgstr "Sunting"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Export Results to CSV"
|
||||
msgstr "Eksport Keputusan ke CSV"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Export Results to XHTML"
|
||||
msgstr "Eksport Keputusan ke XHTML"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Fewer results"
|
||||
msgstr "Kurangkan keputusan"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Filter"
|
||||
msgstr "Penapis"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Filter hardness:"
|
||||
msgstr "Kekuatan penapisan:"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Filter Results..."
|
||||
msgstr "Tapis Keputusan..."
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Folder Selection Window"
|
||||
msgstr "Tetingkap Pemilihan Folder"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Font Size:"
|
||||
msgstr "Saiz Fon:"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Hide dupeGuru"
|
||||
msgstr "Sembunyikan dupeGuru"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Hide Others"
|
||||
msgstr "Sembunyikan yang Lain"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Ignore files smaller than:"
|
||||
msgstr "Abaikan fail lebih kecil dari:"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Load from file..."
|
||||
msgstr "Muatkan dari fail..."
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Minimize"
|
||||
msgstr "Meminimumkan"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Mode"
|
||||
msgstr "Mod"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "More results"
|
||||
msgstr "Lebihkan keputusan"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Ok"
|
||||
msgstr "Ok"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Paste"
|
||||
msgstr "Tampal"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Preferences..."
|
||||
msgstr "Keutamaan..."
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Quick Look"
|
||||
msgstr "Lihat Segera"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Quit dupeGuru"
|
||||
msgstr "Keluar dupeGuru"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Reset to Default"
|
||||
msgstr "Tetap Semula ke Lalai"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Reset To Defaults"
|
||||
msgstr "Tetap Semula ke Lalai"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Reveal"
|
||||
msgstr "Dedah"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Reveal Selected in Finder"
|
||||
msgstr "Dedah yang Dipilih dalam Pencari"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Select All"
|
||||
msgstr "Pilih Semua"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Send Marked to Trash..."
|
||||
msgstr "Hantar yang Ditandai ke Tong Sampah..."
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Services"
|
||||
msgstr "Perkhidmatan"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Show All"
|
||||
msgstr "Tunjuk Semua"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Start Duplicate Scan"
|
||||
msgstr "Mulakan Imbasan Duplikasi"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "The name '%@' already exists."
|
||||
msgstr "Nama '%@' sudah wujud."
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Window"
|
||||
msgstr "Tetingkap"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Zoom"
|
||||
msgstr "Zum"
|
||||
|
||||
#: qt\app.py:158
|
||||
msgid "Exclusion Filters"
|
||||
msgstr "Penapis Pengecualian"
|
||||
|
||||
#: qt\directories_dialog.py:91
|
||||
msgid "Scan Results"
|
||||
msgstr "Keputusan Imbasan"
|
||||
|
||||
#: qt\directories_dialog.py:95
|
||||
msgid "Load Directories..."
|
||||
msgstr "Muatkan Direktori..."
|
||||
|
||||
#: qt\directories_dialog.py:96
|
||||
msgid "Save Directories..."
|
||||
msgstr "Simpan Direktori..."
|
||||
|
||||
#: qt\directories_dialog.py:337
|
||||
msgid "Select a directories file to load"
|
||||
msgstr "Pilih fail direktori untuk dimuatkan"
|
||||
|
||||
#: qt\directories_dialog.py:338
|
||||
msgid "dupeGuru Results (*.dupegurudirs)"
|
||||
msgstr "Keputusan dupeGuru (*.dupegurudirs)"
|
||||
|
||||
#: qt\directories_dialog.py:347
|
||||
msgid "Select a file to save your directories to"
|
||||
msgstr "Pilih fail untuk simpan direktori anda"
|
||||
|
||||
#: qt\directories_dialog.py:348
|
||||
msgid "dupeGuru Directories (*.dupegurudirs)"
|
||||
msgstr "Direktori dupeGuru (*.dupegurudirs)"
|
||||
|
||||
#: qt\exclude_list_dialog.py:44
|
||||
msgid "Add"
|
||||
msgstr "Tambah"
|
||||
|
||||
#: qt\exclude_list_dialog.py:46
|
||||
msgid "Restore defaults"
|
||||
msgstr "Tetap semula lalai"
|
||||
|
||||
#: qt\exclude_list_dialog.py:47
|
||||
msgid "Test string"
|
||||
msgstr "Cuba rentetan"
|
||||
|
||||
#: qt\exclude_list_dialog.py:83
|
||||
msgid "Type a python regular expression here..."
|
||||
msgstr "Taipkan ungkapan nalar python di sini..."
|
||||
|
||||
#: qt\exclude_list_dialog.py:85
|
||||
msgid "Type a file system path or filename here..."
|
||||
msgstr "Taipkan laluan sistem fail atau nama fail di sini..."
|
||||
|
||||
#: qt\exclude_list_dialog.py:152
|
||||
msgid ""
|
||||
"These (case sensitive) python regular expressions will filter out files during scans.<br>Directores will also have their <strong>default state</strong> set to Excluded in the Directories tab if their name happen to match one of the regular expressions.<br>For each file collected two tests are perfomed on each of them to determine whether or not to filter them out:<br><li>1. Regular expressions with no path separator in them will be compared to the file name only.</li>\n"
|
||||
"<li>2. Regular expressions with no path separator in them will be compared to the full path to the file.</li><br>\n"
|
||||
"Example: if you want to filter out .PNG files from the \"My Pictures\" directory only:<br><code>.*My\\sPictures\\\\.*\\.png</code><br><br>You can test the regular expression with the test string feature by pasting a fake path in it:<br><code>C:\\\\User\\My Pictures\\test.png</code><br><br>\n"
|
||||
"Matching regular expressions will be highlighted.<br>If there is at least one highlight, the path tested will be ignored during scans.<br><br>Directories and files starting with a period '.' are filtered out by default.<br><br>"
|
||||
msgstr ""
|
||||
"Ungkapan nalar python (sensitif huruf) ini akan menapis keluar fail ketika imbasan.<br>Direktori juga akan ada <strong>keadaan lalai</strong>sendiri ditetapkan kepada Dikecualikan dalam tab Direktori jika nama tersebut sepadan dengan salah satu ungkapan nalar.<br>Untuk setiap fail yang terhimpun, dua percubaan akan dilaksanakan bagi setiap satu fail tersebut untuk menentukan sama ada fail tersebut perlu ditapis keluar:<br><li>1. Ungkapan nalar tanpa pemisah laluan di dalamnya akan dibandingkan dengan nama fail sahaja.</li>\n"
|
||||
"<li>2. Ungkapan nalar tanpa pemisah laluan di dalamnya akan dibandingkan dengan laluan penuh ke fail.</li><br>\n"
|
||||
"Contoh: jika anda ingin tapis keluar fail .PNG dari direktori \"My Pictures\" sahaja:<br><code>.*My\\sPictures\\\\.*\\.png</code><br><br>Anda boleh cuba ungkapan nalar dengan fungsi cuba rentetan dengan menampal laluan palsu di dalamnya:<br><code>C:\\\\User\\My Pictures\\test.png</code><br><br>\n"
|
||||
"Ungkapan nalar yang terpadan akan ditonjolkan.<br>Sekiranya ada sekurang-kurangnya satu tonjolan, laluan yang dicuba akan diabaikan ketika imbasan.<br><br>Direktori dan fail yang bermula dengan tanda titik '.' ditapis keluar secara lalainya.<br><br>"
|
||||
|
||||
#: qt\exclude_list_table.py:36
|
||||
msgid "Compilation error: "
|
||||
msgstr "Ralat pengkompilan:"
|
||||
|
||||
#: qt\pe\image_viewer.py:56
|
||||
msgid "Increase zoom"
|
||||
msgstr "Naikkan zum"
|
||||
|
||||
#: qt\pe\image_viewer.py:66
|
||||
msgid "Decrease zoom"
|
||||
msgstr "Turunkan zum"
|
||||
|
||||
#: qt\pe\image_viewer.py:71
|
||||
msgid "Ctrl+/"
|
||||
msgstr "Ctrl+/"
|
||||
|
||||
#: qt\pe\image_viewer.py:76
|
||||
msgid "Normal size"
|
||||
msgstr "Saiz biasa"
|
||||
|
||||
#: qt\pe\image_viewer.py:81
|
||||
msgid "Ctrl+*"
|
||||
msgstr "Ctrl+*"
|
||||
|
||||
#: qt\pe\image_viewer.py:86
|
||||
msgid "Best fit"
|
||||
msgstr "Suaian terbaik"
|
||||
|
||||
#: qt\pe\preferences_dialog.py:49
|
||||
msgid "Picture cache mode:"
|
||||
msgstr "Mod cache gambar:"
|
||||
|
||||
#: qt\pe\preferences_dialog.py:56
|
||||
msgid "Override theme icons in viewer toolbar"
|
||||
msgstr "Mengataskan ikon tema dalam bar alat pemidang"
|
||||
|
||||
#: qt\pe\preferences_dialog.py:58
|
||||
msgid ""
|
||||
"Use our own internal icons instead of those provided by the theme engine"
|
||||
msgstr ""
|
||||
"Guna ikon dalaman kami sendiri menggantikan apa yang disediakan oleh enjin "
|
||||
"tema"
|
||||
|
||||
#: qt\pe\preferences_dialog.py:66
|
||||
msgid "Show scrollbars in image viewers"
|
||||
msgstr "Tunjuk bar tatal dalam pemidang imej"
|
||||
|
||||
#: qt\pe\preferences_dialog.py:68
|
||||
msgid ""
|
||||
"When the image displayed doesn't fit the viewport, show scrollbars to span "
|
||||
"the view around"
|
||||
msgstr ""
|
||||
"Apabila imej yang dipaparkan tidak muat dalam port pandang, tunjuk bar tatal"
|
||||
" untuk menggerakkan pemidang"
|
||||
|
||||
#: qt\preferences_dialog.py:156
|
||||
msgid "Use default position for tab bar (requires restart)"
|
||||
msgstr "Guna kedudukan lalai untuk bar tab (perlu mula semula)"
|
||||
|
||||
#: qt\preferences_dialog.py:158
|
||||
msgid ""
|
||||
"Place the tab bar below the main menu instead of next to it\n"
|
||||
"On MacOS, the tab bar will fill up the window's width instead."
|
||||
msgstr ""
|
||||
"Letak bar tab di bawah menu utama dan bukannya di sebelahnya\n"
|
||||
"Di MacOS, bar tab akan mengisi lebar tetingkap."
|
||||
|
||||
#: qt\preferences_dialog.py:172
|
||||
msgid "Use bold font for references"
|
||||
msgstr "Guna fon tebal untuk rujukan"
|
||||
|
||||
#: qt\preferences_dialog.py:176
|
||||
msgid "Reference foreground color:"
|
||||
msgstr "Warna latar depan rujukan:"
|
||||
|
||||
#: qt\preferences_dialog.py:179
|
||||
msgid "Reference background color:"
|
||||
msgstr "Warna latar belakang rujukan:"
|
||||
|
||||
#: qt\preferences_dialog.py:182 qt\preferences_dialog.py:216
|
||||
msgid "Delta foreground color:"
|
||||
msgstr "Warna latar depan delta:"
|
||||
|
||||
#: qt\preferences_dialog.py:195
|
||||
msgid "Show the title bar and can be docked"
|
||||
msgstr "Tunjuk bar tajuk dan boleh dilimbungkan"
|
||||
|
||||
#: qt\preferences_dialog.py:197
|
||||
msgid ""
|
||||
"While the title bar is hidden, use the modifier key to drag the floating "
|
||||
"window around"
|
||||
msgstr ""
|
||||
"Apabila bar tajuk disembunyikan, guna kekunci pengubah suai untuk seret "
|
||||
"tetingkap terapung"
|
||||
|
||||
#: qt\preferences_dialog.py:199
|
||||
msgid "The title bar can only be disabled while the window is docked"
|
||||
msgstr "Bar tajuk hanya boleh dilumpuhkan ketika tetingkap dilimbungkan"
|
||||
|
||||
#: qt\preferences_dialog.py:202
|
||||
msgid "Vertical title bar"
|
||||
msgstr "Bar tajuk menegak"
|
||||
|
||||
#: qt\preferences_dialog.py:204
|
||||
msgid ""
|
||||
"Change the title bar from horizontal on top, to vertical on the left side"
|
||||
msgstr ""
|
||||
"Ubah bar tajuk daripada melintang di atas, kepada menegak di sisi kiri"
|
||||
|
||||
#: qt\tabbed_window.py:44
|
||||
msgid "Show tab bar"
|
||||
msgstr "Tunjuk bar tab"
|
||||
|
||||
#: qt\exclude_list_dialog.py:152
|
||||
msgid ""
|
||||
"These (case sensitive) python regular expressions will filter out files during scans.<br>Directores will also have their <strong>default state</strong> set to Excluded in the Directories tab if their name happens to match one of the selected regular expressions.<br>For each file collected, two tests are performed to determine whether or not to completely ignore it:<br><li>1. Regular expressions with no path separator in them will be compared to the file name only.</li>\n"
|
||||
"<li>2. Regular expressions with at least one path separator in them will be compared to the full path to the file.</li><br>\n"
|
||||
"Example: if you want to filter out .PNG files from the \"My Pictures\" directory only:<br><code>.*My\\sPictures\\\\.*\\.png</code><br><br>You can test the regular expression with the \"test string\" button after pasting a fake path in the test field:<br><code>C:\\\\User\\My Pictures\\test.png</code><br><br>\n"
|
||||
"Matching regular expressions will be highlighted.<br>If there is at least one highlight, the path or filename tested will be ignored during scans.<br><br>Directories and files starting with a period '.' are filtered out by default.<br><br>"
|
||||
msgstr ""
|
||||
"Ungkapan nalar python (sensitif huruf) ini akan menapis keluar fail ketika imbasan.<br>Direktori juga akan ada <strong>keadaan lalai</strong> sendiri ditetapkan kepada Dikecualikan dalam tab Direktori jika nama tersebut sepadan dengan salah satu daripada ungkapan nalar yang dipilih.<br>Untuk setiap fail yang terhimpun, dua percubaan akan dilaksanakan untuk menentukan sama ada fail tersebut perlu diabaikan sepenuhnya:<br><li>1. Ungkapan nalar tanpa pemisah laluan di dalamnya akan dibandingkan dengan nama fail sahaja.</li>\n"
|
||||
"<li>2. Ungkapan nalar dengan sekurang-kurangnya satu pemisah laluan di dalamnya akan dibandingkan dengan laluan penuh ke fail.</li><br>\n"
|
||||
"Contoh: jika anda ingin tapis keluar fail .PNG dari direktori \"My Pictures\" sahaja:<br><code>.*My\\sPictures\\\\.*\\.png</code><br><br>Anda boleh cuba ungkapan nalar dengan butang \"cuba rentetan\" selepas menampal laluan palsi dalam medan percubaan:<br><code>C:\\\\User\\My Pictures\\test.png</code><br><br>\n"
|
||||
"Ungkapan nalar yang terpadan akan ditonjolkan.<br>Sekiranya ada sekurang-kurangnya satu tonjolan, laluan atau nama fail yang dicuba akan diabaikan ketika imbasan.<br><br>Direktori dan fail yang bermula dengan tanda titik '.' ditapis keluar secara lalainya.<br><br>"
|
||||
|
||||
#: qt\app.py:256
|
||||
msgid "Results"
|
||||
msgstr "Keputusan"
|
||||
|
||||
#: qt\preferences_dialog.py:150
|
||||
msgid "General Interface"
|
||||
msgstr "Antara Muka Am"
|
||||
|
||||
#: qt\preferences_dialog.py:176
|
||||
msgid "Result Table"
|
||||
msgstr "Jadual Keputusan"
|
||||
|
||||
#: qt\preferences_dialog.py:205
|
||||
msgid "Details Window"
|
||||
msgstr "Tetingkap Maklumat"
|
||||
|
||||
#: qt\preferences_dialog.py:285
|
||||
msgid "General"
|
||||
msgstr "Am"
|
||||
|
||||
#: qt\preferences_dialog.py:286
|
||||
msgid "Display"
|
||||
msgstr "Paparan"
|
||||
|
||||
#: qt\se\preferences_dialog.py:70
|
||||
msgid "Partially hash files bigger than"
|
||||
msgstr "Fail cincang separa lebih besar dari"
|
||||
|
||||
#: qt\se\preferences_dialog.py:80
|
||||
msgid "MB"
|
||||
msgstr "MB"
|
||||
|
||||
#: qt\preferences_dialog.py:163
|
||||
msgid "Use native OS dialogs"
|
||||
msgstr "Guna dialog OS natif"
|
||||
|
||||
#: qt\preferences_dialog.py:166
|
||||
msgid ""
|
||||
"For actions such as file/folder selection use the OS native dialogs.\n"
|
||||
"Some native dialogs have limited functionality."
|
||||
msgstr ""
|
||||
"Gunakan dialog natif OS untuk tindakan seperti pemilihan fail/folder.\n"
|
||||
"Sesetengah dialog natif mempunyai kefungsian yang terhad."
|
||||
|
||||
#: qt\se\preferences_dialog.py:68
|
||||
msgid "Ignore files larger than"
|
||||
msgstr "Abaikan fail lebih besar dari"
|
||||
|
||||
#: qt\app.py:135 qt\app.py:293
|
||||
msgid "Clear Cache"
|
||||
msgstr "Kosongkan Cache"
|
||||
|
||||
#: qt\app.py:294
|
||||
msgid ""
|
||||
"Do you really want to clear the cache? This will remove all cached file "
|
||||
"hashes and picture analysis."
|
||||
msgstr ""
|
||||
"Adakah anda pasti anda ingin kosongkan cache? Ini akan alih keluar semua "
|
||||
"cincang fail dan analisis gambar yang tercache."
|
||||
|
||||
#: qt\app.py:299
|
||||
msgid "Cache cleared."
|
||||
msgstr "Cache dikosongkan."
|
||||
|
||||
#: qt\preferences_dialog.py:173
|
||||
msgid "Use dark style"
|
||||
msgstr "Guna gaya gelap"
|
||||
@@ -49,7 +49,7 @@ msgstr "Kopiëren"
|
||||
msgid "Sending to Trash"
|
||||
msgstr "Naar de prullebak verplaatsen"
|
||||
|
||||
#: core\app.py:308
|
||||
#: core\app.py:289
|
||||
msgid ""
|
||||
"A previous action is still hanging in there. You can't start a new one yet. "
|
||||
"Wait a few seconds, then try again."
|
||||
@@ -57,35 +57,39 @@ msgstr ""
|
||||
"Er is nog een vorige actie bezig. Je kan nu nog geen nieuwe actie starten. "
|
||||
"Wacht een paar seconden en probeer het opnieuw"
|
||||
|
||||
#: core\app.py:318
|
||||
#: core\app.py:300
|
||||
msgid "No duplicates found."
|
||||
msgstr "Geen dubbelingen gevonden"
|
||||
|
||||
#: core\app.py:333
|
||||
#: core\app.py:315
|
||||
msgid "All marked files were copied successfully."
|
||||
msgstr "Alle gemarkeerde bestanden zijn succesvol gekopieerd."
|
||||
|
||||
#: core\app.py:334
|
||||
#: core\app.py:317
|
||||
msgid "All marked files were moved successfully."
|
||||
msgstr "Alle gemarkeerde bestanden zijn succesvol verplaatst."
|
||||
|
||||
#: core\app.py:335
|
||||
#: core\app.py:319
|
||||
msgid "All marked files were deleted successfully."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:321
|
||||
msgid "All marked files were successfully sent to Trash."
|
||||
msgstr "Alle gemarkeerde bestanden zijn met succes in de prullenbak gedaan."
|
||||
|
||||
#: core\app.py:343
|
||||
#: core\app.py:326
|
||||
msgid "Could not load file: {}"
|
||||
msgstr "Kan bestand niet laden: {}"
|
||||
|
||||
#: core\app.py:399
|
||||
#: core\app.py:382
|
||||
msgid "'{}' already is in the list."
|
||||
msgstr "'{}' staat al in de lijst."
|
||||
|
||||
#: core\app.py:401
|
||||
#: core\app.py:384
|
||||
msgid "'{}' does not exist."
|
||||
msgstr "'{}' bestaat niet."
|
||||
|
||||
#: core\app.py:410
|
||||
#: core\app.py:392
|
||||
msgid ""
|
||||
"All selected %d matches are going to be ignored in all subsequent scans. "
|
||||
"Continue?"
|
||||
@@ -93,68 +97,72 @@ msgstr ""
|
||||
"Alle geselecteerde %d overeenkomsten zullen in toekomstige onderzoeken "
|
||||
"worden overgslagen. Doorgaan?"
|
||||
|
||||
#: core\app.py:486
|
||||
#: core\app.py:469
|
||||
msgid "Select a directory to copy marked files to"
|
||||
msgstr ""
|
||||
"Selecteer een map waar u de gemarkeerde bestanden naartoe wilt kopiëren"
|
||||
|
||||
#: core\app.py:487
|
||||
#: core\app.py:471
|
||||
msgid "Select a directory to move marked files to"
|
||||
msgstr ""
|
||||
"Selecteer een map waar u de gemarkeerde bestanden naartoe wilt verplaatsen"
|
||||
|
||||
#: core\app.py:527
|
||||
#: core\app.py:510
|
||||
msgid "Select a destination for your exported CSV"
|
||||
msgstr "Selecteer een locatie voor de CSV export"
|
||||
|
||||
#: core\app.py:534 core\app.py:801 core\app.py:811
|
||||
#: core\app.py:516 core\app.py:771 core\app.py:781
|
||||
msgid "Couldn't write to file: {}"
|
||||
msgstr "Kan niet schrijven naar bestand: {}"
|
||||
|
||||
#: core\app.py:559
|
||||
#: core\app.py:539
|
||||
msgid "You have no custom command set up. Set it up in your preferences."
|
||||
msgstr ""
|
||||
"Er is nog geen \"aangepaste opdracht\" ingericht. Je kan dit doen bij de "
|
||||
"voorkeuren."
|
||||
|
||||
#: core\app.py:727 core\app.py:740
|
||||
#: core\app.py:695 core\app.py:707
|
||||
msgid "You are about to remove %d files from results. Continue?"
|
||||
msgstr ""
|
||||
"Je staat op het punt om %d bestanden te verwijderen uit de resultaten. "
|
||||
"Doorgaan?"
|
||||
|
||||
#: core\app.py:774
|
||||
#: core\app.py:743
|
||||
msgid "{} duplicate groups were changed by the re-prioritization."
|
||||
msgstr ""
|
||||
"{} dubbelingen groepen waren veranderd door de prioriteits verschuiving."
|
||||
|
||||
#: core\app.py:821
|
||||
#: core\app.py:790
|
||||
msgid "The selected directories contain no scannable file."
|
||||
msgstr ""
|
||||
"De geselecteerde folders bevatten geen bestanden die onderzocht kunnen "
|
||||
"worden."
|
||||
|
||||
#: core\app.py:835
|
||||
#: core\app.py:803
|
||||
msgid "Collecting files to scan"
|
||||
msgstr "Bestanden aan het verzamelen om te onderzoeken"
|
||||
|
||||
#: core\app.py:891
|
||||
#: core\app.py:850
|
||||
msgid "%s (%d discarded)"
|
||||
msgstr "%s (%d weggelaten)"
|
||||
|
||||
#: core\engine.py:244 core\engine.py:288
|
||||
msgid "0 matches found"
|
||||
msgstr "0 overeenkomsten gevonden"
|
||||
#: core\directories.py:191
|
||||
msgid "Collected {} files to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\engine.py:262 core\engine.py:296
|
||||
msgid "%d matches found"
|
||||
msgstr "%d overeenkomsten gevonden"
|
||||
#: core\directories.py:207
|
||||
msgid "Collected {} folders to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\gui\deletion_options.py:73
|
||||
#: core\engine.py:27
|
||||
msgid "%d matches found from %d groups"
|
||||
msgstr ""
|
||||
|
||||
#: core\gui\deletion_options.py:71
|
||||
msgid "You are sending {} file(s) to the Trash."
|
||||
msgstr "Je verplaatst {} bestand(en) naar de prullenbak"
|
||||
|
||||
#: core\gui\exclude_list_table.py:15
|
||||
#: core\gui\exclude_list_table.py:14
|
||||
msgid "Regular Expressions"
|
||||
msgstr "Normale Uitdrukkingen"
|
||||
|
||||
@@ -187,15 +195,15 @@ msgstr "Inhoud"
|
||||
msgid "Analyzed %d/%d pictures"
|
||||
msgstr "%d van de %d afbeeldingen aan het analyseren"
|
||||
|
||||
#: core\pe\matchblock.py:181
|
||||
#: core\pe\matchblock.py:177
|
||||
msgid "Performed %d/%d chunk matches"
|
||||
msgstr "%d van de %d bulk overeenkomsten uitgevoerd"
|
||||
|
||||
#: core\pe\matchblock.py:191
|
||||
#: core\pe\matchblock.py:185
|
||||
msgid "Preparing for matching"
|
||||
msgstr "Voorbereiden voor dubbelingen bepaling"
|
||||
|
||||
#: core\pe\matchblock.py:244
|
||||
#: core\pe\matchblock.py:234
|
||||
msgid "Verified %d/%d matches"
|
||||
msgstr "%d van de %d overeenkomsten nagekeken"
|
||||
|
||||
@@ -243,23 +251,23 @@ msgstr "nieuwste"
|
||||
msgid "Oldest"
|
||||
msgstr "oudste"
|
||||
|
||||
#: core\results.py:142
|
||||
#: core\results.py:134
|
||||
msgid "%d / %d (%s / %s) duplicates marked."
|
||||
msgstr "%d / %d (%s /%s) dubbelingen gemarkeerd"
|
||||
|
||||
#: core\results.py:149
|
||||
#: core\results.py:141
|
||||
msgid " filter: %s"
|
||||
msgstr "filter: %s"
|
||||
|
||||
#: core\scanner.py:85
|
||||
#: core\scanner.py:90
|
||||
msgid "Read size of %d/%d files"
|
||||
msgstr "Bestandsgrootte van %d/%d bestanden aan het lezen."
|
||||
|
||||
#: core\scanner.py:109
|
||||
#: core\scanner.py:116
|
||||
msgid "Read metadata of %d/%d files"
|
||||
msgstr "Metadata van %d/%d bestanden gelezen"
|
||||
|
||||
#: core\scanner.py:147
|
||||
#: core\scanner.py:154
|
||||
msgid "Almost done! Fiddling with results..."
|
||||
msgstr "Bijna klaar! Gehannes met resultaten..."
|
||||
|
||||
|
||||
@@ -945,3 +945,43 @@ msgstr "Algemeen"
|
||||
#: qt\preferences_dialog.py:286
|
||||
msgid "Display"
|
||||
msgstr "Scherm"
|
||||
|
||||
#: qt\se\preferences_dialog.py:70
|
||||
msgid "Partially hash files bigger than"
|
||||
msgstr ""
|
||||
|
||||
#: qt\se\preferences_dialog.py:80
|
||||
msgid "MB"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:163
|
||||
msgid "Use native OS dialogs"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:166
|
||||
msgid ""
|
||||
"For actions such as file/folder selection use the OS native dialogs.\n"
|
||||
"Some native dialogs have limited functionality."
|
||||
msgstr ""
|
||||
|
||||
#: qt\se\preferences_dialog.py:68
|
||||
msgid "Ignore files larger than"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:135 qt\app.py:293
|
||||
msgid "Clear Cache"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:294
|
||||
msgid ""
|
||||
"Do you really want to clear the cache? This will remove all cached file "
|
||||
"hashes and picture analysis."
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:299
|
||||
msgid "Cache cleared."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:173
|
||||
msgid "Use dark style"
|
||||
msgstr ""
|
||||
|
||||
@@ -48,7 +48,7 @@ msgstr "Kopiowanie"
|
||||
msgid "Sending to Trash"
|
||||
msgstr "Wysyłam do kosza"
|
||||
|
||||
#: core\app.py:308
|
||||
#: core\app.py:289
|
||||
msgid ""
|
||||
"A previous action is still hanging in there. You can't start a new one yet. "
|
||||
"Wait a few seconds, then try again."
|
||||
@@ -56,35 +56,39 @@ msgstr ""
|
||||
"Wciąż wisi tam poprzednia akcja. Nie możesz jeszcze rozpocząć nowego. "
|
||||
"Poczekaj kilka sekund i spróbuj ponownie."
|
||||
|
||||
#: core\app.py:318
|
||||
#: core\app.py:300
|
||||
msgid "No duplicates found."
|
||||
msgstr "Nie znaleziono duplikatów."
|
||||
|
||||
#: core\app.py:333
|
||||
#: core\app.py:315
|
||||
msgid "All marked files were copied successfully."
|
||||
msgstr "Wszystkie zaznaczone pliki zostały pomyślnie skopiowane."
|
||||
|
||||
#: core\app.py:334
|
||||
#: core\app.py:317
|
||||
msgid "All marked files were moved successfully."
|
||||
msgstr "Wszystkie zaznaczone pliki zostały pomyślnie przeniesione."
|
||||
|
||||
#: core\app.py:335
|
||||
#: core\app.py:319
|
||||
msgid "All marked files were deleted successfully."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:321
|
||||
msgid "All marked files were successfully sent to Trash."
|
||||
msgstr "Wszystkie zaznaczone pliki zostały pomyślnie wysłane do kosza."
|
||||
|
||||
#: core\app.py:343
|
||||
#: core\app.py:326
|
||||
msgid "Could not load file: {}"
|
||||
msgstr "Nie udało się załadować pliku: {}"
|
||||
|
||||
#: core\app.py:399
|
||||
#: core\app.py:382
|
||||
msgid "'{}' already is in the list."
|
||||
msgstr "'{}' jest już na liście."
|
||||
|
||||
#: core\app.py:401
|
||||
#: core\app.py:384
|
||||
msgid "'{}' does not exist."
|
||||
msgstr "'{}' nie istnieje."
|
||||
|
||||
#: core\app.py:410
|
||||
#: core\app.py:392
|
||||
msgid ""
|
||||
"All selected %d matches are going to be ignored in all subsequent scans. "
|
||||
"Continue?"
|
||||
@@ -92,61 +96,65 @@ msgstr ""
|
||||
"Wszystkie zaznaczone %d duplikaty będą ignorowane w kolejnych skanach. "
|
||||
"Kontynuować?"
|
||||
|
||||
#: core\app.py:486
|
||||
#: core\app.py:469
|
||||
msgid "Select a directory to copy marked files to"
|
||||
msgstr "Wybierz katalog, do którego chcesz skopiować zaznaczone pliki"
|
||||
|
||||
#: core\app.py:487
|
||||
#: core\app.py:471
|
||||
msgid "Select a directory to move marked files to"
|
||||
msgstr "Wybierz katalog, do którego chcesz przenieść zaznaczone pliki"
|
||||
|
||||
#: core\app.py:527
|
||||
#: core\app.py:510
|
||||
msgid "Select a destination for your exported CSV"
|
||||
msgstr "Wybierz miejsce docelowe dla eksportowanego pliku CSV"
|
||||
|
||||
#: core\app.py:534 core\app.py:801 core\app.py:811
|
||||
#: core\app.py:516 core\app.py:771 core\app.py:781
|
||||
msgid "Couldn't write to file: {}"
|
||||
msgstr "Nie udało się zapisać do pliku: {}"
|
||||
|
||||
#: core\app.py:559
|
||||
#: core\app.py:539
|
||||
msgid "You have no custom command set up. Set it up in your preferences."
|
||||
msgstr ""
|
||||
"Nie masz skonfigurowanego polecenia niestandardowego. Ustaw to w swoich "
|
||||
"preferencjach."
|
||||
|
||||
#: core\app.py:727 core\app.py:740
|
||||
#: core\app.py:695 core\app.py:707
|
||||
msgid "You are about to remove %d files from results. Continue?"
|
||||
msgstr "Zamierzasz usunąć %d plików z wyników. Kontyntynuj?"
|
||||
|
||||
#: core\app.py:774
|
||||
#: core\app.py:743
|
||||
msgid "{} duplicate groups were changed by the re-prioritization."
|
||||
msgstr "{} zduplikowanych grup zmieniono przez ponowne ustalenie priorytetów."
|
||||
|
||||
#: core\app.py:821
|
||||
#: core\app.py:790
|
||||
msgid "The selected directories contain no scannable file."
|
||||
msgstr "Wybrane katalogi nie zawierają plik skanowalną."
|
||||
|
||||
#: core\app.py:835
|
||||
#: core\app.py:803
|
||||
msgid "Collecting files to scan"
|
||||
msgstr "Zbieranie plików do skanowania"
|
||||
|
||||
#: core\app.py:891
|
||||
#: core\app.py:850
|
||||
msgid "%s (%d discarded)"
|
||||
msgstr "%s(%d odrzucone)"
|
||||
|
||||
#: core\engine.py:244 core\engine.py:288
|
||||
msgid "0 matches found"
|
||||
msgstr "Znaleziono 0 pasujących wyników"
|
||||
#: core\directories.py:191
|
||||
msgid "Collected {} files to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\engine.py:262 core\engine.py:296
|
||||
msgid "%d matches found"
|
||||
msgstr "Znaleziono %d pasujących wyników"
|
||||
#: core\directories.py:207
|
||||
msgid "Collected {} folders to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\gui\deletion_options.py:73
|
||||
#: core\engine.py:27
|
||||
msgid "%d matches found from %d groups"
|
||||
msgstr ""
|
||||
|
||||
#: core\gui\deletion_options.py:71
|
||||
msgid "You are sending {} file(s) to the Trash."
|
||||
msgstr "Wysyłasz {} plików do Kosza"
|
||||
|
||||
#: core\gui\exclude_list_table.py:15
|
||||
#: core\gui\exclude_list_table.py:14
|
||||
msgid "Regular Expressions"
|
||||
msgstr "Wyrażenia regularne"
|
||||
|
||||
@@ -178,15 +186,15 @@ msgstr "Treść"
|
||||
msgid "Analyzed %d/%d pictures"
|
||||
msgstr "Analizowane %d/%d zdjęć"
|
||||
|
||||
#: core\pe\matchblock.py:181
|
||||
#: core\pe\matchblock.py:177
|
||||
msgid "Performed %d/%d chunk matches"
|
||||
msgstr "Wykonano %d/%d dopasowań fragmentów"
|
||||
|
||||
#: core\pe\matchblock.py:191
|
||||
#: core\pe\matchblock.py:185
|
||||
msgid "Preparing for matching"
|
||||
msgstr "Przygotowanie do dopasowania"
|
||||
|
||||
#: core\pe\matchblock.py:244
|
||||
#: core\pe\matchblock.py:234
|
||||
msgid "Verified %d/%d matches"
|
||||
msgstr "Zweryfikowane %d/%d meczów"
|
||||
|
||||
@@ -234,23 +242,23 @@ msgstr "Najnowsza"
|
||||
msgid "Oldest"
|
||||
msgstr "Najstarszy"
|
||||
|
||||
#: core\results.py:142
|
||||
#: core\results.py:134
|
||||
msgid "%d / %d (%s / %s) duplicates marked."
|
||||
msgstr "%d / %d (%s / %s) duplikaty oznakowane."
|
||||
|
||||
#: core\results.py:149
|
||||
#: core\results.py:141
|
||||
msgid " filter: %s"
|
||||
msgstr " filtr: %s"
|
||||
|
||||
#: core\scanner.py:85
|
||||
#: core\scanner.py:90
|
||||
msgid "Read size of %d/%d files"
|
||||
msgstr "Odczytaj rozmiar %d/%d plików"
|
||||
|
||||
#: core\scanner.py:109
|
||||
#: core\scanner.py:116
|
||||
msgid "Read metadata of %d/%d files"
|
||||
msgstr "Przeczytaj metadane %d/%d plików"
|
||||
|
||||
#: core\scanner.py:147
|
||||
#: core\scanner.py:154
|
||||
msgid "Almost done! Fiddling with results..."
|
||||
msgstr "Prawie skończone! Porządkowanie wyników..."
|
||||
|
||||
|
||||
@@ -943,3 +943,43 @@ msgstr "Generał"
|
||||
#: qt\preferences_dialog.py:286
|
||||
msgid "Display"
|
||||
msgstr "Pokaz"
|
||||
|
||||
#: qt\se\preferences_dialog.py:70
|
||||
msgid "Partially hash files bigger than"
|
||||
msgstr ""
|
||||
|
||||
#: qt\se\preferences_dialog.py:80
|
||||
msgid "MB"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:163
|
||||
msgid "Use native OS dialogs"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:166
|
||||
msgid ""
|
||||
"For actions such as file/folder selection use the OS native dialogs.\n"
|
||||
"Some native dialogs have limited functionality."
|
||||
msgstr ""
|
||||
|
||||
#: qt\se\preferences_dialog.py:68
|
||||
msgid "Ignore files larger than"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:135 qt\app.py:293
|
||||
msgid "Clear Cache"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:294
|
||||
msgid ""
|
||||
"Do you really want to clear the cache? This will remove all cached file "
|
||||
"hashes and picture analysis."
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:299
|
||||
msgid "Cache cleared."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:173
|
||||
msgid "Use dark style"
|
||||
msgstr ""
|
||||
|
||||
@@ -47,7 +47,7 @@ msgstr "Copiando"
|
||||
msgid "Sending to Trash"
|
||||
msgstr "Movendo para o Lixo"
|
||||
|
||||
#: core\app.py:308
|
||||
#: core\app.py:289
|
||||
msgid ""
|
||||
"A previous action is still hanging in there. You can't start a new one yet. "
|
||||
"Wait a few seconds, then try again."
|
||||
@@ -55,94 +55,102 @@ msgstr ""
|
||||
"Ainda há uma ação em andamento. Não é possível iniciar outra agora. Espere "
|
||||
"alguns segundos e tente novamente."
|
||||
|
||||
#: core\app.py:318
|
||||
#: core\app.py:300
|
||||
msgid "No duplicates found."
|
||||
msgstr "Nenhuma duplicata encontrada."
|
||||
|
||||
#: core\app.py:333
|
||||
#: core\app.py:315
|
||||
msgid "All marked files were copied successfully."
|
||||
msgstr "Todos os arquivos marcados foram copiados corretamente."
|
||||
|
||||
#: core\app.py:334
|
||||
#: core\app.py:317
|
||||
msgid "All marked files were moved successfully."
|
||||
msgstr "Todos os arquivos marcados foram relocados corretamente."
|
||||
|
||||
#: core\app.py:335
|
||||
#: core\app.py:319
|
||||
msgid "All marked files were deleted successfully."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:321
|
||||
msgid "All marked files were successfully sent to Trash."
|
||||
msgstr "Todos os arquivos marcados foram movidos para o Lixo corretamente."
|
||||
|
||||
#: core\app.py:343
|
||||
#: core\app.py:326
|
||||
msgid "Could not load file: {}"
|
||||
msgstr "Não foi possível carregar o arquivo: {}"
|
||||
|
||||
#: core\app.py:399
|
||||
#: core\app.py:382
|
||||
msgid "'{}' already is in the list."
|
||||
msgstr "‘{}’ já está na lista."
|
||||
|
||||
#: core\app.py:401
|
||||
#: core\app.py:384
|
||||
msgid "'{}' does not exist."
|
||||
msgstr "‘{}’ não existe."
|
||||
|
||||
#: core\app.py:410
|
||||
#: core\app.py:392
|
||||
msgid ""
|
||||
"All selected %d matches are going to be ignored in all subsequent scans. "
|
||||
"Continue?"
|
||||
msgstr "Excluir %d duplicata(s) selecionada(s) de escaneamentos posteriores?"
|
||||
|
||||
#: core\app.py:486
|
||||
#: core\app.py:469
|
||||
msgid "Select a directory to copy marked files to"
|
||||
msgstr "Selecione um diretório onde deseja copiar os arquivos marcados"
|
||||
|
||||
#: core\app.py:487
|
||||
#: core\app.py:471
|
||||
msgid "Select a directory to move marked files to"
|
||||
msgstr "Selecione um diretório para onde deseja mover os arquivos marcados"
|
||||
|
||||
#: core\app.py:527
|
||||
#: core\app.py:510
|
||||
msgid "Select a destination for your exported CSV"
|
||||
msgstr "Selecione uma pasta para o CSV exportado"
|
||||
|
||||
#: core\app.py:534 core\app.py:801 core\app.py:811
|
||||
#: core\app.py:516 core\app.py:771 core\app.py:781
|
||||
msgid "Couldn't write to file: {}"
|
||||
msgstr "Não foi possível gravar no arquivo: {}"
|
||||
|
||||
#: core\app.py:559
|
||||
#: core\app.py:539
|
||||
msgid "You have no custom command set up. Set it up in your preferences."
|
||||
msgstr ""
|
||||
"Você não possui nenhum comando personalizado. Crie um nas preferências."
|
||||
|
||||
#: core\app.py:727 core\app.py:740
|
||||
#: core\app.py:695 core\app.py:707
|
||||
msgid "You are about to remove %d files from results. Continue?"
|
||||
msgstr "Remover %d arquivo(s) dos resultados?"
|
||||
|
||||
#: core\app.py:774
|
||||
#: core\app.py:743
|
||||
msgid "{} duplicate groups were changed by the re-prioritization."
|
||||
msgstr "{} grupos de duplicatas alterados ao repriorizar."
|
||||
|
||||
#: core\app.py:821
|
||||
#: core\app.py:790
|
||||
msgid "The selected directories contain no scannable file."
|
||||
msgstr "As pastas selecionadas não contém arquivos escaneáveis."
|
||||
|
||||
#: core\app.py:835
|
||||
#: core\app.py:803
|
||||
msgid "Collecting files to scan"
|
||||
msgstr "Juntando arquivos para escanear"
|
||||
|
||||
#: core\app.py:891
|
||||
#: core\app.py:850
|
||||
msgid "%s (%d discarded)"
|
||||
msgstr "%s (%d rejeitado(s))"
|
||||
|
||||
#: core\engine.py:244 core\engine.py:288
|
||||
msgid "0 matches found"
|
||||
msgstr "0 resultados encontrados"
|
||||
#: core\directories.py:191
|
||||
msgid "Collected {} files to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\engine.py:262 core\engine.py:296
|
||||
msgid "%d matches found"
|
||||
msgstr "%d resultados encontrados"
|
||||
#: core\directories.py:207
|
||||
msgid "Collected {} folders to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\gui\deletion_options.py:73
|
||||
#: core\engine.py:27
|
||||
msgid "%d matches found from %d groups"
|
||||
msgstr ""
|
||||
|
||||
#: core\gui\deletion_options.py:71
|
||||
msgid "You are sending {} file(s) to the Trash."
|
||||
msgstr "Você está movendo {} arquivo(s) para o Lixo."
|
||||
|
||||
#: core\gui\exclude_list_table.py:15
|
||||
#: core\gui\exclude_list_table.py:14
|
||||
msgid "Regular Expressions"
|
||||
msgstr "Expressões regulares"
|
||||
|
||||
@@ -174,15 +182,15 @@ msgstr "Conteúdo"
|
||||
msgid "Analyzed %d/%d pictures"
|
||||
msgstr "%d/%d fotos analizadas"
|
||||
|
||||
#: core\pe\matchblock.py:181
|
||||
#: core\pe\matchblock.py:177
|
||||
msgid "Performed %d/%d chunk matches"
|
||||
msgstr "%d/%d resultados em blocos executados"
|
||||
|
||||
#: core\pe\matchblock.py:191
|
||||
#: core\pe\matchblock.py:185
|
||||
msgid "Preparing for matching"
|
||||
msgstr "Preparando para comparação"
|
||||
|
||||
#: core\pe\matchblock.py:244
|
||||
#: core\pe\matchblock.py:234
|
||||
msgid "Verified %d/%d matches"
|
||||
msgstr "%d/%d resultados verificados"
|
||||
|
||||
@@ -230,23 +238,23 @@ msgstr "Mais recente"
|
||||
msgid "Oldest"
|
||||
msgstr "Mais antigo"
|
||||
|
||||
#: core\results.py:142
|
||||
#: core\results.py:134
|
||||
msgid "%d / %d (%s / %s) duplicates marked."
|
||||
msgstr "%d / %d (%s / %s) duplicatas marcadas."
|
||||
|
||||
#: core\results.py:149
|
||||
#: core\results.py:141
|
||||
msgid " filter: %s"
|
||||
msgstr " filtro: %s"
|
||||
|
||||
#: core\scanner.py:85
|
||||
#: core\scanner.py:90
|
||||
msgid "Read size of %d/%d files"
|
||||
msgstr "Tamanho lido em %d/%d arquivos"
|
||||
|
||||
#: core\scanner.py:109
|
||||
#: core\scanner.py:116
|
||||
msgid "Read metadata of %d/%d files"
|
||||
msgstr "Metadados lidos em %d/%d arquivos"
|
||||
|
||||
#: core\scanner.py:147
|
||||
#: core\scanner.py:154
|
||||
msgid "Almost done! Fiddling with results..."
|
||||
msgstr "Quase pronto! Mexendo nos resultados ..."
|
||||
|
||||
|
||||
@@ -943,3 +943,43 @@ msgstr "Geral"
|
||||
#: qt\preferences_dialog.py:286
|
||||
msgid "Display"
|
||||
msgstr "Exibição"
|
||||
|
||||
#: qt\se\preferences_dialog.py:70
|
||||
msgid "Partially hash files bigger than"
|
||||
msgstr ""
|
||||
|
||||
#: qt\se\preferences_dialog.py:80
|
||||
msgid "MB"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:163
|
||||
msgid "Use native OS dialogs"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:166
|
||||
msgid ""
|
||||
"For actions such as file/folder selection use the OS native dialogs.\n"
|
||||
"Some native dialogs have limited functionality."
|
||||
msgstr ""
|
||||
|
||||
#: qt\se\preferences_dialog.py:68
|
||||
msgid "Ignore files larger than"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:135 qt\app.py:293
|
||||
msgid "Clear Cache"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:294
|
||||
msgid ""
|
||||
"Do you really want to clear the cache? This will remove all cached file "
|
||||
"hashes and picture analysis."
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:299
|
||||
msgid "Cache cleared."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:173
|
||||
msgid "Use dark style"
|
||||
msgstr ""
|
||||
|
||||
@@ -48,7 +48,7 @@ msgstr "Копирование"
|
||||
msgid "Sending to Trash"
|
||||
msgstr "Перемещение в Корзину"
|
||||
|
||||
#: core\app.py:308
|
||||
#: core\app.py:289
|
||||
msgid ""
|
||||
"A previous action is still hanging in there. You can't start a new one yet. "
|
||||
"Wait a few seconds, then try again."
|
||||
@@ -56,35 +56,39 @@ msgstr ""
|
||||
"Предыдущее действие до сих пор выполняется. Вы не можете начать новое. "
|
||||
"Подождите несколько секунд, затем повторите попытку."
|
||||
|
||||
#: core\app.py:318
|
||||
#: core\app.py:300
|
||||
msgid "No duplicates found."
|
||||
msgstr "Дубликаты не найдены."
|
||||
|
||||
#: core\app.py:333
|
||||
#: core\app.py:315
|
||||
msgid "All marked files were copied successfully."
|
||||
msgstr "Все отмеченные файлы были скопированы успешно."
|
||||
|
||||
#: core\app.py:334
|
||||
#: core\app.py:317
|
||||
msgid "All marked files were moved successfully."
|
||||
msgstr "Все отмеченные файлы были перемещены успешно."
|
||||
|
||||
#: core\app.py:335
|
||||
#: core\app.py:319
|
||||
msgid "All marked files were deleted successfully."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:321
|
||||
msgid "All marked files were successfully sent to Trash."
|
||||
msgstr "Все отмеченные файлы были успешно отправлены в Корзину."
|
||||
|
||||
#: core\app.py:343
|
||||
#: core\app.py:326
|
||||
msgid "Could not load file: {}"
|
||||
msgstr "Не удалось загрузить файл: {}"
|
||||
|
||||
#: core\app.py:399
|
||||
#: core\app.py:382
|
||||
msgid "'{}' already is in the list."
|
||||
msgstr "'{}' уже присутствует в списке."
|
||||
|
||||
#: core\app.py:401
|
||||
#: core\app.py:384
|
||||
msgid "'{}' does not exist."
|
||||
msgstr "'{}' не существует."
|
||||
|
||||
#: core\app.py:410
|
||||
#: core\app.py:392
|
||||
msgid ""
|
||||
"All selected %d matches are going to be ignored in all subsequent scans. "
|
||||
"Continue?"
|
||||
@@ -92,59 +96,63 @@ msgstr ""
|
||||
"Все выбранные %d совпадений будут игнорироваться при всех последующих "
|
||||
"проверках. Продолжить?"
|
||||
|
||||
#: core\app.py:486
|
||||
#: core\app.py:469
|
||||
msgid "Select a directory to copy marked files to"
|
||||
msgstr "Выберите каталог, в который вы хотите скопировать отмеченные файлы"
|
||||
|
||||
#: core\app.py:487
|
||||
#: core\app.py:471
|
||||
msgid "Select a directory to move marked files to"
|
||||
msgstr "Выберите каталог, в который вы хотите переместить отмеченные файлы"
|
||||
|
||||
#: core\app.py:527
|
||||
#: core\app.py:510
|
||||
msgid "Select a destination for your exported CSV"
|
||||
msgstr "Выберите назначение для экспортируемого "
|
||||
|
||||
#: core\app.py:534 core\app.py:801 core\app.py:811
|
||||
#: core\app.py:516 core\app.py:771 core\app.py:781
|
||||
msgid "Couldn't write to file: {}"
|
||||
msgstr "Не удалось записать в файл: {}"
|
||||
|
||||
#: core\app.py:559
|
||||
#: core\app.py:539
|
||||
msgid "You have no custom command set up. Set it up in your preferences."
|
||||
msgstr "Вы не создали пользовательскую команду. Задайте её в настройках."
|
||||
|
||||
#: core\app.py:727 core\app.py:740
|
||||
#: core\app.py:695 core\app.py:707
|
||||
msgid "You are about to remove %d files from results. Continue?"
|
||||
msgstr "Вы собираетесь удалить %d файлов из результата поиска. Продолжить?"
|
||||
|
||||
#: core\app.py:774
|
||||
#: core\app.py:743
|
||||
msgid "{} duplicate groups were changed by the re-prioritization."
|
||||
msgstr "{} групп дубликатов было изменено при реприоритезации."
|
||||
|
||||
#: core\app.py:821
|
||||
#: core\app.py:790
|
||||
msgid "The selected directories contain no scannable file."
|
||||
msgstr "Выбранные каталоги не содержат файлов для сканирования."
|
||||
|
||||
#: core\app.py:835
|
||||
#: core\app.py:803
|
||||
msgid "Collecting files to scan"
|
||||
msgstr "Сбор файлов для сканирования"
|
||||
|
||||
#: core\app.py:891
|
||||
#: core\app.py:850
|
||||
msgid "%s (%d discarded)"
|
||||
msgstr "%s. (%d отменено)"
|
||||
|
||||
#: core\engine.py:244 core\engine.py:288
|
||||
msgid "0 matches found"
|
||||
msgstr "0 совпадений найдено"
|
||||
#: core\directories.py:191
|
||||
msgid "Collected {} files to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\engine.py:262 core\engine.py:296
|
||||
msgid "%d matches found"
|
||||
msgstr "%d совпадений найдено"
|
||||
#: core\directories.py:207
|
||||
msgid "Collected {} folders to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\gui\deletion_options.py:73
|
||||
#: core\engine.py:27
|
||||
msgid "%d matches found from %d groups"
|
||||
msgstr ""
|
||||
|
||||
#: core\gui\deletion_options.py:71
|
||||
msgid "You are sending {} file(s) to the Trash."
|
||||
msgstr "Вы перемещаете {} файлов в Корзину."
|
||||
|
||||
#: core\gui\exclude_list_table.py:15
|
||||
#: core\gui\exclude_list_table.py:14
|
||||
msgid "Regular Expressions"
|
||||
msgstr "Обычные выражения"
|
||||
|
||||
@@ -177,15 +185,15 @@ msgstr "Содержание"
|
||||
msgid "Analyzed %d/%d pictures"
|
||||
msgstr "Анализируется %d/%d изображений"
|
||||
|
||||
#: core\pe\matchblock.py:181
|
||||
#: core\pe\matchblock.py:177
|
||||
msgid "Performed %d/%d chunk matches"
|
||||
msgstr "Выполнено %d/%d совпадений блоков"
|
||||
|
||||
#: core\pe\matchblock.py:191
|
||||
#: core\pe\matchblock.py:185
|
||||
msgid "Preparing for matching"
|
||||
msgstr "Подготовка для сравнения"
|
||||
|
||||
#: core\pe\matchblock.py:244
|
||||
#: core\pe\matchblock.py:234
|
||||
msgid "Verified %d/%d matches"
|
||||
msgstr "Проверено %d/%d совпадений"
|
||||
|
||||
@@ -233,23 +241,23 @@ msgstr "Новейший"
|
||||
msgid "Oldest"
|
||||
msgstr "Старейшие"
|
||||
|
||||
#: core\results.py:142
|
||||
#: core\results.py:134
|
||||
msgid "%d / %d (%s / %s) duplicates marked."
|
||||
msgstr "%d / %d (%s / %s) дубликатов отмечено."
|
||||
|
||||
#: core\results.py:149
|
||||
#: core\results.py:141
|
||||
msgid " filter: %s"
|
||||
msgstr "фильтр: %s"
|
||||
|
||||
#: core\scanner.py:85
|
||||
#: core\scanner.py:90
|
||||
msgid "Read size of %d/%d files"
|
||||
msgstr "Подсчитан размер %d/%d файлов"
|
||||
|
||||
#: core\scanner.py:109
|
||||
#: core\scanner.py:116
|
||||
msgid "Read metadata of %d/%d files"
|
||||
msgstr "Прочитаны метаданные %d/%d файлов"
|
||||
|
||||
#: core\scanner.py:147
|
||||
#: core\scanner.py:154
|
||||
msgid "Almost done! Fiddling with results..."
|
||||
msgstr "Почти готово! Возиться с результатами..."
|
||||
|
||||
|
||||
@@ -943,3 +943,43 @@ msgstr "Общий"
|
||||
#: qt\preferences_dialog.py:286
|
||||
msgid "Display"
|
||||
msgstr "Отображать"
|
||||
|
||||
#: qt\se\preferences_dialog.py:70
|
||||
msgid "Partially hash files bigger than"
|
||||
msgstr ""
|
||||
|
||||
#: qt\se\preferences_dialog.py:80
|
||||
msgid "MB"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:163
|
||||
msgid "Use native OS dialogs"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:166
|
||||
msgid ""
|
||||
"For actions such as file/folder selection use the OS native dialogs.\n"
|
||||
"Some native dialogs have limited functionality."
|
||||
msgstr ""
|
||||
|
||||
#: qt\se\preferences_dialog.py:68
|
||||
msgid "Ignore files larger than"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:135 qt\app.py:293
|
||||
msgid "Clear Cache"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:294
|
||||
msgid ""
|
||||
"Do you really want to clear the cache? This will remove all cached file "
|
||||
"hashes and picture analysis."
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:299
|
||||
msgid "Cache cleared."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:173
|
||||
msgid "Use dark style"
|
||||
msgstr ""
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
# Translators:
|
||||
# Ahmet Haydar Işık <itsahmthydr@gmail.com>, 2021
|
||||
# Emin Tufan Çetin <etcetin@gmail.com>, 2021
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Ahmet Haydar Işık <itsahmthydr@gmail.com>, 2021\n"
|
||||
"Last-Translator: Emin Tufan Çetin <etcetin@gmail.com>, 2021\n"
|
||||
"Language-Team: Turkish (https://www.transifex.com/voltaicideas/teams/116153/tr/)\n"
|
||||
"Language: tr\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -13,11 +14,11 @@ msgstr ""
|
||||
#: core\gui\ignore_list_table.py:19 core\gui\ignore_list_table.py:20
|
||||
#: core\gui\problem_table.py:18
|
||||
msgid "File Path"
|
||||
msgstr "Dosya Yolu"
|
||||
msgstr "Dosya Konumu"
|
||||
|
||||
#: core\gui\problem_table.py:19
|
||||
msgid "Error Message"
|
||||
msgstr "Hata Mesajı"
|
||||
msgstr "Hata İletisi"
|
||||
|
||||
#: core\me\prioritize.py:23
|
||||
msgid "Duration"
|
||||
@@ -25,21 +26,21 @@ msgstr "Süre"
|
||||
|
||||
#: core\me\prioritize.py:30 core\me\result_table.py:23
|
||||
msgid "Bitrate"
|
||||
msgstr "Bit hızı"
|
||||
msgstr "Bit Oranı"
|
||||
|
||||
#: core\me\prioritize.py:37
|
||||
msgid "Samplerate"
|
||||
msgstr "Örnekleme hızı"
|
||||
msgstr "Örnek Hızı"
|
||||
|
||||
#: core\me\result_table.py:19 core\pe\result_table.py:19 core\prioritize.py:92
|
||||
#: core\se\result_table.py:19
|
||||
msgid "Filename"
|
||||
msgstr "Dosya adı"
|
||||
msgstr "Dosya Adı"
|
||||
|
||||
#: core\me\result_table.py:20 core\pe\result_table.py:20 core\prioritize.py:75
|
||||
#: core\se\result_table.py:20
|
||||
msgid "Folder"
|
||||
msgstr "Dizin"
|
||||
msgstr "Klasör"
|
||||
|
||||
#: core\me\result_table.py:21
|
||||
msgid "Size (MB)"
|
||||
@@ -51,7 +52,7 @@ msgstr "Zaman"
|
||||
|
||||
#: core\me\result_table.py:24
|
||||
msgid "Sample Rate"
|
||||
msgstr "Örnekleme Hızı"
|
||||
msgstr "Örnek Hızı"
|
||||
|
||||
#: core\me\result_table.py:25 core\pe\result_table.py:22 core\prioritize.py:65
|
||||
#: core\se\result_table.py:22
|
||||
@@ -61,7 +62,7 @@ msgstr "Tür"
|
||||
#: core\me\result_table.py:26 core\pe\result_table.py:25
|
||||
#: core\prioritize.py:163 core\se\result_table.py:23
|
||||
msgid "Modification"
|
||||
msgstr "Düzenleme"
|
||||
msgstr "Değişiklik"
|
||||
|
||||
#: core\me\result_table.py:27
|
||||
msgid "Title"
|
||||
@@ -77,7 +78,7 @@ msgstr "Albüm"
|
||||
|
||||
#: core\me\result_table.py:30
|
||||
msgid "Genre"
|
||||
msgstr "Tarz"
|
||||
msgstr "Tür"
|
||||
|
||||
#: core\me\result_table.py:31
|
||||
msgid "Year"
|
||||
@@ -94,11 +95,11 @@ msgstr "Yorum"
|
||||
#: core\me\result_table.py:34 core\pe\result_table.py:26
|
||||
#: core\se\result_table.py:24
|
||||
msgid "Match %"
|
||||
msgstr "Eşleşme oranı %"
|
||||
msgstr "Eşleşme %"
|
||||
|
||||
#: core\me\result_table.py:35 core\se\result_table.py:25
|
||||
msgid "Words Used"
|
||||
msgstr "Kullanılan Kelimeler"
|
||||
msgstr "Kullanılan Sözcükler"
|
||||
|
||||
#: core\me\result_table.py:36 core\pe\result_table.py:27
|
||||
#: core\se\result_table.py:26
|
||||
@@ -107,7 +108,7 @@ msgstr "Kopya Sayısı"
|
||||
|
||||
#: core\pe\prioritize.py:23 core\pe\result_table.py:23
|
||||
msgid "Dimensions"
|
||||
msgstr "Boyutlar"
|
||||
msgstr "Ölçüler"
|
||||
|
||||
#: core\pe\result_table.py:21 core\se\result_table.py:21
|
||||
msgid "Size (KB)"
|
||||
@@ -115,7 +116,7 @@ msgstr "Boyut (KB)"
|
||||
|
||||
#: core\pe\result_table.py:24
|
||||
msgid "EXIF Timestamp"
|
||||
msgstr "EXIF Zaman damgası"
|
||||
msgstr "EXIF Zaman Damgası"
|
||||
|
||||
#: core\prioritize.py:156
|
||||
msgid "Size"
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
# Translators:
|
||||
# Ahmet Haydar Işık <itsahmthydr@gmail.com>, 2021
|
||||
# Emin Tufan Çetin <etcetin@gmail.com>, 2021
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Ahmet Haydar Işık <itsahmthydr@gmail.com>, 2021\n"
|
||||
"Last-Translator: Emin Tufan Çetin <etcetin@gmail.com>, 2021\n"
|
||||
"Language-Team: Turkish (https://www.transifex.com/voltaicideas/teams/116153/tr/)\n"
|
||||
"Language: tr\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -12,24 +13,23 @@ msgstr ""
|
||||
|
||||
#: core\app.py:42
|
||||
msgid "There are no marked duplicates. Nothing has been done."
|
||||
msgstr "İşaretlenmiş kopya yok. Hiçbir işlem yapılmadı."
|
||||
msgstr "İmlenen kopya yok. İşlem yapılmadı."
|
||||
|
||||
#: core\app.py:43
|
||||
msgid "There are no selected duplicates. Nothing has been done."
|
||||
msgstr "Seçilmiş kopya yok. Hiçbir işlem yapılmadı."
|
||||
msgstr "Seçilen kopya yok. İşlem yapılmadı."
|
||||
|
||||
#: core\app.py:44
|
||||
msgid ""
|
||||
"You're about to open many files at once. Depending on what those files are "
|
||||
"opened with, doing so can create quite a mess. Continue?"
|
||||
msgstr ""
|
||||
"Aynı anda birçok dosyayı açmak üzeresiniz. Bu dosyaların neyle açıldığına "
|
||||
"bağlı olarak, bunu yapmak büyük karışıklık yaratabilir. Yine de devam "
|
||||
"edilsin mi?"
|
||||
"Birden çok dosyayı aynı anda açmaya çalışıyorsunuz. Dosyaların açıldığı "
|
||||
"programlara bağlı olarak, bu sorun yaratabilir. Sürdürülsün mü?"
|
||||
|
||||
#: core\app.py:71
|
||||
msgid "Scanning for duplicates"
|
||||
msgstr "Kopyalar için taranıyor"
|
||||
msgstr "Kopyalar aranıyor"
|
||||
|
||||
#: core\app.py:72
|
||||
msgid "Loading"
|
||||
@@ -45,113 +45,119 @@ msgstr "Kopyalanıyor"
|
||||
|
||||
#: core\app.py:75
|
||||
msgid "Sending to Trash"
|
||||
msgstr "Geri Dönüşüm Kutusuna gönderiliyor"
|
||||
msgstr "Çöpe Gönderiliyor"
|
||||
|
||||
#: core\app.py:308
|
||||
#: core\app.py:289
|
||||
msgid ""
|
||||
"A previous action is still hanging in there. You can't start a new one yet. "
|
||||
"Wait a few seconds, then try again."
|
||||
msgstr ""
|
||||
"Önceki eylem hala tamamlanmadı. Henüz yeni bir eylem başlatamazsınız. Birkaç"
|
||||
" saniye bekleyin, ardından tekrar deneyin."
|
||||
"Önceki işlem hala sürüyor. Yenisini başlatamazsınız. Birkaç saniye bekleyip "
|
||||
"yeniden deneyin."
|
||||
|
||||
#: core\app.py:318
|
||||
#: core\app.py:300
|
||||
msgid "No duplicates found."
|
||||
msgstr "Hiç kopya bulunamadı."
|
||||
msgstr "Kopya bulunamadı."
|
||||
|
||||
#: core\app.py:333
|
||||
#: core\app.py:315
|
||||
msgid "All marked files were copied successfully."
|
||||
msgstr "İşaretlenmiş tüm dosyalar başarıyla kopyalandı."
|
||||
msgstr "İmlenen tüm dosyalar başarıyla kopyalandı."
|
||||
|
||||
#: core\app.py:334
|
||||
#: core\app.py:317
|
||||
msgid "All marked files were moved successfully."
|
||||
msgstr "İşaretlenmiş tüm dosyalar başarıyla taşındı."
|
||||
msgstr "İmlenen tüm dosyalar başarıyla taşındı."
|
||||
|
||||
#: core\app.py:335
|
||||
#: core\app.py:319
|
||||
msgid "All marked files were deleted successfully."
|
||||
msgstr "İmlenen tüm dosyalar başarıyla silindi."
|
||||
|
||||
#: core\app.py:321
|
||||
msgid "All marked files were successfully sent to Trash."
|
||||
msgstr "İşaretlenmiş tüm dosyalar başarıyla Geri Dönüşüm Kutusuna gönderildi."
|
||||
msgstr "İmlenen tüm dosyalar başarıyla çöpe gönderildi."
|
||||
|
||||
#: core\app.py:343
|
||||
#: core\app.py:326
|
||||
msgid "Could not load file: {}"
|
||||
msgstr "Dosya yüklenemedi: {}"
|
||||
|
||||
#: core\app.py:399
|
||||
#: core\app.py:382
|
||||
msgid "'{}' already is in the list."
|
||||
msgstr "'{}' zaten listede."
|
||||
msgstr "'{}' çoktan listede."
|
||||
|
||||
#: core\app.py:401
|
||||
#: core\app.py:384
|
||||
msgid "'{}' does not exist."
|
||||
msgstr "'{}' mevcut değil."
|
||||
msgstr "'{}' bulunamadı."
|
||||
|
||||
#: core\app.py:410
|
||||
#: core\app.py:392
|
||||
msgid ""
|
||||
"All selected %d matches are going to be ignored in all subsequent scans. "
|
||||
"Continue?"
|
||||
msgstr ""
|
||||
"Tüm seçili %deşleşmeleri sonraki taramalarda yok sayılacaktır. Devam edilsin"
|
||||
" mi?"
|
||||
"Seçilen %d eşleşmenin tümü sonraki taramalarda göz ardı edilecek. Sürdür?"
|
||||
|
||||
#: core\app.py:486
|
||||
#: core\app.py:469
|
||||
msgid "Select a directory to copy marked files to"
|
||||
msgstr "İşaretlenmiş dosyaları kopyalamak için bir dizin seçin"
|
||||
msgstr "İmlenen dosyaları kopyalamak için dizin seç"
|
||||
|
||||
#: core\app.py:487
|
||||
#: core\app.py:471
|
||||
msgid "Select a directory to move marked files to"
|
||||
msgstr "İşaretlenmiş dosyaları taşımak için bir dizin seçin"
|
||||
msgstr "İmlenen dosyaları taşımak için dizin seç"
|
||||
|
||||
#: core\app.py:527
|
||||
#: core\app.py:510
|
||||
msgid "Select a destination for your exported CSV"
|
||||
msgstr "Dışa aktarılacak CSV dosyası için bir hedef seçin"
|
||||
msgstr "Dışa aktarılan CSV'niz için hedef seçin"
|
||||
|
||||
#: core\app.py:534 core\app.py:801 core\app.py:811
|
||||
#: core\app.py:516 core\app.py:771 core\app.py:781
|
||||
msgid "Couldn't write to file: {}"
|
||||
msgstr "Dosyaya yazılamadı: {}"
|
||||
|
||||
#: core\app.py:559
|
||||
#: core\app.py:539
|
||||
msgid "You have no custom command set up. Set it up in your preferences."
|
||||
msgstr "Özel bir komut ayarınız yok. Tercihlerinizden ayarlayabilirsiniz."
|
||||
msgstr "Ayarlı özel komutunuz yok. Tercihlerinizden ayarlayınız."
|
||||
|
||||
#: core\app.py:727 core\app.py:740
|
||||
#: core\app.py:695 core\app.py:707
|
||||
msgid "You are about to remove %d files from results. Continue?"
|
||||
msgstr "Sonuçlardan%ddosyaları çıkarmak üzeresiniz. Devam edilsin mi?"
|
||||
msgstr "%d ögeyi sonuçlardan kaldırıyorsunuz. Sürdür?"
|
||||
|
||||
#: core\app.py:774
|
||||
#: core\app.py:743
|
||||
msgid "{} duplicate groups were changed by the re-prioritization."
|
||||
msgstr "{} yinelenen gruplar, yeniden önceliklendirme ile değiştirildi."
|
||||
msgstr "{} kopya küme, yeniden önceliklendirme tarafından değiştirildi."
|
||||
|
||||
#: core\app.py:821
|
||||
#: core\app.py:790
|
||||
msgid "The selected directories contain no scannable file."
|
||||
msgstr "Seçili dizinler taranabilir dosya içermiyor."
|
||||
|
||||
#: core\app.py:835
|
||||
#: core\app.py:803
|
||||
msgid "Collecting files to scan"
|
||||
msgstr "Taranacak dosyalar toplanıyor"
|
||||
|
||||
#: core\app.py:891
|
||||
#: core\app.py:850
|
||||
msgid "%s (%d discarded)"
|
||||
msgstr "%s(%d atıldı)"
|
||||
msgstr "%s (%d göz ardı edilen)"
|
||||
|
||||
#: core\engine.py:244 core\engine.py:288
|
||||
msgid "0 matches found"
|
||||
msgstr "0 eşleşme bulundu"
|
||||
#: core\directories.py:191
|
||||
msgid "Collected {} files to scan"
|
||||
msgstr "Taranacak {} dosya toplandı"
|
||||
|
||||
#: core\engine.py:262 core\engine.py:296
|
||||
msgid "%d matches found"
|
||||
msgstr "%deşleşme bulundu"
|
||||
#: core\directories.py:207
|
||||
msgid "Collected {} folders to scan"
|
||||
msgstr "Taranacak {} klasör toplandı"
|
||||
|
||||
#: core\gui\deletion_options.py:73
|
||||
#: core\engine.py:27
|
||||
msgid "%d matches found from %d groups"
|
||||
msgstr "%d eşleşme, %d kümeden"
|
||||
|
||||
#: core\gui\deletion_options.py:71
|
||||
msgid "You are sending {} file(s) to the Trash."
|
||||
msgstr "{} dosyayı/dosyaları Geri Dönüşüm Kutusuna gönderiyorsunuz."
|
||||
msgstr "{} dosyayı Çöp'e gönderiyorsunuz."
|
||||
|
||||
#: core\gui\exclude_list_table.py:15
|
||||
#: core\gui\exclude_list_table.py:14
|
||||
msgid "Regular Expressions"
|
||||
msgstr "Düzenli İfadeler"
|
||||
|
||||
#: core\gui\ignore_list_dialog.py:25
|
||||
msgid "Do you really want to remove all %d items from the ignore list?"
|
||||
msgstr ""
|
||||
"Yok sayılanlar listesinden %d öğelerin tümünü çıkarmak istediğinize emin "
|
||||
"misiniz?"
|
||||
"%d ögenin tümünü göz ardı edilenler listesinden kaldırmak istiyor musunuz?"
|
||||
|
||||
#: core\me\scanner.py:20 core\se\scanner.py:16
|
||||
msgid "Filename"
|
||||
@@ -175,23 +181,23 @@ msgstr "İçindekiler"
|
||||
|
||||
#: core\pe\matchblock.py:72
|
||||
msgid "Analyzed %d/%d pictures"
|
||||
msgstr " %d/%d resim analiz edildi."
|
||||
msgstr "%d/%d fotoğraf incelendi"
|
||||
|
||||
#: core\pe\matchblock.py:181
|
||||
#: core\pe\matchblock.py:177
|
||||
msgid "Performed %d/%d chunk matches"
|
||||
msgstr "%d/%d öbek eşleştirme gerçekleştirildi"
|
||||
msgstr "%d/%d yığın eşleşmesi gerçekleştirildi"
|
||||
|
||||
#: core\pe\matchblock.py:191
|
||||
#: core\pe\matchblock.py:185
|
||||
msgid "Preparing for matching"
|
||||
msgstr "Eşleştirmek için hazırlanılıyor"
|
||||
msgstr "Eşlemeye hazırlanıyor"
|
||||
|
||||
#: core\pe\matchblock.py:244
|
||||
#: core\pe\matchblock.py:234
|
||||
msgid "Verified %d/%d matches"
|
||||
msgstr "%d/%d eşleşmeler doğrulandı"
|
||||
msgstr "%d/%d eşleşme doğrulandı"
|
||||
|
||||
#: core\pe\matchexif.py:19
|
||||
msgid "Read EXIF of %d/%d pictures"
|
||||
msgstr "%d/%d resimlerin EXIF'i okunuyor"
|
||||
msgstr "%d/%d fotorğafın EXIF'i okundu"
|
||||
|
||||
#: core\pe\scanner.py:22
|
||||
msgid "EXIF Timestamp"
|
||||
@@ -203,11 +209,11 @@ msgstr "Hiçbiri"
|
||||
|
||||
#: core\prioritize.py:100
|
||||
msgid "Ends with number"
|
||||
msgstr "Sayıyla biter"
|
||||
msgstr "Sayıyla bitenler"
|
||||
|
||||
#: core\prioritize.py:101
|
||||
msgid "Doesn't end with number"
|
||||
msgstr "Sayıyla bitmez"
|
||||
msgstr "Sayıyla bitmeyenler"
|
||||
|
||||
#: core\prioritize.py:102
|
||||
msgid "Longest"
|
||||
@@ -233,23 +239,23 @@ msgstr "En yeni"
|
||||
msgid "Oldest"
|
||||
msgstr "En eski"
|
||||
|
||||
#: core\results.py:142
|
||||
#: core\results.py:134
|
||||
msgid "%d / %d (%s / %s) duplicates marked."
|
||||
msgstr "%d/%d(%s/%s) kopyalar işaretlendi."
|
||||
msgstr "%d / %d (%s / %s) kopya imlendi."
|
||||
|
||||
#: core\results.py:149
|
||||
#: core\results.py:141
|
||||
msgid " filter: %s"
|
||||
msgstr "filtrele: %s"
|
||||
msgstr "süz: %s"
|
||||
|
||||
#: core\scanner.py:85
|
||||
#: core\scanner.py:90
|
||||
msgid "Read size of %d/%d files"
|
||||
msgstr "%d/%d dosyaların boyutunu oku"
|
||||
msgstr "%d/%d dosyanın boyutu okundu"
|
||||
|
||||
#: core\scanner.py:109
|
||||
#: core\scanner.py:116
|
||||
msgid "Read metadata of %d/%d files"
|
||||
msgstr "%d/%d dosyaların üst verisini(metadata) oku"
|
||||
msgstr "%d/%d dosyanın üst verisi okundu"
|
||||
|
||||
#: core\scanner.py:147
|
||||
#: core\scanner.py:154
|
||||
msgid "Almost done! Fiddling with results..."
|
||||
msgstr "Neredeyse bitti! Sonuçlarla uğraşılıyor..."
|
||||
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
# Translators:
|
||||
# Ahmet Haydar Işık <itsahmthydr@gmail.com>, 2021
|
||||
# Emin Tufan Çetin <etcetin@gmail.com>, 2022
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Ahmet Haydar Işık <itsahmthydr@gmail.com>, 2021\n"
|
||||
"Last-Translator: Emin Tufan Çetin <etcetin@gmail.com>, 2022\n"
|
||||
"Language-Team: Turkish (https://www.transifex.com/voltaicideas/teams/116153/tr/)\n"
|
||||
"Language: tr\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -22,11 +23,11 @@ msgstr "Seçenekler"
|
||||
#: qt/app.py:83 qt/ignore_list_dialog.py:32
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Ignore List"
|
||||
msgstr "Yoksayılanlar Listesi"
|
||||
msgstr "Göz Ardı Edilenler Listesi"
|
||||
|
||||
#: qt/app.py:84 qt/app.py:179 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Clear Picture Cache"
|
||||
msgstr "Resim Önbelliğini Temizle"
|
||||
msgstr "Fotoğraf Önbelleğini Temizle"
|
||||
|
||||
#: qt/app.py:85 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "dupeGuru Help"
|
||||
@@ -43,16 +44,15 @@ msgstr "Hata Ayıklama Günlüğünü Aç"
|
||||
#: qt/app.py:180 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Do you really want to remove all your cached picture analysis?"
|
||||
msgstr ""
|
||||
"Önbelleğe alınmış tüm resim analizlerinizi gerçekten kaldırmak istiyor "
|
||||
"musunuz?"
|
||||
"Tüm önbelleklenen fotoğraf incelemenizi kaldırmak istediğinize emin misiniz?"
|
||||
|
||||
#: qt/app.py:184
|
||||
msgid "Picture cache cleared."
|
||||
msgstr "Resim önbelleği temizlendi."
|
||||
msgstr "Fotoğraf önbelleği temizlendi."
|
||||
|
||||
#: qt/app.py:251
|
||||
msgid "{} file (*.{})"
|
||||
msgstr "{} dosya (*.{})"
|
||||
msgstr "{} dosyası (*.{})"
|
||||
|
||||
#: qt/deletion_options.py:30 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Deletion Options"
|
||||
@@ -60,23 +60,23 @@ msgstr "Silme Seçenekleri"
|
||||
|
||||
#: qt/deletion_options.py:35 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Link deleted files"
|
||||
msgstr "Silinen dosyaları bağla"
|
||||
msgstr "Silinen dosyaları bağlantıla"
|
||||
|
||||
#: qt/deletion_options.py:37 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid ""
|
||||
"After having deleted a duplicate, place a link targeting the reference file "
|
||||
"to replace the deleted file."
|
||||
msgstr ""
|
||||
"Bir kopyayı sildikten sonra, silinen dosyayı değiştirmek için referans "
|
||||
"dosyayı hedefleyen bir bağlantı yerleştirin."
|
||||
"Kopyayı sildikten sonra, silinen dosyayının yerine kaynak dosyayı hedefleyen"
|
||||
" bağlantı yerleştir."
|
||||
|
||||
#: qt/deletion_options.py:44
|
||||
msgid "Hardlink"
|
||||
msgstr "Hard link"
|
||||
msgstr "Katı bağlantı"
|
||||
|
||||
#: qt/deletion_options.py:44
|
||||
msgid "Symlink"
|
||||
msgstr "Sembolik link"
|
||||
msgstr "Simgesel bağlantı"
|
||||
|
||||
#: qt/deletion_options.py:48
|
||||
msgid " (unsupported)"
|
||||
@@ -91,21 +91,20 @@ msgid ""
|
||||
"Instead of sending files to trash, delete them directly. This option is "
|
||||
"usually used as a workaround when the normal deletion method doesn't work."
|
||||
msgstr ""
|
||||
"Dosyaları Geri Dönüşüm Kutusuna göndermek yerine, onları doğrudan sil. Bu "
|
||||
"seçenek genellikle normal silme yöntemi çalışmadığında geçici bir çözüm "
|
||||
"olarak kullanılır."
|
||||
"Dosyaları çöpe göndermek yerine doğrudan sil. Bu seçenek, olağan silme "
|
||||
"yöntemi çalışmadığında geçici çözüm olarak kullanılır."
|
||||
|
||||
#: qt/deletion_options.py:59 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Proceed"
|
||||
msgstr "Devam Et"
|
||||
msgstr "Sürdür"
|
||||
|
||||
#: qt/deletion_options.py:60 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Cancel"
|
||||
msgstr "İptal Et"
|
||||
msgstr "İptal"
|
||||
|
||||
#: qt/details_table.py:16 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Attribute"
|
||||
msgstr "Özellik"
|
||||
msgstr "Öznitelik"
|
||||
|
||||
#: qt/details_table.py:16 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Selected"
|
||||
@@ -114,7 +113,7 @@ msgstr "Seçili"
|
||||
#: qt/details_table.py:16 qt/directories_model.py:24
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Reference"
|
||||
msgstr "Referans"
|
||||
msgstr "Kaynak"
|
||||
|
||||
#: qt/directories_dialog.py:64 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Load Results..."
|
||||
@@ -126,7 +125,7 @@ msgstr "Sonuç Penceresi"
|
||||
|
||||
#: qt/directories_dialog.py:66
|
||||
msgid "Add Folder..."
|
||||
msgstr "Dizini Ekle..."
|
||||
msgstr "Klasör Ekle..."
|
||||
|
||||
#: qt/directories_dialog.py:74 qt/result_window.py:100
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
@@ -135,7 +134,7 @@ msgstr "Dosya"
|
||||
|
||||
#: qt/directories_dialog.py:76 qt/result_window.py:108
|
||||
msgid "View"
|
||||
msgstr "Görüntüle"
|
||||
msgstr "Görünüm"
|
||||
|
||||
#: qt/directories_dialog.py:78 qt/result_window.py:110
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
@@ -148,7 +147,7 @@ msgstr "Son Sonuçları Yükle"
|
||||
|
||||
#: qt/directories_dialog.py:116 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Application Mode:"
|
||||
msgstr "Uygulama Modu:"
|
||||
msgstr "Uygulama Kipi:"
|
||||
|
||||
#: qt/directories_dialog.py:121 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Music"
|
||||
@@ -168,11 +167,11 @@ msgstr "Tarama Türü:"
|
||||
|
||||
#: qt/directories_dialog.py:135
|
||||
msgid "More Options"
|
||||
msgstr "Daha Fazla Seçenek"
|
||||
msgstr "Daha Çok Seçenek"
|
||||
|
||||
#: qt/directories_dialog.py:139 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Select folders to scan and press \"Scan\"."
|
||||
msgstr "Taranacak dizinleri seçin ve \"Tara\"ya basın."
|
||||
msgstr "Taranacak klasörleri seç ve \"Tara\"ya bas."
|
||||
|
||||
#: qt/directories_dialog.py:163 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Load Results"
|
||||
@@ -184,19 +183,19 @@ msgstr "Tara"
|
||||
|
||||
#: qt/directories_dialog.py:230
|
||||
msgid "Unsaved results"
|
||||
msgstr "Kaydedilmeyen sonuçlar"
|
||||
msgstr "Kaydedilmemiş sonuçlar"
|
||||
|
||||
#: qt/directories_dialog.py:231 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "You have unsaved results, do you really want to quit?"
|
||||
msgstr "Kaydedilmeyen sonuçlarınız var, gerçekten çıkmak istiyor musunuz?"
|
||||
msgstr "Kaydedilmemiş sonuçlarınız var, çıkmak istediğinizden emin misiniz?"
|
||||
|
||||
#: qt/directories_dialog.py:239 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Select a folder to add to the scanning list"
|
||||
msgstr "Tarama listesine eklemek için bir klasör seçin"
|
||||
msgstr "Tarama listesine eklenecek klasör seç"
|
||||
|
||||
#: qt/directories_dialog.py:266 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Select a results file to load"
|
||||
msgstr "Yüklenecek bir sonuç dosyası seçin"
|
||||
msgstr "Yüklenecek sonuç dosyası seç"
|
||||
|
||||
#: qt/directories_dialog.py:267
|
||||
msgid "All Files (*.*)"
|
||||
@@ -208,16 +207,16 @@ msgstr "dupeGuru Sonuçları (*.dupeguru)"
|
||||
|
||||
#: qt/directories_dialog.py:278
|
||||
msgid "Start a new scan"
|
||||
msgstr "Yeni bir tarama başlat"
|
||||
msgstr "Yeni tarama başlat"
|
||||
|
||||
#: qt/directories_dialog.py:279 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "You have unsaved results, do you really want to continue?"
|
||||
msgstr ""
|
||||
"Kaydedilmeyen sonuçlarınız var, gerçekten devam etmek istiyor musunuz?"
|
||||
"Kaydedilmemiş sonuçlarınız var, sürdürmek istediğinizden emin misiniz?"
|
||||
|
||||
#: qt/directories_model.py:23 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Name"
|
||||
msgstr "İsim"
|
||||
msgstr "Ad"
|
||||
|
||||
#: qt/directories_model.py:23 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "State"
|
||||
@@ -225,15 +224,15 @@ msgstr "Durum"
|
||||
|
||||
#: qt/directories_model.py:24 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Excluded"
|
||||
msgstr "Hariç Tutulan"
|
||||
msgstr "Dışlandı"
|
||||
|
||||
#: qt/directories_model.py:24 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Normal"
|
||||
msgstr "Normal"
|
||||
msgstr "Olağan"
|
||||
|
||||
#: qt/ignore_list_dialog.py:45 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Remove Selected"
|
||||
msgstr "Seçili Öğeyi Kaldır"
|
||||
msgstr "Seçileni Kaldır"
|
||||
|
||||
#: qt/ignore_list_dialog.py:46 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Clear"
|
||||
@@ -272,7 +271,7 @@ msgstr "Başlık"
|
||||
|
||||
#: qt/me/preferences_dialog.py:44 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Genre"
|
||||
msgstr "Tarz"
|
||||
msgstr "Tür"
|
||||
|
||||
#: qt/me/preferences_dialog.py:46 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Year"
|
||||
@@ -281,49 +280,49 @@ msgstr "Yıl"
|
||||
#: qt/me/preferences_dialog.py:50 qt/se/preferences_dialog.py:30
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Word weighting"
|
||||
msgstr "Kelimeleri tartma"
|
||||
msgstr "Sözcük ağırlıklandırması"
|
||||
|
||||
#: qt/me/preferences_dialog.py:52 qt/se/preferences_dialog.py:32
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Match similar words"
|
||||
msgstr "Benzer kelimeleri eşleştir"
|
||||
msgstr "Benzer sözcükleri eşle"
|
||||
|
||||
#: qt/me/preferences_dialog.py:54 qt/pe/preferences_dialog.py:21
|
||||
#: qt/se/preferences_dialog.py:34 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Can mix file kind"
|
||||
msgstr "Dosya türünü karıştırabilir"
|
||||
msgstr "Dosya türü karışık olabilir"
|
||||
|
||||
#: qt/me/preferences_dialog.py:56 qt/pe/preferences_dialog.py:23
|
||||
#: qt/se/preferences_dialog.py:36 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Use regular expressions when filtering"
|
||||
msgstr "Filtrelerken normal ifadeler kullan"
|
||||
msgstr "Süzerken düzenli ifadeler kullan"
|
||||
|
||||
#: qt/me/preferences_dialog.py:58 qt/pe/preferences_dialog.py:25
|
||||
#: qt/se/preferences_dialog.py:38 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Remove empty folders on delete or move"
|
||||
msgstr "Silme veya taşıma sırasında boş klasörleri kaldır"
|
||||
msgstr "Silme veya taşımada boş klasörleri kaldır"
|
||||
|
||||
#: qt/me/preferences_dialog.py:60 qt/pe/preferences_dialog.py:27
|
||||
#: qt/se/preferences_dialog.py:59 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Ignore duplicates hardlinking to the same file"
|
||||
msgstr "Aynı dosyaya sabit bağlantı(hardlink) yapan kopyaları yoksay"
|
||||
msgstr "Aynı dosyaya katı bağlantısı olan kopyaları göz ardı et"
|
||||
|
||||
#: qt/me/preferences_dialog.py:62 qt/pe/preferences_dialog.py:29
|
||||
#: qt/se/preferences_dialog.py:62 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Debug mode (restart required)"
|
||||
msgstr "Hata ayıklama modu (yeniden başlatma gerektirir)"
|
||||
msgstr "Hata ayıklama kipi (yeniden başlatılmalıdır)"
|
||||
|
||||
#: qt/pe/preferences_dialog.py:19 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Match pictures of different dimensions"
|
||||
msgstr "Farklı boyutlardaki resimleri eşleştir"
|
||||
msgstr "Başka boyutlardaki fotoğrafları eşle"
|
||||
|
||||
#: qt/preferences_dialog.py:43
|
||||
msgid "Filter Hardness:"
|
||||
msgstr "Filtre Sertliği:"
|
||||
msgstr "Süzme Katılığı:"
|
||||
|
||||
#: qt/preferences_dialog.py:69
|
||||
msgid "More Results"
|
||||
msgstr "Daha Fazla Sonuç"
|
||||
msgstr "Daha Çok Sonuç"
|
||||
|
||||
#: qt/preferences_dialog.py:74
|
||||
msgid "Fewer Results"
|
||||
@@ -331,7 +330,7 @@ msgstr "Daha Az Sonuç"
|
||||
|
||||
#: qt/preferences_dialog.py:81
|
||||
msgid "Font size:"
|
||||
msgstr "Yazı boyutu:"
|
||||
msgstr "Yazı tipi boyutu:"
|
||||
|
||||
#: qt/preferences_dialog.py:85
|
||||
msgid "Language:"
|
||||
@@ -343,29 +342,27 @@ msgstr "Kopyala ve Taşı:"
|
||||
|
||||
#: qt/preferences_dialog.py:94 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Right in destination"
|
||||
msgstr "Doğrudan hedef klasöre"
|
||||
msgstr "Hedefin içine"
|
||||
|
||||
#: qt/preferences_dialog.py:95 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Recreate relative path"
|
||||
msgstr "Göreli yolu yeniden oluştur"
|
||||
msgstr "Göreceli yolu yeniden yarat"
|
||||
|
||||
#: qt/preferences_dialog.py:96 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Recreate absolute path"
|
||||
msgstr "Mutlak yolu yeniden oluştur"
|
||||
msgstr "Mutlak yolu yeniden yarat"
|
||||
|
||||
#: qt/preferences_dialog.py:99
|
||||
msgid "Custom Command (arguments: %d for dupe, %r for ref):"
|
||||
msgstr "Özel Komut (argümanlar: %d kopya için, %r referans için):"
|
||||
msgstr "Özel Komut (argümanlar: dupe için %d, ref için %r):"
|
||||
|
||||
#: qt/preferences_dialog.py:174
|
||||
msgid "dupeGuru has to restart for language changes to take effect."
|
||||
msgstr ""
|
||||
"Dil değişiklerinin etkili olması için dupeGuru'nun yeniden başlatılması "
|
||||
"gerekir."
|
||||
msgstr "Dil değişimlerinin gerçekleşmesi için dupeGuru yeniden başlamalıdır."
|
||||
|
||||
#: qt/prioritize_dialog.py:75 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Re-Prioritize duplicates"
|
||||
msgstr "Kopyaları yeniden önceliklendirin"
|
||||
msgstr "Kopyaları yeniden önceliklendir"
|
||||
|
||||
#: qt/prioritize_dialog.py:79 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid ""
|
||||
@@ -373,13 +370,13 @@ msgid ""
|
||||
" the best to these criteria to their respective group's reference position. "
|
||||
"Read the help file for more information."
|
||||
msgstr ""
|
||||
"Sağdaki kutuya kriter ekleyin ve bu kriterlere en iyi uyan kopyaları ilgili "
|
||||
"grubun referans konumuna göndermek için Tamam'a tıklayın. Daha fazla bilgi "
|
||||
"için yardım dosyasını okuyun."
|
||||
"Sağ kutuya ölçüt ekle ve bu ölçütlere en iyi uyan kopyaları, kendi ilgili "
|
||||
"kümelerinin kaynak konumuna gönder. Daha çok bilgi için yardım dosyasını "
|
||||
"okuyun."
|
||||
|
||||
#: qt/problem_dialog.py:33 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Problems!"
|
||||
msgstr "Problemler!"
|
||||
msgstr "Sorunlar!"
|
||||
|
||||
#: qt/problem_dialog.py:37 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid ""
|
||||
@@ -387,13 +384,13 @@ msgid ""
|
||||
"these problems are described in the table below. Those files were not "
|
||||
"removed from your results."
|
||||
msgstr ""
|
||||
"Dosyaların bazılarını (veya tümünü) işlerken sorunlar oluştu. Bu sorunların "
|
||||
"nedeni aşağıdaki tabloda açıklanmıştır. Bu dosyalar sonuçlarınızdan "
|
||||
"kaldırılmadı."
|
||||
"Bazı (veya tüm) dosyaların işlenmesinde sorun var. Bu sorunların nedeni "
|
||||
"aşağıdaki tabloda açıklanmıştır. Bu dosyalar sonuçlarınızdan "
|
||||
"kaldırılmamıştır."
|
||||
|
||||
#: qt/problem_dialog.py:56
|
||||
msgid "Reveal Selected"
|
||||
msgstr "Seçili Öğeyi Göster"
|
||||
msgstr "Seçiliyi Göster"
|
||||
|
||||
#: qt/result_window.py:57 qt/result_window.py:104 qt/result_window.py:167
|
||||
#: qt/result_window.py:191 cocoa/en.lproj/Localizable.strings:0
|
||||
@@ -402,71 +399,71 @@ msgstr "Eylemler"
|
||||
|
||||
#: qt/result_window.py:58 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Show Dupes Only"
|
||||
msgstr "Sadece Kopyaları Göster"
|
||||
msgstr "Yalnızca Kopyaları Göster"
|
||||
|
||||
#: qt/result_window.py:59 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Show Delta Values"
|
||||
msgstr "Delta Değerlerini Göster"
|
||||
msgstr "Delta Değerleri Göster"
|
||||
|
||||
#: qt/result_window.py:60
|
||||
msgid "Send Marked to Recycle Bin..."
|
||||
msgstr "İşaretlileri Geri Dönüşüm Kutusuna Gönder..."
|
||||
msgstr "İmliyi Geri Dönüşüm Kutusuna Gönder..."
|
||||
|
||||
#: qt/result_window.py:61 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Move Marked to..."
|
||||
msgstr "İşaretlileri Şuraya Taşı..."
|
||||
msgstr "İmliyi Şuraya Taşı..."
|
||||
|
||||
#: qt/result_window.py:62 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Copy Marked to..."
|
||||
msgstr "İşaretlileri Şuraya Kopyala..."
|
||||
msgstr "İmliyi Şuraya Kopyala..."
|
||||
|
||||
#: qt/result_window.py:63 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Remove Marked from Results"
|
||||
msgstr "Sonuçlardan İşaretlileri Kaldır"
|
||||
msgstr "İmliyi Sonuçlardan Kaldır"
|
||||
|
||||
#: qt/result_window.py:64 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Re-Prioritize Results..."
|
||||
msgstr "Sonuçları yeniden önceliklendirin..."
|
||||
msgstr "Sonuçları Yeniden Önceliklendir..."
|
||||
|
||||
#: qt/result_window.py:67 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Remove Selected from Results"
|
||||
msgstr "Sonuçlardan Seçili Öğeyi Kaldır"
|
||||
msgstr "Seçiliyi Sonuçlardan Kaldır"
|
||||
|
||||
#: qt/result_window.py:71 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Add Selected to Ignore List"
|
||||
msgstr "Seçili Öğeyi Yok Sayılanlar Listesine Ekle"
|
||||
msgstr "Seçiliyi Göz Ardı Edilenler Listesine Ekle"
|
||||
|
||||
#: qt/result_window.py:75 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Make Selected into Reference"
|
||||
msgstr "Seçili Öğeyi Referans Yap"
|
||||
msgstr "İmliyi Kaynak Yap"
|
||||
|
||||
#: qt/result_window.py:77 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Open Selected with Default Application"
|
||||
msgstr "Seçili Öğeyi Varsayılan Uygulama ile Aç"
|
||||
msgstr "Seçiliyi Öntanımlı Uygulamayla Aç"
|
||||
|
||||
#: qt/result_window.py:80
|
||||
msgid "Open Containing Folder of Selected"
|
||||
msgstr "Seçili Öğenin Bulunduğu Klasörü Aç"
|
||||
msgstr "Seçiliyi İçeren Klasörü Aç"
|
||||
|
||||
#: qt/result_window.py:82 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Rename Selected"
|
||||
msgstr "Seçili Öğeyi Yeniden Adlandır"
|
||||
msgstr "Seçiliyi Yeniden Adlandır"
|
||||
|
||||
#: qt/result_window.py:83 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Mark All"
|
||||
msgstr "Tümünü İşaretle"
|
||||
msgstr "Tümünü İmle"
|
||||
|
||||
#: qt/result_window.py:84 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Mark None"
|
||||
msgstr "Hiçbirini İşaretleme"
|
||||
msgstr "Hiçbirini İmleme"
|
||||
|
||||
#: qt/result_window.py:85 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Invert Marking"
|
||||
msgstr "İşaretleri Tersine Çevir"
|
||||
msgstr "İmlemeyi Ters Çevir"
|
||||
|
||||
#: qt/result_window.py:86 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Mark Selected"
|
||||
msgstr "Seçili Öğeyi İşaretle"
|
||||
msgstr "Seçiliyi İmle"
|
||||
|
||||
#: qt/result_window.py:87
|
||||
msgid "Export To HTML"
|
||||
@@ -482,11 +479,11 @@ msgstr "Sonuçları Kaydet..."
|
||||
|
||||
#: qt/result_window.py:90 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Invoke Custom Command"
|
||||
msgstr "Özel Komutu Çağır"
|
||||
msgstr "Özel Komut Çalıştır"
|
||||
|
||||
#: qt/result_window.py:102
|
||||
msgid "Mark"
|
||||
msgstr "İşaret"
|
||||
msgstr "İmle"
|
||||
|
||||
#: qt/result_window.py:106 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Columns"
|
||||
@@ -494,27 +491,27 @@ msgstr "Sütunlar"
|
||||
|
||||
#: qt/result_window.py:163
|
||||
msgid "Reset to Defaults"
|
||||
msgstr "Varsayılanlara Dön"
|
||||
msgstr "Öntanımlılara Sıfırla"
|
||||
|
||||
#: qt/result_window.py:185
|
||||
msgid "{} Results"
|
||||
msgstr "{} Sonuçlar"
|
||||
msgstr "{} Sonuçları"
|
||||
|
||||
#: qt/result_window.py:193 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Dupes Only"
|
||||
msgstr "Sadece Kopyalar"
|
||||
msgstr "Yalnızca Kopyalar"
|
||||
|
||||
#: qt/result_window.py:194
|
||||
msgid "Delta Values"
|
||||
msgstr "Delta Değerleri"
|
||||
msgstr "Delta Değerler"
|
||||
|
||||
#: qt/result_window.py:310 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Select a file to save your results to"
|
||||
msgstr "Sonuçlarınızı kaydetmek için bir dosya seçin"
|
||||
msgstr "Sonuçlarınızın kaydedileceği dosyayı seçin"
|
||||
|
||||
#: qt/se/preferences_dialog.py:41
|
||||
msgid "Ignore files smaller than"
|
||||
msgstr "Şu boyuttan küçük dosyaları yoksay"
|
||||
msgstr "Şundan küçük dosyaları göz ardı et:"
|
||||
|
||||
#: qt/se/preferences_dialog.py:52 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "KB"
|
||||
@@ -522,7 +519,7 @@ msgstr "KB"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "%@ Results"
|
||||
msgstr "%@ Sonuçlar"
|
||||
msgstr "%@ Sonuçları"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Action"
|
||||
@@ -538,7 +535,7 @@ msgstr "Gelişmiş"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Automatically check for updates"
|
||||
msgstr "Güncellemeleri otomatik olarak kontrol et"
|
||||
msgstr "Güncellemeleri kendiliğinden denetle"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Basic"
|
||||
@@ -546,11 +543,11 @@ msgstr "Temel"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Bring All to Front"
|
||||
msgstr "Tümünü Öne Getir"
|
||||
msgstr "Tümünü Öne Çıkar"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Check for update..."
|
||||
msgstr "Güncellemeleri kontrol et..."
|
||||
msgstr "Güncellemeleri denetle..."
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Close Window"
|
||||
@@ -562,7 +559,7 @@ msgstr "Kopyala"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Custom command (arguments: %d for dupe, %r for ref):"
|
||||
msgstr "Özel komutlar (argümanlar: %d kopya için, %r referans için):"
|
||||
msgstr "Özel komut (argümanlar: dupe için %d , ref için %r )"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Cut"
|
||||
@@ -578,7 +575,7 @@ msgstr "Seçili Dosyanın Ayrıntıları"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Details Panel"
|
||||
msgstr "Ayrıntılar Paneli"
|
||||
msgstr "Ayrıntılar Bölmesi"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Directories"
|
||||
@@ -598,7 +595,7 @@ msgstr "dupeGuru Sonuçları"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "dupeGuru Website"
|
||||
msgstr "dupeGuru Websitesi"
|
||||
msgstr "dupeGuru Web Sitesi"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Edit"
|
||||
@@ -618,15 +615,15 @@ msgstr "Daha az sonuç"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Filter"
|
||||
msgstr "Filtrele"
|
||||
msgstr "Süz"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Filter hardness:"
|
||||
msgstr "Filtre sertliği:"
|
||||
msgstr "Süzme katılığı:"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Filter Results..."
|
||||
msgstr "Sonuçları Filtrele..."
|
||||
msgstr "Sonuçları Süz..."
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Folder Selection Window"
|
||||
@@ -646,7 +643,7 @@ msgstr "Diğerlerini Gizle"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Ignore files smaller than:"
|
||||
msgstr "Şu boyuttan küçük dosyaları yoksay:"
|
||||
msgstr "Şundan küçük dosyaları göz ardı et:"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Load from file..."
|
||||
@@ -658,11 +655,11 @@ msgstr "Küçült"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Mode"
|
||||
msgstr "Mod"
|
||||
msgstr "Kip"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "More results"
|
||||
msgstr "Daha fazla sonuç"
|
||||
msgstr "Daha çok sonuç"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Ok"
|
||||
@@ -686,19 +683,19 @@ msgstr "dupeGuru'dan Çık"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Reset to Default"
|
||||
msgstr "Varsayılana Dön"
|
||||
msgstr "Öntanımlıya Sıfırla"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Reset To Defaults"
|
||||
msgstr "Varsayılanlara Dön"
|
||||
msgstr "Öntanımlılara Sıfırla"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Reveal"
|
||||
msgstr "Ortaya Çıkar"
|
||||
msgstr "Göster"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Reveal Selected in Finder"
|
||||
msgstr "Seçili Öğeyi Finder'da Göster"
|
||||
msgstr "Seçiliyi Finder'da Göster"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Select All"
|
||||
@@ -706,11 +703,11 @@ msgstr "Tümünü Seç"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Send Marked to Trash..."
|
||||
msgstr "İşaretlileri Geri Dönüşüm Kutusuna Gönder..."
|
||||
msgstr "İmliyi Çöpe Gönder..."
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Services"
|
||||
msgstr "Hizmetler"
|
||||
msgstr "Servisler"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Show All"
|
||||
@@ -718,11 +715,11 @@ msgstr "Tümünü Göster"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Start Duplicate Scan"
|
||||
msgstr "Kopyaları Taramayı Başlat"
|
||||
msgstr "Kopya Taramayı Başlat"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "The name '%@' already exists."
|
||||
msgstr "'%@' adı zaten var."
|
||||
msgstr "Halihazırda '%@' adı var."
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Window"
|
||||
@@ -730,11 +727,11 @@ msgstr "Pencere"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Zoom"
|
||||
msgstr "Yakınlaştır"
|
||||
msgstr "Yakınlaş"
|
||||
|
||||
#: qt\app.py:158
|
||||
msgid "Exclusion Filters"
|
||||
msgstr "Harici Bırakma Filtreleri"
|
||||
msgstr "Dışlama Süzgeçleri"
|
||||
|
||||
#: qt\directories_dialog.py:91
|
||||
msgid "Scan Results"
|
||||
@@ -770,19 +767,19 @@ msgstr "Ekle"
|
||||
|
||||
#: qt\exclude_list_dialog.py:46
|
||||
msgid "Restore defaults"
|
||||
msgstr "Varsayılanları geri yükle"
|
||||
msgstr "Öntanımlıları geri yükle"
|
||||
|
||||
#: qt\exclude_list_dialog.py:47
|
||||
msgid "Test string"
|
||||
msgstr "Test dizisi"
|
||||
msgstr "Dizgeyi sına"
|
||||
|
||||
#: qt\exclude_list_dialog.py:83
|
||||
msgid "Type a python regular expression here..."
|
||||
msgstr "Buraya bir Python düzenli ifadesi yazın..."
|
||||
msgstr "Buraya Python düzenli ifadesi yaz..."
|
||||
|
||||
#: qt\exclude_list_dialog.py:85
|
||||
msgid "Type a file system path or filename here..."
|
||||
msgstr "Buraya bir dosya sistemi yolu veya dosya adı yazın..."
|
||||
msgstr "Buraya dosya sistemi yolu veya dosya adı yaz..."
|
||||
|
||||
#: qt\exclude_list_dialog.py:152
|
||||
msgid ""
|
||||
@@ -791,10 +788,10 @@ msgid ""
|
||||
"Example: if you want to filter out .PNG files from the \"My Pictures\" directory only:<br><code>.*My\\sPictures\\\\.*\\.png</code><br><br>You can test the regular expression with the test string feature by pasting a fake path in it:<br><code>C:\\\\User\\My Pictures\\test.png</code><br><br>\n"
|
||||
"Matching regular expressions will be highlighted.<br>If there is at least one highlight, the path tested will be ignored during scans.<br><br>Directories and files starting with a period '.' are filtered out by default.<br><br>"
|
||||
msgstr ""
|
||||
"Bu (büyük/küçük harfe duyarlı) python düzenli ifadeleri, taramalar sırasında dosyaları filtreleyecektir.<br>Dizinler ayrıca, adları seçilen düzenli ifadelerden biriyle eşleşirse, Dizinler sekmesinde<strong>varsayılan durumları</strong>Hariç Tutuldu olarak ayarlanır.<br>Toplanan her dosya için, tamamen göz ardı edilip edilmeyeceğini belirlemek için dosyaların her birinin üzerinde iki test yapılır:<br><li>1. İçinde yol ayırıcı olmayan düzenli ifadeler yalnızca dosya adıyla karşılaştırılır.</li>\n"
|
||||
"<li>2. İçinde yol ayırıcı olmayan normal ifadeler, dosyanın tam yolu ile karşılaştırılacaktır.</li><br>\n"
|
||||
"Örnek: .PNG dosyalarını yalnızca \"My Pictures\" dizininden filtrelemek istiyorsanız:<br><code>.*My\\sPictures\\\\.*\\.png</code><br><br>Düzenli ifadeyi, test dizesi özelliğinin içine sahte bir yol yapıştırarak test edebilirsiniz:<br><code>C:\\\\User\\My Pictures\\test.png</code><br><br>\n"
|
||||
"Eşleşen normal ifadeler vurgulanacaktır.<br>En az bir vurgu varsa, test edilen yol taramalar sırasında yok sayılır<br><br>Nokta '.' ile başlayan dizinler ve dosyalar varsayılan olarak filtrelenir.<br><br>"
|
||||
"Bu (büyük/küçük harfe duyarlı) python düzenli ifadeleri taramalar sırasında dosyaları süzecektir.<br>Ayrıca dizinlerin adları, seçilen düzenli ifadelerden biriyle eşleşirse, Dizinler sekmesinde<strong>öntanımlı durumları</strong>Dışlandı olarak ayarlanır.<br>Toplanan her dosya, tümüyle göz ardı edilip edilmeyeceğiyle ilgili iki kez sınanır:<br><li>1. İçinde yol ayracı olmayan düzenli ifadeler yalnızca dosya adıyla karşılaştırılacaktır.</li>\n"
|
||||
"<li>2. İçinde yol ayracı olmayan düzenli ifadeler, dosyanın tam yolu ile karşılaştırılacaktır.</li><br>\n"
|
||||
"Örneğin: \"Benim Resimlerim\" dizininden yalnızca .PNG dosyalarını süzmek istiyorsanız:<br><code>.*Benim\\sResimlerim\\\\.*\\.png</code><br><br>Düzenli ifadeyi, dizgeyi sınama özelliğinin içine sahte bir yol yapıştırarak sınayabilirsiniz:<br><code>C:\\\\Kullanıcı\\Benim Resimlerim\\sına.png</code><br><br>\n"
|
||||
"Eşleşen düzenli ifadeler vurgulanacaktır.<br>En az bir vurgu varsa, sınanan yol taramalar sırasında yok sayılacaktır.<br><br>Nokta '.' ile başlayan dizinler ve dosyalar öntanımlı olarak süzülür.<br><br>"
|
||||
|
||||
#: qt\exclude_list_table.py:36
|
||||
msgid "Compilation error: "
|
||||
@@ -814,7 +811,7 @@ msgstr "Ctrl+/"
|
||||
|
||||
#: qt\pe\image_viewer.py:76
|
||||
msgid "Normal size"
|
||||
msgstr "Normal boyut"
|
||||
msgstr "Olağan boyut"
|
||||
|
||||
#: qt\pe\image_viewer.py:81
|
||||
msgid "Ctrl+*"
|
||||
@@ -826,18 +823,16 @@ msgstr "En uygun"
|
||||
|
||||
#: qt\pe\preferences_dialog.py:49
|
||||
msgid "Picture cache mode:"
|
||||
msgstr "Resim önbellek modu:"
|
||||
msgstr "Resim önbellek kipi:"
|
||||
|
||||
#: qt\pe\preferences_dialog.py:56
|
||||
msgid "Override theme icons in viewer toolbar"
|
||||
msgstr "Görüntüleyici araç çubuğundaki tema simgelerini geçersiz kıl"
|
||||
msgstr "Görüntüleyici araç çubuğundaki gövde simgelerini geçersiz kıl"
|
||||
|
||||
#: qt\pe\preferences_dialog.py:58
|
||||
msgid ""
|
||||
"Use our own internal icons instead of those provided by the theme engine"
|
||||
msgstr ""
|
||||
"Tema motoru tarafından sağlananlar yerine kendi dahili simgelerimizi "
|
||||
"kullanın"
|
||||
msgstr "Gövde motorunca sağlanan yerine kendi iç simgelerimizi kullanın"
|
||||
|
||||
#: qt\pe\preferences_dialog.py:66
|
||||
msgid "Show scrollbars in image viewers"
|
||||
@@ -889,8 +884,8 @@ msgid ""
|
||||
"While the title bar is hidden, use the modifier key to drag the floating "
|
||||
"window around"
|
||||
msgstr ""
|
||||
"Başlık çubuğu gizliyken, kayan pencereyi etrafında sürüklemek için "
|
||||
"değiştirici tuşu kullanın."
|
||||
"Başlık çubuğu gizliyken, kayan pencereyi çevrede sürüklemek için değiştirici"
|
||||
" tuşu kullan"
|
||||
|
||||
#: qt\preferences_dialog.py:199
|
||||
msgid "The title bar can only be disabled while the window is docked"
|
||||
@@ -917,10 +912,10 @@ msgid ""
|
||||
"Example: if you want to filter out .PNG files from the \"My Pictures\" directory only:<br><code>.*My\\sPictures\\\\.*\\.png</code><br><br>You can test the regular expression with the \"test string\" button after pasting a fake path in the test field:<br><code>C:\\\\User\\My Pictures\\test.png</code><br><br>\n"
|
||||
"Matching regular expressions will be highlighted.<br>If there is at least one highlight, the path or filename tested will be ignored during scans.<br><br>Directories and files starting with a period '.' are filtered out by default.<br><br>"
|
||||
msgstr ""
|
||||
"Bu (büyük/küçük harfe duyarlı) python düzenli ifadeleri, taramalar sırasında dosyaları filtreleyecektir.<br>Dizinler ayrıca, adları seçilen düzenli ifadelerden biriyle eşleşirse, Dizinler sekmesinde <strong>varsayılan durumları</strong> Hariç Tutuldu olarak ayarlanır.<br>Toplanan her dosya için, tamamen göz ardı edilip edilmeyeceğini belirlemek için iki test yapılır:<br><li>1. İçinde yol ayırıcı olmayan düzenli ifadeler yalnızca dosya adıyla karşılaştırılacaktır.</li>\n"
|
||||
"<li>2. İçinde en az bir yol ayırıcı bulunan düzenli ifadeler, dosyanın tam yolu ile karşılaştırılacaktır.</li><br>\n"
|
||||
"<br>Örnek: .PNG dosyalarını yalnızca \"My Pictures\" dizininden filtrelemek istiyorsanız:<code>.*My\\sPictures\\\\.*\\.png</code><br><br>Test alanına sahte bir yol yapıştırdıktan sonra normal ifadeyi \"test dizesi\" düğmesiyle test edebilirsiniz:<br><code>C:\\\\User\\My Pictures\\test.png</code><br><br>\n"
|
||||
"Eşleşen normal ifadeler vurgulanacaktır.<br>En az bir vurgu varsa, test edilen yol veya dosya adı taramalar sırasında yok sayılır.<br><br>Nokta '.' ile başlayan dizinler ve dosyalar varsayılan olarak filtrelenir.<br><br>"
|
||||
"Bu (büyük/küçük harfe duyarlı) python düzenli ifadeleri taramalar sırasında dosyaları süzecektir.<br>Ayrıca dizinlerin adları, seçilen düzenli ifadelerden biriyle eşleşirse, Dizinler sekmesinde <strong>öntanımlı durumları</strong> Dışlandı olarak ayarlanır.<br>Toplanan her dosya için, tümüyle göz ardı edilip edilmeyeceğini belirlemek için iki kez sınanır:<br><li>1. İçinde yol ayracı olmayan düzenli ifadeler yalnızca dosya adıyla karşılaştırılacaktır.</li>\n"
|
||||
"<li>2. İçinde en az bir yol ayracı bulunan düzenli ifadeler, dosyanın tam yolu ile karşılaştırılacaktır.</li><br>\n"
|
||||
"<br>Örneğin: \"Benim Resimlerim\" dizininden yalnızca .PNG dosyalarını süzmek istiyorsanız:<code>.*Benim\\sResimlerim\\\\.*\\.png</code><br><br>Sınama alanına sahte bir yol yapıştırdıktan sonra düzenli ifadeyi \"Dizgeyi sına\" düğmesiyle sınayabilirsiniz:<br><code>C:\\\\Kullanıcı\\Benim Resimlerim\\sınama.png</code><br><br>\n"
|
||||
"Eşleşen düzenli ifadeler vurgulanacaktır.<br>En az bir vurgu varsa, sınanan yol veya dosya adı taramalar sırasında yok sayılacaktır.<br><br>Nokta '.' ile başlayan dizinler ve dosyalar öntanımlı olarak süzülür.<br><br>"
|
||||
|
||||
#: qt\app.py:256
|
||||
msgid "Results"
|
||||
@@ -945,3 +940,47 @@ msgstr "Genel"
|
||||
#: qt\preferences_dialog.py:286
|
||||
msgid "Display"
|
||||
msgstr "Görüntüle"
|
||||
|
||||
#: qt\se\preferences_dialog.py:70
|
||||
msgid "Partially hash files bigger than"
|
||||
msgstr "Şundan büyük dosyaları kısmen özetle:"
|
||||
|
||||
#: qt\se\preferences_dialog.py:80
|
||||
msgid "MB"
|
||||
msgstr "MB"
|
||||
|
||||
#: qt\preferences_dialog.py:163
|
||||
msgid "Use native OS dialogs"
|
||||
msgstr "İşletim sistemi yerel iletişim kutularını kullan"
|
||||
|
||||
#: qt\preferences_dialog.py:166
|
||||
msgid ""
|
||||
"For actions such as file/folder selection use the OS native dialogs.\n"
|
||||
"Some native dialogs have limited functionality."
|
||||
msgstr ""
|
||||
"Dosya/klasör seçimi gibi eylemlerde işletim sistemi yerel iletişim kutularını kullan.\n"
|
||||
"Bazı yerel iletişim kutuları sınırlı işlevselliktedir."
|
||||
|
||||
#: qt\se\preferences_dialog.py:68
|
||||
msgid "Ignore files larger than"
|
||||
msgstr "Şundan büyük dosyaları göz ardı et:"
|
||||
|
||||
#: qt\app.py:135 qt\app.py:293
|
||||
msgid "Clear Cache"
|
||||
msgstr "Önbelleği Temizle"
|
||||
|
||||
#: qt\app.py:294
|
||||
msgid ""
|
||||
"Do you really want to clear the cache? This will remove all cached file "
|
||||
"hashes and picture analysis."
|
||||
msgstr ""
|
||||
"Önbelleği gerçekten temizlemek istiyor musunuz? Bu, tüm önbelleklenen dosya "
|
||||
"özetleri ve resim incelemelerini kaldıracak."
|
||||
|
||||
#: qt\app.py:299
|
||||
msgid "Cache cleared."
|
||||
msgstr "Önbellek temizlendi."
|
||||
|
||||
#: qt\preferences_dialog.py:173
|
||||
msgid "Use dark style"
|
||||
msgstr "Karanlık biçem kullan"
|
||||
|
||||
@@ -923,3 +923,25 @@ msgid ""
|
||||
"For actions such as file/folder selection use the OS native dialogs.\n"
|
||||
"Some native dialogs have limited functionality."
|
||||
msgstr ""
|
||||
|
||||
#: qt\se\preferences_dialog.py:68
|
||||
msgid "Ignore files larger than"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:135 qt\app.py:293
|
||||
msgid "Clear Cache"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:294
|
||||
msgid ""
|
||||
"Do you really want to clear the cache? This will remove all cached file "
|
||||
"hashes and picture analysis."
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:299
|
||||
msgid "Cache cleared."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:173
|
||||
msgid "Use dark style"
|
||||
msgstr ""
|
||||
|
||||
@@ -47,7 +47,7 @@ msgstr "Копіювання"
|
||||
msgid "Sending to Trash"
|
||||
msgstr "Відправка до кошику"
|
||||
|
||||
#: core\app.py:308
|
||||
#: core\app.py:289
|
||||
msgid ""
|
||||
"A previous action is still hanging in there. You can't start a new one yet. "
|
||||
"Wait a few seconds, then try again."
|
||||
@@ -55,35 +55,39 @@ msgstr ""
|
||||
"Попередню дію ще не закінчено. Ви покищо не можете розпочаті нову. Зачекайте"
|
||||
" кілька секунд, потім повторіть спробу."
|
||||
|
||||
#: core\app.py:318
|
||||
#: core\app.py:300
|
||||
msgid "No duplicates found."
|
||||
msgstr "Не знайдено жодного дублікату."
|
||||
|
||||
#: core\app.py:333
|
||||
#: core\app.py:315
|
||||
msgid "All marked files were copied successfully."
|
||||
msgstr "Усі позначені файли були скопійовані успішно."
|
||||
|
||||
#: core\app.py:334
|
||||
#: core\app.py:317
|
||||
msgid "All marked files were moved successfully."
|
||||
msgstr "Усі позначені файли були переміщені успішно."
|
||||
|
||||
#: core\app.py:335
|
||||
#: core\app.py:319
|
||||
msgid "All marked files were deleted successfully."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:321
|
||||
msgid "All marked files were successfully sent to Trash."
|
||||
msgstr "Усі позначені файли були успішно відправлені до кошика."
|
||||
|
||||
#: core\app.py:343
|
||||
#: core\app.py:326
|
||||
msgid "Could not load file: {}"
|
||||
msgstr "Не вдалося завантажити файл: {}"
|
||||
|
||||
#: core\app.py:399
|
||||
#: core\app.py:382
|
||||
msgid "'{}' already is in the list."
|
||||
msgstr "'{}' вже є в списку."
|
||||
|
||||
#: core\app.py:401
|
||||
#: core\app.py:384
|
||||
msgid "'{}' does not exist."
|
||||
msgstr "'{}' не існує."
|
||||
|
||||
#: core\app.py:410
|
||||
#: core\app.py:392
|
||||
msgid ""
|
||||
"All selected %d matches are going to be ignored in all subsequent scans. "
|
||||
"Continue?"
|
||||
@@ -91,61 +95,65 @@ msgstr ""
|
||||
"Усі обрані %d результатів будуть ігноруватися під час усіх наступних "
|
||||
"пошуків. Продовжити?"
|
||||
|
||||
#: core\app.py:486
|
||||
#: core\app.py:469
|
||||
msgid "Select a directory to copy marked files to"
|
||||
msgstr "Виберіть каталог для копіювання позначених файлів"
|
||||
|
||||
#: core\app.py:487
|
||||
#: core\app.py:471
|
||||
msgid "Select a directory to move marked files to"
|
||||
msgstr "Виберіть каталог, куди ви хочете перемістити позначені файли"
|
||||
|
||||
#: core\app.py:527
|
||||
#: core\app.py:510
|
||||
msgid "Select a destination for your exported CSV"
|
||||
msgstr "Виберіть каталог, куди потрібно скопіювати позначені файли"
|
||||
|
||||
#: core\app.py:534 core\app.py:801 core\app.py:811
|
||||
#: core\app.py:516 core\app.py:771 core\app.py:781
|
||||
msgid "Couldn't write to file: {}"
|
||||
msgstr "Не вдалося записати у файл: {}"
|
||||
|
||||
#: core\app.py:559
|
||||
#: core\app.py:539
|
||||
msgid "You have no custom command set up. Set it up in your preferences."
|
||||
msgstr "Власна команда не встановлена. Встановіть її у налаштуваннях."
|
||||
|
||||
#: core\app.py:727 core\app.py:740
|
||||
#: core\app.py:695 core\app.py:707
|
||||
msgid "You are about to remove %d files from results. Continue?"
|
||||
msgstr "Ви збираєтеся видалити %d файлів з результату пошуку. Продовжити?"
|
||||
|
||||
#: core\app.py:774
|
||||
#: core\app.py:743
|
||||
msgid "{} duplicate groups were changed by the re-prioritization."
|
||||
msgstr ""
|
||||
"{} повторюваних груп було змінено шляхом повторного встановлення "
|
||||
"пріоритетів."
|
||||
|
||||
#: core\app.py:821
|
||||
#: core\app.py:790
|
||||
msgid "The selected directories contain no scannable file."
|
||||
msgstr "Обрані папки не містять файлів придатних для пошуку."
|
||||
|
||||
#: core\app.py:835
|
||||
#: core\app.py:803
|
||||
msgid "Collecting files to scan"
|
||||
msgstr "Збір файлів для пошуку"
|
||||
|
||||
#: core\app.py:891
|
||||
#: core\app.py:850
|
||||
msgid "%s (%d discarded)"
|
||||
msgstr "%s (%d відкинуто)"
|
||||
|
||||
#: core\engine.py:244 core\engine.py:288
|
||||
msgid "0 matches found"
|
||||
msgstr "0 результатів знайдено"
|
||||
#: core\directories.py:191
|
||||
msgid "Collected {} files to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\engine.py:262 core\engine.py:296
|
||||
msgid "%d matches found"
|
||||
msgstr "%d результатів знайдено"
|
||||
#: core\directories.py:207
|
||||
msgid "Collected {} folders to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\gui\deletion_options.py:73
|
||||
#: core\engine.py:27
|
||||
msgid "%d matches found from %d groups"
|
||||
msgstr ""
|
||||
|
||||
#: core\gui\deletion_options.py:71
|
||||
msgid "You are sending {} file(s) to the Trash."
|
||||
msgstr "Ви надсилаєте {} файлів у Кошик."
|
||||
|
||||
#: core\gui\exclude_list_table.py:15
|
||||
#: core\gui\exclude_list_table.py:14
|
||||
msgid "Regular Expressions"
|
||||
msgstr "Регулярні вирази"
|
||||
|
||||
@@ -177,15 +185,15 @@ msgstr "Зміст"
|
||||
msgid "Analyzed %d/%d pictures"
|
||||
msgstr "Проаналізовано %d/%d фотографій"
|
||||
|
||||
#: core\pe\matchblock.py:181
|
||||
#: core\pe\matchblock.py:177
|
||||
msgid "Performed %d/%d chunk matches"
|
||||
msgstr "Виконано %d/%d порівнянь шматків"
|
||||
|
||||
#: core\pe\matchblock.py:191
|
||||
#: core\pe\matchblock.py:185
|
||||
msgid "Preparing for matching"
|
||||
msgstr "Підготовка до порівняння"
|
||||
|
||||
#: core\pe\matchblock.py:244
|
||||
#: core\pe\matchblock.py:234
|
||||
msgid "Verified %d/%d matches"
|
||||
msgstr "Перевірено %d/%d результатів"
|
||||
|
||||
@@ -233,23 +241,23 @@ msgstr "Найновіші"
|
||||
msgid "Oldest"
|
||||
msgstr "Найдавніший"
|
||||
|
||||
#: core\results.py:142
|
||||
#: core\results.py:134
|
||||
msgid "%d / %d (%s / %s) duplicates marked."
|
||||
msgstr "%d / %d (%s / %s) дублікатів позначено."
|
||||
|
||||
#: core\results.py:149
|
||||
#: core\results.py:141
|
||||
msgid " filter: %s"
|
||||
msgstr "фільтр: %s"
|
||||
|
||||
#: core\scanner.py:85
|
||||
#: core\scanner.py:90
|
||||
msgid "Read size of %d/%d files"
|
||||
msgstr "Прочитано розмір %d/%d файлів"
|
||||
|
||||
#: core\scanner.py:109
|
||||
#: core\scanner.py:116
|
||||
msgid "Read metadata of %d/%d files"
|
||||
msgstr "Прочитано метаданих з %d/%d файлів"
|
||||
|
||||
#: core\scanner.py:147
|
||||
#: core\scanner.py:154
|
||||
msgid "Almost done! Fiddling with results..."
|
||||
msgstr "Майже зроблено! Возився з результатами..."
|
||||
|
||||
|
||||
@@ -943,3 +943,43 @@ msgstr "Загальні"
|
||||
#: qt\preferences_dialog.py:286
|
||||
msgid "Display"
|
||||
msgstr "Дисплей"
|
||||
|
||||
#: qt\se\preferences_dialog.py:70
|
||||
msgid "Partially hash files bigger than"
|
||||
msgstr ""
|
||||
|
||||
#: qt\se\preferences_dialog.py:80
|
||||
msgid "MB"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:163
|
||||
msgid "Use native OS dialogs"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:166
|
||||
msgid ""
|
||||
"For actions such as file/folder selection use the OS native dialogs.\n"
|
||||
"Some native dialogs have limited functionality."
|
||||
msgstr ""
|
||||
|
||||
#: qt\se\preferences_dialog.py:68
|
||||
msgid "Ignore files larger than"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:135 qt\app.py:293
|
||||
msgid "Clear Cache"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:294
|
||||
msgid ""
|
||||
"Do you really want to clear the cache? This will remove all cached file "
|
||||
"hashes and picture analysis."
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:299
|
||||
msgid "Cache cleared."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:173
|
||||
msgid "Use dark style"
|
||||
msgstr ""
|
||||
|
||||
@@ -49,7 +49,7 @@ msgstr "Đang sao chép"
|
||||
msgid "Sending to Trash"
|
||||
msgstr "Đang gửi vào thùng rác"
|
||||
|
||||
#: core\app.py:308
|
||||
#: core\app.py:289
|
||||
msgid ""
|
||||
"A previous action is still hanging in there. You can't start a new one yet. "
|
||||
"Wait a few seconds, then try again."
|
||||
@@ -57,36 +57,40 @@ msgstr ""
|
||||
"Hiện đã có một tiến trình đang được tiến hành. Bạn không thể bắt đầu một "
|
||||
"phần khác. Hãy đợi trong vài giây, và sau đó thử lại lần nữa."
|
||||
|
||||
#: core\app.py:318
|
||||
#: core\app.py:300
|
||||
msgid "No duplicates found."
|
||||
msgstr "Không tìm thấy thành phần trùng nhau."
|
||||
|
||||
#: core\app.py:333
|
||||
#: core\app.py:315
|
||||
msgid "All marked files were copied successfully."
|
||||
msgstr "Tất cả tập tin được đánh dấu đã được sao chép thành công."
|
||||
|
||||
#: core\app.py:334
|
||||
#: core\app.py:317
|
||||
msgid "All marked files were moved successfully."
|
||||
msgstr "Tất cả các tập tin được đánh dấu đã được di chuyển thành công."
|
||||
|
||||
#: core\app.py:335
|
||||
#: core\app.py:319
|
||||
msgid "All marked files were deleted successfully."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:321
|
||||
msgid "All marked files were successfully sent to Trash."
|
||||
msgstr ""
|
||||
"Tất cả các tập tin được đánh dấu đã được gửi đến Thùng Rác thành công."
|
||||
|
||||
#: core\app.py:343
|
||||
#: core\app.py:326
|
||||
msgid "Could not load file: {}"
|
||||
msgstr "Không thể tải tệp: {}"
|
||||
|
||||
#: core\app.py:399
|
||||
#: core\app.py:382
|
||||
msgid "'{}' already is in the list."
|
||||
msgstr "'{}' đã tồn tại trong danh sách."
|
||||
|
||||
#: core\app.py:401
|
||||
#: core\app.py:384
|
||||
msgid "'{}' does not exist."
|
||||
msgstr "'{}' không tồn tại."
|
||||
|
||||
#: core\app.py:410
|
||||
#: core\app.py:392
|
||||
msgid ""
|
||||
"All selected %d matches are going to be ignored in all subsequent scans. "
|
||||
"Continue?"
|
||||
@@ -94,63 +98,67 @@ msgstr ""
|
||||
"Các phần được chọn %d khớp với nhau sẽ được bỏ qua trong các lần quét sau. "
|
||||
"Tiếp tục?"
|
||||
|
||||
#: core\app.py:486
|
||||
#: core\app.py:469
|
||||
msgid "Select a directory to copy marked files to"
|
||||
msgstr ""
|
||||
"Vui lòng chọn một thư mục mà bạn muốn sao chép các tệp đã đánh dấu vào"
|
||||
|
||||
#: core\app.py:487
|
||||
#: core\app.py:471
|
||||
msgid "Select a directory to move marked files to"
|
||||
msgstr ""
|
||||
"Vui lòng chọn một thư mục mà bạn muốn di chuyển các tệp đã đánh dấu đến"
|
||||
|
||||
#: core\app.py:527
|
||||
#: core\app.py:510
|
||||
msgid "Select a destination for your exported CSV"
|
||||
msgstr "Chọn một điểm xuất dữ liệu dạng CSV"
|
||||
|
||||
#: core\app.py:534 core\app.py:801 core\app.py:811
|
||||
#: core\app.py:516 core\app.py:771 core\app.py:781
|
||||
msgid "Couldn't write to file: {}"
|
||||
msgstr "Không thể ghi vào tệp: {}"
|
||||
|
||||
#: core\app.py:559
|
||||
#: core\app.py:539
|
||||
msgid "You have no custom command set up. Set it up in your preferences."
|
||||
msgstr ""
|
||||
"Bạn vẫn chưa chỉnh sửa phần thiết lập dòng lệnh. Hãy sử dụng tính năng này "
|
||||
"trong phần tùy biến của bạn."
|
||||
|
||||
#: core\app.py:727 core\app.py:740
|
||||
#: core\app.py:695 core\app.py:707
|
||||
msgid "You are about to remove %d files from results. Continue?"
|
||||
msgstr "Bạn chuẩn bị loại bỏ %d tập tin từ phần kết quả. Tiếp tục?"
|
||||
|
||||
#: core\app.py:774
|
||||
#: core\app.py:743
|
||||
msgid "{} duplicate groups were changed by the re-prioritization."
|
||||
msgstr "{} các nhóm trùng nhau đã được thay đổi bởi thứ tự-tái ưu tiên."
|
||||
|
||||
#: core\app.py:821
|
||||
#: core\app.py:790
|
||||
msgid "The selected directories contain no scannable file."
|
||||
msgstr "Các thứ mục được chọn chứa các tập tin không thể quét được."
|
||||
|
||||
#: core\app.py:835
|
||||
#: core\app.py:803
|
||||
msgid "Collecting files to scan"
|
||||
msgstr "Đang thu thập các tập tin để quét"
|
||||
|
||||
#: core\app.py:891
|
||||
#: core\app.py:850
|
||||
msgid "%s (%d discarded)"
|
||||
msgstr "%s (%d bị bỏ qua)"
|
||||
|
||||
#: core\engine.py:244 core\engine.py:288
|
||||
msgid "0 matches found"
|
||||
msgstr "đã tìm thấy 0 phần khớp nhau"
|
||||
#: core\directories.py:191
|
||||
msgid "Collected {} files to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\engine.py:262 core\engine.py:296
|
||||
msgid "%d matches found"
|
||||
msgstr "đã tìm thấy %d phần khớp nhau"
|
||||
#: core\directories.py:207
|
||||
msgid "Collected {} folders to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\gui\deletion_options.py:73
|
||||
#: core\engine.py:27
|
||||
msgid "%d matches found from %d groups"
|
||||
msgstr ""
|
||||
|
||||
#: core\gui\deletion_options.py:71
|
||||
msgid "You are sending {} file(s) to the Trash."
|
||||
msgstr "Bạn sắp sửa gửi {} (các)tập tin đến Thùng Rác."
|
||||
|
||||
#: core\gui\exclude_list_table.py:15
|
||||
#: core\gui\exclude_list_table.py:14
|
||||
msgid "Regular Expressions"
|
||||
msgstr "Biểu thức chính quy"
|
||||
|
||||
@@ -182,15 +190,15 @@ msgstr "Nội dung"
|
||||
msgid "Analyzed %d/%d pictures"
|
||||
msgstr "Đã phân tích %d/%d hình ảnh"
|
||||
|
||||
#: core\pe\matchblock.py:181
|
||||
#: core\pe\matchblock.py:177
|
||||
msgid "Performed %d/%d chunk matches"
|
||||
msgstr "Đã thể thiện %d/%d các phần khớp nhau"
|
||||
|
||||
#: core\pe\matchblock.py:191
|
||||
#: core\pe\matchblock.py:185
|
||||
msgid "Preparing for matching"
|
||||
msgstr "Đang chuẩn bị phần khớp nhau"
|
||||
|
||||
#: core\pe\matchblock.py:244
|
||||
#: core\pe\matchblock.py:234
|
||||
msgid "Verified %d/%d matches"
|
||||
msgstr "Đã xác nhận %d/%d phần khớp nhau"
|
||||
|
||||
@@ -238,23 +246,23 @@ msgstr "Mới nhất"
|
||||
msgid "Oldest"
|
||||
msgstr "Cũ nhất"
|
||||
|
||||
#: core\results.py:142
|
||||
#: core\results.py:134
|
||||
msgid "%d / %d (%s / %s) duplicates marked."
|
||||
msgstr "%d / %d (%s / %s) phần trùng nhau đã được đánh dấu."
|
||||
|
||||
#: core\results.py:149
|
||||
#: core\results.py:141
|
||||
msgid " filter: %s"
|
||||
msgstr " bộ lọc: %s"
|
||||
|
||||
#: core\scanner.py:85
|
||||
#: core\scanner.py:90
|
||||
msgid "Read size of %d/%d files"
|
||||
msgstr "Đọc kích thước của các tập tin %d/%d"
|
||||
|
||||
#: core\scanner.py:109
|
||||
#: core\scanner.py:116
|
||||
msgid "Read metadata of %d/%d files"
|
||||
msgstr "Đọc thông tin chi tiết của %d/%d tập tin"
|
||||
|
||||
#: core\scanner.py:147
|
||||
#: core\scanner.py:154
|
||||
msgid "Almost done! Fiddling with results..."
|
||||
msgstr "Sắp xong! Loay hoay với kết quả..."
|
||||
|
||||
|
||||
@@ -944,3 +944,43 @@ msgstr "Chung"
|
||||
#: qt\preferences_dialog.py:286
|
||||
msgid "Display"
|
||||
msgstr "Trưng bày"
|
||||
|
||||
#: qt\se\preferences_dialog.py:70
|
||||
msgid "Partially hash files bigger than"
|
||||
msgstr ""
|
||||
|
||||
#: qt\se\preferences_dialog.py:80
|
||||
msgid "MB"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:163
|
||||
msgid "Use native OS dialogs"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:166
|
||||
msgid ""
|
||||
"For actions such as file/folder selection use the OS native dialogs.\n"
|
||||
"Some native dialogs have limited functionality."
|
||||
msgstr ""
|
||||
|
||||
#: qt\se\preferences_dialog.py:68
|
||||
msgid "Ignore files larger than"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:135 qt\app.py:293
|
||||
msgid "Clear Cache"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:294
|
||||
msgid ""
|
||||
"Do you really want to clear the cache? This will remove all cached file "
|
||||
"hashes and picture analysis."
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:299
|
||||
msgid "Cache cleared."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:173
|
||||
msgid "Use dark style"
|
||||
msgstr ""
|
||||
|
||||
@@ -2,10 +2,11 @@
|
||||
# Andrew Senetar <arsenetar@gmail.com>, 2021
|
||||
# Chris Ocelot, 2021
|
||||
# Fuan <jcfrt@posteo.net>, 2021
|
||||
# YaNing Lu, 2021
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Fuan <jcfrt@posteo.net>, 2021\n"
|
||||
"Last-Translator: YaNing Lu, 2021\n"
|
||||
"Language-Team: Chinese (China) (https://www.transifex.com/voltaicideas/teams/116153/zh_CN/)\n"
|
||||
"Language: zh_CN\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -46,99 +47,107 @@ msgstr "复制中"
|
||||
msgid "Sending to Trash"
|
||||
msgstr "正在移至回收站"
|
||||
|
||||
#: core\app.py:308
|
||||
#: core\app.py:289
|
||||
msgid ""
|
||||
"A previous action is still hanging in there. You can't start a new one yet. "
|
||||
"Wait a few seconds, then try again."
|
||||
msgstr "前一项操作还在执行,无法启动新操作。请等待几秒钟后再重试一次。"
|
||||
|
||||
#: core\app.py:318
|
||||
#: core\app.py:300
|
||||
msgid "No duplicates found."
|
||||
msgstr "没有找到重复文件。"
|
||||
|
||||
#: core\app.py:333
|
||||
#: core\app.py:315
|
||||
msgid "All marked files were copied successfully."
|
||||
msgstr "所有已标记的文件已复制成功。"
|
||||
|
||||
#: core\app.py:334
|
||||
#: core\app.py:317
|
||||
msgid "All marked files were moved successfully."
|
||||
msgstr "所有已标记的文件已移动成功。"
|
||||
|
||||
#: core\app.py:335
|
||||
#: core\app.py:319
|
||||
msgid "All marked files were deleted successfully."
|
||||
msgstr "已复制所有标记文件"
|
||||
|
||||
#: core\app.py:321
|
||||
msgid "All marked files were successfully sent to Trash."
|
||||
msgstr "所有已标记的文件已成功移至回收站。"
|
||||
|
||||
#: core\app.py:343
|
||||
#: core\app.py:326
|
||||
msgid "Could not load file: {}"
|
||||
msgstr "无法加载文件: {}"
|
||||
|
||||
#: core\app.py:399
|
||||
#: core\app.py:382
|
||||
msgid "'{}' already is in the list."
|
||||
msgstr "'{}' 已在列表中。"
|
||||
|
||||
#: core\app.py:401
|
||||
#: core\app.py:384
|
||||
msgid "'{}' does not exist."
|
||||
msgstr "'{}' 不存在。"
|
||||
|
||||
#: core\app.py:410
|
||||
#: core\app.py:392
|
||||
msgid ""
|
||||
"All selected %d matches are going to be ignored in all subsequent scans. "
|
||||
"Continue?"
|
||||
msgstr "目前已选的 %d 个匹配项将在后续的扫描中被忽略。是否继续?"
|
||||
|
||||
#: core\app.py:486
|
||||
#: core\app.py:469
|
||||
msgid "Select a directory to copy marked files to"
|
||||
msgstr "请选择要将标记文件复制到的目录"
|
||||
|
||||
#: core\app.py:487
|
||||
#: core\app.py:471
|
||||
msgid "Select a directory to move marked files to"
|
||||
msgstr "请选择要将标记文件移动到的目录"
|
||||
|
||||
#: core\app.py:527
|
||||
#: core\app.py:510
|
||||
msgid "Select a destination for your exported CSV"
|
||||
msgstr "选择您导出 CSV 的目标文件夹"
|
||||
|
||||
#: core\app.py:534 core\app.py:801 core\app.py:811
|
||||
#: core\app.py:516 core\app.py:771 core\app.py:781
|
||||
msgid "Couldn't write to file: {}"
|
||||
msgstr "不能写入文件: {}"
|
||||
|
||||
#: core\app.py:559
|
||||
#: core\app.py:539
|
||||
msgid "You have no custom command set up. Set it up in your preferences."
|
||||
msgstr "您没有设定自定义命令。请在设置中进行设定。"
|
||||
|
||||
#: core\app.py:727 core\app.py:740
|
||||
#: core\app.py:695 core\app.py:707
|
||||
msgid "You are about to remove %d files from results. Continue?"
|
||||
msgstr "您将从结果中移除 %d 个文件。是否继续?"
|
||||
|
||||
#: core\app.py:774
|
||||
#: core\app.py:743
|
||||
msgid "{} duplicate groups were changed by the re-prioritization."
|
||||
msgstr "{}个重复的组已被重新排列。"
|
||||
|
||||
#: core\app.py:821
|
||||
#: core\app.py:790
|
||||
msgid "The selected directories contain no scannable file."
|
||||
msgstr "所选目录中不包含可供扫描的文件。"
|
||||
|
||||
#: core\app.py:835
|
||||
#: core\app.py:803
|
||||
msgid "Collecting files to scan"
|
||||
msgstr "收集文件以供扫描"
|
||||
|
||||
#: core\app.py:891
|
||||
#: core\app.py:850
|
||||
msgid "%s (%d discarded)"
|
||||
msgstr "%s (%d 项已丢弃)"
|
||||
|
||||
#: core\engine.py:244 core\engine.py:288
|
||||
msgid "0 matches found"
|
||||
msgstr "未找到匹配项"
|
||||
#: core\directories.py:191
|
||||
msgid "Collected {} files to scan"
|
||||
msgstr "收集要扫描的{}文件"
|
||||
|
||||
#: core\engine.py:262 core\engine.py:296
|
||||
msgid "%d matches found"
|
||||
msgstr "找到 %d 个匹配项"
|
||||
#: core\directories.py:207
|
||||
msgid "Collected {} folders to scan"
|
||||
msgstr "收集要扫描的{}文件夹"
|
||||
|
||||
#: core\gui\deletion_options.py:73
|
||||
#: core\engine.py:27
|
||||
msgid "%d matches found from %d groups"
|
||||
msgstr "从1%d组中找到1%d个匹配"
|
||||
|
||||
#: core\gui\deletion_options.py:71
|
||||
msgid "You are sending {} file(s) to the Trash."
|
||||
msgstr "您正在移动 {} 个文件至回收站。"
|
||||
|
||||
#: core\gui\exclude_list_table.py:15
|
||||
#: core\gui\exclude_list_table.py:14
|
||||
msgid "Regular Expressions"
|
||||
msgstr "正则表达式"
|
||||
|
||||
@@ -170,15 +179,15 @@ msgstr "内容"
|
||||
msgid "Analyzed %d/%d pictures"
|
||||
msgstr "已分析 %d/%d 图像"
|
||||
|
||||
#: core\pe\matchblock.py:181
|
||||
#: core\pe\matchblock.py:177
|
||||
msgid "Performed %d/%d chunk matches"
|
||||
msgstr "已执行 %d/%d 个区块匹配"
|
||||
|
||||
#: core\pe\matchblock.py:191
|
||||
#: core\pe\matchblock.py:185
|
||||
msgid "Preparing for matching"
|
||||
msgstr "准备进行匹配"
|
||||
|
||||
#: core\pe\matchblock.py:244
|
||||
#: core\pe\matchblock.py:234
|
||||
msgid "Verified %d/%d matches"
|
||||
msgstr "已验证 %d/%d 匹配项"
|
||||
|
||||
@@ -226,23 +235,23 @@ msgstr "最新"
|
||||
msgid "Oldest"
|
||||
msgstr "最旧"
|
||||
|
||||
#: core\results.py:142
|
||||
#: core\results.py:134
|
||||
msgid "%d / %d (%s / %s) duplicates marked."
|
||||
msgstr "已标记 %d / %d (%s / %s) 个重复项。"
|
||||
|
||||
#: core\results.py:149
|
||||
#: core\results.py:141
|
||||
msgid " filter: %s"
|
||||
msgstr " 过滤: %s"
|
||||
|
||||
#: core\scanner.py:85
|
||||
#: core\scanner.py:90
|
||||
msgid "Read size of %d/%d files"
|
||||
msgstr "已读取 %d/%d 文件大小"
|
||||
|
||||
#: core\scanner.py:109
|
||||
#: core\scanner.py:116
|
||||
msgid "Read metadata of %d/%d files"
|
||||
msgstr "已读取 %d/%d 文件元数据"
|
||||
|
||||
#: core\scanner.py:147
|
||||
#: core\scanner.py:154
|
||||
msgid "Almost done! Fiddling with results..."
|
||||
msgstr "即将完成!整理结果中..."
|
||||
|
||||
|
||||
@@ -2,10 +2,11 @@
|
||||
# Andrew Senetar <arsenetar@gmail.com>, 2021
|
||||
# Chris Ocelot, 2021
|
||||
# Fuan <jcfrt@posteo.net>, 2021
|
||||
# 太子 VC <taiziccf@gmail.com>, 2021
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Fuan <jcfrt@posteo.net>, 2021\n"
|
||||
"Last-Translator: 太子 VC <taiziccf@gmail.com>, 2021\n"
|
||||
"Language-Team: Chinese (China) (https://www.transifex.com/voltaicideas/teams/116153/zh_CN/)\n"
|
||||
"Language: zh_CN\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -923,3 +924,43 @@ msgstr "一般"
|
||||
#: qt\preferences_dialog.py:286
|
||||
msgid "Display"
|
||||
msgstr "展示"
|
||||
|
||||
#: qt\se\preferences_dialog.py:70
|
||||
msgid "Partially hash files bigger than"
|
||||
msgstr "只哈希部分如果文件大于"
|
||||
|
||||
#: qt\se\preferences_dialog.py:80
|
||||
msgid "MB"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:163
|
||||
msgid "Use native OS dialogs"
|
||||
msgstr "使用操作系统原生对话窗口"
|
||||
|
||||
#: qt\preferences_dialog.py:166
|
||||
msgid ""
|
||||
"For actions such as file/folder selection use the OS native dialogs.\n"
|
||||
"Some native dialogs have limited functionality."
|
||||
msgstr "使用操作系统原生对话窗口选择文件、文件夹。部分系统的原生对话窗口功能可能有限制。"
|
||||
|
||||
#: qt\se\preferences_dialog.py:68
|
||||
msgid "Ignore files larger than"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:135 qt\app.py:293
|
||||
msgid "Clear Cache"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:294
|
||||
msgid ""
|
||||
"Do you really want to clear the cache? This will remove all cached file "
|
||||
"hashes and picture analysis."
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:299
|
||||
msgid "Cache cleared."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:173
|
||||
msgid "Use dark style"
|
||||
msgstr ""
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
# Translators:
|
||||
# 太子 VC <taiziccf@gmail.com>, 2021
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: 太子 VC <taiziccf@gmail.com>, 2021\n"
|
||||
"Language-Team: Chinese (Taiwan) (https://www.transifex.com/voltaicideas/teams/116153/zh_TW/)\n"
|
||||
"Language: zh_TW\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -9,53 +12,53 @@ msgstr ""
|
||||
|
||||
#: qt/app.py:81
|
||||
msgid "Quit"
|
||||
msgstr ""
|
||||
msgstr "退出"
|
||||
|
||||
#: qt/app.py:82 qt/preferences_dialog.py:116
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Options"
|
||||
msgstr ""
|
||||
msgstr "选项"
|
||||
|
||||
#: qt/app.py:83 qt/ignore_list_dialog.py:32
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Ignore List"
|
||||
msgstr ""
|
||||
msgstr "忽略列表"
|
||||
|
||||
#: qt/app.py:84 qt/app.py:179 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Clear Picture Cache"
|
||||
msgstr ""
|
||||
msgstr "清空图片缓存"
|
||||
|
||||
#: qt/app.py:85 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "dupeGuru Help"
|
||||
msgstr ""
|
||||
msgstr "dupeGuru 帮助"
|
||||
|
||||
#: qt/app.py:86 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "About dupeGuru"
|
||||
msgstr ""
|
||||
msgstr "关于 dupeGuru"
|
||||
|
||||
#: qt/app.py:87
|
||||
msgid "Open Debug Log"
|
||||
msgstr ""
|
||||
msgstr "打开调试记录"
|
||||
|
||||
#: qt/app.py:180 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Do you really want to remove all your cached picture analysis?"
|
||||
msgstr ""
|
||||
msgstr "确定要移除所有缓存分析图片?"
|
||||
|
||||
#: qt/app.py:184
|
||||
msgid "Picture cache cleared."
|
||||
msgstr ""
|
||||
msgstr "图片缓存已清空。"
|
||||
|
||||
#: qt/app.py:251
|
||||
msgid "{} file (*.{})"
|
||||
msgstr ""
|
||||
msgstr "{} 文件 (*.{})"
|
||||
|
||||
#: qt/deletion_options.py:30 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Deletion Options"
|
||||
msgstr ""
|
||||
msgstr "删除选项"
|
||||
|
||||
#: qt/deletion_options.py:35 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Link deleted files"
|
||||
msgstr ""
|
||||
msgstr "链接已删除的文件"
|
||||
|
||||
#: qt/deletion_options.py:37 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid ""
|
||||
@@ -91,20 +94,20 @@ msgstr ""
|
||||
|
||||
#: qt/deletion_options.py:60 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
msgstr "取消"
|
||||
|
||||
#: qt/details_table.py:16 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Attribute"
|
||||
msgstr ""
|
||||
msgstr "属性"
|
||||
|
||||
#: qt/details_table.py:16 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Selected"
|
||||
msgstr ""
|
||||
msgstr "已选择"
|
||||
|
||||
#: qt/details_table.py:16 qt/directories_model.py:24
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Reference"
|
||||
msgstr ""
|
||||
msgstr "源文件"
|
||||
|
||||
#: qt/directories_dialog.py:64 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Load Results..."
|
||||
@@ -908,3 +911,43 @@ msgstr ""
|
||||
#: qt\preferences_dialog.py:286
|
||||
msgid "Display"
|
||||
msgstr ""
|
||||
|
||||
#: qt\se\preferences_dialog.py:70
|
||||
msgid "Partially hash files bigger than"
|
||||
msgstr ""
|
||||
|
||||
#: qt\se\preferences_dialog.py:80
|
||||
msgid "MB"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:163
|
||||
msgid "Use native OS dialogs"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:166
|
||||
msgid ""
|
||||
"For actions such as file/folder selection use the OS native dialogs.\n"
|
||||
"Some native dialogs have limited functionality."
|
||||
msgstr ""
|
||||
|
||||
#: qt\se\preferences_dialog.py:68
|
||||
msgid "Ignore files larger than"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:135 qt\app.py:293
|
||||
msgid "Clear Cache"
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:294
|
||||
msgid ""
|
||||
"Do you really want to clear the cache? This will remove all cached file "
|
||||
"hashes and picture analysis."
|
||||
msgstr ""
|
||||
|
||||
#: qt\app.py:299
|
||||
msgid "Cache cleared."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:173
|
||||
msgid "Use dark style"
|
||||
msgstr ""
|
||||
|
||||
4
macos.md
4
macos.md
@@ -2,7 +2,7 @@
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- [Python 3.6+][python]
|
||||
- [Python 3.7+][python]
|
||||
- [Xcode 12.3][xcode] or just Xcode command line tools (older versions can be used if not interested in arm macs)
|
||||
- [Homebrew][homebrew]
|
||||
- [qt5](https://www.qt.io/)
|
||||
@@ -12,7 +12,7 @@
|
||||
2. Install [Homebrew][homebrew], if not on the path after install (arm based Macs) create `~/.zshrc`
|
||||
with `export PATH="/opt/homebrew/bin:$PATH"`. Will need to reload terminal or source the file to take
|
||||
effect.
|
||||
3. Install qt5 with `brew`. If you are using a version of macos without system python 3.6+ then you will
|
||||
3. Install qt5 with `brew`. If you are using a version of macos without system python 3.7+ then you will
|
||||
also need to install that via brew or with pyenv.
|
||||
|
||||
$ brew install qt5
|
||||
|
||||
13
package.py
13
package.py
@@ -71,7 +71,7 @@ def package_debian_distribution(distribution):
|
||||
version = "{}~{}".format(app_version, distribution)
|
||||
destpath = op.join("build", "dupeguru-{}".format(version))
|
||||
srcpath = op.join(destpath, "src")
|
||||
packages = ["hscommon", "core", "qtlib", "qt", "send2trash", "hsaudiotag"]
|
||||
packages = ["hscommon", "core", "qtlib", "qt", "send2trash"]
|
||||
copy_files_to_package(srcpath, packages, with_so=False)
|
||||
os.mkdir(op.join(destpath, "modules"))
|
||||
copy_all(op.join("core", "pe", "modules", "*.*"), op.join(destpath, "modules"))
|
||||
@@ -122,14 +122,7 @@ def package_arch():
|
||||
# need to include them).
|
||||
print("Packaging for Arch")
|
||||
srcpath = op.join("build", "dupeguru-arch")
|
||||
packages = [
|
||||
"hscommon",
|
||||
"core",
|
||||
"qtlib",
|
||||
"qt",
|
||||
"send2trash",
|
||||
"hsaudiotag",
|
||||
]
|
||||
packages = ["hscommon", "core", "qtlib", "qt", "send2trash"]
|
||||
copy_files_to_package(srcpath, packages, with_so=True)
|
||||
shutil.copy(op.join("images", "dgse_logo_128.png"), srcpath)
|
||||
debopts = json.load(open(op.join("pkg", "arch", "dupeguru.json")))
|
||||
@@ -220,7 +213,7 @@ def package_macos():
|
||||
"--osx-bundle-identifier=com.hardcoded-software.dupeguru",
|
||||
"--add-data={0}:locale".format(LOCALE_DIR),
|
||||
"--add-data={0}:help".format(HELP_DIR),
|
||||
ENTRY_SCRIPT,
|
||||
"{0}".format(ENTRY_SCRIPT),
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ Vcs-Git: https://github.com/arsenetar/dupeguru.git
|
||||
|
||||
Package: {pkgname}
|
||||
Architecture: {arch}
|
||||
Depends: ${shlibs:Depends}, python3 (>=3.4), python3-pyqt5
|
||||
Depends: ${shlibs:Depends}, python3 (>=3.7), python3-pyqt5, python3-mutagen
|
||||
Provides: dupeguru-se, dupeguru-me, dupeguru-pe
|
||||
Replaces: dupeguru-se, dupeguru-me, dupeguru-pe
|
||||
Conflicts: dupeguru-se, dupeguru-me, dupeguru-pe
|
||||
|
||||
@@ -3,3 +3,7 @@ requires = ["setuptools"]
|
||||
build-backend = "setuptools.build_meta"
|
||||
[tool.black]
|
||||
line-length = 120
|
||||
[tool.isort]
|
||||
# make it compatible with black
|
||||
profile = "black"
|
||||
skip_gitignore = true
|
||||
|
||||
61
qt/app.py
61
qt/app.py
@@ -8,11 +8,11 @@ import sys
|
||||
import os.path as op
|
||||
|
||||
from PyQt5.QtCore import QTimer, QObject, QUrl, pyqtSignal, Qt
|
||||
from PyQt5.QtGui import QDesktopServices
|
||||
from PyQt5.QtWidgets import QApplication, QFileDialog, QDialog, QMessageBox
|
||||
from PyQt5.QtGui import QColor, QDesktopServices, QPalette
|
||||
from PyQt5.QtWidgets import QApplication, QFileDialog, QDialog, QMessageBox, QStyleFactory, QToolTip
|
||||
|
||||
from hscommon.trans import trget
|
||||
from hscommon import desktop
|
||||
from hscommon import desktop, plat
|
||||
|
||||
from qtlib.about_box import AboutBox
|
||||
from qtlib.recent import Recent
|
||||
@@ -129,11 +129,11 @@ class DupeGuru(QObject):
|
||||
self.showDirectoriesWindow,
|
||||
),
|
||||
(
|
||||
"actionClearPictureCache",
|
||||
"actionClearCache",
|
||||
"Ctrl+Shift+P",
|
||||
"",
|
||||
tr("Clear Picture Cache"),
|
||||
self.clearPictureCacheTriggered,
|
||||
tr("Clear Cache"),
|
||||
self.clearCacheTriggered,
|
||||
),
|
||||
(
|
||||
"actionExcludeList",
|
||||
@@ -166,6 +166,10 @@ class DupeGuru(QObject):
|
||||
self.model.options["match_similar_words"] = self.prefs.match_similar
|
||||
threshold = self.prefs.small_file_threshold if self.prefs.ignore_small_files else 0
|
||||
self.model.options["size_threshold"] = threshold * 1024 # threshold is in KB. The scanner wants bytes
|
||||
large_threshold = self.prefs.large_file_threshold if self.prefs.ignore_large_files else 0
|
||||
self.model.options["large_size_threshold"] = (
|
||||
large_threshold * 1024 * 1024
|
||||
) # threshold is in MB. The Scanner wants bytes
|
||||
big_file_size_threshold = self.prefs.big_file_size_threshold if self.prefs.big_file_partial_hashes else 0
|
||||
self.model.options["big_file_size_threshold"] = (
|
||||
big_file_size_threshold
|
||||
@@ -193,6 +197,8 @@ class DupeGuru(QObject):
|
||||
if self.details_dialog:
|
||||
self.details_dialog.update_options()
|
||||
|
||||
self._set_style("dark" if self.prefs.use_dark_style else "light")
|
||||
|
||||
# --- Private
|
||||
def _get_details_dialog_class(self):
|
||||
if self.model.app_mode == AppMode.PICTURE:
|
||||
@@ -210,6 +216,39 @@ class DupeGuru(QObject):
|
||||
else:
|
||||
return PreferencesDialogStandard
|
||||
|
||||
def _set_style(self, style="light"):
|
||||
# Only support this feature on windows for now
|
||||
if not plat.ISWINDOWS:
|
||||
return
|
||||
if style == "dark":
|
||||
QApplication.setStyle(QStyleFactory.create("Fusion"))
|
||||
palette = QApplication.style().standardPalette()
|
||||
palette.setColor(QPalette.ColorRole.Window, QColor(53, 53, 53))
|
||||
palette.setColor(QPalette.ColorRole.WindowText, Qt.white)
|
||||
palette.setColor(QPalette.ColorRole.Base, QColor(25, 25, 25))
|
||||
palette.setColor(QPalette.ColorRole.AlternateBase, QColor(53, 53, 53))
|
||||
palette.setColor(QPalette.ColorRole.ToolTipBase, QColor(53, 53, 53))
|
||||
palette.setColor(QPalette.ColorRole.ToolTipText, Qt.white)
|
||||
palette.setColor(QPalette.ColorRole.Text, Qt.white)
|
||||
palette.setColor(QPalette.ColorRole.Button, QColor(53, 53, 53))
|
||||
palette.setColor(QPalette.ColorRole.ButtonText, Qt.white)
|
||||
palette.setColor(QPalette.ColorRole.BrightText, Qt.red)
|
||||
palette.setColor(QPalette.ColorRole.Link, QColor(42, 130, 218))
|
||||
palette.setColor(QPalette.ColorRole.Highlight, QColor(42, 130, 218))
|
||||
palette.setColor(QPalette.ColorRole.HighlightedText, Qt.black)
|
||||
palette.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.Text, QColor(164, 166, 168))
|
||||
palette.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.WindowText, QColor(164, 166, 168))
|
||||
palette.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.ButtonText, QColor(164, 166, 168))
|
||||
palette.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.HighlightedText, QColor(164, 166, 168))
|
||||
palette.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.Base, QColor(68, 68, 68))
|
||||
palette.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.Window, QColor(68, 68, 68))
|
||||
palette.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.Highlight, QColor(68, 68, 68))
|
||||
else:
|
||||
QApplication.setStyle(QStyleFactory.create("windowsvista" if plat.ISWINDOWS else "Fusion"))
|
||||
palette = QApplication.style().standardPalette()
|
||||
QToolTip.setPalette(palette)
|
||||
QApplication.setPalette(palette)
|
||||
|
||||
# --- Public
|
||||
def add_selected_to_ignore_list(self):
|
||||
self.model.add_selected_to_ignore_list()
|
||||
@@ -254,6 +293,7 @@ class DupeGuru(QObject):
|
||||
self.willSavePrefs.emit()
|
||||
self.prefs.save()
|
||||
self.model.save()
|
||||
self.model.close()
|
||||
# Workaround for #857, hide() or close().
|
||||
if self.details_dialog is not None:
|
||||
self.details_dialog.close()
|
||||
@@ -284,13 +324,14 @@ class DupeGuru(QObject):
|
||||
self.model.load_from(results)
|
||||
self.recentResults.insertItem(results)
|
||||
|
||||
def clearPictureCacheTriggered(self):
|
||||
title = tr("Clear Picture Cache")
|
||||
msg = tr("Do you really want to remove all your cached picture analysis?")
|
||||
def clearCacheTriggered(self):
|
||||
title = tr("Clear Cache")
|
||||
msg = tr("Do you really want to clear the cache? This will remove all cached file hashes and picture analysis.")
|
||||
if self.confirm(title, msg, QMessageBox.No):
|
||||
self.model.clear_picture_cache()
|
||||
self.model.clear_hash_cache()
|
||||
active = QApplication.activeWindow()
|
||||
QMessageBox.information(active, title, tr("Picture cache cleared."))
|
||||
QMessageBox.information(active, title, tr("Cache cleared."))
|
||||
|
||||
def ignoreListTriggered(self):
|
||||
if self.use_tabs:
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
from PyQt5.QtCore import Qt
|
||||
from PyQt5.QtWidgets import QDockWidget, QWidget
|
||||
|
||||
from qtlib.util import move_to_screen_center
|
||||
from .details_table import DetailsModel
|
||||
from hscommon.plat import ISLINUX
|
||||
|
||||
@@ -73,3 +74,9 @@ class DetailsDialog(QDockWidget):
|
||||
def refresh(self):
|
||||
self.tableModel.beginResetModel()
|
||||
self.tableModel.endResetModel()
|
||||
|
||||
def showEvent(self, event):
|
||||
if self._wasDocked is False:
|
||||
# have to do this here as the frameGeometry is not correct until shown
|
||||
move_to_screen_center(self)
|
||||
super().showEvent(event)
|
||||
|
||||
@@ -126,7 +126,7 @@ class DirectoriesDialog(QMainWindow):
|
||||
self.menuFile.addAction(self.actionLoadResults)
|
||||
self.menuFile.addAction(self.menuLoadRecent.menuAction())
|
||||
self.menuFile.addSeparator()
|
||||
self.menuFile.addAction(self.app.actionClearPictureCache)
|
||||
self.menuFile.addAction(self.app.actionClearCache)
|
||||
self.menuFile.addSeparator()
|
||||
self.menuFile.addAction(self.actionLoadDirectories)
|
||||
self.menuFile.addAction(self.actionSaveDirectories)
|
||||
|
||||
@@ -1049,13 +1049,13 @@ class ScrollAreaImageViewer(QScrollArea):
|
||||
|
||||
def adjustScrollBarsScaled(self, delta):
|
||||
"""After scaling with the mouse, update relative to mouse position."""
|
||||
self._horizontalScrollBar.setValue(self._horizontalScrollBar.value() + delta.x())
|
||||
self._verticalScrollBar.setValue(self._verticalScrollBar.value() + delta.y())
|
||||
self._horizontalScrollBar.setValue(int(self._horizontalScrollBar.value() + delta.x()))
|
||||
self._verticalScrollBar.setValue(int(self._verticalScrollBar.value() + delta.y()))
|
||||
|
||||
def adjustScrollBarsAuto(self):
|
||||
"""After panning, update accordingly."""
|
||||
self.horizontalScrollBar().setValue(self.horizontalScrollBar().value() - self._mousePanningDelta.x())
|
||||
self.verticalScrollBar().setValue(self.verticalScrollBar().value() - self._mousePanningDelta.y())
|
||||
self.horizontalScrollBar().setValue(int(self.horizontalScrollBar().value() - self._mousePanningDelta.x()))
|
||||
self.verticalScrollBar().setValue(int(self.verticalScrollBar().value() - self._mousePanningDelta.y()))
|
||||
|
||||
def adjustScrollBarCentered(self):
|
||||
"""Just center in the middle."""
|
||||
|
||||
@@ -2,32 +2,22 @@
|
||||
* Created On: 2010-01-31
|
||||
* Copyright 2014 Hardcoded Software (http://www.hardcoded.net)
|
||||
*
|
||||
* This software is licensed under the "BSD" License as described in the "LICENSE" file,
|
||||
* which should be included with this package. The terms are also available at
|
||||
* http://www.hardcoded.net/licenses/bsd_license
|
||||
**/
|
||||
* This software is licensed under the "BSD" License as described in the
|
||||
*"LICENSE" file, which should be included with this package. The terms are also
|
||||
*available at http://www.hardcoded.net/licenses/bsd_license
|
||||
**/
|
||||
|
||||
#define PY_SSIZE_T_CLEAN
|
||||
#include "Python.h"
|
||||
|
||||
/* It seems like MS VC defines min/max already */
|
||||
#ifndef _MSC_VER
|
||||
static int
|
||||
max(int a, int b)
|
||||
{
|
||||
return b > a ? b : a;
|
||||
}
|
||||
static int max(int a, int b) { return b > a ? b : a; }
|
||||
|
||||
static int
|
||||
min(int a, int b)
|
||||
{
|
||||
return b < a ? b : a;
|
||||
}
|
||||
static int min(int a, int b) { return b < a ? b : a; }
|
||||
#endif
|
||||
|
||||
static PyObject*
|
||||
getblock(PyObject *image, int width, int height)
|
||||
{
|
||||
static PyObject *getblock(PyObject *image, int width, int height) {
|
||||
int pixel_count, red, green, blue, bytes_per_line;
|
||||
PyObject *pred, *pgreen, *pblue;
|
||||
PyObject *result;
|
||||
@@ -48,13 +38,13 @@ getblock(PyObject *image, int width, int height)
|
||||
Py_DECREF(sipptr);
|
||||
s = (char *)PyCapsule_GetPointer(bits_capsule, NULL);
|
||||
Py_DECREF(bits_capsule);
|
||||
/* Qt aligns all its lines on 32bit, which means that if the number of bytes per
|
||||
* line for image is not divisible by 4, there's going to be crap inserted in "s"
|
||||
* We have to take this into account when calculating offsets
|
||||
/* Qt aligns all its lines on 32bit, which means that if the number of bytes
|
||||
*per line for image is not divisible by 4, there's going to be crap
|
||||
*inserted in "s" We have to take this into account when calculating offsets
|
||||
**/
|
||||
for (i=0; i<height; i++) {
|
||||
for (i = 0; i < height; i++) {
|
||||
int j;
|
||||
for (j=0; j<width; j++) {
|
||||
for (j = 0; j < width; j++) {
|
||||
int offset;
|
||||
unsigned char r, g, b;
|
||||
|
||||
@@ -84,18 +74,18 @@ getblock(PyObject *image, int width, int height)
|
||||
return result;
|
||||
}
|
||||
|
||||
/* block_getblocks(QImage image, int block_count_per_side) -> [(int r, int g, int b), ...]
|
||||
/* block_getblocks(QImage image, int block_count_per_side) -> [(int r, int g,
|
||||
*int b), ...]
|
||||
*
|
||||
* Compute blocks out of `image`. Note the use of min/max when compes the time of computing widths
|
||||
* and heights and positions. This is to cover the case where the width or height of the image is
|
||||
* smaller than `block_count_per_side`. In these cases, blocks will be, of course, 1 pixel big. But
|
||||
* also, because all compared block lists are required to be of the same size, any block that has
|
||||
* no pixel to be assigned to will simply be assigned the last pixel. This is why we have
|
||||
* min(..., height-block_height-1) and stuff like that.
|
||||
**/
|
||||
static PyObject*
|
||||
block_getblocks(PyObject *self, PyObject *args)
|
||||
{
|
||||
* Compute blocks out of `image`. Note the use of min/max when compes the time
|
||||
*of computing widths and heights and positions. This is to cover the case where
|
||||
*the width or height of the image is smaller than `block_count_per_side`. In
|
||||
*these cases, blocks will be, of course, 1 pixel big. But also, because all
|
||||
*compared block lists are required to be of the same size, any block that has
|
||||
* no pixel to be assigned to will simply be assigned the last pixel. This is
|
||||
*why we have min(..., height-block_height-1) and stuff like that.
|
||||
**/
|
||||
static PyObject *block_getblocks(PyObject *self, PyObject *args) {
|
||||
int block_count_per_side, width, height, block_width, block_height, ih;
|
||||
PyObject *image;
|
||||
PyObject *pi;
|
||||
@@ -119,21 +109,22 @@ block_getblocks(PyObject *self, PyObject *args)
|
||||
block_width = max(width / block_count_per_side, 1);
|
||||
block_height = max(height / block_count_per_side, 1);
|
||||
|
||||
result = PyList_New(block_count_per_side * block_count_per_side);
|
||||
result = PyList_New((Py_ssize_t)block_count_per_side * block_count_per_side);
|
||||
if (result == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (ih=0; ih<block_count_per_side; ih++) {
|
||||
for (ih = 0; ih < block_count_per_side; ih++) {
|
||||
int top, iw;
|
||||
top = min(ih*block_height, height-block_height-1);
|
||||
for (iw=0; iw<block_count_per_side; iw++) {
|
||||
top = min(ih * block_height, height - block_height - 1);
|
||||
for (iw = 0; iw < block_count_per_side; iw++) {
|
||||
int left;
|
||||
PyObject *pcrop;
|
||||
PyObject *pblock;
|
||||
|
||||
left = min(iw*block_width, width-block_width-1);
|
||||
pcrop = PyObject_CallMethod(image, "copy", "iiii", left, top, block_width, block_height);
|
||||
left = min(iw * block_width, width - block_width - 1);
|
||||
pcrop = PyObject_CallMethod(image, "copy", "iiii", left, top, block_width,
|
||||
block_height);
|
||||
if (pcrop == NULL) {
|
||||
Py_DECREF(result);
|
||||
return NULL;
|
||||
@@ -144,7 +135,7 @@ block_getblocks(PyObject *self, PyObject *args)
|
||||
Py_DECREF(result);
|
||||
return NULL;
|
||||
}
|
||||
PyList_SET_ITEM(result, ih*block_count_per_side+iw, pblock);
|
||||
PyList_SET_ITEM(result, ih * block_count_per_side + iw, pblock);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -156,8 +147,7 @@ static PyMethodDef BlockMethods[] = {
|
||||
{NULL, NULL, 0, NULL} /* Sentinel */
|
||||
};
|
||||
|
||||
static struct PyModuleDef BlockDef = {
|
||||
PyModuleDef_HEAD_INIT,
|
||||
static struct PyModuleDef BlockDef = {PyModuleDef_HEAD_INIT,
|
||||
"_block_qt",
|
||||
NULL,
|
||||
-1,
|
||||
@@ -165,12 +155,9 @@ static struct PyModuleDef BlockDef = {
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL
|
||||
};
|
||||
NULL};
|
||||
|
||||
PyObject *
|
||||
PyInit__block_qt(void)
|
||||
{
|
||||
PyObject *PyInit__block_qt(void) {
|
||||
PyObject *m = PyModule_Create(&BlockDef);
|
||||
if (m == NULL) {
|
||||
return NULL;
|
||||
|
||||
@@ -29,14 +29,16 @@ class File(PhotoBase):
|
||||
def _plat_get_blocks(self, block_count_per_side, orientation):
|
||||
image = QImage(str(self.path))
|
||||
image = image.convertToFormat(QImage.Format_RGB888)
|
||||
if type(orientation) == str:
|
||||
logging.warning("Orientation for file '%s' was a str '%s', not an int.", str(self.path), orientation)
|
||||
if type(orientation) != int:
|
||||
logging.warning(
|
||||
"Orientation for file '%s' was a %s '%s', not an int.", str(self.path), type(orientation), orientation
|
||||
)
|
||||
try:
|
||||
orientation = int(orientation)
|
||||
except Exception as e:
|
||||
logging.exception(
|
||||
"Skipping transformation because could not \
|
||||
convert str to int. %s",
|
||||
"Skipping transformation because could not convert %s to int. %s",
|
||||
type(orientation),
|
||||
e,
|
||||
)
|
||||
return getblocks(image, block_count_per_side)
|
||||
|
||||
@@ -12,9 +12,13 @@ if op.exists(__file__):
|
||||
# inside qt/, so we just go back one level.
|
||||
BASE_PATH = op.abspath(op.join(op.dirname(__file__), ".."))
|
||||
else:
|
||||
# We're under a freezed environment. Our base path is ''.
|
||||
# Should be a frozen environment
|
||||
if ISOSX:
|
||||
BASE_PATH = op.abspath(op.join(op.dirname(__file__), "..", "..", "Resources"))
|
||||
else:
|
||||
# For others our base path is ''.
|
||||
BASE_PATH = ""
|
||||
HELP_PATH = op.join(BASE_PATH, "help")
|
||||
HELP_PATH = op.join(BASE_PATH, "help", "en")
|
||||
|
||||
if ISWINDOWS:
|
||||
INITIAL_FOLDER_IN_DIALOGS = "C:\\"
|
||||
|
||||
@@ -30,6 +30,7 @@ class Preferences(PreferencesBase):
|
||||
if not self.language and trans.installed_lang:
|
||||
self.language = trans.installed_lang
|
||||
self.portable = get("Portable", False)
|
||||
self.use_dark_style = get("UseDarkStyle", False)
|
||||
self.use_native_dialogs = get("UseNativeDialogs", True)
|
||||
|
||||
self.tableFontSize = get("TableFontSize", self.tableFontSize)
|
||||
@@ -72,6 +73,8 @@ class Preferences(PreferencesBase):
|
||||
self.match_similar = get("MatchSimilar", self.match_similar)
|
||||
self.ignore_small_files = get("IgnoreSmallFiles", self.ignore_small_files)
|
||||
self.small_file_threshold = get("SmallFileThreshold", self.small_file_threshold)
|
||||
self.ignore_large_files = get("IgnoreLargeFiles", self.ignore_large_files)
|
||||
self.large_file_threshold = get("LargeFileThreshold", self.large_file_threshold)
|
||||
self.big_file_partial_hashes = get("BigFilePartialHashes", self.big_file_partial_hashes)
|
||||
self.big_file_size_threshold = get("BigFileSizeThreshold", self.big_file_size_threshold)
|
||||
self.scan_tag_track = get("ScanTagTrack", self.scan_tag_track)
|
||||
@@ -93,6 +96,7 @@ class Preferences(PreferencesBase):
|
||||
self.destination_type = 1
|
||||
self.custom_command = ""
|
||||
self.language = trans.installed_lang if trans.installed_lang else ""
|
||||
self.use_dark_style = False
|
||||
self.use_native_dialogs = True
|
||||
|
||||
self.tableFontSize = QApplication.font().pointSize()
|
||||
@@ -119,6 +123,8 @@ class Preferences(PreferencesBase):
|
||||
self.match_similar = False
|
||||
self.ignore_small_files = True
|
||||
self.small_file_threshold = 10 # KB
|
||||
self.ignore_large_files = False
|
||||
self.large_file_threshold = 1000 # MB
|
||||
self.big_file_partial_hashes = False
|
||||
self.big_file_size_threshold = 100 # MB
|
||||
self.scan_tag_track = False
|
||||
@@ -142,6 +148,7 @@ class Preferences(PreferencesBase):
|
||||
set_("CustomCommand", self.custom_command)
|
||||
set_("Language", self.language)
|
||||
set_("Portable", self.portable)
|
||||
set_("UseDarkStyle", self.use_dark_style)
|
||||
set_("UseNativeDialogs", self.use_native_dialogs)
|
||||
|
||||
set_("TableFontSize", self.tableFontSize)
|
||||
@@ -167,6 +174,8 @@ class Preferences(PreferencesBase):
|
||||
set_("MatchSimilar", self.match_similar)
|
||||
set_("IgnoreSmallFiles", self.ignore_small_files)
|
||||
set_("SmallFileThreshold", self.small_file_threshold)
|
||||
set_("IgnoreLargeFiles", self.ignore_large_files)
|
||||
set_("LargeFileThreshold", self.large_file_threshold)
|
||||
set_("BigFilePartialHashes", self.big_file_partial_hashes)
|
||||
set_("BigFileSizeThreshold", self.big_file_size_threshold)
|
||||
set_("ScanTagTrack", self.scan_tag_track)
|
||||
|
||||
@@ -29,10 +29,11 @@ from PyQt5.QtWidgets import (
|
||||
QFormLayout,
|
||||
)
|
||||
from PyQt5.QtGui import QPixmap, QIcon
|
||||
from hscommon import plat
|
||||
|
||||
from hscommon.trans import trget
|
||||
from hscommon.plat import ISLINUX
|
||||
from qtlib.util import horizontal_wrap
|
||||
from qtlib.util import horizontal_wrap, move_to_screen_center
|
||||
from qtlib.preferences import get_langnames
|
||||
from enum import Flag, auto
|
||||
|
||||
@@ -51,6 +52,7 @@ SUPPORTED_LANGUAGES = [
|
||||
"it",
|
||||
"ja",
|
||||
"ko",
|
||||
"ms",
|
||||
"nl",
|
||||
"pl_PL",
|
||||
"pt_BR",
|
||||
@@ -168,6 +170,9 @@ On MacOS, the tab bar will fill up the window's width instead."
|
||||
)
|
||||
)
|
||||
layout.addWidget(self.use_native_dialogs)
|
||||
if plat.ISWINDOWS:
|
||||
self._setupAddCheckbox("use_dark_style", tr("Use dark style"))
|
||||
layout.addWidget(self.use_dark_style)
|
||||
self.ui_groupbox.setLayout(layout)
|
||||
self.displayVLayout.addWidget(self.ui_groupbox)
|
||||
|
||||
@@ -297,6 +302,8 @@ use the modifier key to drag the floating window around"
|
||||
setchecked(self.reference_bold_font, prefs.reference_bold_font)
|
||||
setchecked(self.tabs_default_pos, prefs.tabs_default_pos)
|
||||
setchecked(self.use_native_dialogs, prefs.use_native_dialogs)
|
||||
if plat.ISWINDOWS:
|
||||
setchecked(self.use_dark_style, prefs.use_dark_style)
|
||||
setchecked(
|
||||
self.details_dialog_titlebar_enabled,
|
||||
prefs.details_dialog_titlebar_enabled,
|
||||
@@ -341,6 +348,8 @@ use the modifier key to drag the floating window around"
|
||||
prefs.tableFontSize = self.fontSizeSpinBox.value()
|
||||
prefs.tabs_default_pos = ischecked(self.tabs_default_pos)
|
||||
prefs.use_native_dialogs = ischecked(self.use_native_dialogs)
|
||||
if plat.ISWINDOWS:
|
||||
prefs.use_dark_style = ischecked(self.use_dark_style)
|
||||
lang = self.supportedLanguages[self.languageComboBox.currentIndex()]
|
||||
oldlang = self.app.prefs.language
|
||||
if oldlang not in self.supportedLanguages:
|
||||
@@ -369,6 +378,11 @@ use the modifier key to drag the floating window around"
|
||||
section_to_update = Sections.DISPLAY
|
||||
self.resetToDefaults(section_to_update)
|
||||
|
||||
def showEvent(self, event):
|
||||
# have to do this here as the frameGeometry is not correct until shown
|
||||
move_to_screen_center(self)
|
||||
super().showEvent(event)
|
||||
|
||||
|
||||
class ColorPickerButton(QPushButton):
|
||||
def __init__(self, parent):
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user