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 run.py
*.pyc *.pyc
*.so *.so
*.mo
*.pyd *.pyd
*.xcodeproj/xcuserdata *.xcodeproj/xcuserdata
*.xcodeproj/project.xcworkspace/xcuserdata *.xcodeproj/project.xcworkspace/xcuserdata

View File

@ -18,6 +18,7 @@ from distutils.extension import Extension
from hscommon import sphinxgen from hscommon import sphinxgen
from hscommon.build import (add_to_pythonpath, print_and_do, copy_packages, filereplace, 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) get_module_version, build_all_cocoa_locs, build_all_qt_locs, move_all)
from hscommon import loc
def parse_args(): def parse_args():
usage = "usage: %prog [options]" usage = "usage: %prog [options]"
@ -28,6 +29,8 @@ def parse_args():
help="Build only the help file") help="Build only the help file")
parser.add_option('--loc', action='store_true', dest='loc', parser.add_option('--loc', action='store_true', dest='loc',
help="Build only localization") 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() (options, args) = parser.parse_args()
return options return options
@ -112,6 +115,26 @@ def build_localizations(ui, edition):
elif ui == 'qt': elif ui == 'qt':
print("Building .ts files") print("Building .ts files")
build_all_qt_locs(op.join('qt', 'lang'), extradirs=[op.join('qtlib', 'lang')]) 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): def build_pe_modules(ui):
print("Building PE Modules") print("Building PE Modules")
@ -167,6 +190,8 @@ def main():
build_help(edition) build_help(edition)
elif options.loc: elif options.loc:
build_localizations(ui, edition) build_localizations(ui, edition)
elif options.locpot:
build_locpot()
else: else:
build_normal(edition, ui, dev) build_normal(edition, ui, dev)

View File

@ -17,7 +17,7 @@ from hscommon import io
from hscommon.util import remove_invalid_xml from hscommon.util import remove_invalid_xml
from hscommon.path import Path from hscommon.path import Path
from hscommon.cocoa.objcmin import NSUserDefaults, NSURL from hscommon.cocoa.objcmin import NSUserDefaults, NSURL
from hscommon.trans import tr, trmsg from hscommon.trans import tr
from core import directories from core import directories
from core_pe import _block_osx from core_pe import _block_osx
@ -193,7 +193,7 @@ class DupeGuruPE(DupeGuruBase):
try: try:
app('iPhoto') app('iPhoto')
except ApplicationNotFoundError: except ApplicationNotFoundError:
self.view.show_message(trmsg("IPhotoAppNotFoundMsg")) self.view.show_message(tr("IPhotoAppNotFoundMsg"))
return return
DupeGuruBase.start_scanning(self) 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.conflict import smart_move, smart_copy
from hscommon.util import (delete_if_empty, first, escape, nonone, format_time_decimal, allsame, from hscommon.util import (delete_if_empty, first, escape, nonone, format_time_decimal, allsame,
rem_file_ext) rem_file_ext)
from hscommon.trans import tr, trmsg from hscommon.trans import tr
from . import directories, results, scanner, export, fs from . import directories, results, scanner, export, fs
@ -428,7 +428,7 @@ class DupeGuru(RegistrableApplication, Broadcaster):
self.results.groups = self.scanner.GetDupeGroups(files, j) self.results.groups = self.scanner.GetDupeGroups(files, j)
if not self.directories.has_any_file(): if not self.directories.has_any_file():
self.view.show_message(trmsg("NoScannableFileMsg")) self.view.show_message(tr("NoScannableFileMsg"))
return return
self.results.groups = [] self.results.groups = []
self._results_changed() self._results_changed()

View File

@ -7,9 +7,9 @@
# http://www.hardcoded.net/licenses/bsd_license # http://www.hardcoded.net/licenses/bsd_license
from hscommon.util import dedupe, flatten, rem_file_ext 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: class CriterionCategory:
NAME = "Undefined" NAME = "Undefined"

View File

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

View File

