1
0
mirror of https://github.com/arsenetar/dupeguru.git synced 2026-03-12 03:31:37 +00:00

Compare commits

..

7 Commits

Author SHA1 Message Date
16aa6c21ff Merge pull request #1353 from gauravk268/master
Prevent negative total size in Results class when removing duplcates
2026-01-06 12:34:00 -06:00
Gaurav Kumar
c32a1246b5 fix: Prevent negative total size in Results class when removing duplicates 2026-01-04 17:07:23 +00:00
7f61330dda Merge pull request #1310 from glubsy/build/fix/setuptools_sandbox_deprecation
Remove usage of deprecated setuptools sandbox
2025-12-31 21:38:56 -06:00
eb4d791434 ci: Fix typo in default.yml workflow 2025-12-31 21:34:48 -06:00
e9948d9b3f ci: Update workflow action versions, misc cleanups in .github
- Bump action versions
- Bump minimum Python version teste to 3.8, add 3.13 and 3.14
- Cleanup extra entries in FUNDING.yml
2025-12-31 21:32:23 -06:00
glubsy
c9aa6f1b7a Remove usage of deprecated setuptools sandbox
The sandbox module has been deprecated for several Python versions and
is now removed.
2025-07-19 20:20:31 +02:00
Alexander Gee
8f197ea7e1 feat: Create longest and shortest path criteria (#1242)
* Create longest and shortest path criteria
2024-08-23 18:31:46 -05:00
10 changed files with 111 additions and 121 deletions

12
.github/FUNDING.yml vendored
View File

@@ -1,13 +1 @@
# These are supported funding model platforms
github: arsenetar github: arsenetar
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']

View File

@@ -25,11 +25,10 @@ jobs:
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v2 uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
# Initializes the CodeQL tools for scanning. # Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL - name: Initialize CodeQL
uses: github/codeql-action/init@v1 uses: github/codeql-action/init@5d4e8d1aca955e8d8589aabd499c5cae939e33c7 # v4.31.9
with: with:
languages: ${{ matrix.language }} languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file. # If you wish to specify custom queries, you can do so here or in a config file.
@@ -44,7 +43,7 @@ jobs:
make modules make modules
- if: matrix.language == 'python' - if: matrix.language == 'python'
name: Autobuild name: Autobuild
uses: github/codeql-action/autobuild@v1 uses: github/codeql-action/autobuild@5d4e8d1aca955e8d8589aabd499c5cae939e33c7 # v4.31.9
# Analysis # Analysis
- name: Perform CodeQL Analysis - name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1 uses: github/codeql-action/analyze@5d4e8d1aca955e8d8589aabd499c5cae939e33c7 # v4.31.9

View File

@@ -11,9 +11,9 @@ jobs:
pre-commit: pre-commit:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Set up Python 3.12 - name: Set up Python 3.12
uses: actions/setup-python@v5 uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0
with: with:
python-version: "3.12" python-version: "3.12"
- uses: pre-commit/action@v3.0.1 - uses: pre-commit/action@v3.0.1
@@ -23,7 +23,7 @@ jobs:
strategy: strategy:
matrix: matrix:
os: [ubuntu-latest] os: [ubuntu-latest]
python-version: [3.7, 3.8, 3.9, "3.10", "3.11", "3.12"] python-version: [3.8, 3.9, "3.10", "3.11", "3.12", "3.13", "3.14"]
include: include:
- os: windows-latest - os: windows-latest
python-version: "3.12" python-version: "3.12"
@@ -31,9 +31,9 @@ jobs:
python-version: "3.12" python-version: "3.12"
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Set up Python ${{ matrix.python-version }} - name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5 uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0
with: with:
python-version: ${{ matrix.python-version }} python-version: ${{ matrix.python-version }}
- name: Install dependencies - name: Install dependencies
@@ -49,7 +49,7 @@ jobs:
pytest core hscommon pytest core hscommon
- name: Upload Artifacts - name: Upload Artifacts
if: matrix.os == 'ubuntu-latest' if: matrix.os == 'ubuntu-latest'
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
with: with:
name: modules ${{ matrix.python-version }} name: modules ${{ matrix.python-version }}
path: build/**/*.so path: build/**/*.so
@@ -58,7 +58,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Merge Artifacts - name: Merge Artifacts
uses: actions/upload-artifact/merge@v4 uses: actions/upload-artifact/merge@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
with: with:
name: modules name: modules
pattern: modules* pattern: modules*

View File

@@ -15,7 +15,7 @@ jobs:
push-source: push-source:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Get Transifex Client - name: Get Transifex Client
run: | run: |
curl -o- https://raw.githubusercontent.com/transifex/cli/master/install.sh | bash -s -- $TX_VERSION curl -o- https://raw.githubusercontent.com/transifex/cli/master/install.sh | bash -s -- $TX_VERSION

View File

@@ -10,7 +10,6 @@ from optparse import OptionParser
import shutil import shutil
from multiprocessing import Pool from multiprocessing import Pool
from setuptools import sandbox
from hscommon import sphinxgen from hscommon import sphinxgen
from hscommon.build import ( from hscommon.build import (
add_to_pythonpath, add_to_pythonpath,
@@ -18,6 +17,7 @@ from hscommon.build import (
fix_qt_resource_file, fix_qt_resource_file,
) )
from hscommon import loc from hscommon import loc
import subprocess
def parse_args(): def parse_args():
@@ -118,7 +118,7 @@ def build_normpo():
def build_pe_modules(): def build_pe_modules():
print("Building PE Modules") print("Building PE Modules")
# Leverage setup.py to build modules # Leverage setup.py to build modules
sandbox.run_setup("setup.py", ["build_ext", "--inplace"]) subprocess.check_call([sys.executable, "setup.py", "build_ext", "--inplace"])
def build_normal(): def build_normal():

View File

@@ -96,6 +96,8 @@ 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 {
@@ -103,6 +105,8 @@ 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):
@@ -116,6 +120,10 @@ 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:
@@ -130,6 +138,8 @@ 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,
] ]
] ]

