Started moving towards a gettext-based localization.

This commit is contained in:
Virgil Dupras 2011-11-01 15:44:18 -04:00
parent 036026d64a
commit d80a56db78
34 changed files with 1821 additions and 105 deletions

View File

@ -4,6 +4,7 @@ syntax: glob
run.py
*.pyc
*.so
*.mo
*.pyd
*.xcodeproj/xcuserdata
*.xcodeproj/project.xcworkspace/xcuserdata

View File

@ -18,6 +18,7 @@ from distutils.extension import Extension
from hscommon import sphinxgen
from hscommon.build import (add_to_pythonpath, print_and_do, copy_packages, filereplace,
get_module_version, build_all_cocoa_locs, build_all_qt_locs, move_all)
from hscommon import loc
def parse_args():
usage = "usage: %prog [options]"
@ -28,6 +29,8 @@ def parse_args():
help="Build only the help file")
parser.add_option('--loc', action='store_true', dest='loc',
help="Build only localization")
parser.add_option('--locpot', action='store_true', dest='locpot',
help="Generate .pot files from source code.")
(options, args) = parser.parse_args()
return options
@ -112,6 +115,26 @@ def build_localizations(ui, edition):
elif ui == 'qt':
print("Building .ts files")
build_all_qt_locs(op.join('qt', 'lang'), extradirs=[op.join('qtlib', 'lang')])
print("Compiling .po files")
loc.compile_all_po('locale')
loc.compile_all_po(op.join('hscommon', 'locale'))
loc.compile_all_po(op.join('qtlib', 'locale'))
loc.merge_locale_dir(op.join('hscommon', 'locale'), 'locale')
loc.merge_locale_dir(op.join('qtlib', 'locale'), 'locale')
def build_locpot():
print("Building .pot files from source files")
print("Building core.pot")
all_cores = ['core', 'core_se', 'core_me', 'core_pe']
loc.generate_pot(all_cores, op.join('locale', 'core.pot'), ['tr'])
print("Building columns.pot")
loc.generate_pot(all_cores, op.join('locale', 'columns.pot'), ['coltr'])
print("Building ui.pot")
loc.generate_pot(['qt'], op.join('locale', 'ui.pot'), ['tr'])
print("Building hscommon.pot")
loc.generate_pot(['hscommon'], op.join('hscommon', 'locale', 'hscommon.pot'), ['tr'])
print("Building qtlib.pot")
loc.generate_pot(['qtlib'], op.join('qtlib', 'locale', 'qtlib.pot'), ['tr'])
def build_pe_modules(ui):
print("Building PE Modules")
@ -167,6 +190,8 @@ def main():
build_help(edition)
elif options.loc:
build_localizations(ui, edition)
elif options.locpot:
build_locpot()
else:
build_normal(edition, ui, dev)

View File

@ -17,7 +17,7 @@ from hscommon import io
from hscommon.util import remove_invalid_xml
from hscommon.path import Path
from hscommon.cocoa.objcmin import NSUserDefaults, NSURL
from hscommon.trans import tr, trmsg
from hscommon.trans import tr
from core import directories
from core_pe import _block_osx
@ -193,7 +193,7 @@ class DupeGuruPE(DupeGuruBase):
try:
app('iPhoto')
except ApplicationNotFoundError:
self.view.show_message(trmsg("IPhotoAppNotFoundMsg"))
self.view.show_message(tr("IPhotoAppNotFoundMsg"))
return
DupeGuruBase.start_scanning(self)

View File

@ -22,7 +22,7 @@ from hscommon.path import Path
from hscommon.conflict import smart_move, smart_copy
from hscommon.util import (delete_if_empty, first, escape, nonone, format_time_decimal, allsame,
rem_file_ext)
from hscommon.trans import tr, trmsg
from hscommon.trans import tr
from . import directories, results, scanner, export, fs
@ -428,7 +428,7 @@ class DupeGuru(RegistrableApplication, Broadcaster):
self.results.groups = self.scanner.GetDupeGroups(files, j)
if not self.directories.has_any_file():
self.view.show_message(trmsg("NoScannableFileMsg"))
self.view.show_message(tr("NoScannableFileMsg"))
return
self.results.groups = []
self._results_changed()

View File

@ -7,9 +7,9 @@
# http://www.hardcoded.net/licenses/bsd_license
from hscommon.util import dedupe, flatten, rem_file_ext
from hscommon.trans import tr
from hscommon.trans import trget, tr
coltr = lambda s: tr(s, 'columns')
coltr = trget('columns')
class CriterionCategory:
NAME = "Undefined"

View File

