mirror of
https://github.com/arsenetar/dupeguru.git
synced 2026-03-12 03:31:37 +00:00
Compare commits
5 Commits
as/pyproje
...
fc970b4770
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fc970b4770 | ||
|
|
569f1e2291 | ||
|
|
72e0a61893 | ||
|
|
db6a64c1e1 | ||
|
|
a6a268a982 |
12
.github/workflows/default.yml
vendored
12
.github/workflows/default.yml
vendored
@@ -52,14 +52,4 @@ jobs:
|
|||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: modules ${{ matrix.python-version }}
|
name: modules ${{ matrix.python-version }}
|
||||||
path: build/**/*.so
|
path: ${{ github.workspace }}/**/*.so
|
||||||
merge-artifacts:
|
|
||||||
needs: [test]
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Merge Artifacts
|
|
||||||
uses: actions/upload-artifact/merge@v4
|
|
||||||
with:
|
|
||||||
name: modules
|
|
||||||
pattern: modules*
|
|
||||||
delete-merged: true
|
|
||||||
|
|||||||
2
.vscode/launch.json
vendored
2
.vscode/launch.json
vendored
@@ -6,7 +6,7 @@
|
|||||||
"configurations": [
|
"configurations": [
|
||||||
{
|
{
|
||||||
"name": "DupuGuru",
|
"name": "DupuGuru",
|
||||||
"type": "debugpy",
|
"type": "python",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"program": "run.py",
|
"program": "run.py",
|
||||||
"console": "integratedTerminal",
|
"console": "integratedTerminal",
|
||||||
|
|||||||
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@@ -12,6 +12,5 @@
|
|||||||
"[python]": {
|
"[python]": {
|
||||||
"editor.formatOnSave": true,
|
"editor.formatOnSave": true,
|
||||||
"editor.defaultFormatter": "ms-python.black-formatter"
|
"editor.defaultFormatter": "ms-python.black-formatter"
|
||||||
},
|
}
|
||||||
"python.testing.pytestEnabled": true
|
|
||||||
}
|
}
|
||||||
@@ -158,7 +158,7 @@ class SqliteCache:
|
|||||||
ids = ",".join(map(str, rowids))
|
ids = ",".join(map(str, rowids))
|
||||||
sql = (
|
sql = (
|
||||||
"select rowid, blocks, blocks2, blocks3, blocks4, blocks5, blocks6, blocks7, blocks8 "
|
"select rowid, blocks, blocks2, blocks3, blocks4, blocks5, blocks6, blocks7, blocks8 "
|
||||||
f"from pictures where rowid in ({ids})"
|
f"from pictures where rowid in {ids}"
|
||||||
)
|
)
|
||||||
cur = self.con.execute(sql)
|
cur = self.con.execute(sql)
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ def get_cache(cache_path, readonly=False):
|
|||||||
return SqliteCache(cache_path, readonly=readonly)
|
return SqliteCache(cache_path, readonly=readonly)
|
||||||
|
|
||||||
|
|
||||||
def prepare_pictures(pictures, cache_path, with_dimensions, match_rotated, j=job.nulljob):
|
def prepare_pictures(pictures, cache_path, with_dimensions, j=job.nulljob):
|
||||||
# The MemoryError handlers in there use logging without first caring about whether or not
|
# The MemoryError handlers in there use logging without first caring about whether or not
|
||||||
# there is enough memory left to carry on the operation because it is assumed that the
|
# there is enough memory left to carry on the operation because it is assumed that the
|
||||||
# MemoryError happens when trying to read an image file, which is freed from memory by the
|
# MemoryError happens when trying to read an image file, which is freed from memory by the
|
||||||
@@ -76,14 +76,8 @@ def prepare_pictures(pictures, cache_path, with_dimensions, match_rotated, j=job
|
|||||||
if with_dimensions:
|
if with_dimensions:
|
||||||
picture.dimensions # pre-read dimensions
|
picture.dimensions # pre-read dimensions
|
||||||
try:
|
try:
|
||||||
if picture.unicode_path not in cache or (
|
if picture.unicode_path not in cache:
|
||||||
match_rotated and any(block == [] for block in cache[picture.unicode_path])
|
blocks = [picture.get_blocks(BLOCK_COUNT_PER_SIDE, orientation) for orientation in range(1, 9)]
|
||||||
):
|
|
||||||
if match_rotated:
|
|
||||||
blocks = [picture.get_blocks(BLOCK_COUNT_PER_SIDE, orientation) for orientation in range(1, 9)]
|
|
||||||
else:
|
|
||||||
blocks = [[]] * 8
|
|
||||||
blocks[max(picture.get_orientation() - 1, 0)] = picture.get_blocks(BLOCK_COUNT_PER_SIDE)
|
|
||||||
cache[picture.unicode_path] = blocks
|
cache[picture.unicode_path] = blocks
|
||||||
prepared.append(picture)
|
prepared.append(picture)
|
||||||
except (OSError, ValueError) as e:
|
except (OSError, ValueError) as e:
|
||||||
@@ -193,7 +187,7 @@ def getmatches(pictures, cache_path, threshold, match_scaled=False, match_rotate
|
|||||||
j.set_progress(comparison_count, progress_msg)
|
j.set_progress(comparison_count, progress_msg)
|
||||||
|
|
||||||
j = j.start_subjob([3, 7])
|
j = j.start_subjob([3, 7])
|
||||||
pictures = prepare_pictures(pictures, cache_path, not match_scaled, match_rotated, j=j)
|
pictures = prepare_pictures(pictures, cache_path, with_dimensions=not match_scaled, j=j)
|
||||||
j = j.start_subjob([9, 1], tr("Preparing for matching"))
|
j = j.start_subjob([9, 1], tr("Preparing for matching"))
|
||||||
cache = get_cache(cache_path)
|
cache = get_cache(cache_path)
|
||||||
id2picture = {}
|
id2picture = {}
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ class Photo(fs.File):
|
|||||||
def _plat_get_blocks(self, block_count_per_side, orientation):
|
def _plat_get_blocks(self, block_count_per_side, orientation):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
def get_orientation(self):
|
def _get_orientation(self):
|
||||||
if not hasattr(self, "_cached_orientation"):
|
if not hasattr(self, "_cached_orientation"):
|
||||||
try:
|
try:
|
||||||
with self.path.open("rb") as fp:
|
with self.path.open("rb") as fp:
|
||||||
@@ -95,13 +95,13 @@ class Photo(fs.File):
|
|||||||
fs.File._read_info(self, field)
|
fs.File._read_info(self, field)
|
||||||
if field == "dimensions":
|
if field == "dimensions":
|
||||||
self.dimensions = self._plat_get_dimensions()
|
self.dimensions = self._plat_get_dimensions()
|
||||||
if self.get_orientation() in {5, 6, 7, 8}:
|
if self._get_orientation() in {5, 6, 7, 8}:
|
||||||
self.dimensions = (self.dimensions[1], self.dimensions[0])
|
self.dimensions = (self.dimensions[1], self.dimensions[0])
|
||||||
elif field == "exif_timestamp":
|
elif field == "exif_timestamp":
|
||||||
self.exif_timestamp = self._get_exif_timestamp()
|
self.exif_timestamp = self._get_exif_timestamp()
|
||||||
|
|
||||||
def get_blocks(self, block_count_per_side, orientation: int = None):
|
def get_blocks(self, block_count_per_side, orientation: int = None):
|
||||||
if orientation is None:
|
if orientation is None:
|
||||||
return self._plat_get_blocks(block_count_per_side, self.get_orientation())
|
return self._plat_get_blocks(block_count_per_side, self._get_orientation())
|
||||||
else:
|
else:
|
||||||
return self._plat_get_blocks(block_count_per_side, orientation)
|
return self._plat_get_blocks(block_count_per_side, orientation)
|
||||||
|
|||||||
@@ -96,8 +96,6 @@ class FilenameCategory(CriterionCategory):
|
|||||||
DOESNT_END_WITH_NUMBER = 1
|
DOESNT_END_WITH_NUMBER = 1
|
||||||
LONGEST = 2
|
LONGEST = 2
|
||||||
SHORTEST = 3
|
SHORTEST = 3
|
||||||
LONGEST_PATH = 4
|
|
||||||
SHORTEST_PATH = 5
|
|
||||||
|
|
||||||
def format_criterion_value(self, value):
|
def format_criterion_value(self, value):
|
||||||
return {
|
return {
|
||||||
@@ -105,8 +103,6 @@ class FilenameCategory(CriterionCategory):
|
|||||||
self.DOESNT_END_WITH_NUMBER: tr("Doesn't end with number"),
|
self.DOESNT_END_WITH_NUMBER: tr("Doesn't end with number"),
|
||||||
self.LONGEST: tr("Longest"),
|
self.LONGEST: tr("Longest"),
|
||||||
self.SHORTEST: tr("Shortest"),
|
self.SHORTEST: tr("Shortest"),
|
||||||
self.LONGEST_PATH: tr("Longest Path"),
|
|
||||||
self.SHORTEST_PATH: tr("Shortest Path"),
|
|
||||||
}[value]
|
}[value]
|
||||||
|
|
||||||
def extract_value(self, dupe):
|
def extract_value(self, dupe):
|
||||||
@@ -120,10 +116,6 @@ class FilenameCategory(CriterionCategory):
|
|||||||
return 0 if ends_with_digit else 1
|
return 0 if ends_with_digit else 1
|
||||||
else:
|
else:
|
||||||
return 1 if ends_with_digit else 0
|
return 1 if ends_with_digit else 0
|
||||||
elif crit_value == self.LONGEST_PATH:
|
|
||||||
return len(str(dupe.folder_path)) * -1
|
|
||||||
elif crit_value == self.SHORTEST_PATH:
|
|
||||||
return len(str(dupe.folder_path))
|
|
||||||
else:
|
else:
|
||||||
value = len(value)
|
value = len(value)
|
||||||
if crit_value == self.LONGEST:
|
if crit_value == self.LONGEST:
|
||||||
@@ -138,8 +130,6 @@ class FilenameCategory(CriterionCategory):
|
|||||||
self.DOESNT_END_WITH_NUMBER,
|
self.DOESNT_END_WITH_NUMBER,
|
||||||
self.LONGEST,
|
self.LONGEST,
|
||||||
self.SHORTEST,
|
self.SHORTEST,
|
||||||
self.LONGEST_PATH,
|
|
||||||
self.SHORTEST_PATH,
|
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
@@ -59,13 +59,13 @@ class BaseTestCaseCache:
|
|||||||
|
|
||||||
def test_set_then_retrieve_blocks(self):
|
def test_set_then_retrieve_blocks(self):
|
||||||
c = self.get_cache()
|
c = self.get_cache()
|
||||||
b = [[(0, 0, 0), (1, 2, 3)]] * 8
|
b = [(0, 0, 0), (1, 2, 3)]
|
||||||
c["foo"] = b
|
c["foo"] = b
|
||||||
eq_(b, c["foo"])
|
eq_(b, c["foo"])
|
||||||
|
|
||||||
def test_delitem(self):
|
def test_delitem(self):
|
||||||
c = self.get_cache()
|
c = self.get_cache()
|
||||||
c["foo"] = [[]] * 8
|
c["foo"] = ""
|
||||||
del c["foo"]
|
del c["foo"]
|
||||||
assert "foo" not in c
|
assert "foo" not in c
|
||||||
with raises(KeyError):
|
with raises(KeyError):
|
||||||
@@ -74,16 +74,16 @@ class BaseTestCaseCache:
|
|||||||
def test_persistance(self, tmpdir):
|
def test_persistance(self, tmpdir):
|
||||||
DBNAME = tmpdir.join("hstest.db")
|
DBNAME = tmpdir.join("hstest.db")
|
||||||
c = self.get_cache(str(DBNAME))
|
c = self.get_cache(str(DBNAME))
|
||||||
c["foo"] = [[(1, 2, 3)]] * 8
|
c["foo"] = [(1, 2, 3)]
|
||||||
del c
|
del c
|
||||||
c = self.get_cache(str(DBNAME))
|
c = self.get_cache(str(DBNAME))
|
||||||
eq_([[(1, 2, 3)]] * 8, c["foo"])
|
eq_([(1, 2, 3)], c["foo"])
|
||||||
|
|
||||||
def test_filter(self):
|
def test_filter(self):
|
||||||
c = self.get_cache()
|
c = self.get_cache()
|
||||||
c["foo"] = [[]] * 8
|
c["foo"] = ""
|
||||||
c["bar"] = [[]] * 8
|
c["bar"] = ""
|
||||||
c["baz"] = [[]] * 8
|
c["baz"] = ""
|
||||||
c.filter(lambda p: p != "bar") # only 'bar' is removed
|
c.filter(lambda p: p != "bar") # only 'bar' is removed
|
||||||
eq_(2, len(c))
|
eq_(2, len(c))
|
||||||
assert "foo" in c
|
assert "foo" in c
|
||||||
@@ -92,9 +92,9 @@ class BaseTestCaseCache:
|
|||||||
|
|
||||||
def test_clear(self):
|
def test_clear(self):
|
||||||
c = self.get_cache()
|
c = self.get_cache()
|
||||||
c["foo"] = [[]] * 8
|
c["foo"] = ""
|
||||||
c["bar"] = [[]] * 8
|
c["bar"] = ""
|
||||||
c["baz"] = [[]] * 8
|
c["baz"] = ""
|
||||||
c.clear()
|
c.clear()
|
||||||
eq_(0, len(c))
|
eq_(0, len(c))
|
||||||
assert "foo" not in c
|
assert "foo" not in c
|
||||||
@@ -104,7 +104,7 @@ class BaseTestCaseCache:
|
|||||||
def test_by_id(self):
|
def test_by_id(self):
|
||||||
# it's possible to use the cache by referring to the files by their row_id
|
# it's possible to use the cache by referring to the files by their row_id
|
||||||
c = self.get_cache()
|
c = self.get_cache()
|
||||||
b = [[(0, 0, 0), (1, 2, 3)]] * 8
|
b = [(0, 0, 0), (1, 2, 3)]
|
||||||
c["foo"] = b
|
c["foo"] = b
|
||||||
foo_id = c.get_id("foo")
|
foo_id = c.get_id("foo")
|
||||||
eq_(c[foo_id], b)
|
eq_(c[foo_id], b)
|
||||||
@@ -127,10 +127,10 @@ class TestCaseSqliteCache(BaseTestCaseCache):
|
|||||||
fp.write("invalid sqlite content")
|
fp.write("invalid sqlite content")
|
||||||
fp.close()
|
fp.close()
|
||||||
c = self.get_cache(dbname) # should not raise a DatabaseError
|
c = self.get_cache(dbname) # should not raise a DatabaseError
|
||||||
c["foo"] = [[(1, 2, 3)]] * 8
|
c["foo"] = [(1, 2, 3)]
|
||||||
del c
|
del c
|
||||||
c = self.get_cache(dbname)
|
c = self.get_cache(dbname)
|
||||||
eq_(c["foo"], [[(1, 2, 3)]] * 8)
|
eq_(c["foo"], [(1, 2, 3)])
|
||||||
|
|
||||||
|
|
||||||
class TestCaseCacheSQLEscape:
|
class TestCaseCacheSQLEscape:
|
||||||
@@ -152,7 +152,7 @@ class TestCaseCacheSQLEscape:
|
|||||||
|
|
||||||
def test_delitem(self):
|
def test_delitem(self):
|
||||||
c = self.get_cache()
|
c = self.get_cache()
|
||||||
c["foo'bar"] = [[]] * 8
|
c["foo'bar"] = []
|
||||||
try:
|
try:
|
||||||
del c["foo'bar"]
|
del c["foo'bar"]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ msgstr "Dossier"
|
|||||||
|
|
||||||
#: core\me\result_table.py:21
|
#: core\me\result_table.py:21
|
||||||
msgid "Size (MB)"
|
msgid "Size (MB)"
|
||||||
msgstr "Taille (MB)"
|
msgstr "Taille (Mo)"
|
||||||
|
|
||||||
#: core\me\result_table.py:22
|
#: core\me\result_table.py:22
|
||||||
msgid "Time"
|
msgid "Time"
|
||||||
@@ -52,7 +52,7 @@ msgstr "Temps"
|
|||||||
|
|
||||||
#: core\me\result_table.py:24
|
#: core\me\result_table.py:24
|
||||||
msgid "Sample Rate"
|
msgid "Sample Rate"
|
||||||
msgstr "Sample Rate"
|
msgstr "Échantillonnage"
|
||||||
|
|
||||||
#: core\me\result_table.py:25 core\pe\result_table.py:22 core\prioritize.py:65
|
#: core\me\result_table.py:25 core\pe\result_table.py:22 core\prioritize.py:65
|
||||||
#: core\se\result_table.py:22
|
#: core\se\result_table.py:22
|
||||||
@@ -86,7 +86,7 @@ msgstr "Année"
|
|||||||
|
|
||||||
#: core\me\result_table.py:32
|
#: core\me\result_table.py:32
|
||||||
msgid "Track Number"
|
msgid "Track Number"
|
||||||
msgstr "Track"
|
msgstr "Numéro de piste"
|
||||||
|
|
||||||
#: core\me\result_table.py:33
|
#: core\me\result_table.py:33
|
||||||
msgid "Comment"
|
msgid "Comment"
|
||||||
@@ -95,16 +95,16 @@ msgstr "Commentaire"
|
|||||||
#: core\me\result_table.py:34 core\pe\result_table.py:26
|
#: core\me\result_table.py:34 core\pe\result_table.py:26
|
||||||
#: core\se\result_table.py:24
|
#: core\se\result_table.py:24
|
||||||
msgid "Match %"
|
msgid "Match %"
|
||||||
msgstr "Match %"
|
msgstr "Correspond à %"
|
||||||
|
|
||||||
#: core\me\result_table.py:35 core\se\result_table.py:25
|
#: core\me\result_table.py:35 core\se\result_table.py:25
|
||||||
msgid "Words Used"
|
msgid "Words Used"
|
||||||
msgstr "Mots"
|
msgstr "Mots utilisés"
|
||||||
|
|
||||||
#: core\me\result_table.py:36 core\pe\result_table.py:27
|
#: core\me\result_table.py:36 core\pe\result_table.py:27
|
||||||
#: core\se\result_table.py:26
|
#: core\se\result_table.py:26
|
||||||
msgid "Dupe Count"
|
msgid "Dupe Count"
|
||||||
msgstr "Nombre de Doublons"
|
msgstr "Nombre de doublons"
|
||||||
|
|
||||||
#: core\pe\prioritize.py:23 core\pe\result_table.py:23
|
#: core\pe\prioritize.py:23 core\pe\result_table.py:23
|
||||||
msgid "Dimensions"
|
msgid "Dimensions"
|
||||||
@@ -112,7 +112,7 @@ msgstr "Dimensions"
|
|||||||
|
|
||||||
#: core\pe\result_table.py:21 core\se\result_table.py:21
|
#: core\pe\result_table.py:21 core\se\result_table.py:21
|
||||||
msgid "Size (KB)"
|
msgid "Size (KB)"
|
||||||
msgstr "Taille (KB)"
|
msgstr "Taille (Ko)"
|
||||||
|
|
||||||
#: core\pe\result_table.py:24
|
#: core\pe\result_table.py:24
|
||||||
msgid "EXIF Timestamp"
|
msgid "EXIF Timestamp"
|
||||||
|
|||||||
@@ -52,8 +52,8 @@ msgid ""
|
|||||||
"A previous action is still hanging in there. You can't start a new one yet. "
|
"A previous action is still hanging in there. You can't start a new one yet. "
|
||||||
"Wait a few seconds, then try again."
|
"Wait a few seconds, then try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Une action précédente est encore en cours. Attendez quelques secondes avant "
|
"Une action précédente est encore en cours. Vous ne pouvez pas encore en démarrer une nouvelle. "
|
||||||
"d'en repartir une nouvelle."
|
"Attendez quelques secondes et essayer à nouveau."
|
||||||
|
|
||||||
#: core\app.py:300
|
#: core\app.py:300
|
||||||
msgid "No duplicates found."
|
msgid "No duplicates found."
|
||||||
@@ -69,7 +69,7 @@ msgstr "Tous les fichiers marqués ont été déplacés correctement."
|
|||||||
|
|
||||||
#: core\app.py:319
|
#: core\app.py:319
|
||||||
msgid "All marked files were deleted successfully."
|
msgid "All marked files were deleted successfully."
|
||||||
msgstr ""
|
msgstr "Tous les fichiers marqués ont bien été supprimés."
|
||||||
|
|
||||||
#: core\app.py:321
|
#: core\app.py:321
|
||||||
msgid "All marked files were successfully sent to Trash."
|
msgid "All marked files were successfully sent to Trash."
|
||||||
@@ -137,11 +137,11 @@ msgstr "%s (%d hors-groupe)"
|
|||||||
|
|
||||||
#: core\directories.py:191
|
#: core\directories.py:191
|
||||||
msgid "Collected {} files to scan"
|
msgid "Collected {} files to scan"
|
||||||
msgstr ""
|
msgstr "{} fichiers collectés pour scanner"
|
||||||
|
|
||||||
#: core\directories.py:207
|
#: core\directories.py:207
|
||||||
msgid "Collected {} folders to scan"
|
msgid "Collected {} folders to scan"
|
||||||
msgstr ""
|
msgstr "{} dossiers collectés pour scanner"
|
||||||
|
|
||||||
#: core\engine.py:27
|
#: core\engine.py:27
|
||||||
msgid "%d matches found from %d groups"
|
msgid "%d matches found from %d groups"
|
||||||
@@ -183,7 +183,7 @@ msgstr "Contenu"
|
|||||||
|
|
||||||
#: core\pe\matchblock.py:66
|
#: core\pe\matchblock.py:66
|
||||||
msgid "Analyzed %d/%d pictures"
|
msgid "Analyzed %d/%d pictures"
|
||||||
msgstr "Analyzé %d/%d images"
|
msgstr "Analysé %d/%d images"
|
||||||
|
|
||||||
#: core\pe\matchblock.py:183
|
#: core\pe\matchblock.py:183
|
||||||
msgid "Performed %d/%d chunk matches"
|
msgid "Performed %d/%d chunk matches"
|
||||||
@@ -215,7 +215,7 @@ msgstr "Chiffres à la fin"
|
|||||||
|
|
||||||
#: core\prioritize.py:103
|
#: core\prioritize.py:103
|
||||||
msgid "Doesn't end with number"
|
msgid "Doesn't end with number"
|
||||||
msgstr "Pas de chiffres à la finr"
|
msgstr "Pas de chiffres à la fin"
|
||||||
|
|
||||||
#: core\prioritize.py:104
|
#: core\prioritize.py:104
|
||||||
msgid "Longest"
|
msgid "Longest"
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ msgstr "Ouvrir logs de déboguage"
|
|||||||
|
|
||||||
#: qt/app.py:180 cocoa/en.lproj/Localizable.strings:0
|
#: qt/app.py:180 cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Do you really want to remove all your cached picture analysis?"
|
msgid "Do you really want to remove all your cached picture analysis?"
|
||||||
msgstr "Voulez-vous vraiment vider la cache de vos analyses précédentes?"
|
msgstr "Voulez-vous vraiment vider la cache de vos analyses précédentes ?"
|
||||||
|
|
||||||
#: qt/app.py:184
|
#: qt/app.py:184
|
||||||
msgid "Picture cache cleared."
|
msgid "Picture cache cleared."
|
||||||
@@ -66,16 +66,16 @@ msgid ""
|
|||||||
"After having deleted a duplicate, place a link targeting the reference file "
|
"After having deleted a duplicate, place a link targeting the reference file "
|
||||||
"to replace the deleted file."
|
"to replace the deleted file."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Après avoir effacé un fichier, remplacer celui-ci par un lien vers le "
|
"Après avoir effacé un fichier dupliqué, remplacer celui-ci par un lien vers le "
|
||||||
"fichier référence."
|
"fichier référence."
|
||||||
|
|
||||||
#: qt/deletion_options.py:44
|
#: qt/deletion_options.py:44
|
||||||
msgid "Hardlink"
|
msgid "Hardlink"
|
||||||
msgstr "Hardlink"
|
msgstr "Lien en dur"
|
||||||
|
|
||||||
#: qt/deletion_options.py:44
|
#: qt/deletion_options.py:44
|
||||||
msgid "Symlink"
|
msgid "Symlink"
|
||||||
msgstr "Symlink"
|
msgstr "Lien symbolique"
|
||||||
|
|
||||||
#: qt/deletion_options.py:48
|
#: qt/deletion_options.py:48
|
||||||
msgid " (unsupported)"
|
msgid " (unsupported)"
|
||||||
@@ -91,7 +91,7 @@ msgid ""
|
|||||||
"usually used as a workaround when the normal deletion method doesn't work."
|
"usually used as a workaround when the normal deletion method doesn't work."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Au lieu de passer par la corbeille, supprimer directement. Cette option "
|
"Au lieu de passer par la corbeille, supprimer directement. Cette option "
|
||||||
"n'est généralement utilisée qu'en cas de problème."
|
"n'est généralement utilisée qu'en cas d'échec avec la métode de suppression normale."
|
||||||
|
|
||||||
#: qt/deletion_options.py:59 cocoa/en.lproj/Localizable.strings:0
|
#: qt/deletion_options.py:59 cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Proceed"
|
msgid "Proceed"
|
||||||
@@ -162,7 +162,7 @@ msgstr "Standard"
|
|||||||
|
|
||||||
#: qt/directories_dialog.py:128 cocoa/en.lproj/Localizable.strings:0
|
#: qt/directories_dialog.py:128 cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Scan Type:"
|
msgid "Scan Type:"
|
||||||
msgstr "Type de scan:"
|
msgstr "Type de scan :"
|
||||||
|
|
||||||
#: qt/directories_dialog.py:135
|
#: qt/directories_dialog.py:135
|
||||||
msgid "More Options"
|
msgid "More Options"
|
||||||
@@ -186,7 +186,7 @@ msgstr "Résultats non sauvegardés"
|
|||||||
|
|
||||||
#: qt/directories_dialog.py:231 cocoa/en.lproj/Localizable.strings:0
|
#: qt/directories_dialog.py:231 cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "You have unsaved results, do you really want to quit?"
|
msgid "You have unsaved results, do you really want to quit?"
|
||||||
msgstr "Vos résultats ne sont pas sauvegardés. Voulez-vous vraiment quitter?"
|
msgstr "Vos résultats ne sont pas sauvegardés. Voulez-vous vraiment quitter ?"
|
||||||
|
|
||||||
#: qt/directories_dialog.py:239 cocoa/en.lproj/Localizable.strings:0
|
#: qt/directories_dialog.py:239 cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Select a folder to add to the scanning list"
|
msgid "Select a folder to add to the scanning list"
|
||||||
@@ -211,7 +211,7 @@ msgstr "Commencer un nouveau scan"
|
|||||||
#: qt/directories_dialog.py:279 cocoa/en.lproj/Localizable.strings:0
|
#: qt/directories_dialog.py:279 cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "You have unsaved results, do you really want to continue?"
|
msgid "You have unsaved results, do you really want to continue?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Vos résultats ne sont pas sauvegardés. Voulez-vous vraiment continuer?"
|
"Vos résultats ne sont pas sauvegardés. Voulez-vous vraiment continuer ?"
|
||||||
|
|
||||||
#: qt/directories_model.py:23 cocoa/en.lproj/Localizable.strings:0
|
#: qt/directories_model.py:23 cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
@@ -254,7 +254,7 @@ msgstr "Tags à scanner:"
|
|||||||
|
|
||||||
#: qt/me/preferences_dialog.py:36 cocoa/en.lproj/Localizable.strings:0
|
#: qt/me/preferences_dialog.py:36 cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Track"
|
msgid "Track"
|
||||||
msgstr "Track"
|
msgstr "Piste"
|
||||||
|
|
||||||
#: qt/me/preferences_dialog.py:38 cocoa/en.lproj/Localizable.strings:0
|
#: qt/me/preferences_dialog.py:38 cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Artist"
|
msgid "Artist"
|
||||||
@@ -299,12 +299,12 @@ msgstr "Utiliser les expressions régulières pour les filtres"
|
|||||||
#: qt/me/preferences_dialog.py:58 qt/pe/preferences_dialog.py:25
|
#: qt/me/preferences_dialog.py:58 qt/pe/preferences_dialog.py:25
|
||||||
#: qt/se/preferences_dialog.py:38 cocoa/en.lproj/Localizable.strings:0
|
#: qt/se/preferences_dialog.py:38 cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Remove empty folders on delete or move"
|
msgid "Remove empty folders on delete or move"
|
||||||
msgstr "Effacer les dossiers vides après un déplacement"
|
msgstr "Effacer les dossiers vides après une suppression ou un déplacement"
|
||||||
|
|
||||||
#: qt/me/preferences_dialog.py:60 qt/pe/preferences_dialog.py:27
|
#: qt/me/preferences_dialog.py:60 qt/pe/preferences_dialog.py:27
|
||||||
#: qt/se/preferences_dialog.py:59 cocoa/en.lproj/Localizable.strings:0
|
#: qt/se/preferences_dialog.py:59 cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Ignore duplicates hardlinking to the same file"
|
msgid "Ignore duplicates hardlinking to the same file"
|
||||||
msgstr "Ignorer doublons avec hardlink vers le même fichier"
|
msgstr "Ignorer doublons avec un lien en dur vers le même fichier"
|
||||||
|
|
||||||
#: qt/me/preferences_dialog.py:62 qt/pe/preferences_dialog.py:29
|
#: qt/me/preferences_dialog.py:62 qt/pe/preferences_dialog.py:29
|
||||||
#: qt/se/preferences_dialog.py:62 cocoa/en.lproj/Localizable.strings:0
|
#: qt/se/preferences_dialog.py:62 cocoa/en.lproj/Localizable.strings:0
|
||||||
@@ -317,7 +317,7 @@ msgstr "Comparer les images de tailles différentes"
|
|||||||
|
|
||||||
#: qt/preferences_dialog.py:43
|
#: qt/preferences_dialog.py:43
|
||||||
msgid "Filter Hardness:"
|
msgid "Filter Hardness:"
|
||||||
msgstr "Seuil du filtre:"
|
msgstr "Seuil du filtre :"
|
||||||
|
|
||||||
#: qt/preferences_dialog.py:69
|
#: qt/preferences_dialog.py:69
|
||||||
msgid "More Results"
|
msgid "More Results"
|
||||||
@@ -329,15 +329,15 @@ msgstr "Moins de doublons"
|
|||||||
|
|
||||||
#: qt/preferences_dialog.py:81
|
#: qt/preferences_dialog.py:81
|
||||||
msgid "Font size:"
|
msgid "Font size:"
|
||||||
msgstr "Taille de police:"
|
msgstr "Taille de police :"
|
||||||
|
|
||||||
#: qt/preferences_dialog.py:85
|
#: qt/preferences_dialog.py:85
|
||||||
msgid "Language:"
|
msgid "Language:"
|
||||||
msgstr "Langue:"
|
msgstr "Langue :"
|
||||||
|
|
||||||
#: qt/preferences_dialog.py:91 cocoa/en.lproj/Localizable.strings:0
|
#: qt/preferences_dialog.py:91 cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Copy and Move:"
|
msgid "Copy and Move:"
|
||||||
msgstr "Déplacements de fichiers:"
|
msgstr "Copie et déplacements de fichiers :"
|
||||||
|
|
||||||
#: qt/preferences_dialog.py:94 cocoa/en.lproj/Localizable.strings:0
|
#: qt/preferences_dialog.py:94 cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Right in destination"
|
msgid "Right in destination"
|
||||||
@@ -353,7 +353,7 @@ msgstr "Re-créer chemins absolus"
|
|||||||
|
|
||||||
#: qt/preferences_dialog.py:99
|
#: qt/preferences_dialog.py:99
|
||||||
msgid "Custom Command (arguments: %d for dupe, %r for ref):"
|
msgid "Custom Command (arguments: %d for dupe, %r for ref):"
|
||||||
msgstr "Commande perso. (arguments: %d pour doublon, %r pour réf):"
|
msgstr "Commande perso. (arguments : %d pour doublon, %r pour réf) :"
|
||||||
|
|
||||||
#: qt/preferences_dialog.py:174
|
#: qt/preferences_dialog.py:174
|
||||||
msgid "dupeGuru has to restart for language changes to take effect."
|
msgid "dupeGuru has to restart for language changes to take effect."
|
||||||
@@ -369,13 +369,13 @@ msgid ""
|
|||||||
" the best to these criteria to their respective group's reference position. "
|
" the best to these criteria to their respective group's reference position. "
|
||||||
"Read the help file for more information."
|
"Read the help file for more information."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Ajoutez des critères dans la liste de droite pour envoyer les doublons qui "
|
"Ajoutez des critères dans la liste de droite et cliquez sur OK pour envoyer les doublons qui "
|
||||||
"correspondent le plus à ces critère à la position de référence. Une lecture "
|
"correspondent le plus à ces critères à la position de référence. Une lecture "
|
||||||
"préalable du fichier d'aide est conseillée."
|
"préalable du fichier d'aide est conseillée."
|
||||||
|
|
||||||
#: qt/problem_dialog.py:33 cocoa/en.lproj/Localizable.strings:0
|
#: qt/problem_dialog.py:33 cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Problems!"
|
msgid "Problems!"
|
||||||
msgstr "Problèmes!"
|
msgstr "Problèmes !"
|
||||||
|
|
||||||
#: qt/problem_dialog.py:37 cocoa/en.lproj/Localizable.strings:0
|
#: qt/problem_dialog.py:37 cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -383,13 +383,13 @@ msgid ""
|
|||||||
"these problems are described in the table below. Those files were not "
|
"these problems are described in the table below. Those files were not "
|
||||||
"removed from your results."
|
"removed from your results."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Des problèmes ont été rencontrés lors du traitement de certains fichiers. La"
|
"Des problèmes ont été rencontrés lors du traitement de certains fichiers (ou tous). La"
|
||||||
" nature de ces problèmes est décrite dans la liste ci-dessous. Ces fichiers "
|
" nature de ces problèmes est décrite dans la liste ci-dessous. Ces fichiers "
|
||||||
"n'ont pas été retirés des résultats."
|
"n'ont pas été retirés des résultats."
|
||||||
|
|
||||||
#: qt/problem_dialog.py:56
|
#: qt/problem_dialog.py:56
|
||||||
msgid "Reveal Selected"
|
msgid "Reveal Selected"
|
||||||
msgstr "Révéler Fichier"
|
msgstr "Révéler la selection"
|
||||||
|
|
||||||
#: qt/result_window.py:57 qt/result_window.py:104 qt/result_window.py:167
|
#: 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
|
#: qt/result_window.py:191 cocoa/en.lproj/Localizable.strings:0
|
||||||
@@ -406,19 +406,19 @@ msgstr "Montrer les valeurs en tant que delta"
|
|||||||
|
|
||||||
#: qt/result_window.py:60
|
#: qt/result_window.py:60
|
||||||
msgid "Send Marked to Recycle Bin..."
|
msgid "Send Marked to Recycle Bin..."
|
||||||
msgstr "Envoyer marqués à la corbeille..."
|
msgstr "Envoyer les fichiers marqués à la corbeille..."
|
||||||
|
|
||||||
#: qt/result_window.py:61 cocoa/en.lproj/Localizable.strings:0
|
#: qt/result_window.py:61 cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Move Marked to..."
|
msgid "Move Marked to..."
|
||||||
msgstr "Déplacer marqués vers..."
|
msgstr "Déplacer les fichiers marqués vers..."
|
||||||
|
|
||||||
#: qt/result_window.py:62 cocoa/en.lproj/Localizable.strings:0
|
#: qt/result_window.py:62 cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Copy Marked to..."
|
msgid "Copy Marked to..."
|
||||||
msgstr "Copier marqués vers..."
|
msgstr "Copier les fichiers marqués vers..."
|
||||||
|
|
||||||
#: qt/result_window.py:63 cocoa/en.lproj/Localizable.strings:0
|
#: qt/result_window.py:63 cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Remove Marked from Results"
|
msgid "Remove Marked from Results"
|
||||||
msgstr "Retirer marqués des résultats"
|
msgstr "Retirer les fichiers marqués des résultats"
|
||||||
|
|
||||||
#: qt/result_window.py:64 cocoa/en.lproj/Localizable.strings:0
|
#: qt/result_window.py:64 cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Re-Prioritize Results..."
|
msgid "Re-Prioritize Results..."
|
||||||
@@ -426,19 +426,19 @@ msgstr "Re-prioriser les résultats"
|
|||||||
|
|
||||||
#: qt/result_window.py:67 cocoa/en.lproj/Localizable.strings:0
|
#: qt/result_window.py:67 cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Remove Selected from Results"
|
msgid "Remove Selected from Results"
|
||||||
msgstr "Retirer sélectionnés des résultats"
|
msgstr "Retirer les fichiers sélectionnés des résultats"
|
||||||
|
|
||||||
#: qt/result_window.py:71 cocoa/en.lproj/Localizable.strings:0
|
#: qt/result_window.py:71 cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Add Selected to Ignore List"
|
msgid "Add Selected to Ignore List"
|
||||||
msgstr "Ajouter sélectionnés à la liste de fichiers ignorés"
|
msgstr "Ajouter les fichiers sélectionnés à la liste de fichiers ignorés"
|
||||||
|
|
||||||
#: qt/result_window.py:75 cocoa/en.lproj/Localizable.strings:0
|
#: qt/result_window.py:75 cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Make Selected into Reference"
|
msgid "Make Selected into Reference"
|
||||||
msgstr "Transformer sélectionnés en références"
|
msgstr "Transformer les fichiers sélectionnés en références"
|
||||||
|
|
||||||
#: qt/result_window.py:77 cocoa/en.lproj/Localizable.strings:0
|
#: qt/result_window.py:77 cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Open Selected with Default Application"
|
msgid "Open Selected with Default Application"
|
||||||
msgstr "Ouvrir sélectionné avec l'application par défaut"
|
msgstr "Ouvrir les fichiers sélectionnés avec l'application par défaut"
|
||||||
|
|
||||||
#: qt/result_window.py:80
|
#: qt/result_window.py:80
|
||||||
msgid "Open Containing Folder of Selected"
|
msgid "Open Containing Folder of Selected"
|
||||||
@@ -466,19 +466,19 @@ msgstr "Marquer sélectionnés"
|
|||||||
|
|
||||||
#: qt/result_window.py:87
|
#: qt/result_window.py:87
|
||||||
msgid "Export To HTML"
|
msgid "Export To HTML"
|
||||||
msgstr "Exporter vers HTML"
|
msgstr "Exporter en HTML"
|
||||||
|
|
||||||
#: qt/result_window.py:88
|
#: qt/result_window.py:88
|
||||||
msgid "Export To CSV"
|
msgid "Export To CSV"
|
||||||
msgstr "Exporter vers CSV"
|
msgstr "Exporter en CSV"
|
||||||
|
|
||||||
#: qt/result_window.py:89 cocoa/en.lproj/Localizable.strings:0
|
#: qt/result_window.py:89 cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Save Results..."
|
msgid "Save Results..."
|
||||||
msgstr "Sauvegarder résultats..."
|
msgstr "Sauvegarder les résultats..."
|
||||||
|
|
||||||
#: qt/result_window.py:90 cocoa/en.lproj/Localizable.strings:0
|
#: qt/result_window.py:90 cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Invoke Custom Command"
|
msgid "Invoke Custom Command"
|
||||||
msgstr "Invoquer commande personnalisée"
|
msgstr "Invoquer une commande personnalisée"
|
||||||
|
|
||||||
#: qt/result_window.py:102
|
#: qt/result_window.py:102
|
||||||
msgid "Mark"
|
msgid "Mark"
|
||||||
@@ -498,7 +498,7 @@ msgstr "{} résultats"
|
|||||||
|
|
||||||
#: qt/result_window.py:193 cocoa/en.lproj/Localizable.strings:0
|
#: qt/result_window.py:193 cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Dupes Only"
|
msgid "Dupes Only"
|
||||||
msgstr "Sans réf."
|
msgstr "Dupliqués seulement"
|
||||||
|
|
||||||
#: qt/result_window.py:194
|
#: qt/result_window.py:194
|
||||||
msgid "Delta Values"
|
msgid "Delta Values"
|
||||||
@@ -514,7 +514,7 @@ msgstr "Ignorer les fichiers plus petits que"
|
|||||||
|
|
||||||
#: qt/se/preferences_dialog.py:52 cocoa/en.lproj/Localizable.strings:0
|
#: qt/se/preferences_dialog.py:52 cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "KB"
|
msgid "KB"
|
||||||
msgstr "KB"
|
msgstr "Ko"
|
||||||
|
|
||||||
#: cocoa/en.lproj/Localizable.strings:0
|
#: cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "%@ Results"
|
msgid "%@ Results"
|
||||||
@@ -526,7 +526,7 @@ msgstr "Action"
|
|||||||
|
|
||||||
#: cocoa/en.lproj/Localizable.strings:0
|
#: cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Add New Folder..."
|
msgid "Add New Folder..."
|
||||||
msgstr "Ajouter dossier..."
|
msgstr "Ajouter un nouveau dossier..."
|
||||||
|
|
||||||
#: cocoa/en.lproj/Localizable.strings:0
|
#: cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Advanced"
|
msgid "Advanced"
|
||||||
@@ -546,7 +546,7 @@ msgstr "Tout ramener au premier plan"
|
|||||||
|
|
||||||
#: cocoa/en.lproj/Localizable.strings:0
|
#: cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Check for update..."
|
msgid "Check for update..."
|
||||||
msgstr "Mise à jour..."
|
msgstr "Recherche de mise à jour..."
|
||||||
|
|
||||||
#: cocoa/en.lproj/Localizable.strings:0
|
#: cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Close Window"
|
msgid "Close Window"
|
||||||
@@ -558,7 +558,7 @@ msgstr "Copier"
|
|||||||
|
|
||||||
#: cocoa/en.lproj/Localizable.strings:0
|
#: cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Custom command (arguments: %d for dupe, %r for ref):"
|
msgid "Custom command (arguments: %d for dupe, %r for ref):"
|
||||||
msgstr "Commande perso. (arguments: %d pour doublon, %r pour réf):"
|
msgstr "Commande perso. (arguments : %d pour doublon, %r pour réf) :"
|
||||||
|
|
||||||
#: cocoa/en.lproj/Localizable.strings:0
|
#: cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Cut"
|
msgid "Cut"
|
||||||
@@ -602,11 +602,11 @@ msgstr "Édition"
|
|||||||
|
|
||||||
#: cocoa/en.lproj/Localizable.strings:0
|
#: cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Export Results to CSV"
|
msgid "Export Results to CSV"
|
||||||
msgstr "Exporter les résultats vers CSV"
|
msgstr "Exporter les résultats en CSV"
|
||||||
|
|
||||||
#: cocoa/en.lproj/Localizable.strings:0
|
#: cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Export Results to XHTML"
|
msgid "Export Results to XHTML"
|
||||||
msgstr "Exporter les résultats vers HTML"
|
msgstr "Exporter les résultats en XHTML"
|
||||||
|
|
||||||
#: cocoa/en.lproj/Localizable.strings:0
|
#: cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Fewer results"
|
msgid "Fewer results"
|
||||||
@@ -618,7 +618,7 @@ msgstr "Filtre"
|
|||||||
|
|
||||||
#: cocoa/en.lproj/Localizable.strings:0
|
#: cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Filter hardness:"
|
msgid "Filter hardness:"
|
||||||
msgstr "Seuil du filtre:"
|
msgstr "Seuil du filtre :"
|
||||||
|
|
||||||
#: cocoa/en.lproj/Localizable.strings:0
|
#: cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Filter Results..."
|
msgid "Filter Results..."
|
||||||
@@ -630,7 +630,7 @@ msgstr "Fenêtre de sélection de dossiers"
|
|||||||
|
|
||||||
#: cocoa/en.lproj/Localizable.strings:0
|
#: cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Font Size:"
|
msgid "Font Size:"
|
||||||
msgstr "Taille de police:"
|
msgstr "Taille de police :"
|
||||||
|
|
||||||
#: cocoa/en.lproj/Localizable.strings:0
|
#: cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Hide dupeGuru"
|
msgid "Hide dupeGuru"
|
||||||
@@ -642,7 +642,7 @@ msgstr "Masquer les autres"
|
|||||||
|
|
||||||
#: cocoa/en.lproj/Localizable.strings:0
|
#: cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Ignore files smaller than:"
|
msgid "Ignore files smaller than:"
|
||||||
msgstr "Ignorer les fichiers plus petits que:"
|
msgstr "Ignorer les fichiers plus petits que :"
|
||||||
|
|
||||||
#: cocoa/en.lproj/Localizable.strings:0
|
#: cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Load from file..."
|
msgid "Load from file..."
|
||||||
@@ -658,7 +658,7 @@ msgstr "Mode"
|
|||||||
|
|
||||||
#: cocoa/en.lproj/Localizable.strings:0
|
#: cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "More results"
|
msgid "More results"
|
||||||
msgstr "plus de doublons"
|
msgstr "Plus de doublons"
|
||||||
|
|
||||||
#: cocoa/en.lproj/Localizable.strings:0
|
#: cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Ok"
|
msgid "Ok"
|
||||||
@@ -674,7 +674,7 @@ msgstr "Préférences..."
|
|||||||
|
|
||||||
#: cocoa/en.lproj/Localizable.strings:0
|
#: cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Quick Look"
|
msgid "Quick Look"
|
||||||
msgstr "Quick Look"
|
msgstr "Regard rapide"
|
||||||
|
|
||||||
#: cocoa/en.lproj/Localizable.strings:0
|
#: cocoa/en.lproj/Localizable.strings:0
|
||||||
msgid "Quit dupeGuru"
|
msgid "Quit dupeGuru"
|
||||||
@@ -798,11 +798,11 @@ msgstr "Erreur de compilation:"
|
|||||||
|
|
||||||
#: qt\pe\image_viewer.py:56
|
#: qt\pe\image_viewer.py:56
|
||||||
msgid "Increase zoom"
|
msgid "Increase zoom"
|
||||||
msgstr "Accroître zoom"
|
msgstr "Zoomer"
|
||||||
|
|
||||||
#: qt\pe\image_viewer.py:66
|
#: qt\pe\image_viewer.py:66
|
||||||
msgid "Decrease zoom"
|
msgid "Decrease zoom"
|
||||||
msgstr "Décroître zoom"
|
msgstr "Dézoomer"
|
||||||
|
|
||||||
#: qt\pe\image_viewer.py:71
|
#: qt\pe\image_viewer.py:71
|
||||||
msgid "Ctrl+/"
|
msgid "Ctrl+/"
|
||||||
@@ -822,7 +822,7 @@ msgstr "Meilleur ajustement"
|
|||||||
|
|
||||||
#: qt\pe\preferences_dialog.py:49
|
#: qt\pe\preferences_dialog.py:49
|
||||||
msgid "Picture cache mode:"
|
msgid "Picture cache mode:"
|
||||||
msgstr "Mode de cache d'images:"
|
msgstr "Mode de cache d'images :"
|
||||||
|
|
||||||
#: qt\pe\preferences_dialog.py:56
|
#: qt\pe\preferences_dialog.py:56
|
||||||
msgid "Override theme icons in viewer toolbar"
|
msgid "Override theme icons in viewer toolbar"
|
||||||
@@ -945,59 +945,61 @@ msgstr "Affichage"
|
|||||||
|
|
||||||
#: qt\se\preferences_dialog.py:70
|
#: qt\se\preferences_dialog.py:70
|
||||||
msgid "Partially hash files bigger than"
|
msgid "Partially hash files bigger than"
|
||||||
msgstr ""
|
msgstr Hacher partiellement les fichiers plus gros que"
|
||||||
|
|
||||||
#: qt\se\preferences_dialog.py:80
|
#: qt\se\preferences_dialog.py:80
|
||||||
msgid "MB"
|
msgid "MB"
|
||||||
msgstr ""
|
msgstr "Mo"
|
||||||
|
|
||||||
#: qt\preferences_dialog.py:163
|
#: qt\preferences_dialog.py:163
|
||||||
msgid "Use native OS dialogs"
|
msgid "Use native OS dialogs"
|
||||||
msgstr ""
|
msgstr "Utiliser les dialogues natifs de l'OS"
|
||||||
|
|
||||||
#: qt\preferences_dialog.py:166
|
#: qt\preferences_dialog.py:166
|
||||||
msgid ""
|
msgid ""
|
||||||
"For actions such as file/folder selection use the OS native dialogs.\n"
|
"For actions such as file/folder selection use the OS native dialogs.\n"
|
||||||
"Some native dialogs have limited functionality."
|
"Some native dialogs have limited functionality."
|
||||||
msgstr ""
|
msgstr "Pour les actions telles que la sélection de fichiers/dossiers, utilisez les boîtes de dialogue natives du système d'exploitation.\n"
|
||||||
|
"Des boites de dialogues ont des fonctionnalités limitées."
|
||||||
|
|
||||||
#: qt\se\preferences_dialog.py:68
|
#: qt\se\preferences_dialog.py:68
|
||||||
msgid "Ignore files larger than"
|
msgid "Ignore files larger than"
|
||||||
msgstr ""
|
msgstr "Ignorer les fichiers plus gros que"
|
||||||
|
|
||||||
#: qt\app.py:135 qt\app.py:293
|
#: qt\app.py:135 qt\app.py:293
|
||||||
msgid "Clear Cache"
|
msgid "Clear Cache"
|
||||||
msgstr ""
|
msgstr "Vider le cache"
|
||||||
|
|
||||||
#: qt\app.py:294
|
#: qt\app.py:294
|
||||||
msgid ""
|
msgid ""
|
||||||
"Do you really want to clear the cache? This will remove all cached file "
|
"Do you really want to clear the cache? This will remove all cached file "
|
||||||
"hashes and picture analysis."
|
"hashes and picture analysis."
|
||||||
msgstr ""
|
msgstr "Voulez-vous réellement vider le cacher ? Cela supprimera tous les hash de fichiers dans le cache"
|
||||||
|
" et les analyses d'image."
|
||||||
|
|
||||||
#: qt\app.py:299
|
#: qt\app.py:299
|
||||||
msgid "Cache cleared."
|
msgid "Cache cleared."
|
||||||
msgstr ""
|
msgstr "Cache vidé."
|
||||||
|
|
||||||
#: qt\preferences_dialog.py:173
|
#: qt\preferences_dialog.py:173
|
||||||
msgid "Use dark style"
|
msgid "Use dark style"
|
||||||
msgstr ""
|
msgstr "Utliliser le style sombre"
|
||||||
|
|
||||||
#: qt\preferences_dialog.py:241
|
#: qt\preferences_dialog.py:241
|
||||||
msgid "Profile scan operation"
|
msgid "Profile scan operation"
|
||||||
msgstr ""
|
msgstr "Opération de balayage de profil"
|
||||||
|
|
||||||
#: qt\preferences_dialog.py:242
|
#: qt\preferences_dialog.py:242
|
||||||
msgid "Profile the scan operation and save logs for optimization."
|
msgid "Profile the scan operation and save logs for optimization."
|
||||||
msgstr ""
|
msgstr "Profilage de l'opération de balayage et enregistrement des journaux pour optimisation"
|
||||||
|
|
||||||
#: qt\preferences_dialog.py:246
|
#: qt\preferences_dialog.py:246
|
||||||
msgid "Logs located in: <a href=\"{}\">{}</a>"
|
msgid "Logs located in: <a href=\"{}\">{}</a>"
|
||||||
msgstr ""
|
msgstr "Les logs se trouvent dans : <a href=\"{}\">{}</a>"
|
||||||
|
|
||||||
#: qt\preferences_dialog.py:291
|
#: qt\preferences_dialog.py:291
|
||||||
msgid "Debug"
|
msgid "Debug"
|
||||||
msgstr ""
|
msgstr "Débogage"
|
||||||
|
|
||||||
#: qt\about_box.py:31
|
#: qt\about_box.py:31
|
||||||
msgid "About {}"
|
msgid "About {}"
|
||||||
@@ -1009,7 +1011,7 @@ msgstr "Version {}"
|
|||||||
|
|
||||||
#: qt\about_box.py:49 qt\about_box.py:75
|
#: qt\about_box.py:49 qt\about_box.py:75
|
||||||
msgid "Checking for updates..."
|
msgid "Checking for updates..."
|
||||||
msgstr ""
|
msgstr "Recherche des mises à jour..."
|
||||||
|
|
||||||
#: qt\about_box.py:54
|
#: qt\about_box.py:54
|
||||||
msgid "Licensed under GPLv3"
|
msgid "Licensed under GPLv3"
|
||||||
@@ -1017,11 +1019,11 @@ msgstr "Sous licence GPLv3"
|
|||||||
|
|
||||||
#: qt\about_box.py:68
|
#: qt\about_box.py:68
|
||||||
msgid "No update available."
|
msgid "No update available."
|
||||||
msgstr ""
|
msgstr "Pas de mise à jour disponible."
|
||||||
|
|
||||||
#: qt\about_box.py:71
|
#: qt\about_box.py:71
|
||||||
msgid "New version {} available, download <a href=\"{}\">here</a>."
|
msgid "New version {} available, download <a href=\"{}\">here</a>."
|
||||||
msgstr ""
|
msgstr "Une nouvelle version ({}) est disponible, téléchagez-là <a href=\"{}\">ici</a>."
|
||||||
|
|
||||||
#: qt\error_report_dialog.py:50
|
#: qt\error_report_dialog.py:50
|
||||||
msgid "Error Report"
|
msgid "Error Report"
|
||||||
@@ -1029,7 +1031,7 @@ msgstr "Rapport d'erreur"
|
|||||||
|
|
||||||
#: qt\error_report_dialog.py:54
|
#: qt\error_report_dialog.py:54
|
||||||
msgid "Something went wrong. How about reporting the error?"
|
msgid "Something went wrong. How about reporting the error?"
|
||||||
msgstr "Un problème est survenu. Rapporter l'erreur?"
|
msgstr "Un problème est survenu. Rapporter l'erreur ?"
|
||||||
|
|
||||||
#: qt\error_report_dialog.py:60
|
#: qt\error_report_dialog.py:60
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -1141,31 +1143,36 @@ msgstr "Recherche..."
|
|||||||
msgid ""
|
msgid ""
|
||||||
"These options are for advanced users or for very specific situations, most "
|
"These options are for advanced users or for very specific situations, most "
|
||||||
"users should not have to modify these."
|
"users should not have to modify these."
|
||||||
msgstr ""
|
msgstr "Ces options sont destinées aux utilisateurs avancés ou pour des situation bien spécifiques, "
|
||||||
|
"la plupart des utilisateurs ne devraient pas avoir à les modifier."
|
||||||
|
|
||||||
#: qt\preferences_dialog.py:225
|
#: qt\preferences_dialog.py:225
|
||||||
msgid "Include existence check after scan completion"
|
msgid "Include existence check after scan completion"
|
||||||
msgstr ""
|
msgstr "Inclure un contrôle d'existence à la fin de l'analyse"
|
||||||
|
|
||||||
#: qt\preferences_dialog.py:227
|
#: qt\preferences_dialog.py:227
|
||||||
msgid "Ignore difference in mtime when loading cached digests"
|
msgid "Ignore difference in mtime when loading cached digests"
|
||||||
msgstr ""
|
msgstr "Ignorer la différence dans le mtime en chargent les résumés en cache"
|
||||||
|
|
||||||
#: qt\progress_window.py:64
|
#: qt\progress_window.py:64
|
||||||
msgid "Cancel?"
|
msgid "Cancel?"
|
||||||
msgstr ""
|
msgstr "Annuler ?"
|
||||||
|
|
||||||
#: qt\progress_window.py:65
|
#: qt\progress_window.py:65
|
||||||
msgid "Are you sure you want to cancel? All progress will be lost."
|
msgid "Are you sure you want to cancel? All progress will be lost."
|
||||||
msgstr ""
|
msgstr "Êtes-vous sûr de vouloir annuler ? Tout ce qui a déjà été fait va être perdu."
|
||||||
|
|
||||||
#: qt\exclude_list_dialog.py:161
|
#: qt\exclude_list_dialog.py:161
|
||||||
msgid ""
|
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"
|
"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"
|
"<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>"
|
"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 ""
|
msgstr "Cette expression régulière python (sensible à la casse) va filtrer les fichiers pendant les scans.<br>"
|
||||||
|
"Ces expressions régulières python (sensible aux majuscules) peuvent ignorer les fichiers pendant les scans. Les dossiers auront également leur <strong>état par défaut</strong> mis sur Exclus dans l'onglet Dossiers si leur nom correspond à une des expressions régulières sélectionnées<br>Pour chaque fichier collecté, deux tests sont faits pour déterminer s'il doit être totalement ignoré:<br><li>1. Les expressions régulières sans séparateur de chemin sont comparées au nom de fichier seul.</li>\n"
|
||||||
|
"<li>2. Les expressions régulières avec au moins un séparateur de chemin sont comparées au chemin complet vers le fichier.</li><br>\n"
|
||||||
|
"Exemple: si vous voulez uniquement ignorer les fichiers .PNG du dossier \"Mes Images\":<br><code>.*Mes\\sImages\\\\.*\\.png</code><br><br>Vous pouvez tester l'expression régulière via le bouton \"Tester la chaîne de caractères\" après avoir tapé un faux chemin de fichier dans le champs correspondant:<br><code>C:\\\\Utilisateur\\Mes Images\\test.png</code><br><br>\n"
|
||||||
|
"Les expressions régulières qui fonctionnent seront surlignées.<br>S'il y a au moins un surlignage, le chemin ou nom de fichier testé sera ignoré durant les scans.<br><br>Les dossiers et fichiers commençant par un point '.' sont ignorés par défaut.<br><br>"
|
||||||
|
|
||||||
#: qt\pe\preferences_dialog.py:24
|
#: qt\pe\preferences_dialog.py:24
|
||||||
msgid "Match pictures of different rotations"
|
msgid "Match pictures of different rotations"
|
||||||
msgstr ""
|
msgstr "Associer des images de différentes rotations"
|
||||||
|
|||||||
@@ -1,86 +1,9 @@
|
|||||||
[build-system]
|
[build-system]
|
||||||
requires = ["setuptools >= 75.3.1"]
|
requires = ["setuptools"]
|
||||||
build-backend = "setuptools.build_meta"
|
build-backend = "setuptools.build_meta"
|
||||||
|
|
||||||
[project]
|
|
||||||
name = "dupeGuru"
|
|
||||||
description = "dupeGuru is a tool to find duplicate files on your computer."
|
|
||||||
authors = [
|
|
||||||
{name = "Andrew Senetar", email = "arsenetar@voltaicideas.net"}
|
|
||||||
]
|
|
||||||
readme = "README.md"
|
|
||||||
license = "GPL-3.0-or-later"
|
|
||||||
license-files = ["LICENSE"]
|
|
||||||
keywords = ["deduplication"]
|
|
||||||
classifiers = [
|
|
||||||
"Development Status :: 5 - Production/Stable",
|
|
||||||
"Intended Audience :: End Users/Desktop",
|
|
||||||
"Operating System :: MacOS :: MacOS X",
|
|
||||||
"Operating System :: Microsoft :: Windows",
|
|
||||||
"Operating System :: POSIX",
|
|
||||||
"Programming Language :: Python :: 3 :: Only",
|
|
||||||
"Programming Language :: Python :: 3.7",
|
|
||||||
"Programming Language :: Python :: 3.8",
|
|
||||||
"Programming Language :: Python :: 3.9",
|
|
||||||
"Programming Language :: Python :: 3.10",
|
|
||||||
"Programming Language :: Python :: 3.11",
|
|
||||||
"Programming Language :: Python :: 3.12",
|
|
||||||
"Topic :: Desktop Environment :: File Managers",
|
|
||||||
]
|
|
||||||
requires-python = ">=3.7, <3.13"
|
|
||||||
|
|
||||||
dynamic = ["version"]
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
"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.8.2",
|
|
||||||
"xxhash>=3.0.0,<4.0.0",
|
|
||||||
]
|
|
||||||
|
|
||||||
[project.optional-dependencies]
|
|
||||||
dev = [
|
|
||||||
"pytest>=7,<8",
|
|
||||||
"flake8",
|
|
||||||
"black",
|
|
||||||
]
|
|
||||||
build = [
|
|
||||||
"dupeGuru[dev]",
|
|
||||||
"sphinx>=5.3.0,<8.0.0",
|
|
||||||
"pyinstaller>=5.6,<6.0; sys_platform != 'linux'"
|
|
||||||
]
|
|
||||||
|
|
||||||
[project.urls]
|
|
||||||
Homepage = "https://dupeguru.voltaicideas.net/"
|
|
||||||
Documentation = "https://dupeguru.voltaicideas.net/help/en/"
|
|
||||||
Repository = "https://github.com/arsenetar/dupeguru.git"
|
|
||||||
Issues = "https://github.com/arsenetar/dupeguru/issues"
|
|
||||||
Releases = "https://github.com/arsenetar/dupeguru/releases"
|
|
||||||
|
|
||||||
[project.gui-scripts]
|
|
||||||
dupeguru = "dupeguru.__main__:main"
|
|
||||||
|
|
||||||
[tool.black]
|
[tool.black]
|
||||||
line-length = 120
|
line-length = 120
|
||||||
|
|
||||||
[tool.isort]
|
[tool.isort]
|
||||||
# make it compatible with black
|
# make it compatible with black
|
||||||
profile = "black"
|
profile = "black"
|
||||||
skip_gitignore = true
|
skip_gitignore = true
|
||||||
|
|
||||||
[tool.setuptools.packages.find]
|
|
||||||
include = ["core", "hscommon", "qt"]
|
|
||||||
|
|
||||||
[tool.setuptools.dynamic]
|
|
||||||
version = {attr = "core.__version__"}
|
|
||||||
|
|
||||||
[tool.setuptools]
|
|
||||||
ext-modules = [
|
|
||||||
{name = "core.pe._block", sources = ["core/pe/modules/block.c", "core/pe/modules/common.c"], include-dirs = ["core/pe/modules"]},
|
|
||||||
{name = "core.pe._cache", sources = ["core/pe/modules/cache.c", "core/pe/modules/common.c"], include-dirs = ["core/pe/modules"]},
|
|
||||||
{name = "qt.pe._block_qt", sources = ["qt/pe/modules/block.c"]},
|
|
||||||
]
|
|
||||||
|
|||||||
4
requirements-extra.txt
Normal file
4
requirements-extra.txt
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
pytest>=7,<8
|
||||||
|
flake8
|
||||||
|
black
|
||||||
|
pyinstaller>=5.6,<6.0; sys_platform != 'linux'
|
||||||
9
requirements.txt
Normal file
9
requirements.txt
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
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.8.2,<2.0.0
|
||||||
|
sphinx>=5.3.0,<8.0.0
|
||||||
|
xxhash>=3.0.0,<4.0.0
|
||||||
48
setup.cfg
Normal file
48
setup.cfg
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
[metadata]
|
||||||
|
name = dupeGuru
|
||||||
|
version = attr: core.__version__
|
||||||
|
url = https://github.com/arsenetar/dupeguru
|
||||||
|
project_urls =
|
||||||
|
Bug Reports = https://github.com/arsenetar/dupeguru/issues
|
||||||
|
author = Andrew Senetar
|
||||||
|
author_email = arsenetar@voltaicideas.net
|
||||||
|
license = GPLv3
|
||||||
|
license_files = license
|
||||||
|
description = dupeGuru is a tool to find duplicate files on your computer.
|
||||||
|
long_description = file:README.md
|
||||||
|
long_description_content_type = text/markdown
|
||||||
|
classifiers =
|
||||||
|
Development Status :: 5 - Production/Stable
|
||||||
|
Intended Audience :: End Users/Desktop
|
||||||
|
License :: OSI Approved :: GNU General Public License v3 (GPLv3)
|
||||||
|
Operating System :: MacOS :: MacOS X
|
||||||
|
Operating System :: Microsoft :: Windows
|
||||||
|
Operating System :: POSIX
|
||||||
|
Programming Language :: Python :: 3.7
|
||||||
|
Programming Language :: Python :: 3.8
|
||||||
|
Programming Language :: Python :: 3.9
|
||||||
|
Programming Language :: Python :: 3.10
|
||||||
|
Programming Language :: Python :: 3 :: Only
|
||||||
|
Topic :: Desktop Environment :: File Managers
|
||||||
|
|
||||||
|
[options]
|
||||||
|
packages = find:
|
||||||
|
python_requires = >=3.7
|
||||||
|
install_requires =
|
||||||
|
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
|
||||||
|
setup_requires =
|
||||||
|
sphinx>=3.0.0
|
||||||
|
polib>=1.1.0
|
||||||
|
tests_require =
|
||||||
|
pytest >=6,<7
|
||||||
|
include_package_data = true
|
||||||
|
|
||||||
|
[options.entry_points]
|
||||||
|
console_scripts =
|
||||||
|
dupeguru = run.py
|
||||||
26
setup.py
Normal file
26
setup.py
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
from setuptools import setup, Extension
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
exts = [
|
||||||
|
Extension(
|
||||||
|
"core.pe._block",
|
||||||
|
[
|
||||||
|
str(Path("core", "pe", "modules", "block.c")),
|
||||||
|
str(Path("core", "pe", "modules", "common.c")),
|
||||||
|
],
|
||||||
|
include_dirs=[str(Path("core", "pe", "modules"))],
|
||||||
|
),
|
||||||
|
Extension(
|
||||||
|
"core.pe._cache",
|
||||||
|
[
|
||||||
|
str(Path("core", "pe", "modules", "cache.c")),
|
||||||
|
str(Path("core", "pe", "modules", "common.c")),
|
||||||
|
],
|
||||||
|
include_dirs=[str(Path("core", "pe", "modules"))],
|
||||||
|
),
|
||||||
|
Extension("qt.pe._block_qt", [str(Path("qt", "pe", "modules", "block.c"))]),
|
||||||
|
]
|
||||||
|
|
||||||
|
headers = [str(Path("core", "pe", "modules", "common.h"))]
|
||||||
|
|
||||||
|
setup(ext_modules=exts, headers=headers)
|
||||||
Reference in New Issue
Block a user