diff --git a/.hgignore b/.hgignore index 64fd8d49..0e67d957 100644 --- a/.hgignore +++ b/.hgignore @@ -4,6 +4,7 @@ syntax: glob run.py *.pyc *.so +*.mo *.pyd *.xcodeproj/xcuserdata *.xcodeproj/project.xcworkspace/xcuserdata diff --git a/build.py b/build.py index 2bf4a8c9..16eb22f0 100644 --- a/build.py +++ b/build.py @@ -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) diff --git a/cocoa/inter/app_pe.py b/cocoa/inter/app_pe.py index f85616c5..1e9de3a9 100644 --- a/cocoa/inter/app_pe.py +++ b/cocoa/inter/app_pe.py @@ -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) diff --git a/core/app.py b/core/app.py index c95c6d9f..71f67d03 100644 --- a/core/app.py +++ b/core/app.py @@ -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() diff --git a/core/prioritize.py b/core/prioritize.py index 265cb284..16d881d9 100644 --- a/core/prioritize.py +++ b/core/prioritize.py @@ -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" diff --git a/core_me/app.py b/core_me/app.py index 76740de5..d4d4b43f 100644 --- a/core_me/app.py +++ b/core_me/app.py @@ -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', diff --git a/core_me/prioritize.py b/core_me/prioritize.py index 6be2273c..91513da4 100644 --- a/core_me/prioritize.py +++ b/core_me/prioritize.py @@ -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") diff --git a/core_pe/app.py b/core_pe/app.py index 670d8d1e..92cc7487 100644 --- a/core_pe/app.py +++ b/core_pe/app.py @@ -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'] diff --git a/core_pe/prioritize.py b/core_pe/prioritize.py index c4c01976..28d2b5f6 100644 --- a/core_pe/prioritize.py +++ b/core_pe/prioritize.py @@ -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") diff --git a/core_se/app.py b/core_se/app.py index c2ecd912..f24b6cf7 100644 --- a/core_se/app.py +++ b/core_se/app.py @@ -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'] diff --git a/locale/columns.pot b/locale/columns.pot new file mode 100644 index 00000000..d2a0f13e --- /dev/null +++ b/locale/columns.pot @@ -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 "" + diff --git a/locale/core.pot b/locale/core.pot new file mode 100644 index 00000000..340145e9 --- /dev/null +++ b/locale/core.pot @@ -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 "" + diff --git a/locale/fr/LC_MESSAGES/columns.po b/locale/fr/LC_MESSAGES/columns.po new file mode 100644 index 00000000..a04f48d4 --- /dev/null +++ b/locale/fr/LC_MESSAGES/columns.po @@ -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" + diff --git a/locale/fr/LC_MESSAGES/core.po b/locale/fr/LC_MESSAGES/core.po new file mode 100644 index 00000000..3ca7acaf --- /dev/null +++ b/locale/fr/LC_MESSAGES/core.po @@ -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 "" + diff --git a/locale/fr/LC_MESSAGES/ui.po b/locale/fr/LC_MESSAGES/ui.po new file mode 100644 index 00000000..d8ff62b9 --- /dev/null +++ b/locale/fr/LC_MESSAGES/ui.po @@ -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" + diff --git a/locale/ui.pot b/locale/ui.pot new file mode 100644 index 00000000..66d99397 --- /dev/null +++ b/locale/ui.pot @@ -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 "" + diff --git a/qt/base/app.py b/qt/base/app.py index 63a3615e..c79c001d 100644 --- a/qt/base/app.py +++ b/qt/base/app.py @@ -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): diff --git a/qt/base/details_table.py b/qt/base/details_table.py index 13458479..f4a9e9a6 100644 --- a/qt/base/details_table.py +++ b/qt/base/details_table.py @@ -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")] diff --git a/qt/base/directories_dialog.py b/qt/base/directories_dialog.py index 68deba9b..7e2f199a 100644 --- a/qt/base/directories_dialog.py +++ b/qt/base/directories_dialog.py @@ -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() diff --git a/qt/base/directories_model.py b/qt/base/directories_model.py index ab2387de..f7eb5c77 100644 --- a/qt/base/directories_model.py +++ b/qt/base/directories_model.py @@ -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")] diff --git a/qt/base/extra_fairware_reminder.py b/qt/base/extra_fairware_reminder.py index 6116dd3c..7c4d11fb 100644 --- a/qt/base/extra_fairware_reminder.py +++ b/qt/base/extra_fairware_reminder.py @@ -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) diff --git a/qt/base/preferences_dialog.py b/qt/base/preferences_dialog.py index 9357ae29..2ebb1f3d 100644 --- a/qt/base/preferences_dialog.py +++ b/qt/base/preferences_dialog.py @@ -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) diff --git a/qt/base/prioritize_dialog.py b/qt/base/prioritize_dialog.py index 2afc89eb..1b1c9fd7 100644 --- a/qt/base/prioritize_dialog.py +++ b/qt/base/prioritize_dialog.py @@ -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): diff --git a/qt/base/problem_dialog.py b/qt/base/problem_dialog.py index 5a1df575..8bc11a9d 100644 --- a/qt/base/problem_dialog.py +++ b/qt/base/problem_dialog.py @@ -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) diff --git a/qt/base/problem_table.py b/qt/base/problem_table.py index 6cb0103c..9b814380 100644 --- a/qt/base/problem_table.py +++ b/qt/base/problem_table.py @@ -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), diff --git a/qt/base/result_window.py b/qt/base/result_window.py index 9f5cb79a..a0a60d4d 100644 --- a/qt/base/result_window.py +++ b/qt/base/result_window.py @@ -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: diff --git a/qt/me/details_dialog.py b/qt/me/details_dialog.py index b5587826..48d1b727 100644 --- a/qt/me/details_dialog.py +++ b/qt/me/details_dialog.py @@ -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")) diff --git a/qt/me/preferences_dialog.py b/qt/me/preferences_dialog.py index 38ea40f8..97b02831 100644 --- a/qt/me/preferences_dialog.py +++ b/qt/me/preferences_dialog.py @@ -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() diff --git a/qt/pe/details_dialog.py b/qt/pe/details_dialog.py index 48472679..f9babd21 100644 --- a/qt/pe/details_dialog.py +++ b/qt/pe/details_dialog.py @@ -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) diff --git a/qt/pe/preferences_dialog.py b/qt/pe/preferences_dialog.py index a308ba92..efedbcdc 100644 --- a/qt/pe/preferences_dialog.py +++ b/qt/pe/preferences_dialog.py @@ -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() diff --git a/qt/pe/result_window.py b/qt/pe/result_window.py index 4b329ac0..e1daba97 100644 --- a/qt/pe/result_window.py +++ b/qt/pe/result_window.py @@ -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")) \ No newline at end of file diff --git a/qt/se/details_dialog.py b/qt/se/details_dialog.py index 08817015..bd58b2f5 100644 --- a/qt/se/details_dialog.py +++ b/qt/se/details_dialog.py @@ -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")) diff --git a/qt/se/preferences_dialog.py b/qt/se/preferences_dialog.py index 23801003..265ee10c 100644 --- a/qt/se/preferences_dialog.py +++ b/qt/se/preferences_dialog.py @@ -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) diff --git a/run_template_qt.py b/run_template_qt.py index ec732c85..ba67891c 100644 --- a/run_template_qt.py +++ b/run_template_qt.py @@ -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