mirror of
https://github.com/arsenetar/dupeguru.git
synced 2025-03-09 21:24:36 +00:00
Merge branch 'arsenetar:master' into manpages
This commit is contained in:
commit
95c49ffdef
45
.github/workflows/default.yml
vendored
45
.github/workflows/default.yml
vendored
@ -9,43 +9,22 @@ on:
|
||||
branches: [master]
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
pre-commit:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Set up Python 3.10
|
||||
uses: actions/setup-python@v2
|
||||
- uses: actions/checkout@v3
|
||||
- name: Set up Python 3.11
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: "3.10"
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip install -r requirements.txt -r requirements-extra.txt
|
||||
- name: Lint with flake8
|
||||
run: |
|
||||
flake8 .
|
||||
format:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Set up Python 3.10
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: "3.10"
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip install -r requirements.txt -r requirements-extra.txt
|
||||
- name: Check format with black
|
||||
run: |
|
||||
black .
|
||||
python-version: "3.11"
|
||||
- uses: pre-commit/action@v3.0.0
|
||||
test:
|
||||
needs: [lint, format]
|
||||
needs: [pre-commit]
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-latest, macos-latest, windows-latest]
|
||||
python-version: [3.7, 3.8, 3.9, "3.10"]
|
||||
python-version: [3.7, 3.8, 3.9, "3.10", "3.11"]
|
||||
exclude:
|
||||
- os: macos-latest
|
||||
python-version: 3.7
|
||||
@ -53,17 +32,21 @@ jobs:
|
||||
python-version: 3.8
|
||||
- os: macos-latest
|
||||
python-version: 3.9
|
||||
- os: macos-latest
|
||||
python-version: "3.10"
|
||||
- os: windows-latest
|
||||
python-version: 3.7
|
||||
- os: windows-latest
|
||||
python-version: 3.8
|
||||
- os: windows-latest
|
||||
python-version: 3.9
|
||||
- os: windows-latest
|
||||
python-version: "3.10"
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v3
|
||||
- name: Set up Python ${{ matrix.python-version }}
|
||||
uses: actions/setup-python@v2
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
- name: Install dependencies
|
||||
|
4
.gitignore
vendored
4
.gitignore
vendored
@ -87,8 +87,8 @@ cython_debug/
|
||||
# Visual Studio Code
|
||||
.vscode/*
|
||||
!.vscode/settings.json
|
||||
#!.vscode/tasks.json
|
||||
#!.vscode/launch.json
|
||||
!.vscode/tasks.json
|
||||
!.vscode/launch.json
|
||||
!.vscode/extensions.json
|
||||
!.vscode/*.code-snippets
|
||||
|
||||
|
24
.pre-commit-config.yaml
Normal file
24
.pre-commit-config.yaml
Normal file
@ -0,0 +1,24 @@
|
||||
repos:
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: v2.3.0
|
||||
hooks:
|
||||
- id: check-yaml
|
||||
- id: check-toml
|
||||
- id: end-of-file-fixer
|
||||
exclude: ".*.json"
|
||||
- id: trailing-whitespace
|
||||
- repo: https://github.com/psf/black
|
||||
rev: 22.10.0
|
||||
hooks:
|
||||
- id: black
|
||||
- repo: https://github.com/PyCQA/flake8
|
||||
rev: 6.0.0
|
||||
hooks:
|
||||
- id: flake8
|
||||
exclude: ^(.tox|env|build|dist|help|qt/dg_rc.py|pkg).*
|
||||
- repo: https://github.com/alessandrojcm/commitlint-pre-commit-hook
|
||||
rev: v9.3.0
|
||||
hooks:
|
||||
- id: commitlint
|
||||
stages: [commit-msg]
|
||||
additional_dependencies: ["@commitlint/config-conventional"]
|
@ -1 +1 @@
|
||||
sonar.python.version=3.7, 3.8, 3.9, 3.10
|
||||
sonar.python.version=3.7, 3.8, 3.9, 3.10, 3.11
|
||||
|
@ -18,4 +18,3 @@ file_filter = locale/<lang>/LC_MESSAGES/ui.po
|
||||
source_file = locale/ui.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
|
3
.vscode/extensions.json
vendored
3
.vscode/extensions.json
vendored
@ -5,6 +5,7 @@
|
||||
"ms-python.vscode-pylance",
|
||||
"ms-python.python"
|
||||
],
|
||||
// List of extensions recommended by VS Code that should not be recommended for users of this workspace.
|
||||
// List of extensions recommended by VS Code that should not be recommended for
|
||||
// users of this workspace.
|
||||
"unwantedRecommendations": []
|
||||
}
|
17
.vscode/launch.json
vendored
Normal file
17
.vscode/launch.json
vendored
Normal file
@ -0,0 +1,17 @@
|
||||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "DupuGuru",
|
||||
"type": "python",
|
||||
"request": "launch",
|
||||
"program": "run.py",
|
||||
"console": "integratedTerminal",
|
||||
"subProcess": true,
|
||||
"justMyCode": false
|
||||
},
|
||||
]
|
||||
}
|
7
.vscode/settings.json
vendored
7
.vscode/settings.json
vendored
@ -4,9 +4,10 @@
|
||||
"Dupras",
|
||||
"hscommon"
|
||||
],
|
||||
"editor.rulers": [
|
||||
88,
|
||||
120
|
||||
],
|
||||
"python.languageServer": "Pylance",
|
||||
"yaml.schemaStore.enable": true,
|
||||
"yaml.schemas": {
|
||||
"https://json.schemastore.org/github-workflow.json": ".github/workflows/*.yml"
|
||||
}
|
||||
}
|
1
LICENSE
1
LICENSE
@ -619,4 +619,3 @@ Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
|
1
build.py
1
build.py
@ -129,6 +129,7 @@ def build_normal():
|
||||
print("Building localizations")
|
||||
build_localizations()
|
||||
print("Building Qt stuff")
|
||||
Path("qt", "dg_rc.py").unlink(missing_ok=True)
|
||||
print_and_do("pyrcc5 {} > {}".format(Path("qt", "dg.qrc"), Path("qt", "dg_rc.py")))
|
||||
fix_qt_resource_file(Path("qt", "dg_rc.py"))
|
||||
build_help()
|
||||
|
17
commitlint.config.js
Normal file
17
commitlint.config.js
Normal file
@ -0,0 +1,17 @@
|
||||
const Configuration = {
|
||||
/*
|
||||
* Resolve and load @commitlint/config-conventional from node_modules.
|
||||
* Referenced packages must be installed
|
||||
*/
|
||||
extends: ['@commitlint/config-conventional'],
|
||||
/*
|
||||
* Any rules defined here will override rules from @commitlint/config-conventional
|
||||
*/
|
||||
rules: {
|
||||
'header-max-length': [2, 'always', 72],
|
||||
'subject-case': [2, 'always', 'sentence-case'],
|
||||
'scope-enum': [2, 'always'],
|
||||
},
|
||||
};
|
||||
|
||||
module.exports = Configuration;
|
13
core/app.py
13
core/app.py
@ -126,8 +126,6 @@ class DupeGuru(Broadcaster):
|
||||
|
||||
NAME = PROMPT_NAME = "dupeGuru"
|
||||
|
||||
PICTURE_CACHE_TYPE = "sqlite" # set to 'shelve' for a ShelveCache
|
||||
|
||||
def __init__(self, view, portable=False):
|
||||
if view.get_default(DEBUG_MODE_PREFERENCE):
|
||||
logging.getLogger().setLevel(logging.DEBUG)
|
||||
@ -153,7 +151,8 @@ class DupeGuru(Broadcaster):
|
||||
"clean_empty_dirs": False,
|
||||
"ignore_hardlink_matches": False,
|
||||
"copymove_dest_type": DestType.RELATIVE,
|
||||
"picture_cache_type": self.PICTURE_CACHE_TYPE,
|
||||
"include_exists_check": True,
|
||||
"rehash_ignore_mtime": False,
|
||||
}
|
||||
self.selected_dupes = []
|
||||
self.details_panel = DetailsPanel(self)
|
||||
@ -183,8 +182,7 @@ class DupeGuru(Broadcaster):
|
||||
self.view.create_results_window()
|
||||
|
||||
def _get_picture_cache_path(self):
|
||||
cache_type = self.options["picture_cache_type"]
|
||||
cache_name = "cached_pictures.shelve" if cache_type == "shelve" else "cached_pictures.db"
|
||||
cache_name = "cached_pictures.db"
|
||||
return op.join(self.appdata, cache_name)
|
||||
|
||||
def _get_dupe_sort_key(self, dupe, get_group, key, delta):
|
||||
@ -555,7 +553,9 @@ class DupeGuru(Broadcaster):
|
||||
# a workaround to make the damn thing work.
|
||||
exepath, args = match.groups()
|
||||
path, exename = op.split(exepath)
|
||||
p = subprocess.Popen(exename + args, shell=True, cwd=path, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
||||
p = subprocess.Popen(
|
||||
exename + args, shell=True, cwd=path, stdout=subprocess.PIPE, stderr=subprocess.STDOUT
|
||||
)
|
||||
output = p.stdout.read()
|
||||
logging.info("Custom command %s %s: %s", exename, args, output)
|
||||
else:
|
||||
@ -792,6 +792,7 @@ class DupeGuru(Broadcaster):
|
||||
Scans folders selected in :attr:`directories` and put the results in :attr:`results`
|
||||
"""
|
||||
scanner = self.SCANNER_CLASS()
|
||||
fs.filesdb.ignore_mtime = self.options["rehash_ignore_mtime"] is True
|
||||
if not self.directories.has_any_file():
|
||||
self.view.show_message(tr("The selected directories contain no scannable file."))
|
||||
return
|
||||
|
@ -84,10 +84,11 @@ class Directories:
|
||||
for denied_path_re in self._exclude_list.compiled:
|
||||
if denied_path_re.match(str(path.name)):
|
||||
return DirectoryState.EXCLUDED
|
||||
# return # We still use the old logic to force state on hidden dirs
|
||||
return DirectoryState.NORMAL
|
||||
# Override this in subclasses to specify the state of some special folders.
|
||||
if path.name.startswith("."):
|
||||
return DirectoryState.EXCLUDED
|
||||
return DirectoryState.NORMAL
|
||||
|
||||
def _get_files(self, from_path, fileclasses, j):
|
||||
try:
|
||||
@ -214,7 +215,7 @@ class Directories:
|
||||
# direct match? easy result.
|
||||
if path in self.states:
|
||||
return self.states[path]
|
||||
state = self._default_state_for_path(path) or DirectoryState.NORMAL
|
||||
state = self._default_state_for_path(path)
|
||||
# Save non-default states in cache, necessary for _get_files()
|
||||
if state != DirectoryState.NORMAL:
|
||||
self.states[path] = state
|
||||
|
82
core/fs.py
82
core/fs.py
@ -54,6 +54,9 @@ CHUNK_SIZE = 1024 * 1024 # 1 MiB
|
||||
# Minimum size below which partial hashing is not used
|
||||
MIN_FILE_SIZE = 3 * CHUNK_SIZE # 3MiB, because we take 3 samples
|
||||
|
||||
# Partial hashing offset and size
|
||||
PARTIAL_OFFSET_SIZE = (0x4000, 0x4000)
|
||||
|
||||
|
||||
class FSError(Exception):
|
||||
cls_message = "An error has occured on '{name}' in '{parent}'"
|
||||
@ -97,59 +100,68 @@ class FilesDB:
|
||||
schema_version = 1
|
||||
schema_version_description = "Changed from md5 to xxhash if available."
|
||||
|
||||
create_table_query = "CREATE TABLE IF NOT EXISTS files (path TEXT PRIMARY KEY, size INTEGER, mtime_ns INTEGER, entry_dt DATETIME, digest BLOB, digest_partial BLOB, digest_samples BLOB)"
|
||||
create_table_query = """CREATE TABLE IF NOT EXISTS files (path TEXT PRIMARY KEY, size INTEGER, mtime_ns INTEGER,
|
||||
entry_dt DATETIME, digest BLOB, digest_partial BLOB, digest_samples BLOB)"""
|
||||
drop_table_query = "DROP TABLE IF EXISTS files;"
|
||||
select_query = "SELECT {key} FROM files WHERE path=:path AND size=:size and mtime_ns=:mtime_ns"
|
||||
select_query_ignore_mtime = "SELECT {key} FROM files WHERE path=:path AND size=:size"
|
||||
insert_query = """
|
||||
INSERT INTO files (path, size, mtime_ns, entry_dt, {key}) VALUES (:path, :size, :mtime_ns, datetime('now'), :value)
|
||||
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;
|
||||
"""
|
||||
|
||||
ignore_mtime = False
|
||||
|
||||
def __init__(self):
|
||||
self.conn = None
|
||||
self.cur = None
|
||||
self.lock = None
|
||||
|
||||
def connect(self, path: Union[AnyStr, os.PathLike]) -> None:
|
||||
self.conn = sqlite3.connect(path, check_same_thread=False)
|
||||
self.cur = self.conn.cursor()
|
||||
self.lock = Lock()
|
||||
self._check_upgrade()
|
||||
|
||||
def _check_upgrade(self) -> None:
|
||||
with self.lock:
|
||||
has_schema = self.cur.execute(
|
||||
with self.lock, self.conn as conn:
|
||||
has_schema = conn.execute(
|
||||
"SELECT NAME FROM sqlite_master WHERE type='table' AND name='schema_version'"
|
||||
).fetchall()
|
||||
version = None
|
||||
if has_schema:
|
||||
version = self.cur.execute("SELECT version FROM schema_version ORDER BY version DESC").fetchone()[0]
|
||||
version = conn.execute("SELECT version FROM schema_version ORDER BY version DESC").fetchone()[0]
|
||||
else:
|
||||
self.cur.execute("CREATE TABLE schema_version (version int PRIMARY KEY, description TEXT)")
|
||||
conn.execute("CREATE TABLE schema_version (version int PRIMARY KEY, description TEXT)")
|
||||
if version != self.schema_version:
|
||||
self.cur.execute(self.drop_table_query)
|
||||
self.cur.execute(
|
||||
conn.execute(self.drop_table_query)
|
||||
conn.execute(
|
||||
"INSERT OR REPLACE INTO schema_version VALUES (:version, :description)",
|
||||
{"version": self.schema_version, "description": self.schema_version_description},
|
||||
)
|
||||
self.cur.execute(self.create_table_query)
|
||||
self.conn.commit()
|
||||
conn.execute(self.create_table_query)
|
||||
|
||||
def clear(self) -> None:
|
||||
with self.lock:
|
||||
self.cur.execute(self.drop_table_query)
|
||||
self.cur.execute(self.create_table_query)
|
||||
with self.lock, self.conn as conn:
|
||||
conn.execute(self.drop_table_query)
|
||||
conn.execute(self.create_table_query)
|
||||
|
||||
def get(self, path: Path, key: str) -> Union[bytes, None]:
|
||||
stat = path.stat()
|
||||
size = stat.st_size
|
||||
mtime_ns = stat.st_mtime_ns
|
||||
try:
|
||||
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()
|
||||
with self.conn as conn:
|
||||
if self.ignore_mtime:
|
||||
cursor = conn.execute(
|
||||
self.select_query_ignore_mtime.format(key=key), {"path": str(path), "size": size}
|
||||
)
|
||||
else:
|
||||
cursor = conn.execute(
|
||||
self.select_query.format(key=key),
|
||||
{"path": str(path), "size": size, "mtime_ns": mtime_ns},
|
||||
)
|
||||
result = cursor.fetchone()
|
||||
cursor.close()
|
||||
|
||||
if result:
|
||||
return result[0]
|
||||
@ -163,8 +175,8 @@ class FilesDB:
|
||||
size = stat.st_size
|
||||
mtime_ns = stat.st_mtime_ns
|
||||
try:
|
||||
with self.lock:
|
||||
self.cur.execute(
|
||||
with self.lock, self.conn as conn:
|
||||
conn.execute(
|
||||
self.insert_query.format(key=key),
|
||||
{"path": str(path), "size": size, "mtime_ns": mtime_ns, "value": value},
|
||||
)
|
||||
@ -177,7 +189,6 @@ class FilesDB:
|
||||
|
||||
def close(self) -> None:
|
||||
with self.lock:
|
||||
self.cur.close()
|
||||
self.conn.close()
|
||||
|
||||
|
||||
@ -235,14 +246,9 @@ class File:
|
||||
|
||||
def _calc_digest_partial(self):
|
||||
# type: () -> bytes
|
||||
|
||||
# This offset is where we should start reading the file to get a partial hash
|
||||
# For audio file, it should be where audio data starts
|
||||
offset, size = (0x4000, 0x4000)
|
||||
|
||||
with self.path.open("rb") as fp:
|
||||
fp.seek(offset)
|
||||
partial_data = fp.read(size)
|
||||
fp.seek(PARTIAL_OFFSET_SIZE[0])
|
||||
partial_data = fp.read(PARTIAL_OFFSET_SIZE[1])
|
||||
return hasher(partial_data).digest()
|
||||
|
||||
def _calc_digest_samples(self) -> bytes:
|
||||
@ -273,7 +279,11 @@ class File:
|
||||
elif field == "digest_partial":
|
||||
self.digest_partial = filesdb.get(self.path, "digest_partial")
|
||||
if self.digest_partial is None:
|
||||
self.digest_partial = self._calc_digest_partial()
|
||||
# If file is smaller than partial requirements just use the full digest
|
||||
if self.size < PARTIAL_OFFSET_SIZE[0] + PARTIAL_OFFSET_SIZE[1]:
|
||||
self.digest_partial = self.digest
|
||||
else:
|
||||
self.digest_partial = self._calc_digest_partial()
|
||||
filesdb.put(self.path, "digest_partial", self.digest_partial)
|
||||
elif field == "digest":
|
||||
self.digest = filesdb.get(self.path, "digest")
|
||||
@ -284,7 +294,7 @@ class File:
|
||||
size = self.size
|
||||
# Might as well hash such small files entirely.
|
||||
if size <= MIN_FILE_SIZE:
|
||||
setattr(self, field, self.digest)
|
||||
self.digest_samples = self.digest
|
||||
return
|
||||
self.digest_samples = filesdb.get(self.path, "digest_samples")
|
||||
if self.digest_samples is None:
|
||||
@ -307,6 +317,14 @@ class File:
|
||||
"""Returns whether this file wrapper class can handle ``path``."""
|
||||
return not path.is_symlink() and path.is_file()
|
||||
|
||||
def exists(self) -> bool:
|
||||
"""Safely check if the underlying file exists, treat error as non-existent"""
|
||||
try:
|
||||
return self.path.exists()
|
||||
except OSError as ex:
|
||||
logging.warning(f"Checking {self.path} raised: {ex}")
|
||||
return False
|
||||
|
||||
def rename(self, newname):
|
||||
if newname == self.name:
|
||||
return
|
||||
|
@ -4,24 +4,13 @@
|
||||
# which should be included with this package. The terms are also available at
|
||||
# http://www.gnu.org/licenses/gpl-3.0.html
|
||||
|
||||
from core.pe._cache import string_to_colors # noqa
|
||||
from core.pe._cache import bytes_to_colors # noqa
|
||||
|
||||
|
||||
def colors_to_string(colors):
|
||||
"""Transform the 3 sized tuples 'colors' into a hex string.
|
||||
def colors_to_bytes(colors):
|
||||
"""Transform the 3 sized tuples 'colors' into a bytes string.
|
||||
|
||||
[(0,100,255)] --> 0064ff
|
||||
[(1,2,3),(4,5,6)] --> 010203040506
|
||||
[(0,100,255)] --> b'\x00d\xff'
|
||||
[(1,2,3),(4,5,6)] --> b'\x01\x02\x03\x04\x05\x06'
|
||||
"""
|
||||
return "".join("{:02x}{:02x}{:02x}".format(r, g, b) for r, g, b in colors)
|
||||
|
||||
|
||||
# This function is an important bottleneck of dupeGuru PE. It has been converted to C.
|
||||
# def string_to_colors(s):
|
||||
# """Transform the string 's' in a list of 3 sized tuples.
|
||||
# """
|
||||
# result = []
|
||||
# for i in xrange(0, len(s), 6):
|
||||
# number = int(s[i:i+6], 16)
|
||||
# result.append((number >> 16, (number >> 8) & 0xff, number & 0xff))
|
||||
# return result
|
||||
return b"".join(map(bytes, colors))
|
||||
|
@ -2,5 +2,5 @@ from typing import Union, Tuple, List
|
||||
|
||||
_block = Tuple[int, int, int]
|
||||
|
||||
def colors_to_string(colors: List[_block]) -> str: ... # noqa: E302
|
||||
def string_to_colors(s: str) -> Union[List[_block], None]: ...
|
||||
def colors_to_bytes(colors: List[_block]) -> bytes: ... # noqa: E302
|
||||
def bytes_to_colors(s: bytes) -> Union[List[_block], None]: ...
|
||||
|
@ -1,141 +0,0 @@
|
||||
# Copyright 2016 Virgil Dupras
|
||||
#
|
||||
# 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
|
||||
|
||||
import os
|
||||
import os.path as op
|
||||
import shelve
|
||||
import tempfile
|
||||
from collections import namedtuple
|
||||
|
||||
from core.pe.cache import string_to_colors, colors_to_string
|
||||
|
||||
|
||||
def wrap_path(path):
|
||||
return f"path:{path}"
|
||||
|
||||
|
||||
def unwrap_path(key):
|
||||
return key[5:]
|
||||
|
||||
|
||||
def wrap_id(path):
|
||||
return f"id:{path}"
|
||||
|
||||
|
||||
def unwrap_id(key):
|
||||
return int(key[3:])
|
||||
|
||||
|
||||
CacheRow = namedtuple("CacheRow", "id path blocks mtime")
|
||||
|
||||
|
||||
class ShelveCache:
|
||||
"""A class to cache picture blocks in a shelve backend."""
|
||||
|
||||
def __init__(self, db=None, readonly=False):
|
||||
self.istmp = db is None
|
||||
if self.istmp:
|
||||
self.dtmp = tempfile.mkdtemp()
|
||||
self.ftmp = db = op.join(self.dtmp, "tmpdb")
|
||||
flag = "r" if readonly else "c"
|
||||
self.shelve = shelve.open(db, flag)
|
||||
self.maxid = self._compute_maxid()
|
||||
|
||||
def __contains__(self, key):
|
||||
return wrap_path(key) in self.shelve
|
||||
|
||||
def __delitem__(self, key):
|
||||
row = self.shelve[wrap_path(key)]
|
||||
del self.shelve[wrap_path(key)]
|
||||
del self.shelve[wrap_id(row.id)]
|
||||
|
||||
def __getitem__(self, key):
|
||||
if isinstance(key, int):
|
||||
skey = self.shelve[wrap_id(key)]
|
||||
else:
|
||||
skey = wrap_path(key)
|
||||
return string_to_colors(self.shelve[skey].blocks)
|
||||
|
||||
def __iter__(self):
|
||||
return (unwrap_path(k) for k in self.shelve if k.startswith("path:"))
|
||||
|
||||
def __len__(self):
|
||||
return sum(1 for k in self.shelve if k.startswith("path:"))
|
||||
|
||||
def __setitem__(self, path_str, blocks):
|
||||
blocks = colors_to_string(blocks)
|
||||
if op.exists(path_str):
|
||||
mtime = int(os.stat(path_str).st_mtime)
|
||||
else:
|
||||
mtime = 0
|
||||
if path_str in self:
|
||||
rowid = self.shelve[wrap_path(path_str)].id
|
||||
else:
|
||||
rowid = self._get_new_id()
|
||||
row = CacheRow(rowid, path_str, blocks, mtime)
|
||||
self.shelve[wrap_path(path_str)] = row
|
||||
self.shelve[wrap_id(rowid)] = wrap_path(path_str)
|
||||
|
||||
def _compute_maxid(self):
|
||||
return max((unwrap_id(k) for k in self.shelve if k.startswith("id:")), default=1)
|
||||
|
||||
def _get_new_id(self):
|
||||
self.maxid += 1
|
||||
return self.maxid
|
||||
|
||||
def clear(self):
|
||||
self.shelve.clear()
|
||||
|
||||
def close(self):
|
||||
if self.shelve is not None:
|
||||
self.shelve.close()
|
||||
if self.istmp:
|
||||
os.remove(self.ftmp)
|
||||
os.rmdir(self.dtmp)
|
||||
self.shelve = None
|
||||
|
||||
def filter(self, func):
|
||||
to_delete = [key for key in self if not func(key)]
|
||||
for key in to_delete:
|
||||
del self[key]
|
||||
|
||||
def get_id(self, path):
|
||||
if path in self:
|
||||
return self.shelve[wrap_path(path)].id
|
||||
else:
|
||||
raise ValueError(path)
|
||||
|
||||
def get_multiple(self, rowids):
|
||||
for rowid in rowids:
|
||||
try:
|
||||
skey = self.shelve[wrap_id(rowid)]
|
||||
except KeyError:
|
||||
continue
|
||||
yield (rowid, string_to_colors(self.shelve[skey].blocks))
|
||||
|
||||
def purge_outdated(self):
|
||||
"""Go through the cache and purge outdated records.
|
||||
|
||||
A record is outdated if the picture doesn't exist or if its mtime is greater than the one in
|
||||
the db.
|
||||
"""
|
||||
todelete = []
|
||||
for path in self:
|
||||
row = self.shelve[wrap_path(path)]
|
||||
if row.mtime and op.exists(path):
|
||||
picture_mtime = os.stat(path).st_mtime
|
||||
if int(picture_mtime) <= row.mtime:
|
||||
# not outdated
|
||||
continue
|
||||
todelete.append(path)
|
||||
for path in todelete:
|
||||
try:
|
||||
del self[path]
|
||||
except KeyError:
|
||||
# I have no idea why a KeyError sometimes happen, but it does, as we can see in
|
||||
# #402 and #439. I don't think it hurts to silently ignore the error, so that's
|
||||
# what we do
|
||||
pass
|
@ -9,12 +9,20 @@ import os.path as op
|
||||
import logging
|
||||
import sqlite3 as sqlite
|
||||
|
||||
from core.pe.cache import string_to_colors, colors_to_string
|
||||
from core.pe.cache import bytes_to_colors, colors_to_bytes
|
||||
|
||||
|
||||
class SqliteCache:
|
||||
"""A class to cache picture blocks in a sqlite backend."""
|
||||
|
||||
schema_version = 1
|
||||
schema_version_description = "Changed from string to bytes for blocks."
|
||||
|
||||
create_table_query = "CREATE TABLE IF NOT EXISTS pictures(path TEXT, mtime_ns INTEGER, blocks BLOB)"
|
||||
create_index_query = "CREATE INDEX IF NOT EXISTS idx_path on pictures (path)"
|
||||
drop_table_query = "DROP TABLE IF EXISTS pictures"
|
||||
drop_index_query = "DROP INDEX IF EXISTS idx_path"
|
||||
|
||||
def __init__(self, db=":memory:", readonly=False):
|
||||
# readonly is not used in the sqlite version of the cache
|
||||
self.dbname = db
|
||||
@ -40,7 +48,7 @@ class SqliteCache:
|
||||
sql = "select blocks from pictures where path = ?"
|
||||
result = self.con.execute(sql, [key]).fetchone()
|
||||
if result:
|
||||
result = string_to_colors(result[0])
|
||||
result = bytes_to_colors(result[0])
|
||||
return result
|
||||
else:
|
||||
raise KeyError(key)
|
||||
@ -56,15 +64,15 @@ class SqliteCache:
|
||||
return result[0][0]
|
||||
|
||||
def __setitem__(self, path_str, blocks):
|
||||
blocks = colors_to_string(blocks)
|
||||
blocks = colors_to_bytes(blocks)
|
||||
if op.exists(path_str):
|
||||
mtime = int(os.stat(path_str).st_mtime)
|
||||
else:
|
||||
mtime = 0
|
||||
if path_str in self:
|
||||
sql = "update pictures set blocks = ?, mtime = ? where path = ?"
|
||||
sql = "update pictures set blocks = ?, mtime_ns = ? where path = ?"
|
||||
else:
|
||||
sql = "insert into pictures(blocks,mtime,path) values(?,?,?)"
|
||||
sql = "insert into pictures(blocks,mtime_ns,path) values(?,?,?)"
|
||||
try:
|
||||
self.con.execute(sql, [blocks, mtime, path_str])
|
||||
except sqlite.OperationalError:
|
||||
@ -73,18 +81,9 @@ class SqliteCache:
|
||||
logging.warning("DatabaseError while setting value for key %r: %s", path_str, str(e))
|
||||
|
||||
def _create_con(self, second_try=False):
|
||||
def create_tables():
|
||||
logging.debug("Creating picture cache tables.")
|
||||
self.con.execute("drop table if exists pictures")
|
||||
self.con.execute("drop index if exists idx_path")
|
||||
self.con.execute("create table pictures(path TEXT, mtime INTEGER, blocks TEXT)")
|
||||
self.con.execute("create index idx_path on pictures (path)")
|
||||
|
||||
self.con = sqlite.connect(self.dbname, isolation_level=None)
|
||||
try:
|
||||
self.con.execute("select path, mtime, blocks from pictures where 1=2")
|
||||
except sqlite.OperationalError: # new db
|
||||
create_tables()
|
||||
self.con = sqlite.connect(self.dbname, isolation_level=None)
|
||||
self._check_upgrade()
|
||||
except sqlite.DatabaseError as e: # corrupted db
|
||||
if second_try:
|
||||
raise # Something really strange is happening
|
||||
@ -93,6 +92,25 @@ class SqliteCache:
|
||||
os.remove(self.dbname)
|
||||
self._create_con(second_try=True)
|
||||
|
||||
def _check_upgrade(self) -> None:
|
||||
with self.con as conn:
|
||||
has_schema = conn.execute(
|
||||
"SELECT NAME FROM sqlite_master WHERE type='table' AND name='schema_version'"
|
||||
).fetchall()
|
||||
version = None
|
||||
if has_schema:
|
||||
version = conn.execute("SELECT version FROM schema_version ORDER BY version DESC").fetchone()[0]
|
||||
else:
|
||||
conn.execute("CREATE TABLE schema_version (version int PRIMARY KEY, description TEXT)")
|
||||
if version != self.schema_version:
|
||||
conn.execute(self.drop_table_query)
|
||||
conn.execute(
|
||||
"INSERT OR REPLACE INTO schema_version VALUES (:version, :description)",
|
||||
{"version": self.schema_version, "description": self.schema_version_description},
|
||||
)
|
||||
conn.execute(self.create_table_query)
|
||||
conn.execute(self.create_index_query)
|
||||
|
||||
def clear(self):
|
||||
self.close()
|
||||
if self.dbname != ":memory:":
|
||||
@ -120,7 +138,7 @@ class SqliteCache:
|
||||
def get_multiple(self, rowids):
|
||||
sql = "select rowid, blocks from pictures where rowid in (%s)" % ",".join(map(str, rowids))
|
||||
cur = self.con.execute(sql)
|
||||
return ((rowid, string_to_colors(blocks)) for rowid, blocks in cur)
|
||||
return ((rowid, bytes_to_colors(blocks)) for rowid, blocks in cur)
|
||||
|
||||
def purge_outdated(self):
|
||||
"""Go through the cache and purge outdated records.
|
||||
@ -129,12 +147,12 @@ class SqliteCache:
|
||||
the db.
|
||||
"""
|
||||
todelete = []
|
||||
sql = "select rowid, path, mtime from pictures"
|
||||
sql = "select rowid, path, mtime_ns from pictures"
|
||||
cur = self.con.execute(sql)
|
||||
for rowid, path_str, mtime in cur:
|
||||
if mtime and op.exists(path_str):
|
||||
for rowid, path_str, mtime_ns in cur:
|
||||
if mtime_ns and op.exists(path_str):
|
||||
picture_mtime = os.stat(path_str).st_mtime
|
||||
if int(picture_mtime) <= mtime:
|
||||
if int(picture_mtime) <= mtime_ns:
|
||||
# not outdated
|
||||
continue
|
||||
todelete.append(rowid)
|
||||
|
@ -16,6 +16,7 @@ from hscommon.jobprogress import job
|
||||
|
||||
from core.engine import Match
|
||||
from core.pe.block import avgdiff, DifferentBlockCountError, NoBlocksError
|
||||
from core.pe.cache_sqlite import SqliteCache
|
||||
|
||||
# OPTIMIZATION NOTES:
|
||||
# The bottleneck of the matching phase is CPU, which is why we use multiprocessing. However, another
|
||||
@ -27,7 +28,7 @@ from core.pe.block import avgdiff, DifferentBlockCountError, NoBlocksError
|
||||
# to files in other chunks. So chunkifying doesn't save us any actual comparison, but the advantage
|
||||
# is that instead of reading blocks from disk number_of_files**2 times, we read it
|
||||
# number_of_files*number_of_chunks times.
|
||||
# Determining the right chunk size is tricky, bceause if it's too big, too many blocks will be in
|
||||
# Determining the right chunk size is tricky, because if it's too big, too many blocks will be in
|
||||
# memory at the same time and we might end up with memory trashing, which is awfully slow. So,
|
||||
# because our *real* bottleneck is CPU, the chunk size must simply be enough so that the CPU isn't
|
||||
# starved by Disk IOs.
|
||||
@ -50,14 +51,7 @@ except Exception:
|
||||
|
||||
|
||||
def get_cache(cache_path, readonly=False):
|
||||
if cache_path.endswith("shelve"):
|
||||
from core.pe.cache_shelve import ShelveCache
|
||||
|
||||
return ShelveCache(cache_path, readonly=readonly)
|
||||
else:
|
||||
from core.pe.cache_sqlite import SqliteCache
|
||||
|
||||
return SqliteCache(cache_path, readonly=readonly)
|
||||
return SqliteCache(cache_path, readonly=readonly)
|
||||
|
||||
|
||||
def prepare_pictures(pictures, cache_path, with_dimensions, j=job.nulljob):
|
||||
|
@ -2,94 +2,68 @@
|
||||
* 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"
|
||||
|
||||
/* I know that there strtol out there, but it requires a pointer to
|
||||
* a char, which would in turn require me to buffer my chars around,
|
||||
* making the whole process slower.
|
||||
*/
|
||||
static long
|
||||
xchar_to_long(char c)
|
||||
{
|
||||
if ((c >= 48) && (c <= 57)) { /* 0-9 */
|
||||
return c - 48;
|
||||
static PyObject *cache_bytes_to_colors(PyObject *self, PyObject *args) {
|
||||
char *y;
|
||||
Py_ssize_t char_count, i, color_count;
|
||||
PyObject *result;
|
||||
unsigned long r, g, b;
|
||||
Py_ssize_t ci;
|
||||
PyObject *color_tuple;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "y#", &y, &char_count)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
color_count = char_count / 3;
|
||||
result = PyList_New(color_count);
|
||||
if (result == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (i = 0; i < color_count; i++) {
|
||||
ci = i * 3;
|
||||
r = (unsigned char)y[ci];
|
||||
g = (unsigned char)y[ci + 1];
|
||||
b = (unsigned char)y[ci + 2];
|
||||
|
||||
color_tuple = inttuple(3, r, g, b);
|
||||
if (color_tuple == NULL) {
|
||||
Py_DECREF(result);
|
||||
return NULL;
|
||||
}
|
||||
else if ((c >= 65) && (c <= 70)) { /* A-F */
|
||||
return c - 55;
|
||||
}
|
||||
else if ((c >= 97) && (c <= 102)) { /* a-f */
|
||||
return c - 87;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
PyList_SET_ITEM(result, i, color_tuple);
|
||||
}
|
||||
|
||||
static PyObject*
|
||||
cache_string_to_colors(PyObject *self, PyObject *args)
|
||||
{
|
||||
char *s;
|
||||
Py_ssize_t char_count, color_count, i;
|
||||
PyObject *result;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "s#", &s, &char_count)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
color_count = (char_count / 6);
|
||||
result = PyList_New(color_count);
|
||||
if (result == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (i=0; i<color_count; i++) {
|
||||
long r, g, b;
|
||||
Py_ssize_t ci;
|
||||
PyObject *color_tuple;
|
||||
|
||||
ci = i * 6;
|
||||
r = (xchar_to_long(s[ci]) << 4) + xchar_to_long(s[ci+1]);
|
||||
g = (xchar_to_long(s[ci+2]) << 4) + xchar_to_long(s[ci+3]);
|
||||
b = (xchar_to_long(s[ci+4]) << 4) + xchar_to_long(s[ci+5]);
|
||||
|
||||
color_tuple = inttuple(3, r, g, b);
|
||||
if (color_tuple == NULL) {
|
||||
Py_DECREF(result);
|
||||
return NULL;
|
||||
}
|
||||
PyList_SET_ITEM(result, i, color_tuple);
|
||||
}
|
||||
|
||||
return result;
|
||||
return result;
|
||||
}
|
||||
|
||||
static PyMethodDef CacheMethods[] = {
|
||||
{"string_to_colors", cache_string_to_colors, METH_VARARGS,
|
||||
"Transform the string 's' in a list of 3 sized tuples."},
|
||||
{NULL, NULL, 0, NULL} /* Sentinel */
|
||||
{"bytes_to_colors", cache_bytes_to_colors, METH_VARARGS,
|
||||
"Transform the bytes 's' into a list of 3 sized tuples."},
|
||||
{NULL, NULL, 0, NULL} /* Sentinel */
|
||||
};
|
||||
|
||||
static struct PyModuleDef CacheDef = {
|
||||
PyModuleDef_HEAD_INIT,
|
||||
"_cache",
|
||||
NULL,
|
||||
-1,
|
||||
CacheMethods,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL
|
||||
};
|
||||
static struct PyModuleDef CacheDef = {PyModuleDef_HEAD_INIT,
|
||||
"_cache",
|
||||
NULL,
|
||||
-1,
|
||||
CacheMethods,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL};
|
||||
|
||||
PyObject *
|
||||
PyInit__cache(void)
|
||||
{
|
||||
PyObject *m = PyModule_Create(&CacheDef);
|
||||
if (m == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
return m;
|
||||
PyObject *PyInit__cache(void) {
|
||||
PyObject *m = PyModule_Create(&CacheDef);
|
||||
if (m == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
return m;
|
||||
}
|
@ -32,7 +32,7 @@ PyObject* inttuple(int n, ...)
|
||||
result = PyTuple_New(n);
|
||||
|
||||
for (i=0; i<n; i++) {
|
||||
pnumber = PyLong_FromLong(va_arg(numbers, long));
|
||||
pnumber = PyLong_FromUnsignedLong(va_arg(numbers, long));
|
||||
if (pnumber == NULL) {
|
||||
Py_DECREF(result);
|
||||
return NULL;
|
||||
|
@ -29,7 +29,7 @@ class Photo(fs.File):
|
||||
__slots__ = fs.File.__slots__ + tuple(INITIAL_INFO.keys())
|
||||
|
||||
# These extensions are supported on all platforms
|
||||
HANDLED_EXTS = {"png", "jpg", "jpeg", "gif", "bmp", "tiff", "tif"}
|
||||
HANDLED_EXTS = {"png", "jpg", "jpeg", "gif", "bmp", "tiff", "tif", "webp"}
|
||||
|
||||
def _plat_get_dimensions(self):
|
||||
raise NotImplementedError()
|
||||
|
@ -87,8 +87,6 @@ class Scanner:
|
||||
}
|
||||
):
|
||||
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:
|
||||
@ -171,8 +169,11 @@ class Scanner:
|
||||
matches = [m for m in matches if m.first.path not in toremove or m.second.path not in toremove]
|
||||
if not self.mix_file_kind:
|
||||
matches = [m for m in matches if get_file_ext(m.first.name) == get_file_ext(m.second.name)]
|
||||
matches = [m for m in matches if m.first.path.exists() and m.second.path.exists()]
|
||||
matches = [m for m in matches if not (m.first.is_ref and m.second.is_ref)]
|
||||
if self.include_exists_check:
|
||||
matches = [m for m in matches if m.first.exists() and m.second.exists()]
|
||||
# Contents already handles ref checks, other scan types might not catch during scan
|
||||
if self.scan_type != ScanType.CONTENTS:
|
||||
matches = [m for m in matches if not (m.first.is_ref and m.second.is_ref)]
|
||||
if ignore_list:
|
||||
matches = [m for m in matches if not ignore_list.are_ignored(str(m.first.path), str(m.second.path))]
|
||||
logging.info("Grouping matches")
|
||||
@ -212,3 +213,4 @@ class Scanner:
|
||||
large_size_threshold = 0
|
||||
big_file_size_threshold = 0
|
||||
word_weighting = False
|
||||
include_exists_check = True
|
||||
|
@ -10,41 +10,41 @@ from pytest import raises, skip
|
||||
from hscommon.testutil import eq_
|
||||
|
||||
try:
|
||||
from core.pe.cache import colors_to_string, string_to_colors
|
||||
from core.pe.cache import colors_to_bytes, bytes_to_colors
|
||||
from core.pe.cache_sqlite import SqliteCache
|
||||
from core.pe.cache_shelve import ShelveCache
|
||||
except ImportError:
|
||||
skip("Can't import the cache module, probably hasn't been compiled.")
|
||||
|
||||
|
||||
class TestCaseColorsToString:
|
||||
def test_no_color(self):
|
||||
eq_("", colors_to_string([]))
|
||||
eq_(b"", colors_to_bytes([]))
|
||||
|
||||
def test_single_color(self):
|
||||
eq_("000000", colors_to_string([(0, 0, 0)]))
|
||||
eq_("010101", colors_to_string([(1, 1, 1)]))
|
||||
eq_("0a141e", colors_to_string([(10, 20, 30)]))
|
||||
eq_(b"\x00\x00\x00", colors_to_bytes([(0, 0, 0)]))
|
||||
eq_(b"\x01\x01\x01", colors_to_bytes([(1, 1, 1)]))
|
||||
eq_(b"\x0a\x14\x1e", colors_to_bytes([(10, 20, 30)]))
|
||||
|
||||
def test_two_colors(self):
|
||||
eq_("000102030405", colors_to_string([(0, 1, 2), (3, 4, 5)]))
|
||||
eq_(b"\x00\x01\x02\x03\x04\x05", colors_to_bytes([(0, 1, 2), (3, 4, 5)]))
|
||||
|
||||
|
||||
class TestCaseStringToColors:
|
||||
def test_empty(self):
|
||||
eq_([], string_to_colors(""))
|
||||
eq_([], bytes_to_colors(b""))
|
||||
|
||||
def test_single_color(self):
|
||||
eq_([(0, 0, 0)], string_to_colors("000000"))
|
||||
eq_([(2, 3, 4)], string_to_colors("020304"))
|
||||
eq_([(10, 20, 30)], string_to_colors("0a141e"))
|
||||
eq_([(0, 0, 0)], bytes_to_colors(b"\x00\x00\x00"))
|
||||
eq_([(2, 3, 4)], bytes_to_colors(b"\x02\x03\x04"))
|
||||
eq_([(10, 20, 30)], bytes_to_colors(b"\x0a\x14\x1e"))
|
||||
|
||||
def test_two_colors(self):
|
||||
eq_([(10, 20, 30), (40, 50, 60)], string_to_colors("0a141e28323c"))
|
||||
eq_([(10, 20, 30), (40, 50, 60)], bytes_to_colors(b"\x0a\x14\x1e\x28\x32\x3c"))
|
||||
|
||||
def test_incomplete_color(self):
|
||||
# don't return anything if it's not a complete color
|
||||
eq_([], string_to_colors("102"))
|
||||
eq_([], bytes_to_colors(b"\x01"))
|
||||
eq_([(1, 2, 3)], bytes_to_colors(b"\x01\x02\x03\x04"))
|
||||
|
||||
|
||||
class BaseTestCaseCache:
|
||||
@ -133,11 +133,6 @@ class TestCaseSqliteCache(BaseTestCaseCache):
|
||||
eq_(c["foo"], [(1, 2, 3)])
|
||||
|
||||
|
||||
class TestCaseShelveCache(BaseTestCaseCache):
|
||||
def get_cache(self, dbname=None):
|
||||
return ShelveCache(dbname)
|
||||
|
||||
|
||||
class TestCaseCacheSQLEscape:
|
||||
def get_cache(self):
|
||||
return SqliteCache()
|
||||
|
@ -326,6 +326,7 @@ def test_default_path_state_override(tmpdir):
|
||||
def _default_state_for_path(self, path):
|
||||
if "foobar" in path.parts:
|
||||
return DirectoryState.EXCLUDED
|
||||
return DirectoryState.NORMAL
|
||||
|
||||
d = MyDirectories()
|
||||
p1 = Path(str(tmpdir))
|
||||
|
@ -17,6 +17,7 @@ from core.scanner import Scanner, ScanType
|
||||
from core.me.scanner import ScannerME
|
||||
|
||||
|
||||
# TODO update this to be able to inherit from fs.File
|
||||
class NamedObject:
|
||||
def __init__(self, name="foobar", size=1, path=None):
|
||||
if path is None:
|
||||
@ -31,6 +32,9 @@ class NamedObject:
|
||||
def __repr__(self):
|
||||
return "<NamedObject {!r} {!r}>".format(self.name, self.path)
|
||||
|
||||
def exists(self):
|
||||
return self.path.exists()
|
||||
|
||||
|
||||
no = NamedObject
|
||||
|
||||
|
@ -24,7 +24,7 @@ Development process
|
||||
* `Issue Tracker`_
|
||||
* `Issue labels meaning`_
|
||||
|
||||
dupeGuru's source code is on Github and thus managed in a Git repository. At all times, you should
|
||||
dupeGuru's source code is on GitHub and thus managed in a Git repository. At all times, you should
|
||||
be able to build from source a fresh checkout of the ``master`` branch using instructions from the
|
||||
``README.md`` file at the root of this project. If you can't, it's a bug. Please report it.
|
||||
|
||||
@ -61,7 +61,7 @@ It's the same thing with feature requests. Description of a feature request, whe
|
||||
already been given to how such a feature would fit in the current design, are precious to developers
|
||||
and help them figure out a clear roadmap for the project.
|
||||
|
||||
So, even if you're not a developer, you can always open a Github account and create/comment issues.
|
||||
So, even if you're not a developer, you can always open a GitHub account and create/comment issues.
|
||||
Your contribution will be much appreciated.
|
||||
|
||||
**Documentation**. This is a bit trickier because dupeGuru's documentation is written with a rather
|
||||
|
@ -15,4 +15,3 @@ hscommon.gui.progress_window
|
||||
.. autoclass:: ProgressWindowView
|
||||
:members:
|
||||
:private-members:
|
||||
|
||||
|
@ -15,4 +15,3 @@ hscommon.gui.tree
|
||||
.. autoclass:: Node
|
||||
:members:
|
||||
:private-members:
|
||||
|
||||
|
@ -13,4 +13,3 @@ hscommon
|
||||
util
|
||||
jobprogress/*
|
||||
gui/*
|
||||
|
||||
|
@ -14,4 +14,3 @@ hscommon.jobprogress.job
|
||||
|
||||
.. autoclass:: NullJob
|
||||
:members:
|
||||
|
||||
|
@ -9,4 +9,3 @@ hscommon.jobprogress.performer
|
||||
|
||||
.. autoclass:: ThreadedJobPerformer
|
||||
:members:
|
||||
|
||||
|
@ -30,8 +30,8 @@ that makes sure that you will **always** keep at least one member of the duplica
|
||||
How can I report a bug a suggest a feature?
|
||||
-------------------------------------------
|
||||
|
||||
dupeGuru is hosted on `Github`_ and it's also where issues are tracked. The best way to report a
|
||||
bug or suggest a feature is to sign up on Github and `open an issue`_.
|
||||
dupeGuru is hosted on `GitHub`_ and it's also where issues are tracked. The best way to report a
|
||||
bug or suggest a feature is to sign up on GitHub and `open an issue`_.
|
||||
|
||||
The mark box of a file I want to delete is disabled. What must I do?
|
||||
--------------------------------------------------------------------
|
||||
@ -176,6 +176,5 @@ Preferences are stored elsewhere:
|
||||
* Linux: ``~/.config/Hardcoded Software/dupeGuru.conf``
|
||||
* Mac OS X: In the built-in ``defaults`` system, as ``com.hardcoded-software.dupeguru``
|
||||
|
||||
.. _Github: https://github.com/arsenetar/dupeguru
|
||||
.. _GitHub: https://github.com/arsenetar/dupeguru
|
||||
.. _open an issue: https://github.com/arsenetar/dupeguru/wiki/issue-labels
|
||||
|
||||
|
@ -12,4 +12,3 @@
|
||||
* Եթե համոզված եք, որ կրկնօրինակը արդյունքներում կա, ապա սեղմեք **Խմբագրել-->Նշել բոլորը**, և ապա **Գործողություններ-->Ուղարկել Նշվածը Աղբարկղ**:
|
||||
|
||||
Սա միայն բազային ստուգում է: Կան բազմաթիվ կարգավորումներ, որոնք հնարավորություն են տալիս նշելու տարբեր արդյունքներ և մի քանի եղանակներ արդյունքների փոփոխման: Մանրամասների համար կարդացեք Օգնության ֆայլը:
|
||||
|
||||
|
@ -23,4 +23,3 @@ dupeGuru-ը փորձում է որոշել, թե որ կրկնօրինակներ
|
||||
մեծագույն ֆայլը և եթե երկու կամ ավելի ֆայլեր ունեն նույն չափը, ապա մեկը ունի ֆայլի անուն, որը
|
||||
չի ավարտվում թվով, կօգտագործվի: Երբ փաստարկի արդյունքը կապված է, կարգը, որի սխալները
|
||||
նախկինում էին, խումբը պետք է օգտագործվի:
|
||||
|
||||
|
@ -114,4 +114,3 @@
|
||||
Якщо все це не так, `контакт УГ підтримки <http://www.hardcoded.net/support>`_, ми зрозуміти це.
|
||||
|
||||
.. todo:: This FAQ qestion is outdated, see english version.
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
# http://www.gnu.org/licenses/gpl-3.0.html
|
||||
|
||||
|
||||
from typing import Any, Callable, Generator, Iterator, List, Union
|
||||
from typing import Any, Callable, Generator, List, Union
|
||||
|
||||
|
||||
class JobCancelled(Exception):
|
||||
@ -148,7 +148,7 @@ class Job:
|
||||
self._do_update(desc)
|
||||
|
||||
|
||||
class NullJob:
|
||||
class NullJob(Job):
|
||||
def __init__(self, *args, **kwargs) -> None:
|
||||
# Null job does nothing
|
||||
pass
|
||||
@ -161,9 +161,6 @@ class NullJob:
|
||||
# Null job does nothing
|
||||
pass
|
||||
|
||||
def iter_with_progress(self, sequence, *args, **kwargs) -> Iterator:
|
||||
return iter(sequence)
|
||||
|
||||
def start_job(self, *args, **kwargs) -> None:
|
||||
# Null job does nothing
|
||||
pass
|
||||
|
@ -41,7 +41,8 @@ def trget(domain: str) -> Callable[[str], str]:
|
||||
|
||||
|
||||
def set_tr(
|
||||
new_tr: Callable[[str, Union[str, None]], str], new_trget: Union[Callable[[str], Callable[[str], str]], None] = None
|
||||
new_tr: Callable[[str, Union[str, None]], str],
|
||||
new_trget: Union[Callable[[str], Callable[[str], str]], None] = None,
|
||||
) -> None:
|
||||
global _trfunc, _trget
|
||||
_trfunc = new_tr
|
||||
|
@ -1,7 +1,10 @@
|
||||
# Translators:
|
||||
# Andrew Senetar <arsenetar@gmail.com>, 2022
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Language-Team: Arabic (https://www.transifex.com/voltaicideas/teams/116153/ar/)\n"
|
||||
"Last-Translator: Andrew Senetar <arsenetar@gmail.com>, 2022\n"
|
||||
"Language-Team: Arabic (https://app.transifex.com/voltaicideas/teams/116153/ar/)\n"
|
||||
"Language: ar\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
@ -10,110 +13,110 @@ 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 ""
|
||||
msgstr "مسار الملف"
|
||||
|
||||
#: core\gui\problem_table.py:19
|
||||
msgid "Error Message"
|
||||
msgstr ""
|
||||
msgstr "رسالة خطأ"
|
||||
|
||||
#: core\me\prioritize.py:23
|
||||
msgid "Duration"
|
||||
msgstr ""
|
||||
msgstr "مدة"
|
||||
|
||||
#: core\me\prioritize.py:30 core\me\result_table.py:23
|
||||
msgid "Bitrate"
|
||||
msgstr ""
|
||||
msgstr "معدل البت"
|
||||
|
||||
#: core\me\prioritize.py:37
|
||||
msgid "Samplerate"
|
||||
msgstr ""
|
||||
msgstr "معدل العينة"
|
||||
|
||||
#: core\me\result_table.py:19 core\pe\result_table.py:19 core\prioritize.py:92
|
||||
#: core\me\result_table.py:19 core\pe\result_table.py:19 core\prioritize.py:94
|
||||
#: core\se\result_table.py:19
|
||||
msgid "Filename"
|
||||
msgstr ""
|
||||
msgstr "اسم الملف"
|
||||
|
||||
#: 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 ""
|
||||
msgstr "مجلد"
|
||||
|
||||
#: core\me\result_table.py:21
|
||||
msgid "Size (MB)"
|
||||
msgstr ""
|
||||
msgstr "الحجم (ميغا بايت)"
|
||||
|
||||
#: core\me\result_table.py:22
|
||||
msgid "Time"
|
||||
msgstr ""
|
||||
msgstr "زمن"
|
||||
|
||||
#: core\me\result_table.py:24
|
||||
msgid "Sample Rate"
|
||||
msgstr ""
|
||||
msgstr "معدل العينة"
|
||||
|
||||
#: 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 ""
|
||||
msgstr "طيب القلب"
|
||||
|
||||
#: core\me\result_table.py:26 core\pe\result_table.py:25
|
||||
#: core\prioritize.py:163 core\se\result_table.py:23
|
||||
#: core\prioritize.py:165 core\se\result_table.py:23
|
||||
msgid "Modification"
|
||||
msgstr ""
|
||||
msgstr "تعديل"
|
||||
|
||||
#: core\me\result_table.py:27
|
||||
msgid "Title"
|
||||
msgstr ""
|
||||
msgstr "عنوان"
|
||||
|
||||
#: core\me\result_table.py:28
|
||||
msgid "Artist"
|
||||
msgstr ""
|
||||
msgstr "فنان"
|
||||
|
||||
#: core\me\result_table.py:29
|
||||
msgid "Album"
|
||||
msgstr ""
|
||||
msgstr "البوم"
|
||||
|
||||
#: core\me\result_table.py:30
|
||||
msgid "Genre"
|
||||
msgstr ""
|
||||
msgstr "النوع"
|
||||
|
||||
#: core\me\result_table.py:31
|
||||
msgid "Year"
|
||||
msgstr ""
|
||||
msgstr "سنة"
|
||||
|
||||
#: core\me\result_table.py:32
|
||||
msgid "Track Number"
|
||||
msgstr ""
|
||||
msgstr "رقم الشاحنة"
|
||||
|
||||
#: core\me\result_table.py:33
|
||||
msgid "Comment"
|
||||
msgstr ""
|
||||
msgstr "تعليق"
|
||||
|
||||
#: core\me\result_table.py:34 core\pe\result_table.py:26
|
||||
#: core\se\result_table.py:24
|
||||
msgid "Match %"
|
||||
msgstr ""
|
||||
msgstr "مباراة ٪"
|
||||
|
||||
#: core\me\result_table.py:35 core\se\result_table.py:25
|
||||
msgid "Words Used"
|
||||
msgstr ""
|
||||
msgstr "الكلمات المستخدمة"
|
||||
|
||||
#: core\me\result_table.py:36 core\pe\result_table.py:27
|
||||
#: core\se\result_table.py:26
|
||||
msgid "Dupe Count"
|
||||
msgstr ""
|
||||
msgstr "عدد المخادعين"
|
||||
|
||||
#: core\pe\prioritize.py:23 core\pe\result_table.py:23
|
||||
msgid "Dimensions"
|
||||
msgstr ""
|
||||
msgstr "أبعاد"
|
||||
|
||||
#: core\pe\result_table.py:21 core\se\result_table.py:21
|
||||
msgid "Size (KB)"
|
||||
msgstr ""
|
||||
msgstr "الحجم (كيلو بايت)"
|
||||
|
||||
#: core\pe\result_table.py:24
|
||||
msgid "EXIF Timestamp"
|
||||
msgstr ""
|
||||
msgstr "الطابع الزمني EXIF"
|
||||
|
||||
#: core\prioritize.py:156
|
||||
#: core\prioritize.py:158
|
||||
msgid "Size"
|
||||
msgstr ""
|
||||
msgstr "بحجم"
|
||||
|
@ -1,139 +1,150 @@
|
||||
# Translators:
|
||||
# Andrew Senetar <arsenetar@gmail.com>, 2022
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Language-Team: Arabic (https://www.transifex.com/voltaicideas/teams/116153/ar/)\n"
|
||||
"Last-Translator: Andrew Senetar <arsenetar@gmail.com>, 2022\n"
|
||||
"Language-Team: Arabic (https://app.transifex.com/voltaicideas/teams/116153/ar/)\n"
|
||||
"Language: ar\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
|
||||
|
||||
#: core\app.py:42
|
||||
#: core\app.py:44
|
||||
msgid "There are no marked duplicates. Nothing has been done."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:43
|
||||
#: core\app.py:45
|
||||
msgid "There are no selected duplicates. Nothing has been done."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:44
|
||||
#: core\app.py:46
|
||||
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 ""
|
||||
|
||||
#: core\app.py:71
|
||||
#: core\app.py:73
|
||||
msgid "Scanning for duplicates"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:72
|
||||
#: core\app.py:74
|
||||
msgid "Loading"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:73
|
||||
#: core\app.py:75
|
||||
msgid "Moving"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:74
|
||||
#: core\app.py:76
|
||||
msgid "Copying"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:75
|
||||
#: core\app.py:77
|
||||
msgid "Sending to Trash"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:308
|
||||
#: core\app.py:293
|
||||
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:304
|
||||
msgid "No duplicates found."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:333
|
||||
#: core\app.py:319
|
||||
msgid "All marked files were copied successfully."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:334
|
||||
#: core\app.py:321
|
||||
msgid "All marked files were moved successfully."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:335
|
||||
#: core\app.py:323
|
||||
msgid "All marked files were deleted successfully."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:325
|
||||
msgid "All marked files were successfully sent to Trash."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:343
|
||||
#: core\app.py:330
|
||||
msgid "Could not load file: {}"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:399
|
||||
#: core\app.py:386
|
||||
msgid "'{}' already is in the list."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:401
|
||||
#: core\app.py:388
|
||||
msgid "'{}' does not exist."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:410
|
||||
#: core\app.py:396
|
||||
msgid ""
|
||||
"All selected %d matches are going to be ignored in all subsequent scans. "
|
||||
"Continue?"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:486
|
||||
#: core\app.py:473
|
||||
msgid "Select a directory to copy marked files to"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:487
|
||||
#: core\app.py:475
|
||||
msgid "Select a directory to move marked files to"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:527
|
||||
#: core\app.py:514
|
||||
msgid "Select a destination for your exported CSV"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:534 core\app.py:801 core\app.py:811
|
||||
#: core\app.py:520 core\app.py:781 core\app.py:791
|
||||
msgid "Couldn't write to file: {}"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:559
|
||||
#: core\app.py:543
|
||||
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:705 core\app.py:717
|
||||
msgid "You are about to remove %d files from results. Continue?"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:774
|
||||
#: core\app.py:753
|
||||
msgid "{} duplicate groups were changed by the re-prioritization."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:821
|
||||
#: core\app.py:801
|
||||
msgid "The selected directories contain no scannable file."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:835
|
||||
#: core\app.py:817
|
||||
msgid "Collecting files to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:891
|
||||
#: core\app.py:867
|
||||
msgid "%s (%d discarded)"
|
||||
msgstr ""
|
||||
|
||||
#: core\engine.py:244 core\engine.py:288
|
||||
msgid "0 matches found"
|
||||
#: core\directories.py:190
|
||||
msgid "Collected {} files to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\engine.py:262 core\engine.py:296
|
||||
msgid "%d matches found"
|
||||
#: core\directories.py:206
|
||||
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 ""
|
||||
|
||||
@ -143,7 +154,7 @@ msgstr ""
|
||||
|
||||
#: core\me\scanner.py:20 core\se\scanner.py:16
|
||||
msgid "Filename"
|
||||
msgstr ""
|
||||
msgstr "اسم الملف"
|
||||
|
||||
#: core\me\scanner.py:21
|
||||
msgid "Filename - Fields"
|
||||
@ -165,15 +176,15 @@ msgstr ""
|
||||
msgid "Analyzed %d/%d pictures"
|
||||
msgstr ""
|
||||
|
||||
#: core\pe\matchblock.py:181
|
||||
#: core\pe\matchblock.py:177
|
||||
msgid "Performed %d/%d chunk matches"
|
||||
msgstr ""
|
||||
|
||||
#: 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 ""
|
||||
|
||||
@ -183,61 +194,61 @@ msgstr ""
|
||||
|
||||
#: core\pe\scanner.py:22
|
||||
msgid "EXIF Timestamp"
|
||||
msgstr ""
|
||||
msgstr "الطابع الزمني EXIF"
|
||||
|
||||
#: core\prioritize.py:70
|
||||
msgid "None"
|
||||
msgstr ""
|
||||
|
||||
#: core\prioritize.py:100
|
||||
#: core\prioritize.py:102
|
||||
msgid "Ends with number"
|
||||
msgstr ""
|
||||
|
||||
#: core\prioritize.py:101
|
||||
#: core\prioritize.py:103
|
||||
msgid "Doesn't end with number"
|
||||
msgstr ""
|
||||
|
||||
#: core\prioritize.py:102
|
||||
#: core\prioritize.py:104
|
||||
msgid "Longest"
|
||||
msgstr ""
|
||||
|
||||
#: core\prioritize.py:103
|
||||
#: core\prioritize.py:105
|
||||
msgid "Shortest"
|
||||
msgstr ""
|
||||
|
||||
#: core\prioritize.py:140
|
||||
#: core\prioritize.py:142
|
||||
msgid "Highest"
|
||||
msgstr ""
|
||||
|
||||
#: core\prioritize.py:140
|
||||
#: core\prioritize.py:142
|
||||
msgid "Lowest"
|
||||
msgstr ""
|
||||
|
||||
#: core\prioritize.py:169
|
||||
#: core\prioritize.py:171
|
||||
msgid "Newest"
|
||||
msgstr ""
|
||||
|
||||
#: core\prioritize.py:169
|
||||
#: core\prioritize.py:171
|
||||
msgid "Oldest"
|
||||
msgstr ""
|
||||
|
||||
#: core\results.py:142
|
||||
#: core\results.py:134
|
||||
msgid "%d / %d (%s / %s) duplicates marked."
|
||||
msgstr ""
|
||||
|
||||
#: core\results.py:149
|
||||
#: core\results.py:141
|
||||
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 ""
|
||||
|
||||
|
@ -1,7 +1,10 @@
|
||||
# Translators:
|
||||
# Andrew Senetar <arsenetar@gmail.com>, 2022
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Language-Team: Arabic (https://www.transifex.com/voltaicideas/teams/116153/ar/)\n"
|
||||
"Last-Translator: Andrew Senetar <arsenetar@gmail.com>, 2022\n"
|
||||
"Language-Team: Arabic (https://app.transifex.com/voltaicideas/teams/116153/ar/)\n"
|
||||
"Language: ar\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
@ -249,23 +252,23 @@ msgstr ""
|
||||
|
||||
#: qt/me/preferences_dialog.py:38 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Artist"
|
||||
msgstr ""
|
||||
msgstr "فنان"
|
||||
|
||||
#: qt/me/preferences_dialog.py:40 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Album"
|
||||
msgstr ""
|
||||
msgstr "البوم"
|
||||
|
||||
#: qt/me/preferences_dialog.py:42 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Title"
|
||||
msgstr ""
|
||||
msgstr "عنوان"
|
||||
|
||||
#: qt/me/preferences_dialog.py:44 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Genre"
|
||||
msgstr ""
|
||||
msgstr "النوع"
|
||||
|
||||
#: qt/me/preferences_dialog.py:46 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Year"
|
||||
msgstr ""
|
||||
msgstr "سنة"
|
||||
|
||||
#: qt/me/preferences_dialog.py:50 qt/se/preferences_dialog.py:30
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
@ -908,3 +911,204 @@ 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 ""
|
||||
|
||||
#: qt\preferences_dialog.py:241
|
||||
msgid "Profile scan operation"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:242
|
||||
msgid "Profile the scan operation and save logs for optimization."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:246
|
||||
msgid "Logs located in: <a href=\"{}\">{}</a>"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:291
|
||||
msgid "Debug"
|
||||
msgstr ""
|
||||
|
||||
#: qt\about_box.py:31
|
||||
msgid "About {}"
|
||||
msgstr ""
|
||||
|
||||
#: qt\about_box.py:47
|
||||
msgid "Version {}"
|
||||
msgstr ""
|
||||
|
||||
#: qt\about_box.py:49 qt\about_box.py:75
|
||||
msgid "Checking for updates..."
|
||||
msgstr ""
|
||||
|
||||
#: qt\about_box.py:54
|
||||
msgid "Licensed under GPLv3"
|
||||
msgstr ""
|
||||
|
||||
#: qt\about_box.py:68
|
||||
msgid "No update available."
|
||||
msgstr ""
|
||||
|
||||
#: qt\about_box.py:71
|
||||
msgid "New version {} available, download <a href=\"{}\">here</a>."
|
||||
msgstr ""
|
||||
|
||||
#: qt\error_report_dialog.py:50
|
||||
msgid "Error Report"
|
||||
msgstr ""
|
||||
|
||||
#: qt\error_report_dialog.py:54
|
||||
msgid "Something went wrong. How about reporting the error?"
|
||||
msgstr ""
|
||||
|
||||
#: qt\error_report_dialog.py:60
|
||||
msgid ""
|
||||
"Error reports should be reported as Github issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"\n"
|
||||
"Please make sure to run a search for any already existing issues beforehand. Also make sure to test the very latest version available from the repository, since the bug you are experiencing might have already been patched.\n"
|
||||
"\n"
|
||||
"What usually really helps is if you add a description of how you got the error. Thanks!\n"
|
||||
"\n"
|
||||
"Although the application should continue to run after this error, it may be in an unstable state, so it is recommended that you restart the application."
|
||||
msgstr ""
|
||||
|
||||
#: qt\error_report_dialog.py:80
|
||||
msgid "Go to Github"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences.py:24
|
||||
msgid "Czech"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences.py:25
|
||||
msgid "German"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences.py:26
|
||||
msgid "Greek"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences.py:27
|
||||
msgid "English"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences.py:28
|
||||
msgid "Spanish"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences.py:29
|
||||
msgid "French"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences.py:30
|
||||
msgid "Armenian"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences.py:31
|
||||
msgid "Italian"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences.py:32
|
||||
msgid "Japanese"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences.py:33
|
||||
msgid "Korean"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences.py:34
|
||||
msgid "Malay"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences.py:35
|
||||
msgid "Dutch"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences.py:36
|
||||
msgid "Polish"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences.py:37
|
||||
msgid "Brazilian"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences.py:38
|
||||
msgid "Russian"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences.py:39
|
||||
msgid "Turkish"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences.py:40
|
||||
msgid "Ukrainian"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences.py:41
|
||||
msgid "Vietnamese"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences.py:42
|
||||
msgid "Chinese (Simplified)"
|
||||
msgstr ""
|
||||
|
||||
#: qt\recent.py:54
|
||||
msgid "Clear List"
|
||||
msgstr ""
|
||||
|
||||
#: qt\search_edit.py:78
|
||||
msgid "Search..."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:219
|
||||
msgid ""
|
||||
"These options are for advanced users or for very specific situations, most "
|
||||
"users should not have to modify these."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:225
|
||||
msgid "Include existence check after scan completion"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:227
|
||||
msgid "Ignore difference in mtime when loading cached digests"
|
||||
msgstr ""
|
||||
|
@ -114,4 +114,3 @@ msgstr ""
|
||||
#: core\prioritize.py:158
|
||||
msgid "Size"
|
||||
msgstr ""
|
||||
|
||||
|
@ -36,83 +36,83 @@ msgstr ""
|
||||
msgid "Sending to Trash"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:291
|
||||
#: core\app.py:293
|
||||
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:302
|
||||
#: core\app.py:304
|
||||
msgid "No duplicates found."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:317
|
||||
#: core\app.py:319
|
||||
msgid "All marked files were copied successfully."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:319
|
||||
#: core\app.py:321
|
||||
msgid "All marked files were moved successfully."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:321
|
||||
#: core\app.py:323
|
||||
msgid "All marked files were deleted successfully."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:323
|
||||
#: core\app.py:325
|
||||
msgid "All marked files were successfully sent to Trash."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:328
|
||||
#: core\app.py:330
|
||||
msgid "Could not load file: {}"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:384
|
||||
#: core\app.py:386
|
||||
msgid "'{}' already is in the list."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:386
|
||||
#: core\app.py:388
|
||||
msgid "'{}' does not exist."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:394
|
||||
#: core\app.py:396
|
||||
msgid "All selected %d matches are going to be ignored in all subsequent scans. Continue?"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:471
|
||||
#: core\app.py:473
|
||||
msgid "Select a directory to copy marked files to"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:473
|
||||
#: core\app.py:475
|
||||
msgid "Select a directory to move marked files to"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:512
|
||||
#: core\app.py:514
|
||||
msgid "Select a destination for your exported CSV"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:518 core\app.py:773 core\app.py:783
|
||||
#: core\app.py:520 core\app.py:781 core\app.py:791
|
||||
msgid "Couldn't write to file: {}"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:541
|
||||
#: core\app.py:543
|
||||
msgid "You have no custom command set up. Set it up in your preferences."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:697 core\app.py:709
|
||||
#: core\app.py:705 core\app.py:717
|
||||
msgid "You are about to remove %d files from results. Continue?"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:745
|
||||
#: core\app.py:753
|
||||
msgid "{} duplicate groups were changed by the re-prioritization."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:792
|
||||
#: core\app.py:801
|
||||
msgid "The selected directories contain no scannable file."
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:808
|
||||
#: core\app.py:817
|
||||
msgid "Collecting files to scan"
|
||||
msgstr ""
|
||||
|
||||
#: core\app.py:858
|
||||
#: core\app.py:867
|
||||
msgid "%s (%d discarded)"
|
||||
msgstr ""
|
||||
|
||||
@ -243,4 +243,3 @@ msgstr ""
|
||||
#: core\se\scanner.py:18
|
||||
msgid "Folders"
|
||||
msgstr ""
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Fuan <jcfrt@posteo.net>, 2022\n"
|
||||
"Language-Team: Czech (https://www.transifex.com/voltaicideas/teams/116153/cs/)\n"
|
||||
"Language-Team: Czech (https://app.transifex.com/voltaicideas/teams/116153/cs/)\n"
|
||||
"Language: cs\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
@ -1028,7 +1028,7 @@ msgstr "Něco se pokazilo. Co takhle nahlásit chybu?"
|
||||
|
||||
#: qt\error_report_dialog.py:60
|
||||
msgid ""
|
||||
"Error reports should be reported as Github issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"Error reports should be reported as GitHub issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"\n"
|
||||
"Please make sure to run a search for any already existing issues beforehand. Also make sure to test the very latest version available from the repository, since the bug you are experiencing might have already been patched.\n"
|
||||
"\n"
|
||||
@ -1045,8 +1045,8 @@ msgstr ""
|
||||
"Přestože by aplikace měla po této chybě pokračovat, může být v nestabilním stavu, proto se doporučuje aplikaci restartovat."
|
||||
|
||||
#: qt\error_report_dialog.py:80
|
||||
msgid "Go to Github"
|
||||
msgstr "Přejít na Github"
|
||||
msgid "Go to GitHub"
|
||||
msgstr "Přejít na GitHub"
|
||||
|
||||
#: qt\preferences.py:24
|
||||
msgid "Czech"
|
||||
@ -1131,3 +1131,32 @@ msgstr "Vymazání seznamu"
|
||||
#: qt\search_edit.py:78
|
||||
msgid "Search..."
|
||||
msgstr "Hledat..."
|
||||
|
||||
#: qt\preferences_dialog.py:219
|
||||
msgid ""
|
||||
"These options are for advanced users or for very specific situations, most "
|
||||
"users should not have to modify these."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:225
|
||||
msgid "Include existence check after scan completion"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:227
|
||||
msgid "Ignore difference in mtime when loading cached digests"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:64
|
||||
msgid "Cancel?"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:65
|
||||
msgid "Are you sure you want to cancel? All progress will be lost."
|
||||
msgstr ""
|
||||
|
||||
#: qt\exclude_list_dialog.py:161
|
||||
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>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 ""
|
||||
|
@ -2,11 +2,12 @@
|
||||
# Robert M, 2022
|
||||
# Andrew Senetar <arsenetar@gmail.com>, 2022
|
||||
# Fuan <jcfrt@posteo.net>, 2022
|
||||
# Frederik Gschaider <frederik.gschaider@gmail.com>, 2022
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Fuan <jcfrt@posteo.net>, 2022\n"
|
||||
"Language-Team: German (https://www.transifex.com/voltaicideas/teams/116153/de/)\n"
|
||||
"Last-Translator: Frederik Gschaider <frederik.gschaider@gmail.com>, 2022\n"
|
||||
"Language-Team: German (https://app.transifex.com/voltaicideas/teams/116153/de/)\n"
|
||||
"Language: de\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
@ -974,37 +975,41 @@ msgstr "Ignoriere Dateien größer als"
|
||||
|
||||
#: qt\app.py:135 qt\app.py:293
|
||||
msgid "Clear Cache"
|
||||
msgstr ""
|
||||
msgstr "Zwischenspeicher leeren"
|
||||
|
||||
#: qt\app.py:294
|
||||
msgid ""
|
||||
"Do you really want to clear the cache? This will remove all cached file "
|
||||
"hashes and picture analysis."
|
||||
msgstr ""
|
||||
"Möchten Sie den Zwischenspeicher wirklich löschen? Dadurch werden alle "
|
||||
"zwischengespeicherten Datei-Prüfsummen und Bildanalysen entfernt."
|
||||
|
||||
#: qt\app.py:299
|
||||
msgid "Cache cleared."
|
||||
msgstr ""
|
||||
msgstr "Zwischenspeicher geleert."
|
||||
|
||||
#: qt\preferences_dialog.py:173
|
||||
msgid "Use dark style"
|
||||
msgstr ""
|
||||
msgstr "Dunklen Stil anwenden"
|
||||
|
||||
#: qt\preferences_dialog.py:241
|
||||
msgid "Profile scan operation"
|
||||
msgstr ""
|
||||
msgstr "Profil-Scanvorgang"
|
||||
|
||||
#: qt\preferences_dialog.py:242
|
||||
msgid "Profile the scan operation and save logs for optimization."
|
||||
msgstr ""
|
||||
"Erstellen Sie ein Profil des Scanvorgangs und speichern Sie die Protokolle "
|
||||
"zur Optimierung."
|
||||
|
||||
#: qt\preferences_dialog.py:246
|
||||
msgid "Logs located in: <a href=\"{}\">{}</a>"
|
||||
msgstr ""
|
||||
msgstr "Die Protokolle befinden sich in: <a href=\"{}\">{}</a>"
|
||||
|
||||
#: qt\preferences_dialog.py:291
|
||||
msgid "Debug"
|
||||
msgstr ""
|
||||
msgstr "Fehlerbehebung"
|
||||
|
||||
#: qt\about_box.py:31
|
||||
msgid "About {}"
|
||||
@ -1016,7 +1021,7 @@ msgstr "Version {}"
|
||||
|
||||
#: qt\about_box.py:49 qt\about_box.py:75
|
||||
msgid "Checking for updates..."
|
||||
msgstr ""
|
||||
msgstr "Nach Aktualisierungen suchen..."
|
||||
|
||||
#: qt\about_box.py:54
|
||||
msgid "Licensed under GPLv3"
|
||||
@ -1024,11 +1029,11 @@ msgstr "Lizenziert unter GPLv3"
|
||||
|
||||
#: qt\about_box.py:68
|
||||
msgid "No update available."
|
||||
msgstr ""
|
||||
msgstr "Keine Aktualisierung verfügbar."
|
||||
|
||||
#: qt\about_box.py:71
|
||||
msgid "New version {} available, download <a href=\"{}\">here</a>."
|
||||
msgstr ""
|
||||
msgstr "Neue Version {} verfügbar, <a href=\"{}\">hier</a> herunterladen."
|
||||
|
||||
#: qt\error_report_dialog.py:50
|
||||
msgid "Error Report"
|
||||
@ -1040,7 +1045,7 @@ msgstr "Etwas ist schief gelaufen. Wie wäre es, den Fehler zu melden?"
|
||||
|
||||
#: qt\error_report_dialog.py:60
|
||||
msgid ""
|
||||
"Error reports should be reported as Github issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"Error reports should be reported as GitHub issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"\n"
|
||||
"Please make sure to run a search for any already existing issues beforehand. Also make sure to test the very latest version available from the repository, since the bug you are experiencing might have already been patched.\n"
|
||||
"\n"
|
||||
@ -1048,7 +1053,7 @@ msgid ""
|
||||
"\n"
|
||||
"Although the application should continue to run after this error, it may be in an unstable state, so it is recommended that you restart the application."
|
||||
msgstr ""
|
||||
"Fehlerberichte sollten als Github-Probleme gemeldet werden. Sie können den obigen Fehler-Traceback kopieren und in eine neue Ausgabe einfügen.\n"
|
||||
"Fehlerberichte sollten als GitHub-Probleme gemeldet werden. Sie können den obigen Fehler-Traceback kopieren und in eine neue Ausgabe einfügen.\n"
|
||||
"\n"
|
||||
"Bitte stellen Sie sicher, dass Sie vorher nach bereits vorhandenen Problemen suchen. Stellen Sie außerdem sicher, dass Sie die neueste Version testen, die im Repository verfügbar ist, da der aufgetretene Fehler möglicherweise bereits behoben wurde.\n"
|
||||
"\n"
|
||||
@ -1057,8 +1062,8 @@ msgstr ""
|
||||
"Obwohl die Anwendung nach diesem Fehler weiterhin ausgeführt werden sollte, befindet sie sich möglicherweise in einem instabilen Zustand. Es wird daher empfohlen, die Anwendung neu zu starten."
|
||||
|
||||
#: qt\error_report_dialog.py:80
|
||||
msgid "Go to Github"
|
||||
msgstr "Geh zu Github"
|
||||
msgid "Go to GitHub"
|
||||
msgstr "Geh zu GitHub"
|
||||
|
||||
#: qt\preferences.py:24
|
||||
msgid "Czech"
|
||||
@ -1143,3 +1148,32 @@ msgstr "Liste löschen"
|
||||
#: qt\search_edit.py:78
|
||||
msgid "Search..."
|
||||
msgstr "Suche..."
|
||||
|
||||
#: qt\preferences_dialog.py:219
|
||||
msgid ""
|
||||
"These options are for advanced users or for very specific situations, most "
|
||||
"users should not have to modify these."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:225
|
||||
msgid "Include existence check after scan completion"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:227
|
||||
msgid "Ignore difference in mtime when loading cached digests"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:64
|
||||
msgid "Cancel?"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:65
|
||||
msgid "Are you sure you want to cancel? All progress will be lost."
|
||||
msgstr ""
|
||||
|
||||
#: qt\exclude_list_dialog.py:161
|
||||
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>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 ""
|
||||
|
@ -5,7 +5,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Andrew Senetar <arsenetar@gmail.com>, 2022\n"
|
||||
"Language-Team: Greek (https://www.transifex.com/voltaicideas/teams/116153/el/)\n"
|
||||
"Language-Team: Greek (https://app.transifex.com/voltaicideas/teams/116153/el/)\n"
|
||||
"Language: el\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
@ -1045,7 +1045,7 @@ msgstr "Κάτι πήγε στραβά. Μήπως να αναφερθεί το
|
||||
|
||||
#: qt\error_report_dialog.py:60
|
||||
msgid ""
|
||||
"Error reports should be reported as Github issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"Error reports should be reported as GitHub issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"\n"
|
||||
"Please make sure to run a search for any already existing issues beforehand. Also make sure to test the very latest version available from the repository, since the bug you are experiencing might have already been patched.\n"
|
||||
"\n"
|
||||
@ -1053,7 +1053,7 @@ msgid ""
|
||||
"\n"
|
||||
"Although the application should continue to run after this error, it may be in an unstable state, so it is recommended that you restart the application."
|
||||
msgstr ""
|
||||
"Οι αναφορές σφαλμάτων πρέπει να αναφέρονται ως ζητήματα Github. Μπορείτε να αντιγράψετε την ανίχνευση σφαλμάτων παραπάνω και να την επικολλήσετε σε ένα νέο ζήτημα.\n"
|
||||
"Οι αναφορές σφαλμάτων πρέπει να αναφέρονται ως ζητήματα GitHub. Μπορείτε να αντιγράψετε την ανίχνευση σφαλμάτων παραπάνω και να την επικολλήσετε σε ένα νέο ζήτημα.\n"
|
||||
"\n"
|
||||
"Βεβαιωθείτε ότι έχετε πραγματοποιήσει αναζήτηση για τυχόν υπάρχοντα ζητήματα εκ των προτέρων. Επίσης, φροντίστε να δοκιμάσετε την πιο πρόσφατη διαθέσιμη έκδοση από το αποθετήριο, καθώς το σφάλμα που αντιμετωπίζετε ενδέχεται να έχει ήδη διορθωθεί.\n"
|
||||
"\n"
|
||||
@ -1062,8 +1062,8 @@ msgstr ""
|
||||
"Παρόλο που η εφαρμογή θα πρέπει να συνεχίσει να εκτελείται μετά από αυτό το σφάλμα, ενδέχεται να βρίσκεται σε ασταθή κατάσταση, επομένως συνιστάται να κάνετε επανεκκίνηση της εφαρμογής."
|
||||
|
||||
#: qt\error_report_dialog.py:80
|
||||
msgid "Go to Github"
|
||||
msgstr "Επίσκεψη Github"
|
||||
msgid "Go to GitHub"
|
||||
msgstr "Επίσκεψη GitHub"
|
||||
|
||||
#: qt\preferences.py:24
|
||||
msgid "Czech"
|
||||
@ -1148,3 +1148,32 @@ msgstr "Εκκαθάριση λίστας"
|
||||
#: qt\search_edit.py:78
|
||||
msgid "Search..."
|
||||
msgstr "Αναζήτηση..."
|
||||
|
||||
#: qt\preferences_dialog.py:219
|
||||
msgid ""
|
||||
"These options are for advanced users or for very specific situations, most "
|
||||
"users should not have to modify these."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:225
|
||||
msgid "Include existence check after scan completion"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:227
|
||||
msgid "Ignore difference in mtime when loading cached digests"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:64
|
||||
msgid "Cancel?"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:65
|
||||
msgid "Are you sure you want to cancel? All progress will be lost."
|
||||
msgstr ""
|
||||
|
||||
#: qt\exclude_list_dialog.py:161
|
||||
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>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 ""
|
||||
|
@ -6,11 +6,11 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: IlluminatiWave, 2022\n"
|
||||
"Language-Team: Spanish (https://www.transifex.com/voltaicideas/teams/116153/es/)\n"
|
||||
"Language-Team: Spanish (https://app.transifex.com/voltaicideas/teams/116153/es/)\n"
|
||||
"Language: es\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
|
||||
|
||||
#: qt/app.py:81
|
||||
msgid "Quit"
|
||||
@ -1045,7 +1045,7 @@ msgstr "Algo salió mal. ¿Qué tal informar el error?"
|
||||
|
||||
#: qt\error_report_dialog.py:60
|
||||
msgid ""
|
||||
"Error reports should be reported as Github issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"Error reports should be reported as GitHub issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"\n"
|
||||
"Please make sure to run a search for any already existing issues beforehand. Also make sure to test the very latest version available from the repository, since the bug you are experiencing might have already been patched.\n"
|
||||
"\n"
|
||||
@ -1053,7 +1053,7 @@ msgid ""
|
||||
"\n"
|
||||
"Although the application should continue to run after this error, it may be in an unstable state, so it is recommended that you restart the application."
|
||||
msgstr ""
|
||||
"Los informes de errores deben notificarse en Problemas de Github. Puede copiar el seguimiento del error anterior y pegarlo en un nuevo número.\n"
|
||||
"Los informes de errores deben notificarse en Problemas de GitHub. Puede copiar el seguimiento del error anterior y pegarlo en un nuevo número.\n"
|
||||
"\n"
|
||||
"Asegúrese de realizar una búsqueda de los problemas ya existentes de antemano. También asegúrese de probar la última versión disponible en el repositorio, ya que es posible que el error que está experimentando ya se haya corregido.\n"
|
||||
"\n"
|
||||
@ -1062,8 +1062,8 @@ msgstr ""
|
||||
"Aunque la aplicación debería continuar ejecutándose después de este error, puede estar en un estado inestable, por lo que se recomienda que reinicie la aplicación."
|
||||
|
||||
#: qt\error_report_dialog.py:80
|
||||
msgid "Go to Github"
|
||||
msgstr "Ir a Github"
|
||||
msgid "Go to GitHub"
|
||||
msgstr "Ir a GitHub"
|
||||
|
||||
#: qt\preferences.py:24
|
||||
msgid "Czech"
|
||||
@ -1148,3 +1148,32 @@ msgstr "Limpiar lista"
|
||||
#: qt\search_edit.py:78
|
||||
msgid "Search..."
|
||||
msgstr "Búsqueda..."
|
||||
|
||||
#: qt\preferences_dialog.py:219
|
||||
msgid ""
|
||||
"These options are for advanced users or for very specific situations, most "
|
||||
"users should not have to modify these."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:225
|
||||
msgid "Include existence check after scan completion"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:227
|
||||
msgid "Ignore difference in mtime when loading cached digests"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:64
|
||||
msgid "Cancel?"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:65
|
||||
msgid "Are you sure you want to cancel? All progress will be lost."
|
||||
msgstr ""
|
||||
|
||||
#: qt\exclude_list_dialog.py:161
|
||||
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>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 ""
|
||||
|
@ -5,11 +5,11 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Fuan <jcfrt@posteo.net>, 2022\n"
|
||||
"Language-Team: French (https://www.transifex.com/voltaicideas/teams/116153/fr/)\n"
|
||||
"Language-Team: French (https://app.transifex.com/voltaicideas/teams/116153/fr/)\n"
|
||||
"Language: fr\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
|
||||
|
||||
#: qt/app.py:81
|
||||
msgid "Quit"
|
||||
@ -1033,7 +1033,7 @@ msgstr "Un problème est survenu. Rapporter l'erreur?"
|
||||
|
||||
#: qt\error_report_dialog.py:60
|
||||
msgid ""
|
||||
"Error reports should be reported as Github issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"Error reports should be reported as GitHub issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"\n"
|
||||
"Please make sure to run a search for any already existing issues beforehand. Also make sure to test the very latest version available from the repository, since the bug you are experiencing might have already been patched.\n"
|
||||
"\n"
|
||||
@ -1041,7 +1041,7 @@ msgid ""
|
||||
"\n"
|
||||
"Although the application should continue to run after this error, it may be in an unstable state, so it is recommended that you restart the application."
|
||||
msgstr ""
|
||||
"Les rapports d'erreur doivent être envoyé via les tickets Github. Vous pouvez copier l'historique d'erreur ci-dessus et le coller dans un nouveau ticket.\n"
|
||||
"Les rapports d'erreur doivent être envoyé via les tickets GitHub. Vous pouvez copier l'historique d'erreur ci-dessus et le coller dans un nouveau ticket.\n"
|
||||
"\n"
|
||||
"Veuillez vous assurer auparavant d'avoir fait une recherche pour un ticket similaire. Assurez-vous aussi d'avoir testé la toute dernière version disponible depuis le dépôt car le bug que vous avez rencontré a peut-être déjà été corrigé. \n"
|
||||
"\n"
|
||||
@ -1050,8 +1050,8 @@ msgstr ""
|
||||
" Même si cette application continue de fonctionner après cette erreur, elle peut être dans un état instable, et il est donc recommandé de relancer l'application."
|
||||
|
||||
#: qt\error_report_dialog.py:80
|
||||
msgid "Go to Github"
|
||||
msgstr "Aller sur Github"
|
||||
msgid "Go to GitHub"
|
||||
msgstr "Aller sur GitHub"
|
||||
|
||||
#: qt\preferences.py:24
|
||||
msgid "Czech"
|
||||
@ -1136,3 +1136,32 @@ msgstr "Vider la liste"
|
||||
#: qt\search_edit.py:78
|
||||
msgid "Search..."
|
||||
msgstr "Recherche..."
|
||||
|
||||
#: qt\preferences_dialog.py:219
|
||||
msgid ""
|
||||
"These options are for advanced users or for very specific situations, most "
|
||||
"users should not have to modify these."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:225
|
||||
msgid "Include existence check after scan completion"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:227
|
||||
msgid "Ignore difference in mtime when loading cached digests"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:64
|
||||
msgid "Cancel?"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:65
|
||||
msgid "Are you sure you want to cancel? All progress will be lost."
|
||||
msgstr ""
|
||||
|
||||
#: qt\exclude_list_dialog.py:161
|
||||
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>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 ""
|
||||
|
@ -5,7 +5,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Fuan <jcfrt@posteo.net>, 2022\n"
|
||||
"Language-Team: Armenian (https://www.transifex.com/voltaicideas/teams/116153/hy/)\n"
|
||||
"Language-Team: Armenian (https://app.transifex.com/voltaicideas/teams/116153/hy/)\n"
|
||||
"Language: hy\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
@ -1013,7 +1013,7 @@ msgstr "Ինչ որ բան այնպես չգնաց. Հաղորդել սխալը?
|
||||
|
||||
#: qt\error_report_dialog.py:60
|
||||
msgid ""
|
||||
"Error reports should be reported as Github issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"Error reports should be reported as GitHub issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"\n"
|
||||
"Please make sure to run a search for any already existing issues beforehand. Also make sure to test the very latest version available from the repository, since the bug you are experiencing might have already been patched.\n"
|
||||
"\n"
|
||||
@ -1021,7 +1021,7 @@ msgid ""
|
||||
"\n"
|
||||
"Although the application should continue to run after this error, it may be in an unstable state, so it is recommended that you restart the application."
|
||||
msgstr ""
|
||||
"Error հաշվետվությունները պետք է հրապարակվեն որպես Github հարցերի շուրջ: Կարող եք վերևում պատճենել սխալի հետևումը և տեղադրել այն նոր համարում:\n"
|
||||
"Error հաշվետվությունները պետք է հրապարակվեն որպես GitHub հարցերի շուրջ: Կարող եք վերևում պատճենել սխալի հետևումը և տեղադրել այն նոր համարում:\n"
|
||||
"\n"
|
||||
"Խնդրում ենք համոզվեք, որ նախապես փնտրեք արդեն գոյություն ունեցող ցանկացած խնդիր: Նաեւ համոզվեք, որ ստուգել են հենց վերջին տարբերակը մատչելի շտեմարան, քանի որ Bug դուք ապրում գուցե արդեն patched.\n"
|
||||
"\n"
|
||||
@ -1030,7 +1030,7 @@ msgstr ""
|
||||
"Չնայած այս սխալից հետո ծրագիրը պետք է շարունակի գործել, այն կարող է լինել անկայուն վիճակում, ուստի խորհուրդ է տրվում վերագործարկել ծրագիրը:"
|
||||
|
||||
#: qt\error_report_dialog.py:80
|
||||
msgid "Go to Github"
|
||||
msgid "Go to GitHub"
|
||||
msgstr "Գնացեք Գիթուբ"
|
||||
|
||||
#: qt\preferences.py:24
|
||||
@ -1116,3 +1116,32 @@ msgstr "Մաքրել ցանկը"
|
||||
#: qt\search_edit.py:78
|
||||
msgid "Search..."
|
||||
msgstr "Որոնել..."
|
||||
|
||||
#: qt\preferences_dialog.py:219
|
||||
msgid ""
|
||||
"These options are for advanced users or for very specific situations, most "
|
||||
"users should not have to modify these."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:225
|
||||
msgid "Include existence check after scan completion"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:227
|
||||
msgid "Ignore difference in mtime when loading cached digests"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:64
|
||||
msgid "Cancel?"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:65
|
||||
msgid "Are you sure you want to cancel? All progress will be lost."
|
||||
msgstr ""
|
||||
|
||||
#: qt\exclude_list_dialog.py:161
|
||||
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>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 ""
|
||||
|
@ -1,27 +1,27 @@
|
||||
# Translators:
|
||||
# Andrew Senetar <arsenetar@gmail.com>, 2021
|
||||
# Fuan <jcfrt@posteo.net>, 2021
|
||||
# Emanuele, 2021
|
||||
# Andrew Senetar <arsenetar@gmail.com>, 2022
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Emanuele, 2021\n"
|
||||
"Language-Team: Italian (https://www.transifex.com/voltaicideas/teams/116153/it/)\n"
|
||||
"Last-Translator: Andrew Senetar <arsenetar@gmail.com>, 2022\n"
|
||||
"Language-Team: Italian (https://app.transifex.com/voltaicideas/teams/116153/it/)\n"
|
||||
"Language: it\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
|
||||
|
||||
#: core\app.py:42
|
||||
#: core\app.py:44
|
||||
msgid "There are no marked duplicates. Nothing has been done."
|
||||
msgstr "Non ci sono duplicati marcati. Nessuna operazione è stata completata."
|
||||
|
||||
#: core\app.py:43
|
||||
#: core\app.py:45
|
||||
msgid "There are no selected duplicates. Nothing has been done."
|
||||
msgstr ""
|
||||
"Non ci sono duplicati selezionati. Nessuna operazione è stata completata."
|
||||
|
||||
#: core\app.py:44
|
||||
#: core\app.py:46
|
||||
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?"
|
||||
@ -29,27 +29,27 @@ msgstr ""
|
||||
"Stai per aprire molti file contemporaneamente. A seconda di quale programma "
|
||||
"li aprirà, potrebbe crearsi un bel casino. Vuoi continuare?"
|
||||
|
||||
#: core\app.py:71
|
||||
#: core\app.py:73
|
||||
msgid "Scanning for duplicates"
|
||||
msgstr "Scansione per i duplicati"
|
||||
|
||||
#: core\app.py:72
|
||||
#: core\app.py:74
|
||||
msgid "Loading"
|
||||
msgstr "Caricamento"
|
||||
|
||||
#: core\app.py:73
|
||||
#: core\app.py:75
|
||||
msgid "Moving"
|
||||
msgstr "Spostamento"
|
||||
|
||||
#: core\app.py:74
|
||||
#: core\app.py:76
|
||||
msgid "Copying"
|
||||
msgstr "Copia in corso"
|
||||
|
||||
#: core\app.py:75
|
||||
#: core\app.py:77
|
||||
msgid "Sending to Trash"
|
||||
msgstr "Spostamento nel cestino"
|
||||
|
||||
#: core\app.py:289
|
||||
#: core\app.py:293
|
||||
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,39 +57,39 @@ msgstr ""
|
||||
"Un'azione precedente è ancora in corso. Non puoi cominciarne una nuova. "
|
||||
"Aspetta qualche secondo e quindi riprova."
|
||||
|
||||
#: core\app.py:300
|
||||
#: core\app.py:304
|
||||
msgid "No duplicates found."
|
||||
msgstr "Non sono stati trovati dei duplicati."
|
||||
|
||||
#: core\app.py:315
|
||||
#: core\app.py:319
|
||||
msgid "All marked files were copied successfully."
|
||||
msgstr "Tutti i file marcati sono stati copiati correttamente."
|
||||
|
||||
#: core\app.py:317
|
||||
#: core\app.py:321
|
||||
msgid "All marked files were moved successfully."
|
||||
msgstr "Tutti i file marcati sono stati spostati correttamente."
|
||||
|
||||
#: core\app.py:319
|
||||
#: core\app.py:323
|
||||
msgid "All marked files were deleted successfully."
|
||||
msgstr "Tutti i file marcati sono stati cancellati correttamente."
|
||||
|
||||
#: core\app.py:321
|
||||
#: core\app.py:325
|
||||
msgid "All marked files were successfully sent to Trash."
|
||||
msgstr "Tutti i file marcati sono stati spostati nel cestino."
|
||||
|
||||
#: core\app.py:326
|
||||
#: core\app.py:330
|
||||
msgid "Could not load file: {}"
|
||||
msgstr "Impossibile caricare il file: {}"
|
||||
|
||||
#: core\app.py:382
|
||||
#: core\app.py:386
|
||||
msgid "'{}' already is in the list."
|
||||
msgstr "'{}' è già nella lista."
|
||||
|
||||
#: core\app.py:384
|
||||
#: core\app.py:388
|
||||
msgid "'{}' does not exist."
|
||||
msgstr "'{}' non esiste."
|
||||
|
||||
#: core\app.py:392
|
||||
#: core\app.py:396
|
||||
msgid ""
|
||||
"All selected %d matches are going to be ignored in all subsequent scans. "
|
||||
"Continue?"
|
||||
@ -97,60 +97,60 @@ msgstr ""
|
||||
"Tutti i %d elementi che coincidono verranno ignorati in tutte le scansioni "
|
||||
"successive. Continuare?"
|
||||
|
||||
#: core\app.py:469
|
||||
#: core\app.py:473
|
||||
msgid "Select a directory to copy marked files to"
|
||||
msgstr "Seleziona una directory in cui desideri copiare i file contrassegnati"
|
||||
|
||||
#: core\app.py:471
|
||||
#: core\app.py:475
|
||||
msgid "Select a directory to move marked files to"
|
||||
msgstr ""
|
||||
"Seleziona una directory in cui desideri spostare i file contrassegnati"
|
||||
|
||||
#: core\app.py:510
|
||||
#: core\app.py:514
|
||||
msgid "Select a destination for your exported CSV"
|
||||
msgstr "Seleziona una destinazione per il file CSV"
|
||||
|
||||
#: core\app.py:516 core\app.py:771 core\app.py:781
|
||||
#: core\app.py:520 core\app.py:781 core\app.py:791
|
||||
msgid "Couldn't write to file: {}"
|
||||
msgstr "Impossibile modificare il file: {}"
|
||||
|
||||
#: core\app.py:539
|
||||
#: core\app.py:543
|
||||
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:695 core\app.py:707
|
||||
#: core\app.py:705 core\app.py:717
|
||||
msgid "You are about to remove %d files from results. Continue?"
|
||||
msgstr "Stai per rimuovere %d file dai risultati. Continuare?"
|
||||
|
||||
#: core\app.py:743
|
||||
#: core\app.py:753
|
||||
msgid "{} duplicate groups were changed by the re-prioritization."
|
||||
msgstr "{} gruppi duplicati sono stati cambiati dalla nuova priorirità"
|
||||
|
||||
#: core\app.py:790
|
||||
#: core\app.py:801
|
||||
msgid "The selected directories contain no scannable file."
|
||||
msgstr "Le cartelle selezionate non contengono file da scansionare."
|
||||
|
||||
#: core\app.py:803
|
||||
#: core\app.py:817
|
||||
msgid "Collecting files to scan"
|
||||
msgstr "Raccolta file da scansionare"
|
||||
|
||||
#: core\app.py:850
|
||||
#: core\app.py:867
|
||||
msgid "%s (%d discarded)"
|
||||
msgstr "%s (%d scartati)"
|
||||
|
||||
#: core\directories.py:191
|
||||
#: core\directories.py:190
|
||||
msgid "Collected {} files to scan"
|
||||
msgstr "Raccolti {} file da scansionare"
|
||||
|
||||
#: core\directories.py:207
|
||||
#: core\directories.py:206
|
||||
msgid "Collected {} folders to scan"
|
||||
msgstr "Raccolte {} cartelle da scansionare"
|
||||
|
||||
#: core\engine.py:27
|
||||
msgid "%d matches found from %d groups"
|
||||
msgstr "%d corrispondeze trovate da %d gruppi"
|
||||
msgstr "%d corrispondenze trovate da %d gruppi"
|
||||
|
||||
#: core\gui\deletion_options.py:71
|
||||
msgid "You are sending {} file(s) to the Trash."
|
||||
@ -214,35 +214,35 @@ msgstr "Timestamp EXIF"
|
||||
msgid "None"
|
||||
msgstr "Nessuno"
|
||||
|
||||
#: core\prioritize.py:100
|
||||
#: core\prioritize.py:102
|
||||
msgid "Ends with number"
|
||||
msgstr "Termina con un numero"
|
||||
|
||||
#: core\prioritize.py:101
|
||||
#: core\prioritize.py:103
|
||||
msgid "Doesn't end with number"
|
||||
msgstr "Non termina con un numero"
|
||||
|
||||
#: core\prioritize.py:102
|
||||
#: core\prioritize.py:104
|
||||
msgid "Longest"
|
||||
msgstr "Più lungo"
|
||||
|
||||
#: core\prioritize.py:103
|
||||
#: core\prioritize.py:105
|
||||
msgid "Shortest"
|
||||
msgstr "Più corto"
|
||||
|
||||
#: core\prioritize.py:140
|
||||
#: core\prioritize.py:142
|
||||
msgid "Highest"
|
||||
msgstr "Il più alto"
|
||||
|
||||
#: core\prioritize.py:140
|
||||
#: core\prioritize.py:142
|
||||
msgid "Lowest"
|
||||
msgstr "Il più basso"
|
||||
|
||||
#: core\prioritize.py:169
|
||||
#: core\prioritize.py:171
|
||||
msgid "Newest"
|
||||
msgstr "Il più nuovo"
|
||||
|
||||
#: core\prioritize.py:169
|
||||
#: core\prioritize.py:171
|
||||
msgid "Oldest"
|
||||
msgstr "Il più vecchio"
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Giovanni, 2022\n"
|
||||
"Language-Team: Italian (https://www.transifex.com/voltaicideas/teams/116153/it/)\n"
|
||||
"Language-Team: Italian (https://app.transifex.com/voltaicideas/teams/116153/it/)\n"
|
||||
"Language: it\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
@ -1049,7 +1049,7 @@ msgstr "Qualcosa è andato storto. Che ne dici di segnalare l'errore?"
|
||||
|
||||
#: qt\error_report_dialog.py:60
|
||||
msgid ""
|
||||
"Error reports should be reported as Github issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"Error reports should be reported as GitHub issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"\n"
|
||||
"Please make sure to run a search for any already existing issues beforehand. Also make sure to test the very latest version available from the repository, since the bug you are experiencing might have already been patched.\n"
|
||||
"\n"
|
||||
@ -1057,7 +1057,7 @@ msgid ""
|
||||
"\n"
|
||||
"Although the application should continue to run after this error, it may be in an unstable state, so it is recommended that you restart the application."
|
||||
msgstr ""
|
||||
"I rapporti di errore dovrebbero essere segnalati come problemi di Github. Puoi copiare il traceback degli errori sopra e incollarlo in un nuovo numero.\n"
|
||||
"I rapporti di errore dovrebbero essere segnalati come problemi di GitHub. Puoi copiare il traceback degli errori sopra e incollarlo in un nuovo numero.\n"
|
||||
"\n"
|
||||
"Assicurati di eseguire prima una ricerca per eventuali problemi già esistenti. Assicurati anche di testare l'ultima versione disponibile dal repository, poiché il bug che stai riscontrando potrebbe essere già stato corretto.\n"
|
||||
"\n"
|
||||
@ -1066,8 +1066,8 @@ msgstr ""
|
||||
"Sebbene l'applicazione debba continuare a essere eseguita dopo questo errore, potrebbe essere in uno stato instabile, quindi si consiglia di riavviare l'applicazione."
|
||||
|
||||
#: qt\error_report_dialog.py:80
|
||||
msgid "Go to Github"
|
||||
msgstr "Apri in Github"
|
||||
msgid "Go to GitHub"
|
||||
msgstr "Apri in GitHub"
|
||||
|
||||
#: qt\preferences.py:24
|
||||
msgid "Czech"
|
||||
@ -1152,3 +1152,32 @@ msgstr "Cancellare l'elenco"
|
||||
#: qt\search_edit.py:78
|
||||
msgid "Search..."
|
||||
msgstr "Ricerca..."
|
||||
|
||||
#: qt\preferences_dialog.py:219
|
||||
msgid ""
|
||||
"These options are for advanced users or for very specific situations, most "
|
||||
"users should not have to modify these."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:225
|
||||
msgid "Include existence check after scan completion"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:227
|
||||
msgid "Ignore difference in mtime when loading cached digests"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:64
|
||||
msgid "Cancel?"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:65
|
||||
msgid "Are you sure you want to cancel? All progress will be lost."
|
||||
msgstr ""
|
||||
|
||||
#: qt\exclude_list_dialog.py:161
|
||||
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>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 ""
|
||||
|
@ -5,7 +5,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Fuan <jcfrt@posteo.net>, 2022\n"
|
||||
"Language-Team: Japanese (https://www.transifex.com/voltaicideas/teams/116153/ja/)\n"
|
||||
"Language-Team: Japanese (https://app.transifex.com/voltaicideas/teams/116153/ja/)\n"
|
||||
"Language: ja\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
@ -1017,7 +1017,7 @@ msgstr "不明な理由により失敗しました。問題を報告しません
|
||||
|
||||
#: qt\error_report_dialog.py:60
|
||||
msgid ""
|
||||
"Error reports should be reported as Github issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"Error reports should be reported as GitHub issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"\n"
|
||||
"Please make sure to run a search for any already existing issues beforehand. Also make sure to test the very latest version available from the repository, since the bug you are experiencing might have already been patched.\n"
|
||||
"\n"
|
||||
@ -1025,7 +1025,7 @@ msgid ""
|
||||
"\n"
|
||||
"Although the application should continue to run after this error, it may be in an unstable state, so it is recommended that you restart the application."
|
||||
msgstr ""
|
||||
"エラーレポートはGithubの問題として報告する必要があります。 上記のエラートレースバックをコピーして、新しい問題に貼り付けることができます。\n"
|
||||
"エラーレポートはGitHubの問題として報告する必要があります。 上記のエラートレースバックをコピーして、新しい問題に貼り付けることができます。\n"
|
||||
"\n"
|
||||
"事前に既存の問題を検索してください。 また、発生しているバグにはすでにパッチが適用されている可能性があるため、リポジトリから入手できる最新バージョンをテストしてください。\n"
|
||||
"\n"
|
||||
@ -1034,8 +1034,8 @@ msgstr ""
|
||||
"このエラーの後もアプリケーションは実行を継続するはずですが、不安定な状態になっている可能性があるため、アプリケーションを再起動することをお勧めします。"
|
||||
|
||||
#: qt\error_report_dialog.py:80
|
||||
msgid "Go to Github"
|
||||
msgstr "Githubに移動"
|
||||
msgid "Go to GitHub"
|
||||
msgstr "GitHubに移動"
|
||||
|
||||
#: qt\preferences.py:24
|
||||
msgid "Czech"
|
||||
@ -1120,3 +1120,32 @@ msgstr "リストをクリア"
|
||||
#: qt\search_edit.py:78
|
||||
msgid "Search..."
|
||||
msgstr "探索..."
|
||||
|
||||
#: qt\preferences_dialog.py:219
|
||||
msgid ""
|
||||
"These options are for advanced users or for very specific situations, most "
|
||||
"users should not have to modify these."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:225
|
||||
msgid "Include existence check after scan completion"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:227
|
||||
msgid "Ignore difference in mtime when loading cached digests"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:64
|
||||
msgid "Cancel?"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:65
|
||||
msgid "Are you sure you want to cancel? All progress will be lost."
|
||||
msgstr ""
|
||||
|
||||
#: qt\exclude_list_dialog.py:161
|
||||
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>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 ""
|
||||
|
@ -5,7 +5,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Sangdon Lim, 2022\n"
|
||||
"Language-Team: Korean (https://www.transifex.com/voltaicideas/teams/116153/ko/)\n"
|
||||
"Language-Team: Korean (https://app.transifex.com/voltaicideas/teams/116153/ko/)\n"
|
||||
"Language: ko\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
@ -18,7 +18,7 @@ msgstr "파일 경로"
|
||||
|
||||
#: core\gui\problem_table.py:19
|
||||
msgid "Error Message"
|
||||
msgstr "에러 메시지"
|
||||
msgstr "오류 메시지"
|
||||
|
||||
#: core\me\prioritize.py:23
|
||||
msgid "Duration"
|
||||
@ -26,16 +26,16 @@ msgstr "길이"
|
||||
|
||||
#: core\me\prioritize.py:30 core\me\result_table.py:23
|
||||
msgid "Bitrate"
|
||||
msgstr "비트레이트"
|
||||
msgstr "비트전송률"
|
||||
|
||||
#: core\me\prioritize.py:37
|
||||
msgid "Samplerate"
|
||||
msgstr "샘플레이트"
|
||||
msgstr "샘플전송률"
|
||||
|
||||
#: core\me\result_table.py:19 core\pe\result_table.py:19 core\prioritize.py:94
|
||||
#: core\se\result_table.py:19
|
||||
msgid "Filename"
|
||||
msgstr "폴더명"
|
||||
msgstr "파일 이름"
|
||||
|
||||
#: core\me\result_table.py:20 core\pe\result_table.py:20 core\prioritize.py:75
|
||||
#: core\se\result_table.py:20
|
||||
@ -52,7 +52,7 @@ msgstr "시간"
|
||||
|
||||
#: core\me\result_table.py:24
|
||||
msgid "Sample Rate"
|
||||
msgstr "샘플레이트"
|
||||
msgstr "샘플전송률"
|
||||
|
||||
#: core\me\result_table.py:25 core\pe\result_table.py:22 core\prioritize.py:65
|
||||
#: core\se\result_table.py:22
|
||||
@ -95,11 +95,11 @@ msgstr "주석"
|
||||
#: core\me\result_table.py:34 core\pe\result_table.py:26
|
||||
#: core\se\result_table.py:24
|
||||
msgid "Match %"
|
||||
msgstr "일치정도"
|
||||
msgstr "일치율%"
|
||||
|
||||
#: core\me\result_table.py:35 core\se\result_table.py:25
|
||||
msgid "Words Used"
|
||||
msgstr "사용된 단어수"
|
||||
msgstr "단어 목록"
|
||||
|
||||
#: core\me\result_table.py:36 core\pe\result_table.py:27
|
||||
#: core\se\result_table.py:26
|
||||
@ -108,7 +108,7 @@ msgstr "중복파일 갯수"
|
||||
|
||||
#: core\pe\prioritize.py:23 core\pe\result_table.py:23
|
||||
msgid "Dimensions"
|
||||
msgstr "치수"
|
||||
msgstr "가로세로 크기"
|
||||
|
||||
#: core\pe\result_table.py:21 core\se\result_table.py:21
|
||||
msgid "Size (KB)"
|
||||
|
@ -6,7 +6,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Sangdon Lim, 2022\n"
|
||||
"Language-Team: Korean (https://www.transifex.com/voltaicideas/teams/116153/ko/)\n"
|
||||
"Language-Team: Korean (https://app.transifex.com/voltaicideas/teams/116153/ko/)\n"
|
||||
"Language: ko\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
@ -14,11 +14,11 @@ msgstr ""
|
||||
|
||||
#: core\app.py:44
|
||||
msgid "There are no marked duplicates. Nothing has been done."
|
||||
msgstr "표시된 중복 항목이 없습니다. 아무것도하지 않았습니다."
|
||||
msgstr "아무 파일도 마크되지 않아 작업을 수행하지 않았습니다."
|
||||
|
||||
#: core\app.py:45
|
||||
msgid "There are no selected duplicates. Nothing has been done."
|
||||
msgstr "선택한 중복 항목이 없습니다. 아무것도하지 않았습니다."
|
||||
msgstr "아무 파일도 선택되지 않아 작업을 수행하지 않았습니다."
|
||||
|
||||
#: core\app.py:46
|
||||
msgid ""
|
||||
@ -28,11 +28,11 @@ msgstr "한 번에 많은 파일을 열려고 합니다. 시스템 설정에 따
|
||||
|
||||
#: core\app.py:73
|
||||
msgid "Scanning for duplicates"
|
||||
msgstr "중복 검색"
|
||||
msgstr "중복 파일 검색 중"
|
||||
|
||||
#: core\app.py:74
|
||||
msgid "Loading"
|
||||
msgstr "불러오는중"
|
||||
msgstr "불러오는 중"
|
||||
|
||||
#: core\app.py:75
|
||||
msgid "Moving"
|
||||
@ -46,87 +46,87 @@ msgstr "복사중"
|
||||
msgid "Sending to Trash"
|
||||
msgstr "휴지통으로 보내기"
|
||||
|
||||
#: core\app.py:291
|
||||
#: core\app.py:293
|
||||
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:302
|
||||
#: core\app.py:304
|
||||
msgid "No duplicates found."
|
||||
msgstr "중복 파일이 없습니다."
|
||||
|
||||
#: core\app.py:317
|
||||
msgid "All marked files were copied successfully."
|
||||
msgstr "표시된 모든 파일이 성공적으로 복사되었습니다."
|
||||
|
||||
#: core\app.py:319
|
||||
msgid "All marked files were moved successfully."
|
||||
msgstr "표시된 모든 파일이 성공적으로 이동되었습니다."
|
||||
msgid "All marked files were copied successfully."
|
||||
msgstr "마크된 모든 파일이 성공적으로 복사되었습니다."
|
||||
|
||||
#: core\app.py:321
|
||||
msgid "All marked files were deleted successfully."
|
||||
msgstr "표시된 모든 파일이 성공적으로 제거되었습니다."
|
||||
msgid "All marked files were moved successfully."
|
||||
msgstr "마크된 모든 파일이 성공적으로 이동되었습니다."
|
||||
|
||||
#: core\app.py:323
|
||||
msgid "All marked files were deleted successfully."
|
||||
msgstr "마크된 모든 파일이 성공적으로 삭제되었습니다."
|
||||
|
||||
#: core\app.py:325
|
||||
msgid "All marked files were successfully sent to Trash."
|
||||
msgstr "표시된 모든 파일이 성공적으로 휴지통으로 전송되었습니다."
|
||||
msgstr "마크된 모든 파일을 휴지통으로 보냈습니다."
|
||||
|
||||
#: core\app.py:328
|
||||
#: core\app.py:330
|
||||
msgid "Could not load file: {}"
|
||||
msgstr "파일을로드 할 수 없습니다 : {}"
|
||||
msgstr "파일을 불러올 수 없습니다: {}"
|
||||
|
||||
#: core\app.py:384
|
||||
#: core\app.py:386
|
||||
msgid "'{}' already is in the list."
|
||||
msgstr "'{}' 는 이미 목록에 있습니다."
|
||||
|
||||
#: core\app.py:386
|
||||
#: core\app.py:388
|
||||
msgid "'{}' does not exist."
|
||||
msgstr "'{}' 가 존재하지 않습니다."
|
||||
|
||||
#: core\app.py:394
|
||||
#: core\app.py:396
|
||||
msgid ""
|
||||
"All selected %d matches are going to be ignored in all subsequent scans. "
|
||||
"Continue?"
|
||||
msgstr "선택된 %d개의 일치 항목은 모든 후속 검색에서 무시됩니다. 계속하다?"
|
||||
|
||||
#: core\app.py:471
|
||||
msgid "Select a directory to copy marked files to"
|
||||
msgstr "표시된 파일을 복사 할 디렉토리를 선택하십시오"
|
||||
msgstr "선택한 %d개 항목을 검색에서 무시합니다. 진행하시겠습니까?"
|
||||
|
||||
#: core\app.py:473
|
||||
msgid "Select a directory to copy marked files to"
|
||||
msgstr "마크하신 파일을 복사할 경로를 선택하세요:"
|
||||
|
||||
#: core\app.py:475
|
||||
msgid "Select a directory to move marked files to"
|
||||
msgstr "표시된 파일을 이동할 디렉토리를 선택하십시오"
|
||||
msgstr "마크하신 파일을 이동할 경로를 선택하세요:"
|
||||
|
||||
#: core\app.py:512
|
||||
#: core\app.py:514
|
||||
msgid "Select a destination for your exported CSV"
|
||||
msgstr "내 보낸 CSV의 대상을 선택하십시오"
|
||||
msgstr "CSV 파일의 저장 경로를 지정해주세요"
|
||||
|
||||
#: core\app.py:518 core\app.py:773 core\app.py:783
|
||||
#: core\app.py:520 core\app.py:781 core\app.py:791
|
||||
msgid "Couldn't write to file: {}"
|
||||
msgstr "파일에 쓸 수 없습니다 : {}"
|
||||
|
||||
#: core\app.py:541
|
||||
#: core\app.py:543
|
||||
msgid "You have no custom command set up. Set it up in your preferences."
|
||||
msgstr "사용자 지정 명령을 설정하지 않았습니다. 기본 설정에서 설정하십시오."
|
||||
|
||||
#: core\app.py:697 core\app.py:709
|
||||
#: core\app.py:705 core\app.py:717
|
||||
msgid "You are about to remove %d files from results. Continue?"
|
||||
msgstr "결과에서 %d 개의 파일을 제거하려고합니다. 실행할까요?"
|
||||
msgstr "결과에서 %d 개의 파일을 제거하려고합니다. 실행하시겠습니까?"
|
||||
|
||||
#: core\app.py:745
|
||||
#: core\app.py:753
|
||||
msgid "{} duplicate groups were changed by the re-prioritization."
|
||||
msgstr "{} 개의 중복 그룹이 우선 순위 재 지정으로 변경되었습니다."
|
||||
|
||||
#: core\app.py:792
|
||||
#: core\app.py:801
|
||||
msgid "The selected directories contain no scannable file."
|
||||
msgstr "선택한 디렉토리에 스캔 가능한 파일이 없습니다."
|
||||
msgstr "선택한 경로에 스캔 가능한 파일이 없습니다."
|
||||
|
||||
#: core\app.py:808
|
||||
#: core\app.py:817
|
||||
msgid "Collecting files to scan"
|
||||
msgstr "스캔 할 파일 수집"
|
||||
msgstr "스캔 가능 파일 수집중"
|
||||
|
||||
#: core\app.py:858
|
||||
#: core\app.py:867
|
||||
msgid "%s (%d discarded)"
|
||||
msgstr "%s (%d 폐기)"
|
||||
|
||||
@ -176,7 +176,7 @@ msgstr "내용"
|
||||
|
||||
#: core\pe\matchblock.py:72
|
||||
msgid "Analyzed %d/%d pictures"
|
||||
msgstr "%d/%d 사진 분석"
|
||||
msgstr "사진 %d/%d 개 분석됨"
|
||||
|
||||
#: core\pe\matchblock.py:177
|
||||
msgid "Performed %d/%d chunk matches"
|
||||
@ -220,7 +220,7 @@ msgstr "최단"
|
||||
|
||||
#: core\prioritize.py:142
|
||||
msgid "Highest"
|
||||
msgstr "제일 높은"
|
||||
msgstr "최고"
|
||||
|
||||
#: core\prioritize.py:142
|
||||
msgid "Lowest"
|
||||
@ -236,7 +236,7 @@ msgstr "가장 오래된"
|
||||
|
||||
#: core\results.py:134
|
||||
msgid "%d / %d (%s / %s) duplicates marked."
|
||||
msgstr "%d / %d (%s / %s) 개의 중복이 표시되었습니다."
|
||||
msgstr "%d / %d (%s / %s) 개의 중복 파일을 마크했습니다."
|
||||
|
||||
#: core\results.py:141
|
||||
msgid " filter: %s"
|
||||
|
@ -6,7 +6,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Sangdon Lim, 2022\n"
|
||||
"Language-Team: Korean (https://www.transifex.com/voltaicideas/teams/116153/ko/)\n"
|
||||
"Language-Team: Korean (https://app.transifex.com/voltaicideas/teams/116153/ko/)\n"
|
||||
"Language: ko\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
@ -19,7 +19,7 @@ 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
|
||||
@ -82,7 +82,7 @@ msgstr "(미지원)"
|
||||
|
||||
#: qt/deletion_options.py:49 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Directly delete files"
|
||||
msgstr "즉시 삭제"
|
||||
msgstr "파일 직접삭제"
|
||||
|
||||
#: qt/deletion_options.py:51 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid ""
|
||||
@ -104,12 +104,12 @@ 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..."
|
||||
@ -159,15 +159,15 @@ msgstr "표준"
|
||||
|
||||
#: qt/directories_dialog.py:128 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Scan Type:"
|
||||
msgstr "스캔 유형 :"
|
||||
msgstr "스캔 방식:"
|
||||
|
||||
#: qt/directories_dialog.py:135
|
||||
msgid "More Options"
|
||||
msgstr "더 많은 옵션"
|
||||
msgstr "설정"
|
||||
|
||||
#: qt/directories_dialog.py:139 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Select folders to scan and press \"Scan\"."
|
||||
msgstr "스캔 할 폴더를 선택하고 \"스캔\"을 누르십시오."
|
||||
msgstr "스캔할 폴더들을 목록에 추가하고 오른쪽 아래의 \"스캔\" 버튼을 누르십시오."
|
||||
|
||||
#: qt/directories_dialog.py:163 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Load Results"
|
||||
@ -183,7 +183,7 @@ msgstr "저장되지 않은 결과"
|
||||
|
||||
#: qt/directories_dialog.py:231 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "You have unsaved results, do you really want to quit?"
|
||||
msgstr "저장되지 않은 결과가 있습니다. 종료하시겠습니까?"
|
||||
msgstr "결과를 저장하지않고 종료하시겠습니까?"
|
||||
|
||||
#: qt/directories_dialog.py:239 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Select a folder to add to the scanning list"
|
||||
@ -191,7 +191,7 @@ msgstr "스캔 목록에 추가 할 폴더를 선택하십시오"
|
||||
|
||||
#: qt/directories_dialog.py:266 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Select a results file to load"
|
||||
msgstr "로드 할 결과 파일을 선택하십시오"
|
||||
msgstr "불러올 결과 파일을 선택하십시오"
|
||||
|
||||
#: qt/directories_dialog.py:267
|
||||
msgid "All Files (*.*)"
|
||||
@ -207,7 +207,7 @@ msgstr "새 스캔 시작"
|
||||
|
||||
#: qt/directories_dialog.py:279 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "You have unsaved results, do you really want to continue?"
|
||||
msgstr "저장되지 않은 결과가 있습니다. 계속 하시겠습니까?"
|
||||
msgstr "결과를 저장하지않고 진행하시겠습니까?"
|
||||
|
||||
#: qt/directories_model.py:23 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Name"
|
||||
@ -219,7 +219,7 @@ msgstr "상태"
|
||||
|
||||
#: qt/directories_model.py:24 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Excluded"
|
||||
msgstr "제외된"
|
||||
msgstr "제외"
|
||||
|
||||
#: qt/directories_model.py:24 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Normal"
|
||||
@ -242,11 +242,11 @@ msgstr "닫기"
|
||||
#: 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 "세부사항"
|
||||
msgstr "파일 속성"
|
||||
|
||||
#: qt/me/preferences_dialog.py:30 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Tags to scan:"
|
||||
msgstr "스캔 할 태그 :"
|
||||
msgstr "스캔 태그 :"
|
||||
|
||||
#: qt/me/preferences_dialog.py:36 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Track"
|
||||
@ -275,17 +275,17 @@ msgstr "년"
|
||||
#: qt/me/preferences_dialog.py:50 qt/se/preferences_dialog.py:30
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Word weighting"
|
||||
msgstr "단어 가중치"
|
||||
msgstr "파일 이름 중 긴 단어에 가중치 적용"
|
||||
|
||||
#: qt/me/preferences_dialog.py:52 qt/se/preferences_dialog.py:32
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Match similar words"
|
||||
msgstr "유사한 단어와 일치"
|
||||
msgstr "파일 이름 중 비슷한 단어도 중복으로 허용"
|
||||
|
||||
#: 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 "다른 확장자의 파일도 비교에 포함"
|
||||
msgstr "확장자가 다른 파일도 중복 여부 확인"
|
||||
|
||||
#: qt/me/preferences_dialog.py:56 qt/pe/preferences_dialog.py:23
|
||||
#: qt/se/preferences_dialog.py:36 cocoa/en.lproj/Localizable.strings:0
|
||||
@ -295,7 +295,7 @@ msgstr "필터링 할 때 정규식 사용"
|
||||
#: 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 "삭제 또는 이동시 빈 폴더 제거"
|
||||
msgstr "삭제 또는 이동 후 폴더가 빈 폴더가 되면 폴더 삭제"
|
||||
|
||||
#: qt/me/preferences_dialog.py:60 qt/pe/preferences_dialog.py:27
|
||||
#: qt/se/preferences_dialog.py:59 cocoa/en.lproj/Localizable.strings:0
|
||||
@ -309,19 +309,19 @@ msgstr "디버그 모드 (다시 시작 필요)"
|
||||
|
||||
#: qt/pe/preferences_dialog.py:19 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Match pictures of different dimensions"
|
||||
msgstr "가로세로 크기가 다른 이미지도 비교"
|
||||
msgstr "가로세로 크기가 다른 이미지도 중복 여부 확인"
|
||||
|
||||
#: qt/preferences_dialog.py:43
|
||||
msgid "Filter Hardness:"
|
||||
msgstr "필터 경도 :"
|
||||
msgstr "필터 민감도:"
|
||||
|
||||
#: qt/preferences_dialog.py:69
|
||||
msgid "More Results"
|
||||
msgstr "더 많은 결과"
|
||||
msgstr "결과 더보기"
|
||||
|
||||
#: qt/preferences_dialog.py:74
|
||||
msgid "Fewer Results"
|
||||
msgstr "더 적은 결과"
|
||||
msgstr "결과 줄이기"
|
||||
|
||||
#: qt/preferences_dialog.py:81
|
||||
msgid "Font size:"
|
||||
@ -337,15 +337,15 @@ msgstr "복사 및 이동 :"
|
||||
|
||||
#: qt/preferences_dialog.py:94 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Right in destination"
|
||||
msgstr "목적지에 직접"
|
||||
msgstr "대상 폴더에"
|
||||
|
||||
#: qt/preferences_dialog.py:95 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Recreate relative path"
|
||||
msgstr "상대 경로 재생성"
|
||||
msgstr "대상 폴더를 시작으로 상대 경로를 재생성"
|
||||
|
||||
#: qt/preferences_dialog.py:96 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Recreate absolute path"
|
||||
msgstr "절대 경로 재생성"
|
||||
msgstr "대상 폴더를 시작으로 절대 경로를 재생성"
|
||||
|
||||
#: qt/preferences_dialog.py:99
|
||||
msgid "Custom Command (arguments: %d for dupe, %r for ref):"
|
||||
@ -353,7 +353,7 @@ msgstr "사용자 지정 명령 (인수: %d 은 중복, %r 은 참조):"
|
||||
|
||||
#: qt/preferences_dialog.py:174
|
||||
msgid "dupeGuru has to restart for language changes to take effect."
|
||||
msgstr "언어 변경 사항을 적용하려면 dupeGuru를 다시 시작해야합니다."
|
||||
msgstr "언어 변경은 dupeGuru의 재시작이 필요합니다."
|
||||
|
||||
#: qt/prioritize_dialog.py:75 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Re-Prioritize duplicates"
|
||||
@ -365,12 +365,12 @@ msgid ""
|
||||
" the best to these criteria to their respective group's reference position. "
|
||||
"Read the help file for more information."
|
||||
msgstr ""
|
||||
"오른쪽 상자에 기준을 추가하고 확인을 클릭하여 이러한 기준에 가장 적합한 복제를 해당 그룹의 참조 위치로 보냅니다. 자세한 정보는 도움말"
|
||||
" 파일을 읽으십시오."
|
||||
"오른쪽 박스에 기준을 추가하고 확인을 눌러 가장 기준에 해당되는 복제를 해당 그룹의 참조 위치로 보냅니다."
|
||||
" 상세한 정보는 도움말에 있습니다"
|
||||
|
||||
#: qt/problem_dialog.py:33 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Problems!"
|
||||
msgstr "문제!"
|
||||
msgstr "문제 발생!"
|
||||
|
||||
#: qt/problem_dialog.py:37 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid ""
|
||||
@ -378,17 +378,17 @@ msgid ""
|
||||
"these problems are described in the table below. Those files were not "
|
||||
"removed from your results."
|
||||
msgstr ""
|
||||
"일부 (또는 전체) 파일을 처리하는 데 문제가 있습니다. 이러한 문제의 원인은 아래 표에 설명되어 있습니다. 해당 파일은 결과에서 "
|
||||
"일부 (또는 전체) 파일을 처리하는 데 문제가 있었습니다. 문제의 원인은 아래 표에 표시 되있습니다. 문제되는 파일들은 결과에서 "
|
||||
"제거되지 않았습니다."
|
||||
|
||||
#: qt/problem_dialog.py:56
|
||||
msgid "Reveal Selected"
|
||||
msgstr "선택한 항목 표시"
|
||||
msgstr "선택 항목 표시"
|
||||
|
||||
#: 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 "행위"
|
||||
msgstr "작업"
|
||||
|
||||
#: qt/result_window.py:58 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Show Dupes Only"
|
||||
@ -396,31 +396,31 @@ msgstr "중복파일만 보기"
|
||||
|
||||
#: qt/result_window.py:59 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Show Delta Values"
|
||||
msgstr "델타 값만 보기"
|
||||
msgstr "델타 값 표시"
|
||||
|
||||
#: qt/result_window.py:60
|
||||
msgid "Send Marked to Recycle Bin..."
|
||||
msgstr "선택 항목을 휴지통으로 보내기..."
|
||||
msgstr "마크된 모든 파일을 휴지통으로 보내기"
|
||||
|
||||
#: qt/result_window.py:61 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Move Marked to..."
|
||||
msgstr "선택항목을 이동..."
|
||||
msgstr "마크된 모든 파일을 이동..."
|
||||
|
||||
#: qt/result_window.py:62 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Copy Marked to..."
|
||||
msgstr "선택항목을 복사..."
|
||||
msgstr "마크된 모든 파일을 복사..."
|
||||
|
||||
#: qt/result_window.py:63 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Remove Marked from Results"
|
||||
msgstr "결과에서 표시된 항목을 제거하다."
|
||||
msgstr "결과 목록에서 마크된 모든 파일을 제외"
|
||||
|
||||
#: qt/result_window.py:64 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Re-Prioritize Results..."
|
||||
msgstr "결과 우선 순위 재 지정..."
|
||||
msgstr "기준 파일 규칙 재설정"
|
||||
|
||||
#: qt/result_window.py:67 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Remove Selected from Results"
|
||||
msgstr "결과에서 선택한 항목 제거"
|
||||
msgstr "결과 목록에서 선택한 파일을 제외"
|
||||
|
||||
#: qt/result_window.py:71 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Add Selected to Ignore List"
|
||||
@ -428,35 +428,35 @@ msgstr "무시 목록에 선택 항목 추가"
|
||||
|
||||
#: qt/result_window.py:75 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Make Selected into Reference"
|
||||
msgstr "선택한 항목을 참조 항목으로 만들기"
|
||||
msgstr "선택한 파일을 기준 파일로 설정"
|
||||
|
||||
#: qt/result_window.py:77 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Open Selected with Default Application"
|
||||
msgstr "기본 응용 프로그램으로 선택한 항목 열기"
|
||||
msgstr "선택한 파일을 기본 앱으로 열기"
|
||||
|
||||
#: qt/result_window.py:80
|
||||
msgid "Open Containing Folder of Selected"
|
||||
msgstr "선택한 항목의 포함 폴더 열기"
|
||||
msgstr "선택한 파일의 폴더 열기"
|
||||
|
||||
#: qt/result_window.py:82 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Rename Selected"
|
||||
msgstr "선택한 이름 변경"
|
||||
msgstr "선택한 파일의 이름 변경"
|
||||
|
||||
#: qt/result_window.py:83 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Mark All"
|
||||
msgstr "모두 표시"
|
||||
msgstr "모든 파일 마크"
|
||||
|
||||
#: qt/result_window.py:84 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Mark None"
|
||||
msgstr "없음으로 표시"
|
||||
msgstr "모든 파일의 마크 해제"
|
||||
|
||||
#: qt/result_window.py:85 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Invert Marking"
|
||||
msgstr "마킹 반전"
|
||||
msgstr "마크 목록 반전"
|
||||
|
||||
#: qt/result_window.py:86 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Mark Selected"
|
||||
msgstr "선택한 항목 표시"
|
||||
msgstr "선택한 파일 마크"
|
||||
|
||||
#: qt/result_window.py:87
|
||||
msgid "Export To HTML"
|
||||
@ -476,7 +476,7 @@ msgstr "사용자 지정 명령 호출"
|
||||
|
||||
#: qt/result_window.py:102
|
||||
msgid "Mark"
|
||||
msgstr "표시"
|
||||
msgstr "마크"
|
||||
|
||||
#: qt/result_window.py:106 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Columns"
|
||||
@ -492,7 +492,7 @@ msgstr "{} 결과"
|
||||
|
||||
#: qt/result_window.py:193 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Dupes Only"
|
||||
msgstr "복제 만"
|
||||
msgstr "기준 파일 숨기기"
|
||||
|
||||
#: qt/result_window.py:194
|
||||
msgid "Delta Values"
|
||||
@ -516,7 +516,7 @@ msgstr "%@ 결과"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Action"
|
||||
msgstr "행위"
|
||||
msgstr "동작"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Add New Folder..."
|
||||
@ -564,7 +564,7 @@ msgstr "델타"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Details of Selected File"
|
||||
msgstr "선택한 파일의 세부 정보"
|
||||
msgstr "선택 파일 세부 정보"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Details Panel"
|
||||
@ -572,7 +572,7 @@ msgstr "세부 정보 패널"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Directories"
|
||||
msgstr "디렉토리"
|
||||
msgstr "경로"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "dupeGuru"
|
||||
@ -588,7 +588,7 @@ msgstr "dupeGuru 결과"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "dupeGuru Website"
|
||||
msgstr "dupeGuru 웹 사이트"
|
||||
msgstr "dupeGuru 홈페이지"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Edit"
|
||||
@ -604,7 +604,7 @@ msgstr "XHTML로 결과 내보내기"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Fewer results"
|
||||
msgstr "더 적은 결과"
|
||||
msgstr "결과 축소"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Filter"
|
||||
@ -640,7 +640,7 @@ msgstr "이보다 작은 파일 무시 :"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Load from file..."
|
||||
msgstr "파일에서로드..."
|
||||
msgstr "파일에서 불러오기..."
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Minimize"
|
||||
@ -652,7 +652,7 @@ msgstr "모드"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "More results"
|
||||
msgstr "더 많은 결과"
|
||||
msgstr "결과 더보기"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Ok"
|
||||
@ -660,7 +660,7 @@ msgstr "확인"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Paste"
|
||||
msgstr "붙여 넣다"
|
||||
msgstr "붙여넣기"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Preferences..."
|
||||
@ -668,7 +668,7 @@ msgstr "환경 설정..."
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Quick Look"
|
||||
msgstr "한눈에"
|
||||
msgstr "빠른보기"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Quit dupeGuru"
|
||||
@ -696,7 +696,7 @@ msgstr "모두 선택"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Send Marked to Trash..."
|
||||
msgstr "표시된 항목을 휴지통으로 보내기 ..."
|
||||
msgstr "마크된 파일을 휴지통으로 보내기"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Services"
|
||||
@ -712,7 +712,7 @@ msgstr "중복 스캔 시작"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "The name '%@' already exists."
|
||||
msgstr "'%@' 이름이 이미 존재합니다."
|
||||
msgstr "'%@' 의 이름이 이미 존재합니다."
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Window"
|
||||
@ -720,7 +720,7 @@ msgstr "창"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Zoom"
|
||||
msgstr "줌"
|
||||
msgstr "확대"
|
||||
|
||||
#: qt\app.py:158
|
||||
msgid "Exclusion Filters"
|
||||
@ -732,27 +732,27 @@ msgstr "스캔 결과"
|
||||
|
||||
#: qt\directories_dialog.py:95
|
||||
msgid "Load Directories..."
|
||||
msgstr "디렉토리로드 ..."
|
||||
msgstr "경로 불러오는중 ..."
|
||||
|
||||
#: qt\directories_dialog.py:96
|
||||
msgid "Save Directories..."
|
||||
msgstr "디렉토리 저장 ..."
|
||||
msgstr "경로 저장중 ..."
|
||||
|
||||
#: qt\directories_dialog.py:337
|
||||
msgid "Select a directories file to load"
|
||||
msgstr "로드 할 디렉토리 파일을 선택하십시오"
|
||||
msgstr "불러올 경로를 선택하십시오"
|
||||
|
||||
#: qt\directories_dialog.py:338
|
||||
msgid "dupeGuru Results (*.dupegurudirs)"
|
||||
msgstr "dupeguru 디렉토리 파일 (*.dupegurudirs)"
|
||||
msgstr "dupeguru 경로 파일 (*.dupegurudirs)"
|
||||
|
||||
#: qt\directories_dialog.py:347
|
||||
msgid "Select a file to save your directories to"
|
||||
msgstr "디렉토리를 저장할 파일을 선택하십시오"
|
||||
msgstr "경로를 저장할 파일을 선택하십시오"
|
||||
|
||||
#: qt\directories_dialog.py:348
|
||||
msgid "dupeGuru Directories (*.dupegurudirs)"
|
||||
msgstr "dupeguru 디렉토리 파일 (*.dupegurudirs)"
|
||||
msgstr "dupeguru 경로 파일 (*.dupegurudirs)"
|
||||
|
||||
#: qt\exclude_list_dialog.py:44
|
||||
msgid "Add"
|
||||
@ -768,11 +768,11 @@ msgstr "테스트 문자열"
|
||||
|
||||
#: qt\exclude_list_dialog.py:83
|
||||
msgid "Type a python regular expression here..."
|
||||
msgstr "여기에 파이썬 정규식을 입력하십시오 ..."
|
||||
msgstr "여기에 파이썬 정규식을 입력해주세요 ..."
|
||||
|
||||
#: qt\exclude_list_dialog.py:85
|
||||
msgid "Type a file system path or filename here..."
|
||||
msgstr "여기에 파일 시스템 경로 또는 파일 이름을 입력하십시오 ..."
|
||||
msgstr "여기에 파일 시스템 경로 또는 파일 이름을 입력해주세요 ..."
|
||||
|
||||
#: qt\exclude_list_dialog.py:152
|
||||
msgid ""
|
||||
@ -792,11 +792,11 @@ msgstr "컴파일 오류 :"
|
||||
|
||||
#: qt\pe\image_viewer.py:56
|
||||
msgid "Increase zoom"
|
||||
msgstr "줌을 증가"
|
||||
msgstr "확대 증가"
|
||||
|
||||
#: qt\pe\image_viewer.py:66
|
||||
msgid "Decrease zoom"
|
||||
msgstr "줌을 감소"
|
||||
msgstr "확대 감소"
|
||||
|
||||
#: qt\pe\image_viewer.py:71
|
||||
msgid "Ctrl+/"
|
||||
@ -812,7 +812,7 @@ msgstr "Ctrl+*"
|
||||
|
||||
#: qt\pe\image_viewer.py:86
|
||||
msgid "Best fit"
|
||||
msgstr "최고로 잘 맞는"
|
||||
msgstr "최고 일치"
|
||||
|
||||
#: qt\pe\preferences_dialog.py:49
|
||||
msgid "Picture cache mode:"
|
||||
@ -851,15 +851,15 @@ msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:172
|
||||
msgid "Use bold font for references"
|
||||
msgstr "참조 용으로 굵은 글꼴 사용"
|
||||
msgstr "기준 파일을 굵게 표시"
|
||||
|
||||
#: qt\preferences_dialog.py:176
|
||||
msgid "Reference foreground color:"
|
||||
msgstr "참조 전경색 :"
|
||||
msgstr "기준 파일 이름의 색:"
|
||||
|
||||
#: qt\preferences_dialog.py:179
|
||||
msgid "Reference background color:"
|
||||
msgstr "참조 배경색 :"
|
||||
msgstr "기준 파일 이름의 배경색:"
|
||||
|
||||
#: qt\preferences_dialog.py:182 qt\preferences_dialog.py:216
|
||||
msgid "Delta foreground color:"
|
||||
@ -914,7 +914,7 @@ msgstr "일반 인터페이스"
|
||||
|
||||
#: qt\preferences_dialog.py:176
|
||||
msgid "Result Table"
|
||||
msgstr "결과표"
|
||||
msgstr "검색 결과"
|
||||
|
||||
#: qt\preferences_dialog.py:205
|
||||
msgid "Details Window"
|
||||
@ -958,7 +958,7 @@ msgstr "캐시 제거"
|
||||
msgid ""
|
||||
"Do you really want to clear the cache? This will remove all cached file "
|
||||
"hashes and picture analysis."
|
||||
msgstr "캐시를 제거할까요? 캐시에는 파일 해시 및 이미지 분석 결과가 포함되어 있습니다."
|
||||
msgstr "캐시를 제거하시겠습니까? 캐시에는 파일 해시 및 이미지 분석 결과가 포함되어 있습니다."
|
||||
|
||||
#: qt\app.py:299
|
||||
msgid "Cache cleared."
|
||||
@ -970,15 +970,15 @@ msgstr "다크 모드 사용"
|
||||
|
||||
#: qt\preferences_dialog.py:241
|
||||
msgid "Profile scan operation"
|
||||
msgstr ""
|
||||
msgstr "프로파일 스캔 작업"
|
||||
|
||||
#: qt\preferences_dialog.py:242
|
||||
msgid "Profile the scan operation and save logs for optimization."
|
||||
msgstr ""
|
||||
msgstr "최적화를 위해 스캔 프로파일 작업과 로그를 저장합니다."
|
||||
|
||||
#: qt\preferences_dialog.py:246
|
||||
msgid "Logs located in: <a href=\"{}\">{}</a>"
|
||||
msgstr ""
|
||||
msgstr "로그 저장 경로: <a href=\"{}\">{}</a>"
|
||||
|
||||
#: qt\preferences_dialog.py:291
|
||||
msgid "Debug"
|
||||
@ -1014,11 +1014,11 @@ msgstr "오류보고"
|
||||
|
||||
#: qt\error_report_dialog.py:54
|
||||
msgid "Something went wrong. How about reporting the error?"
|
||||
msgstr "문제가 발생했습니다. 오류를보고하는 것은 어떻습니까?"
|
||||
msgstr "예상치 못한 문제가 발생했습니다. 오류 보고를 추천드립니다."
|
||||
|
||||
#: qt\error_report_dialog.py:60
|
||||
msgid ""
|
||||
"Error reports should be reported as Github issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"Error reports should be reported as GitHub issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"\n"
|
||||
"Please make sure to run a search for any already existing issues beforehand. Also make sure to test the very latest version available from the repository, since the bug you are experiencing might have already been patched.\n"
|
||||
"\n"
|
||||
@ -1026,7 +1026,7 @@ msgid ""
|
||||
"\n"
|
||||
"Although the application should continue to run after this error, it may be in an unstable state, so it is recommended that you restart the application."
|
||||
msgstr ""
|
||||
"오류 보고서는 Github 문제로보고해야합니다. 위의 오류 추적을 복사하여 새 문제에 붙여 넣을 수 있습니다.\n"
|
||||
"오류 보고서는 GitHub 문제로보고해야합니다. 위의 오류 추적을 복사하여 새 문제에 붙여 넣을 수 있습니다.\n"
|
||||
"\n"
|
||||
"이미 존재하는 문제에 대해 사전에 검색을 실행하십시오. 또한 경험하고있는 버그가 이미 패치되었을 수 있으므로 저장소에서 사용 가능한 최신 버전을 테스트해야합니다.\n"
|
||||
"\n"
|
||||
@ -1035,8 +1035,8 @@ msgstr ""
|
||||
"이 오류 후에도 응용 프로그램이 계속 실행되어야하지만 불안정한 상태 일 수 있으므로 응용 프로그램을 다시 시작하는 것이 좋습니다."
|
||||
|
||||
#: qt\error_report_dialog.py:80
|
||||
msgid "Go to Github"
|
||||
msgstr "Github로 이동"
|
||||
msgid "Go to GitHub"
|
||||
msgstr "GitHub로 이동"
|
||||
|
||||
#: qt\preferences.py:24
|
||||
msgid "Czech"
|
||||
@ -1121,3 +1121,32 @@ msgstr "목록 지우기"
|
||||
#: qt\search_edit.py:78
|
||||
msgid "Search..."
|
||||
msgstr "검색.."
|
||||
|
||||
#: qt\preferences_dialog.py:219
|
||||
msgid ""
|
||||
"These options are for advanced users or for very specific situations, most "
|
||||
"users should not have to modify these."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:225
|
||||
msgid "Include existence check after scan completion"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:227
|
||||
msgid "Ignore difference in mtime when loading cached digests"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:64
|
||||
msgid "Cancel?"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:65
|
||||
msgid "Are you sure you want to cancel? All progress will be lost."
|
||||
msgstr ""
|
||||
|
||||
#: qt\exclude_list_dialog.py:161
|
||||
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>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 ""
|
||||
|
@ -1,11 +1,11 @@
|
||||
# Translators:
|
||||
# Andrew Senetar <arsenetar@gmail.com>, 2022
|
||||
# Yaya - Nurul Azeera Hidayah @ Muhammad Nur Hidayat Yasuyoshi (MNH48) <admin@mnh48.moe>, 2022
|
||||
# Yaya - Nurul Azeera Hidayah @ Muhammad Nur Hidayat Yasuyoshi (MNH48) <admin@mnh48.moe>, 2023
|
||||
#
|
||||
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"
|
||||
"Last-Translator: Yaya - Nurul Azeera Hidayah @ Muhammad Nur Hidayat Yasuyoshi (MNH48) <admin@mnh48.moe>, 2023\n"
|
||||
"Language-Team: Malay (https://app.transifex.com/voltaicideas/teams/116153/ms/)\n"
|
||||
"Language: ms\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
@ -1040,7 +1040,7 @@ msgstr "Terdapat kesulitan yang terjadi. Apa kata laporkan ralat tersebut?"
|
||||
|
||||
#: qt\error_report_dialog.py:60
|
||||
msgid ""
|
||||
"Error reports should be reported as Github issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"Error reports should be reported as GitHub issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"\n"
|
||||
"Please make sure to run a search for any already existing issues beforehand. Also make sure to test the very latest version available from the repository, since the bug you are experiencing might have already been patched.\n"
|
||||
"\n"
|
||||
@ -1048,7 +1048,7 @@ msgid ""
|
||||
"\n"
|
||||
"Although the application should continue to run after this error, it may be in an unstable state, so it is recommended that you restart the application."
|
||||
msgstr ""
|
||||
"Laporan ralat patut dilaporkan sebagai isu Github. Anda boleh salin runut balik ralat di atas dan tampal dalam isu baharu.\n"
|
||||
"Laporan ralat patut dilaporkan sebagai isu GitHub. Anda boleh salin runut balik ralat di atas dan tampal dalam isu baharu.\n"
|
||||
"\n"
|
||||
"Sila pastikan anda menggelintar dahulu kalau-kalau isu sudah wujud. Juga pastikan untuk cuba versi paling terbaharu yang disediakan dari repositori, kerana pepijat yang anda alami mungkin sudah ditampung.\n"
|
||||
"\n"
|
||||
@ -1057,8 +1057,8 @@ msgstr ""
|
||||
"Walaupun aplikasi sepatutnya masih boleh digunakan selepas ralat ini, ia mungkin berada dalam keadaan tidak stabil, jadi anda digalakkan untuk memulakan semula aplikasi ini."
|
||||
|
||||
#: qt\error_report_dialog.py:80
|
||||
msgid "Go to Github"
|
||||
msgstr "Pergi ke Github"
|
||||
msgid "Go to GitHub"
|
||||
msgstr "Pergi ke GitHub"
|
||||
|
||||
#: qt\preferences.py:24
|
||||
msgid "Czech"
|
||||
@ -1143,3 +1143,37 @@ msgstr "Kosongkan Senarai"
|
||||
#: qt\search_edit.py:78
|
||||
msgid "Search..."
|
||||
msgstr "Cari..."
|
||||
|
||||
#: qt\preferences_dialog.py:219
|
||||
msgid ""
|
||||
"These options are for advanced users or for very specific situations, most "
|
||||
"users should not have to modify these."
|
||||
msgstr ""
|
||||
"Pilihan ini adalah untuk pengguna lanjutan atau untuk keadaan khas tertentu,"
|
||||
" kebanyakan pengguna tidak perlu mengubahsuai pilihan ini."
|
||||
|
||||
#: qt\preferences_dialog.py:225
|
||||
msgid "Include existence check after scan completion"
|
||||
msgstr "Sertakan pemeriksaan kewujudan selepas selesai imbasan"
|
||||
|
||||
#: qt\preferences_dialog.py:227
|
||||
msgid "Ignore difference in mtime when loading cached digests"
|
||||
msgstr "Abaikan perbezaan dalam masa ubahsuai ketika memuatkan cerna tercache"
|
||||
|
||||
#: qt\progress_window.py:64
|
||||
msgid "Cancel?"
|
||||
msgstr "Batal?"
|
||||
|
||||
#: qt\progress_window.py:65
|
||||
msgid "Are you sure you want to cancel? All progress will be lost."
|
||||
msgstr "Adakah anda pasti anda ingin batalkan? Semua kemajuan akan hilang."
|
||||
|
||||
#: qt\exclude_list_dialog.py:161
|
||||
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>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>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 palsu 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>"
|
||||
|
@ -6,7 +6,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Fuan <jcfrt@posteo.net>, 2022\n"
|
||||
"Language-Team: Dutch (https://www.transifex.com/voltaicideas/teams/116153/nl/)\n"
|
||||
"Language-Team: Dutch (https://app.transifex.com/voltaicideas/teams/116153/nl/)\n"
|
||||
"Language: nl\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
@ -1036,7 +1036,7 @@ msgstr "Er is iets fout gegaan. Hoe zit het met het melden van de fout?"
|
||||
|
||||
#: qt\error_report_dialog.py:60
|
||||
msgid ""
|
||||
"Error reports should be reported as Github issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"Error reports should be reported as GitHub issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"\n"
|
||||
"Please make sure to run a search for any already existing issues beforehand. Also make sure to test the very latest version available from the repository, since the bug you are experiencing might have already been patched.\n"
|
||||
"\n"
|
||||
@ -1044,7 +1044,7 @@ msgid ""
|
||||
"\n"
|
||||
"Although the application should continue to run after this error, it may be in an unstable state, so it is recommended that you restart the application."
|
||||
msgstr ""
|
||||
"Foutrapporten moeten worden gerapporteerd als Github-problemen. U kunt de bovenstaande foutopsporing kopiëren en in een nieuwe uitgave plakken.\n"
|
||||
"Foutrapporten moeten worden gerapporteerd als GitHub-problemen. U kunt de bovenstaande foutopsporing kopiëren en in een nieuwe uitgave plakken.\n"
|
||||
"\n"
|
||||
"Zorg ervoor dat u van tevoren een zoekopdracht uitvoert naar reeds bestaande problemen. Zorg er ook voor dat u de allernieuwste versie uit de repository test, aangezien de bug die u ondervindt mogelijk al gepatcht is.\n"
|
||||
"\n"
|
||||
@ -1053,8 +1053,8 @@ msgstr ""
|
||||
"Hoewel de toepassing na deze fout zou moeten blijven werken, kan deze in een onstabiele toestand verkeren, dus het wordt aanbevolen de toepassing opnieuw te starten."
|
||||
|
||||
#: qt\error_report_dialog.py:80
|
||||
msgid "Go to Github"
|
||||
msgstr "Ga naar Github"
|
||||
msgid "Go to GitHub"
|
||||
msgstr "Ga naar GitHub"
|
||||
|
||||
#: qt\preferences.py:24
|
||||
msgid "Czech"
|
||||
@ -1139,3 +1139,32 @@ msgstr "Lijst leegmaken"
|
||||
#: qt\search_edit.py:78
|
||||
msgid "Search..."
|
||||
msgstr "Zoeken..."
|
||||
|
||||
#: qt\preferences_dialog.py:219
|
||||
msgid ""
|
||||
"These options are for advanced users or for very specific situations, most "
|
||||
"users should not have to modify these."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:225
|
||||
msgid "Include existence check after scan completion"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:227
|
||||
msgid "Ignore difference in mtime when loading cached digests"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:64
|
||||
msgid "Cancel?"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:65
|
||||
msgid "Are you sure you want to cancel? All progress will be lost."
|
||||
msgstr ""
|
||||
|
||||
#: qt\exclude_list_dialog.py:161
|
||||
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>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 ""
|
||||
|
@ -5,7 +5,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Fuan <jcfrt@posteo.net>, 2022\n"
|
||||
"Language-Team: Polish (Poland) (https://www.transifex.com/voltaicideas/teams/116153/pl_PL/)\n"
|
||||
"Language-Team: Polish (Poland) (https://app.transifex.com/voltaicideas/teams/116153/pl_PL/)\n"
|
||||
"Language: pl_PL\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
@ -1034,7 +1034,7 @@ msgstr "Coś poszło nie tak. Co powiesz na zgłoszenie błędu?"
|
||||
|
||||
#: qt\error_report_dialog.py:60
|
||||
msgid ""
|
||||
"Error reports should be reported as Github issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"Error reports should be reported as GitHub issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"\n"
|
||||
"Please make sure to run a search for any already existing issues beforehand. Also make sure to test the very latest version available from the repository, since the bug you are experiencing might have already been patched.\n"
|
||||
"\n"
|
||||
@ -1042,7 +1042,7 @@ msgid ""
|
||||
"\n"
|
||||
"Although the application should continue to run after this error, it may be in an unstable state, so it is recommended that you restart the application."
|
||||
msgstr ""
|
||||
"Raporty o błędach powinny być zgłaszane jako problemy z Github. Możesz skopiować powyższy opis błędu i wkleić go w nowym zgłoszeniu.\n"
|
||||
"Raporty o błędach powinny być zgłaszane jako problemy z GitHub. Możesz skopiować powyższy opis błędu i wkleić go w nowym zgłoszeniu.\n"
|
||||
"\n"
|
||||
"Upewnij się, że wcześniej wyszukałeś już istniejący bilet. Upewnij się również, że przetestowałeś najnowszą wersję dostępną w repozytorium, ponieważ napotkany błąd mógł już zostać załatany.\n"
|
||||
"\n"
|
||||
@ -1051,8 +1051,8 @@ msgstr ""
|
||||
"Chociaż aplikacja powinna nadal działać po tym błędzie, może być w stanie niestabilnym, dlatego zaleca się ponowne uruchomienie aplikacji."
|
||||
|
||||
#: qt\error_report_dialog.py:80
|
||||
msgid "Go to Github"
|
||||
msgstr "Przejdź do Github"
|
||||
msgid "Go to GitHub"
|
||||
msgstr "Przejdź do GitHub"
|
||||
|
||||
#: qt\preferences.py:24
|
||||
msgid "Czech"
|
||||
@ -1137,3 +1137,32 @@ msgstr "Wyczyść listę"
|
||||
#: qt\search_edit.py:78
|
||||
msgid "Search..."
|
||||
msgstr "Szukaj..."
|
||||
|
||||
#: qt\preferences_dialog.py:219
|
||||
msgid ""
|
||||
"These options are for advanced users or for very specific situations, most "
|
||||
"users should not have to modify these."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:225
|
||||
msgid "Include existence check after scan completion"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:227
|
||||
msgid "Ignore difference in mtime when loading cached digests"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:64
|
||||
msgid "Cancel?"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:65
|
||||
msgid "Are you sure you want to cancel? All progress will be lost."
|
||||
msgstr ""
|
||||
|
||||
#: qt\exclude_list_dialog.py:161
|
||||
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>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 ""
|
||||
|
@ -5,11 +5,11 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Andrew Senetar <arsenetar@gmail.com>, 2022\n"
|
||||
"Language-Team: Portuguese (Brazil) (https://www.transifex.com/voltaicideas/teams/116153/pt_BR/)\n"
|
||||
"Language-Team: Portuguese (Brazil) (https://app.transifex.com/voltaicideas/teams/116153/pt_BR/)\n"
|
||||
"Language: pt_BR\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
|
||||
|
||||
#: qt/app.py:81
|
||||
msgid "Quit"
|
||||
@ -1034,7 +1034,7 @@ msgstr "Algo deu errado. Deseja relatar o erro?"
|
||||
|
||||
#: qt\error_report_dialog.py:60
|
||||
msgid ""
|
||||
"Error reports should be reported as Github issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"Error reports should be reported as GitHub issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"\n"
|
||||
"Please make sure to run a search for any already existing issues beforehand. Also make sure to test the very latest version available from the repository, since the bug you are experiencing might have already been patched.\n"
|
||||
"\n"
|
||||
@ -1042,7 +1042,7 @@ msgid ""
|
||||
"\n"
|
||||
"Although the application should continue to run after this error, it may be in an unstable state, so it is recommended that you restart the application."
|
||||
msgstr ""
|
||||
"Os relatórios de erros devem ser relatados como problemas do Github. Você pode copiar o rastreamento do erro acima e colá-lo em uma nova edição.\n"
|
||||
"Os relatórios de erros devem ser relatados como problemas do GitHub. Você pode copiar o rastreamento do erro acima e colá-lo em uma nova edição.\n"
|
||||
"\n"
|
||||
"Por favor, certifique-se de executar uma pesquisa de qualquer problema já existente com antecedência. Certifique-se também de testar a versão mais recente disponível no repositório, uma vez que o bug que você está enfrentando pode já ter sido corrigido.\n"
|
||||
"\n"
|
||||
@ -1051,8 +1051,8 @@ msgstr ""
|
||||
"Embora o aplicativo deva continuar a ser executado após esse erro, ele pode estar em um estado instável, portanto, é recomendável reiniciar o aplicativo."
|
||||
|
||||
#: qt\error_report_dialog.py:80
|
||||
msgid "Go to Github"
|
||||
msgstr "Ir para o Github"
|
||||
msgid "Go to GitHub"
|
||||
msgstr "Ir para o GitHub"
|
||||
|
||||
#: qt\preferences.py:24
|
||||
msgid "Czech"
|
||||
@ -1137,3 +1137,32 @@ msgstr "Limpar Lista"
|
||||
#: qt\search_edit.py:78
|
||||
msgid "Search..."
|
||||
msgstr "Buscar…"
|
||||
|
||||
#: qt\preferences_dialog.py:219
|
||||
msgid ""
|
||||
"These options are for advanced users or for very specific situations, most "
|
||||
"users should not have to modify these."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:225
|
||||
msgid "Include existence check after scan completion"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:227
|
||||
msgid "Ignore difference in mtime when loading cached digests"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:64
|
||||
msgid "Cancel?"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:65
|
||||
msgid "Are you sure you want to cancel? All progress will be lost."
|
||||
msgstr ""
|
||||
|
||||
#: qt\exclude_list_dialog.py:161
|
||||
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>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 ""
|
||||
|
@ -1,6 +0,0 @@
|
||||
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
|
@ -1,10 +1,11 @@
|
||||
# Translators:
|
||||
# Andrew Senetar <arsenetar@gmail.com>, 2021
|
||||
# AHOHNMYC <lqwh2h2cwa@protonmail.com>, 2023
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Andrew Senetar <arsenetar@gmail.com>, 2021\n"
|
||||
"Language-Team: Russian (https://www.transifex.com/voltaicideas/teams/116153/ru/)\n"
|
||||
"Last-Translator: AHOHNMYC <lqwh2h2cwa@protonmail.com>, 2023\n"
|
||||
"Language-Team: Russian (https://app.transifex.com/voltaicideas/teams/116153/ru/)\n"
|
||||
"Language: ru\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
@ -29,9 +30,9 @@ msgstr "Битрейт"
|
||||
|
||||
#: core\me\prioritize.py:37
|
||||
msgid "Samplerate"
|
||||
msgstr "Частота оцифровки"
|
||||
msgstr "Частота дискретизации"
|
||||
|
||||
#: core\me\result_table.py:19 core\pe\result_table.py:19 core\prioritize.py:92
|
||||
#: core\me\result_table.py:19 core\pe\result_table.py:19 core\prioritize.py:94
|
||||
#: core\se\result_table.py:19
|
||||
msgid "Filename"
|
||||
msgstr "Имя файла"
|
||||
@ -51,7 +52,7 @@ msgstr "Время"
|
||||
|
||||
#: core\me\result_table.py:24
|
||||
msgid "Sample Rate"
|
||||
msgstr "Частота"
|
||||
msgstr "Частота дискретизации"
|
||||
|
||||
#: core\me\result_table.py:25 core\pe\result_table.py:22 core\prioritize.py:65
|
||||
#: core\se\result_table.py:22
|
||||
@ -59,7 +60,7 @@ msgid "Kind"
|
||||
msgstr "Тип"
|
||||
|
||||
#: core\me\result_table.py:26 core\pe\result_table.py:25
|
||||
#: core\prioritize.py:163 core\se\result_table.py:23
|
||||
#: core\prioritize.py:165 core\se\result_table.py:23
|
||||
msgid "Modification"
|
||||
msgstr "Время изменения"
|
||||
|
||||
@ -117,6 +118,6 @@ msgstr "Размер (КБ)"
|
||||
msgid "EXIF Timestamp"
|
||||
msgstr "Временная отметка EXIF"
|
||||
|
||||
#: core\prioritize.py:156
|
||||
#: core\prioritize.py:158
|
||||
msgid "Size"
|
||||
msgstr "Размер"
|
||||
|
@ -1,25 +1,26 @@
|
||||
# Translators:
|
||||
# Andrew Senetar <arsenetar@gmail.com>, 2021
|
||||
# Fuan <jcfrt@posteo.net>, 2021
|
||||
# AHOHNMYC <lqwh2h2cwa@protonmail.com>, 2023
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Fuan <jcfrt@posteo.net>, 2021\n"
|
||||
"Language-Team: Russian (https://www.transifex.com/voltaicideas/teams/116153/ru/)\n"
|
||||
"Last-Translator: AHOHNMYC <lqwh2h2cwa@protonmail.com>, 2023\n"
|
||||
"Language-Team: Russian (https://app.transifex.com/voltaicideas/teams/116153/ru/)\n"
|
||||
"Language: ru\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
|
||||
|
||||
#: core\app.py:42
|
||||
#: core\app.py:44
|
||||
msgid "There are no marked duplicates. Nothing has been done."
|
||||
msgstr "Дубликаты не отмечены. Нечего выполнять."
|
||||
|
||||
#: core\app.py:43
|
||||
#: core\app.py:45
|
||||
msgid "There are no selected duplicates. Nothing has been done."
|
||||
msgstr "Дубликаты не выбраны. Нечего выполнять."
|
||||
|
||||
#: core\app.py:44
|
||||
#: core\app.py:46
|
||||
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?"
|
||||
@ -28,27 +29,27 @@ msgstr ""
|
||||
"файлы будут открыты, это действие может создать настоящий беспорядок. "
|
||||
"Продолжать?"
|
||||
|
||||
#: core\app.py:71
|
||||
#: core\app.py:73
|
||||
msgid "Scanning for duplicates"
|
||||
msgstr "Проверка на наличие дубликатов"
|
||||
|
||||
#: core\app.py:72
|
||||
#: core\app.py:74
|
||||
msgid "Loading"
|
||||
msgstr "Загрузка"
|
||||
|
||||
#: core\app.py:73
|
||||
#: core\app.py:75
|
||||
msgid "Moving"
|
||||
msgstr "Перемещение"
|
||||
|
||||
#: core\app.py:74
|
||||
#: core\app.py:76
|
||||
msgid "Copying"
|
||||
msgstr "Копирование"
|
||||
|
||||
#: core\app.py:75
|
||||
#: core\app.py:77
|
||||
msgid "Sending to Trash"
|
||||
msgstr "Перемещение в Корзину"
|
||||
|
||||
#: core\app.py:289
|
||||
#: core\app.py:293
|
||||
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,39 +57,39 @@ msgstr ""
|
||||
"Предыдущее действие до сих пор выполняется. Вы не можете начать новое. "
|
||||
"Подождите несколько секунд, затем повторите попытку."
|
||||
|
||||
#: core\app.py:300
|
||||
#: core\app.py:304
|
||||
msgid "No duplicates found."
|
||||
msgstr "Дубликаты не найдены."
|
||||
|
||||
#: core\app.py:315
|
||||
#: core\app.py:319
|
||||
msgid "All marked files were copied successfully."
|
||||
msgstr "Все отмеченные файлы были скопированы успешно."
|
||||
|
||||
#: core\app.py:317
|
||||
#: core\app.py:321
|
||||
msgid "All marked files were moved successfully."
|
||||
msgstr "Все отмеченные файлы были перемещены успешно."
|
||||
|
||||
#: core\app.py:319
|
||||
#: core\app.py:323
|
||||
msgid "All marked files were deleted successfully."
|
||||
msgstr ""
|
||||
msgstr "Все отмеченные файлы были удалены успешно."
|
||||
|
||||
#: core\app.py:321
|
||||
#: core\app.py:325
|
||||
msgid "All marked files were successfully sent to Trash."
|
||||
msgstr "Все отмеченные файлы были успешно отправлены в Корзину."
|
||||
|
||||
#: core\app.py:326
|
||||
#: core\app.py:330
|
||||
msgid "Could not load file: {}"
|
||||
msgstr "Не удалось загрузить файл: {}"
|
||||
|
||||
#: core\app.py:382
|
||||
#: core\app.py:386
|
||||
msgid "'{}' already is in the list."
|
||||
msgstr "'{}' уже присутствует в списке."
|
||||
|
||||
#: core\app.py:384
|
||||
#: core\app.py:388
|
||||
msgid "'{}' does not exist."
|
||||
msgstr "'{}' не существует."
|
||||
|
||||
#: core\app.py:392
|
||||
#: core\app.py:396
|
||||
msgid ""
|
||||
"All selected %d matches are going to be ignored in all subsequent scans. "
|
||||
"Continue?"
|
||||
@ -96,57 +97,57 @@ msgstr ""
|
||||
"Все выбранные %d совпадений будут игнорироваться при всех последующих "
|
||||
"проверках. Продолжить?"
|
||||
|
||||
#: core\app.py:469
|
||||
#: core\app.py:473
|
||||
msgid "Select a directory to copy marked files to"
|
||||
msgstr "Выберите каталог, в который вы хотите скопировать отмеченные файлы"
|
||||
|
||||
#: core\app.py:471
|
||||
#: core\app.py:475
|
||||
msgid "Select a directory to move marked files to"
|
||||
msgstr "Выберите каталог, в который вы хотите переместить отмеченные файлы"
|
||||
|
||||
#: core\app.py:510
|
||||
#: core\app.py:514
|
||||
msgid "Select a destination for your exported CSV"
|
||||
msgstr "Выберите назначение для экспортируемого "
|
||||
|
||||
#: core\app.py:516 core\app.py:771 core\app.py:781
|
||||
#: core\app.py:520 core\app.py:781 core\app.py:791
|
||||
msgid "Couldn't write to file: {}"
|
||||
msgstr "Не удалось записать в файл: {}"
|
||||
|
||||
#: core\app.py:539
|
||||
#: core\app.py:543
|
||||
msgid "You have no custom command set up. Set it up in your preferences."
|
||||
msgstr "Вы не создали пользовательскую команду. Задайте её в настройках."
|
||||
|
||||
#: core\app.py:695 core\app.py:707
|
||||
#: core\app.py:705 core\app.py:717
|
||||
msgid "You are about to remove %d files from results. Continue?"
|
||||
msgstr "Вы собираетесь удалить %d файлов из результата поиска. Продолжить?"
|
||||
|
||||
#: core\app.py:743
|
||||
#: core\app.py:753
|
||||
msgid "{} duplicate groups were changed by the re-prioritization."
|
||||
msgstr "{} групп дубликатов было изменено при реприоритезации."
|
||||
|
||||
#: core\app.py:790
|
||||
#: core\app.py:801
|
||||
msgid "The selected directories contain no scannable file."
|
||||
msgstr "Выбранные каталоги не содержат файлов для сканирования."
|
||||
|
||||
#: core\app.py:803
|
||||
#: core\app.py:817
|
||||
msgid "Collecting files to scan"
|
||||
msgstr "Сбор файлов для сканирования"
|
||||
|
||||
#: core\app.py:850
|
||||
#: core\app.py:867
|
||||
msgid "%s (%d discarded)"
|
||||
msgstr "%s. (%d отменено)"
|
||||
|
||||
#: core\directories.py:191
|
||||
#: core\directories.py:190
|
||||
msgid "Collected {} files to scan"
|
||||
msgstr ""
|
||||
msgstr "Собрано {} файлов для сканирования"
|
||||
|
||||
#: core\directories.py:207
|
||||
#: core\directories.py:206
|
||||
msgid "Collected {} folders to scan"
|
||||
msgstr ""
|
||||
msgstr "Собрано {} каталогов для сканирования"
|
||||
|
||||
#: core\engine.py:27
|
||||
msgid "%d matches found from %d groups"
|
||||
msgstr ""
|
||||
msgstr "Найдено %d совпадений из %d групп"
|
||||
|
||||
#: core\gui\deletion_options.py:71
|
||||
msgid "You are sending {} file(s) to the Trash."
|
||||
@ -154,7 +155,7 @@ msgstr "Вы перемещаете {} файлов в Корзину."
|
||||
|
||||
#: core\gui\exclude_list_table.py:14
|
||||
msgid "Regular Expressions"
|
||||
msgstr "Обычные выражения"
|
||||
msgstr "Регулярные выражения"
|
||||
|
||||
#: core\gui\ignore_list_dialog.py:25
|
||||
msgid "Do you really want to remove all %d items from the ignore list?"
|
||||
@ -171,7 +172,7 @@ msgstr "Имя файла - Поля"
|
||||
|
||||
#: core\me\scanner.py:22
|
||||
msgid "Filename - Fields (No Order)"
|
||||
msgstr "Имя файла - поля (без порядка)"
|
||||
msgstr "Имя файла - Поля (без сортировки)"
|
||||
|
||||
#: core\me\scanner.py:23
|
||||
msgid "Tags"
|
||||
@ -183,11 +184,11 @@ msgstr "Содержание"
|
||||
|
||||
#: core\pe\matchblock.py:72
|
||||
msgid "Analyzed %d/%d pictures"
|
||||
msgstr "Анализируется %d/%d изображений"
|
||||
msgstr "Проанализировано %d из %d изображений"
|
||||
|
||||
#: core\pe\matchblock.py:177
|
||||
msgid "Performed %d/%d chunk matches"
|
||||
msgstr "Выполнено %d/%d совпадений блоков"
|
||||
msgstr "Проверено %d/%d совпадений"
|
||||
|
||||
#: core\pe\matchblock.py:185
|
||||
msgid "Preparing for matching"
|
||||
@ -209,37 +210,37 @@ msgstr "Метка времени EXIF"
|
||||
msgid "None"
|
||||
msgstr "Ни один"
|
||||
|
||||
#: core\prioritize.py:100
|
||||
#: core\prioritize.py:102
|
||||
msgid "Ends with number"
|
||||
msgstr "Заканчивается номером"
|
||||
|
||||
#: core\prioritize.py:101
|
||||
#: core\prioritize.py:103
|
||||
msgid "Doesn't end with number"
|
||||
msgstr "Не заканчивается номером"
|
||||
|
||||
#: core\prioritize.py:102
|
||||
#: core\prioritize.py:104
|
||||
msgid "Longest"
|
||||
msgstr "Самый длинный"
|
||||
|
||||
#: core\prioritize.py:103
|
||||
#: core\prioritize.py:105
|
||||
msgid "Shortest"
|
||||
msgstr "Самый короткий"
|
||||
|
||||
#: core\prioritize.py:140
|
||||
#: core\prioritize.py:142
|
||||
msgid "Highest"
|
||||
msgstr "Наивысший"
|
||||
|
||||
#: core\prioritize.py:140
|
||||
#: core\prioritize.py:142
|
||||
msgid "Lowest"
|
||||
msgstr "Самый низкий"
|
||||
|
||||
#: core\prioritize.py:169
|
||||
#: core\prioritize.py:171
|
||||
msgid "Newest"
|
||||
msgstr "Новейший"
|
||||
|
||||
#: core\prioritize.py:169
|
||||
#: core\prioritize.py:171
|
||||
msgid "Oldest"
|
||||
msgstr "Старейшие"
|
||||
msgstr "Старейший"
|
||||
|
||||
#: core\results.py:134
|
||||
msgid "%d / %d (%s / %s) duplicates marked."
|
||||
|
@ -1,11 +1,13 @@
|
||||
# Translators:
|
||||
# Fuan <jcfrt@posteo.net>, 2022
|
||||
# Andrew Senetar <arsenetar@gmail.com>, 2022
|
||||
# AHOHNMYC <lqwh2h2cwa@protonmail.com>, 2023
|
||||
# Captain Quake <elizabeth-keen.gardy@simplelogin.co>, 2023
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Andrew Senetar <arsenetar@gmail.com>, 2022\n"
|
||||
"Language-Team: Russian (https://www.transifex.com/voltaicideas/teams/116153/ru/)\n"
|
||||
"Last-Translator: Captain Quake <elizabeth-keen.gardy@simplelogin.co>, 2023\n"
|
||||
"Language-Team: Russian (https://app.transifex.com/voltaicideas/teams/116153/ru/)\n"
|
||||
"Language: ru\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
@ -18,7 +20,7 @@ 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
|
||||
@ -75,7 +77,7 @@ msgstr "Жёсткая ссылка"
|
||||
|
||||
#: qt/deletion_options.py:44
|
||||
msgid "Symlink"
|
||||
msgstr "Символьная ссылка"
|
||||
msgstr "Символическая ссылка"
|
||||
|
||||
#: qt/deletion_options.py:48
|
||||
msgid " (unsupported)"
|
||||
@ -90,8 +92,8 @@ 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 ""
|
||||
"Вместо отправки файлов в Корзину удалить их с диска. Этот параметр обычно "
|
||||
"используется как обходной путь, когда нормальный метод удаления не работает."
|
||||
"Удалить файлы с диска вместо отправки в Корзину. Используйте если нормальный"
|
||||
" метод удаления не работает."
|
||||
|
||||
#: qt/deletion_options.py:59 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Proceed"
|
||||
@ -154,11 +156,11 @@ msgstr "Музыка"
|
||||
|
||||
#: qt/directories_dialog.py:121 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Picture"
|
||||
msgstr "Рисунок"
|
||||
msgstr "Изображения"
|
||||
|
||||
#: qt/directories_dialog.py:121 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Standard"
|
||||
msgstr "Стандарт"
|
||||
msgstr "Обычный"
|
||||
|
||||
#: qt/directories_dialog.py:128 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Scan Type:"
|
||||
@ -170,7 +172,7 @@ msgstr "Больше вариантов"
|
||||
|
||||
#: qt/directories_dialog.py:139 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Select folders to scan and press \"Scan\"."
|
||||
msgstr "Выберите каталоги для поиска и нажмите \"Сканирование\"."
|
||||
msgstr "Выберите каталоги для поиска и нажмите \"Сканировать\"."
|
||||
|
||||
#: qt/directories_dialog.py:163 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Load Results"
|
||||
@ -178,7 +180,7 @@ msgstr "Загрузить результаты"
|
||||
|
||||
#: qt/directories_dialog.py:166 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Scan"
|
||||
msgstr "Сканирование"
|
||||
msgstr "Сканировать"
|
||||
|
||||
#: qt/directories_dialog.py:230
|
||||
msgid "Unsaved results"
|
||||
@ -222,11 +224,11 @@ msgstr "Состояние"
|
||||
|
||||
#: qt/directories_model.py:24 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Excluded"
|
||||
msgstr "Исключённые"
|
||||
msgstr "Исключён"
|
||||
|
||||
#: qt/directories_model.py:24 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Normal"
|
||||
msgstr "Нормальный"
|
||||
msgstr "Обычный"
|
||||
|
||||
#: qt/ignore_list_dialog.py:45 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Remove Selected"
|
||||
@ -293,7 +295,7 @@ msgstr "Можно смешивать типы файлов"
|
||||
#: 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 "Использование регулярных выражений при фильтрации"
|
||||
msgstr "Использовать регулярные выражения для фильтров"
|
||||
|
||||
#: qt/me/preferences_dialog.py:58 qt/pe/preferences_dialog.py:25
|
||||
#: qt/se/preferences_dialog.py:38 cocoa/en.lproj/Localizable.strings:0
|
||||
@ -312,7 +314,7 @@ msgstr "Режим отладки (требуется перезапуск)"
|
||||
|
||||
#: qt/pe/preferences_dialog.py:19 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Match pictures of different dimensions"
|
||||
msgstr "Совпадение рисунков разных размеров"
|
||||
msgstr "Искать дубликаты изображений разных размеров"
|
||||
|
||||
#: qt/preferences_dialog.py:43
|
||||
msgid "Filter Hardness:"
|
||||
@ -357,8 +359,7 @@ msgstr ""
|
||||
|
||||
#: qt/preferences_dialog.py:174
|
||||
msgid "dupeGuru has to restart for language changes to take effect."
|
||||
msgstr ""
|
||||
"dupeGuru необходимо перезапустить, чтобы языковые изменения вступили в силу."
|
||||
msgstr "Новый язык будет загружен при следующем запуске dupeGuru."
|
||||
|
||||
#: qt/prioritize_dialog.py:75 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Re-Prioritize duplicates"
|
||||
@ -377,7 +378,7 @@ msgstr ""
|
||||
|
||||
#: qt/problem_dialog.py:33 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Problems!"
|
||||
msgstr "Проблемы!"
|
||||
msgstr "Проблемка!"
|
||||
|
||||
#: qt/problem_dialog.py:37 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid ""
|
||||
@ -471,7 +472,7 @@ msgstr "Экспорт в HTML"
|
||||
|
||||
#: qt/result_window.py:88
|
||||
msgid "Export To CSV"
|
||||
msgstr "Экспорт в "
|
||||
msgstr "Экспорт в CSV"
|
||||
|
||||
#: qt/result_window.py:89 cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Save Results..."
|
||||
@ -644,7 +645,7 @@ msgstr "Скрыть остальные"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Ignore files smaller than:"
|
||||
msgstr "Игнорировать файлы меньше чем:"
|
||||
msgstr "Пропускать файлы меньше чем:"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Load from file..."
|
||||
@ -652,7 +653,7 @@ msgstr "Загрузить из файла…"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Minimize"
|
||||
msgstr "Минимизировать"
|
||||
msgstr "Свернуть"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Mode"
|
||||
@ -720,7 +721,7 @@ msgstr "Начать поиск дубликатов"
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "The name '%@' already exists."
|
||||
msgstr " Имя '%@' уже существует."
|
||||
msgstr "Имя '%@' уже существует."
|
||||
|
||||
#: cocoa/en.lproj/Localizable.strings:0
|
||||
msgid "Window"
|
||||
@ -752,7 +753,7 @@ msgstr "Выберите файл каталогов для загрузки"
|
||||
|
||||
#: qt\directories_dialog.py:338
|
||||
msgid "dupeGuru Results (*.dupegurudirs)"
|
||||
msgstr "каталоги dupeGuru (*.dupegurudirs)"
|
||||
msgstr "Каталоги dupeGuru (*.dupegurudirs)"
|
||||
|
||||
#: qt\directories_dialog.py:347
|
||||
msgid "Select a file to save your directories to"
|
||||
@ -760,11 +761,11 @@ msgstr "Выберите файл для сохранения каталогов
|
||||
|
||||
#: qt\directories_dialog.py:348
|
||||
msgid "dupeGuru Directories (*.dupegurudirs)"
|
||||
msgstr "каталоги dupeGuru (*.dupegurudirs)"
|
||||
msgstr "Каталоги dupeGuru (*.dupegurudirs)"
|
||||
|
||||
#: qt\exclude_list_dialog.py:44
|
||||
msgid "Add"
|
||||
msgstr "добавлять"
|
||||
msgstr "Добавить"
|
||||
|
||||
#: qt\exclude_list_dialog.py:46
|
||||
msgid "Restore defaults"
|
||||
@ -772,7 +773,7 @@ msgstr "Восстановить значения по умолчанию"
|
||||
|
||||
#: qt\exclude_list_dialog.py:47
|
||||
msgid "Test string"
|
||||
msgstr "Тестовая строка"
|
||||
msgstr "Проверить строку"
|
||||
|
||||
#: qt\exclude_list_dialog.py:83
|
||||
msgid "Type a python regular expression here..."
|
||||
@ -789,10 +790,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 ""
|
||||
"Эти (чувствительные к регистру) регулярные выражения Python будут отфильтровывать файлы во время сканирования.<br>Директорам также будет установлено <strong>состояние по умолчанию</strong> «Исключено» на вкладке «Каталоги», если их имя совпадает с одним из выбранных регулярных выражений.<br>Для каждого собранного файла выполняется два теста, чтобы определить, следует ли его полностью игнорировать:<br><li>1. Регулярные выражения без разделителя пути будут сравниваться только с именем файла.</li>\n"
|
||||
"Эти (чувствительные к регистру) регулярные выражения Python будут отфильтровывать файлы во время сканирования.<br>Если имя каталога подходит под какое-либо из выбранных регулярных выражений, для него на вкладке «Каталоги» будет выставлено <strong>состояние по умолчанию</strong> «Исключено».<br>Для каждого файла выполняется две проверки, чтобы определить, следует ли его полностью игнорировать:<br><li>1. Регулярные выражения без разделителя пути будут сравниваться только с именем файла.</li>\n"
|
||||
"<li>2. Регулярные выражения, содержащие хотя бы один разделитель пути, будут сравниваться с полным путем к файлу.</li><br>\n"
|
||||
"Пример: если вы хотите отфильтровать файлы .PNG только из каталога «Мои изображения»:<br><code>.*Мои\\sизображения\\\\.*\\.png</code><br><br>Вы можете проверить регулярное выражение с помощью кнопки «тестовая строка» после вставки поддельного пути в тестовое поле:<br><code>C:\\\\Пользователь\\Мои изображения\\test.png</code><br><br>\n"
|
||||
"Соответствующие регулярные выражения будут выделены.<br>Если есть хотя бы одно выделение, проверенный путь или имя файла будет проигнорирован во время сканирования.<br><br>Каталоги и файлы, начинающиеся с точки \".\" по умолчанию отфильтрованы.<br><br>"
|
||||
"Пример: отфильтровать .PNG из каталога «Мои изображения»:<br><code>.*Мои\\sизображения\\\\.*\\.png</code><br><br>Вы можете проверить регулярное выражение с помощью кнопки «Проверить строку», указав, например, такой путь:<br><code>C:\\\\Пользователь\\Мои изображения\\test.png</code><br><br>\n"
|
||||
"Сработавшие регулярные выражения будут выделены.<br>Если есть хотя бы одно выделение, проверенный путь или имя файла будет проигнорирован во время сканирования.<br><br>Каталоги и файлы, начинающиеся с точки \".\" по умолчанию будут отфильтрованы.<br><br>"
|
||||
|
||||
#: qt\exclude_list_table.py:36
|
||||
msgid "Compilation error: "
|
||||
@ -833,9 +834,7 @@ msgstr "Переопределить значки темы на панели и
|
||||
#: qt\pe\preferences_dialog.py:58
|
||||
msgid ""
|
||||
"Use our own internal icons instead of those provided by the theme engine"
|
||||
msgstr ""
|
||||
"Используйте наши собственные внутренние значки вместо тех, которые "
|
||||
"предоставляются движком темы."
|
||||
msgstr "Используйте внутренние значки вместо значков, встроенных в тему"
|
||||
|
||||
#: qt\pe\preferences_dialog.py:66
|
||||
msgid "Show scrollbars in image viewers"
|
||||
@ -845,9 +844,7 @@ msgstr "Показывать полосы прокрутки в средства
|
||||
msgid ""
|
||||
"When the image displayed doesn't fit the viewport, show scrollbars to span "
|
||||
"the view around"
|
||||
msgstr ""
|
||||
"Когда отображаемое изображение не умещается в области просмотра, покажите "
|
||||
"полосы прокрутки, чтобы охватить область просмотра"
|
||||
msgstr "Показывать полосы прокрутки для больших изображений"
|
||||
|
||||
#: qt\preferences_dialog.py:156
|
||||
msgid "Use default position for tab bar (requires restart)"
|
||||
@ -864,19 +861,19 @@ msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:172
|
||||
msgid "Use bold font for references"
|
||||
msgstr "Используйте жирный шрифт для ссылок"
|
||||
msgstr "Использовать жирный шрифт для ссылок"
|
||||
|
||||
#: qt\preferences_dialog.py:176
|
||||
msgid "Reference foreground color:"
|
||||
msgstr "Эталонный цвет переднего плана:"
|
||||
msgstr "Цвет шрифта для эталонных файлов:"
|
||||
|
||||
#: qt\preferences_dialog.py:179
|
||||
msgid "Reference background color:"
|
||||
msgstr "Цвет фона справки:"
|
||||
msgstr "Цвет фона для эталонных файлов:"
|
||||
|
||||
#: qt\preferences_dialog.py:182 qt\preferences_dialog.py:216
|
||||
msgid "Delta foreground color:"
|
||||
msgstr "Цвет переднего плана дельты:"
|
||||
msgstr "Цвет шрифта для дельты:"
|
||||
|
||||
#: qt\preferences_dialog.py:195
|
||||
msgid "Show the title bar and can be docked"
|
||||
@ -887,8 +884,8 @@ msgid ""
|
||||
"While the title bar is hidden, use the modifier key to drag the floating "
|
||||
"window around"
|
||||
msgstr ""
|
||||
"Пока строка заголовка скрыта, используйте клавишу-модификатор, чтобы "
|
||||
"перетащить плавающее окно вокруг"
|
||||
"Если строка заголовка скрыта, перемещать плавающее окно с клавишей-"
|
||||
"модификатором"
|
||||
|
||||
#: qt\preferences_dialog.py:199
|
||||
msgid "The title bar can only be disabled while the window is docked"
|
||||
@ -915,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 ""
|
||||
"Эти (чувствительные к регистру) регулярные выражения Python будут отфильтровывать файлы во время сканирования.<br>Директорам также будет установлено <strong>состояние по умолчанию</strong> «Исключено» на вкладке «Каталоги», если их имя совпадает с одним из выбранных регулярных выражений.<br>Для каждого собранного файла выполняется два теста, чтобы определить, следует ли его полностью игнорировать:<br><li>1. Регулярные выражения без разделителя пути будут сравниваться только с именем файла.</li>\n"
|
||||
"Эти (чувствительные к регистру) регулярные выражения Python будут отфильтровывать файлы во время сканирования.<br>Если имя каталога подходит под какое-либо из выбранных регулярных выражений, для него на вкладке «Каталоги» будет выставлено <strong>состояние по умолчанию</strong> «Исключено».<br>Для каждого файла выполняется две проверки, чтобы определить, следует ли его полностью игнорировать:<br><li>1. Регулярные выражения без разделителя пути будут сравниваться только с именем файла.</li>\n"
|
||||
"<li>2. Регулярные выражения, содержащие хотя бы один разделитель пути, будут сравниваться с полным путем к файлу.</li><br>\n"
|
||||
"Пример: если вы хотите отфильтровать файлы .PNG только из каталога «Мои изображения»:<br><code>.*Мои\\sизображения\\\\.*\\.png</code><br><br>Вы можете проверить регулярное выражение с помощью кнопки «тестовая строка» после вставки поддельного пути в тестовое поле:<br><code>C:\\\\Пользователь\\Мои изображения\\test.png</code><br><br>\n"
|
||||
"Соответствующие регулярные выражения будут выделены.<br>Если есть хотя бы одно выделение, проверенный путь или имя файла будет проигнорирован во время сканирования.<br><br>Каталоги и файлы, начинающиеся с точки \".\" по умолчанию отфильтрованы.<br><br>"
|
||||
"Пример: отфильтровать .PNG из каталога «Мои изображения»:<br><code>.*Мои\\sизображения\\\\.*\\.png</code><br><br>Вы можете проверить регулярное выражение с помощью кнопки «Проверить строку», указав, например, такой путь:<br><code>C:\\\\Пользователь\\Мои изображения\\test.png</code><br><br>\n"
|
||||
"Сработавшие регулярные выражения будут выделены.<br>Если есть хотя бы одно выделение, проверенный путь или имя файла будет проигнорирован во время сканирования.<br><br>Каталоги и файлы, начинающиеся с точки \".\" по умолчанию будут отфильтрованы.<br><br>"
|
||||
|
||||
#: qt\app.py:256
|
||||
msgid "Results"
|
||||
@ -930,79 +927,86 @@ msgstr "Общий интерфейс"
|
||||
|
||||
#: qt\preferences_dialog.py:176
|
||||
msgid "Result Table"
|
||||
msgstr "Таблица результатов"
|
||||
msgstr "Таблица с результатами"
|
||||
|
||||
#: qt\preferences_dialog.py:205
|
||||
msgid "Details Window"
|
||||
msgstr "Окно деталей"
|
||||
msgstr "Окно с подробностями"
|
||||
|
||||
#: qt\preferences_dialog.py:285
|
||||
msgid "General"
|
||||
msgstr "Общий"
|
||||
msgstr "Общие"
|
||||
|
||||
#: qt\preferences_dialog.py:286
|
||||
msgid "Display"
|
||||
msgstr "Отображать"
|
||||
msgstr "Внешний вид"
|
||||
|
||||
#: qt\se\preferences_dialog.py:70
|
||||
msgid "Partially hash files bigger than"
|
||||
msgstr ""
|
||||
msgstr "Частично хешировать большие файлы, размером более"
|
||||
|
||||
#: qt\se\preferences_dialog.py:80
|
||||
msgid "MB"
|
||||
msgstr ""
|
||||
msgstr "МБ"
|
||||
|
||||
#: qt\preferences_dialog.py:163
|
||||
msgid "Use native OS dialogs"
|
||||
msgstr ""
|
||||
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 ""
|
||||
"При выборе файлов или папок для добавления в список сканирования будет "
|
||||
"использоваться диалоговое окно системы, а не встроенное в dupeGuru. "
|
||||
"Некоторые системные диалоговые окна имеют ограниченную функциональность."
|
||||
|
||||
#: qt\se\preferences_dialog.py:68
|
||||
msgid "Ignore files larger than"
|
||||
msgstr ""
|
||||
msgstr "Игнорировать файлы больше чем"
|
||||
|
||||
#: qt\app.py:135 qt\app.py:293
|
||||
msgid "Clear Cache"
|
||||
msgstr ""
|
||||
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 ""
|
||||
msgstr "Кэш очищен "
|
||||
|
||||
#: qt\preferences_dialog.py:173
|
||||
msgid "Use dark style"
|
||||
msgstr ""
|
||||
msgstr "Использовать темную тему"
|
||||
|
||||
#: qt\preferences_dialog.py:241
|
||||
msgid "Profile scan operation"
|
||||
msgstr ""
|
||||
msgstr "Сохранить профиль сканирования"
|
||||
|
||||
#: qt\preferences_dialog.py:242
|
||||
msgid "Profile the scan operation and save logs for optimization."
|
||||
msgstr ""
|
||||
"В папке установленной или портативной программы, есть папка Data в которую "
|
||||
"сохраняется логи и файл с раширением *.profile для оптимизации."
|
||||
|
||||
#: qt\preferences_dialog.py:246
|
||||
msgid "Logs located in: <a href=\"{}\">{}</a>"
|
||||
msgstr ""
|
||||
msgstr "Сохранять отчеты в: <a href=\"{}\">{}</a>"
|
||||
|
||||
#: qt\preferences_dialog.py:291
|
||||
msgid "Debug"
|
||||
msgstr ""
|
||||
msgstr "Отладка"
|
||||
|
||||
#: qt\about_box.py:31
|
||||
msgid "About {}"
|
||||
msgstr "О {}"
|
||||
msgstr "О программе {}"
|
||||
|
||||
#: qt\about_box.py:47
|
||||
msgid "Version {}"
|
||||
@ -1010,7 +1014,7 @@ msgstr "Версия {}"
|
||||
|
||||
#: qt\about_box.py:49 qt\about_box.py:75
|
||||
msgid "Checking for updates..."
|
||||
msgstr ""
|
||||
msgstr "Проверка обновлений..."
|
||||
|
||||
#: qt\about_box.py:54
|
||||
msgid "Licensed under GPLv3"
|
||||
@ -1018,11 +1022,11 @@ msgstr "Под лицензией GPLv3"
|
||||
|
||||
#: qt\about_box.py:68
|
||||
msgid "No update available."
|
||||
msgstr ""
|
||||
msgstr "У вас самая свежая версия"
|
||||
|
||||
#: qt\about_box.py:71
|
||||
msgid "New version {} available, download <a href=\"{}\">here</a>."
|
||||
msgstr ""
|
||||
msgstr "Обнаружена новая {} версия, загружать <a href=\"{}\">тут</a>."
|
||||
|
||||
#: qt\error_report_dialog.py:50
|
||||
msgid "Error Report"
|
||||
@ -1034,7 +1038,7 @@ msgstr "Что-то пошло не так. Хотите отправить от
|
||||
|
||||
#: qt\error_report_dialog.py:60
|
||||
msgid ""
|
||||
"Error reports should be reported as Github issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"Error reports should be reported as GitHub issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"\n"
|
||||
"Please make sure to run a search for any already existing issues beforehand. Also make sure to test the very latest version available from the repository, since the bug you are experiencing might have already been patched.\n"
|
||||
"\n"
|
||||
@ -1042,17 +1046,17 @@ msgid ""
|
||||
"\n"
|
||||
"Although the application should continue to run after this error, it may be in an unstable state, so it is recommended that you restart the application."
|
||||
msgstr ""
|
||||
"Отчеты об ошибках следует сообщать как о проблемах Github. Вы можете скопировать трассировку ошибки выше и вставить ее в новый выпуск.\n"
|
||||
"Отчеты об ошибках следует сообщать в виде проблем (issues) на GitHub. Вы можете скопировать приведенный выше отчет об ошибке и сообщить о нем на GitHub.\n"
|
||||
"\n"
|
||||
"Обязательно заранее выполните поиск любых уже существующих проблем. Также не забудьте протестировать самую последнюю версию, доступную в репозитории, поскольку ошибка, с которой вы столкнулись, могла уже быть исправлена.\n"
|
||||
"Пожалуйста, предварительно сделайте поиск уже существующих проблем в репозитории программы на GitHub. Также убедитесь, что вы используете самую последнюю версию, доступную из репозитория, поскольку ошибка, с которой вы столкнулись, возможно, уже исправлена.\n"
|
||||
"\n"
|
||||
"Что обычно действительно помогает, так это то, что вы добавляете описание того, как вы получили ошибку. Благодаря!\n"
|
||||
"Чтобы быстро и качественно решить проблему, очень поможет пошаговое описание действий пришедших к ошибке. Спасибо!\n"
|
||||
"\n"
|
||||
"Хотя приложение должно продолжить работу после этой ошибки, оно может находиться в нестабильном состоянии, поэтому рекомендуется перезапустить приложение."
|
||||
"Приложение должно продолжать работу после ошибки, хотя и не стабильно. Рекомендуется перезапустить программу."
|
||||
|
||||
#: qt\error_report_dialog.py:80
|
||||
msgid "Go to Github"
|
||||
msgstr "Перейти на Github"
|
||||
msgid "Go to GitHub"
|
||||
msgstr "Перейти на GitHub"
|
||||
|
||||
#: qt\preferences.py:24
|
||||
msgid "Czech"
|
||||
@ -1137,3 +1141,34 @@ msgstr "Очистить список"
|
||||
#: qt\search_edit.py:78
|
||||
msgid "Search..."
|
||||
msgstr "Искать..."
|
||||
|
||||
#: qt\preferences_dialog.py:219
|
||||
msgid ""
|
||||
"These options are for advanced users or for very specific situations, most "
|
||||
"users should not have to modify these."
|
||||
msgstr ""
|
||||
"Опция для опытных пользователей для различных специфичных ситуаций. Если не "
|
||||
"знаете, что делаете, не трогайте!"
|
||||
|
||||
#: qt\preferences_dialog.py:225
|
||||
msgid "Include existence check after scan completion"
|
||||
msgstr "Включить проверку после завершения сканирования"
|
||||
|
||||
#: qt\preferences_dialog.py:227
|
||||
msgid "Ignore difference in mtime when loading cached digests"
|
||||
msgstr "Игнорировать разницу во времени при загрузке кэшированных дайджестов"
|
||||
|
||||
#: qt\progress_window.py:64
|
||||
msgid "Cancel?"
|
||||
msgstr "Отменить?"
|
||||
|
||||
#: qt\progress_window.py:65
|
||||
msgid "Are you sure you want to cancel? All progress will be lost."
|
||||
msgstr "Вы уверены, что хотите отменить? Весь прогресс будет потерян."
|
||||
|
||||
#: qt\exclude_list_dialog.py:161
|
||||
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>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 ""
|
||||
|
@ -1,11 +1,11 @@
|
||||
# Translators:
|
||||
# Emin Tufan Çetin <etcetin@gmail.com>, 2022
|
||||
# Ahmet Haydar Işık <itsahmthydr@gmail.com>, 2022
|
||||
# Emin Tufan Çetin <etcetin@gmail.com>, 2022
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Ahmet Haydar Işık <itsahmthydr@gmail.com>, 2022\n"
|
||||
"Language-Team: Turkish (https://www.transifex.com/voltaicideas/teams/116153/tr/)\n"
|
||||
"Last-Translator: Emin Tufan Çetin <etcetin@gmail.com>, 2022\n"
|
||||
"Language-Team: Turkish (https://app.transifex.com/voltaicideas/teams/116153/tr/)\n"
|
||||
"Language: tr\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
@ -987,19 +987,19 @@ msgstr "Karanlık biçem kullan"
|
||||
|
||||
#: qt\preferences_dialog.py:241
|
||||
msgid "Profile scan operation"
|
||||
msgstr ""
|
||||
msgstr "Tarama işlemini profille"
|
||||
|
||||
#: qt\preferences_dialog.py:242
|
||||
msgid "Profile the scan operation and save logs for optimization."
|
||||
msgstr ""
|
||||
msgstr "Tarama işlemini profille ve iyileştirme için günlükleri kaydet."
|
||||
|
||||
#: qt\preferences_dialog.py:246
|
||||
msgid "Logs located in: <a href=\"{}\">{}</a>"
|
||||
msgstr ""
|
||||
msgstr "Günlükler şuradadır: <a href=\"{}\">{}</a>"
|
||||
|
||||
#: qt\preferences_dialog.py:291
|
||||
msgid "Debug"
|
||||
msgstr ""
|
||||
msgstr "Hata ayıklama"
|
||||
|
||||
#: qt\about_box.py:31
|
||||
msgid "About {}"
|
||||
@ -1011,7 +1011,7 @@ msgstr "Sürüm {}"
|
||||
|
||||
#: qt\about_box.py:49 qt\about_box.py:75
|
||||
msgid "Checking for updates..."
|
||||
msgstr ""
|
||||
msgstr "Güncellemeler denetleniyor..."
|
||||
|
||||
#: qt\about_box.py:54
|
||||
msgid "Licensed under GPLv3"
|
||||
@ -1019,11 +1019,11 @@ msgstr "GPLv3 altında lisanslanmıştır."
|
||||
|
||||
#: qt\about_box.py:68
|
||||
msgid "No update available."
|
||||
msgstr ""
|
||||
msgstr "Güncelleme yok."
|
||||
|
||||
#: qt\about_box.py:71
|
||||
msgid "New version {} available, download <a href=\"{}\">here</a>."
|
||||
msgstr ""
|
||||
msgstr "Yeni {} sürümü var, <a href=\"{}\">buradan</a> indirilebilir."
|
||||
|
||||
#: qt\error_report_dialog.py:50
|
||||
msgid "Error Report"
|
||||
@ -1035,7 +1035,7 @@ msgstr "Bir şeyler yanlış gitti. Hatayı raporlamak ister misin?"
|
||||
|
||||
#: qt\error_report_dialog.py:60
|
||||
msgid ""
|
||||
"Error reports should be reported as Github issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"Error reports should be reported as GitHub issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"\n"
|
||||
"Please make sure to run a search for any already existing issues beforehand. Also make sure to test the very latest version available from the repository, since the bug you are experiencing might have already been patched.\n"
|
||||
"\n"
|
||||
@ -1043,7 +1043,7 @@ msgid ""
|
||||
"\n"
|
||||
"Although the application should continue to run after this error, it may be in an unstable state, so it is recommended that you restart the application."
|
||||
msgstr ""
|
||||
"Hata raporları Github'da sorun (issue) olarak bildirilmelidir. Yukarıdaki hata kaynağını kopyalayabilir ve yeni sorun bildirimine yapıştırabilirsiniz\n"
|
||||
"Hata raporları GitHub'da sorun (issue) olarak bildirilmelidir. Yukarıdaki hata kaynağını kopyalayabilir ve yeni sorun bildirimine yapıştırabilirsiniz\n"
|
||||
"\n"
|
||||
"Lütfen yeni sorun bildirimi oluşturmadan önce var olan sorunları aradığınızdan emin olun. Ayrıca depoda bulunan en son sürümü sınadığınızdan emin olun, karşılaştığınız hata hâlihazırda düzeltilmiş olabilir.\n"
|
||||
"\n"
|
||||
@ -1052,8 +1052,8 @@ msgstr ""
|
||||
"Bu hatadan sonra uygulama çalışmaya sürdürebilse de kararsız durumda olabilir, bu nedenle uygulamayı yeniden başlatmanız önerilir."
|
||||
|
||||
#: qt\error_report_dialog.py:80
|
||||
msgid "Go to Github"
|
||||
msgstr "Github'a Git"
|
||||
msgid "Go to GitHub"
|
||||
msgstr "GitHub'a Git"
|
||||
|
||||
#: qt\preferences.py:24
|
||||
msgid "Czech"
|
||||
@ -1138,3 +1138,32 @@ msgstr "Listeyi Temizle"
|
||||
#: qt\search_edit.py:78
|
||||
msgid "Search..."
|
||||
msgstr "Ara..."
|
||||
|
||||
#: qt\preferences_dialog.py:219
|
||||
msgid ""
|
||||
"These options are for advanced users or for very specific situations, most "
|
||||
"users should not have to modify these."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:225
|
||||
msgid "Include existence check after scan completion"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:227
|
||||
msgid "Ignore difference in mtime when loading cached digests"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:64
|
||||
msgid "Cancel?"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:65
|
||||
msgid "Are you sure you want to cancel? All progress will be lost."
|
||||
msgstr ""
|
||||
|
||||
#: qt\exclude_list_dialog.py:161
|
||||
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>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 ""
|
||||
|
@ -996,7 +996,7 @@ msgstr ""
|
||||
|
||||
#: qt\error_report_dialog.py:60
|
||||
msgid ""
|
||||
"Error reports should be reported as Github issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"Error reports should be reported as GitHub issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"\n"
|
||||
"Please make sure to run a search for any already existing issues beforehand. Also make sure to test the very latest version available from the repository, since the bug you are experiencing might have already been patched.\n"
|
||||
"\n"
|
||||
@ -1006,7 +1006,7 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
#: qt\error_report_dialog.py:80
|
||||
msgid "Go to Github"
|
||||
msgid "Go to GitHub"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences.py:24
|
||||
@ -1092,3 +1092,32 @@ msgstr ""
|
||||
#: qt\search_edit.py:78
|
||||
msgid "Search..."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:219
|
||||
msgid ""
|
||||
"These options are for advanced users or for very specific situations, most "
|
||||
"users should not have to modify these."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:225
|
||||
msgid "Include existence check after scan completion"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:227
|
||||
msgid "Ignore difference in mtime when loading cached digests"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:64
|
||||
msgid "Cancel?"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:65
|
||||
msgid "Are you sure you want to cancel? All progress will be lost."
|
||||
msgstr ""
|
||||
|
||||
#: qt\exclude_list_dialog.py:161
|
||||
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>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 ""
|
||||
|
@ -5,7 +5,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Fuan <jcfrt@posteo.net>, 2022\n"
|
||||
"Language-Team: Ukrainian (https://www.transifex.com/voltaicideas/teams/116153/uk/)\n"
|
||||
"Language-Team: Ukrainian (https://app.transifex.com/voltaicideas/teams/116153/uk/)\n"
|
||||
"Language: uk\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
@ -1034,7 +1034,7 @@ msgstr "Щось пішло не так. Як щодо повідомлення
|
||||
|
||||
#: qt\error_report_dialog.py:60
|
||||
msgid ""
|
||||
"Error reports should be reported as Github issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"Error reports should be reported as GitHub issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"\n"
|
||||
"Please make sure to run a search for any already existing issues beforehand. Also make sure to test the very latest version available from the repository, since the bug you are experiencing might have already been patched.\n"
|
||||
"\n"
|
||||
@ -1042,7 +1042,7 @@ msgid ""
|
||||
"\n"
|
||||
"Although the application should continue to run after this error, it may be in an unstable state, so it is recommended that you restart the application."
|
||||
msgstr ""
|
||||
"Звіти про помилки слід повідомляти як проблеми Github. Ви можете скопіювати помилку відстеження помилки вище та вставити її в нове видання.\n"
|
||||
"Звіти про помилки слід повідомляти як проблеми GitHub. Ви можете скопіювати помилку відстеження помилки вище та вставити її в нове видання.\n"
|
||||
"\n"
|
||||
"Будь ласка, не забудьте заздалегідь здійснити пошук уже існуючих проблем. Також не забудьте протестувати найновішу версію, доступну зі сховища, оскільки виправлена помилка, можливо, вже виправлена.\n"
|
||||
"\n"
|
||||
@ -1051,8 +1051,8 @@ msgstr ""
|
||||
"Незважаючи на те, що програма повинна продовжувати працювати після цієї помилки, вона може бути в нестабільному стані, тому рекомендується перезапустити програму."
|
||||
|
||||
#: qt\error_report_dialog.py:80
|
||||
msgid "Go to Github"
|
||||
msgstr "Перейдіть до Github"
|
||||
msgid "Go to GitHub"
|
||||
msgstr "Перейдіть до GitHub"
|
||||
|
||||
#: qt\preferences.py:24
|
||||
msgid "Czech"
|
||||
@ -1137,3 +1137,32 @@ msgstr "Очистити список"
|
||||
#: qt\search_edit.py:78
|
||||
msgid "Search..."
|
||||
msgstr "Шукати..."
|
||||
|
||||
#: qt\preferences_dialog.py:219
|
||||
msgid ""
|
||||
"These options are for advanced users or for very specific situations, most "
|
||||
"users should not have to modify these."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:225
|
||||
msgid "Include existence check after scan completion"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:227
|
||||
msgid "Ignore difference in mtime when loading cached digests"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:64
|
||||
msgid "Cancel?"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:65
|
||||
msgid "Are you sure you want to cancel? All progress will be lost."
|
||||
msgstr ""
|
||||
|
||||
#: qt\exclude_list_dialog.py:161
|
||||
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>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 ""
|
||||
|
@ -5,7 +5,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Fuan <jcfrt@posteo.net>, 2022\n"
|
||||
"Language-Team: Vietnamese (https://www.transifex.com/voltaicideas/teams/116153/vi/)\n"
|
||||
"Language-Team: Vietnamese (https://app.transifex.com/voltaicideas/teams/116153/vi/)\n"
|
||||
"Language: vi\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
@ -1035,7 +1035,7 @@ msgstr "Đã xảy ra lỗi. Làm thế nào về việc báo cáo lỗi?"
|
||||
|
||||
#: qt\error_report_dialog.py:60
|
||||
msgid ""
|
||||
"Error reports should be reported as Github issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"Error reports should be reported as GitHub issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"\n"
|
||||
"Please make sure to run a search for any already existing issues beforehand. Also make sure to test the very latest version available from the repository, since the bug you are experiencing might have already been patched.\n"
|
||||
"\n"
|
||||
@ -1043,7 +1043,7 @@ msgid ""
|
||||
"\n"
|
||||
"Although the application should continue to run after this error, it may be in an unstable state, so it is recommended that you restart the application."
|
||||
msgstr ""
|
||||
"Các báo cáo lỗi phải được báo cáo dưới dạng sự cố Github. Bạn có thể sao chép các traceback lỗi trên và dán nó vào một vấn đề mới.\n"
|
||||
"Các báo cáo lỗi phải được báo cáo dưới dạng sự cố GitHub. Bạn có thể sao chép các traceback lỗi trên và dán nó vào một vấn đề mới.\n"
|
||||
"\n"
|
||||
"Vui lòng đảm bảo chạy tìm kiếm bất kỳ vấn đề nào đã tồn tại trước đó. Ngoài ra, hãy đảm bảo kiểm tra phiên bản mới nhất có sẵn từ kho lưu trữ, vì lỗi bạn đang gặp phải có thể đã được vá.\n"
|
||||
"\n"
|
||||
@ -1052,8 +1052,8 @@ msgstr ""
|
||||
"Mặc dù ứng dụng sẽ tiếp tục chạy sau lỗi này, nhưng nó có thể ở trạng thái không ổn định, vì vậy bạn nên khởi động lại ứng dụng."
|
||||
|
||||
#: qt\error_report_dialog.py:80
|
||||
msgid "Go to Github"
|
||||
msgstr "Truy cập Github"
|
||||
msgid "Go to GitHub"
|
||||
msgstr "Truy cập GitHub"
|
||||
|
||||
#: qt\preferences.py:24
|
||||
msgid "Czech"
|
||||
@ -1138,3 +1138,32 @@ msgstr "Xóa danh sách"
|
||||
#: qt\search_edit.py:78
|
||||
msgid "Search..."
|
||||
msgstr "Tìm kiếm..."
|
||||
|
||||
#: qt\preferences_dialog.py:219
|
||||
msgid ""
|
||||
"These options are for advanced users or for very specific situations, most "
|
||||
"users should not have to modify these."
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:225
|
||||
msgid "Include existence check after scan completion"
|
||||
msgstr ""
|
||||
|
||||
#: qt\preferences_dialog.py:227
|
||||
msgid "Ignore difference in mtime when loading cached digests"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:64
|
||||
msgid "Cancel?"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:65
|
||||
msgid "Are you sure you want to cancel? All progress will be lost."
|
||||
msgstr ""
|
||||
|
||||
#: qt\exclude_list_dialog.py:161
|
||||
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>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 ""
|
||||
|
@ -2,12 +2,12 @@
|
||||
# Fuan <jcfrt@posteo.net>, 2022
|
||||
# 太子 VC <taiziccf@gmail.com>, 2022
|
||||
# Andrew Senetar <arsenetar@gmail.com>, 2022
|
||||
# Chris Ocelot, 2022
|
||||
# Chris Ocelot, 2023
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Chris Ocelot, 2022\n"
|
||||
"Language-Team: Chinese (China) (https://www.transifex.com/voltaicideas/teams/116153/zh_CN/)\n"
|
||||
"Last-Translator: Chris Ocelot, 2023\n"
|
||||
"Language-Team: Chinese (China) (https://app.transifex.com/voltaicideas/teams/116153/zh_CN/)\n"
|
||||
"Language: zh_CN\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
@ -927,11 +927,11 @@ msgstr "展示"
|
||||
|
||||
#: qt\se\preferences_dialog.py:70
|
||||
msgid "Partially hash files bigger than"
|
||||
msgstr "只哈希部分如果文件大于"
|
||||
msgstr "只计算部分hash,如果文件大于"
|
||||
|
||||
#: qt\se\preferences_dialog.py:80
|
||||
msgid "MB"
|
||||
msgstr ""
|
||||
msgstr "MB"
|
||||
|
||||
#: qt\preferences_dialog.py:163
|
||||
msgid "Use native OS dialogs"
|
||||
@ -945,41 +945,41 @@ msgstr "使用操作系统原生对话窗口选择文件、文件夹。部分系
|
||||
|
||||
#: qt\se\preferences_dialog.py:68
|
||||
msgid "Ignore files larger than"
|
||||
msgstr ""
|
||||
msgstr "忽略文件,如果大于"
|
||||
|
||||
#: qt\app.py:135 qt\app.py:293
|
||||
msgid "Clear Cache"
|
||||
msgstr ""
|
||||
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 ""
|
||||
msgstr "你确定要清除缓存吗?所有缓存的文件hash和图片分析都会被移除。"
|
||||
|
||||
#: qt\app.py:299
|
||||
msgid "Cache cleared."
|
||||
msgstr ""
|
||||
msgstr "缓存已清除。"
|
||||
|
||||
#: qt\preferences_dialog.py:173
|
||||
msgid "Use dark style"
|
||||
msgstr ""
|
||||
msgstr "使用暗色主题"
|
||||
|
||||
#: qt\preferences_dialog.py:241
|
||||
msgid "Profile scan operation"
|
||||
msgstr ""
|
||||
msgstr "将扫描操作保存为配置"
|
||||
|
||||
#: qt\preferences_dialog.py:242
|
||||
msgid "Profile the scan operation and save logs for optimization."
|
||||
msgstr ""
|
||||
msgstr "将扫描操作保存为配置,并保存日志用于优化。"
|
||||
|
||||
#: qt\preferences_dialog.py:246
|
||||
msgid "Logs located in: <a href=\"{}\">{}</a>"
|
||||
msgstr ""
|
||||
msgstr "日志位于:<a href=\"{}\">{}"
|
||||
|
||||
#: qt\preferences_dialog.py:291
|
||||
msgid "Debug"
|
||||
msgstr ""
|
||||
msgstr "调试"
|
||||
|
||||
#: qt\about_box.py:31
|
||||
msgid "About {}"
|
||||
@ -991,7 +991,7 @@ msgstr "版本 {}"
|
||||
|
||||
#: qt\about_box.py:49 qt\about_box.py:75
|
||||
msgid "Checking for updates..."
|
||||
msgstr ""
|
||||
msgstr "检查更新..."
|
||||
|
||||
#: qt\about_box.py:54
|
||||
msgid "Licensed under GPLv3"
|
||||
@ -999,11 +999,11 @@ msgstr "本项目基于GPLv3开源协议发布"
|
||||
|
||||
#: qt\about_box.py:68
|
||||
msgid "No update available."
|
||||
msgstr ""
|
||||
msgstr "没有新版本。"
|
||||
|
||||
#: qt\about_box.py:71
|
||||
msgid "New version {} available, download <a href=\"{}\">here</a>."
|
||||
msgstr ""
|
||||
msgstr "有新版本{}可用,在<a href=\"{}\">这里</a>下载。"
|
||||
|
||||
#: qt\error_report_dialog.py:50
|
||||
msgid "Error Report"
|
||||
@ -1015,7 +1015,7 @@ msgstr "发生错误,是否要报告错误?"
|
||||
|
||||
#: qt\error_report_dialog.py:60
|
||||
msgid ""
|
||||
"Error reports should be reported as Github issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"Error reports should be reported as GitHub issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"\n"
|
||||
"Please make sure to run a search for any already existing issues beforehand. Also make sure to test the very latest version available from the repository, since the bug you are experiencing might have already been patched.\n"
|
||||
"\n"
|
||||
@ -1023,7 +1023,7 @@ msgid ""
|
||||
"\n"
|
||||
"Although the application should continue to run after this error, it may be in an unstable state, so it is recommended that you restart the application."
|
||||
msgstr ""
|
||||
"错误报告应该以Github issue的形式进行提交。您可以把错误信息复制粘贴到新的issue中\n"
|
||||
"错误报告应该以GitHub issue的形式进行提交。您可以把错误信息复制粘贴到新的issue中\n"
|
||||
"\n"
|
||||
"在提交新issue前,请搜索已经存在的issue,以确保没有其他人已经报告了相同的错误。同时请确保使用仓库中的最新版进行测试,因为您所遇到的bug可能已经被最新版修复。\n"
|
||||
"\n"
|
||||
@ -1032,8 +1032,8 @@ msgstr ""
|
||||
"虽然本程序在此错误后依然会继续运行,但是可能处于不稳定的状态,因此推荐重启本程序。"
|
||||
|
||||
#: qt\error_report_dialog.py:80
|
||||
msgid "Go to Github"
|
||||
msgstr "前往Github"
|
||||
msgid "Go to GitHub"
|
||||
msgstr "前往GitHub"
|
||||
|
||||
#: qt\preferences.py:24
|
||||
msgid "Czech"
|
||||
@ -1118,3 +1118,32 @@ msgstr "清空列表"
|
||||
#: qt\search_edit.py:78
|
||||
msgid "Search..."
|
||||
msgstr "搜索..."
|
||||
|
||||
#: qt\preferences_dialog.py:219
|
||||
msgid ""
|
||||
"These options are for advanced users or for very specific situations, most "
|
||||
"users should not have to modify these."
|
||||
msgstr "这些选项是供高级用户或者特定情况下使用,大多数用户不该修改它们。"
|
||||
|
||||
#: qt\preferences_dialog.py:225
|
||||
msgid "Include existence check after scan completion"
|
||||
msgstr "在扫描结束后检查文件是否存在"
|
||||
|
||||
#: qt\preferences_dialog.py:227
|
||||
msgid "Ignore difference in mtime when loading cached digests"
|
||||
msgstr "载入缓存摘要时忽略mtime的不同"
|
||||
|
||||
#: qt\progress_window.py:64
|
||||
msgid "Cancel?"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:65
|
||||
msgid "Are you sure you want to cancel? All progress will be lost."
|
||||
msgstr ""
|
||||
|
||||
#: qt\exclude_list_dialog.py:161
|
||||
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>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 ""
|
||||
|
@ -2,12 +2,12 @@
|
||||
# Fuan <jcfrt@posteo.net>, 2022
|
||||
# 太子 VC <taiziccf@gmail.com>, 2022
|
||||
# Andrew Senetar <arsenetar@gmail.com>, 2022
|
||||
# Chris Ocelot, 2022
|
||||
# Chris Ocelot, 2023
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: Chris Ocelot, 2022\n"
|
||||
"Language-Team: Chinese (Taiwan) (https://www.transifex.com/voltaicideas/teams/116153/zh_TW/)\n"
|
||||
"Last-Translator: Chris Ocelot, 2023\n"
|
||||
"Language-Team: Chinese (Taiwan) (https://app.transifex.com/voltaicideas/teams/116153/zh_TW/)\n"
|
||||
"Language: zh_TW\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: utf-8\n"
|
||||
@ -931,7 +931,7 @@ msgstr "只哈希部分如果文件大于"
|
||||
|
||||
#: qt\se\preferences_dialog.py:80
|
||||
msgid "MB"
|
||||
msgstr ""
|
||||
msgstr "MB"
|
||||
|
||||
#: qt\preferences_dialog.py:163
|
||||
msgid "Use native OS dialogs"
|
||||
@ -945,41 +945,41 @@ msgstr "使用操作系统原生对话窗口选择文件、文件夹。部分系
|
||||
|
||||
#: qt\se\preferences_dialog.py:68
|
||||
msgid "Ignore files larger than"
|
||||
msgstr ""
|
||||
msgstr "忽略文件,如果大于"
|
||||
|
||||
#: qt\app.py:135 qt\app.py:293
|
||||
msgid "Clear Cache"
|
||||
msgstr ""
|
||||
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 ""
|
||||
msgstr "你确定要清除缓存吗?所有缓存的文件hash和图片分析都会被移除。"
|
||||
|
||||
#: qt\app.py:299
|
||||
msgid "Cache cleared."
|
||||
msgstr ""
|
||||
msgstr "缓存已清除。"
|
||||
|
||||
#: qt\preferences_dialog.py:173
|
||||
msgid "Use dark style"
|
||||
msgstr ""
|
||||
msgstr "使用暗色主题"
|
||||
|
||||
#: qt\preferences_dialog.py:241
|
||||
msgid "Profile scan operation"
|
||||
msgstr ""
|
||||
msgstr "将扫描操作保存为配置"
|
||||
|
||||
#: qt\preferences_dialog.py:242
|
||||
msgid "Profile the scan operation and save logs for optimization."
|
||||
msgstr ""
|
||||
msgstr "将扫描操作保存为配置,并保存日志用于优化。"
|
||||
|
||||
#: qt\preferences_dialog.py:246
|
||||
msgid "Logs located in: <a href=\"{}\">{}</a>"
|
||||
msgstr ""
|
||||
msgstr "日志位于:<a href=\"{}\">{}"
|
||||
|
||||
#: qt\preferences_dialog.py:291
|
||||
msgid "Debug"
|
||||
msgstr ""
|
||||
msgstr "调试"
|
||||
|
||||
#: qt\about_box.py:31
|
||||
msgid "About {}"
|
||||
@ -991,7 +991,7 @@ msgstr "版本 {}"
|
||||
|
||||
#: qt\about_box.py:49 qt\about_box.py:75
|
||||
msgid "Checking for updates..."
|
||||
msgstr ""
|
||||
msgstr "检查更新..."
|
||||
|
||||
#: qt\about_box.py:54
|
||||
msgid "Licensed under GPLv3"
|
||||
@ -999,11 +999,11 @@ msgstr "本项目基于GPLv3开源协议发布"
|
||||
|
||||
#: qt\about_box.py:68
|
||||
msgid "No update available."
|
||||
msgstr ""
|
||||
msgstr "没有新版本。"
|
||||
|
||||
#: qt\about_box.py:71
|
||||
msgid "New version {} available, download <a href=\"{}\">here</a>."
|
||||
msgstr ""
|
||||
msgstr "有新版本{}可用,在<a href=\"{}\">这里</a>下载。"
|
||||
|
||||
#: qt\error_report_dialog.py:50
|
||||
msgid "Error Report"
|
||||
@ -1015,7 +1015,7 @@ msgstr "发生错误,是否要报告错误?"
|
||||
|
||||
#: qt\error_report_dialog.py:60
|
||||
msgid ""
|
||||
"Error reports should be reported as Github issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"Error reports should be reported as GitHub issues. You can copy the error traceback above and paste it in a new issue.\n"
|
||||
"\n"
|
||||
"Please make sure to run a search for any already existing issues beforehand. Also make sure to test the very latest version available from the repository, since the bug you are experiencing might have already been patched.\n"
|
||||
"\n"
|
||||
@ -1023,7 +1023,7 @@ msgid ""
|
||||
"\n"
|
||||
"Although the application should continue to run after this error, it may be in an unstable state, so it is recommended that you restart the application."
|
||||
msgstr ""
|
||||
"错误报告应该以Github issue的形式进行提交。您可以把错误信息复制粘贴到新的issue中\n"
|
||||
"错误报告应该以GitHub issue的形式进行提交。您可以把错误信息复制粘贴到新的issue中\n"
|
||||
"\n"
|
||||
"在提交新issue前,请搜索已经存在的issue,以确保没有其他人已经报告了相同的错误。同时请确保使用仓库中的最新版进行测试,因为您所遇到的bug可能已经被最新版修复。\n"
|
||||
"\n"
|
||||
@ -1032,8 +1032,8 @@ msgstr ""
|
||||
"虽然本程序在此错误后依然会继续运行,但是可能处于不稳定的状态,因此推荐重启本程序。"
|
||||
|
||||
#: qt\error_report_dialog.py:80
|
||||
msgid "Go to Github"
|
||||
msgstr "前往Github"
|
||||
msgid "Go to GitHub"
|
||||
msgstr "前往GitHub"
|
||||
|
||||
#: qt\preferences.py:24
|
||||
msgid "Czech"
|
||||
@ -1118,3 +1118,32 @@ msgstr "清空列表"
|
||||
#: qt\search_edit.py:78
|
||||
msgid "Search..."
|
||||
msgstr "搜索..."
|
||||
|
||||
#: qt\preferences_dialog.py:219
|
||||
msgid ""
|
||||
"These options are for advanced users or for very specific situations, most "
|
||||
"users should not have to modify these."
|
||||
msgstr "这些选项是供高级用户或者特定情况下使用,大多数用户不该修改它们。"
|
||||
|
||||
#: qt\preferences_dialog.py:225
|
||||
msgid "Include existence check after scan completion"
|
||||
msgstr "在扫描结束后检查文件是否存在"
|
||||
|
||||
#: qt\preferences_dialog.py:227
|
||||
msgid "Ignore difference in mtime when loading cached digests"
|
||||
msgstr "载入缓存摘要时忽略mtime的不同"
|
||||
|
||||
#: qt\progress_window.py:64
|
||||
msgid "Cancel?"
|
||||
msgstr ""
|
||||
|
||||
#: qt\progress_window.py:65
|
||||
msgid "Are you sure you want to cancel? All progress will be lost."
|
||||
msgstr ""
|
||||
|
||||
#: qt\exclude_list_dialog.py:161
|
||||
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>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 ""
|
||||
|
@ -122,7 +122,7 @@ def package_arch():
|
||||
# need to include them).
|
||||
print("Packaging for Arch")
|
||||
srcpath = op.join("build", "dupeguru-arch")
|
||||
packages = ["hscommon", "core", "qt", "send2trash"]
|
||||
packages = ["hscommon", "core", "qt"]
|
||||
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")))
|
||||
|
@ -348,4 +348,3 @@ dupeguru (2.9.2-1) unstable; urgency=low
|
||||
* Fixed selection glitches, especially while renaming. (#93)
|
||||
|
||||
-- Virgil Dupras <hsoft@hardcoded.net> Wed, 10 Feb 2010 00:00:00 +0000
|
||||
|
||||
|
@ -10,7 +10,7 @@ Vcs-Git: https://github.com/arsenetar/dupeguru.git
|
||||
|
||||
Package: {pkgname}
|
||||
Architecture: {arch}
|
||||
Depends: ${shlibs:Depends}, python3 (>=3.7), python3-pyqt5, python3-mutagen, python3-semantic-version
|
||||
Depends: ${shlibs:Depends}, python3 (>=3.7), python3 (<<3.12), python3-pyqt5, python3-mutagen, python3-semantic-version
|
||||
Provides: dupeguru-se, dupeguru-me, dupeguru-pe
|
||||
Replaces: dupeguru-se, dupeguru-me, dupeguru-pe
|
||||
Conflicts: dupeguru-se, dupeguru-me, dupeguru-pe
|
||||
|
@ -6,3 +6,4 @@ Icon=dupeguru
|
||||
Terminal=false
|
||||
Type=Application
|
||||
Categories=Utility;
|
||||
Keywords=file manager;gui;
|
||||
|
@ -192,7 +192,8 @@ class DupeGuru(QObject):
|
||||
scanned_tags.add("year")
|
||||
self.model.options["scanned_tags"] = scanned_tags
|
||||
self.model.options["match_scaled"] = self.prefs.match_scaled
|
||||
self.model.options["picture_cache_type"] = self.prefs.picture_cache_type
|
||||
self.model.options["include_exists_check"] = self.prefs.include_exists_check
|
||||
self.model.options["rehash_ignore_mtime"] = self.prefs.rehash_ignore_mtime
|
||||
|
||||
if self.details_dialog:
|
||||
self.details_dialog.update_options()
|
||||
|
@ -43,7 +43,7 @@ class ErrorReportDialog(QDialog):
|
||||
self.errorTextEdit.setPlainText(error_text)
|
||||
self.github_url = github_url
|
||||
|
||||
self.sendButton.clicked.connect(self.goToGithub)
|
||||
self.sendButton.clicked.connect(self.goToGitHub)
|
||||
self.dontSendButton.clicked.connect(self.reject)
|
||||
|
||||
def _setupUi(self):
|
||||
@ -58,7 +58,7 @@ class ErrorReportDialog(QDialog):
|
||||
self.errorTextEdit.setReadOnly(True)
|
||||
self.verticalLayout.addWidget(self.errorTextEdit)
|
||||
msg = tr(
|
||||
"Error reports should be reported as Github issues. You can copy the error traceback "
|
||||
"Error reports should be reported as GitHub issues. You can copy the error traceback "
|
||||
"above and paste it in a new issue.\n\nPlease make sure to run a search for any already "
|
||||
"existing issues beforehand. Also make sure to test the very latest version available from the repository, "
|
||||
"since the bug you are experiencing might have already been patched.\n\n"
|
||||
@ -77,13 +77,13 @@ class ErrorReportDialog(QDialog):
|
||||
self.dontSendButton.setMinimumSize(QSize(110, 0))
|
||||
self.horizontalLayout.addWidget(self.dontSendButton)
|
||||
self.sendButton = QPushButton(self)
|
||||
self.sendButton.setText(tr("Go to Github"))
|
||||
self.sendButton.setText(tr("Go to GitHub"))
|
||||
self.sendButton.setMinimumSize(QSize(110, 0))
|
||||
self.sendButton.setDefault(True)
|
||||
self.horizontalLayout.addWidget(self.sendButton)
|
||||
self.verticalLayout.addLayout(self.horizontalLayout)
|
||||
|
||||
def goToGithub(self):
|
||||
def goToGitHub(self):
|
||||
open_url(self.github_url)
|
||||
|
||||
|
||||
|
@ -165,8 +165,8 @@ 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>
|
||||
<li>2. Regular expressions with at least one path separator in them will be compared to the full path to the file.</li><br>
|
||||
Example: if you want to filter out .PNG files from the "My Pictures" directory only:<br>\
|
||||
<li>2. Regular expressions with at least one path separator in them will be compared to the full path to the file.</li>\
|
||||
<br>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>
|
||||
|
@ -31,7 +31,10 @@ class File(PhotoBase):
|
||||
image = image.convertToFormat(QImage.Format_RGB888)
|
||||
if type(orientation) != int:
|
||||
logging.warning(
|
||||
"Orientation for file '%s' was a %s '%s', not an int.", str(self.path), type(orientation), orientation
|
||||
"Orientation for file '%s' was a %s '%s', not an int.",
|
||||
str(self.path),
|
||||
type(orientation),
|
||||
orientation,
|
||||
)
|
||||
try:
|
||||
orientation = int(orientation)
|
||||
|
@ -4,11 +4,9 @@
|
||||
# which should be included with this package. The terms are also available at
|
||||
# http://www.gnu.org/licenses/gpl-3.0.html
|
||||
|
||||
from PyQt5.QtWidgets import QFormLayout
|
||||
from PyQt5.QtCore import Qt
|
||||
|
||||
from hscommon.trans import trget
|
||||
from hscommon.plat import ISLINUX
|
||||
from qt.radio_box import RadioBox
|
||||
from core.scanner import ScanType
|
||||
from core.app import AppMode
|
||||
|
||||
@ -35,11 +33,6 @@ class PreferencesDialog(PreferencesDialogBase):
|
||||
)
|
||||
self.widgetsVLayout.addWidget(self.ignoreHardlinkMatches)
|
||||
|
||||
self.cacheTypeRadio = RadioBox(self, items=["Sqlite", "Shelve"], spread=False)
|
||||
cache_form = QFormLayout()
|
||||
cache_form.setLabelAlignment(Qt.AlignLeft)
|
||||
cache_form.addRow(tr("Picture cache mode:"), self.cacheTypeRadio)
|
||||
self.widgetsVLayout.addLayout(cache_form)
|
||||
self._setupBottomPart()
|
||||
|
||||
def _setupDisplayPage(self):
|
||||
@ -64,7 +57,6 @@ show scrollbars to span the view around"
|
||||
|
||||
def _load(self, prefs, setchecked, section):
|
||||
setchecked(self.matchScaledBox, prefs.match_scaled)
|
||||
self.cacheTypeRadio.selected_index = 1 if prefs.picture_cache_type == "shelve" else 0
|
||||
|
||||
# Update UI state based on selected scan type
|
||||
scan_type = prefs.get_scan_type(AppMode.PICTURE)
|
||||
@ -75,6 +67,5 @@ show scrollbars to span the view around"
|
||||
|
||||
def _save(self, prefs, ischecked):
|
||||
prefs.match_scaled = ischecked(self.matchScaledBox)
|
||||
prefs.picture_cache_type = "shelve" if self.cacheTypeRadio.selected_index == 1 else "sqlite"
|
||||
prefs.details_dialog_override_theme_icons = ischecked(self.details_dialog_override_theme_icons)
|
||||
prefs.details_dialog_viewers_show_scrollbars = ischecked(self.details_dialog_viewers_show_scrollbars)
|
||||
|
@ -161,6 +161,8 @@ class Preferences(PreferencesBase):
|
||||
self.ignore_hardlink_matches = get("IgnoreHardlinkMatches", self.ignore_hardlink_matches)
|
||||
self.use_regexp = get("UseRegexp", self.use_regexp)
|
||||
self.remove_empty_folders = get("RemoveEmptyFolders", self.remove_empty_folders)
|
||||
self.rehash_ignore_mtime = get("RehashIgnoreMTime", self.rehash_ignore_mtime)
|
||||
self.include_exists_check = get("IncludeExistsCheck", self.include_exists_check)
|
||||
self.debug_mode = get("DebugMode", self.debug_mode)
|
||||
self.profile_scan = get("ProfileScan", self.profile_scan)
|
||||
self.destination_type = get("DestinationType", self.destination_type)
|
||||
@ -223,7 +225,6 @@ class Preferences(PreferencesBase):
|
||||
self.scan_tag_genre = get("ScanTagGenre", self.scan_tag_genre)
|
||||
self.scan_tag_year = get("ScanTagYear", self.scan_tag_year)
|
||||
self.match_scaled = get("MatchScaled", self.match_scaled)
|
||||
self.picture_cache_type = get("PictureCacheType", self.picture_cache_type)
|
||||
|
||||
def reset(self):
|
||||
self.filter_hardness = 95
|
||||
@ -231,6 +232,8 @@ class Preferences(PreferencesBase):
|
||||
self.use_regexp = False
|
||||
self.ignore_hardlink_matches = False
|
||||
self.remove_empty_folders = False
|
||||
self.rehash_ignore_mtime = False
|
||||
self.include_exists_check = True
|
||||
self.debug_mode = False
|
||||
self.profile_scan = False
|
||||
self.destination_type = 1
|
||||
@ -274,7 +277,6 @@ class Preferences(PreferencesBase):
|
||||
self.scan_tag_genre = False
|
||||
self.scan_tag_year = False
|
||||
self.match_scaled = False
|
||||
self.picture_cache_type = "sqlite"
|
||||
|
||||
def _save_values(self, settings):
|
||||
set_ = self.set_value
|
||||
@ -283,6 +285,8 @@ class Preferences(PreferencesBase):
|
||||
set_("IgnoreHardlinkMatches", self.ignore_hardlink_matches)
|
||||
set_("UseRegexp", self.use_regexp)
|
||||
set_("RemoveEmptyFolders", self.remove_empty_folders)
|
||||
set_("RehashIgnoreMTime", self.rehash_ignore_mtime)
|
||||
set_("IncludeExistsCheck", self.include_exists_check)
|
||||
set_("DebugMode", self.debug_mode)
|
||||
set_("ProfileScan", self.profile_scan)
|
||||
set_("DestinationType", self.destination_type)
|
||||
@ -326,7 +330,6 @@ class Preferences(PreferencesBase):
|
||||
set_("ScanTagGenre", self.scan_tag_genre)
|
||||
set_("ScanTagYear", self.scan_tag_year)
|
||||
set_("MatchScaled", self.match_scaled)
|
||||
set_("PictureCacheType", self.picture_cache_type)
|
||||
|
||||
# scan_type is special because we save it immediately when we set it.
|
||||
def get_scan_type(self, app_mode):
|
||||
|
@ -47,8 +47,9 @@ class Sections(Flag):
|
||||
|
||||
GENERAL = auto()
|
||||
DISPLAY = auto()
|
||||
ADVANCED = auto()
|
||||
DEBUG = auto()
|
||||
ALL = GENERAL | DISPLAY | DEBUG
|
||||
ALL = GENERAL | DISPLAY | ADVANCED | DEBUG
|
||||
|
||||
|
||||
class PreferencesDialogBase(QDialog):
|
||||
@ -145,7 +146,8 @@ On MacOS, the tab bar will fill up the window's width instead."
|
||||
)
|
||||
self.use_native_dialogs.setToolTip(
|
||||
tr(
|
||||
"For actions such as file/folder selection use the OS native dialogs.\nSome native dialogs have limited functionality."
|
||||
"For actions such as file/folder selection use the OS native dialogs.\n\
|
||||
Some native dialogs have limited functionality."
|
||||
)
|
||||
)
|
||||
layout.addWidget(self.use_native_dialogs)
|
||||
@ -213,6 +215,20 @@ use the modifier key to drag the floating window around"
|
||||
details_groupbox.setLayout(self.details_groupbox_layout)
|
||||
self.displayVLayout.addWidget(details_groupbox)
|
||||
|
||||
def _setup_advanced_page(self):
|
||||
tab_label = QLabel(
|
||||
tr(
|
||||
"These options are for advanced users or for very specific situations, \
|
||||
most users should not have to modify these."
|
||||
),
|
||||
wordWrap=True,
|
||||
)
|
||||
self.advanced_vlayout.addWidget(tab_label)
|
||||
self._setupAddCheckbox("include_exists_check_box", tr("Include existence check after scan completion"))
|
||||
self.advanced_vlayout.addWidget(self.include_exists_check_box)
|
||||
self._setupAddCheckbox("rehash_ignore_mtime_box", tr("Ignore difference in mtime when loading cached digests"))
|
||||
self.advanced_vlayout.addWidget(self.rehash_ignore_mtime_box)
|
||||
|
||||
def _setupDebugPage(self):
|
||||
self._setupAddCheckbox("debugModeBox", tr("Debug mode (restart required)"))
|
||||
self._setupAddCheckbox("profile_scan_box", tr("Profile scan operation"))
|
||||
@ -244,16 +260,20 @@ use the modifier key to drag the floating window around"
|
||||
self.tabwidget = QTabWidget()
|
||||
self.page_general = QWidget()
|
||||
self.page_display = QWidget()
|
||||
self.page_advanced = QWidget()
|
||||
self.page_debug = QWidget()
|
||||
self.widgetsVLayout = QVBoxLayout()
|
||||
self.page_general.setLayout(self.widgetsVLayout)
|
||||
self.displayVLayout = QVBoxLayout()
|
||||
self.displayVLayout.setSpacing(5) # arbitrary value, might conflict with style
|
||||
self.page_display.setLayout(self.displayVLayout)
|
||||
self.advanced_vlayout = QVBoxLayout()
|
||||
self.page_advanced.setLayout(self.advanced_vlayout)
|
||||
self.debugVLayout = QVBoxLayout()
|
||||
self.page_debug.setLayout(self.debugVLayout)
|
||||
self._setupPreferenceWidgets()
|
||||
self._setupDisplayPage()
|
||||
self._setup_advanced_page()
|
||||
self._setupDebugPage()
|
||||
# self.mainVLayout.addLayout(self.widgetsVLayout)
|
||||
self.buttonBox = QDialogButtonBox(self)
|
||||
@ -265,9 +285,11 @@ use the modifier key to drag the floating window around"
|
||||
self.layout().setSizeConstraint(QLayout.SetFixedSize)
|
||||
self.tabwidget.addTab(self.page_general, tr("General"))
|
||||
self.tabwidget.addTab(self.page_display, tr("Display"))
|
||||
self.tabwidget.addTab(self.page_advanced, tr("Advanced"))
|
||||
self.tabwidget.addTab(self.page_debug, tr("Debug"))
|
||||
self.displayVLayout.addStretch(0)
|
||||
self.widgetsVLayout.addStretch(0)
|
||||
self.advanced_vlayout.addStretch(0)
|
||||
self.debugVLayout.addStretch(0)
|
||||
|
||||
def _load(self, prefs, setchecked, section):
|
||||
@ -318,6 +340,9 @@ use the modifier key to drag the floating window around"
|
||||
except KeyError:
|
||||
selected_lang = self.supportedLanguages["en"]
|
||||
self.languageComboBox.setCurrentText(selected_lang)
|
||||
if section & Sections.ADVANCED:
|
||||
setchecked(self.rehash_ignore_mtime_box, prefs.rehash_ignore_mtime)
|
||||
setchecked(self.include_exists_check_box, prefs.include_exists_check)
|
||||
if section & Sections.DEBUG:
|
||||
setchecked(self.debugModeBox, prefs.debug_mode)
|
||||
setchecked(self.profile_scan_box, prefs.profile_scan)
|
||||
@ -334,6 +359,8 @@ use the modifier key to drag the floating window around"
|
||||
prefs.use_regexp = ischecked(self.useRegexpBox)
|
||||
prefs.remove_empty_folders = ischecked(self.removeEmptyFoldersBox)
|
||||
prefs.ignore_hardlink_matches = ischecked(self.ignoreHardlinkMatches)
|
||||
prefs.rehash_ignore_mtime = ischecked(self.rehash_ignore_mtime_box)
|
||||
prefs.include_exists_check = ischecked(self.include_exists_check_box)
|
||||
prefs.debug_mode = ischecked(self.debugModeBox)
|
||||
prefs.profile_scan = ischecked(self.profile_scan_box)
|
||||
prefs.reference_bold_font = ischecked(self.reference_bold_font)
|
||||
|
@ -5,7 +5,7 @@
|
||||
# http://www.gnu.org/licenses/gpl-3.0.html
|
||||
|
||||
from PyQt5.QtCore import Qt, QTimer
|
||||
from PyQt5.QtWidgets import QProgressDialog
|
||||
from PyQt5.QtWidgets import QDialog, QMessageBox, QVBoxLayout, QLabel, QProgressBar, QPushButton
|
||||
|
||||
from hscommon.trans import tr
|
||||
|
||||
@ -25,37 +25,60 @@ class ProgressWindow:
|
||||
def refresh(self): # Labels
|
||||
if self._window is not None:
|
||||
self._window.setWindowTitle(self.model.jobdesc_textfield.text)
|
||||
self._window.setLabelText(self.model.progressdesc_textfield.text)
|
||||
self._label.setText(self.model.progressdesc_textfield.text)
|
||||
|
||||
def set_progress(self, last_progress):
|
||||
if self._window is not None:
|
||||
if last_progress < 0:
|
||||
self._window.setRange(0, 0)
|
||||
self._progress_bar.setRange(0, 0)
|
||||
else:
|
||||
self._window.setRange(0, 100)
|
||||
self._window.setValue(last_progress)
|
||||
self._progress_bar.setRange(0, 100)
|
||||
self._progress_bar.setValue(last_progress)
|
||||
|
||||
def show(self):
|
||||
flags = Qt.CustomizeWindowHint | Qt.WindowTitleHint | Qt.WindowSystemMenuHint
|
||||
self._window = QProgressDialog("", tr("Cancel"), 0, 100, self.parent, flags)
|
||||
self._window = QDialog(self.parent, flags)
|
||||
self._setup_ui()
|
||||
self._window.setModal(True)
|
||||
self._window.setAutoReset(False)
|
||||
self._window.setAutoClose(False)
|
||||
self._timer = QTimer(self._window)
|
||||
self._timer.timeout.connect(self.model.pulse)
|
||||
self._window.show()
|
||||
self._window.canceled.connect(self.model.cancel)
|
||||
self._timer.start(500)
|
||||
|
||||
def _setup_ui(self):
|
||||
self._window.setWindowTitle(tr("Cancel"))
|
||||
vertical_layout = QVBoxLayout(self._window)
|
||||
self._label = QLabel("", self._window)
|
||||
vertical_layout.addWidget(self._label)
|
||||
self._progress_bar = QProgressBar(self._window)
|
||||
self._progress_bar.setRange(0, 100)
|
||||
vertical_layout.addWidget(self._progress_bar)
|
||||
self._cancel_button = QPushButton(tr("Cancel"), self._window)
|
||||
self._cancel_button.clicked.connect(self.cancel)
|
||||
vertical_layout.addWidget(self._cancel_button)
|
||||
|
||||
def cancel(self):
|
||||
if self._window is not None:
|
||||
confirm_dialog = QMessageBox(
|
||||
QMessageBox.Icon.Question,
|
||||
tr("Cancel?"),
|
||||
tr("Are you sure you want to cancel? All progress will be lost."),
|
||||
QMessageBox.StandardButton.No | QMessageBox.StandardButton.Yes,
|
||||
self._window,
|
||||
)
|
||||
confirm_dialog.setDefaultButton(QMessageBox.StandardButton.No)
|
||||
result = confirm_dialog.exec_()
|
||||
if result != QMessageBox.StandardButton.Yes:
|
||||
return
|
||||
self.close()
|
||||
|
||||
def close(self):
|
||||
# it seems it is possible for close to be called without a corresponding
|
||||
# show, only perform a close if there is a window to close
|
||||
if self._window is not None:
|
||||
self._timer.stop()
|
||||
del self._timer
|
||||
# For some weird reason, canceled() signal is sent upon close, whether the user canceled
|
||||
# or not. If we don't want a false cancellation, we have to disconnect it.
|
||||
self._window.canceled.disconnect()
|
||||
self._window.close()
|
||||
self._window.setParent(None)
|
||||
self._window = None
|
||||
self.model.cancel()
|
||||
|
@ -1,4 +1,4 @@
|
||||
pytest>=6,<7
|
||||
pytest>=7,<8
|
||||
flake8
|
||||
black
|
||||
pyinstaller>=4.5,<5.0; sys_platform != 'linux'
|
||||
pyinstaller>=5.6,<6.0; sys_platform != 'linux'
|
||||
|
@ -1,9 +1,9 @@
|
||||
distro>=1.5.0
|
||||
mutagen>=1.44.0
|
||||
polib>=1.1.0
|
||||
PyQt5 >=5.14.1,<6.0; sys_platform != 'linux'
|
||||
pywin32>=228; sys_platform == 'win32'
|
||||
distro>=1.8.0,<2.0.0
|
||||
mutagen>=1.46.0,<2.0.0
|
||||
polib>=1.1.0,<2.0.0
|
||||
PyQt5 >=5.15.0,<6.0; sys_platform != 'linux'
|
||||
pywin32>=304; sys_platform == 'win32'
|
||||
semantic-version>=2.0.0,<3.0.0
|
||||
Send2Trash>=1.3.0
|
||||
sphinx>=3.0.0
|
||||
Send2Trash>=1.8.2,<2.0.0
|
||||
sphinx>=5.3.0,<8.0.0
|
||||
xxhash>=3.0.0,<4.0.0
|
||||
|
@ -29,10 +29,10 @@ classifiers =
|
||||
packages = find:
|
||||
python_requires = >=3.7
|
||||
install_requires =
|
||||
Send2Trash>=1.3.0
|
||||
mutagen>=1.45.1
|
||||
distro>=1.5.0
|
||||
PyQt5 >=5.14.1,<6.0; sys_platform != 'linux'
|
||||
Send2Trash>=1.8.2,<2.0.0
|
||||
mutagen>=1.46.0,<2.0.0
|
||||
distro>=1.8.0,<2.0.0
|
||||
PyQt5 >=5.15.0,<6.0; sys_platform != 'linux'
|
||||
pywin32>=228; sys_platform == 'win32'
|
||||
semantic-version>=2.0.0,<3.0.0
|
||||
xxhash>=3.0.0,<4.0.0
|
||||
|
6
tox.ini
6
tox.ini
@ -1,5 +1,5 @@
|
||||
[tox]
|
||||
envlist = py36,py37,py38,py39,py310
|
||||
envlist = py37,py38,py39,py310,py311
|
||||
skipsdist = True
|
||||
skip_missing_interpreters = True
|
||||
|
||||
@ -16,7 +16,7 @@ deps =
|
||||
-r{toxinidir}/requirements-extra.txt
|
||||
|
||||
[flake8]
|
||||
exclude = .tox,env,build,cocoalib,cocoa,help,./qt/dg_rc.py,cocoa/run_template.py,./pkg
|
||||
exclude = .tox,env*,build,help,qt/dg_rc.py,pkg
|
||||
max-line-length = 120
|
||||
select = C,E,F,W,B,B950
|
||||
extend-ignore = E203, E501
|
||||
extend-ignore = E203,W503
|
||||
|
@ -30,7 +30,7 @@ VSVersionInfo(
|
||||
StringTable(
|
||||
u'040904B0',
|
||||
[StringStruct(u'CompanyName', u'Hardcoded Software'),
|
||||
StringStruct(u'FileDescription', u'dupeGuru is a tool to find duplicate files on your computer.'),
|
||||
StringStruct(u'FileDescription', u'dupeGuru'),
|
||||
StringStruct(u'FileVersion', u'{0}.{1}.{2}.0'),
|
||||
StringStruct(u'InternalName', u'dupeGuru'),
|
||||
StringStruct(u'LegalCopyright', u'© Hardcoded Software'),
|
||||
|
Loading…
x
Reference in New Issue
Block a user