@ -7,7 +7,7 @@
import os.path as op import os.path as op
from hscommon.trans import tr as trbase from hscommon.trans import trget
from hscommon.util import format_size from hscommon.util import format_size
from core.app import (DupeGuru as DupeGuruBase, Column, format_timestamp, format_perc, 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 prioritize
from . import __appname__ from . import __appname__
tr = lambda s: trbase(s, 'columns') coltr = trget('columns')
def format_dimensions(dimensions): def format_dimensions(dimensions):
return '%d x %d' % (dimensions[0], dimensions[1]) return '%d x %d' % (dimensions[0], dimensions[1])
@ -27,14 +27,14 @@ def get_delta_dimensions(value, ref_value):
class DupeGuru(DupeGuruBase): class DupeGuru(DupeGuruBase):
NAME = __appname__ NAME = __appname__
COLUMNS = [ COLUMNS = [
Column('name', tr("Filename")), Column('name', coltr("Filename")),
Column('folder_path', tr("Folder")), Column('folder_path', coltr("Folder")),
Column('size', tr("Size (KB)")), Column('size', coltr("Size (KB)")),
Column('extension', tr("Kind")), Column('extension', coltr("Kind")),
Column('dimensions', tr("Dimensions")), Column('dimensions', coltr("Dimensions")),
Column('mtime', tr("Modification")), Column('mtime', coltr("Modification")),
Column('percentage', tr("Match %")), Column('percentage', coltr("Match %")),
Column('dupe_count', tr("Dupe Count")), Column('dupe_count', coltr("Dupe Count")),
] ]
DELTA_COLUMNS = {2, 4, 5} DELTA_COLUMNS = {2, 4, 5}
METADATA_TO_READ = ['size', 'mtime', 'dimensions'] 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 # which should be included with this package. The terms are also available at
# http://www.hardcoded.net/licenses/bsd_license # 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, from core.prioritize import (KindCategory, FolderCategory, FilenameCategory, NumericalCategory,
SizeCategory, MtimeCategory) SizeCategory, MtimeCategory)
coltr = lambda s: tr(s, 'columns') coltr = trget('columns')
class DimensionsCategory(NumericalCategory): class DimensionsCategory(NumericalCategory):
NAME = coltr("Dimensions") NAME = coltr("Dimensions")

View File