View File

@@ -325,7 +325,7 @@ class Results(Markable):
del self.__group_of_duplicate[dupe] del self.__group_of_duplicate[dupe]
self._remove_mark_flag(dupe) self._remove_mark_flag(dupe)
self.__total_count -= 1 self.__total_count -= 1
self.__total_size -= dupe.size self.__total_size = max(0, self.__total_size - dupe.size)
if not group: if not group:
del self.__group_of_duplicate[ref] del self.__group_of_duplicate[ref]
self.__groups.remove(group) self.__groups.remove(group)

View File

@@ -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 (Mo)" msgstr "Taille (MB)"
#: 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 "Échantillonnage" msgstr "Sample Rate"
#: 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 "Numéro de piste" msgstr "Track"
#: 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 "Correspond à %" msgstr "Match %"
#: 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 utilisés" msgstr "Mots"
#: 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 (Ko)" msgstr "Taille (KB)"
#: core\pe\result_table.py:24 #: core\pe\result_table.py:24
msgid "EXIF Timestamp" msgid "EXIF Timestamp"

View File

@@ -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. Vous ne pouvez pas encore en démarrer une nouvelle. " "Une action précédente est encore en cours. Attendez quelques secondes avant "
"Attendez quelques secondes et essayer à nouveau." "d'en repartir une nouvelle."
#: 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 "Tous les fichiers marqués ont bien été supprimés." msgstr ""
#: 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 "{} fichiers collectés pour scanner" msgstr ""
#: core\directories.py:207 #: core\directories.py:207
msgid "Collected {} folders to scan" msgid "Collected {} folders to scan"
msgstr "{} dossiers collectés pour scanner" msgstr ""
#: 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 "Analysé %d/%d images" msgstr "Analyzé %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 fin" msgstr "Pas de chiffres à la finr"
#: core\prioritize.py:104 #: core\prioritize.py:104
msgid "Longest" msgid "Longest"

View File