@ -5,7 +5,7 @@
# which should be included with this package. The terms are also available at
# http://www.hardcoded.net/licenses/bsd_license
from hscommon.trans import tr as trbase
from hscommon.trans import trget
from hscommon.util import format_size, format_time
from core.app import (DupeGuru as DupeGuruBase, Column, format_timestamp,
@ -14,29 +14,29 @@ from . import prioritize
from . import __appname__
from . import scanner, fs
tr = lambda s: trbase(s, 'columns')
coltr = trget('columns')
class DupeGuru(DupeGuruBase):
NAME = __appname__
COLUMNS = [
Column('name', tr("Filename")),
Column('folder_path', tr("Folder")),
Column('size', tr("Size (MB)")),
Column('duration', tr("Time")),
Column('bitrate', tr("Bitrate")),
Column('samplerate', tr("Sample Rate")),
Column('extension', tr("Kind")),
Column('mtime', tr("Modification")),
Column('title', tr("Title")),
Column('artist', tr("Artist")),
Column('album', tr("Album")),
Column('genre', tr("Genre")),
Column('year', tr("Year")),
Column('track', tr("Track Number")),
Column('comment', tr("Comment")),
Column('percentage', tr("Match %")),
Column('words', tr("Words Used")),
Column('dupe_count', tr("Dupe Count")),
Column('name', coltr("Filename")),
Column('folder_path', coltr("Folder")),
Column('size', coltr("Size (MB)")),
Column('duration', coltr("Time")),
Column('bitrate', coltr("Bitrate")),
Column('samplerate', coltr("Sample Rate")),
Column('extension', coltr("Kind")),
Column('mtime', coltr("Modification")),
Column('title', coltr("Title")),
Column('artist', coltr("Artist")),
Column('album', coltr("Album")),
Column('genre', coltr("Genre")),
Column('year', coltr("Year")),
Column('track', coltr("Track Number")),
Column('comment', coltr("Comment")),
Column('percentage', coltr("Match %")),
Column('words', coltr("Words Used")),
Column('dupe_count', coltr("Dupe Count")),
]
DELTA_COLUMNS = {2, 3, 4, 5, 7}
METADATA_TO_READ = ['size', 'mtime', 'duration', 'bitrate', 'samplerate', 'title', 'artist',

View File

@ -5,12 +5,12 @@
# which should be included with this package. The terms are also available at
# http://www.hardcoded.net/licenses/bsd_license
from hscommon.trans import tr
from hscommon.trans import trget
from core.prioritize import (KindCategory, FolderCategory, FilenameCategory, NumericalCategory,
SizeCategory, MtimeCategory)
coltr = lambda s: tr(s, 'columns')
coltr = trget('columns')
class DurationCategory(NumericalCategory):
NAME = coltr("Duration")

View File

@ -7,7 +7,7 @@
import os.path as op
from hscommon.trans import tr as trbase
from hscommon.trans import trget
from hscommon.util import format_size
from core.app import (DupeGuru as DupeGuruBase, Column, format_timestamp, format_perc,
@ -16,7 +16,7 @@ from .scanner import ScannerPE
from . import prioritize
from . import __appname__
tr = lambda s: trbase(s, 'columns')
coltr = trget('columns')
def format_dimensions(dimensions):
return '%d x %d' % (dimensions[0], dimensions[1])
@ -27,14 +27,14 @@ def get_delta_dimensions(value, ref_value):
class DupeGuru(DupeGuruBase):
NAME = __appname__
COLUMNS = [
Column('name', tr("Filename")),
Column('folder_path', tr("Folder")),
Column('size', tr("Size (KB)")),
Column('extension', tr("Kind")),
Column('dimensions', tr("Dimensions")),
Column('mtime', tr("Modification")),
Column('percentage', tr("Match %")),
Column('dupe_count', tr("Dupe Count")),
Column('name', coltr("Filename")),
Column('folder_path', coltr("Folder")),
Column('size', coltr("Size (KB)")),
Column('extension', coltr("Kind")),
Column('dimensions', coltr("Dimensions")),
Column('mtime', coltr("Modification")),
Column('percentage', coltr("Match %")),
Column('dupe_count', coltr("Dupe Count")),
]
DELTA_COLUMNS = {2, 4, 5}
METADATA_TO_READ = ['size', 'mtime', 'dimensions']

View File

@ -5,12 +5,12 @@
# which should be included with this package. The terms are also available at
# http://www.hardcoded.net/licenses/bsd_license
from hscommon.trans import tr
from hscommon.trans import trget
from core.prioritize import (KindCategory, FolderCategory, FilenameCategory, NumericalCategory,
SizeCategory, MtimeCategory)
coltr = lambda s: tr(s, 'columns')
coltr = trget('columns')
class DimensionsCategory(NumericalCategory):
NAME = coltr("Dimensions")

View File

@ -5,7 +5,7 @@
# which should be included with this package. The terms are also available at
# http://www.hardcoded.net/licenses/bsd_license
from hscommon.trans import tr as trbase
from hscommon.trans import trget
from hscommon.util import format_size
from core.app import (DupeGuru as DupeGuruBase, Column, format_timestamp, format_perc,
@ -13,19 +13,19 @@ from core.app import (DupeGuru as DupeGuruBase, Column, format_timestamp, format
from core import prioritize
from . import __appname__
tr = lambda s: trbase(s, 'columns')
coltr = trget('columns')
class DupeGuru(DupeGuruBase):
NAME = __appname__
COLUMNS = [
Column('name', tr("Filename")),
Column('folder_path', tr("Folder")),
Column('size', tr("Size (KB)")),
Column('extension', tr("Kind")),
Column('mtime', tr("Modification")),
Column('percentage', tr("Match %")),
Column('words', tr("Words Used")),
Column('dupe_count', tr("Dupe Count")),
Column('name', coltr("Filename")),
Column('folder_path', coltr("Folder")),
Column('size', coltr("Size (KB)")),
Column('extension', coltr("Kind")),
Column('mtime', coltr("Modification")),
Column('percentage', coltr("Match %")),
Column('words', coltr("Words Used")),
Column('dupe_count', coltr("Dupe Count")),
]
DELTA_COLUMNS = {2, 4}
METADATA_TO_READ = ['size', 'mtime']

98
locale/columns.pot Normal file
View File

@ -0,0 +1,98 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=utf-8\n"
#: core/prioritize.py:63 core_me/app.py:28 core_pe/app.py:33 core_se/app.py:24
msgid "Kind"
msgstr ""
#: core/prioritize.py:72 core_me/app.py:23 core_pe/app.py:31 core_se/app.py:22
msgid "Folder"
msgstr ""
#: core/prioritize.py:88 core_me/app.py:22 core_pe/app.py:30 core_se/app.py:21
msgid "Filename"
msgstr ""
#: core/prioritize.py:132
msgid "Size"
msgstr ""
#: core/prioritize.py:138 core_me/app.py:29 core_pe/app.py:35
#: core_se/app.py:25
msgid "Modification"
msgstr ""
#: core_me/app.py:24
msgid "Size (MB)"
msgstr ""
#: core_me/app.py:25
msgid "Time"
msgstr ""
#: core_me/app.py:26 core_me/prioritize.py:22
msgid "Bitrate"
msgstr ""
#: core_me/app.py:27
msgid "Sample Rate"
msgstr ""
#: core_me/app.py:30
msgid "Title"
msgstr ""
#: core_me/app.py:31
msgid "Artist"
msgstr ""
#: core_me/app.py:32
msgid "Album"
msgstr ""
#: core_me/app.py:33
msgid "Genre"
msgstr ""
#: core_me/app.py:34
msgid "Year"
msgstr ""
#: core_me/app.py:35
msgid "Track Number"
msgstr ""
#: core_me/app.py:36
msgid "Comment"
msgstr ""
#: core_me/app.py:37 core_pe/app.py:36 core_se/app.py:26
msgid "Match %"
msgstr ""
#: core_me/app.py:38 core_se/app.py:27
msgid "Words Used"
msgstr ""
#: core_me/app.py:39 core_pe/app.py:37 core_se/app.py:28
msgid "Dupe Count"
msgstr ""
#: core_me/prioritize.py:16
msgid "Duration"
msgstr ""
#: core_me/prioritize.py:28
msgid "Samplerate"
msgstr ""
#: core_pe/app.py:32 core_se/app.py:23
msgid "Size (KB)"
msgstr ""
#: core_pe/app.py:34 core_pe/prioritize.py:16
msgid "Dimensions"
msgstr ""

121
locale/core.pot Normal file
View File

@ -0,0 +1,121 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=utf-8\n"
#: core/app.py:86
msgid "will only be able to delete, move or copy 10 duplicates at once"
msgstr ""
#: core/app.py:192
msgid "You cannot delete, move or copy more than 10 duplicates at once in demo mode."
msgstr ""
#: core/app.py:420
msgid "Collecting files to scan"
msgstr ""
#: core/app.py:431
msgid "NoScannableFileMsg"
msgstr ""
#: core/app.py:470
msgid "%s (%d discarded)"
msgstr ""
#: core/engine.py:178 core/engine.py:215
msgid "0 matches found"
msgstr ""
#: core/engine.py:196 core/engine.py:223
msgid "%d matches found"
msgstr ""
#: core/engine.py:208 core/scanner.py:56
msgid "Read size of %d/%d files"
msgstr ""
#: core/engine.py:355
msgid "Grouped %d/%d matches"
msgstr ""
#: core/gui/extra_fairware_reminder.py:23
msgid "Continue ({})"
msgstr ""
#: core/gui/extra_fairware_reminder.py:25
msgid "Continue"
msgstr ""
#: core/prioritize.py:68
msgid "None"
msgstr ""
#: core/prioritize.py:94
msgid "Ends with number"
msgstr ""
#: core/prioritize.py:96
msgid "Doesn't end with number"
msgstr ""
#: core/prioritize.py:117
msgid "Highest"
msgstr ""
#: core/prioritize.py:117
msgid "Lowest"
msgstr ""
#: core/prioritize.py:144
msgid "Newest"
msgstr ""
#: core/prioritize.py:144
msgid "Oldest"
msgstr ""
#: core/results.py:95
msgid "%d / %d (%s / %s) duplicates marked."
msgstr ""
#: core/results.py:102
msgid " filter: %s"
msgstr ""
#: core/scanner.py:76
msgid "Read metadata of %d/%d files"
msgstr ""
#: core/scanner.py:106
msgid "Removing false matches"
msgstr ""
#: core/scanner.py:124
msgid "Processed %d/%d matches against the ignore list"
msgstr ""
#: core/scanner.py:133
msgid "Doing group prioritization"
msgstr ""
#: core_pe/matchblock.py:60
msgid "Analyzed %d/%d pictures"
msgstr ""
#: core_pe/matchblock.py:144
msgid "Performed %d/%d chunk matches"
msgstr ""
#: core_pe/matchblock.py:149
msgid "Preparing for matching"
msgstr ""
#: core_pe/matchblock.py:184
msgid "Verified %d/%d matches"
msgstr ""
#: core_pe/matchexif.py:21
msgid "Read EXIF of %d/%d pictures"
msgstr ""

View File

@ -0,0 +1,98 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=utf-8\n"
#: core/prioritize.py:63 core_me/app.py:28 core_pe/app.py:33 core_se/app.py:24
msgid "Kind"
msgstr "Type"
#: core/prioritize.py:72 core_me/app.py:23 core_pe/app.py:31 core_se/app.py:22
msgid "Folder"
msgstr "Dossier"
#: core/prioritize.py:88 core_me/app.py:22 core_pe/app.py:30 core_se/app.py:21
msgid "Filename"
msgstr "Nom de fichier"
#: core/prioritize.py:132
msgid "Size"
msgstr "Taille"
#: core/prioritize.py:138 core_me/app.py:29 core_pe/app.py:35
#: core_se/app.py:25
msgid "Modification"
msgstr "Modification"
#: core_me/app.py:24
msgid "Size (MB)"
msgstr "Taille (MB)"
#: core_me/app.py:25
msgid "Time"
msgstr "Temps"
#: core_me/app.py:26 core_me/prioritize.py:22
msgid "Bitrate"
msgstr "Bitrate"
#: core_me/app.py:27
msgid "Sample Rate"
msgstr "Sample Rate"
#: core_me/app.py:30
msgid "Title"
msgstr "Titre"
#: core_me/app.py:31
msgid "Artist"
msgstr "Artiste"
#: core_me/app.py:32
msgid "Album"
msgstr "Album"
#: core_me/app.py:33
msgid "Genre"
msgstr "Genre"
#: core_me/app.py:34
msgid "Year"
msgstr "Année"
#: core_me/app.py:35
msgid "Track Number"
msgstr "Track"
#: core_me/app.py:36
msgid "Comment"
msgstr "Commentaire"
#: core_me/app.py:37 core_pe/app.py:36 core_se/app.py:26
msgid "Match %"
msgstr "Match %"
#: core_me/app.py:38 core_se/app.py:27
msgid "Words Used"
msgstr "Mots"
#: core_me/app.py:39 core_pe/app.py:37 core_se/app.py:28
msgid "Dupe Count"
msgstr "# Doublons"
#: core_me/prioritize.py:16
msgid "Duration"
msgstr ""
#: core_me/prioritize.py:28
msgid "Samplerate"
msgstr ""
#: core_pe/app.py:32 core_se/app.py:23
msgid "Size (KB)"
msgstr "Taille (KB)"
#: core_pe/app.py:34 core_pe/prioritize.py:16
msgid "Dimensions"
msgstr "Dimensions"

View File

@ -0,0 +1,121 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=utf-8\n"
#: core/app.py:86
msgid "will only be able to delete, move or copy 10 duplicates at once"
msgstr ""
#: core/app.py:192
msgid "You cannot delete, move or copy more than 10 duplicates at once in demo mode."
msgstr ""
#: core/app.py:420
msgid "Collecting files to scan"
msgstr "Collecte des fichiers à scanner"
#: core/app.py:431
msgid "NoScannableFileMsg"
msgstr "Les dossiers sélectionnés ne contiennent pas de fichiers valides."
#: core/app.py:470
msgid "%s (%d discarded)"
msgstr "%s (%d hors-groupe)"
#: core/engine.py:178 core/engine.py:215
msgid "0 matches found"
msgstr "0 paires trouvées"
#: core/engine.py:196 core/engine.py:223
msgid "%d matches found"
msgstr "%d paires trouvées"
#: core/engine.py:208 core/scanner.py:56
msgid "Read size of %d/%d files"
msgstr "Lu la taille de %d/%d fichiers"
#: core/engine.py:355
msgid "Grouped %d/%d matches"
msgstr "%d/%d paires groupées"
#: core/gui/extra_fairware_reminder.py:23
msgid "Continue ({})"
msgstr "Continuer ({})"
#: core/gui/extra_fairware_reminder.py:25
msgid "Continue"
msgstr "Continuer"
#: core/prioritize.py:68
msgid "None"
msgstr ""
#: core/prioritize.py:94
msgid "Ends with number"
msgstr "Chiffres à la fin"
#: core/prioritize.py:96
msgid "Doesn't end with number"
msgstr "Pas de chiffres à la finr"
#: core/prioritize.py:117
msgid "Highest"
msgstr "Plus grand"
#: core/prioritize.py:117
msgid "Lowest"
msgstr "Moins grand"
#: core/prioritize.py:144
msgid "Newest"
msgstr "Plus récent"
#: core/prioritize.py:144
msgid "Oldest"
msgstr "Moins récent"
#: core/results.py:95
msgid "%d / %d (%s / %s) duplicates marked."
msgstr "%d / %d (%s / %s) doublons marqués."
#: core/results.py:102
msgid " filter: %s"
msgstr " filtre: %s"
#: core/scanner.py:76
msgid "Read metadata of %d/%d files"
msgstr "Lu les métadonnées de %d/%d fichiers"
#: core/scanner.py:106
msgid "Removing false matches"
msgstr "Retrait des paires invalides"
#: core/scanner.py:124
msgid "Processed %d/%d matches against the ignore list"
msgstr "Vérification de %d/%d paires dans la ignore list"
#: core/scanner.py:133
msgid "Doing group prioritization"
msgstr "Prioritization des groupes"
#: core_pe/matchblock.py:60
msgid "Analyzed %d/%d pictures"
msgstr "Analyzé %d/%d images"
#: core_pe/matchblock.py:144
msgid "Performed %d/%d chunk matches"
msgstr "%d/%d blocs d'images comparés"
#: core_pe/matchblock.py:149
msgid "Preparing for matching"
msgstr "Préparation pour la comparaison"
#: core_pe/matchblock.py:184
msgid "Verified %d/%d matches"
msgstr "Vérifié %d/%d paires"
#: core_pe/matchexif.py:21
msgid "Read EXIF of %d/%d pictures"
msgstr ""

608
locale/fr/LC_MESSAGES/ui.po Normal file
View File

@ -0,0 +1,608 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=utf-8\n"
#: qt/base/app.py:39
msgid "Scanning for duplicates"
msgstr "Scan de doublons en cours"
#: qt/base/app.py:40
msgid "Loading"
msgstr "Chargement en cours"
#: qt/base/app.py:41
msgid "Moving"
msgstr "Déplacement en cours"
#: qt/base/app.py:42
msgid "Copying"
msgstr "Copie en cours"
#: qt/base/app.py:43
msgid "Sending files to the recycle bin"
msgstr "Envoi de fichiers à la corbeille"
#: qt/base/app.py:103
msgid "Quit"
msgstr "Quitter"
#: qt/base/app.py:104 qt/base/preferences_dialog.py:120
msgid "Preferences"
msgstr "Préférences"
#: qt/base/app.py:105
msgid "dupeGuru Help"
msgstr "Aide dupeGuru"
#: qt/base/app.py:106
msgid "About dupeGuru"
msgstr "À propos de dupeGuru"
#: qt/base/app.py:107
msgid "Register dupeGuru"
msgstr "Enregistrer dupeGuru"
#: qt/base/app.py:108
msgid "Check for Update"
msgstr "Vérifier les mises à jour"
#: qt/base/app.py:109
msgid "Open Debug Log"
msgstr "Ouvrir logs de déboguage"
#: qt/base/app.py:140
msgid "Add to Ignore List"
msgstr "Ignorer ces doublons à l'avenir"
#: qt/base/app.py:141
msgid "IgnoreConfirmMsg"
msgstr "%d fichiers seront ignorés des prochains scans. Continuer?"
#: qt/base/app.py:146
msgid "copy"
msgstr "copier"
#: qt/base/app.py:146
msgid "move"
msgstr "déplacer"
#: qt/base/app.py:147
msgid "SelectCopyOrMoveDestinationMsg"
msgstr "Sélectionnez un dossier vers lequel {} les fichiers marqués."
#: qt/base/app.py:159 qt/base/result_window.py:320
msgid "Remove duplicates"
msgstr "Retirer des doublons"
#: qt/base/app.py:160 qt/base/result_window.py:321
msgid "FileRemovalConfirmMsg"
msgstr "{} fichiers seront retirés des résultats. Continuer?"
#: qt/base/app.py:179
msgid "NoCustomCommandMsg"
msgstr "Vous n'avez pas de commande personnalisée. Ajoutez-la dans vos préférences."
#: qt/base/app.py:180
msgid "Custom Command"
msgstr "Commande personnalisée"
#: qt/base/app.py:210
msgid "OperationSuccessMsg"
msgstr "Tous les fichiers ont été traités avec succès."
#: qt/base/app.py:211
msgid "Operation Complete"
msgstr "Opération complétée"
#: qt/base/app.py:214
msgid "Scan complete"
msgstr "Scan complété"
#: qt/base/app.py:215
msgid "NoDuplicateFoundMsg"
msgstr "Aucun doublon trouvé."
#: qt/base/app.py:267
msgid "TaskHangingMsg"
msgstr "Une action précédente est encore en cours. Attendez quelques secondes avant d'en repartir une nouvelle."
#: qt/base/details_table.py:14
msgid "Attribute"
msgstr "Attribut"
#: qt/base/details_table.py:14
msgid "Selected"
msgstr "Sélectionné"
#: qt/base/details_table.py:14 qt/base/directories_model.py:21
msgid "Reference"
msgstr "Référence"
#: qt/base/directories_dialog.py:54
msgid "Load Results..."
msgstr "Charger résultats..."
#: qt/base/directories_dialog.py:55
msgid "Results Window"
msgstr "Fenêtre de résultats"
#: qt/base/directories_dialog.py:56
msgid "Add Folder..."
msgstr "Ajouter dossier..."
#: qt/base/directories_dialog.py:64 qt/base/result_window.py:81
msgid "File"
msgstr "Fichier"
#: qt/base/directories_dialog.py:66 qt/base/result_window.py:89
msgid "View"
msgstr "Voir"
#: qt/base/directories_dialog.py:68 qt/base/result_window.py:91
msgid "Help"
msgstr "Aide"
#: qt/base/directories_dialog.py:70
msgid "Load Recent Results"
msgstr "Charger résultats récents"
#: qt/base/directories_dialog.py:104
msgid "SelectFolderToScanMsg"
msgstr "Sélectionnez les dossiers à scanner puis faites "Scan"."
#: qt/base/directories_dialog.py:133
msgid "Load Results"
msgstr "Charger"
#: qt/base/directories_dialog.py:136
msgid "Scan"
msgstr "Scan"
#: qt/base/directories_dialog.py:173
msgid "Unsaved results"
msgstr "Résultats non sauvegardés"
#: qt/base/directories_dialog.py:174
msgid "ReallyWantToQuitMsg"
msgstr "Vos résultats ne sont pas sauvegardés. Voulez-vous vraiment quitter?"
#: qt/base/directories_dialog.py:182
msgid "SelectFolderToAddMsg"
msgstr "Sélectionnez un dossier à ajouter à la liste"
#: qt/base/directories_dialog.py:199
msgid "SelectResultToLoadMsg"
msgstr "Sélectionnez un fichier résultats à charger"
#: qt/base/directories_dialog.py:200
msgid "All Files (*.*)"
msgstr "Tout les fichiers (*.*)"
#: qt/base/directories_dialog.py:200 qt/base/result_window.py:342
msgid "dupeGuru Results (*.dupeguru)"
msgstr "Résultats dupeGuru (*.dupeguru)"
#: qt/base/directories_dialog.py:218
msgid "Start a new scan"
msgstr "Commencer un nouveau scan"
#: qt/base/directories_dialog.py:219
msgid "ReallyWantToContinueMsg"
msgstr "Vos résultats ne sont pas sauvegardés. Voulez-vous vraiment continuer?"
#: qt/base/directories_model.py:20
msgid "Name"
msgstr "Nom"
#: qt/base/directories_model.py:20
msgid "State"
msgstr "Type"
#: qt/base/directories_model.py:21
msgid "Excluded"
msgstr "Exclu"
#: qt/base/directories_model.py:21
msgid "Normal"
msgstr "Normal"
#: qt/base/extra_fairware_reminder.py:35
msgid "Sorry, I must insist"
msgstr "Désolé, je dois insister"
#: qt/base/extra_fairware_reminder.py:40
msgid "ExtraFairwarePromptMsg"
msgstr ""
"Il semble que vous ayez trouvé beaucoup de doublons. Super! Je dois par contre insister que des contributions sont attendues lorsqu'il y'a des heures non-payées au projet.\n\n"
"Vous pensez peut-être \"je n'utiliserai ce programme qu'une fois, pas besoin de contribuer\". Le problème c'est que la plupart des utilisateurs de dupeGuru ne l'utilisent qu'une fois. Si tous suivent ce raisonnement, le développement de dupeGuru ne peut pas continuer. C'est à cause de cette tendance inhérente à la nature de dupeGuru que je me vois contraint d'insister ici.\n\n"
"Si vous n'avez pas les moyens de contribuer, ignorez ce message ou envoyez moi un message à hsoft@hardcoded.net pour que je vous envoie une clé d'enregistrement."
#: qt/base/extra_fairware_reminder.py:44
msgid "ExtraFairwareReasonMsg"
msgstr ""
"Ce rappel apparaît parce que:\n\n"
"1. Plus de 100 doublons sont traités\n"
"2. Vous n'avez pas encore contribué à dupeGuru\n"
"3. Il y a des heures non-payées au projet"
#: qt/base/extra_fairware_reminder.py:55
msgid "Contribute"
msgstr "Contribuer"
#: qt/base/extra_fairware_reminder.py:58
msgid "Continue"
msgstr "Continuer"
#: qt/base/preferences_dialog.py:32
msgid "Scan Type:"
msgstr "Type de scan:"
#: qt/base/preferences_dialog.py:45
msgid "Filter Hardness:"
msgstr "Seuil du filtre:"
#: qt/base/preferences_dialog.py:71
msgid "More Results"
msgstr "+ de doublons"
#: qt/base/preferences_dialog.py:76
msgid "Fewer Results"
msgstr "- de doublons"
#: qt/base/preferences_dialog.py:83
msgid "Font size:"
msgstr "Taille de police:"
#: qt/base/preferences_dialog.py:87
msgid "Language:"
msgstr "Langue:"
#: qt/base/preferences_dialog.py:89
msgid "English"
msgstr "Anglais"
#: qt/base/preferences_dialog.py:90
msgid "French"
msgstr "Français"
#: qt/base/preferences_dialog.py:91
msgid "German"
msgstr "Allemand"
#: qt/base/preferences_dialog.py:92
msgid "Chinese (Simplified)"
msgstr "Chinois (Simplifié)"
#: qt/base/preferences_dialog.py:95
msgid "Copy and Move:"
msgstr "Déplacements de fichiers:"
#: qt/base/preferences_dialog.py:98
msgid "Right in destination"
msgstr "Directement à la destination"
#: qt/base/preferences_dialog.py:99
msgid "Recreate relative path"
msgstr "Re-créer chemins relatifs"
#: qt/base/preferences_dialog.py:100
msgid "Recreate absolute path"
msgstr "Re-créer chemins absolus"
#: qt/base/preferences_dialog.py:103
msgid "Custom Command (arguments: %d for dupe, %r for ref):"
msgstr "Commande perso. (arguments: %d pour doublon, %r pour réf):"
#: qt/base/preferences_dialog.py:183
msgid "NeedsToRestartToApplyLangMsg"
msgstr "dupeGuru doit redémarrer pour appliquer le changement de langue."
#: qt/base/prioritize_dialog.py:69
msgid "Re-Prioritize duplicates"
msgstr "Re-prioriser les doublons"
#: qt/base/prioritize_dialog.py:73
msgid "Add criteria to the right box and click OK to send the dupes that correspond the best to these criteria to their respective group's reference position. Read the help file for more information."
msgstr "Ajoutez des critères dans la liste de droite pour envoyer les doublons qui correspondent le plus à ces critère à la position de référence. Une lecture préalable du fichier d'aide est conseillée."
#: qt/base/problem_dialog.py:32
msgid "Problems!"
msgstr "Problèmes!"
#: qt/base/problem_dialog.py:36
msgid "ProblemsDuringProcessingMsg"
msgstr "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 n'ont pas été retirés des résultats."
#: qt/base/problem_dialog.py:50
msgid "Reveal Selected"
msgstr "Révéler Fichier"
#: qt/base/problem_dialog.py:55
msgid "Close"
msgstr "Fermer"
#: qt/base/problem_table.py:17
msgid "File Path"
msgstr "Chemin du fichier"
#: qt/base/problem_table.py:18
msgid "Error Message"
msgstr "Message d'erreur"
#: qt/base/result_window.py:43 qt/me/details_dialog.py:18
#: qt/pe/details_dialog.py:23 qt/se/details_dialog.py:18
msgid "Details"
msgstr "Détails"
#: qt/base/result_window.py:44 qt/base/result_window.py:85
#: qt/base/result_window.py:152
msgid "Actions"
msgstr "Actions"
#: qt/base/result_window.py:45
msgid "Show Dupes Only"
msgstr "Ne pas montrer les références"
#: qt/base/result_window.py:46
msgid "Show Delta Values"
msgstr "Montrer les valeurs en tant que delta"
#: qt/base/result_window.py:47
msgid "Send Marked to Recycle Bin"
msgstr "Envoyer marqués à la corbeille"
#: qt/base/result_window.py:48
msgid "Delete Marked and Replace with Hardlinks"
msgstr "Remplacer marqués par des hardlinks"
#: qt/base/result_window.py:49
msgid "Move Marked to..."
msgstr "Déplacer marqués vers..."
#: qt/base/result_window.py:50
msgid "Copy Marked to..."
msgstr "Copier marqués vers..."
#: qt/base/result_window.py:51
msgid "Remove Marked from Results"
msgstr "Retirer marqués des résultats"
#: qt/base/result_window.py:52
msgid "Re-Prioritize Results..."
msgstr "Re-prioriser les résultats"
#: qt/base/result_window.py:53
msgid "Remove Selected from Results"
msgstr "Retirer sélectionnés des résultats"
#: qt/base/result_window.py:54
msgid "Add Selected to Ignore List"
msgstr "Ajouter sélectionnés à la liste de fichiers ignorés"
#: qt/base/result_window.py:55
msgid "Make Selected Reference"
msgstr "Transformer sélectionnés en références"
#: qt/base/result_window.py:56
msgid "Open Selected with Default Application"
msgstr "Ouvrir sélectionné avec l'application par défaut"
#: qt/base/result_window.py:57
msgid "Open Containing Folder of Selected"
msgstr "Ouvrir le dossier contenant le fichier sélectionné"
#: qt/base/result_window.py:58
msgid "Rename Selected"
msgstr "Renommer sélectionné"
#: qt/base/result_window.py:59
msgid "Mark All"
msgstr "Tout marquer"
#: qt/base/result_window.py:60
msgid "Mark None"
msgstr "Tout démarquer"
#: qt/base/result_window.py:61
msgid "Invert Marking"
msgstr "Inverser le marquage"
#: qt/base/result_window.py:62
msgid "Mark Selected"
msgstr "Marquer sélectionnés"
#: qt/base/result_window.py:63 qt/base/result_window.py:242
msgid "Clear Ignore List"
msgstr "Vider la liste de fichiers ignorés"
#: qt/base/result_window.py:64 qt/base/result_window.py:228
msgid "Apply Filter"
msgstr "Appliquer filtre"
#: qt/base/result_window.py:65
msgid "Cancel Filter"
msgstr "Annuler filtre"
#: qt/base/result_window.py:66
msgid "Export To HTML"
msgstr "Exporter vers HTML"
#: qt/base/result_window.py:67
msgid "Save Results..."
msgstr "Sauvegarder résultats..."
#: qt/base/result_window.py:68
msgid "Invoke Custom Command"
msgstr "Invoquer commande personnalisée"
#: qt/base/result_window.py:83
msgid "Mark"
msgstr "Marquer"
#: qt/base/result_window.py:87
msgid "Columns"
msgstr "Colonnes"
#: qt/base/result_window.py:148
msgid "Reset to Defaults"
msgstr "Réinitialiser"
#: qt/base/result_window.py:170
msgid "{} Results"
msgstr "{} (Résultats)"
#: qt/base/result_window.py:229
msgid "TypeFilterMsg"
msgstr "Entrer le filtre que vous voulez appliquer sur vos résultats."
#: qt/base/result_window.py:245
msgid "NothingToClearMsg"
msgstr "Il n'y a rien à vider."
#: qt/base/result_window.py:247
msgid "ClearIgnoreListConfirmMsg"
msgstr "Voulez-vous vider la liste de fichiers ignorés des {} items qu'elle contient?"
#: qt/base/result_window.py:250
msgid "IgnoreListClearedMsg"
msgstr "La liste de doublons ignorés a été vidée."
#: qt/base/result_window.py:259
msgid "Delete duplicates"
msgstr "Effacement de doublons"
#: qt/base/result_window.py:260
msgid "SendToTrashConfirmMsg"
msgstr "{} fichiers seront envoyés à la corbeille. Continuer?"
#: qt/base/result_window.py:284
msgid "Delete and hardlink duplicates"
msgstr "Hardlinking de doublons"
#: qt/base/result_window.py:285
msgid "HardlinkConfirmMsg"
msgstr "{} fichiers seront envoyés à la corbeille (puis 'hardlinkés'). Continuer?"
#: qt/base/result_window.py:341
msgid "SelectResultToSaveMsg"
msgstr "Sélectionnez un fichier résultats dans lequel sauvegarder"
#: qt/me/preferences_dialog.py:37 qt/se/preferences_dialog.py:37
msgid "Filename"
msgstr "Nom de fichier"
#: qt/me/preferences_dialog.py:38
msgid "Filename - Fields"
msgstr "Nom de fichier (Champs)"
#: qt/me/preferences_dialog.py:39
msgid "Filename - Fields (No Order)"
msgstr "Nom de fichier (Champs sans ordre)"
#: qt/me/preferences_dialog.py:40
msgid "Tags"
msgstr "Tags"
#: qt/me/preferences_dialog.py:41 qt/pe/preferences_dialog.py:32
#: qt/se/preferences_dialog.py:38
msgid "Contents"
msgstr "Contenu"
#: qt/me/preferences_dialog.py:42
msgid "Audio Contents"
msgstr "Contenu Audio"
#: qt/me/preferences_dialog.py:53
msgid "Tags to scan:"
msgstr "Tags à scanner:"
#: qt/me/preferences_dialog.py:59
msgid "Track"
msgstr "Track"
#: qt/me/preferences_dialog.py:61
msgid "Artist"
msgstr "Artiste"
#: qt/me/preferences_dialog.py:63
msgid "Album"
msgstr "Album"
#: qt/me/preferences_dialog.py:65
msgid "Title"
msgstr "Titre"
#: qt/me/preferences_dialog.py:67
msgid "Genre"
msgstr "Genre"
#: qt/me/preferences_dialog.py:69
msgid "Year"
msgstr "Année"
#: qt/me/preferences_dialog.py:73 qt/se/preferences_dialog.py:47
msgid "Word weighting"
msgstr "Proportionalité des mots"
#: qt/me/preferences_dialog.py:75 qt/se/preferences_dialog.py:49
msgid "Match similar words"
msgstr "Comparer les mots similaires"
#: qt/me/preferences_dialog.py:77 qt/pe/preferences_dialog.py:40
#: qt/se/preferences_dialog.py:51
msgid "Can mix file kind"
msgstr "Comparer les fichiers de différents types"
#: qt/me/preferences_dialog.py:79 qt/pe/preferences_dialog.py:42
#: qt/se/preferences_dialog.py:53
msgid "Use regular expressions when filtering"
msgstr "Utiliser les expressions régulières pour les filtres"
#: qt/me/preferences_dialog.py:81 qt/pe/preferences_dialog.py:44
#: qt/se/preferences_dialog.py:55
msgid "Remove empty folders on delete or move"
msgstr "Effacer les dossiers vides après un déplacement"
#: qt/me/preferences_dialog.py:83 qt/pe/preferences_dialog.py:46
#: qt/se/preferences_dialog.py:74
msgid "Ignore duplicates hardlinking to the same file"
msgstr "Ignorer doublons avec hardlink vers le même fichier"
#: qt/me/preferences_dialog.py:85 qt/pe/preferences_dialog.py:48
#: qt/se/preferences_dialog.py:76
msgid "Debug mode (restart required)"
msgstr "Mode de déboguage (redémarrage requis)"
#: qt/pe/preferences_dialog.py:33
msgid "EXIF Timestamp"
msgstr ""
#: qt/pe/preferences_dialog.py:38
msgid "Match pictures of different dimensions"
msgstr "Comparer les images de tailles différentes"
#: qt/pe/result_window.py:18 qt/pe/result_window.py:23
msgid "Clear Picture Cache"
msgstr "Vider la cache d'images"
#: qt/pe/result_window.py:24
msgid "ClearPictureCacheConfirmMsg"
msgstr "Voulez-vous vraiment vider la cache de vos analyses précédentes?"
#: qt/pe/result_window.py:27
msgid "PictureCacheClearedMsg"
msgstr "La cache des analyses précédentes a été vidée."
#: qt/se/preferences_dialog.py:39
msgid "Folders"
msgstr "Dossiers"
#: qt/se/preferences_dialog.py:58
msgid "Ignore files smaller than"
msgstr "Ignorer les fichiers plus petits que"
#: qt/se/preferences_dialog.py:69
msgid "KB"
msgstr "KB"

601
locale/ui.pot Normal file
View File

@ -0,0 +1,601 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=utf-8\n"
#: qt/base/app.py:39
msgid "Scanning for duplicates"
msgstr ""
#: qt/base/app.py:40
msgid "Loading"
msgstr ""
#: qt/base/app.py:41
msgid "Moving"
msgstr ""
#: qt/base/app.py:42
msgid "Copying"
msgstr ""
#: qt/base/app.py:43
msgid "Sending files to the recycle bin"
msgstr ""
#: qt/base/app.py:103
msgid "Quit"
msgstr ""
#: qt/base/app.py:104 qt/base/preferences_dialog.py:122
msgid "Preferences"
msgstr ""
#: qt/base/app.py:105
msgid "dupeGuru Help"
msgstr ""
#: qt/base/app.py:106
msgid "About dupeGuru"
msgstr ""
#: qt/base/app.py:107
msgid "Register dupeGuru"
msgstr ""
#: qt/base/app.py:108
msgid "Check for Update"
msgstr ""
#: qt/base/app.py:109
msgid "Open Debug Log"
msgstr ""
#: qt/base/app.py:140
msgid "Add to Ignore List"
msgstr ""
#: qt/base/app.py:141
msgid "IgnoreConfirmMsg"
msgstr ""
#: qt/base/app.py:146
msgid "copy"
msgstr ""
#: qt/base/app.py:146
msgid "move"
msgstr ""
#: qt/base/app.py:147
msgid "SelectCopyOrMoveDestinationMsg"
msgstr ""
#: qt/base/app.py:159 qt/base/result_window.py:322
msgid "Remove duplicates"
msgstr ""
#: qt/base/app.py:160 qt/base/result_window.py:323
msgid "FileRemovalConfirmMsg"
msgstr ""
#: qt/base/app.py:179
msgid "NoCustomCommandMsg"
msgstr ""
#: qt/base/app.py:180
msgid "Custom Command"
msgstr ""
#: qt/base/app.py:210
msgid "OperationSuccessMsg"
msgstr ""
#: qt/base/app.py:211
msgid "Operation Complete"
msgstr ""
#: qt/base/app.py:214
msgid "Scan complete"
msgstr ""
#: qt/base/app.py:215
msgid "NoDuplicateFoundMsg"
msgstr ""
#: qt/base/app.py:267
msgid "TaskHangingMsg"
msgstr ""
#: qt/base/details_table.py:16
msgid "Attribute"
msgstr ""
#: qt/base/details_table.py:16
msgid "Selected"
msgstr ""
#: qt/base/details_table.py:16 qt/base/directories_model.py:23
msgid "Reference"
msgstr ""
#: qt/base/directories_dialog.py:56
msgid "Load Results..."
msgstr ""
#: qt/base/directories_dialog.py:57
msgid "Results Window"
msgstr ""
#: qt/base/directories_dialog.py:58
msgid "Add Folder..."
msgstr ""
#: qt/base/directories_dialog.py:66 qt/base/result_window.py:83
msgid "File"
msgstr ""
#: qt/base/directories_dialog.py:68 qt/base/result_window.py:91
msgid "View"
msgstr ""
#: qt/base/directories_dialog.py:70 qt/base/result_window.py:93
msgid "Help"
msgstr ""
#: qt/base/directories_dialog.py:72
msgid "Load Recent Results"
msgstr ""
#: qt/base/directories_dialog.py:106
msgid "SelectFolderToScanMsg"
msgstr ""
#: qt/base/directories_dialog.py:135
msgid "Load Results"
msgstr ""
#: qt/base/directories_dialog.py:138
msgid "Scan"
msgstr ""
#: qt/base/directories_dialog.py:175
msgid "Unsaved results"
msgstr ""
#: qt/base/directories_dialog.py:176
msgid "ReallyWantToQuitMsg"
msgstr ""
#: qt/base/directories_dialog.py:184
msgid "SelectFolderToAddMsg"
msgstr ""
#: qt/base/directories_dialog.py:201
msgid "SelectResultToLoadMsg"
msgstr ""
#: qt/base/directories_dialog.py:202
msgid "All Files (*.*)"
msgstr ""
#: qt/base/directories_dialog.py:202 qt/base/result_window.py:344
msgid "dupeGuru Results (*.dupeguru)"
msgstr ""
#: qt/base/directories_dialog.py:220
msgid "Start a new scan"
msgstr ""
#: qt/base/directories_dialog.py:221
msgid "ReallyWantToContinueMsg"
msgstr ""
#: qt/base/directories_model.py:22
msgid "Name"
msgstr ""
#: qt/base/directories_model.py:22
msgid "State"
msgstr ""
#: qt/base/directories_model.py:23
msgid "Excluded"
msgstr ""
#: qt/base/directories_model.py:23
msgid "Normal"
msgstr ""
#: qt/base/extra_fairware_reminder.py:36
msgid "Sorry, I must insist"
msgstr ""
#: qt/base/extra_fairware_reminder.py:41
msgid "ExtraFairwarePromptMsg"
msgstr ""
#: qt/base/extra_fairware_reminder.py:45
msgid "ExtraFairwareReasonMsg"
msgstr ""
#: qt/base/extra_fairware_reminder.py:56
msgid "Contribute"
msgstr ""
#: qt/base/extra_fairware_reminder.py:59
msgid "Continue"
msgstr ""
#: qt/base/preferences_dialog.py:34
msgid "Scan Type:"
msgstr ""
#: qt/base/preferences_dialog.py:47
msgid "Filter Hardness:"
msgstr ""
#: qt/base/preferences_dialog.py:73
msgid "More Results"
msgstr ""
#: qt/base/preferences_dialog.py:78
msgid "Fewer Results"
msgstr ""
#: qt/base/preferences_dialog.py:85
msgid "Font size:"
msgstr ""
#: qt/base/preferences_dialog.py:89
msgid "Language:"
msgstr ""
#: qt/base/preferences_dialog.py:91
msgid "English"
msgstr ""
#: qt/base/preferences_dialog.py:92
msgid "French"
msgstr ""
#: qt/base/preferences_dialog.py:93
msgid "German"
msgstr ""
#: qt/base/preferences_dialog.py:94
msgid "Chinese (Simplified)"
msgstr ""
#: qt/base/preferences_dialog.py:97
msgid "Copy and Move:"
msgstr ""
#: qt/base/preferences_dialog.py:100
msgid "Right in destination"
msgstr ""
#: qt/base/preferences_dialog.py:101
msgid "Recreate relative path"
msgstr ""
#: qt/base/preferences_dialog.py:102
msgid "Recreate absolute path"
msgstr ""
#: qt/base/preferences_dialog.py:105
msgid "Custom Command (arguments: %d for dupe, %r for ref):"
msgstr ""
#: qt/base/preferences_dialog.py:185
msgid "NeedsToRestartToApplyLangMsg"
msgstr ""
#: qt/base/prioritize_dialog.py:71
msgid "Re-Prioritize duplicates"
msgstr ""
#: qt/base/prioritize_dialog.py:75
msgid "Add criteria to the right box and click OK to send the dupes that correspond the best to these criteria to their respective group's reference position. Read the help file for more information."
msgstr ""
#: qt/base/problem_dialog.py:34
msgid "Problems!"
msgstr ""
#: qt/base/problem_dialog.py:38
msgid "ProblemsDuringProcessingMsg"
msgstr ""
#: qt/base/problem_dialog.py:52
msgid "Reveal Selected"
msgstr ""
#: qt/base/problem_dialog.py:57
msgid "Close"
msgstr ""
#: qt/base/problem_table.py:18
msgid "File Path"
msgstr ""
#: qt/base/problem_table.py:19
msgid "Error Message"
msgstr ""
#: qt/base/result_window.py:45 qt/me/details_dialog.py:20
#: qt/pe/details_dialog.py:25 qt/se/details_dialog.py:20
msgid "Details"
msgstr ""
#: qt/base/result_window.py:46 qt/base/result_window.py:87
#: qt/base/result_window.py:154
msgid "Actions"
msgstr ""
#: qt/base/result_window.py:47
msgid "Show Dupes Only"
msgstr ""
#: qt/base/result_window.py:48
msgid "Show Delta Values"
msgstr ""
#: qt/base/result_window.py:49
msgid "Send Marked to Recycle Bin"
msgstr ""
#: qt/base/result_window.py:50
msgid "Delete Marked and Replace with Hardlinks"
msgstr ""
#: qt/base/result_window.py:51
msgid "Move Marked to..."
msgstr ""
#: qt/base/result_window.py:52
msgid "Copy Marked to..."
msgstr ""
#: qt/base/result_window.py:53
msgid "Remove Marked from Results"
msgstr ""
#: qt/base/result_window.py:54
msgid "Re-Prioritize Results..."
msgstr ""
#: qt/base/result_window.py:55
msgid "Remove Selected from Results"
msgstr ""
#: qt/base/result_window.py:56
msgid "Add Selected to Ignore List"
msgstr ""
#: qt/base/result_window.py:57
msgid "Make Selected Reference"
msgstr ""
#: qt/base/result_window.py:58
msgid "Open Selected with Default Application"
msgstr ""
#: qt/base/result_window.py:59
msgid "Open Containing Folder of Selected"
msgstr ""
#: qt/base/result_window.py:60
msgid "Rename Selected"
msgstr ""
#: qt/base/result_window.py:61
msgid "Mark All"
msgstr ""
#: qt/base/result_window.py:62
msgid "Mark None"
msgstr ""
#: qt/base/result_window.py:63
msgid "Invert Marking"
msgstr ""
#: qt/base/result_window.py:64
msgid "Mark Selected"
msgstr ""
#: qt/base/result_window.py:65 qt/base/result_window.py:244
msgid "Clear Ignore List"
msgstr ""
#: qt/base/result_window.py:66 qt/base/result_window.py:230
msgid "Apply Filter"
msgstr ""
#: qt/base/result_window.py:67
msgid "Cancel Filter"
msgstr ""
#: qt/base/result_window.py:68
msgid "Export To HTML"
msgstr ""
#: qt/base/result_window.py:69
msgid "Save Results..."
msgstr ""
#: qt/base/result_window.py:70
msgid "Invoke Custom Command"
msgstr ""
#: qt/base/result_window.py:85
msgid "Mark"
msgstr ""
#: qt/base/result_window.py:89
msgid "Columns"
msgstr ""
#: qt/base/result_window.py:150
msgid "Reset to Defaults"
msgstr ""
#: qt/base/result_window.py:172
msgid "{} Results"
msgstr ""
#: qt/base/result_window.py:231
msgid "TypeFilterMsg"
msgstr ""
#: qt/base/result_window.py:247
msgid "NothingToClearMsg"
msgstr ""
#: qt/base/result_window.py:249
msgid "ClearIgnoreListConfirmMsg"
msgstr ""
#: qt/base/result_window.py:252
msgid "IgnoreListClearedMsg"
msgstr ""
#: qt/base/result_window.py:261
msgid "Delete duplicates"
msgstr ""
#: qt/base/result_window.py:262
msgid "SendToTrashConfirmMsg"
msgstr ""
#: qt/base/result_window.py:286
msgid "Delete and hardlink duplicates"
msgstr ""
#: qt/base/result_window.py:287
msgid "HardlinkConfirmMsg"
msgstr ""
#: qt/base/result_window.py:343
msgid "SelectResultToSaveMsg"
msgstr ""
#: qt/me/preferences_dialog.py:39 qt/se/preferences_dialog.py:39
msgid "Filename"
msgstr ""
#: qt/me/preferences_dialog.py:40
msgid "Filename - Fields"
msgstr ""
#: qt/me/preferences_dialog.py:41
msgid "Filename - Fields (No Order)"
msgstr ""
#: qt/me/preferences_dialog.py:42
msgid "Tags"
msgstr ""
#: qt/me/preferences_dialog.py:43 qt/pe/preferences_dialog.py:33
#: qt/se/preferences_dialog.py:40
msgid "Contents"
msgstr ""
#: qt/me/preferences_dialog.py:44
msgid "Audio Contents"
msgstr ""
#: qt/me/preferences_dialog.py:55
msgid "Tags to scan:"
msgstr ""
#: qt/me/preferences_dialog.py:61
msgid "Track"
msgstr ""
#: qt/me/preferences_dialog.py:63
msgid "Artist"
msgstr ""
#: qt/me/preferences_dialog.py:65
msgid "Album"
msgstr ""
#: qt/me/preferences_dialog.py:67
msgid "Title"
msgstr ""
#: qt/me/preferences_dialog.py:69
msgid "Genre"
msgstr ""
#: qt/me/preferences_dialog.py:71
msgid "Year"
msgstr ""
#: qt/me/preferences_dialog.py:75 qt/se/preferences_dialog.py:49
msgid "Word weighting"
msgstr ""
#: qt/me/preferences_dialog.py:77 qt/se/preferences_dialog.py:51
msgid "Match similar words"
msgstr ""
#: qt/me/preferences_dialog.py:79 qt/pe/preferences_dialog.py:41
#: qt/se/preferences_dialog.py:53
msgid "Can mix file kind"
msgstr ""
#: qt/me/preferences_dialog.py:81 qt/pe/preferences_dialog.py:43
#: qt/se/preferences_dialog.py:55
msgid "Use regular expressions when filtering"
msgstr ""
#: qt/me/preferences_dialog.py:83 qt/pe/preferences_dialog.py:45
#: qt/se/preferences_dialog.py:57
msgid "Remove empty folders on delete or move"
msgstr ""
#: qt/me/preferences_dialog.py:85 qt/pe/preferences_dialog.py:47
#: qt/se/preferences_dialog.py:76
msgid "Ignore duplicates hardlinking to the same file"
msgstr ""
#: qt/me/preferences_dialog.py:87 qt/pe/preferences_dialog.py:49
#: qt/se/preferences_dialog.py:78
msgid "Debug mode (restart required)"
msgstr ""
#: qt/pe/preferences_dialog.py:34
msgid "EXIF Timestamp"
msgstr ""
#: qt/pe/preferences_dialog.py:39
msgid "Match pictures of different dimensions"
msgstr ""
#: qt/pe/result_window.py:20 qt/pe/result_window.py:25
msgid "Clear Picture Cache"
msgstr ""
#: qt/pe/result_window.py:26
msgid "ClearPictureCacheConfirmMsg"
msgstr ""
#: qt/pe/result_window.py:29
msgid "PictureCacheClearedMsg"
msgstr ""
#: qt/se/preferences_dialog.py:41
msgid "Folders"
msgstr ""
#: qt/se/preferences_dialog.py:60
msgid "Ignore files smaller than"
msgstr ""
#: qt/se/preferences_dialog.py:71
msgid "KB"
msgstr ""

View File

@ -17,7 +17,7 @@ from PyQt4.QtGui import QDesktopServices, QFileDialog, QDialog, QMessageBox, QAp
from jobprogress import job
from jobprogress.qt import Progress
from hscommon.trans import tr, trmsg
from hscommon.trans import trget
from hscommon.plat import ISLINUX
from core.app import JobType
@ -33,6 +33,8 @@ from .directories_dialog import DirectoriesDialog
from .problem_dialog import ProblemDialog
from .util import createActions
tr = trget('ui')
JOBID2TITLE = {
JobType.Scan: tr("Scanning for duplicates"),
JobType.Load: tr("Loading"),
@ -136,13 +138,13 @@ class DupeGuru(QObject):
if not dupes:
return
title = tr("Add to Ignore List")
msg = trmsg("IgnoreConfirmMsg").format(len(dupes))
msg = tr("IgnoreConfirmMsg").format(len(dupes))
if self.confirm(title, msg):
self.model.add_selected_to_ignore_list(self)
def copy_or_move_marked(self, copy):
opname = tr("copy") if copy else tr("move")
title = trmsg("SelectCopyOrMoveDestinationMsg").format(opname)
title = tr("SelectCopyOrMoveDestinationMsg").format(opname)
flags = QFileDialog.ShowDirsOnly
destination = str(QFileDialog.getExistingDirectory(self.resultWindow, title, '', flags))
if not destination:
@ -155,7 +157,7 @@ class DupeGuru(QObject):
if not dupes:
return
title = tr("Remove duplicates")
msg = trmsg("FileRemovalConfirmMsg").format(len(dupes))
msg = tr("FileRemovalConfirmMsg").format(len(dupes))
if self.confirm(title, msg):
self.model.remove_selected(self)
@ -174,7 +176,7 @@ class DupeGuru(QObject):
if cmd:
self.model.invoke_command(cmd)
else:
msg = trmsg("NoCustomCommandMsg")
msg = tr("NoCustomCommandMsg")
QMessageBox.warning(self.resultWindow, tr("Custom Command"), msg)
def show_details(self):
@ -205,12 +207,12 @@ class DupeGuru(QObject):
if self.model.results.problems:
self.problemDialog.show()
else:
msg = trmsg("OperationSuccessMsg")
msg = tr("OperationSuccessMsg")
QMessageBox.information(self.resultWindow, tr("Operation Complete"), msg)
elif jobid == JobType.Scan:
if not self.model.results.groups:
title = tr("Scan complete")
msg = trmsg("NoDuplicateFoundMsg")
msg = tr("NoDuplicateFoundMsg")
QMessageBox.information(self.resultWindow, title, msg)
else:
self.showResultsWindow()
@ -262,7 +264,7 @@ class DupeGuru(QObject):
args = (j, ) + tuple(args)
self._progress.run(jobid, title, func, args=args)
except job.JobInProgressError:
msg = trmsg("TaskHangingMsg")
msg = tr("TaskHangingMsg")
QMessageBox.information(self.resultWindow, 'Action in progress', msg)
def get_default(self, key):

View File

@ -9,7 +9,9 @@
from PyQt4.QtCore import Qt, SIGNAL, QAbstractTableModel
from PyQt4.QtGui import QHeaderView, QTableView
from hscommon.trans import tr
from hscommon.trans import trget
tr = trget('ui')
HEADER = [tr("Attribute"), tr("Selected"), tr("Reference")]

View File

@ -11,7 +11,7 @@ from PyQt4.QtGui import (QWidget, QFileDialog, QHeaderView, QVBoxLayout, QHBoxLa
QAbstractItemView, QSpacerItem, QSizePolicy, QPushButton, QApplication, QMainWindow, QMenuBar,
QMenu, QIcon, QPixmap, QLabel)
from hscommon.trans import tr, trmsg
from hscommon.trans import trget
from qtlib.recent import Recent
from qtlib.util import moveToScreenCenter
@ -19,6 +19,8 @@ from . import platform
from .directories_model import DirectoriesModel, DirectoriesDelegate
from .util import createActions
tr = trget('ui')
class DirectoriesDialog(QMainWindow):
def __init__(self, parent, app):
QMainWindow.__init__(self, None)
@ -101,7 +103,7 @@ class DirectoriesDialog(QMainWindow):
self.resize(420, 338)
self.centralwidget = QWidget(self)
self.verticalLayout = QVBoxLayout(self.centralwidget)
self.promptLabel = QLabel(trmsg("SelectFolderToScanMsg"), self.centralwidget)
self.promptLabel = QLabel(tr("SelectFolderToScanMsg"), self.centralwidget)
self.verticalLayout.addWidget(self.promptLabel)
self.treeView = QTreeView(self.centralwidget)
self.treeView.setItemDelegate(self.directoriesDelegate)
@ -171,7 +173,7 @@ class DirectoriesDialog(QMainWindow):
event.accept()
if self.app.model.results.is_modified:
title = tr("Unsaved results")
msg = trmsg("ReallyWantToQuitMsg")
msg = tr("ReallyWantToQuitMsg")
if not self.app.confirm(title, msg):
event.ignore()
if event.isAccepted():
@ -179,7 +181,7 @@ class DirectoriesDialog(QMainWindow):
#--- Events
def addFolderTriggered(self):
title = trmsg("SelectFolderToAddMsg")
title = tr("SelectFolderToAddMsg")
flags = QFileDialog.ShowDirsOnly
dirpath = str(QFileDialog.getExistingDirectory(self, title, self.lastAddedFolder, flags))
if not dirpath:
@ -196,7 +198,7 @@ class DirectoriesDialog(QMainWindow):
self.recentFolders.insertItem(folder)
def loadResultsTriggered(self):
title = trmsg("SelectResultToLoadMsg")
title = tr("SelectResultToLoadMsg")
files = ';;'.join([tr("dupeGuru Results (*.dupeguru)"), tr("All Files (*.*)")])
destination = QFileDialog.getOpenFileName(self, title, '', files)
if destination:
@ -216,7 +218,7 @@ class DirectoriesDialog(QMainWindow):
def scanButtonClicked(self):
if self.app.model.results.is_modified:
title = tr("Start a new scan")
msg = trmsg("ReallyWantToContinueMsg")
msg = tr("ReallyWantToContinueMsg")
if not self.app.confirm(title, msg):
return
self.app.model.start_scanning()

View File

@ -12,11 +12,13 @@ from PyQt4.QtCore import pyqtSignal, Qt, QRect, QUrl, QModelIndex
from PyQt4.QtGui import (QComboBox, QStyledItemDelegate, QApplication, QBrush, QStyle,
QStyleOptionComboBox, QStyleOptionViewItemV4)
from hscommon.trans import tr
from hscommon.trans import trget
from qtlib.tree_model import RefNode, TreeModel
from core.gui.directory_tree import DirectoryTree
tr = trget('ui')
HEADERS = [tr("Name"), tr("State")]
STATES = [tr("Normal"), tr("Reference"), tr("Excluded")]

View File

@ -13,11 +13,11 @@ from PyQt4.QtGui import (QDialog, QDesktopServices, QApplication, QVBoxLayout, Q
QFont, QSpacerItem, QSizePolicy, QPushButton)
from hscommon.plat import ISLINUX
from hscommon.trans import tr as trbase, trmsg as trmsgbase
tr = lambda s: trbase(s, "ExtraFairwareReminder")
trmsg = lambda s: trmsgbase(s, "ExtraFairwareReminder")
from hscommon.trans import trget
from core.gui.extra_fairware_reminder import ExtraFairwareReminder as ExtraFairwareReminderModel
tr = trget('ui')
class ExtraFairwareReminder(QDialog):
def __init__(self, parent, app):
flags = Qt.CustomizeWindowHint | Qt.WindowTitleHint
@ -38,11 +38,11 @@ class ExtraFairwareReminder(QDialog):
self.resize(380, dlg_height)
self.verticalLayout = QVBoxLayout(self)
self.descLabel = QLabel(self)
self.descLabel.setText(trmsg("ExtraFairwarePromptMsg"))
self.descLabel.setText(tr("ExtraFairwarePromptMsg"))
self.descLabel.setWordWrap(True)
self.verticalLayout.addWidget(self.descLabel)
self.reasonLabel = QLabel(self)
self.reasonLabel.setText(trmsg("ExtraFairwareReasonMsg"))
self.reasonLabel.setText(tr("ExtraFairwareReasonMsg"))
self.reasonLabel.setWordWrap(True)
font = QFont()
font.setWeight(75)

View File

@ -11,9 +11,11 @@ from PyQt4.QtGui import (QDialog, QDialogButtonBox, QVBoxLayout, QHBoxLayout, QL
QSlider, QSizePolicy, QSpacerItem, QCheckBox, QLineEdit, QMessageBox, QSpinBox)
from hscommon.plat import ISOSX, ISLINUX
from hscommon.trans import tr, trmsg
from hscommon.trans import trget
from qtlib.util import horizontalWrap
tr = trget('ui')
class PreferencesDialogBase(QDialog):
def __init__(self, parent, app):
flags = Qt.CustomizeWindowHint | Qt.WindowTitleHint | Qt.WindowSystemMenuHint
@ -180,7 +182,7 @@ class PreferencesDialogBase(QDialog):
if oldlang not in langs:
oldlang = 'en'
if lang != oldlang:
QMessageBox.information(self, "", trmsg("NeedsToRestartToApplyLangMsg"))
QMessageBox.information(self, "", tr("NeedsToRestartToApplyLangMsg"))
self.app.prefs.language = lang
self._save(prefs, ischecked)

View File

@ -10,11 +10,13 @@ from PyQt4.QtCore import Qt, QMimeData, QByteArray
from PyQt4.QtGui import (QDialog, QVBoxLayout, QHBoxLayout, QPushButton, QComboBox, QListView,
QDialogButtonBox, QAbstractItemView, QLabel)
from hscommon.trans import tr
from hscommon.trans import trget
from qtlib.selectable_list import ComboboxModel, ListviewModel
from qtlib.util import verticalSpacer
from core.gui.prioritize_dialog import PrioritizeDialog as PrioritizeDialogModel
tr = trget('ui')
MIME_INDEXES = 'application/dupeguru.rowindexes'
class PrioritizationList(ListviewModel):

View File

@ -10,10 +10,12 @@ from PyQt4.QtCore import Qt
from PyQt4.QtGui import (QDialog, QVBoxLayout, QHBoxLayout, QPushButton, QSpacerItem, QSizePolicy,
QLabel, QTableView, QAbstractItemView, QApplication)
from hscommon.trans import tr, trmsg
from hscommon.trans import trget
from core.gui.problem_dialog import ProblemDialog as ProblemDialogModel
from .problem_table import ProblemTable
tr = trget('ui')
class ProblemDialog(QDialog):
def __init__(self, parent, app):
flags = Qt.CustomizeWindowHint | Qt.WindowTitleHint | Qt.WindowSystemMenuHint
@ -33,7 +35,7 @@ class ProblemDialog(QDialog):
self.resize(413, 323)
self.verticalLayout = QVBoxLayout(self)
self.label = QLabel(self)
self.label.setText(trmsg("ProblemsDuringProcessingMsg"))
self.label.setText(tr("ProblemsDuringProcessingMsg"))
self.label.setWordWrap(True)
self.verticalLayout.addWidget(self.label)
self.tableView = QTableView(self)

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Created By: Virgil Dupras
# Created On: 2010-04-12
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
@ -7,11 +6,13 @@
# which should be included with this package. The terms are also available at
# http://www.hardcoded.net/licenses/bsd_license
from hscommon.trans import tr
from hscommon.trans import trget
from qtlib.column import Column
from qtlib.table import Table
from core.gui.problem_table import ProblemTable as ProblemTableModel
tr = trget('ui')
class ProblemTable(Table):
COLUMNS = [
Column('path', tr("File Path"), 150),

View File

@ -12,7 +12,7 @@ from PyQt4.QtGui import (QMainWindow, QMenu, QLabel, QHeaderView, QMessageBox, Q
QStatusBar, QDialog)
from hscommon.plat import ISOSX, ISLINUX
from hscommon.trans import tr, trmsg
from hscommon.trans import trget
from hscommon.util import nonone
from qtlib.util import moveToScreenCenter
@ -21,6 +21,8 @@ from .stats_label import StatsLabel
from .util import createActions
from .prioritize_dialog import PrioritizeDialog
tr = trget('ui')
class ResultWindow(QMainWindow):
def __init__(self, app):
QMainWindow.__init__(self, None)
@ -226,7 +228,7 @@ class ResultWindow(QMainWindow):
def applyFilterTriggered(self):
title = tr("Apply Filter")
msg = trmsg("TypeFilterMsg")
msg = tr("TypeFilterMsg")
text = nonone(self._last_filter, '[*]')
answer, ok = QInputDialog.getText(self, title, msg, QLineEdit.Normal, text)
if not ok:
@ -242,12 +244,12 @@ class ResultWindow(QMainWindow):
title = tr("Clear Ignore List")
count = len(self.app.model.scanner.ignore_list)
if not count:
QMessageBox.information(self, title, trmsg("NothingToClearMsg"))
QMessageBox.information(self, title, tr("NothingToClearMsg"))
return
msg = trmsg("ClearIgnoreListConfirmMsg").format(count)
msg = tr("ClearIgnoreListConfirmMsg").format(count)
if self.app.confirm(title, msg, QMessageBox.No):
self.app.model.scanner.ignore_list.Clear()
QMessageBox.information(self, title, trmsg("IgnoreListClearedMsg"))
QMessageBox.information(self, title, tr("IgnoreListClearedMsg"))
def copyTriggered(self):
self.app.copy_or_move_marked(True)
@ -257,7 +259,7 @@ class ResultWindow(QMainWindow):
if not count:
return
title = tr("Delete duplicates")
msg = trmsg("SendToTrashConfirmMsg").format(count)
msg = tr("SendToTrashConfirmMsg").format(count)
if self.app.confirm(title, msg):
self.app.model.delete_marked()
@ -282,7 +284,7 @@ class ResultWindow(QMainWindow):
if not count:
return
title = tr("Delete and hardlink duplicates")
msg = trmsg("HardlinkConfirmMsg").format(count)
msg = tr("HardlinkConfirmMsg").format(count)
if self.app.confirm(title, msg):
self.app.model.delete_marked(replace_with_hardlinks=True)
@ -318,7 +320,7 @@ class ResultWindow(QMainWindow):
if not count:
return
title = tr("Remove duplicates")
msg = trmsg("FileRemovalConfirmMsg").format(count)
msg = tr("FileRemovalConfirmMsg").format(count)
if self.app.confirm(title, msg):
self.app.model.remove_marked()
@ -338,7 +340,7 @@ class ResultWindow(QMainWindow):
self.app.model.reveal_selected()
def saveResultsTriggered(self):
title = trmsg("SelectResultToSaveMsg")
title = tr("SelectResultToSaveMsg")
files = tr("dupeGuru Results (*.dupeguru)")
destination = QFileDialog.getSaveFileName(self, title, '', files)
if destination:

View File

@ -9,10 +9,12 @@
from PyQt4.QtCore import QSize
from PyQt4.QtGui import QVBoxLayout, QAbstractItemView
from hscommon.trans import tr
from hscommon.trans import trget
from ..base.details_dialog import DetailsDialog as DetailsDialogBase
from ..base.details_table import DetailsTable
tr = trget('ui')
class DetailsDialog(DetailsDialogBase):
def _setupUi(self):
self.setWindowTitle(tr("Details"))

View File

@ -11,12 +11,14 @@ from PyQt4.QtCore import QSize
from PyQt4.QtGui import (QVBoxLayout, QHBoxLayout, QLabel, QSizePolicy, QSpacerItem, QWidget,
QApplication)
from hscommon.trans import tr
from hscommon.trans import trget
from core.scanner import ScanType
from ..base.preferences_dialog import PreferencesDialogBase
from . import preferences
tr = trget('ui')
SCAN_TYPE_ORDER = [
ScanType.Filename,
ScanType.Fields,
@ -33,8 +35,14 @@ class PreferencesDialog(PreferencesDialogBase):
self.scanTypeComboBox.currentIndexChanged[int].connect(self.scanTypeChanged)
def _setupPreferenceWidgets(self):
scanTypeLabels = [tr(s) for s in ["Filename", "Filename - Fields",
"Filename - Fields (No Order)", "Tags", "Contents", "Audio Contents"]]
scanTypeLabels = [
tr("Filename"),
tr("Filename - Fields"),
tr("Filename - Fields (No Order)"),
tr("Tags"),
tr("Contents"),
tr("Audio Contents"),
]
self._setupScanTypeBox(scanTypeLabels)
self._setupFilterHardnessBox()
self.widgetsVLayout.addLayout(self.filterHardnessHLayout)
@ -76,7 +84,7 @@ class PreferencesDialog(PreferencesDialogBase):
self.widgetsVLayout.addWidget(self.removeEmptyFoldersBox)
self._setupAddCheckbox('ignoreHardlinkMatches', tr("Ignore duplicates hardlinking to the same file"))
self.widgetsVLayout.addWidget(self.ignoreHardlinkMatches)
self._setupAddCheckbox('debugModeBox', tr(tr("Debug mode (restart required)")))
self._setupAddCheckbox('debugModeBox', tr("Debug mode (restart required)"))
self.widgetsVLayout.addWidget(self.debugModeBox)
self._setupBottomPart()

View File

@ -9,10 +9,12 @@
from PyQt4.QtCore import Qt, QSize
from PyQt4.QtGui import QVBoxLayout, QAbstractItemView, QHBoxLayout, QLabel, QSizePolicy, QPixmap
from hscommon.trans import tr
from hscommon.trans import trget
from ..base.details_dialog import DetailsDialog as DetailsDialogBase
from ..base.details_table import DetailsTable
tr = trget('ui')
class DetailsDialog(DetailsDialogBase):
def __init__(self, parent, app):
DetailsDialogBase.__init__(self, parent, app)

View File

@ -7,14 +7,15 @@
# http://www.hardcoded.net/licenses/bsd_license
import sys
from PyQt4.QtGui import QLabel, QApplication
from PyQt4.QtGui import QApplication
from hscommon.trans import tr
from hscommon.trans import trget
from core.scanner import ScanType
from ..base.preferences_dialog import PreferencesDialogBase
from . import preferences
tr = trget('ui')
SCAN_TYPE_ORDER = [
ScanType.FuzzyBlock,
@ -28,7 +29,10 @@ class PreferencesDialog(PreferencesDialogBase):
self.scanTypeComboBox.currentIndexChanged[int].connect(self.scanTypeChanged)
def _setupPreferenceWidgets(self):
scanTypeLabels = [tr(s) for s in ["Contents", "EXIF Timestamp"]]
scanTypeLabels = [
tr("Contents"),
tr("EXIF Timestamp"),
]
self._setupScanTypeBox(scanTypeLabels)
self._setupFilterHardnessBox()
self.widgetsVLayout.addLayout(self.filterHardnessHLayout)
@ -42,7 +46,7 @@ class PreferencesDialog(PreferencesDialogBase):
self.widgetsVLayout.addWidget(self.removeEmptyFoldersBox)
self._setupAddCheckbox('ignoreHardlinkMatches', tr("Ignore duplicates hardlinking to the same file"))
self.widgetsVLayout.addWidget(self.ignoreHardlinkMatches)
self._setupAddCheckbox('debugModeBox', tr(tr("Debug mode (restart required)")))
self._setupAddCheckbox('debugModeBox', tr("Debug mode (restart required)"))
self.widgetsVLayout.addWidget(self.debugModeBox)
self._setupBottomPart()

View File

@ -9,9 +9,11 @@
from PyQt4.QtCore import SIGNAL
from PyQt4.QtGui import QMessageBox, QAction
from hscommon.trans import tr, trmsg
from hscommon.trans import trget
from ..base.result_window import ResultWindow as ResultWindowBase
tr = trget('ui')
class ResultWindow(ResultWindowBase):
def _setupUi(self):
ResultWindowBase._setupUi(self)
@ -21,8 +23,8 @@ class ResultWindow(ResultWindowBase):
def clearPictureCacheTriggered(self):
title = tr("Clear Picture Cache")
msg = trmsg("ClearPictureCacheConfirmMsg")
msg = tr("ClearPictureCacheConfirmMsg")
if self.app.confirm(title, msg, QMessageBox.No):
self.app.scanner.clear_picture_cache()
QMessageBox.information(self, title, trmsg("PictureCacheClearedMsg"))
QMessageBox.information(self, title, tr("PictureCacheClearedMsg"))

View File

@ -9,10 +9,12 @@
from PyQt4.QtCore import QSize
from PyQt4.QtGui import QVBoxLayout, QAbstractItemView
from hscommon.trans import tr
from hscommon.trans import trget
from ..base.details_dialog import DetailsDialog as DetailsDialogBase
from ..base.details_table import DetailsTable
tr = trget('ui')
class DetailsDialog(DetailsDialogBase):
def _setupUi(self):
self.setWindowTitle(tr("Details"))

View File

@ -12,7 +12,7 @@ from PyQt4.QtGui import (QVBoxLayout, QHBoxLayout, QLabel, QSizePolicy, QSpacerI
QLineEdit, QApplication)
from hscommon.plat import ISWINDOWS, ISLINUX
from hscommon.trans import tr
from hscommon.trans import trget
from hscommon.util import tryint
from core.scanner import ScanType
@ -20,6 +20,8 @@ from core.scanner import ScanType
from ..base.preferences_dialog import PreferencesDialogBase
from . import preferences
tr = trget('ui')
SCAN_TYPE_ORDER = [
ScanType.Filename,
ScanType.Contents,
@ -33,7 +35,11 @@ class PreferencesDialog(PreferencesDialogBase):
self.scanTypeComboBox.currentIndexChanged[int].connect(self.scanTypeChanged)
def _setupPreferenceWidgets(self):
scanTypeLabels = [tr(s) for s in ["Filename", "Contents", "Folders"]]
scanTypeLabels = [
tr("Filename"),
tr("Contents"),
tr("Folders"),
]
self._setupScanTypeBox(scanTypeLabels)
self._setupFilterHardnessBox()
self.widgetsVLayout.addLayout(self.filterHardnessHLayout)

View File

@ -13,7 +13,7 @@ from PyQt4.QtCore import QCoreApplication, QSettings
from PyQt4.QtGui import QApplication, QIcon, QPixmap
from hscommon.plat import ISWINDOWS
from hscommon.trans import install_qt_trans
from hscommon.trans import install_gettext_trans
from qtlib.error_report_dialog import install_excepthook
from qt.base import dg_rc
from core_{{edition}} import __version__, __appname__
@ -28,7 +28,7 @@ if __name__ == "__main__":
QCoreApplication.setApplicationVersion(__version__)
settings = QSettings()
lang = settings.value('Language').toString()
install_qt_trans(lang)
install_gettext_trans('locale', lang)
# Many strings are translated at import time, so this is why we only import after the translator
# has been installed
from qt.{{edition}}.app import DupeGuru