@ -5,7 +5,7 @@
# which should be included with this package. The terms are also available at # which should be included with this package. The terms are also available at
# http://www.hardcoded.net/licenses/bsd_license # 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 hscommon.util import format_size
from core.app import (DupeGuru as DupeGuruBase, Column, format_timestamp, format_perc, 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 core import prioritize
from . import __appname__ from . import __appname__
tr = lambda s: trbase(s, 'columns') coltr = trget('columns')
class DupeGuru(DupeGuruBase): class DupeGuru(DupeGuruBase):
NAME = __appname__ NAME = __appname__
COLUMNS = [ COLUMNS = [
Column('name', tr("Filename")), Column('name', coltr("Filename")),
Column('folder_path', tr("Folder")), Column('folder_path', coltr("Folder")),
Column('size', tr("Size (KB)")), Column('size', coltr("Size (KB)")),
Column('extension', tr("Kind")), Column('extension', coltr("Kind")),
Column('mtime', tr("Modification")), Column('mtime', coltr("Modification")),
Column('percentage', tr("Match %")), Column('percentage', coltr("Match %")),
Column('words', tr("Words Used")), Column('words', coltr("Words Used")),
Column('dupe_count', tr("Dupe Count")), Column('dupe_count', coltr("Dupe Count")),
] ]
DELTA_COLUMNS = {2, 4} DELTA_COLUMNS = {2, 4}
METADATA_TO_READ = ['size', 'mtime'] 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 import job
from jobprogress.qt import Progress from jobprogress.qt import Progress
from hscommon.trans import tr, trmsg from hscommon.trans import trget
from hscommon.plat import ISLINUX from hscommon.plat import ISLINUX
from core.app import JobType from core.app import JobType
@ -33,6 +33,8 @@ from .directories_dialog import DirectoriesDialog
from .problem_dialog import ProblemDialog from .problem_dialog import ProblemDialog
from .util import createActions from .util import createActions
tr = trget('ui')
JOBID2TITLE = { JOBID2TITLE = {
JobType.Scan: tr("Scanning for duplicates"), JobType.Scan: tr("Scanning for duplicates"),
JobType.Load: tr("Loading"), JobType.Load: tr("Loading"),
@ -136,13 +138,13 @@ class DupeGuru(QObject):
if not dupes: if not dupes:
return return
title = tr("Add to Ignore List") title = tr("Add to Ignore List")
msg = trmsg("IgnoreConfirmMsg").format(len(dupes)) msg = tr("IgnoreConfirmMsg").format(len(dupes))
if self.confirm(title, msg): if self.confirm(title, msg):
self.model.add_selected_to_ignore_list(self) self.model.add_selected_to_ignore_list(self)
def copy_or_move_marked(self, copy): def copy_or_move_marked(self, copy):
opname = tr("copy") if copy else tr("move") opname = tr("copy") if copy else tr("move")
title = trmsg("SelectCopyOrMoveDestinationMsg").format(opname) title = tr("SelectCopyOrMoveDestinationMsg").format(opname)
flags = QFileDialog.ShowDirsOnly flags = QFileDialog.ShowDirsOnly
destination = str(QFileDialog.getExistingDirectory(self.resultWindow, title, '', flags)) destination = str(QFileDialog.getExistingDirectory(self.resultWindow, title, '', flags))
if not destination: if not destination:
@ -155,7 +157,7 @@ class DupeGuru(QObject):
if not dupes: if not dupes:
return return
title = tr("Remove duplicates") title = tr("Remove duplicates")
msg = trmsg("FileRemovalConfirmMsg").format(len(dupes)) msg = tr("FileRemovalConfirmMsg").format(len(dupes))
if self.confirm(title, msg): if self.confirm(title, msg):
self.model.remove_selected(self) self.model.remove_selected(self)
@ -174,7 +176,7 @@ class DupeGuru(QObject):
if cmd: if cmd:
self.model.invoke_command(cmd) self.model.invoke_command(cmd)
else: else:
msg = trmsg("NoCustomCommandMsg") msg = tr("NoCustomCommandMsg")
QMessageBox.warning(self.resultWindow, tr("Custom Command"), msg) QMessageBox.warning(self.resultWindow, tr("Custom Command"), msg)
def show_details(self): def show_details(self):
@ -205,12 +207,12 @@ class DupeGuru(QObject):
if self.model.results.problems: if self.model.results.problems:
self.problemDialog.show() self.problemDialog.show()
else: else:
msg = trmsg("OperationSuccessMsg") msg = tr("OperationSuccessMsg")
QMessageBox.information(self.resultWindow, tr("Operation Complete"), msg) QMessageBox.information(self.resultWindow, tr("Operation Complete"), msg)
elif jobid == JobType.Scan: elif jobid == JobType.Scan:
if not self.model.results.groups: if not self.model.results.groups:
title = tr("Scan complete") title = tr("Scan complete")
msg = trmsg("NoDuplicateFoundMsg") msg = tr("NoDuplicateFoundMsg")
QMessageBox.information(self.resultWindow, title, msg) QMessageBox.information(self.resultWindow, title, msg)
else: else:
self.showResultsWindow() self.showResultsWindow()
@ -262,7 +264,7 @@ class DupeGuru(QObject):
args = (j, ) + tuple(args) args = (j, ) + tuple(args)
self._progress.run(jobid, title, func, args=args) self._progress.run(jobid, title, func, args=args)
except job.JobInProgressError: except job.JobInProgressError:
msg = trmsg("TaskHangingMsg") msg = tr("TaskHangingMsg")
QMessageBox.information(self.resultWindow, 'Action in progress', msg) QMessageBox.information(self.resultWindow, 'Action in progress', msg)
def get_default(self, key): def get_default(self, key):

View File

@ -9,7 +9,9 @@
from PyQt4.QtCore import Qt, SIGNAL, QAbstractTableModel from PyQt4.QtCore import Qt, SIGNAL, QAbstractTableModel
from PyQt4.QtGui import QHeaderView, QTableView 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")] 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, QAbstractItemView, QSpacerItem, QSizePolicy, QPushButton, QApplication, QMainWindow, QMenuBar,
QMenu, QIcon, QPixmap, QLabel) QMenu, QIcon, QPixmap, QLabel)
from hscommon.trans import tr, trmsg from hscommon.trans import trget
from qtlib.recent import Recent from qtlib.recent import Recent
from qtlib.util import moveToScreenCenter from qtlib.util import moveToScreenCenter
@ -19,6 +19,8 @@ from . import platform
from .directories_model import DirectoriesModel, DirectoriesDelegate from .directories_model import DirectoriesModel, DirectoriesDelegate
from .util import createActions from .util import createActions
tr = trget('ui')
class DirectoriesDialog(QMainWindow): class DirectoriesDialog(QMainWindow):
def __init__(self, parent, app): def __init__(self, parent, app):
QMainWindow.__init__(self, None) QMainWindow.__init__(self, None)
@ -101,7 +103,7 @@ class DirectoriesDialog(QMainWindow):
self.resize(420, 338) self.resize(420, 338)
self.centralwidget = QWidget(self) self.centralwidget = QWidget(self)
self.verticalLayout = QVBoxLayout(self.centralwidget) 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.verticalLayout.addWidget(self.promptLabel)
self.treeView = QTreeView(self.centralwidget) self.treeView = QTreeView(self.centralwidget)
self.treeView.setItemDelegate(self.directoriesDelegate) self.treeView.setItemDelegate(self.directoriesDelegate)
@ -171,7 +173,7 @@ class DirectoriesDialog(QMainWindow):
event.accept() event.accept()
if self.app.model.results.is_modified: if self.app.model.results.is_modified:
title = tr("Unsaved results") title = tr("Unsaved results")
msg = trmsg("ReallyWantToQuitMsg") msg = tr("ReallyWantToQuitMsg")
if not self.app.confirm(title, msg): if not self.app.confirm(title, msg):
event.ignore() event.ignore()
if event.isAccepted(): if event.isAccepted():
@ -179,7 +181,7 @@ class DirectoriesDialog(QMainWindow):
#--- Events #--- Events
def addFolderTriggered(self): def addFolderTriggered(self):
title = trmsg("SelectFolderToAddMsg") title = tr("SelectFolderToAddMsg")
flags = QFileDialog.ShowDirsOnly flags = QFileDialog.ShowDirsOnly
dirpath = str(QFileDialog.getExistingDirectory(self, title, self.lastAddedFolder, flags)) dirpath = str(QFileDialog.getExistingDirectory(self, title, self.lastAddedFolder, flags))
if not dirpath: if not dirpath:
@ -196,7 +198,7 @@ class DirectoriesDialog(QMainWindow):
self.recentFolders.insertItem(folder) self.recentFolders.insertItem(folder)
def loadResultsTriggered(self): def loadResultsTriggered(self):
title = trmsg("SelectResultToLoadMsg") title = tr("SelectResultToLoadMsg")
files = ';;'.join([tr("dupeGuru Results (*.dupeguru)"), tr("All Files (*.*)")]) files = ';;'.join([tr("dupeGuru Results (*.dupeguru)"), tr("All Files (*.*)")])
destination = QFileDialog.getOpenFileName(self, title, '', files) destination = QFileDialog.getOpenFileName(self, title, '', files)
if destination: if destination:
@ -216,7 +218,7 @@ class DirectoriesDialog(QMainWindow):
def scanButtonClicked(self): def scanButtonClicked(self):
if self.app.model.results.is_modified: if self.app.model.results.is_modified:
title = tr("Start a new scan") title = tr("Start a new scan")
msg = trmsg("ReallyWantToContinueMsg") msg = tr("ReallyWantToContinueMsg")
if not self.app.confirm(title, msg): if not self.app.confirm(title, msg):
return return
self.app.model.start_scanning() 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, from PyQt4.QtGui import (QComboBox, QStyledItemDelegate, QApplication, QBrush, QStyle,
QStyleOptionComboBox, QStyleOptionViewItemV4) QStyleOptionComboBox, QStyleOptionViewItemV4)
from hscommon.trans import tr from hscommon.trans import trget
from qtlib.tree_model import RefNode, TreeModel from qtlib.tree_model import RefNode, TreeModel
from core.gui.directory_tree import DirectoryTree from core.gui.directory_tree import DirectoryTree
tr = trget('ui')
HEADERS = [tr("Name"), tr("State")] HEADERS = [tr("Name"), tr("State")]
STATES = [tr("Normal"), tr("Reference"), tr("Excluded")] 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) QFont, QSpacerItem, QSizePolicy, QPushButton)
from hscommon.plat import ISLINUX from hscommon.plat import ISLINUX
from hscommon.trans import tr as trbase, trmsg as trmsgbase from hscommon.trans import trget
tr = lambda s: trbase(s, "ExtraFairwareReminder")
trmsg = lambda s: trmsgbase(s, "ExtraFairwareReminder")
from core.gui.extra_fairware_reminder import ExtraFairwareReminder as ExtraFairwareReminderModel from core.gui.extra_fairware_reminder import ExtraFairwareReminder as ExtraFairwareReminderModel
tr = trget('ui')
class ExtraFairwareReminder(QDialog): class ExtraFairwareReminder(QDialog):
def __init__(self, parent, app): def __init__(self, parent, app):
flags = Qt.CustomizeWindowHint | Qt.WindowTitleHint flags = Qt.CustomizeWindowHint | Qt.WindowTitleHint
@ -38,11 +38,11 @@ class ExtraFairwareReminder(QDialog):
self.resize(380, dlg_height) self.resize(380, dlg_height)
self.verticalLayout = QVBoxLayout(self) self.verticalLayout = QVBoxLayout(self)
self.descLabel = QLabel(self) self.descLabel = QLabel(self)
self.descLabel.setText(trmsg("ExtraFairwarePromptMsg")) self.descLabel.setText(tr("ExtraFairwarePromptMsg"))
self.descLabel.setWordWrap(True) self.descLabel.setWordWrap(True)
self.verticalLayout.addWidget(self.descLabel) self.verticalLayout.addWidget(self.descLabel)
self.reasonLabel = QLabel(self) self.reasonLabel = QLabel(self)
self.reasonLabel.setText(trmsg("ExtraFairwareReasonMsg")) self.reasonLabel.setText(tr("ExtraFairwareReasonMsg"))
self.reasonLabel.setWordWrap(True) self.reasonLabel.setWordWrap(True)
font = QFont() font = QFont()
font.setWeight(75) 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) QSlider, QSizePolicy, QSpacerItem, QCheckBox, QLineEdit, QMessageBox, QSpinBox)
from hscommon.plat import ISOSX, ISLINUX from hscommon.plat import ISOSX, ISLINUX
from hscommon.trans import tr, trmsg from hscommon.trans import trget
from qtlib.util import horizontalWrap from qtlib.util import horizontalWrap
tr = trget('ui')
class PreferencesDialogBase(QDialog): class PreferencesDialogBase(QDialog):
def __init__(self, parent, app): def __init__(self, parent, app):
flags = Qt.CustomizeWindowHint | Qt.WindowTitleHint | Qt.WindowSystemMenuHint flags = Qt.CustomizeWindowHint | Qt.WindowTitleHint | Qt.WindowSystemMenuHint
@ -180,7 +182,7 @@ class PreferencesDialogBase(QDialog):
if oldlang not in langs: if oldlang not in langs:
oldlang = 'en' oldlang = 'en'
if lang != oldlang: if lang != oldlang:
QMessageBox.information(self, "", trmsg("NeedsToRestartToApplyLangMsg")) QMessageBox.information(self, "", tr("NeedsToRestartToApplyLangMsg"))
self.app.prefs.language = lang self.app.prefs.language = lang
self._save(prefs, ischecked) 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, from PyQt4.QtGui import (QDialog, QVBoxLayout, QHBoxLayout, QPushButton, QComboBox, QListView,
QDialogButtonBox, QAbstractItemView, QLabel) QDialogButtonBox, QAbstractItemView, QLabel)
from hscommon.trans import tr from hscommon.trans import trget
from qtlib.selectable_list import ComboboxModel, ListviewModel from qtlib.selectable_list import ComboboxModel, ListviewModel
from qtlib.util import verticalSpacer from qtlib.util import verticalSpacer
from core.gui.prioritize_dialog import PrioritizeDialog as PrioritizeDialogModel from core.gui.prioritize_dialog import PrioritizeDialog as PrioritizeDialogModel
tr = trget('ui')
MIME_INDEXES = 'application/dupeguru.rowindexes' MIME_INDEXES = 'application/dupeguru.rowindexes'
class PrioritizationList(ListviewModel): class PrioritizationList(ListviewModel):