@@ -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 dupliqué, remplacer celui-ci par un lien vers le " "Après avoir effacé un fichier, 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 "Lien en dur" msgstr "Hardlink"
#: qt/deletion_options.py:44 #: qt/deletion_options.py:44
msgid "Symlink" msgid "Symlink"
msgstr "Lien symbolique" msgstr "Symlink"
#: 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 d'échec avec la métode de suppression normale." "n'est généralement utilisée qu'en cas de problème."
#: 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 "Piste" msgstr "Track"
#: 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 une suppression ou un déplacement" msgstr "Effacer les dossiers vides après 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 un lien en dur vers le même fichier" msgstr "Ignorer doublons avec hardlink 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 "Copie et déplacements de fichiers :" msgstr "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 et cliquez sur OK pour envoyer les doublons qui " "Ajoutez des critères dans la liste de droite pour envoyer les doublons qui "
"correspondent le plus à ces critères à la position de référence. Une lecture " "correspondent le plus à ces critère à 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 (ou tous). La" "Des problèmes ont été rencontrés lors du traitement de certains fichiers. 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 la selection" msgstr "Révéler Fichier"
#: 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 les fichiers marqués à la corbeille..." msgstr "Envoyer 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 les fichiers marqués vers..." msgstr "Déplacer 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 les fichiers marqués vers..." msgstr "Copier 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 les fichiers marqués des résultats" msgstr "Retirer 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 les fichiers sélectionnés des résultats" msgstr "Retirer 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 les fichiers sélectionnés à la liste de fichiers ignorés" msgstr "Ajouter 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 les fichiers sélectionnés en références" msgstr "Transformer 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 les fichiers sélectionnés avec l'application par défaut" msgstr "Ouvrir sélectionné 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 en HTML" msgstr "Exporter vers HTML"
#: qt/result_window.py:88 #: qt/result_window.py:88
msgid "Export To CSV" msgid "Export To CSV"
msgstr "Exporter en CSV" msgstr "Exporter vers 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 les résultats..." msgstr "Sauvegarder 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 une commande personnalisée" msgstr "Invoquer 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 "Dupliqués seulement" msgstr "Sans réf."
#: 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 "Ko" msgstr "KB"
#: 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 un nouveau dossier..." msgstr "Ajouter 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 "Recherche de mise à jour..." msgstr "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 en CSV" msgstr "Exporter les résultats vers 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 en XHTML" msgstr "Exporter les résultats vers HTML"
#: 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 "Regard rapide" msgstr "Quick Look"
#: 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 "Zoomer" msgstr "Accroître zoom"
#: qt\pe\image_viewer.py:66 #: qt\pe\image_viewer.py:66
msgid "Decrease zoom" msgid "Decrease zoom"
msgstr "Dézoomer" msgstr "Décroître zoom"
#: 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,61 +945,59 @@ 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 Hacher partiellement les fichiers plus gros que" msgstr ""
#: qt\se\preferences_dialog.py:80 #: qt\se\preferences_dialog.py:80
msgid "MB" msgid "MB"
msgstr "Mo" msgstr ""
#: qt\preferences_dialog.py:163 #: qt\preferences_dialog.py:163
msgid "Use native OS dialogs" msgid "Use native OS dialogs"
msgstr "Utiliser les dialogues natifs de l'OS" msgstr ""
#: 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 "Pour les actions telles que la sélection de fichiers/dossiers, utilisez les boîtes de dialogue natives du système d'exploitation.\n" msgstr ""
"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 "Ignorer les fichiers plus gros que" msgstr ""
#: qt\app.py:135 qt\app.py:293 #: qt\app.py:135 qt\app.py:293
msgid "Clear Cache" msgid "Clear Cache"
msgstr "Vider le cache" msgstr ""
#: 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 "Voulez-vous réellement vider le cacher ? Cela supprimera tous les hash de fichiers dans le cache" msgstr ""
" et les analyses d'image."
#: qt\app.py:299 #: qt\app.py:299
msgid "Cache cleared." msgid "Cache cleared."
msgstr "Cache vidé." msgstr ""
#: qt\preferences_dialog.py:173 #: qt\preferences_dialog.py:173
msgid "Use dark style" msgid "Use dark style"
msgstr "Utliliser le style sombre" msgstr ""
#: qt\preferences_dialog.py:241 #: qt\preferences_dialog.py:241
msgid "Profile scan operation" msgid "Profile scan operation"
msgstr "Opération de balayage de profil" msgstr ""
#: 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 "Profilage de l'opération de balayage et enregistrement des journaux pour optimisation" msgstr ""
#: 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 "Les logs se trouvent dans : <a href=\"{}\">{}</a>" msgstr ""
#: qt\preferences_dialog.py:291 #: qt\preferences_dialog.py:291
msgid "Debug" msgid "Debug"
msgstr "Débogage" msgstr ""
#: qt\about_box.py:31 #: qt\about_box.py:31
msgid "About {}" msgid "About {}"
@@ -1011,7 +1009,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 "Recherche des mises à jour..." msgstr ""
#: qt\about_box.py:54 #: qt\about_box.py:54
msgid "Licensed under GPLv3" msgid "Licensed under GPLv3"
@@ -1019,11 +1017,11 @@ msgstr "Sous licence GPLv3"
#: qt\about_box.py:68 #: qt\about_box.py:68
msgid "No update available." msgid "No update available."
msgstr "Pas de mise à jour disponible." msgstr ""
#: 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 "Une nouvelle version ({}) est disponible, téléchagez-là <a href=\"{}\">ici</a>." msgstr ""
#: qt\error_report_dialog.py:50 #: qt\error_report_dialog.py:50
msgid "Error Report" msgid "Error Report"
@@ -1031,7 +1029,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 ""
@@ -1143,36 +1141,31 @@ 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 "Ces options sont destinées aux utilisateurs avancés ou pour des situation bien spécifiques, " msgstr ""
"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 "Inclure un contrôle d'existence à la fin de l'analyse" msgstr ""
#: 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 "Ignorer la différence dans le mtime en chargent les résumés en cache" msgstr ""
#: qt\progress_window.py:64 #: qt\progress_window.py:64
msgid "Cancel?" msgid "Cancel?"
msgstr "Annuler ?" msgstr ""
#: 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 "Êtes-vous sûr de vouloir annuler ? Tout ce qui a déjà été fait va être perdu." msgstr ""
#: 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 "Cette expression régulière python (sensible à la casse) va filtrer les fichiers pendant les scans.<br>" msgstr ""
"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 "Associer des images de différentes rotations" msgstr ""