View File

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

View File

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

View File

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

View File

@ -9,10 +9,12 @@
from PyQt4.QtCore import QSize from PyQt4.QtCore import QSize
from PyQt4.QtGui import QVBoxLayout, QAbstractItemView 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_dialog import DetailsDialog as DetailsDialogBase
from ..base.details_table import DetailsTable from ..base.details_table import DetailsTable
tr = trget('ui')
class DetailsDialog(DetailsDialogBase): class DetailsDialog(DetailsDialogBase):
def _setupUi(self): def _setupUi(self):
self.setWindowTitle(tr("Details")) 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, from PyQt4.QtGui import (QVBoxLayout, QHBoxLayout, QLabel, QSizePolicy, QSpacerItem, QWidget,
QApplication) QApplication)
from hscommon.trans import tr from hscommon.trans import trget
from core.scanner import ScanType from core.scanner import ScanType
from ..base.preferences_dialog import PreferencesDialogBase from ..base.preferences_dialog import PreferencesDialogBase
from . import preferences from . import preferences
tr = trget('ui')
SCAN_TYPE_ORDER = [ SCAN_TYPE_ORDER = [
ScanType.Filename, ScanType.Filename,
ScanType.Fields, ScanType.Fields,
@ -33,8 +35,14 @@ class PreferencesDialog(PreferencesDialogBase):
self.scanTypeComboBox.currentIndexChanged[int].connect(self.scanTypeChanged) self.scanTypeComboBox.currentIndexChanged[int].connect(self.scanTypeChanged)
def _setupPreferenceWidgets(self): def _setupPreferenceWidgets(self):
scanTypeLabels = [tr(s) for s in ["Filename", "Filename - Fields", scanTypeLabels = [
"Filename - Fields (No Order)", "Tags", "Contents", "Audio Contents"]] tr("Filename"),
tr("Filename - Fields"),
tr("Filename - Fields (No Order)"),
tr("Tags"),
tr("Contents"),
tr("Audio Contents"),
]
self._setupScanTypeBox(scanTypeLabels) self._setupScanTypeBox(scanTypeLabels)
self._setupFilterHardnessBox() self._setupFilterHardnessBox()
self.widgetsVLayout.addLayout(self.filterHardnessHLayout) self.widgetsVLayout.addLayout(self.filterHardnessHLayout)
@ -76,7 +84,7 @@ class PreferencesDialog(PreferencesDialogBase):
self.widgetsVLayout.addWidget(self.removeEmptyFoldersBox) self.widgetsVLayout.addWidget(self.removeEmptyFoldersBox)
self._setupAddCheckbox('ignoreHardlinkMatches', tr("Ignore duplicates hardlinking to the same file")) self._setupAddCheckbox('ignoreHardlinkMatches', tr("Ignore duplicates hardlinking to the same file"))
self.widgetsVLayout.addWidget(self.ignoreHardlinkMatches) 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.widgetsVLayout.addWidget(self.debugModeBox)
self._setupBottomPart() self._setupBottomPart()

View File

@ -9,10 +9,12 @@
from PyQt4.QtCore import Qt, QSize from PyQt4.QtCore import Qt, QSize
from PyQt4.QtGui import QVBoxLayout, QAbstractItemView, QHBoxLayout, QLabel, QSizePolicy, QPixmap 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_dialog import DetailsDialog as DetailsDialogBase
from ..base.details_table import DetailsTable from ..base.details_table import DetailsTable
tr = trget('ui')
class DetailsDialog(DetailsDialogBase): class DetailsDialog(DetailsDialogBase):
def __init__(self, parent, app): def __init__(self, parent, app):
DetailsDialogBase.__init__(self, parent, app) DetailsDialogBase.__init__(self, parent, app)

View File

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

View File

@ -9,9 +9,11 @@
from PyQt4.QtCore import SIGNAL from PyQt4.QtCore import SIGNAL
from PyQt4.QtGui import QMessageBox, QAction 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 from ..base.result_window import ResultWindow as ResultWindowBase
tr = trget('ui')
class ResultWindow(ResultWindowBase): class ResultWindow(ResultWindowBase):
def _setupUi(self): def _setupUi(self):
ResultWindowBase._setupUi(self) ResultWindowBase._setupUi(self)
@ -21,8 +23,8 @@ class ResultWindow(ResultWindowBase):
def clearPictureCacheTriggered(self): def clearPictureCacheTriggered(self):
title = tr("Clear Picture Cache") title = tr("Clear Picture Cache")
msg = trmsg("ClearPictureCacheConfirmMsg") msg = tr("ClearPictureCacheConfirmMsg")
if self.app.confirm(title, msg, QMessageBox.No): if self.app.confirm(title, msg, QMessageBox.No):
self.app.scanner.clear_picture_cache() 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.QtCore import QSize
from PyQt4.QtGui import QVBoxLayout, QAbstractItemView 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_dialog import DetailsDialog as DetailsDialogBase
from ..base.details_table import DetailsTable from ..base.details_table import DetailsTable
tr = trget('ui')
class DetailsDialog(DetailsDialogBase): class DetailsDialog(DetailsDialogBase):
def _setupUi(self): def _setupUi(self):
self.setWindowTitle(tr("Details")) self.setWindowTitle(tr("Details"))

View File

@ -12,7 +12,7 @@ from PyQt4.QtGui import (QVBoxLayout, QHBoxLayout, QLabel, QSizePolicy, QSpacerI
QLineEdit, QApplication) QLineEdit, QApplication)
from hscommon.plat import ISWINDOWS, ISLINUX from hscommon.plat import ISWINDOWS, ISLINUX
from hscommon.trans import tr from hscommon.trans import trget
from hscommon.util import tryint from hscommon.util import tryint
from core.scanner import ScanType from core.scanner import ScanType
@ -20,6 +20,8 @@ from core.scanner import ScanType
from ..base.preferences_dialog import PreferencesDialogBase from ..base.preferences_dialog import PreferencesDialogBase
from . import preferences from . import preferences
tr = trget('ui')
SCAN_TYPE_ORDER = [ SCAN_TYPE_ORDER = [
ScanType.Filename, ScanType.Filename,
ScanType.Contents, ScanType.Contents,
@ -33,7 +35,11 @@ class PreferencesDialog(PreferencesDialogBase):
self.scanTypeComboBox.currentIndexChanged[int].connect(self.scanTypeChanged) self.scanTypeComboBox.currentIndexChanged[int].connect(self.scanTypeChanged)
def _setupPreferenceWidgets(self): def _setupPreferenceWidgets(self):
scanTypeLabels = [tr(s) for s in ["Filename", "Contents", "Folders"]] scanTypeLabels = [
tr("Filename"),
tr("Contents"),
tr("Folders"),
]
self._setupScanTypeBox(scanTypeLabels) self._setupScanTypeBox(scanTypeLabels)
self._setupFilterHardnessBox() self._setupFilterHardnessBox()
self.widgetsVLayout.addLayout(self.filterHardnessHLayout) 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 PyQt4.QtGui import QApplication, QIcon, QPixmap
from hscommon.plat import ISWINDOWS 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 qtlib.error_report_dialog import install_excepthook
from qt.base import dg_rc from qt.base import dg_rc
from core_{{edition}} import __version__, __appname__ from core_{{edition}} import __version__, __appname__
@ -28,7 +28,7 @@ if __name__ == "__main__":
QCoreApplication.setApplicationVersion(__version__) QCoreApplication.setApplicationVersion(__version__)
settings = QSettings() settings = QSettings()
lang = settings.value('Language').toString() 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 # Many strings are translated at import time, so this is why we only import after the translator
# has been installed # has been installed
from qt.{{edition}}.app import DupeGuru from qt.{{edition}}.app import DupeGuru