diff options
author | Julien Valroff <julien@kirya.net> | 2011-04-23 08:23:36 +0200 |
---|---|---|
committer | Julien Valroff <julien@kirya.net> | 2011-04-23 08:23:36 +0200 |
commit | d91bcffa7fd45c9c7ac28ba971c7cd831400ba99 (patch) | |
tree | d6aaaf1b57746d89835f256c64078749b3a13ef2 | |
parent | 09f315ca8b3bde0e17fc2bba88989e8929c0745c (diff) | |
parent | 47f84e1a3d14ea9cab37d495b699d60ceed398f4 (diff) |
Merge branch 'upstream' into experimental
-rw-r--r-- | PKG-INFO | 2 | ||||
-rw-r--r-- | po/de.po | 582 | ||||
-rw-r--r-- | po/nl.po | 425 | ||||
-rw-r--r-- | po/pt_BR.po | 493 | ||||
-rw-r--r-- | po/rapid-photo-downloader.pot | 256 | ||||
-rw-r--r-- | po/ru.po | 384 | ||||
-rw-r--r-- | rapid/ChangeLog | 27 | ||||
-rw-r--r-- | rapid/backupfile.py | 187 | ||||
-rw-r--r-- | rapid/config.py | 2 | ||||
-rw-r--r-- | rapid/copyfiles.py | 38 | ||||
-rw-r--r-- | rapid/downloadtracker.py | 61 | ||||
-rw-r--r-- | rapid/glade3/prefs.ui | 42 | ||||
-rw-r--r-- | rapid/preferencesdialog.py | 10 | ||||
-rw-r--r-- | rapid/prefsrapid.py | 3 | ||||
-rwxr-xr-x | rapid/rapid.py | 494 | ||||
-rw-r--r-- | rapid/rpdfile.py | 4 | ||||
-rw-r--r-- | rapid/rpdmultiprocessing.py | 1 | ||||
-rw-r--r-- | rapid/thumbnail.py | 8 | ||||
-rw-r--r-- | rapid/utilities.py | 1 |
19 files changed, 1977 insertions, 1043 deletions
@@ -1,6 +1,6 @@ Metadata-Version: 1.0 Name: rapid-photo-downloader -Version: 0.4.0~b1 +Version: 0.4.0~rc1 Summary: Rapid Photo Downloader for Linux Home-page: http://www.damonlynch.net/rapid Author: Damon Lynch @@ -7,22 +7,22 @@ msgid "" msgstr "" "Project-Id-Version: rapid\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" -"POT-Creation-Date: 2011-03-20 18:23-0500\n" -"PO-Revision-Date: 2011-03-21 23:43+0000\n" -"Last-Translator: grrrk <Unknown>\n" +"POT-Creation-Date: 2011-04-10 19:59-0500\n" +"PO-Revision-Date: 2011-04-12 12:28+0000\n" +"Last-Translator: Eg <Unknown>\n" "Language-Team: German <de@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-04-04 05:24+0000\n" -"X-Generator: Launchpad (build 12710)\n" +"X-Launchpad-Export-Date: 2011-04-21 06:12+0000\n" +"X-Generator: Launchpad (build 12883)\n" #. Translators: if neccessary, for guidance in how to translate this program, you may see http://damonlynch.net/translate.html -#: rapid/rapid.py:97 rapid/glade3/rapid.ui.h:11 +#: rapid/rapid.py:104 rapid/glade3/rapid.ui.h:11 msgid "Rapid Photo Downloader" msgstr "Rapid Photo Downloader" -#: rapid/rapid.py:102 +#: rapid/rapid.py:109 #, python-format msgid "" "%(date)s\n" @@ -31,16 +31,11 @@ msgstr "" "%(date)s\n" "%(time)s" -#: rapid/rapid.py:104 +#: rapid/rapid.py:111 #, python-format msgid "%(date)s %(time)s" msgstr "%(date)s %(time)s" -#: rapid/rapid.py:107 -#, python-format -msgid "%(hour)s:%(minute)s:%(second)s:%(subsecond)s" -msgstr "%(hour)s:%(minute)s:%(second)s:%(subsecond)s" - #: rapid/rapid.py:114 #, python-format msgid "%(date)s %(hour)s:%(minute)s:%(second)s:%(subsecond)s" @@ -48,110 +43,251 @@ msgstr "%(date)s %(hour)s:%(minute)s:%(second)s:%(subsecond)s" #. Device refers to a thing like a camera, memory card in its reader, #. external hard drive, Portable Storage Device, etc. -#: rapid/rapid.py:145 +#: rapid/rapid.py:148 msgid "Device" msgstr "Laufwerk" #. Size refers to the total size of images on the device, typically in #. MB or GB -#: rapid/rapid.py:159 +#: rapid/rapid.py:165 msgid "Size" msgstr "Grösse" -#: rapid/rapid.py:162 +#: rapid/rapid.py:168 msgid "Download Progress" msgstr "Fortschritt im Download" +#: rapid/rapid.py:312 +#, python-format +msgid "%(device)s did not unmount" +msgstr "%(device)s konnte nicht entfernt werden" + #. This refers to when a device like a hard drive is having its contents scanned, #. looking for photos or videos. It is visible initially in the progress bar for each device #. (which normally holds "x photos and videos"). #. It maybe displayed only briefly if the contents of the device being scanned is small. -#: rapid/rapid.py:938 +#: rapid/rapid.py:1091 msgid "scanning..." msgstr "Überprüfe Laufwerke ..." -#: rapid/rapid.py:1639 +#: rapid/rapid.py:1807 msgid "Download" msgstr "Herunterladen" -#: rapid/rapid.py:1642 +#: rapid/rapid.py:1810 msgid "Pause" msgstr "Anhalten" -#. ~ scan_pid = rpd_file.scan_pid -#. ~ unique_id = rpd_file.unique_id -#: rapid/rapid.py:1906 +#: rapid/rapid.py:1912 #, python-format -msgid "%(number)s of %(total)s %(filetypes)s" -msgstr "%(number)s von %(total)s %(filetypes)s" +msgid "" +"These download folders are invalid:\n" +"%(folder1)s\n" +"%(folder2)s" +msgstr "" +"Diese Download-Verzeichnisse sind ungültig:\n" +"%(folder1)s\n" +"%(folder2)s" -#: rapid/rapid.py:2239 rapid/preferencesdialog.py:817 rapid/rpdfile.py:118 -msgid "photos" -msgstr "Bilder" +#: rapid/rapid.py:1915 +#, python-format +msgid "" +"This download folder is invalid:\n" +"%s" +msgstr "" +"Dieses Download-Verzeichnis ist ungültig:\n" +"%s" + +#: rapid/rapid.py:1916 +msgid "Download cannot proceed" +msgstr "Der Download kann nicht weitergeführt werden" + +#: rapid/rapid.py:2130 +msgid "About 1 second remaining" +msgstr "Etwa 1 Sekunde verbleibend" + +#: rapid/rapid.py:2132 +#, python-format +msgid "About %i seconds remaining" +msgstr "Etwa %i Sekunden verbleibend" + +#: rapid/rapid.py:2134 +msgid "About 1 minute remaining" +msgstr "Etwa 1 Minute verbleibend" + +#. Translators: in the text '%(minutes)i:%(seconds)02i', only the : should be translated, if needed. +#. '%(minutes)i' and '%(seconds)02i' should not be modified or left out. They are used to format and display the amount +#. of time the download has remainging, e.g. 'About 5:36 minutes remaining' +#: rapid/rapid.py:2139 +#, python-format +msgid "About %(minutes)i:%(seconds)02i minutes remaining" +msgstr "Etwa %(minutes)i:%(seconds)02i Minuten verbleibend" + +#: rapid/rapid.py:2151 rapid/preferencesdialog.py:822 rapid/rpdfile.py:110 +msgid "photos and videos" +msgstr "BIlder und Filme" + +#: rapid/rapid.py:2153 rapid/rpdfile.py:112 +msgid "photos or videos" +msgstr "Bilder oder Filme" -#: rapid/rapid.py:2241 rapid/rpdfile.py:113 +#: rapid/rapid.py:2156 rapid/rapid.py:2661 rapid/rpdfile.py:115 msgid "videos" msgstr "Filme" -#: rapid/rapid.py:2244 +#: rapid/rapid.py:2158 rapid/preferencesdialog.py:1371 rapid/rpdfile.py:117 +#: rapid/rpdfile.py:266 +msgid "video" +msgstr "Film" + +#: rapid/rapid.py:2161 rapid/rapid.py:2659 rapid/preferencesdialog.py:824 +#: rapid/rpdfile.py:120 +msgid "photos" +msgstr "Bilder" + +#. check subfolder preferences for bad values +#: rapid/rapid.py:2163 rapid/preferencesdialog.py:1370 rapid/rpdfile.py:122 +#: rapid/rpdfile.py:246 +msgid "photo" +msgstr "Bild" + +#: rapid/rapid.py:2188 +#, python-format +msgid "%(noFiles)s %(filetypes)s downloaded" +msgstr "%(noFiles)s %(filetypes)s heruntergeladen" + +#: rapid/rapid.py:2192 +#, python-format +msgid "%(noFiles)s %(filetypes)s failed to download" +msgstr "%(noFiles)s %(filetypes)s konnten nicht heruntergeladen werden" + +#: rapid/rapid.py:2195 rapid/rapid.py:2247 +msgid "warnings" +msgstr "Warnungen" + +#: rapid/rapid.py:2204 +msgid "All downloads complete" +msgstr "Alle Downloads sind abgeschlossen" + +#: rapid/rapid.py:2210 rapid/rapid.py:2219 rapid/rapid.py:2228 +#: rapid/rapid.py:2237 rapid/rapid.py:2245 +#, python-format +msgid "%(number)s %(numberdownloaded)s" +msgstr "%(number)s %(numberdownloaded)s" + +#: rapid/rapid.py:2212 rapid/rapid.py:2230 +#, python-format +msgid "%(filetype)s downloaded" +msgstr "%(filetype)s heruntergeladen" + +#: rapid/rapid.py:2221 rapid/rapid.py:2239 +#, python-format +msgid "%(filetype)s failed to download" +msgstr "%(filetype)s konnten nicht heruntergeladen werden" + +#. e.g.: 3 of 205 photos and videos (202 remaining) +#: rapid/rapid.py:2276 +#, python-format +msgid "%(number)s of %(total)s %(filetypes)s (%(remaining)s remaining)" +msgstr "%(number)s of %(total)s %(filetypes)s (%(remaining)s verbleibend)" + +#. e.g.: 205 of 205 photos and videos +#: rapid/rapid.py:2283 +#, python-format +msgid "%(number)s of %(total)s %(filetypes)s" +msgstr "%(number)s von %(total)s %(filetypes)s" + +#: rapid/rapid.py:2665 msgid "Free space:" msgstr "Freier Speicherplatz:" #. (videos) or (photos) will be appended to the free space message displayed to the #. user in the status bar. #. you should only translate this if your language does not use parantheses -#: rapid/rapid.py:2256 +#: rapid/rapid.py:2677 #, python-format msgid "(%(file_type)s)" -msgstr "" +msgstr "(%(file_type)s)" #. Freespace available on the filesystem for downloading to #. Displayed in status bar message on main window -#: rapid/rapid.py:2260 +#: rapid/rapid.py:2681 #, python-format msgid "%(free)s %(file_type)s" -msgstr "" +msgstr "%(free)s %(file_type)s" #. Inserted in the middle of the statusbar message concerning the amount of freespace #. Used to differentiate between two different file systems #. e.g. Free space: 21.3GB (photos); 14.7GB (videos). -#: rapid/rapid.py:2265 +#: rapid/rapid.py:2686 msgid "; " msgstr "; " #. Inserted at the end of the statusbar message concerning the amount of freespace #. Used to differentiate between two different file systems #. e.g. Free space: 21.3GB (photos); 14.7GB (videos). -#: rapid/rapid.py:2270 +#: rapid/rapid.py:2691 msgid "." msgstr "." #. Freespace available on the filesystem for downloading to #. Displayed in status bar message on main window #. e.g. 14.7GB available -#: rapid/rapid.py:2276 +#: rapid/rapid.py:2697 #, python-format msgid "%(free)s free" -msgstr "" +msgstr "%(free)s verfügbar" #. user manually specified backup location -#: rapid/rapid.py:2282 +#: rapid/rapid.py:2703 #, python-format msgid "Backing up to %(path)s" msgstr "Sicherungskopieren in %(path)s erstellen" -#: rapid/rapid.py:2287 +#: rapid/rapid.py:2708 #, python-format msgid "%(freespace)s. %(backuppaths)s." msgstr "%(freespace)s. %(backuppaths)s." -#: rapid/rapid.py:2470 +#: rapid/rapid.py:2737 +msgid "Program preferences are invalid" +msgstr "Die Benutzervoreinstellungen sind ungültig" + +#: rapid/rapid.py:2842 rapid/rpdfile.py:247 +msgid "Photo" +msgstr "Bild" + +#: rapid/rapid.py:2844 rapid/rpdfile.py:267 +msgid "Video" +msgstr "Film" + +#: rapid/rapid.py:2853 +#, python-format +msgid "%(file_type)s download folder does not exist" +msgstr "%(file_type)s Download-Verzeichnis existiert nicht" + +#: rapid/rapid.py:2855 rapid/rapid.py:2869 rapid/rapid.py:2882 +#, python-format +msgid "Folder: %s" +msgstr "Verzeichnis: %s" + +#: rapid/rapid.py:2867 +#, python-format +msgid "%(file_type)s download folder is invalid" +msgstr "%(file_type)s Download-Verzeichnis ist ungültig" + +#: rapid/rapid.py:2880 +#, python-format +msgid "%(file_type)s download folder is not writable" +msgstr "%(file_type)s Download-Verzeichnis ist schreibgeschützt" + +#: rapid/rapid.py:2958 msgid "Thumbnails" -msgstr "" +msgstr "Vorschaubilder" #. Translators: this text is displayed to the user when they request information on the command line options. #. The text %default should not be modified or left out. -#: rapid/rapid.py:2511 +#: rapid/rapid.py:3005 #, python-format msgid "" "display program information on the command line as the program runs " @@ -160,49 +296,62 @@ msgstr "" "Zeige die Programminformationen an, wenn das Programm aus der Kommandozeile " "aufgerufen wurde (Voreinstellung: %default)" -#: rapid/rapid.py:2512 +#: rapid/rapid.py:3006 msgid "display debugging information when run from the command line" msgstr "" "Während des Ausführens von der Kommandozeile Debug-Informationen anzeigen" -#: rapid/rapid.py:2513 +#: rapid/rapid.py:3007 msgid "only output errors to the command line" msgstr "Zeige Fehlermeldungen nur auf der Kommandozeile an" #. image file extensions are recognized RAW files plus TIFF and JPG -#: rapid/rapid.py:2515 +#: rapid/rapid.py:3009 msgid "list photo and video file extensions the program recognizes and exit" msgstr "" "Anzeigen der Dateitypen für Bilder und Filme anzeigen, welche das Programm " "erkennt und beenden" -#: rapid/rapid.py:2516 +#: rapid/rapid.py:3010 msgid "reset all program settings and preferences and exit" msgstr "Alle Einstellungen auf Standardwerte zurücksetzten und beenden" -#: rapid/rapid.py:2529 +#: rapid/rapid.py:3023 msgid "Photos:" msgstr "Bilder:" -#: rapid/rapid.py:2529 +#: rapid/rapid.py:3023 msgid "Videos:" msgstr "Filme:" -#: rapid/rapid.py:2534 +#: rapid/rapid.py:3028 #, python-format msgid "and %s" msgstr "und %s" -#: rapid/rapid.py:2542 +#: rapid/rapid.py:3036 msgid "All settings and preferences have been reset" msgstr "Alle Einstellungen wurden zurückgesetzt" -#: rapid/rapid.py:2551 +#: rapid/rapid.py:3045 msgid "" "Video downloading functionality disabled.\n" "To download videos, please install the hachoir metadata and kaa metadata " "packages for python." msgstr "" +"Die Video-Download-Funktionalität ist deaktiviert.\n" +"Um diese zu aktivieren müssen zuerst die hachoir metadata und kaa metadata " +"Pakete für Python installiert werden." + +#: rapid/copyfiles.py:142 rapid/subfolderfile.py:209 +#: rapid/subfolderfile.py:332 rapid/subfolderfile.py:350 +#, python-format +msgid "" +"%(problem)s\n" +"File: %(file)s" +msgstr "" +"%(problem)s\n" +"Datei: %(file)s" #: rapid/device.py:79 msgid "Device Detected" @@ -221,6 +370,10 @@ msgstr "" msgid "_Remember this choice" msgstr "_Auswahl merken" +#: rapid/downloadtracker.py:217 +msgid "MB/s" +msgstr "MB/s" + #: rapid/generatenameconfig.py:143 msgid "Date time" msgstr "Datum Zeit" @@ -242,7 +395,7 @@ msgid "Sequences" msgstr "Sequenzen" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode -#: rapid/generatenameconfig.py:149 rapid/preferencesdialog.py:545 +#: rapid/generatenameconfig.py:149 rapid/preferencesdialog.py:549 msgid "Job code" msgstr "Auftragsbezeichnung" @@ -564,86 +717,86 @@ msgstr "MM (Minuten)" msgid "SS" msgstr "SS" -#: rapid/preferencesdialog.py:364 +#: rapid/preferencesdialog.py:370 #, python-format msgid "Subfolder preferences should not start with a %s" msgstr "Die Unterverzeichnisvoreinstellungen sollten nicht mit %s beginnen" -#: rapid/preferencesdialog.py:366 +#: rapid/preferencesdialog.py:372 #, python-format msgid "Subfolder preferences should not end with a %s" msgstr "Die Unterverzeichnisvoreinstellungen sollten nicht mit %s enden" -#: rapid/preferencesdialog.py:370 +#: rapid/preferencesdialog.py:376 #, python-format msgid "Subfolder preferences should not contain two %s one after the other" msgstr "" "Die Unterverzeichnisvoreinstellungen sollten nicht zwei %s nacheinander " "enthalten" -#: rapid/preferencesdialog.py:384 rapid/preferencesdialog.py:668 +#: rapid/preferencesdialog.py:389 rapid/preferencesdialog.py:672 msgid "Remove all Job Codes?" msgstr "Alle Auftragsbezeichnungen löschen?" -#: rapid/preferencesdialog.py:401 rapid/preferencesdialog.py:685 +#: rapid/preferencesdialog.py:406 rapid/preferencesdialog.py:689 msgid "Should all Job Codes be removed?" msgstr "Sollen alle Auftragsbezeichnungen gelöscht werden?" -#: rapid/preferencesdialog.py:431 +#: rapid/preferencesdialog.py:436 msgid "Error in Photo Rename preferences" msgstr "Fehler in den Vorgaben zur Umbennennung von Bildern" -#: rapid/preferencesdialog.py:613 +#: rapid/preferencesdialog.py:617 msgid "Error in Video Rename preferences" msgstr "Fehler in den Vorgaben zur Umbennennung von Filmen" -#: rapid/preferencesdialog.py:634 +#: rapid/preferencesdialog.py:638 msgid "Error in Photo Download Subfolders preferences" msgstr "Fehler in den Vorgaben für Bilder-Downloadunterordner" -#: rapid/preferencesdialog.py:651 +#: rapid/preferencesdialog.py:655 msgid "Error in Video Download Subfolders preferences" msgstr "Fehler in den Vorgaben zur Filme-Downloadunterordner" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode -#: rapid/preferencesdialog.py:710 +#: rapid/preferencesdialog.py:714 msgid "Enter a Job Code" msgstr "Geben Sie eine Auftragsbezeichnung ein" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode -#: rapid/preferencesdialog.py:727 +#: rapid/preferencesdialog.py:731 msgid "Enter a new Job Code, or select a previous one" msgstr "" "Geben Sie eine neue Auftragsbezeichung ein oder wählen Sie eine bestehende " "aus" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode -#: rapid/preferencesdialog.py:730 +#: rapid/preferencesdialog.py:734 msgid "Enter a new Job Code" msgstr "Geben Sie eine neue Auftragsbezeichung ein" -#: rapid/preferencesdialog.py:735 +#: rapid/preferencesdialog.py:739 msgid "Job Code:" msgstr "Auftragsbezeichnung:" -#: rapid/preferencesdialog.py:815 rapid/rpdfile.py:108 -msgid "photos and videos" -msgstr "BIlder und Filme" +#: rapid/preferencesdialog.py:915 +msgid "Job Code" +msgstr "Auftragsbezeichnung" -#: rapid/preferencesdialog.py:964 +#: rapid/preferencesdialog.py:997 msgid "Select a folder to download photos to" msgstr "Wählen Sie ein Verzeichnis für den Download der Bilder" -#: rapid/preferencesdialog.py:982 +#: rapid/preferencesdialog.py:1015 msgid "Select a folder to download videos to" msgstr "Wählen Sie einen Ordner für den Download von Filmen" -#: rapid/preferencesdialog.py:1064 +#: rapid/preferencesdialog.py:1106 #, python-format msgid "Select a folder containing %(file_types)s" msgstr "Wählen Sie einen Ordner welcher %(file_types)s enthält" -#: rapid/preferencesdialog.py:1086 +#: rapid/preferencesdialog.py:1128 #, python-format msgid "Select a folder in which to backup %(file_types)s" msgstr "" @@ -651,7 +804,7 @@ msgstr "" "erstellt werden soll" #. Translators: please do not modify or leave out html formatting tags like <i> and <b>. These are used to format the text the users sees -#: rapid/preferencesdialog.py:1172 +#: rapid/preferencesdialog.py:1212 msgid "" "<i><b>Warning:</b> There is insufficient metadata to fully generate the " "name. Please use other renaming options.</i>" @@ -659,7 +812,7 @@ msgstr "" "<i><b>Warnung:</b> There is insufficient metadata to fully generate the " "name. Please use other renaming options.</i>" -#: rapid/preferencesdialog.py:1211 +#: rapid/preferencesdialog.py:1263 msgid "" "<i><b>Warning:</b> There is insufficient metadata to fully generate " "subfolders. Please use other subfolder naming options.</i>" @@ -669,13 +822,13 @@ msgstr "" "Benennung der Unterordner.</i>" #. Translators: you should not modify or leave out the %s. This is a code used by the programming language python to insert a value that thes user will see -#: rapid/preferencesdialog.py:1215 +#: rapid/preferencesdialog.py:1266 #, python-format msgid "<i>Example: %s</i>" msgstr "<i>Beispiel: %s</i>" #. Preferences list is now empty -#: rapid/preferencesdialog.py:1291 +#: rapid/preferencesdialog.py:1356 #, python-format msgid "" "The %(filetype)s subfolder preferences entered are invalid and cannot be " @@ -686,22 +839,13 @@ msgstr "" "und können nicht verwendet werden.\n" "Sie werden auf die Standardwerte zurückgesetzt." -#. check subfolder preferences for bad values -#: rapid/preferencesdialog.py:1305 rapid/rpdfile.py:120 rapid/rpdfile.py:241 -msgid "photo" -msgstr "Bild" - -#: rapid/preferencesdialog.py:1306 rapid/rpdfile.py:115 rapid/rpdfile.py:267 -msgid "video" -msgstr "Film" - #. Translators: this value is used as an example device when automatic backup device detection is enabled. You should translate this. -#: rapid/preferencesdialog.py:1566 +#: rapid/preferencesdialog.py:1642 msgid "externaldrive1" msgstr "ExternesLaufwerk1" #. Translators: this value is used as an example device when automatic backup device detection is enabled. You should translate this. -#: rapid/preferencesdialog.py:1568 +#: rapid/preferencesdialog.py:1644 msgid "externaldrive2" msgstr "ExternesLaufwerk2" @@ -778,53 +922,53 @@ msgid "Stockholm" msgstr "Stockholm" #. components -#: rapid/problemnotification.py:26 rapid/subfolderfile.py:181 +#: rapid/problemnotification.py:26 rapid/subfolderfile.py:343 msgid "subfolder" msgstr "Unterordner" -#: rapid/problemnotification.py:27 rapid/subfolderfile.py:179 +#: rapid/problemnotification.py:27 rapid/subfolderfile.py:341 msgid "filename" msgstr "Dateiname" #: rapid/problemnotification.py:80 #, python-format msgid "Date time value %s appears invalid." -msgstr "" +msgstr "Die Werte für Datum und Zeit %s scheinen ungültig zu sein." #: rapid/problemnotification.py:81 msgid "Filename does not have an extension." -msgstr "" +msgstr "Der Dateinamen enthält keinen Dateitypen." #. a number component is something like the 8346 in IMG_8346.JPG #: rapid/problemnotification.py:83 msgid "Filename does not have a number component." -msgstr "" +msgstr "Der Dateinamen enthält keine Zahlen." #: rapid/problemnotification.py:84 #, python-format msgid "Error generating component %s." -msgstr "" +msgstr "Fehler beim Erstellen von %s." #. a generic problem #: rapid/problemnotification.py:86 #, python-format msgid "%(filetype)s metadata cannot be read" -msgstr "" +msgstr "%(filetype)s Metadaten können nicht gelesen werden" #: rapid/problemnotification.py:88 #, python-format msgid "%(filetype)s %(area)s could not be generated" -msgstr "" +msgstr "%(filetype)s %(area)s können nicht erstellt werden" #: rapid/problemnotification.py:90 rapid/problemnotification.py:91 #, python-format msgid "An error occurred when copying the %(filetype)s" -msgstr "" +msgstr "Beim Kopieren von %(filetype)s ist ein Fehler aufgetreten" #: rapid/problemnotification.py:93 rapid/problemnotification.py:94 #, python-format msgid "%(filetype)s already exists" -msgstr "" +msgstr "%(filetype)s existiert bereits" #: rapid/problemnotification.py:97 #, python-format @@ -832,6 +976,8 @@ msgid "" "%(filetype)s could not be backed up because no suitable backup locations " "were found." msgstr "" +"Von %(filetype)s konnte keine Sicherungskopie erstellt werden, da kein " +"entsprechenden Verzeichnis gefunden wurde." #: rapid/problemnotification.py:102 #, python-format @@ -839,11 +985,13 @@ msgid "" "%(image1)s was taken at on %(image1_date)s at %(image1_time)s, and " "%(image2)s on %(image2_date)s at %(image2_time)s." msgstr "" +"%(image1)s wurde am %(image1_date)s um %(image1_time)s und %(image2)s am " +"%(image2_date)s um %(image2_time)s aufgenommen." #: rapid/problemnotification.py:103 #, python-format msgid "%(filetype)s was already downloaded" -msgstr "" +msgstr "%(filetype)s wurde bereits heruntergeladen" #: rapid/problemnotification.py:107 #, python-format @@ -851,52 +999,59 @@ msgid "" "The existing %(filetype)s was last modified on %(date)s at %(time)s. Unique " "identifier '%(identifier)s' added." msgstr "" +"Die existierende Datei %(filetype)s wurde zuletzt am %(date)s um %(time)s " +"modifiziert. Eine eindeutige Kennung '%(identifier)s' wurde angefügt." #: rapid/problemnotification.py:108 #, python-format msgid "The existing %(filetype)s was last modified on %(date)s at %(time)s." msgstr "" +"Die existierende Datei %(filetype)s wurde zuletzt am %(date)s um %(time)s " +"modifiziert." #: rapid/problemnotification.py:109 #, python-format msgid "There is no data with which to name the %(filetype)s." msgstr "" +"Es existieren keine Daten um den Dateinamen zu erstellen %(filetype)s." #: rapid/problemnotification.py:111 #, python-format msgid "Error: %(errorno)s %(strerror)s" -msgstr "" +msgstr "Fehler: %(errorno)s %(strerror)s" #: rapid/problemnotification.py:201 msgid "The metadata might be corrupt." -msgstr "" +msgstr "Die Metadaten scheinen korrupt zu sein." #: rapid/problemnotification.py:204 msgid "" "The filename, extension and Exif information indicate it has already been " "downloaded." msgstr "" +"Dateiname, Erweiterung und EXIF-Informationen zeigen an, dass das Bild schon " +"heruntergeladen wurde." #: rapid/problemnotification.py:223 #, python-format msgid " It was backed up to %(volume)s" -msgstr "" +msgstr " Es wurde auf %(volume)s gesichert" #: rapid/problemnotification.py:225 msgid " It was backed up to these devices: " -msgstr "" +msgstr " Es wurde auf diese Laufwerke gesichert: " #: rapid/problemnotification.py:227 rapid/problemnotification.py:288 #: rapid/problemnotification.py:300 #, python-format msgid "%s, " -msgstr "" +msgstr "%s, " #: rapid/problemnotification.py:228 rapid/problemnotification.py:289 #: rapid/problemnotification.py:301 #, python-format msgid "%(volumes)s and %(final_volume)s." -msgstr "" +msgstr "%(volumes)s und %(final_volume)s." #: rapid/problemnotification.py:240 #, python-format @@ -904,193 +1059,226 @@ msgid "" "Photos detected with the same filenames, but taken at different times: " "%(details)s" msgstr "" +"Bilder mit identischen Dateinamen aber unterschiedlichen Aufnahmezeiten " +"gefunden: %(details)s" #: rapid/problemnotification.py:257 #, python-format msgid "An error occurred when backing up on %(volume)s: %(inst)s." msgstr "" +"Ein Fehler trat auf beim beim Erstellen der Sicherungskopien auf Laufwerk " +"%(volume)s: %(inst)s." #: rapid/problemnotification.py:259 #, python-format msgid "An error occurred when backing up on %(volume)s." msgstr "" +"Ein Fehler trat auf beim beim Erstellen der Sicherungskopien auf Laufwerk " +"%(volume)s." #: rapid/problemnotification.py:261 msgid "Errors occurred when backing up on the following backup devices: " msgstr "" +"Fehler traten auf beim beim Erstellen der Sicherungskopien auf die folgenden " +"Laufwerke: " #: rapid/problemnotification.py:265 rapid/problemnotification.py:313 #, python-format msgid "%(volume)s (%(inst)s), " -msgstr "" +msgstr "%(volume)s (%(inst)s), " #: rapid/problemnotification.py:267 #, python-format msgid "%(volume)s, " -msgstr "" +msgstr "%(volume)s, " #: rapid/problemnotification.py:271 rapid/problemnotification.py:315 #, python-format msgid "%(volumes)s and %(volume)s (%(inst)s)." -msgstr "" +msgstr "%(volumes)s und %(volume)s (%(inst)s)." #: rapid/problemnotification.py:276 #, python-format msgid "%(volumes)s and %(volume)s." -msgstr "" +msgstr "%(volumes)s und %(volume)s." #: rapid/problemnotification.py:284 #, python-format msgid "Backup already exists on %(volume)s." -msgstr "" +msgstr "Sicherungskopie existiert bereits auf %(volume)s." #: rapid/problemnotification.py:286 msgid "Backups already exist in these locations: " -msgstr "" +msgstr "Sicherungskopien existieren bereits auf den folgenden Laufwerken: " #: rapid/problemnotification.py:296 #, python-format msgid "Backup overwritten on %(volume)s." -msgstr "" +msgstr "Sicherungskopie überschrieben auf %(volume)s." #: rapid/problemnotification.py:298 msgid "Backups overwritten on these devices: " -msgstr "" +msgstr "Sicherungskopien überschrieben auf den folgenden Laufwerken: " #: rapid/problemnotification.py:309 #, python-format msgid "An error occurred when creating directories on %(volume)s: %(inst)s." -msgstr "" +msgstr "Fehler beim Erstellen der Verzeichnisse auf %(volume)s: %(inst)s." #: rapid/problemnotification.py:311 msgid "" "Errors occurred when creating directories on the following backup devices: " msgstr "" +"Fehler beim Erstellen der Verzeichnisse auf den folgenden " +"Sicherungslaufwerken: " #: rapid/problemnotification.py:322 #, python-format msgid "%(previousproblem)s Additionally, %(newproblem)s" -msgstr "" +msgstr "%(previousproblem)s zusätzlich, %(newproblem)s" #: rapid/problemnotification.py:330 #, python-format msgid " Furthermore, there were %(problems)s." -msgstr "" +msgstr " Zustätzlich sind folgende Probleme aufgetreten %(problems)s." #: rapid/problemnotification.py:332 #, python-format msgid " Furthermore, there was a %(problem)s." -msgstr "" +msgstr " Zustätzlich ist folgendes Problem aufgetreten %(problem)s." #: rapid/problemnotification.py:341 #, python-format msgid "The %(type)s metadata is missing." -msgstr "" +msgstr "Die %(type)s Metadaten fehlen." #: rapid/problemnotification.py:343 msgid "The following metadata is missing: " -msgstr "" +msgstr "Die folgenden Metadaten fehlen: " #: rapid/problemnotification.py:346 #, python-format msgid "%(missing_metadata_elements)s and %(final_missing_metadata_element)s." msgstr "" +"%(missing_metadata_elements)s und %(final_missing_metadata_element)s." #: rapid/problemnotification.py:363 msgid "Problems in subfolder and filename generation" -msgstr "" +msgstr "Probleme bei der Erstllung der Order und Dateinamen" #: rapid/problemnotification.py:365 msgid "Problem in subfolder and filename generation" -msgstr "" +msgstr "Problem bei der Erstllung der Order und Dateinamen" #: rapid/problemnotification.py:368 #, python-format msgid "Problems in %s generation" -msgstr "" +msgstr "Probleme bei der Erstllung von %s" #: rapid/problemnotification.py:370 #, python-format msgid "Problem in %s generation" -msgstr "" +msgstr "Problem bei der Erstllung von %s" #: rapid/problemnotification.py:379 #, python-format msgid "%(filetype)s already exists, but it was backed up" -msgstr "" +msgstr "%(filetype)s existiert bereits, wurde aber gesichert" #: rapid/problemnotification.py:381 #, python-format msgid "An error occurred when copying the %(filetype)s, but it was backed up" msgstr "" +"Beim kopieren von %(filetype)s, ist ein Fehler aufgetreten, es wurde aber " +"gesichert" #: rapid/problemnotification.py:401 msgid "Multiple problems were encountered" -msgstr "" +msgstr "Mehrere Probleme sind aufgetreten" -#: rapid/problemnotification.py:403 +#: rapid/problemnotification.py:403 rapid/subfolderfile.py:228 msgid "Photos detected with the same filenames, but taken at different times" msgstr "" "Bilder mit gleichem Dateinamen aber unterschiedlichen Aufnahmezeiten gefunden" #: rapid/problemnotification.py:409 msgid "there were errors backing up" -msgstr "" +msgstr "beim Erstellen der Sicherungskopieren sind Fehler aufgetreten" #: rapid/problemnotification.py:410 msgid "There were errors backing up" -msgstr "" +msgstr "Beim Erstellen der Sicherungskopieren sind Fehler aufgetreten" #: rapid/problemnotification.py:412 msgid "there was an error backing up" -msgstr "" +msgstr "beim Erstellen der Sicherungskopieren ist ein Fehler aufgetreten" #: rapid/problemnotification.py:413 msgid "There was an error backing up" -msgstr "" +msgstr "Beim Erstellen der Sicherungskopieren ist ein Fehler aufgetreten" #. e.g. #: rapid/problemnotification.py:416 #, python-format msgid "%(previousproblem)s, and %(backinguperror)s" -msgstr "" +msgstr "%(previousproblem)s, und %(backinguperror)s" -#: rapid/rpdfile.py:110 -msgid "photos or videos" -msgstr "Bilder oder Filme" - -#: rapid/rpdfile.py:134 +#: rapid/rpdfile.py:136 #, python-format msgid "%(number)s %(filetypes)s" msgstr "%(number)s %(filetypes)s" -#: rapid/rpdfile.py:242 -msgid "Photo" -msgstr "Bild" +#: rapid/subfolderfile.py:79 +#, python-format +msgid "%(hour)s:%(minute)s:%(second)s:%(subsecond)s" +msgstr "%(hour)s:%(minute)s:%(second)s:%(subsecond)s" -#: rapid/rpdfile.py:268 -msgid "Video" -msgstr "Film" +#: rapid/subfolderfile.py:194 +#, python-format +msgid "" +"Source: %(source)s\n" +"Destination: %(destination)s" +msgstr "" +"Quelle: %(source)s\n" +"Ziel: %(destination)s" + +#: rapid/subfolderfile.py:297 +msgid "Photo has already been downloaded" +msgstr "Das Bild wurde bereits heruntergeladen" -#: rapid/subfolderfile.py:177 +#: rapid/subfolderfile.py:298 +#, python-format +msgid "Source: %(source)s" +msgstr "Quelle: %(source)s" + +#: rapid/subfolderfile.py:339 msgid "subfolder and filename" msgstr "Unterordner und Dateiname" +#: rapid/subfolderfile.py:377 +msgid "Failed to create download subfolder" +msgstr "Der Download-Unterordner konnte nicht erstellt werden" + +#: rapid/subfolderfile.py:378 +#, python-format +msgid "Path: %s" +msgstr "Pfad: %s" + #: rapid/glade3/rapid.ui.h:1 msgid "About..." -msgstr "" +msgstr "Über ..." #: rapid/glade3/rapid.ui.h:2 msgid "Check All" -msgstr "" +msgstr "Alle auswählen" #: rapid/glade3/rapid.ui.h:3 msgid "Check All Photos" -msgstr "" +msgstr "Alle Bilder auswählen" #: rapid/glade3/rapid.ui.h:4 msgid "Check All Videos" -msgstr "" +msgstr "Alle Filme auswählen" #: rapid/glade3/rapid.ui.h:5 msgid "Download / Pause" @@ -1098,31 +1286,31 @@ msgstr "Download / Pause" #: rapid/glade3/rapid.ui.h:6 msgid "Get Help Online..." -msgstr "" +msgstr "Online Hilfe erhalten …" #: rapid/glade3/rapid.ui.h:7 msgid "Make a Donation..." -msgstr "" +msgstr "Eine Spende machen ..." #: rapid/glade3/rapid.ui.h:8 msgid "Next File" -msgstr "" +msgstr "Nächste Datei" #: rapid/glade3/rapid.ui.h:9 msgid "Previous File" -msgstr "" +msgstr "Vorherige Datei" #: rapid/glade3/rapid.ui.h:10 msgid "Quit" -msgstr "" +msgstr "Programm beenden" #: rapid/glade3/rapid.ui.h:12 msgid "Refresh" -msgstr "" +msgstr "Aktualisieren" #: rapid/glade3/rapid.ui.h:13 msgid "Report a Problem..." -msgstr "" +msgstr "Ein Problem melden …" #: rapid/glade3/rapid.ui.h:14 msgid "Select All Wit_h Job Code" @@ -1134,15 +1322,15 @@ msgstr "Alle ohne Auftragsbezeichnung auswählen" #: rapid/glade3/rapid.ui.h:16 msgid "Translate this Application..." -msgstr "" +msgstr "Dieses Programm übersetzen ..." #: rapid/glade3/rapid.ui.h:17 msgid "Uncheck All" -msgstr "" +msgstr "Auswahl aufheben" #: rapid/glade3/rapid.ui.h:18 msgid "_Check All" -msgstr "" +msgstr "_Alle auswählen" #: rapid/glade3/rapid.ui.h:19 msgid "_Clear Completed Downloads" @@ -1150,7 +1338,7 @@ msgstr "_Heruntergeladene Dateien nicht mehr anzeigen" #: rapid/glade3/rapid.ui.h:20 msgid "_Download" -msgstr "" +msgstr "_Herunterladen" #: rapid/glade3/rapid.ui.h:21 msgid "_Error Log" @@ -1166,7 +1354,7 @@ msgstr "_Hilfe" #: rapid/glade3/rapid.ui.h:24 msgid "_Include in download" -msgstr "" +msgstr "_Datei herunterladen" #: rapid/glade3/rapid.ui.h:25 msgid "_Make a Donation..." @@ -1182,7 +1370,7 @@ msgstr "_Übersetzung der Applikation" #: rapid/glade3/rapid.ui.h:28 msgid "_Uncheck All" -msgstr "" +msgstr "A_uswahl aufheben" #: rapid/glade3/rapid.ui.h:29 msgid "_View" @@ -1282,7 +1470,7 @@ msgstr "<span weight=\"bold\" size=\"x-large\">Auftragsbezeichnungen</span>" #: rapid/glade3/prefs.ui.h:24 msgid "<span weight=\"bold\" size=\"x-large\">Miscellaneous</span>" -msgstr "" +msgstr "<span weight=\"bold\" size=\"x-large\">Verschiedenes</span>" #: rapid/glade3/prefs.ui.h:25 msgid "<span weight=\"bold\" size=\"x-large\">Photo Download Folders</span>" @@ -1398,11 +1586,11 @@ msgstr "Fehlerbehandlung" #: rapid/glade3/prefs.ui.h:50 msgid "Exit program even if download had warnings or errors" -msgstr "" +msgstr "Programm beenden auch wenn Fehler oder Warnungen aufgetreten sind" #: rapid/glade3/prefs.ui.h:51 msgid "Exit program when download completes" -msgstr "" +msgstr "Programm beenden wenn alles Downloads abgeschlossen sind" #: rapid/glade3/prefs.ui.h:52 msgid "If you disable automatic detection, choose the exact backup location." @@ -1438,7 +1626,7 @@ msgstr "Ort:" #: rapid/glade3/prefs.ui.h:57 msgid "Miscillaneous" -msgstr "" +msgstr "Verschiedenes" #: rapid/glade3/prefs.ui.h:58 msgid "Overwrite" @@ -1629,16 +1817,10 @@ msgstr "Importieren Sie Ihre Bilder und Filme schnell und zuverlässig" #~ msgid "Unique identifier '%s' added" #~ msgstr "Die eindeutige Bezeichnung '%s' wurde hinzugefügt" -#~ msgid "warnings" -#~ msgstr "Warnungen" - #, python-format #~ msgid "%s images skipped" #~ msgstr "%s Bilder übersprungen" -#~ msgid "Download cannot proceed" -#~ msgstr "Der Download kann nicht weitergeführt werden" - #~ msgid "errors" #~ msgstr "Fehler" @@ -1740,14 +1922,6 @@ msgstr "Importieren Sie Ihre Bilder und Filme schnell und zuverlässig" #, python-format #~ msgid "" -#~ "Source: %(source)s\n" -#~ "Destination: %(destination)s" -#~ msgstr "" -#~ "Quelle: %(source)s\n" -#~ "Ziel: %(destination)s" - -#, python-format -#~ msgid "" #~ "Destination directory could not be created\n" #~ "%(directory)s\n" #~ "Error: %(errno)s %(strerror)s" @@ -1800,12 +1974,6 @@ msgstr "Importieren Sie Ihre Bilder und Filme schnell und zuverlässig" #~ msgid "Using manually specified path" #~ msgstr "Verwende den manuell eingegebenen Pfad" -#~ msgid "MB/s" -#~ msgstr "MB/s" - -#~ msgid "All downloads complete" -#~ msgstr "Alle Downloads sind abgeschlossen" - #~ msgid "_Download " #~ msgstr "_Download " @@ -2014,13 +2182,6 @@ msgstr "Importieren Sie Ihre Bilder und Filme schnell und zuverlässig" #~ msgid "Preferences were modified." #~ msgstr "Die Voreinstellungen wurden geändert." -#, python-format -#~ msgid "About %i seconds remaining" -#~ msgstr "Etwa %i Sekunden verbleibend" - -#~ msgid "About 1 second remaining" -#~ msgstr "Etwa 1 Sekunde verbleibend" - #~ msgid "Automatically start download is false" #~ msgstr "Der automatische Downloadbeginn ist ausgeschaltet" @@ -2033,16 +2194,9 @@ msgstr "Importieren Sie Ihre Bilder und Filme schnell und zuverlässig" #~ msgid "images skipped" #~ msgstr "Bilder übersprungen" -#, python-format -#~ msgid "About %(minutes)i:%(seconds)02i minutes remaining" -#~ msgstr "Etwa %(minutes)i:%(seconds)02i Minuten verbleibend" - #~ msgid "images downloaded" #~ msgstr "Bilder heruntergeladen" -#~ msgid "About 1 minute remaining" -#~ msgstr "Etwa 1 Minute verbleibend" - #~ msgid "extension was specified but image name has no extension" #~ msgstr "" #~ "Erweiterung wurde angegeben, aber der Dateiname enthält keine Erweiterung" @@ -2137,10 +2291,6 @@ msgstr "Importieren Sie Ihre Bilder und Filme schnell und zuverlässig" #~ "Download stattfindet" #, python-format -#~ msgid "Source: %(source)s" -#~ msgstr "Quelle: %(source)s" - -#, python-format #~ msgid "Source: %s\n" #~ msgstr "Quelle: %s\n" @@ -2568,10 +2718,6 @@ msgstr "Importieren Sie Ihre Bilder und Filme schnell und zuverlässig" #~ msgstr "%(file_type)s wurde nicht gesichert" #, python-format -#~ msgid "%(noFiles)s %(filetypes)s downloaded" -#~ msgstr "%(noFiles)s %(filetypes)s heruntergeladen" - -#, python-format #~ msgid "%(noFiles)s %(filetypes)s skipped" #~ msgstr "%(noFiles)s %(filetypes)s übersprungen" @@ -2748,10 +2894,6 @@ msgstr "Importieren Sie Ihre Bilder und Filme schnell und zuverlässig" #~ "%(problem)s" #, python-format -#~ msgid "%(noFiles)s %(filetypes)s failed to download" -#~ msgstr "%(noFiles)s %(filetypes)s konnten nicht heruntergeladen werden" - -#, python-format #~ msgid "Attempting to download %s files" #~ msgstr "Versuche %s Dateien herunterzuladen" @@ -2774,16 +2916,9 @@ msgstr "Importieren Sie Ihre Bilder und Filme schnell und zuverlässig" #~ msgstr "_Meldung erneut anzeigen" #, python-format -#~ msgid "%(number)s of %(total)s %(filetypes)s (%(remaining)s remaining)" -#~ msgstr "%(number)s of %(total)s %(filetypes)s (%(remaining)s verbleibend)" - -#, python-format #~ msgid "Error: %(inst)s" #~ msgstr "Fehler: %(inst)s" -#~ msgid "Photo has already been downloaded" -#~ msgstr "Das Bild wurde bereits heruntergeladen" - #~ msgid "Please check your system and try again." #~ msgstr "Bitte überprüfen Sie Ihr System und versuchen Sie es erneut" @@ -2804,9 +2939,6 @@ msgstr "Importieren Sie Ihre Bilder und Filme schnell und zuverlässig" #~ msgid "File" #~ msgstr "Datei" -#~ msgid "Job Code" -#~ msgstr "Auftragsbezeichnung" - #~ msgid "Status" #~ msgstr "Status" @@ -2864,21 +2996,9 @@ msgstr "Importieren Sie Ihre Bilder und Filme schnell und zuverlässig" #~ msgid "_Download All" #~ msgstr "_Alle Herunterladen" -#, python-format -#~ msgid "%(number)s %(numberdownloaded)s" -#~ msgstr "%(number)s %(numberdownloaded)s" - -#, python-format -#~ msgid "%(filetype)s downloaded" -#~ msgstr "%(filetype)s heruntergeladen" - #~ msgid "D_ownload Selected" #~ msgstr "_Herunterladen ausgewählt" -#, python-format -#~ msgid "%(filetype)s failed to download" -#~ msgstr "%(filetype)s konnten nicht heruntergeladen werden" - #~ msgid "_Resume" #~ msgstr "_Fortsetzen" @@ -7,22 +7,22 @@ msgid "" msgstr "" "Project-Id-Version: rapid\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" -"POT-Creation-Date: 2011-03-20 18:23-0500\n" -"PO-Revision-Date: 2011-03-30 17:04+0000\n" +"POT-Creation-Date: 2011-04-10 19:59-0500\n" +"PO-Revision-Date: 2011-04-18 07:39+0000\n" "Last-Translator: A.J. Baudrez <a.baudrez@gmail.com>\n" "Language-Team: Dutch <nl@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-04-04 05:24+0000\n" -"X-Generator: Launchpad (build 12710)\n" +"X-Launchpad-Export-Date: 2011-04-21 06:12+0000\n" +"X-Generator: Launchpad (build 12883)\n" #. Translators: if neccessary, for guidance in how to translate this program, you may see http://damonlynch.net/translate.html -#: rapid/rapid.py:97 rapid/glade3/rapid.ui.h:11 +#: rapid/rapid.py:104 rapid/glade3/rapid.ui.h:11 msgid "Rapid Photo Downloader" msgstr "Rapid Photo Downloader" -#: rapid/rapid.py:102 +#: rapid/rapid.py:109 #, python-format msgid "" "%(date)s\n" @@ -31,16 +31,11 @@ msgstr "" "%(date)s\n" "%(time)s" -#: rapid/rapid.py:104 +#: rapid/rapid.py:111 #, python-format msgid "%(date)s %(time)s" msgstr "%(date)s %(time)s" -#: rapid/rapid.py:107 -#, python-format -msgid "%(hour)s:%(minute)s:%(second)s:%(subsecond)s" -msgstr "%(hour)s:%(minute)s:%(second)s:%(subsecond)s" - #: rapid/rapid.py:114 #, python-format msgid "%(date)s %(hour)s:%(minute)s:%(second)s:%(subsecond)s" @@ -48,66 +43,176 @@ msgstr "%(date)s %(hour)s:%(minute)s:%(second)s:%(subsecond)s" #. Device refers to a thing like a camera, memory card in its reader, #. external hard drive, Portable Storage Device, etc. -#: rapid/rapid.py:145 +#: rapid/rapid.py:148 msgid "Device" msgstr "Apparaat" #. Size refers to the total size of images on the device, typically in #. MB or GB -#: rapid/rapid.py:159 +#: rapid/rapid.py:165 msgid "Size" msgstr "Grootte" -#: rapid/rapid.py:162 +#: rapid/rapid.py:168 msgid "Download Progress" msgstr "Downloadvoortgang" +#: rapid/rapid.py:312 +#, python-format +msgid "%(device)s did not unmount" +msgstr "%(device)s werd niet ontkoppeld" + #. This refers to when a device like a hard drive is having its contents scanned, #. looking for photos or videos. It is visible initially in the progress bar for each device #. (which normally holds "x photos and videos"). #. It maybe displayed only briefly if the contents of the device being scanned is small. -#: rapid/rapid.py:938 +#: rapid/rapid.py:1091 msgid "scanning..." msgstr "Aan het scannen..." -#: rapid/rapid.py:1639 +#: rapid/rapid.py:1807 msgid "Download" msgstr "Download" -#: rapid/rapid.py:1642 +#: rapid/rapid.py:1810 msgid "Pause" msgstr "Pauze" -#. ~ scan_pid = rpd_file.scan_pid -#. ~ unique_id = rpd_file.unique_id -#: rapid/rapid.py:1906 +#: rapid/rapid.py:1912 #, python-format -msgid "%(number)s of %(total)s %(filetypes)s" -msgstr "%(number)s van %(total)s %(filetypes)s" +msgid "" +"These download folders are invalid:\n" +"%(folder1)s\n" +"%(folder2)s" +msgstr "" +"Deze downloadmappen zijn ongeldig:\n" +"%(folder1)s\n" +"%(folder2)s" -#: rapid/rapid.py:2239 rapid/preferencesdialog.py:817 rapid/rpdfile.py:118 -msgid "photos" -msgstr "foto's" +#: rapid/rapid.py:1915 +#, python-format +msgid "" +"This download folder is invalid:\n" +"%s" +msgstr "" +"Deze downloadmap is ongeldig:\n" +"%s" + +#: rapid/rapid.py:1916 +msgid "Download cannot proceed" +msgstr "Download kan niet plaatsgrijpen" + +#: rapid/rapid.py:2130 +msgid "About 1 second remaining" +msgstr "Ongeveer 1 seconde te gaan" + +#: rapid/rapid.py:2132 +#, python-format +msgid "About %i seconds remaining" +msgstr "Ongeveer %i seconden te gaan" + +#: rapid/rapid.py:2134 +msgid "About 1 minute remaining" +msgstr "Ongeveer 1 minuut te gaan" + +#. Translators: in the text '%(minutes)i:%(seconds)02i', only the : should be translated, if needed. +#. '%(minutes)i' and '%(seconds)02i' should not be modified or left out. They are used to format and display the amount +#. of time the download has remainging, e.g. 'About 5:36 minutes remaining' +#: rapid/rapid.py:2139 +#, python-format +msgid "About %(minutes)i:%(seconds)02i minutes remaining" +msgstr "Ongeveer %(minutes)i:%(seconds)02i minuten te gaan" + +#: rapid/rapid.py:2151 rapid/preferencesdialog.py:822 rapid/rpdfile.py:110 +msgid "photos and videos" +msgstr "foto's en video's" + +#: rapid/rapid.py:2153 rapid/rpdfile.py:112 +msgid "photos or videos" +msgstr "foto's of video's" -#: rapid/rapid.py:2241 rapid/rpdfile.py:113 +#: rapid/rapid.py:2156 rapid/rapid.py:2661 rapid/rpdfile.py:115 msgid "videos" msgstr "video's" -#: rapid/rapid.py:2244 +#: rapid/rapid.py:2158 rapid/preferencesdialog.py:1371 rapid/rpdfile.py:117 +#: rapid/rpdfile.py:266 +msgid "video" +msgstr "video" + +#: rapid/rapid.py:2161 rapid/rapid.py:2659 rapid/preferencesdialog.py:824 +#: rapid/rpdfile.py:120 +msgid "photos" +msgstr "foto's" + +#. check subfolder preferences for bad values +#: rapid/rapid.py:2163 rapid/preferencesdialog.py:1370 rapid/rpdfile.py:122 +#: rapid/rpdfile.py:246 +msgid "photo" +msgstr "foto" + +#: rapid/rapid.py:2188 +#, python-format +msgid "%(noFiles)s %(filetypes)s downloaded" +msgstr "%(noFiles)s %(filetypes)s gedownload" + +#: rapid/rapid.py:2192 +#, python-format +msgid "%(noFiles)s %(filetypes)s failed to download" +msgstr "%(noFiles)s %(filetypes)s kon niet gedownload worden" + +#: rapid/rapid.py:2195 rapid/rapid.py:2247 +msgid "warnings" +msgstr "verwittigingen" + +#: rapid/rapid.py:2204 +msgid "All downloads complete" +msgstr "Alle downloads zijn afgelopen" + +#: rapid/rapid.py:2210 rapid/rapid.py:2219 rapid/rapid.py:2228 +#: rapid/rapid.py:2237 rapid/rapid.py:2245 +#, python-format +msgid "%(number)s %(numberdownloaded)s" +msgstr "%(number)s %(numberdownloaded)s" + +#: rapid/rapid.py:2212 rapid/rapid.py:2230 +#, python-format +msgid "%(filetype)s downloaded" +msgstr "%(filetype)s gedownload" + +#: rapid/rapid.py:2221 rapid/rapid.py:2239 +#, python-format +msgid "%(filetype)s failed to download" +msgstr "%(filetype)s werden niet gedownload" + +#. e.g.: 3 of 205 photos and videos (202 remaining) +#: rapid/rapid.py:2276 +#, python-format +msgid "%(number)s of %(total)s %(filetypes)s (%(remaining)s remaining)" +msgstr "" +"%(number)s van de %(total)s %(filetypes)s (%(remaining)s blijven over)" + +#. e.g.: 205 of 205 photos and videos +#: rapid/rapid.py:2283 +#, python-format +msgid "%(number)s of %(total)s %(filetypes)s" +msgstr "%(number)s van %(total)s %(filetypes)s" + +#: rapid/rapid.py:2665 msgid "Free space:" msgstr "Vrije ruimte:" #. (videos) or (photos) will be appended to the free space message displayed to the #. user in the status bar. #. you should only translate this if your language does not use parantheses -#: rapid/rapid.py:2256 +#: rapid/rapid.py:2677 #, python-format msgid "(%(file_type)s)" msgstr "(%(file_type)s)" #. Freespace available on the filesystem for downloading to #. Displayed in status bar message on main window -#: rapid/rapid.py:2260 +#: rapid/rapid.py:2681 #, python-format msgid "%(free)s %(file_type)s" msgstr "%(free)s %(file_type)s" @@ -115,43 +220,75 @@ msgstr "%(free)s %(file_type)s" #. Inserted in the middle of the statusbar message concerning the amount of freespace #. Used to differentiate between two different file systems #. e.g. Free space: 21.3GB (photos); 14.7GB (videos). -#: rapid/rapid.py:2265 +#: rapid/rapid.py:2686 msgid "; " msgstr "; " #. Inserted at the end of the statusbar message concerning the amount of freespace #. Used to differentiate between two different file systems #. e.g. Free space: 21.3GB (photos); 14.7GB (videos). -#: rapid/rapid.py:2270 +#: rapid/rapid.py:2691 msgid "." msgstr "." #. Freespace available on the filesystem for downloading to #. Displayed in status bar message on main window #. e.g. 14.7GB available -#: rapid/rapid.py:2276 +#: rapid/rapid.py:2697 #, python-format msgid "%(free)s free" msgstr "%(free)s vrij" #. user manually specified backup location -#: rapid/rapid.py:2282 +#: rapid/rapid.py:2703 #, python-format msgid "Backing up to %(path)s" msgstr "Backuppen naar %(path)s" -#: rapid/rapid.py:2287 +#: rapid/rapid.py:2708 #, python-format msgid "%(freespace)s. %(backuppaths)s." msgstr "%(freespace)s. %(backuppaths)s." -#: rapid/rapid.py:2470 +#: rapid/rapid.py:2737 +msgid "Program preferences are invalid" +msgstr "Programma voorkeuren zijn ongeldig" + +#: rapid/rapid.py:2842 rapid/rpdfile.py:247 +msgid "Photo" +msgstr "Foto" + +#: rapid/rapid.py:2844 rapid/rpdfile.py:267 +msgid "Video" +msgstr "Video" + +#: rapid/rapid.py:2853 +#, python-format +msgid "%(file_type)s download folder does not exist" +msgstr "%(file_type)s downloadmap bestaat niet" + +#: rapid/rapid.py:2855 rapid/rapid.py:2869 rapid/rapid.py:2882 +#, python-format +msgid "Folder: %s" +msgstr "Map: %s" + +#: rapid/rapid.py:2867 +#, python-format +msgid "%(file_type)s download folder is invalid" +msgstr "%(file_type)s downloadmap is ongeldig" + +#: rapid/rapid.py:2880 +#, python-format +msgid "%(file_type)s download folder is not writable" +msgstr "%(file_type)s downloadmap is niet beschrijfbaar" + +#: rapid/rapid.py:2958 msgid "Thumbnails" msgstr "Miniaturen" #. Translators: this text is displayed to the user when they request information on the command line options. #. The text %default should not be modified or left out. -#: rapid/rapid.py:2511 +#: rapid/rapid.py:3005 #, python-format msgid "" "display program information on the command line as the program runs " @@ -160,43 +297,43 @@ msgstr "" "vertoon programma informatie op de commando lijn wanneer het programma " "draait (standaard: %default)" -#: rapid/rapid.py:2512 +#: rapid/rapid.py:3006 msgid "display debugging information when run from the command line" msgstr "vertoon debug informatie wanneer uitgevoerd vanop de commando prompt" -#: rapid/rapid.py:2513 +#: rapid/rapid.py:3007 msgid "only output errors to the command line" msgstr "alleen fouten naar de commandolijn sturen" #. image file extensions are recognized RAW files plus TIFF and JPG -#: rapid/rapid.py:2515 +#: rapid/rapid.py:3009 msgid "list photo and video file extensions the program recognizes and exit" msgstr "" "vertoon de foto en video bestandsextenties welke het programma herkent en " "verlaat het programma" -#: rapid/rapid.py:2516 +#: rapid/rapid.py:3010 msgid "reset all program settings and preferences and exit" msgstr "reset alle programma instellingen en verlaat het programma" -#: rapid/rapid.py:2529 +#: rapid/rapid.py:3023 msgid "Photos:" msgstr "Foto's:" -#: rapid/rapid.py:2529 +#: rapid/rapid.py:3023 msgid "Videos:" msgstr "Video's:" -#: rapid/rapid.py:2534 +#: rapid/rapid.py:3028 #, python-format msgid "and %s" msgstr "en %s" -#: rapid/rapid.py:2542 +#: rapid/rapid.py:3036 msgid "All settings and preferences have been reset" msgstr "Alle instellingen en voorkeuren werden gereset" -#: rapid/rapid.py:2551 +#: rapid/rapid.py:3045 msgid "" "Video downloading functionality disabled.\n" "To download videos, please install the hachoir metadata and kaa metadata " @@ -206,6 +343,16 @@ msgstr "" "Om video's te downloaden moet u de hachoir metadata en de kaa metadata " "pakketten voor python installeren." +#: rapid/copyfiles.py:142 rapid/subfolderfile.py:209 +#: rapid/subfolderfile.py:332 rapid/subfolderfile.py:350 +#, python-format +msgid "" +"%(problem)s\n" +"File: %(file)s" +msgstr "" +"%(problem)s\n" +"Bestand: %(file)s" + #: rapid/device.py:79 msgid "Device Detected" msgstr "Apparaat gedetecteerd" @@ -223,6 +370,10 @@ msgstr "" msgid "_Remember this choice" msgstr "_Herinner deze keuze" +#: rapid/downloadtracker.py:217 +msgid "MB/s" +msgstr "MB/s" + #: rapid/generatenameconfig.py:143 msgid "Date time" msgstr "Datum/tijd" @@ -244,7 +395,7 @@ msgid "Sequences" msgstr "Reeksen" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode -#: rapid/generatenameconfig.py:149 rapid/preferencesdialog.py:545 +#: rapid/generatenameconfig.py:149 rapid/preferencesdialog.py:549 msgid "Job code" msgstr "Job code" @@ -566,89 +717,89 @@ msgstr "MM (minuten)" msgid "SS" msgstr "SS" -#: rapid/preferencesdialog.py:364 +#: rapid/preferencesdialog.py:370 #, python-format msgid "Subfolder preferences should not start with a %s" msgstr "Submap voorkeuren mogen niet starten met een %s" -#: rapid/preferencesdialog.py:366 +#: rapid/preferencesdialog.py:372 #, python-format msgid "Subfolder preferences should not end with a %s" msgstr "Submap voorkeuren mogen niet eindigen op een %s" -#: rapid/preferencesdialog.py:370 +#: rapid/preferencesdialog.py:376 #, python-format msgid "Subfolder preferences should not contain two %s one after the other" msgstr "Submap voorkeuren mogen geen twee opeenvolgende %s bevatten" -#: rapid/preferencesdialog.py:384 rapid/preferencesdialog.py:668 +#: rapid/preferencesdialog.py:389 rapid/preferencesdialog.py:672 msgid "Remove all Job Codes?" msgstr "Verwijder alle Job Codes?" -#: rapid/preferencesdialog.py:401 rapid/preferencesdialog.py:685 +#: rapid/preferencesdialog.py:406 rapid/preferencesdialog.py:689 msgid "Should all Job Codes be removed?" msgstr "Moeten alle Job Codes verwijderd worden?" -#: rapid/preferencesdialog.py:431 +#: rapid/preferencesdialog.py:436 msgid "Error in Photo Rename preferences" msgstr "Fout in de voorkeuren van Foto Hernoemen" -#: rapid/preferencesdialog.py:613 +#: rapid/preferencesdialog.py:617 msgid "Error in Video Rename preferences" msgstr "Fout in de voorkeuren Video Hernoemen" -#: rapid/preferencesdialog.py:634 +#: rapid/preferencesdialog.py:638 msgid "Error in Photo Download Subfolders preferences" msgstr "Fout in de voorkeuren van Photo Download Subfolders" -#: rapid/preferencesdialog.py:651 +#: rapid/preferencesdialog.py:655 msgid "Error in Video Download Subfolders preferences" msgstr "Fout in de voorkeuren Video Download Subfolders" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode -#: rapid/preferencesdialog.py:710 +#: rapid/preferencesdialog.py:714 msgid "Enter a Job Code" msgstr "Geef een Job Code op" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode -#: rapid/preferencesdialog.py:727 +#: rapid/preferencesdialog.py:731 msgid "Enter a new Job Code, or select a previous one" msgstr "Geef een nieuwe Job Code in of selecteer een bestaande" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode -#: rapid/preferencesdialog.py:730 +#: rapid/preferencesdialog.py:734 msgid "Enter a new Job Code" msgstr "Geef een nieuwe Job Code in" -#: rapid/preferencesdialog.py:735 +#: rapid/preferencesdialog.py:739 msgid "Job Code:" msgstr "Job Code:" -#: rapid/preferencesdialog.py:815 rapid/rpdfile.py:108 -msgid "photos and videos" -msgstr "foto's en video's" +#: rapid/preferencesdialog.py:915 +msgid "Job Code" +msgstr "Job Code" -#: rapid/preferencesdialog.py:964 +#: rapid/preferencesdialog.py:997 msgid "Select a folder to download photos to" msgstr "Duid een map aan om de foto's naar toe te downloaden" -#: rapid/preferencesdialog.py:982 +#: rapid/preferencesdialog.py:1015 msgid "Select a folder to download videos to" msgstr "Selecteer een folder om de video's naar toe te downloaden" -#: rapid/preferencesdialog.py:1064 +#: rapid/preferencesdialog.py:1106 #, python-format msgid "Select a folder containing %(file_types)s" msgstr "Selecteer een map die %(file_types)s bevat" -#: rapid/preferencesdialog.py:1086 +#: rapid/preferencesdialog.py:1128 #, python-format msgid "Select a folder in which to backup %(file_types)s" msgstr "" "Selecteer een map waar %(file_types)s naar toe gebackuped moeten worden" #. Translators: please do not modify or leave out html formatting tags like <i> and <b>. These are used to format the text the users sees -#: rapid/preferencesdialog.py:1172 +#: rapid/preferencesdialog.py:1212 msgid "" "<i><b>Warning:</b> There is insufficient metadata to fully generate the " "name. Please use other renaming options.</i>" @@ -656,7 +807,7 @@ msgstr "" "<i><b>Opgepast:</b> Er is onvoldoende metadata om een volledige naam aan te " "maken. Gelieve andere hernoemings opties te gebruiken.</i>" -#: rapid/preferencesdialog.py:1211 +#: rapid/preferencesdialog.py:1263 msgid "" "<i><b>Warning:</b> There is insufficient metadata to fully generate " "subfolders. Please use other subfolder naming options.</i>" @@ -665,13 +816,13 @@ msgstr "" "te maken. Kies andere subfolder benoemings opties.</i>" #. Translators: you should not modify or leave out the %s. This is a code used by the programming language python to insert a value that thes user will see -#: rapid/preferencesdialog.py:1215 +#: rapid/preferencesdialog.py:1266 #, python-format msgid "<i>Example: %s</i>" msgstr "<i>Voorbeeld: %s</i>" #. Preferences list is now empty -#: rapid/preferencesdialog.py:1291 +#: rapid/preferencesdialog.py:1356 #, python-format msgid "" "The %(filetype)s subfolder preferences entered are invalid and cannot be " @@ -682,22 +833,13 @@ msgstr "" "gebruikt worden.\n" "Ze zullen naar de standaard waardes worden teruggezet." -#. check subfolder preferences for bad values -#: rapid/preferencesdialog.py:1305 rapid/rpdfile.py:120 rapid/rpdfile.py:241 -msgid "photo" -msgstr "foto" - -#: rapid/preferencesdialog.py:1306 rapid/rpdfile.py:115 rapid/rpdfile.py:267 -msgid "video" -msgstr "video" - #. Translators: this value is used as an example device when automatic backup device detection is enabled. You should translate this. -#: rapid/preferencesdialog.py:1566 +#: rapid/preferencesdialog.py:1642 msgid "externaldrive1" msgstr "extern apparaat 1" #. Translators: this value is used as an example device when automatic backup device detection is enabled. You should translate this. -#: rapid/preferencesdialog.py:1568 +#: rapid/preferencesdialog.py:1644 msgid "externaldrive2" msgstr "extern apparaat 2" @@ -774,11 +916,11 @@ msgid "Stockholm" msgstr "Stockholm" #. components -#: rapid/problemnotification.py:26 rapid/subfolderfile.py:181 +#: rapid/problemnotification.py:26 rapid/subfolderfile.py:343 msgid "subfolder" msgstr "subfolder" -#: rapid/problemnotification.py:27 rapid/subfolderfile.py:179 +#: rapid/problemnotification.py:27 rapid/subfolderfile.py:341 msgid "filename" msgstr "bestandsnaam" @@ -1039,7 +1181,7 @@ msgstr "" msgid "Multiple problems were encountered" msgstr "Meerdere problemen tegengekomen" -#: rapid/problemnotification.py:403 +#: rapid/problemnotification.py:403 rapid/subfolderfile.py:228 msgid "Photos detected with the same filenames, but taken at different times" msgstr "" "Foto's gevonden met dezelfde bestandsnaam, maar op een verschillend tijdstip " @@ -1067,27 +1209,47 @@ msgstr "Er was een fout tijdens het backuppen" msgid "%(previousproblem)s, and %(backinguperror)s" msgstr "%(previousproblem)s, en %(backinguperror)s" -#: rapid/rpdfile.py:110 -msgid "photos or videos" -msgstr "foto's of video's" - -#: rapid/rpdfile.py:134 +#: rapid/rpdfile.py:136 #, python-format msgid "%(number)s %(filetypes)s" msgstr "%(number)s %(filetypes)s" -#: rapid/rpdfile.py:242 -msgid "Photo" -msgstr "Foto" +#: rapid/subfolderfile.py:79 +#, python-format +msgid "%(hour)s:%(minute)s:%(second)s:%(subsecond)s" +msgstr "%(hour)s:%(minute)s:%(second)s:%(subsecond)s" -#: rapid/rpdfile.py:268 -msgid "Video" -msgstr "Video" +#: rapid/subfolderfile.py:194 +#, python-format +msgid "" +"Source: %(source)s\n" +"Destination: %(destination)s" +msgstr "" +"Bron: %(source)s\n" +"Doel: %(destination)s" -#: rapid/subfolderfile.py:177 +#: rapid/subfolderfile.py:297 +msgid "Photo has already been downloaded" +msgstr "Foto werd al eens gedownload" + +#: rapid/subfolderfile.py:298 +#, python-format +msgid "Source: %(source)s" +msgstr "Bron: %(source)s" + +#: rapid/subfolderfile.py:339 msgid "subfolder and filename" msgstr "subfolder en bestandsnaam" +#: rapid/subfolderfile.py:377 +msgid "Failed to create download subfolder" +msgstr "Kon downloadmap niet aanmaken" + +#: rapid/subfolderfile.py:378 +#, python-format +msgid "Path: %s" +msgstr "Pad: %s" + #: rapid/glade3/rapid.ui.h:1 msgid "About..." msgstr "Over..." @@ -1615,9 +1777,6 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ msgid "There is an error in the program preferences." #~ msgstr "Er is een fout in de programma voorkeuren." -#~ msgid "Download cannot proceed" -#~ msgstr "Download kan niet plaatsgrijpen" - #, python-format #~ msgid "0 of %s images copied" #~ msgstr "0 van %s afbeeldingen gekopieerd" @@ -1676,14 +1835,6 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ msgstr "Afbeelding heeft geen metadata" #, python-format -#~ msgid "" -#~ "Source: %(source)s\n" -#~ "Destination: %(destination)s" -#~ msgstr "" -#~ "Bron: %(source)s\n" -#~ "Doel: %(destination)s" - -#, python-format #~ msgid "Unique identifier '%s' added" #~ msgstr "Unieke identifier '%s' toegevoegd" @@ -1740,9 +1891,6 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ msgid "%s images skipped" #~ msgstr "%s afbeeldingen overgeslaan" -#~ msgid "warnings" -#~ msgstr "verwittigingen" - #~ msgid "errors" #~ msgstr "fouten" @@ -1895,23 +2043,6 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ msgid "Automatically start download is false" #~ msgstr "Automatisch opstarten download is onwaar" -#~ msgid "MB/s" -#~ msgstr "MB/s" - -#~ msgid "About 1 second remaining" -#~ msgstr "Ongeveer 1 seconde te gaan" - -#, python-format -#~ msgid "About %i seconds remaining" -#~ msgstr "Ongeveer %i seconden te gaan" - -#~ msgid "About 1 minute remaining" -#~ msgstr "Ongeveer 1 minuut te gaan" - -#, python-format -#~ msgid "About %(minutes)i:%(seconds)02i minutes remaining" -#~ msgstr "Ongeveer %(minutes)i:%(seconds)02i minuten te gaan" - #~ msgid "_Download " #~ msgstr "_Download " @@ -2176,9 +2307,6 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ msgid "Using backup devices" #~ msgstr "Backup apparaten aan het gebruiken" -#~ msgid "All downloads complete" -#~ msgstr "Alle downloads zijn afgelopen" - #~ msgid "Preferences were changed." #~ msgstr "Voorkeuren werden aangepast." @@ -2323,10 +2451,6 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ "tijdstip genomen" #, python-format -#~ msgid "Source: %(source)s" -#~ msgstr "Bron: %(source)s" - -#, python-format #~ msgid "" #~ "First image: %(image1)s %(image1_date_time)s:%(image1_subseconds)s\n" #~ "Second image: %(image2)s %(image2_date_time)s:%(image2_subseconds)s" @@ -2519,10 +2643,6 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ "Probleem: %(problem)s" #, python-format -#~ msgid "%(noFiles)s %(filetypes)s downloaded" -#~ msgstr "%(noFiles)s %(filetypes)s gedownload" - -#, python-format #~ msgid "%(noFiles)s %(filetypes)s skipped" #~ msgstr "%(noFiles)s %(filetypes)s overgeslagen" @@ -2730,10 +2850,6 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ "Doel: %(destination)s\n" #~ "%(problem)s" -#, python-format -#~ msgid "%(noFiles)s %(filetypes)s failed to download" -#~ msgstr "%(noFiles)s %(filetypes)s kon niet gedownload worden" - #~ msgid "" #~ "Downloading from a card reader always works and is generally much faster. It " #~ "is strongly recommended to use a card reader." @@ -2753,17 +2869,9 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ msgstr "_Toon dit bericht opnieuw" #, python-format -#~ msgid "%(number)s of %(total)s %(filetypes)s (%(remaining)s remaining)" -#~ msgstr "" -#~ "%(number)s van de %(total)s %(filetypes)s (%(remaining)s blijven over)" - -#, python-format #~ msgid "Attempting to download %s files" #~ msgstr "Proberen om %s bestanden te downloaden" -#~ msgid "Photo has already been downloaded" -#~ msgstr "Foto werd al eens gedownload" - #~ msgid "Please check your system and try again." #~ msgstr "Controlleer je systeem en probeer opnieuw" @@ -2835,14 +2943,6 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ msgstr "_Alles Downloaden" #, python-format -#~ msgid "%(number)s %(numberdownloaded)s" -#~ msgstr "%(number)s %(numberdownloaded)s" - -#, python-format -#~ msgid "%(filetype)s downloaded" -#~ msgstr "%(filetype)s gedownload" - -#, python-format #~ msgid "Warning: backup device %(device)s is currently being downloaded from" #~ msgstr "" #~ "Opmerking: er wordt momenteel gedownload vanaf backup apparaat %(device)s" @@ -2850,10 +2950,6 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ msgid "D_ownload Selected" #~ msgstr "D_ownload geselecteerd" -#, python-format -#~ msgid "%(filetype)s failed to download" -#~ msgstr "%(filetype)s werden niet gedownload" - #~ msgid "_Resume" #~ msgstr "_Hervatten" @@ -2905,9 +3001,6 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ msgid "_Type" #~ msgstr "_Type" -#~ msgid "Job Code" -#~ msgstr "Job Code" - #, python-format #~ msgid "Error: %(inst)s" #~ msgstr "Fout: %(inst)s" diff --git a/po/pt_BR.po b/po/pt_BR.po index be6f68e..519a6cb 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -7,22 +7,22 @@ msgid "" msgstr "" "Project-Id-Version: rapid\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" -"POT-Creation-Date: 2011-03-20 18:23-0500\n" -"PO-Revision-Date: 2011-03-25 01:53+0000\n" -"Last-Translator: Júlio Cezar Santos Pires <Unknown>\n" +"POT-Creation-Date: 2011-04-10 19:59-0500\n" +"PO-Revision-Date: 2011-04-11 01:47+0000\n" +"Last-Translator: Marco <marcodefreitas@gmail.com>\n" "Language-Team: Brazilian Portuguese <pt_BR@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-04-04 05:24+0000\n" -"X-Generator: Launchpad (build 12710)\n" +"X-Launchpad-Export-Date: 2011-04-21 06:12+0000\n" +"X-Generator: Launchpad (build 12883)\n" #. Translators: if neccessary, for guidance in how to translate this program, you may see http://damonlynch.net/translate.html -#: rapid/rapid.py:97 rapid/glade3/rapid.ui.h:11 +#: rapid/rapid.py:104 rapid/glade3/rapid.ui.h:11 msgid "Rapid Photo Downloader" msgstr "Rapid Photo Downloader" -#: rapid/rapid.py:102 +#: rapid/rapid.py:109 #, python-format msgid "" "%(date)s\n" @@ -31,16 +31,11 @@ msgstr "" "%(date)s\n" "%(time)s" -#: rapid/rapid.py:104 +#: rapid/rapid.py:111 #, python-format msgid "%(date)s %(time)s" msgstr "%(date)s %(time)s" -#: rapid/rapid.py:107 -#, python-format -msgid "%(hour)s:%(minute)s:%(second)s:%(subsecond)s" -msgstr "%(hour)s:%(minute)s:%(second)s:%(subsecond)s" - #: rapid/rapid.py:114 #, python-format msgid "%(date)s %(hour)s:%(minute)s:%(second)s:%(subsecond)s" @@ -48,66 +43,170 @@ msgstr "%(date)s %(hour)s:%(minute)s:%(second)s:%(subsecond)s" #. Device refers to a thing like a camera, memory card in its reader, #. external hard drive, Portable Storage Device, etc. -#: rapid/rapid.py:145 +#: rapid/rapid.py:148 msgid "Device" msgstr "Dispositivo" #. Size refers to the total size of images on the device, typically in #. MB or GB -#: rapid/rapid.py:159 +#: rapid/rapid.py:165 msgid "Size" msgstr "Tamanho" -#: rapid/rapid.py:162 +#: rapid/rapid.py:168 msgid "Download Progress" msgstr "Progresso da transferência" +#: rapid/rapid.py:312 +#, python-format +msgid "%(device)s did not unmount" +msgstr "" + #. This refers to when a device like a hard drive is having its contents scanned, #. looking for photos or videos. It is visible initially in the progress bar for each device #. (which normally holds "x photos and videos"). #. It maybe displayed only briefly if the contents of the device being scanned is small. -#: rapid/rapid.py:938 +#: rapid/rapid.py:1091 msgid "scanning..." msgstr "verificando..." -#: rapid/rapid.py:1639 +#: rapid/rapid.py:1807 msgid "Download" msgstr "" -#: rapid/rapid.py:1642 +#: rapid/rapid.py:1810 msgid "Pause" msgstr "" -#. ~ scan_pid = rpd_file.scan_pid -#. ~ unique_id = rpd_file.unique_id -#: rapid/rapid.py:1906 +#: rapid/rapid.py:1912 #, python-format -msgid "%(number)s of %(total)s %(filetypes)s" -msgstr "%(number)s de %(total)s %(filetypes)s" +msgid "" +"These download folders are invalid:\n" +"%(folder1)s\n" +"%(folder2)s" +msgstr "" -#: rapid/rapid.py:2239 rapid/preferencesdialog.py:817 rapid/rpdfile.py:118 -msgid "photos" -msgstr "fotos" +#: rapid/rapid.py:1915 +#, python-format +msgid "" +"This download folder is invalid:\n" +"%s" +msgstr "" + +#: rapid/rapid.py:1916 +msgid "Download cannot proceed" +msgstr "A descarga não pôde ser levada a cabo" + +#: rapid/rapid.py:2130 +msgid "About 1 second remaining" +msgstr "Faltando 1 segundo aproximadamente" + +#: rapid/rapid.py:2132 +#, python-format +msgid "About %i seconds remaining" +msgstr "Faltando %i segundos aproximadamente" + +#: rapid/rapid.py:2134 +msgid "About 1 minute remaining" +msgstr "Faltando 1 minuto aproximadamente" + +#. Translators: in the text '%(minutes)i:%(seconds)02i', only the : should be translated, if needed. +#. '%(minutes)i' and '%(seconds)02i' should not be modified or left out. They are used to format and display the amount +#. of time the download has remainging, e.g. 'About 5:36 minutes remaining' +#: rapid/rapid.py:2139 +#, python-format +msgid "About %(minutes)i:%(seconds)02i minutes remaining" +msgstr "Faltando %(minutes)i:%(seconds)02i minutos aproximadamente" -#: rapid/rapid.py:2241 rapid/rpdfile.py:113 +#: rapid/rapid.py:2151 rapid/preferencesdialog.py:822 rapid/rpdfile.py:110 +msgid "photos and videos" +msgstr "fotos e vídeos" + +#: rapid/rapid.py:2153 rapid/rpdfile.py:112 +msgid "photos or videos" +msgstr "fotos ou vídeos" + +#: rapid/rapid.py:2156 rapid/rapid.py:2661 rapid/rpdfile.py:115 msgid "videos" msgstr "vídeos" -#: rapid/rapid.py:2244 +#: rapid/rapid.py:2158 rapid/preferencesdialog.py:1371 rapid/rpdfile.py:117 +#: rapid/rpdfile.py:266 +msgid "video" +msgstr "vídeo" + +#: rapid/rapid.py:2161 rapid/rapid.py:2659 rapid/preferencesdialog.py:824 +#: rapid/rpdfile.py:120 +msgid "photos" +msgstr "fotos" + +#. check subfolder preferences for bad values +#: rapid/rapid.py:2163 rapid/preferencesdialog.py:1370 rapid/rpdfile.py:122 +#: rapid/rpdfile.py:246 +msgid "photo" +msgstr "foto" + +#: rapid/rapid.py:2188 +#, python-format +msgid "%(noFiles)s %(filetypes)s downloaded" +msgstr "%(noFiles)s %(filetypes)s descarregados" + +#: rapid/rapid.py:2192 +#, python-format +msgid "%(noFiles)s %(filetypes)s failed to download" +msgstr "%(noFiles)s %(filetypes)s não puderam ser descarregados" + +#: rapid/rapid.py:2195 rapid/rapid.py:2247 +msgid "warnings" +msgstr "avisos" + +#: rapid/rapid.py:2204 +msgid "All downloads complete" +msgstr "Todos os downloads completos" + +#: rapid/rapid.py:2210 rapid/rapid.py:2219 rapid/rapid.py:2228 +#: rapid/rapid.py:2237 rapid/rapid.py:2245 +#, python-format +msgid "%(number)s %(numberdownloaded)s" +msgstr "%(number)s %(numberdownloaded)s" + +#: rapid/rapid.py:2212 rapid/rapid.py:2230 +#, python-format +msgid "%(filetype)s downloaded" +msgstr "%(filetype)s downloaded" + +#: rapid/rapid.py:2221 rapid/rapid.py:2239 +#, python-format +msgid "%(filetype)s failed to download" +msgstr "" + +#. e.g.: 3 of 205 photos and videos (202 remaining) +#: rapid/rapid.py:2276 +#, python-format +msgid "%(number)s of %(total)s %(filetypes)s (%(remaining)s remaining)" +msgstr "%(number)s de %(total)s %(filetypes)s (%(remaining)s restantes)" + +#. e.g.: 205 of 205 photos and videos +#: rapid/rapid.py:2283 +#, python-format +msgid "%(number)s of %(total)s %(filetypes)s" +msgstr "%(number)s de %(total)s %(filetypes)s" + +#: rapid/rapid.py:2665 msgid "Free space:" msgstr "Espaço livre:" #. (videos) or (photos) will be appended to the free space message displayed to the #. user in the status bar. #. you should only translate this if your language does not use parantheses -#: rapid/rapid.py:2256 +#: rapid/rapid.py:2677 #, python-format msgid "(%(file_type)s)" msgstr "" #. Freespace available on the filesystem for downloading to #. Displayed in status bar message on main window -#: rapid/rapid.py:2260 +#: rapid/rapid.py:2681 #, python-format msgid "%(free)s %(file_type)s" msgstr "" @@ -115,91 +214,131 @@ msgstr "" #. Inserted in the middle of the statusbar message concerning the amount of freespace #. Used to differentiate between two different file systems #. e.g. Free space: 21.3GB (photos); 14.7GB (videos). -#: rapid/rapid.py:2265 +#: rapid/rapid.py:2686 msgid "; " msgstr "; " #. Inserted at the end of the statusbar message concerning the amount of freespace #. Used to differentiate between two different file systems #. e.g. Free space: 21.3GB (photos); 14.7GB (videos). -#: rapid/rapid.py:2270 +#: rapid/rapid.py:2691 msgid "." msgstr "." #. Freespace available on the filesystem for downloading to #. Displayed in status bar message on main window #. e.g. 14.7GB available -#: rapid/rapid.py:2276 +#: rapid/rapid.py:2697 #, python-format msgid "%(free)s free" msgstr "" #. user manually specified backup location -#: rapid/rapid.py:2282 +#: rapid/rapid.py:2703 #, python-format msgid "Backing up to %(path)s" msgstr "A criar cópias de segurança em %(path)s" -#: rapid/rapid.py:2287 +#: rapid/rapid.py:2708 #, python-format msgid "%(freespace)s. %(backuppaths)s." msgstr "%(freespace)s. %(backuppaths)s." -#: rapid/rapid.py:2470 +#: rapid/rapid.py:2737 +msgid "Program preferences are invalid" +msgstr "" + +#: rapid/rapid.py:2842 rapid/rpdfile.py:247 +msgid "Photo" +msgstr "Fotografia" + +#: rapid/rapid.py:2844 rapid/rpdfile.py:267 +msgid "Video" +msgstr "Vídeo" + +#: rapid/rapid.py:2853 +#, python-format +msgid "%(file_type)s download folder does not exist" +msgstr "" + +#: rapid/rapid.py:2855 rapid/rapid.py:2869 rapid/rapid.py:2882 +#, python-format +msgid "Folder: %s" +msgstr "" + +#: rapid/rapid.py:2867 +#, python-format +msgid "%(file_type)s download folder is invalid" +msgstr "" + +#: rapid/rapid.py:2880 +#, python-format +msgid "%(file_type)s download folder is not writable" +msgstr "" + +#: rapid/rapid.py:2958 msgid "Thumbnails" msgstr "Miniaturas" #. Translators: this text is displayed to the user when they request information on the command line options. #. The text %default should not be modified or left out. -#: rapid/rapid.py:2511 +#: rapid/rapid.py:3005 #, python-format msgid "" "display program information on the command line as the program runs " "(default: %default)" msgstr "" -#: rapid/rapid.py:2512 +#: rapid/rapid.py:3006 msgid "display debugging information when run from the command line" msgstr "" -#: rapid/rapid.py:2513 +#: rapid/rapid.py:3007 msgid "only output errors to the command line" msgstr "" #. image file extensions are recognized RAW files plus TIFF and JPG -#: rapid/rapid.py:2515 +#: rapid/rapid.py:3009 msgid "list photo and video file extensions the program recognizes and exit" msgstr "" -#: rapid/rapid.py:2516 +#: rapid/rapid.py:3010 msgid "reset all program settings and preferences and exit" msgstr "" "Restabelecer todas as configurações e preferências do programa e fechá-lo" -#: rapid/rapid.py:2529 +#: rapid/rapid.py:3023 msgid "Photos:" msgstr "Fotos:" -#: rapid/rapid.py:2529 +#: rapid/rapid.py:3023 msgid "Videos:" msgstr "Vídeos:" -#: rapid/rapid.py:2534 +#: rapid/rapid.py:3028 #, python-format msgid "and %s" -msgstr "" +msgstr "e %s" -#: rapid/rapid.py:2542 +#: rapid/rapid.py:3036 msgid "All settings and preferences have been reset" -msgstr "Todas as configurações e preferências foram restabelecidas" +msgstr "Todas as configurações e preferências foram redefinidas" -#: rapid/rapid.py:2551 +#: rapid/rapid.py:3045 msgid "" "Video downloading functionality disabled.\n" "To download videos, please install the hachoir metadata and kaa metadata " "packages for python." msgstr "" +#: rapid/copyfiles.py:142 rapid/subfolderfile.py:209 +#: rapid/subfolderfile.py:332 rapid/subfolderfile.py:350 +#, python-format +msgid "" +"%(problem)s\n" +"File: %(file)s" +msgstr "" + #: rapid/device.py:79 msgid "Device Detected" msgstr "Dispositivo detectado" @@ -217,6 +356,10 @@ msgstr "" msgid "_Remember this choice" msgstr "_Relembrar esta escolha" +#: rapid/downloadtracker.py:217 +msgid "MB/s" +msgstr "MB/s" + #: rapid/generatenameconfig.py:143 msgid "Date time" msgstr "Data e hora" @@ -238,7 +381,7 @@ msgid "Sequences" msgstr "Seqüências" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode -#: rapid/generatenameconfig.py:149 rapid/preferencesdialog.py:545 +#: rapid/generatenameconfig.py:149 rapid/preferencesdialog.py:549 msgid "Job code" msgstr "Etiqueta" @@ -261,7 +404,7 @@ msgstr "Ontem" #. Translators: Download time is the time and date that the download started (when the user clicked the Download button) #: rapid/generatenameconfig.py:155 msgid "Download time" -msgstr "" +msgstr "Início do download" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename #: rapid/generatenameconfig.py:157 @@ -271,7 +414,7 @@ msgstr "" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename #: rapid/generatenameconfig.py:159 msgid "Name" -msgstr "" +msgstr "Nome" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename #: rapid/generatenameconfig.py:161 @@ -290,7 +433,7 @@ msgstr "" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata #: rapid/generatenameconfig.py:166 msgid "Aperture" -msgstr "" +msgstr "Abertura" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata #: rapid/generatenameconfig.py:168 @@ -300,12 +443,12 @@ msgstr "ISO" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata #: rapid/generatenameconfig.py:170 msgid "Exposure time" -msgstr "" +msgstr "Tempo de exposição" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata #: rapid/generatenameconfig.py:172 msgid "Focal length" -msgstr "" +msgstr "Distância focal" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata #: rapid/generatenameconfig.py:174 @@ -330,7 +473,7 @@ msgstr "" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata #: rapid/generatenameconfig.py:182 msgid "Serial number" -msgstr "" +msgstr "Número de série" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata #: rapid/generatenameconfig.py:184 @@ -344,7 +487,7 @@ msgstr "" #: rapid/generatenameconfig.py:187 msgid "Codec" -msgstr "" +msgstr "Codec" #: rapid/generatenameconfig.py:188 msgid "Width" @@ -415,17 +558,17 @@ msgstr "Últimos 4 dígitos" #. Translators: please not the capitalization of this text, and keep it the same if your language features capitalization #: rapid/generatenameconfig.py:213 msgid "Original Case" -msgstr "" +msgstr "Caixa de tetxo original" #. Translators: please not the capitalization of this text, and keep it the same if your language features capitalization #: rapid/generatenameconfig.py:215 msgid "UPPERCASE" -msgstr "" +msgstr "CAIXA ALTA" #. Translators: please not the capitalization of this text, and keep it the same if your language features capitalization #: rapid/generatenameconfig.py:217 msgid "lowercase" -msgstr "minúsculas" +msgstr "caixa baixa" #: rapid/generatenameconfig.py:218 msgid "One digit" @@ -463,182 +606,182 @@ msgstr "Subsegundos" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime #: rapid/generatenameconfig.py:228 msgid "YYYYMMDD" -msgstr "" +msgstr "AAAAMMDD" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime #: rapid/generatenameconfig.py:230 msgid "YYYY-MM-DD" -msgstr "" +msgstr "AAAA-MM-DD" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime #: rapid/generatenameconfig.py:232 msgid "YYMMDD" -msgstr "" +msgstr "AAMMDD" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime #: rapid/generatenameconfig.py:234 msgid "YY-MM-DD" -msgstr "" +msgstr "AA-MM-DD" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime #: rapid/generatenameconfig.py:236 msgid "MMDDYYYY" -msgstr "" +msgstr "MMDDAAAA" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime #: rapid/generatenameconfig.py:238 msgid "MMDDYY" -msgstr "" +msgstr "MMDDAA" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime #: rapid/generatenameconfig.py:240 msgid "MMDD" -msgstr "" +msgstr "MMDD" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime #: rapid/generatenameconfig.py:242 msgid "DDMMYYYY" -msgstr "" +msgstr "DDMMAAAA" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime #: rapid/generatenameconfig.py:244 msgid "DDMMYY" -msgstr "" +msgstr "DDMMAA" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime #: rapid/generatenameconfig.py:246 msgid "YYYY" -msgstr "" +msgstr "AAAA" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime #: rapid/generatenameconfig.py:248 msgid "YY" -msgstr "" +msgstr "AA" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime #: rapid/generatenameconfig.py:250 msgid "MM" -msgstr "" +msgstr "MM" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime #: rapid/generatenameconfig.py:252 msgid "DD" -msgstr "" +msgstr "DD" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime #: rapid/generatenameconfig.py:254 msgid "HHMMSS" -msgstr "" +msgstr "HHMMSS" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime #: rapid/generatenameconfig.py:256 msgid "HHMM" -msgstr "" +msgstr "HHMM" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime #: rapid/generatenameconfig.py:258 msgid "HH-MM-SS" -msgstr "" +msgstr "HH-MM-SS" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime #: rapid/generatenameconfig.py:260 msgid "HH-MM" -msgstr "" +msgstr "HH-MM" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime #: rapid/generatenameconfig.py:262 msgid "HH" -msgstr "" +msgstr "HH" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime #: rapid/generatenameconfig.py:264 msgid "MM (minutes)" -msgstr "" +msgstr "MM (minutos)" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime #: rapid/generatenameconfig.py:266 msgid "SS" -msgstr "" +msgstr "SS" -#: rapid/preferencesdialog.py:364 +#: rapid/preferencesdialog.py:370 #, python-format msgid "Subfolder preferences should not start with a %s" msgstr "" -#: rapid/preferencesdialog.py:366 +#: rapid/preferencesdialog.py:372 #, python-format msgid "Subfolder preferences should not end with a %s" msgstr "" -#: rapid/preferencesdialog.py:370 +#: rapid/preferencesdialog.py:376 #, python-format msgid "Subfolder preferences should not contain two %s one after the other" msgstr "" -#: rapid/preferencesdialog.py:384 rapid/preferencesdialog.py:668 +#: rapid/preferencesdialog.py:389 rapid/preferencesdialog.py:672 msgid "Remove all Job Codes?" msgstr "Remover todas as etiquetas?" -#: rapid/preferencesdialog.py:401 rapid/preferencesdialog.py:685 +#: rapid/preferencesdialog.py:406 rapid/preferencesdialog.py:689 msgid "Should all Job Codes be removed?" msgstr "Deseja realmente remover todas as etiquetas?" -#: rapid/preferencesdialog.py:431 +#: rapid/preferencesdialog.py:436 msgid "Error in Photo Rename preferences" msgstr "Erro causado pelas preferêcias em \"renomear fotografias\"" -#: rapid/preferencesdialog.py:613 +#: rapid/preferencesdialog.py:617 msgid "Error in Video Rename preferences" msgstr "Erro causado pelas preferêcias em \"renomear vídeos\"" -#: rapid/preferencesdialog.py:634 +#: rapid/preferencesdialog.py:638 msgid "Error in Photo Download Subfolders preferences" msgstr "" "Erro causado pelas preferêcias de subdiretórios em \"diretórios de " "fotografias\"" -#: rapid/preferencesdialog.py:651 +#: rapid/preferencesdialog.py:655 msgid "Error in Video Download Subfolders preferences" msgstr "" "Erro causado pelas preferêcias de subdiretórios em \"diretórios de vídeo\"" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode -#: rapid/preferencesdialog.py:710 +#: rapid/preferencesdialog.py:714 msgid "Enter a Job Code" msgstr "Definir uma etiqueta" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode -#: rapid/preferencesdialog.py:727 +#: rapid/preferencesdialog.py:731 msgid "Enter a new Job Code, or select a previous one" msgstr "Defina uma nova etiqueta or selecione uma já presente" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode -#: rapid/preferencesdialog.py:730 +#: rapid/preferencesdialog.py:734 msgid "Enter a new Job Code" msgstr "Defina uma nova etiqueta" -#: rapid/preferencesdialog.py:735 +#: rapid/preferencesdialog.py:739 msgid "Job Code:" msgstr "Etiqueta:" -#: rapid/preferencesdialog.py:815 rapid/rpdfile.py:108 -msgid "photos and videos" -msgstr "fotos e vídeos" +#: rapid/preferencesdialog.py:915 +msgid "Job Code" +msgstr "Etiqueta" -#: rapid/preferencesdialog.py:964 +#: rapid/preferencesdialog.py:997 msgid "Select a folder to download photos to" msgstr "Selecione o diretório para baixar as fotos para" -#: rapid/preferencesdialog.py:982 +#: rapid/preferencesdialog.py:1015 msgid "Select a folder to download videos to" msgstr "Selecione o diretório para baixar os vídeos para" -#: rapid/preferencesdialog.py:1064 +#: rapid/preferencesdialog.py:1106 #, python-format msgid "Select a folder containing %(file_types)s" msgstr "Escolha um diretório que contenha %(file_types)s" -#: rapid/preferencesdialog.py:1086 +#: rapid/preferencesdialog.py:1128 #, python-format msgid "Select a folder in which to backup %(file_types)s" msgstr "" @@ -646,32 +789,31 @@ msgstr "" "%(file_types)s" #. Translators: please do not modify or leave out html formatting tags like <i> and <b>. These are used to format the text the users sees -#: rapid/preferencesdialog.py:1172 +#: rapid/preferencesdialog.py:1212 msgid "" "<i><b>Warning:</b> There is insufficient metadata to fully generate the " "name. Please use other renaming options.</i>" msgstr "" -"<i><b>Aviso:</b> As meta-Informações disponíveis são insuficiente à geração " -"de um nome para arquivos. Por favor, faça uso de outras opções de " -"nomeação.</i>" +"<i><b>Aviso:</b> As meta-Informações disponíveis são insuficientes para " +"gerar um nome de arquivo. Por favor, use outras opções de renomeação.</i>" -#: rapid/preferencesdialog.py:1211 +#: rapid/preferencesdialog.py:1263 msgid "" "<i><b>Warning:</b> There is insufficient metadata to fully generate " "subfolders. Please use other subfolder naming options.</i>" msgstr "" -"<i><b>Aviso:</b> As meta-Informações disponíveis são insuficiente à geração " -"de um nome para subdiretórios. Por favor, faça uso de outras opções de " +"<i><b>Aviso:</b> As meta-Informações disponíveis são insuficientes para " +"gerar nomes de subdiretórios. Por favor, use de outras opções de " "nomeação.</i>" #. Translators: you should not modify or leave out the %s. This is a code used by the programming language python to insert a value that thes user will see -#: rapid/preferencesdialog.py:1215 +#: rapid/preferencesdialog.py:1266 #, python-format msgid "<i>Example: %s</i>" msgstr "<i>Exemplo: %s</i>" #. Preferences list is now empty -#: rapid/preferencesdialog.py:1291 +#: rapid/preferencesdialog.py:1356 #, python-format msgid "" "The %(filetype)s subfolder preferences entered are invalid and cannot be " @@ -680,24 +822,15 @@ msgid "" msgstr "" "As preferências definidas para os subdiretórios de %(filetype)s são " "inválidas e não poderão ser usadas.\n" -"Elas serão restabelecidas em seus valores padrão." - -#. check subfolder preferences for bad values -#: rapid/preferencesdialog.py:1305 rapid/rpdfile.py:120 rapid/rpdfile.py:241 -msgid "photo" -msgstr "foto" - -#: rapid/preferencesdialog.py:1306 rapid/rpdfile.py:115 rapid/rpdfile.py:267 -msgid "video" -msgstr "vídeo" +"Elas serão redefinidas para seus valores padrão." #. Translators: this value is used as an example device when automatic backup device detection is enabled. You should translate this. -#: rapid/preferencesdialog.py:1566 +#: rapid/preferencesdialog.py:1642 msgid "externaldrive1" msgstr "disco_externo_1" #. Translators: this value is used as an example device when automatic backup device detection is enabled. You should translate this. -#: rapid/preferencesdialog.py:1568 +#: rapid/preferencesdialog.py:1644 msgid "externaldrive2" msgstr "disco_externo_2" @@ -774,11 +907,11 @@ msgid "Stockholm" msgstr "Estocolmo" #. components -#: rapid/problemnotification.py:26 rapid/subfolderfile.py:181 +#: rapid/problemnotification.py:26 rapid/subfolderfile.py:343 msgid "subfolder" msgstr "subdiretório" -#: rapid/problemnotification.py:27 rapid/subfolderfile.py:179 +#: rapid/problemnotification.py:27 rapid/subfolderfile.py:341 msgid "filename" msgstr "nome de arquivo" @@ -820,7 +953,7 @@ msgstr "" #: rapid/problemnotification.py:93 rapid/problemnotification.py:94 #, python-format msgid "%(filetype)s already exists" -msgstr "" +msgstr "%(filetype)s já existe." #: rapid/problemnotification.py:97 #, python-format @@ -886,7 +1019,7 @@ msgstr "" #: rapid/problemnotification.py:300 #, python-format msgid "%s, " -msgstr "" +msgstr "%s, " #: rapid/problemnotification.py:228 rapid/problemnotification.py:289 #: rapid/problemnotification.py:301 @@ -1024,7 +1157,7 @@ msgstr "" msgid "Multiple problems were encountered" msgstr "" -#: rapid/problemnotification.py:403 +#: rapid/problemnotification.py:403 rapid/subfolderfile.py:228 msgid "Photos detected with the same filenames, but taken at different times" msgstr "" "Foram detectadas fotografias de mesmo nome, mas de horários diferentes" @@ -1051,27 +1184,47 @@ msgstr "" msgid "%(previousproblem)s, and %(backinguperror)s" msgstr "" -#: rapid/rpdfile.py:110 -msgid "photos or videos" -msgstr "fotos ou vídeos" - -#: rapid/rpdfile.py:134 +#: rapid/rpdfile.py:136 #, python-format msgid "%(number)s %(filetypes)s" msgstr "%(number)s %(filetypes)s" -#: rapid/rpdfile.py:242 -msgid "Photo" -msgstr "Fotografia" +#: rapid/subfolderfile.py:79 +#, python-format +msgid "%(hour)s:%(minute)s:%(second)s:%(subsecond)s" +msgstr "%(hour)s:%(minute)s:%(second)s:%(subsecond)s" -#: rapid/rpdfile.py:268 -msgid "Video" -msgstr "Vídeo" +#: rapid/subfolderfile.py:194 +#, python-format +msgid "" +"Source: %(source)s\n" +"Destination: %(destination)s" +msgstr "" +"Origem: %(source)s\n" +"Destino: %(destination)s" + +#: rapid/subfolderfile.py:297 +msgid "Photo has already been downloaded" +msgstr "A foto já foi baixada" + +#: rapid/subfolderfile.py:298 +#, python-format +msgid "Source: %(source)s" +msgstr "Origem: %(source)s" -#: rapid/subfolderfile.py:177 +#: rapid/subfolderfile.py:339 msgid "subfolder and filename" msgstr "subdiretório e nome de arquivo" +#: rapid/subfolderfile.py:377 +msgid "Failed to create download subfolder" +msgstr "" + +#: rapid/subfolderfile.py:378 +#, python-format +msgid "Path: %s" +msgstr "" + #: rapid/glade3/rapid.ui.h:1 msgid "About..." msgstr "" @@ -1627,9 +1780,6 @@ msgstr "" #~ "Apesar da execução de descargas, o valor de \"número acumulado\" não foi " #~ "atualizado." -#~ msgid "Download cannot proceed" -#~ msgstr "A descarga não pôde ser levada a cabo" - #~ msgid "The following download path could not be created:\n" #~ msgstr "O seguinte destino de descarga não pôde ser criado:\n" @@ -1660,13 +1810,6 @@ msgstr "" #~ msgid "There is an error in the program preferences." #~ msgstr "Há um erro nas preferências do programa." -#, python-format -#~ msgid "%(noFiles)s %(filetypes)s downloaded" -#~ msgstr "%(noFiles)s %(filetypes)s descarregados" - -#~ msgid "warnings" -#~ msgstr "avisos" - #~ msgid "errors" #~ msgstr "erros" @@ -1674,10 +1817,6 @@ msgstr "" #~ msgstr "O dispositivo poderá agora ser removido com segurança" #, python-format -#~ msgid "%(noFiles)s %(filetypes)s failed to download" -#~ msgstr "%(noFiles)s %(filetypes)s não puderam ser descarregados" - -#, python-format #~ msgid "Source: %s\n" #~ msgstr "Origem: %s\n" @@ -1716,18 +1855,6 @@ msgstr "" #~ "%(problem)s" #, python-format -#~ msgid "" -#~ "Source: %(source)s\n" -#~ "Destination: %(destination)s" -#~ msgstr "" -#~ "Origem: %(source)s\n" -#~ "Destino: %(destination)s" - -#, python-format -#~ msgid "Source: %(source)s" -#~ msgstr "Origem: %(source)s" - -#, python-format #~ msgid "Backup %(file_type)s overwritten" #~ msgstr "As cópias de segurança de %(file_type)s foram sobrescritas" @@ -1785,10 +1912,6 @@ msgstr "" #~ msgstr "Erro: %(inst)s" #, python-format -#~ msgid "%(number)s of %(total)s %(filetypes)s (%(remaining)s remaining)" -#~ msgstr "%(number)s de %(total)s %(filetypes)s (%(remaining)s restantes)" - -#, python-format #~ msgid "Deleted %(number)i %(filetypes)s from device" #~ msgstr "Foram apagados(as) %(number)i %(filetypes)s do dispositivo" @@ -1842,9 +1965,6 @@ msgstr "" #~ msgid "File" #~ msgstr "Arquivo" -#~ msgid "Job Code" -#~ msgstr "Etiqueta" - #~ msgid "Type" #~ msgstr "Tipo" @@ -2057,9 +2177,6 @@ msgstr "" #~ msgid "Resetting value to zero.\n" #~ msgstr "Redefinindo valor para zero.\n" -#~ msgid "Photo has already been downloaded" -#~ msgstr "A foto já foi baixada" - #, python-format #~ msgid "Destination directory could not be created: %(directory)s\n" #~ msgstr "Diretório de destino não pôde ser criado: %(directory)s\n" @@ -2298,37 +2415,9 @@ msgstr "" #~ msgstr "Usando dispositivos de backup" #, python-format -#~ msgid "%(filetype)s downloaded" -#~ msgstr "%(filetype)s downloaded" - -#, python-format -#~ msgid "About %(minutes)i:%(seconds)02i minutes remaining" -#~ msgstr "Faltando %(minutes)i:%(seconds)02i minutos aproximadamente" - -#, python-format -#~ msgid "About %i seconds remaining" -#~ msgstr "Faltando %i segundos aproximadamente" - -#~ msgid "About 1 minute remaining" -#~ msgstr "Faltando 1 minuto aproximadamente" - -#~ msgid "MB/s" -#~ msgstr "MB/s" - -#~ msgid "About 1 second remaining" -#~ msgstr "Faltando 1 segundo aproximadamente" - -#, python-format -#~ msgid "%(number)s %(numberdownloaded)s" -#~ msgstr "%(number)s %(numberdownloaded)s" - -#, python-format #~ msgid "Warning: backup device %(device)s is currently being downloaded from" #~ msgstr "" #~ "Atenção: dispositivo de backup %(device)s atualmente está sendo baixado" #~ msgid "D_ownload Selected" #~ msgstr "D_ownload selecionados" - -#~ msgid "All downloads complete" -#~ msgstr "Todos os downloads completos" diff --git a/po/rapid-photo-downloader.pot b/po/rapid-photo-downloader.pot index 580f4e9..fc82f8e 100644 --- a/po/rapid-photo-downloader.pot +++ b/po/rapid-photo-downloader.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-04-10 19:59-0500\n" +"POT-Creation-Date: 2011-04-21 01:12-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -18,44 +18,44 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" #. Translators: if neccessary, for guidance in how to translate this program, you may see http://damonlynch.net/translate.html -#: rapid/rapid.py:104 rapid/glade3/rapid.ui.h:11 +#: rapid/rapid.py:105 rapid/glade3/rapid.ui.h:11 msgid "Rapid Photo Downloader" msgstr "" -#: rapid/rapid.py:109 +#: rapid/rapid.py:110 #, python-format msgid "" "%(date)s\n" "%(time)s" msgstr "" -#: rapid/rapid.py:111 +#: rapid/rapid.py:112 #, python-format msgid "%(date)s %(time)s" msgstr "" -#: rapid/rapid.py:114 +#: rapid/rapid.py:115 #, python-format msgid "%(date)s %(hour)s:%(minute)s:%(second)s:%(subsecond)s" msgstr "" #. Device refers to a thing like a camera, memory card in its reader, #. external hard drive, Portable Storage Device, etc. -#: rapid/rapid.py:148 +#: rapid/rapid.py:149 msgid "Device" msgstr "" #. Size refers to the total size of images on the device, typically in #. MB or GB -#: rapid/rapid.py:165 +#: rapid/rapid.py:166 msgid "Size" msgstr "" -#: rapid/rapid.py:168 +#: rapid/rapid.py:169 msgid "Download Progress" msgstr "" -#: rapid/rapid.py:312 +#: rapid/rapid.py:315 #, python-format msgid "%(device)s did not unmount" msgstr "" @@ -64,19 +64,19 @@ msgstr "" #. looking for photos or videos. It is visible initially in the progress bar for each device #. (which normally holds "x photos and videos"). #. It maybe displayed only briefly if the contents of the device being scanned is small. -#: rapid/rapid.py:1091 +#: rapid/rapid.py:1154 msgid "scanning..." msgstr "" -#: rapid/rapid.py:1807 +#: rapid/rapid.py:1969 msgid "Download" msgstr "" -#: rapid/rapid.py:1810 +#: rapid/rapid.py:1972 msgid "Pause" msgstr "" -#: rapid/rapid.py:1912 +#: rapid/rapid.py:2075 #, python-format msgid "" "These download folders are invalid:\n" @@ -84,127 +84,143 @@ msgid "" "%(folder2)s" msgstr "" -#: rapid/rapid.py:1915 +#: rapid/rapid.py:2078 #, python-format msgid "" "This download folder is invalid:\n" "%s" msgstr "" -#: rapid/rapid.py:1916 +#: rapid/rapid.py:2079 msgid "Download cannot proceed" msgstr "" -#: rapid/rapid.py:2130 +#: rapid/rapid.py:2360 msgid "About 1 second remaining" msgstr "" -#: rapid/rapid.py:2132 +#: rapid/rapid.py:2362 #, python-format msgid "About %i seconds remaining" msgstr "" -#: rapid/rapid.py:2134 +#: rapid/rapid.py:2364 msgid "About 1 minute remaining" msgstr "" #. Translators: in the text '%(minutes)i:%(seconds)02i', only the : should be translated, if needed. #. '%(minutes)i' and '%(seconds)02i' should not be modified or left out. They are used to format and display the amount #. of time the download has remainging, e.g. 'About 5:36 minutes remaining' -#: rapid/rapid.py:2139 +#: rapid/rapid.py:2369 #, python-format msgid "About %(minutes)i:%(seconds)02i minutes remaining" msgstr "" -#: rapid/rapid.py:2151 rapid/preferencesdialog.py:822 rapid/rpdfile.py:110 +#: rapid/rapid.py:2381 rapid/preferencesdialog.py:822 rapid/rpdfile.py:110 msgid "photos and videos" msgstr "" -#: rapid/rapid.py:2153 rapid/rpdfile.py:112 +#: rapid/rapid.py:2383 rapid/rpdfile.py:112 msgid "photos or videos" msgstr "" -#: rapid/rapid.py:2156 rapid/rapid.py:2661 rapid/rpdfile.py:115 +#: rapid/rapid.py:2386 rapid/rapid.py:2929 rapid/rpdfile.py:115 msgid "videos" msgstr "" -#: rapid/rapid.py:2158 rapid/preferencesdialog.py:1371 rapid/rpdfile.py:117 -#: rapid/rpdfile.py:266 +#: rapid/rapid.py:2388 rapid/preferencesdialog.py:1373 rapid/rpdfile.py:117 +#: rapid/rpdfile.py:270 msgid "video" msgstr "" -#: rapid/rapid.py:2161 rapid/rapid.py:2659 rapid/preferencesdialog.py:824 +#: rapid/rapid.py:2391 rapid/rapid.py:2927 rapid/preferencesdialog.py:824 #: rapid/rpdfile.py:120 msgid "photos" msgstr "" #. check subfolder preferences for bad values -#: rapid/rapid.py:2163 rapid/preferencesdialog.py:1370 rapid/rpdfile.py:122 -#: rapid/rpdfile.py:246 +#: rapid/rapid.py:2393 rapid/preferencesdialog.py:1372 rapid/rpdfile.py:122 +#: rapid/rpdfile.py:250 msgid "photo" msgstr "" -#: rapid/rapid.py:2188 +#: rapid/rapid.py:2420 #, python-format msgid "%(noFiles)s %(filetypes)s downloaded" msgstr "" -#: rapid/rapid.py:2192 +#: rapid/rapid.py:2424 #, python-format msgid "%(noFiles)s %(filetypes)s failed to download" msgstr "" -#: rapid/rapid.py:2195 rapid/rapid.py:2247 +#: rapid/rapid.py:2427 rapid/rapid.py:2479 msgid "warnings" msgstr "" -#: rapid/rapid.py:2204 +#: rapid/rapid.py:2436 msgid "All downloads complete" msgstr "" -#: rapid/rapid.py:2210 rapid/rapid.py:2219 rapid/rapid.py:2228 -#: rapid/rapid.py:2237 rapid/rapid.py:2245 +#: rapid/rapid.py:2442 rapid/rapid.py:2451 rapid/rapid.py:2460 +#: rapid/rapid.py:2469 rapid/rapid.py:2477 #, python-format msgid "%(number)s %(numberdownloaded)s" msgstr "" -#: rapid/rapid.py:2212 rapid/rapid.py:2230 +#: rapid/rapid.py:2444 rapid/rapid.py:2462 #, python-format msgid "%(filetype)s downloaded" msgstr "" -#: rapid/rapid.py:2221 rapid/rapid.py:2239 +#: rapid/rapid.py:2453 rapid/rapid.py:2471 #, python-format msgid "%(filetype)s failed to download" msgstr "" #. e.g.: 3 of 205 photos and videos (202 remaining) -#: rapid/rapid.py:2276 +#: rapid/rapid.py:2510 #, python-format msgid "%(number)s of %(total)s %(filetypes)s (%(remaining)s remaining)" msgstr "" #. e.g.: 205 of 205 photos and videos -#: rapid/rapid.py:2283 +#: rapid/rapid.py:2517 #, python-format msgid "%(number)s of %(total)s %(filetypes)s" msgstr "" -#: rapid/rapid.py:2665 +#: rapid/rapid.py:2897 +msgid "and" +msgstr "" + +#: rapid/rapid.py:2902 +msgid "Using backup devices" +msgstr "" + +#: rapid/rapid.py:2904 +msgid "Using backup device" +msgstr "" + +#: rapid/rapid.py:2906 +msgid "No backup devices detected" +msgstr "" + +#: rapid/rapid.py:2933 msgid "Free space:" msgstr "" #. (videos) or (photos) will be appended to the free space message displayed to the #. user in the status bar. #. you should only translate this if your language does not use parantheses -#: rapid/rapid.py:2677 +#: rapid/rapid.py:2945 #, python-format msgid "(%(file_type)s)" msgstr "" #. Freespace available on the filesystem for downloading to #. Displayed in status bar message on main window -#: rapid/rapid.py:2681 +#: rapid/rapid.py:2949 #, python-format msgid "%(free)s %(file_type)s" msgstr "" @@ -212,123 +228,144 @@ msgstr "" #. Inserted in the middle of the statusbar message concerning the amount of freespace #. Used to differentiate between two different file systems #. e.g. Free space: 21.3GB (photos); 14.7GB (videos). -#: rapid/rapid.py:2686 +#: rapid/rapid.py:2954 msgid "; " msgstr "" #. Inserted at the end of the statusbar message concerning the amount of freespace #. Used to differentiate between two different file systems #. e.g. Free space: 21.3GB (photos); 14.7GB (videos). -#: rapid/rapid.py:2691 +#: rapid/rapid.py:2959 msgid "." msgstr "" #. Freespace available on the filesystem for downloading to #. Displayed in status bar message on main window #. e.g. 14.7GB available -#: rapid/rapid.py:2697 +#: rapid/rapid.py:2965 #, python-format msgid "%(free)s free" msgstr "" #. user manually specified backup location -#: rapid/rapid.py:2703 +#: rapid/rapid.py:2971 #, python-format msgid "Backing up to %(path)s" msgstr "" -#: rapid/rapid.py:2708 +#: rapid/rapid.py:2976 #, python-format msgid "%(freespace)s. %(backuppaths)s." msgstr "" -#: rapid/rapid.py:2737 +#: rapid/rapid.py:3005 msgid "Program preferences are invalid" msgstr "" -#: rapid/rapid.py:2842 rapid/rpdfile.py:247 +#: rapid/rapid.py:3110 rapid/rpdfile.py:251 msgid "Photo" msgstr "" -#: rapid/rapid.py:2844 rapid/rpdfile.py:267 +#: rapid/rapid.py:3112 rapid/rpdfile.py:271 msgid "Video" msgstr "" -#: rapid/rapid.py:2853 +#: rapid/rapid.py:3121 #, python-format msgid "%(file_type)s download folder does not exist" msgstr "" -#: rapid/rapid.py:2855 rapid/rapid.py:2869 rapid/rapid.py:2882 +#: rapid/rapid.py:3123 rapid/rapid.py:3137 rapid/rapid.py:3150 #, python-format msgid "Folder: %s" msgstr "" -#: rapid/rapid.py:2867 +#: rapid/rapid.py:3135 #, python-format msgid "%(file_type)s download folder is invalid" msgstr "" -#: rapid/rapid.py:2880 +#: rapid/rapid.py:3148 #, python-format msgid "%(file_type)s download folder is not writable" msgstr "" -#: rapid/rapid.py:2958 +#: rapid/rapid.py:3226 msgid "Thumbnails" msgstr "" #. Translators: this text is displayed to the user when they request information on the command line options. #. The text %default should not be modified or left out. -#: rapid/rapid.py:3005 +#: rapid/rapid.py:3273 #, python-format msgid "" "display program information on the command line as the program runs " "(default: %default)" msgstr "" -#: rapid/rapid.py:3006 +#: rapid/rapid.py:3274 msgid "display debugging information when run from the command line" msgstr "" -#: rapid/rapid.py:3007 +#: rapid/rapid.py:3275 msgid "only output errors to the command line" msgstr "" #. image file extensions are recognized RAW files plus TIFF and JPG -#: rapid/rapid.py:3009 +#: rapid/rapid.py:3277 msgid "list photo and video file extensions the program recognizes and exit" msgstr "" -#: rapid/rapid.py:3010 +#: rapid/rapid.py:3278 msgid "reset all program settings and preferences and exit" msgstr "" -#: rapid/rapid.py:3023 +#: rapid/rapid.py:3291 msgid "Photos:" msgstr "" -#: rapid/rapid.py:3023 +#: rapid/rapid.py:3291 msgid "Videos:" msgstr "" -#: rapid/rapid.py:3028 +#: rapid/rapid.py:3296 #, python-format msgid "and %s" msgstr "" -#: rapid/rapid.py:3036 +#: rapid/rapid.py:3304 msgid "All settings and preferences have been reset" msgstr "" -#: rapid/rapid.py:3045 +#: rapid/rapid.py:3313 msgid "" "Video downloading functionality disabled.\n" "To download videos, please install the hachoir metadata and kaa metadata " "packages for python." msgstr "" -#: rapid/copyfiles.py:142 rapid/subfolderfile.py:209 +#: rapid/backupfile.py:139 rapid/backupfile.py:162 +msgid "Backing up error" +msgstr "" + +#: rapid/backupfile.py:141 +#, python-format +msgid "Destination directory could not be created: %(directory)s\n" +msgstr "" + +#: rapid/backupfile.py:143 rapid/backupfile.py:164 rapid/subfolderfile.py:194 +#, python-format +msgid "" +"Source: %(source)s\n" +"Destination: %(destination)s" +msgstr "" + +#: rapid/backupfile.py:146 rapid/backupfile.py:166 +#, python-format +msgid "Error: %(inst)s" +msgstr "" + +#: rapid/copyfiles.py:143 rapid/subfolderfile.py:209 #: rapid/subfolderfile.py:332 rapid/subfolderfile.py:350 #, python-format msgid "" @@ -351,7 +388,7 @@ msgstr "" msgid "_Remember this choice" msgstr "" -#: rapid/downloadtracker.py:217 +#: rapid/downloadtracker.py:246 msgid "MB/s" msgstr "" @@ -779,26 +816,26 @@ msgid "Select a folder in which to backup %(file_types)s" msgstr "" #. Translators: please do not modify or leave out html formatting tags like <i> and <b>. These are used to format the text the users sees -#: rapid/preferencesdialog.py:1212 +#: rapid/preferencesdialog.py:1214 msgid "" "<i><b>Warning:</b> There is insufficient metadata to fully generate the " "name. Please use other renaming options.</i>" msgstr "" -#: rapid/preferencesdialog.py:1263 +#: rapid/preferencesdialog.py:1265 msgid "" "<i><b>Warning:</b> There is insufficient metadata to fully generate " "subfolders. Please use other subfolder naming options.</i>" msgstr "" #. Translators: you should not modify or leave out the %s. This is a code used by the programming language python to insert a value that thes user will see -#: rapid/preferencesdialog.py:1266 +#: rapid/preferencesdialog.py:1268 #, python-format msgid "<i>Example: %s</i>" msgstr "" #. Preferences list is now empty -#: rapid/preferencesdialog.py:1356 +#: rapid/preferencesdialog.py:1358 #, python-format msgid "" "The %(filetype)s subfolder preferences entered are invalid and cannot be " @@ -807,12 +844,12 @@ msgid "" msgstr "" #. Translators: this value is used as an example device when automatic backup device detection is enabled. You should translate this. -#: rapid/preferencesdialog.py:1642 +#: rapid/preferencesdialog.py:1644 msgid "externaldrive1" msgstr "" #. Translators: this value is used as an example device when automatic backup device detection is enabled. You should translate this. -#: rapid/preferencesdialog.py:1644 +#: rapid/preferencesdialog.py:1646 msgid "externaldrive2" msgstr "" @@ -1175,13 +1212,6 @@ msgstr "" msgid "%(hour)s:%(minute)s:%(second)s:%(subsecond)s" msgstr "" -#: rapid/subfolderfile.py:194 -#, python-format -msgid "" -"Source: %(source)s\n" -"Destination: %(destination)s" -msgstr "" - #: rapid/subfolderfile.py:297 msgid "Photo has already been downloaded" msgstr "" @@ -1518,78 +1548,86 @@ msgid "Exit program when download completes" msgstr "" #: rapid/glade3/prefs.ui.h:52 -msgid "If you disable automatic detection, choose the exact backup location." +msgid "Generate thumbnails (slower)" msgstr "" #: rapid/glade3/prefs.ui.h:53 +msgid "If you disable automatic detection, choose the exact backup location." +msgstr "" + +#: rapid/glade3/prefs.ui.h:54 msgid "" "If you disable automatic detection, choose the exact location of the images " "and videos." msgstr "" -#: rapid/glade3/prefs.ui.h:54 +#: rapid/glade3/prefs.ui.h:55 msgid "" "If you enable automatic detection of Portable Storage Devices, the entire " "device will be scanned for images. On large devices, this could take some " "time." msgstr "" -#: rapid/glade3/prefs.ui.h:55 +#: rapid/glade3/prefs.ui.h:56 msgid "Job Codes" msgstr "" -#: rapid/glade3/prefs.ui.h:56 +#: rapid/glade3/prefs.ui.h:57 msgid "Location:" msgstr "" -#: rapid/glade3/prefs.ui.h:57 +#: rapid/glade3/prefs.ui.h:58 msgid "Miscillaneous" msgstr "" -#: rapid/glade3/prefs.ui.h:58 +#: rapid/glade3/prefs.ui.h:59 msgid "Overwrite" msgstr "" -#: rapid/glade3/prefs.ui.h:59 +#: rapid/glade3/prefs.ui.h:60 +msgid "Performance" +msgstr "" + +#: rapid/glade3/prefs.ui.h:61 msgid "Photo Folders" msgstr "" -#: rapid/glade3/prefs.ui.h:60 +#: rapid/glade3/prefs.ui.h:62 msgid "Photo Rename" msgstr "" -#: rapid/glade3/prefs.ui.h:61 +#: rapid/glade3/prefs.ui.h:63 msgid "Photo backup folder name:" msgstr "" -#: rapid/glade3/prefs.ui.h:62 +#: rapid/glade3/prefs.ui.h:64 msgid "Preferences: Rapid Photo Downloader" msgstr "" -#: rapid/glade3/prefs.ui.h:64 +#: rapid/glade3/prefs.ui.h:66 msgid "R_emove All" msgstr "" -#: rapid/glade3/prefs.ui.h:65 +#: rapid/glade3/prefs.ui.h:67 msgid "Rename Options" msgstr "" -#: rapid/glade3/prefs.ui.h:66 +#: rapid/glade3/prefs.ui.h:68 msgid "Skip" msgstr "" -#: rapid/glade3/prefs.ui.h:67 +#: rapid/glade3/prefs.ui.h:69 msgid "Skip download" msgstr "" -#: rapid/glade3/prefs.ui.h:68 +#: rapid/glade3/prefs.ui.h:70 msgid "" "Sorry, video downloading functionality disabled. To download videos, please " "install the <i>hachoir metadata</i> and <i>kaa metadata</i> packages for " "python." msgstr "" -#: rapid/glade3/prefs.ui.h:69 +#: rapid/glade3/prefs.ui.h:71 msgid "" "Specify the folder in which backups are stored on the device. \n" "\n" @@ -1598,73 +1636,73 @@ msgid "" "a folder in it with one of these names.</i>" msgstr "" -#: rapid/glade3/prefs.ui.h:72 +#: rapid/glade3/prefs.ui.h:74 msgid "" "Specify the time in 24 hour format at which the <i>Downloads today</i> " "sequence number should be reset." msgstr "" -#: rapid/glade3/prefs.ui.h:73 +#: rapid/glade3/prefs.ui.h:75 msgid "" "Specify whether photo, video and folder names should have any characters " "removed that are not allowed by other operating systems." msgstr "" -#: rapid/glade3/prefs.ui.h:74 +#: rapid/glade3/prefs.ui.h:76 msgid "Start downloading at program startup" msgstr "" -#: rapid/glade3/prefs.ui.h:75 +#: rapid/glade3/prefs.ui.h:77 msgid "Start downloading upon device insertion" msgstr "" -#: rapid/glade3/prefs.ui.h:76 +#: rapid/glade3/prefs.ui.h:78 msgid "Stored number:" msgstr "" -#: rapid/glade3/prefs.ui.h:77 +#: rapid/glade3/prefs.ui.h:79 msgid "Strip incompatible characters" msgstr "" -#: rapid/glade3/prefs.ui.h:78 +#: rapid/glade3/prefs.ui.h:80 msgid "Synchronize RAW + JPEG sequence numbers" msgstr "" -#: rapid/glade3/prefs.ui.h:79 +#: rapid/glade3/prefs.ui.h:81 msgid "Unmount (\"eject\") device upon download completion" msgstr "" -#: rapid/glade3/prefs.ui.h:80 +#: rapid/glade3/prefs.ui.h:82 msgid "Video Folders" msgstr "" -#: rapid/glade3/prefs.ui.h:81 +#: rapid/glade3/prefs.ui.h:83 msgid "Video Rename" msgstr "" -#: rapid/glade3/prefs.ui.h:82 +#: rapid/glade3/prefs.ui.h:84 msgid "Video backup folder name:" msgstr "" -#: rapid/glade3/prefs.ui.h:83 +#: rapid/glade3/prefs.ui.h:85 msgid "" "When a photo or video of the same name has already been downloaded, choose " "whether to skip downloading the file, or to add a unique indentifier." msgstr "" -#: rapid/glade3/prefs.ui.h:84 +#: rapid/glade3/prefs.ui.h:86 msgid "" "When backing up, choose whether to overwrite a file on the backup device " "that has the same name, or skip backing it up." msgstr "" -#: rapid/glade3/prefs.ui.h:85 +#: rapid/glade3/prefs.ui.h:87 msgid "" "You can have your photos and videos backed up to multiple locations as they " "are downloaded, e.g. external hard drives." msgstr "" -#: rapid/glade3/prefs.ui.h:86 +#: rapid/glade3/prefs.ui.h:88 msgid "_Add..." msgstr "" @@ -7,22 +7,22 @@ msgid "" msgstr "" "Project-Id-Version: rapid\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" -"POT-Creation-Date: 2011-04-04 00:18-0500\n" -"PO-Revision-Date: 2011-04-08 16:07+0000\n" +"POT-Creation-Date: 2011-04-10 19:59-0500\n" +"PO-Revision-Date: 2011-04-15 18:27+0000\n" "Last-Translator: Sergey Sedov <sedov@webmail.perm.ru>\n" "Language-Team: Russian <ru@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-04-11 01:01+0000\n" -"X-Generator: Launchpad (build 12757)\n" +"X-Launchpad-Export-Date: 2011-04-21 06:12+0000\n" +"X-Generator: Launchpad (build 12883)\n" #. Translators: if neccessary, for guidance in how to translate this program, you may see http://damonlynch.net/translate.html -#: rapid/rapid.py:103 rapid/glade3/rapid.ui.h:11 +#: rapid/rapid.py:104 rapid/glade3/rapid.ui.h:11 msgid "Rapid Photo Downloader" msgstr "Rapid Photo Downloader" -#: rapid/rapid.py:108 +#: rapid/rapid.py:109 #, python-format msgid "" "%(date)s\n" @@ -31,49 +31,54 @@ msgstr "" "%(date)s\n" "%(time)s" -#: rapid/rapid.py:110 +#: rapid/rapid.py:111 #, python-format msgid "%(date)s %(time)s" msgstr "%(date)s %(time)s" -#: rapid/rapid.py:113 +#: rapid/rapid.py:114 #, python-format msgid "%(date)s %(hour)s:%(minute)s:%(second)s:%(subsecond)s" msgstr "%(date)s %(hour)s:%(minute)s:%(second)s:%(subsecond)s" #. Device refers to a thing like a camera, memory card in its reader, #. external hard drive, Portable Storage Device, etc. -#: rapid/rapid.py:144 +#: rapid/rapid.py:148 msgid "Device" msgstr "Носитель" #. Size refers to the total size of images on the device, typically in #. MB or GB -#: rapid/rapid.py:158 +#: rapid/rapid.py:165 msgid "Size" msgstr "Размер" -#: rapid/rapid.py:161 +#: rapid/rapid.py:168 msgid "Download Progress" msgstr "Ход загрузки" +#: rapid/rapid.py:312 +#, python-format +msgid "%(device)s did not unmount" +msgstr "" + #. This refers to when a device like a hard drive is having its contents scanned, #. looking for photos or videos. It is visible initially in the progress bar for each device #. (which normally holds "x photos and videos"). #. It maybe displayed only briefly if the contents of the device being scanned is small. -#: rapid/rapid.py:974 +#: rapid/rapid.py:1091 msgid "scanning..." msgstr "сканирование..." -#: rapid/rapid.py:1678 +#: rapid/rapid.py:1807 msgid "Download" msgstr "Загрузка" -#: rapid/rapid.py:1681 +#: rapid/rapid.py:1810 msgid "Pause" msgstr "Пауза" -#: rapid/rapid.py:1794 +#: rapid/rapid.py:1912 #, python-format msgid "" "These download folders are invalid:\n" @@ -81,45 +86,127 @@ msgid "" "%(folder2)s" msgstr "" -#: rapid/rapid.py:1797 +#: rapid/rapid.py:1915 #, python-format msgid "" "This download folder is invalid:\n" "%s" msgstr "" -#: rapid/rapid.py:1798 +#: rapid/rapid.py:1916 msgid "Download cannot proceed" msgstr "Невозможно загрузить" -#: rapid/rapid.py:1957 +#: rapid/rapid.py:2130 +msgid "About 1 second remaining" +msgstr "Осталась примерно 1 секунда" + +#: rapid/rapid.py:2132 #, python-format -msgid "%(number)s of %(total)s %(filetypes)s" -msgstr "%(number)s из %(total)s %(filetypes)s" +msgid "About %i seconds remaining" +msgstr "Осталось %i секунд" -#: rapid/rapid.py:2302 rapid/preferencesdialog.py:825 rapid/rpdfile.py:120 -msgid "photos" -msgstr "фото" +#: rapid/rapid.py:2134 +msgid "About 1 minute remaining" +msgstr "Осталась примерно 1 минута" + +#. Translators: in the text '%(minutes)i:%(seconds)02i', only the : should be translated, if needed. +#. '%(minutes)i' and '%(seconds)02i' should not be modified or left out. They are used to format and display the amount +#. of time the download has remainging, e.g. 'About 5:36 minutes remaining' +#: rapid/rapid.py:2139 +#, python-format +msgid "About %(minutes)i:%(seconds)02i minutes remaining" +msgstr "Осталось примерно %(minutes)i:%(seconds)02i" + +#: rapid/rapid.py:2151 rapid/preferencesdialog.py:822 rapid/rpdfile.py:110 +msgid "photos and videos" +msgstr "фото и видео" + +#: rapid/rapid.py:2153 rapid/rpdfile.py:112 +msgid "photos or videos" +msgstr "фото или видео" -#: rapid/rapid.py:2304 rapid/rpdfile.py:115 +#: rapid/rapid.py:2156 rapid/rapid.py:2661 rapid/rpdfile.py:115 msgid "videos" msgstr "видео" -#: rapid/rapid.py:2308 +#: rapid/rapid.py:2158 rapid/preferencesdialog.py:1371 rapid/rpdfile.py:117 +#: rapid/rpdfile.py:266 +msgid "video" +msgstr "видео" + +#: rapid/rapid.py:2161 rapid/rapid.py:2659 rapid/preferencesdialog.py:824 +#: rapid/rpdfile.py:120 +msgid "photos" +msgstr "фото" + +#. check subfolder preferences for bad values +#: rapid/rapid.py:2163 rapid/preferencesdialog.py:1370 rapid/rpdfile.py:122 +#: rapid/rpdfile.py:246 +msgid "photo" +msgstr "фото" + +#: rapid/rapid.py:2188 +#, python-format +msgid "%(noFiles)s %(filetypes)s downloaded" +msgstr "%(noFiles)s %(filetypes)s загружено" + +#: rapid/rapid.py:2192 +#, python-format +msgid "%(noFiles)s %(filetypes)s failed to download" +msgstr "%(noFiles)s %(filetypes)s не удалось загрузить" + +#: rapid/rapid.py:2195 rapid/rapid.py:2247 +msgid "warnings" +msgstr "предупреждения" + +#: rapid/rapid.py:2204 +msgid "All downloads complete" +msgstr "Все загрузки завершены" + +#: rapid/rapid.py:2210 rapid/rapid.py:2219 rapid/rapid.py:2228 +#: rapid/rapid.py:2237 rapid/rapid.py:2245 +#, python-format +msgid "%(number)s %(numberdownloaded)s" +msgstr "%(number)s %(numberdownloaded)s" + +#: rapid/rapid.py:2212 rapid/rapid.py:2230 +#, python-format +msgid "%(filetype)s downloaded" +msgstr "%(filetype)s загружено" + +#: rapid/rapid.py:2221 rapid/rapid.py:2239 +#, python-format +msgid "%(filetype)s failed to download" +msgstr "%(filetype)s не удалось загрузить" + +#. e.g.: 3 of 205 photos and videos (202 remaining) +#: rapid/rapid.py:2276 +#, python-format +msgid "%(number)s of %(total)s %(filetypes)s (%(remaining)s remaining)" +msgstr "%(number)s из %(total)s %(filetypes)s (%(remaining)s осталось)" + +#. e.g.: 205 of 205 photos and videos +#: rapid/rapid.py:2283 +#, python-format +msgid "%(number)s of %(total)s %(filetypes)s" +msgstr "%(number)s из %(total)s %(filetypes)s" + +#: rapid/rapid.py:2665 msgid "Free space:" msgstr "Свободное место:" #. (videos) or (photos) will be appended to the free space message displayed to the #. user in the status bar. #. you should only translate this if your language does not use parantheses -#: rapid/rapid.py:2320 +#: rapid/rapid.py:2677 #, python-format msgid "(%(file_type)s)" msgstr "" #. Freespace available on the filesystem for downloading to #. Displayed in status bar message on main window -#: rapid/rapid.py:2324 +#: rapid/rapid.py:2681 #, python-format msgid "%(free)s %(file_type)s" msgstr "" @@ -127,71 +214,75 @@ msgstr "" #. Inserted in the middle of the statusbar message concerning the amount of freespace #. Used to differentiate between two different file systems #. e.g. Free space: 21.3GB (photos); 14.7GB (videos). -#: rapid/rapid.py:2329 +#: rapid/rapid.py:2686 msgid "; " msgstr "" #. Inserted at the end of the statusbar message concerning the amount of freespace #. Used to differentiate between two different file systems #. e.g. Free space: 21.3GB (photos); 14.7GB (videos). -#: rapid/rapid.py:2334 +#: rapid/rapid.py:2691 msgid "." msgstr "" #. Freespace available on the filesystem for downloading to #. Displayed in status bar message on main window #. e.g. 14.7GB available -#: rapid/rapid.py:2340 +#: rapid/rapid.py:2697 #, python-format msgid "%(free)s free" msgstr "" #. user manually specified backup location -#: rapid/rapid.py:2346 +#: rapid/rapid.py:2703 #, python-format msgid "Backing up to %(path)s" msgstr "Резервное копирование в %(path)s" -#: rapid/rapid.py:2351 +#: rapid/rapid.py:2708 #, python-format msgid "%(freespace)s. %(backuppaths)s." msgstr "%(freespace)s. %(backuppaths)s." -#: rapid/rapid.py:2479 rapid/rpdfile.py:247 +#: rapid/rapid.py:2737 +msgid "Program preferences are invalid" +msgstr "Настройки программы не корректны" + +#: rapid/rapid.py:2842 rapid/rpdfile.py:247 msgid "Photo" msgstr "Фото" -#: rapid/rapid.py:2481 rapid/rpdfile.py:267 +#: rapid/rapid.py:2844 rapid/rpdfile.py:267 msgid "Video" msgstr "Видео" -#: rapid/rapid.py:2490 +#: rapid/rapid.py:2853 #, python-format msgid "%(file_type)s download folder does not exist" -msgstr "" +msgstr "%(file_type)s каталог для закачки не существует" -#: rapid/rapid.py:2492 rapid/rapid.py:2506 rapid/rapid.py:2519 +#: rapid/rapid.py:2855 rapid/rapid.py:2869 rapid/rapid.py:2882 #, python-format msgid "Folder: %s" msgstr "Каталог: %s" -#: rapid/rapid.py:2504 +#: rapid/rapid.py:2867 #, python-format msgid "%(file_type)s download folder is invalid" msgstr "" -#: rapid/rapid.py:2517 +#: rapid/rapid.py:2880 #, python-format msgid "%(file_type)s download folder is not writable" -msgstr "" +msgstr "%(file_type)s в каталог для закачки невозможно записать" -#: rapid/rapid.py:2592 +#: rapid/rapid.py:2958 msgid "Thumbnails" msgstr "Миниатюры" #. Translators: this text is displayed to the user when they request information on the command line options. #. The text %default should not be modified or left out. -#: rapid/rapid.py:2633 +#: rapid/rapid.py:3005 #, python-format msgid "" "display program information on the command line as the program runs " @@ -200,42 +291,42 @@ msgstr "" "отобразить информацию о программе в командной строке при запуске программы " "(по умолчанию: %default)" -#: rapid/rapid.py:2634 +#: rapid/rapid.py:3006 msgid "display debugging information when run from the command line" msgstr "отображать отладочную информацию при запуске из командной строки" -#: rapid/rapid.py:2635 +#: rapid/rapid.py:3007 msgid "only output errors to the command line" msgstr "выводить в командную строку только ошибки" #. image file extensions are recognized RAW files plus TIFF and JPG -#: rapid/rapid.py:2637 +#: rapid/rapid.py:3009 msgid "list photo and video file extensions the program recognizes and exit" msgstr "" "вывести расширения фото- и видеофайлов, которые распознает программа, и выйти" -#: rapid/rapid.py:2638 +#: rapid/rapid.py:3010 msgid "reset all program settings and preferences and exit" msgstr "сбросить все настройки и выйти" -#: rapid/rapid.py:2651 +#: rapid/rapid.py:3023 msgid "Photos:" msgstr "Фото:" -#: rapid/rapid.py:2651 +#: rapid/rapid.py:3023 msgid "Videos:" msgstr "Видео:" -#: rapid/rapid.py:2656 +#: rapid/rapid.py:3028 #, python-format msgid "and %s" msgstr "и %s" -#: rapid/rapid.py:2664 +#: rapid/rapid.py:3036 msgid "All settings and preferences have been reset" msgstr "Все установки и настройки были сброшены" -#: rapid/rapid.py:2673 +#: rapid/rapid.py:3045 msgid "" "Video downloading functionality disabled.\n" "To download videos, please install the hachoir metadata and kaa metadata " @@ -245,13 +336,15 @@ msgstr "" "Для загрузки видеороликов, пожалуйста, установите пакеты метаданных hachoir " "и kaa." -#: rapid/copyfiles.py:136 rapid/subfolderfile.py:209 -#: rapid/subfolderfile.py:346 +#: rapid/copyfiles.py:142 rapid/subfolderfile.py:209 +#: rapid/subfolderfile.py:332 rapid/subfolderfile.py:350 #, python-format msgid "" "%(problem)s\n" "File: %(file)s" msgstr "" +"%(problem)s\n" +"Файл: %(file)s" #: rapid/device.py:79 msgid "Device Detected" @@ -268,6 +361,10 @@ msgstr "Следует ли загрузить фото или видео с э msgid "_Remember this choice" msgstr "_Запомнить мой выбор" +#: rapid/downloadtracker.py:217 +msgid "MB/s" +msgstr "МБ/с" + #: rapid/generatenameconfig.py:143 msgid "Date time" msgstr "Дата и время" @@ -289,7 +386,7 @@ msgid "Sequences" msgstr "Последовательности" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode -#: rapid/generatenameconfig.py:149 rapid/preferencesdialog.py:550 +#: rapid/generatenameconfig.py:149 rapid/preferencesdialog.py:549 msgid "Job code" msgstr "Метка" @@ -611,89 +708,89 @@ msgstr "ММ (мин.)" msgid "SS" msgstr "СС" -#: rapid/preferencesdialog.py:371 +#: rapid/preferencesdialog.py:370 #, python-format msgid "Subfolder preferences should not start with a %s" msgstr "Настройки подкаталога не должны начинаться с %s" -#: rapid/preferencesdialog.py:373 +#: rapid/preferencesdialog.py:372 #, python-format msgid "Subfolder preferences should not end with a %s" msgstr "Настройки подкаталога не должны заканчиваться с %s" -#: rapid/preferencesdialog.py:377 +#: rapid/preferencesdialog.py:376 #, python-format msgid "Subfolder preferences should not contain two %s one after the other" msgstr "Настройки подкаталога не должны содержать две %s одну за другой" -#: rapid/preferencesdialog.py:390 rapid/preferencesdialog.py:673 +#: rapid/preferencesdialog.py:389 rapid/preferencesdialog.py:672 msgid "Remove all Job Codes?" msgstr "Удалить все метки?" -#: rapid/preferencesdialog.py:407 rapid/preferencesdialog.py:690 +#: rapid/preferencesdialog.py:406 rapid/preferencesdialog.py:689 msgid "Should all Job Codes be removed?" msgstr "Вы действительно хотите удалить все метки?" -#: rapid/preferencesdialog.py:437 +#: rapid/preferencesdialog.py:436 msgid "Error in Photo Rename preferences" msgstr "Ошибка в параметрах Переименования фото" -#: rapid/preferencesdialog.py:618 +#: rapid/preferencesdialog.py:617 msgid "Error in Video Rename preferences" msgstr "Ошибка в параметрах Переименования видео" -#: rapid/preferencesdialog.py:639 +#: rapid/preferencesdialog.py:638 msgid "Error in Photo Download Subfolders preferences" msgstr "Ошибка в параметрах Подкаталогов для загрузки фото" -#: rapid/preferencesdialog.py:656 +#: rapid/preferencesdialog.py:655 msgid "Error in Video Download Subfolders preferences" msgstr "Ошибка в параметрах Подкаталогов для загрузки видео" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode -#: rapid/preferencesdialog.py:715 +#: rapid/preferencesdialog.py:714 msgid "Enter a Job Code" msgstr "Введите метку" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode -#: rapid/preferencesdialog.py:732 +#: rapid/preferencesdialog.py:731 msgid "Enter a new Job Code, or select a previous one" msgstr "Введите новую метку или выберите одну из существующих" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode -#: rapid/preferencesdialog.py:735 +#: rapid/preferencesdialog.py:734 msgid "Enter a new Job Code" msgstr "Введите новую метку" -#: rapid/preferencesdialog.py:740 +#: rapid/preferencesdialog.py:739 msgid "Job Code:" msgstr "Метка:" -#: rapid/preferencesdialog.py:823 rapid/rpdfile.py:110 -msgid "photos and videos" -msgstr "фото и видео" +#: rapid/preferencesdialog.py:915 +msgid "Job Code" +msgstr "Метка" -#: rapid/preferencesdialog.py:992 +#: rapid/preferencesdialog.py:997 msgid "Select a folder to download photos to" msgstr "Выберите каталог для загрузки фото" -#: rapid/preferencesdialog.py:1010 +#: rapid/preferencesdialog.py:1015 msgid "Select a folder to download videos to" msgstr "Выберите каталог для загрузки видео" -#: rapid/preferencesdialog.py:1101 +#: rapid/preferencesdialog.py:1106 #, python-format msgid "Select a folder containing %(file_types)s" msgstr "Выберите каталог, содержащий %(file_types)s" -#: rapid/preferencesdialog.py:1123 +#: rapid/preferencesdialog.py:1128 #, python-format msgid "Select a folder in which to backup %(file_types)s" msgstr "" "Выберите каталог в котором будут храниться резервные копии %(file_types)s" #. Translators: please do not modify or leave out html formatting tags like <i> and <b>. These are used to format the text the users sees -#: rapid/preferencesdialog.py:1207 +#: rapid/preferencesdialog.py:1212 msgid "" "<i><b>Warning:</b> There is insufficient metadata to fully generate the " "name. Please use other renaming options.</i>" @@ -701,7 +798,7 @@ msgstr "" "<i><b>Внимание:</b> Недостаточно метаданных для создания имен файлов. " "Пожалуйста, используйте другие варианты переименования.</i>" -#: rapid/preferencesdialog.py:1258 +#: rapid/preferencesdialog.py:1263 msgid "" "<i><b>Warning:</b> There is insufficient metadata to fully generate " "subfolders. Please use other subfolder naming options.</i>" @@ -711,13 +808,13 @@ msgstr "" "подкаталогов.</i>" #. Translators: you should not modify or leave out the %s. This is a code used by the programming language python to insert a value that thes user will see -#: rapid/preferencesdialog.py:1261 +#: rapid/preferencesdialog.py:1266 #, python-format msgid "<i>Example: %s</i>" msgstr "<i>Пример: %s</i>" #. Preferences list is now empty -#: rapid/preferencesdialog.py:1351 +#: rapid/preferencesdialog.py:1356 #, python-format msgid "" "The %(filetype)s subfolder preferences entered are invalid and cannot be " @@ -728,22 +825,13 @@ msgstr "" "использованы.\n" "Они сброшены до значений по умолчанию." -#. check subfolder preferences for bad values -#: rapid/preferencesdialog.py:1365 rapid/rpdfile.py:122 rapid/rpdfile.py:246 -msgid "photo" -msgstr "фото" - -#: rapid/preferencesdialog.py:1366 rapid/rpdfile.py:117 rapid/rpdfile.py:266 -msgid "video" -msgstr "видео" - #. Translators: this value is used as an example device when automatic backup device detection is enabled. You should translate this. -#: rapid/preferencesdialog.py:1637 +#: rapid/preferencesdialog.py:1642 msgid "externaldrive1" msgstr "внешнийдиск1" #. Translators: this value is used as an example device when automatic backup device detection is enabled. You should translate this. -#: rapid/preferencesdialog.py:1639 +#: rapid/preferencesdialog.py:1644 msgid "externaldrive2" msgstr "внешнийдиск2" @@ -820,11 +908,11 @@ msgid "Stockholm" msgstr "Стокгольм" #. components -#: rapid/problemnotification.py:26 rapid/subfolderfile.py:339 +#: rapid/problemnotification.py:26 rapid/subfolderfile.py:343 msgid "subfolder" msgstr "подкаталог" -#: rapid/problemnotification.py:27 rapid/subfolderfile.py:337 +#: rapid/problemnotification.py:27 rapid/subfolderfile.py:341 msgid "filename" msgstr "имя файла" @@ -845,18 +933,18 @@ msgstr "" #: rapid/problemnotification.py:84 #, python-format msgid "Error generating component %s." -msgstr "" +msgstr "Ошибка создания компонента %s." #. a generic problem #: rapid/problemnotification.py:86 #, python-format msgid "%(filetype)s metadata cannot be read" -msgstr "" +msgstr "%(filetype)s метаданные невозможно прочесть" #: rapid/problemnotification.py:88 #, python-format msgid "%(filetype)s %(area)s could not be generated" -msgstr "" +msgstr "%(filetype)s %(area)s не удалось создать" #: rapid/problemnotification.py:90 rapid/problemnotification.py:91 #, python-format @@ -924,23 +1012,23 @@ msgstr "" #: rapid/problemnotification.py:223 #, python-format msgid " It was backed up to %(volume)s" -msgstr "" +msgstr " Сделана резервная копия на %(volume)s" #: rapid/problemnotification.py:225 msgid " It was backed up to these devices: " -msgstr "" +msgstr " Сделана резервная копия на: " #: rapid/problemnotification.py:227 rapid/problemnotification.py:288 #: rapid/problemnotification.py:300 #, python-format msgid "%s, " -msgstr "" +msgstr "%s, " #: rapid/problemnotification.py:228 rapid/problemnotification.py:289 #: rapid/problemnotification.py:301 #, python-format msgid "%(volumes)s and %(final_volume)s." -msgstr "" +msgstr "%(volumes)s и %(final_volume)s." #: rapid/problemnotification.py:240 #, python-format @@ -948,6 +1036,8 @@ msgid "" "Photos detected with the same filenames, but taken at different times: " "%(details)s" msgstr "" +"Обнаружены фотографии с одинаковыми названиями, но сделанные в разное время: " +"%(details)s" #: rapid/problemnotification.py:257 #, python-format @@ -968,7 +1058,7 @@ msgstr "" #: rapid/problemnotification.py:265 rapid/problemnotification.py:313 #, python-format msgid "%(volume)s (%(inst)s), " -msgstr "" +msgstr "%(volume)s (%(inst)s), " #: rapid/problemnotification.py:267 #, python-format @@ -983,16 +1073,16 @@ msgstr "" #: rapid/problemnotification.py:276 #, python-format msgid "%(volumes)s and %(volume)s." -msgstr "" +msgstr "%(volumes)s и %(volume)s." #: rapid/problemnotification.py:284 #, python-format msgid "Backup already exists on %(volume)s." -msgstr "" +msgstr "Уже существует резервная копия на %(volume)s." #: rapid/problemnotification.py:286 msgid "Backups already exist in these locations: " -msgstr "" +msgstr "Уже существует резервная копия на: " #: rapid/problemnotification.py:296 #, python-format @@ -1006,12 +1096,12 @@ msgstr "" #: rapid/problemnotification.py:309 #, python-format msgid "An error occurred when creating directories on %(volume)s: %(inst)s." -msgstr "" +msgstr "Произошла ошибка при создании каталогов на %(volume)s: %(inst)s." #: rapid/problemnotification.py:311 msgid "" "Errors occurred when creating directories on the following backup devices: " -msgstr "" +msgstr "Произошла ошибка при создании каталогов на следующих устройствах: " #: rapid/problemnotification.py:322 #, python-format @@ -1035,7 +1125,7 @@ msgstr "" #: rapid/problemnotification.py:343 msgid "The following metadata is missing: " -msgstr "" +msgstr "Эти метаданные пропущены: " #: rapid/problemnotification.py:346 #, python-format @@ -1072,7 +1162,7 @@ msgstr "" #: rapid/problemnotification.py:401 msgid "Multiple problems were encountered" -msgstr "" +msgstr "Обнаружены многочисленные проблемы" #: rapid/problemnotification.py:403 rapid/subfolderfile.py:228 msgid "Photos detected with the same filenames, but taken at different times" @@ -1101,10 +1191,6 @@ msgstr "" msgid "%(previousproblem)s, and %(backinguperror)s" msgstr "" -#: rapid/rpdfile.py:112 -msgid "photos or videos" -msgstr "фото или видео" - #: rapid/rpdfile.py:136 #, python-format msgid "%(number)s %(filetypes)s" @@ -1133,34 +1219,34 @@ msgstr "Фото уже загружено" msgid "Source: %(source)s" msgstr "Источник: %(source)s" -#: rapid/subfolderfile.py:335 +#: rapid/subfolderfile.py:339 msgid "subfolder and filename" msgstr "подкаталог и название файла" -#: rapid/subfolderfile.py:373 +#: rapid/subfolderfile.py:377 msgid "Failed to create download subfolder" msgstr "" -#: rapid/subfolderfile.py:374 +#: rapid/subfolderfile.py:378 #, python-format msgid "Path: %s" -msgstr "" +msgstr "Путь: %s" #: rapid/glade3/rapid.ui.h:1 msgid "About..." -msgstr "" +msgstr "О программе" #: rapid/glade3/rapid.ui.h:2 msgid "Check All" -msgstr "" +msgstr "Выбрать всё" #: rapid/glade3/rapid.ui.h:3 msgid "Check All Photos" -msgstr "" +msgstr "Выбрать все фото" #: rapid/glade3/rapid.ui.h:4 msgid "Check All Videos" -msgstr "" +msgstr "Выбрать все видео" #: rapid/glade3/rapid.ui.h:5 msgid "Download / Pause" @@ -1172,27 +1258,27 @@ msgstr "" #: rapid/glade3/rapid.ui.h:7 msgid "Make a Donation..." -msgstr "" +msgstr "Сделать пожертвование..." #: rapid/glade3/rapid.ui.h:8 msgid "Next File" -msgstr "" +msgstr "Следующий файл" #: rapid/glade3/rapid.ui.h:9 msgid "Previous File" -msgstr "" +msgstr "Предыдущий файл" #: rapid/glade3/rapid.ui.h:10 msgid "Quit" -msgstr "" +msgstr "Выйти" #: rapid/glade3/rapid.ui.h:12 msgid "Refresh" -msgstr "" +msgstr "Обновить" #: rapid/glade3/rapid.ui.h:13 msgid "Report a Problem..." -msgstr "" +msgstr "Сообщить о проблеме..." #: rapid/glade3/rapid.ui.h:14 msgid "Select All Wit_h Job Code" @@ -1670,9 +1756,6 @@ msgstr "Импортируйте ваши фото и видео быстро и #~ msgid "Image has no metadata" #~ msgstr "Фотография не содержит метаданных" -#~ msgid "warnings" -#~ msgstr "предупреждения" - #, python-format #~ msgid "%s images skipped" #~ msgstr "%s фотографий пропущено" @@ -1701,16 +1784,6 @@ msgstr "Импортируйте ваши фото и видео быстро и #~ msgid "and" #~ msgstr "и" -#, python-format -#~ msgid "About %i seconds remaining" -#~ msgstr "Осталось %i секунд" - -#~ msgid "About 1 minute remaining" -#~ msgstr "Осталась примерно 1 минута" - -#~ msgid "About 1 second remaining" -#~ msgstr "Осталась примерно 1 секунда" - #~ msgid "images skipped" #~ msgstr "фотографий пропущено" @@ -1754,10 +1827,6 @@ msgstr "Импортируйте ваши фото и видео быстро и #~ "Фотография: %(image)s\n" #~ "Проблема: %(problem)s" -#, python-format -#~ msgid "About %(minutes)i:%(seconds)02i minutes remaining" -#~ msgstr "Осталось примерно %(minutes)i:%(seconds)02i" - #~ msgid "Goodbye" #~ msgstr "До свидания" @@ -2110,9 +2179,6 @@ msgstr "Импортируйте ваши фото и видео быстро и #~ msgid "Job Code entered" #~ msgstr "Метка введена" -#~ msgid "MB/s" -#~ msgstr "МБ/с" - #, python-format #~ msgid "Image: %(source)s" #~ msgstr "Изображение: %(source)s" @@ -2368,9 +2434,6 @@ msgstr "Импортируйте ваши фото и видео быстро и #~ msgid "Automatically start download is true" #~ msgstr "Автоматически начинать загрузку - да" -#~ msgid "All downloads complete" -#~ msgstr "Все загрузки завершены" - #~ msgid "videos downloaded" #~ msgstr "видеороликов загружено" @@ -2427,10 +2490,6 @@ msgstr "Импортируйте ваши фото и видео быстро и #~ msgstr "The %(filetype)s не скопирован." #, python-format -#~ msgid "%(noFiles)s %(filetypes)s downloaded" -#~ msgstr "%(noFiles)s %(filetypes)s загружено" - -#, python-format #~ msgid "" #~ "Metadata is essential for generating subfolder and/or file names.\n" #~ "Source: %s" @@ -2699,19 +2758,12 @@ msgstr "Импортируйте ваши фото и видео быстро и #~ msgstr "Статус" #, python-format -#~ msgid "%(noFiles)s %(filetypes)s failed to download" -#~ msgstr "%(noFiles)s %(filetypes)s не удалось загрузить" - -#, python-format #~ msgid "Error: %(inst)s" #~ msgstr "Ошибка: %(inst)s" #~ msgid "File" #~ msgstr "Файл" -#~ msgid "Job Code" -#~ msgstr "Метка" - #~ msgid "Type" #~ msgstr "Тип" @@ -2759,10 +2811,6 @@ msgstr "Импортируйте ваши фото и видео быстро и #~ msgstr "" #~ "Загрузка непосредственно с камеры может работать плохо или не работать вовсе" -#, python-format -#~ msgid "%(filetype)s downloaded" -#~ msgstr "%(filetype)s загружено" - #~ msgid "Enter a new Job Code and press Enter, or select an existing Job Code" #~ msgstr "Введите новую метку и нажмите Enter или выберите существующую метку" @@ -2801,10 +2849,6 @@ msgstr "Импортируйте ваши фото и видео быстро и #~ "идет загрузка" #, python-format -#~ msgid "%(filetype)s failed to download" -#~ msgstr "%(filetype)s не удалось загрузить" - -#, python-format #~ msgid "" #~ "Source: %(source)s\n" #~ "Destination: %(destination)s\n" @@ -2826,10 +2870,6 @@ msgstr "Импортируйте ваши фото и видео быстро и #~ msgid "Download device settings preferences were changed." #~ msgstr "Настройки устройства загрузки были изменены." -#, python-format -#~ msgid "%(number)s %(numberdownloaded)s" -#~ msgstr "%(number)s %(numberdownloaded)s" - #~ msgid "Displaying warning about downloading directly from camera" #~ msgstr "Отображает предупреждения о прямой загрузке с камеры" @@ -2849,10 +2889,6 @@ msgstr "Импортируйте ваши фото и видео быстро и #~ msgstr "Настройки каталогов и названий файлов были изменены." #, python-format -#~ msgid "%(number)s of %(total)s %(filetypes)s (%(remaining)s remaining)" -#~ msgstr "%(number)s из %(total)s %(filetypes)s (%(remaining)s осталось)" - -#, python-format #~ msgid "Photo: %(source)s" #~ msgstr "Фото: %(source)s" diff --git a/rapid/ChangeLog b/rapid/ChangeLog index c9437d5..944119d 100644 --- a/rapid/ChangeLog +++ b/rapid/ChangeLog @@ -1,3 +1,30 @@ +Version 0.4.0 RC 1 +------------------ + +2011-04-21 + +Features added since beta 1: + +Backups have been implemented. If you are backing up to more than one device, +Rapid Photo Downloader will backup to each device simultaneously instead of one +after the other. + +When clicking the Download button before thumbnails are finished generating, +the download proceeds immediately and the thumbnails remaining to be generated +will rendered during the download itself. + +Added preferences option to disable thumbnail generation. When auto start is +enabled, this can speed-up transfers when downloading from high-speed devices. + +Access to the preferences window is now disable while a download is occurring, +as changing preferences when files are being download can cause prolems. + +Bug fix: don't crash when downloading some files after having previously +downloaded some others in the same session. + +Updated Brazilian, Dutch, German and Russian translations. + + Version 0.4.0 beta 1 -------------------- diff --git a/rapid/backupfile.py b/rapid/backupfile.py new file mode 100644 index 0000000..6b6d11d --- /dev/null +++ b/rapid/backupfile.py @@ -0,0 +1,187 @@ +#!/usr/bin/python +# -*- coding: latin1 -*- + +### Copyright (C) 2011 Damon Lynch <damonlynch@gmail.com> + +### This program is free software; you can redistribute it and/or modify +### it under the terms of the GNU General Public License as published by +### the Free Software Foundation; either version 2 of the License, or +### (at your option) any later version. + +### This program is distributed in the hope that it will be useful, +### but WITHOUT ANY WARRANTY; without even the implied warranty of +### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +### GNU General Public License for more details. + +### You should have received a copy of the GNU General Public License +### along with this program; if not, write to the Free Software +### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +import multiprocessing +import tempfile +import os + +import gio + +import logging +logger = multiprocessing.get_logger() + +import rpdmultiprocessing as rpdmp +import rpdfile +import problemnotification as pn +import config + + +from gettext import gettext as _ + + +class BackupFiles(multiprocessing.Process): + def __init__(self, path, name, + batch_size_MB, results_pipe, terminate_queue, + run_event): + multiprocessing.Process.__init__(self) + self.results_pipe = results_pipe + self.terminate_queue = terminate_queue + self.batch_size_bytes = batch_size_MB * 1048576 # * 1024 * 1024 + self.path = path + self.mount_name = name + self.run_event = run_event + + def check_termination_request(self): + """ + Check to see this process has not been requested to immediately terminate + """ + if not self.terminate_queue.empty(): + x = self.terminate_queue.get() + # terminate immediately + logger.info("Terminating file backup") + return True + return False + + + def update_progress(self, amount_downloaded, total): + # first check if process is being terminated + self.amount_downloaded = amount_downloaded + if not self.terminate_queue.empty(): + # it is - cancel the current copy + self.cancel_copy.cancel() + else: + if not self.total_reached: + chunk_downloaded = amount_downloaded - self.bytes_downloaded + if (chunk_downloaded > self.batch_size_bytes) or (amount_downloaded == total): + self.bytes_downloaded = amount_downloaded + + if amount_downloaded == total: + # this function is called a couple of times when total is reached + self.total_reached = True + + self.results_pipe.send((rpdmp.CONN_PARTIAL, (rpdmp.MSG_BYTES, (self.scan_pid, self.pid, self.total_downloaded + amount_downloaded, chunk_downloaded)))) + if amount_downloaded == total: + self.bytes_downloaded = 0 + + def progress_callback(self, amount_downloaded, total): + self.update_progress(amount_downloaded, total) + + + def run(self): + + self.cancel_copy = gio.Cancellable() + self.bytes_downloaded = 0 + self.total_downloaded = 0 + + while True: + + self.amount_downloaded = 0 + move_succeeded, rpd_file, path_suffix, backup_duplicate_overwrite = self.results_pipe.recv() + if rpd_file is None: + # this is a termination signal + return None + # pause if instructed by the caller + self.run_event.wait() + + if self.check_termination_request(): + return None + + backup_succeeded = False + self.scan_pid = rpd_file.scan_pid + + if move_succeeded: + self.total_reached = False + + source = gio.File(path=rpd_file.download_full_file_name) + + if path_suffix is None: + dest_base_dir = self.path + else: + dest_base_dir = os.path.join(self.path, path_suffix) + + + dest_dir = os.path.join(dest_base_dir, rpd_file.download_subfolder) + backup_full_file_name = os.path.join( + dest_dir, + rpd_file.download_name) + + subfolder = gio.File(path=dest_dir) + if not subfolder.query_exists(cancellable=None): + # create the subfolders on the backup path + try: + subfolder.make_directory_with_parents(cancellable=gio.Cancellable()) + except gio.Error, inst: + # There is a tiny chance directory may have been created by + # another process between the time it takes to query and + # the time it takes to create a new directory. + # Ignore such errors. + if inst.code <> gio.ERROR_EXISTS: + logger.error("Failed to create backup subfolder: %s", dest_dir) + logger.error(inst) + rpd_file.add_problem(None, pn.BACKUP_DIRECTORY_CREATION, self.mount_name) + rpd_file.add_extra_detail('%s%s' % (pn.BACKUP_DIRECTORY_CREATION, self.mount_name), inst) + rpd_file.error_title = _('Backing up error') + rpd_file.error_msg = \ + _("Destination directory could not be created: %(directory)s\n") % \ + {'directory': subfolder, } + \ + _("Source: %(source)s\nDestination: %(destination)s") % \ + {'source': rpd_file.download_full_file_name, + 'destination': backup_full_file_name} + "\n" + \ + _("Error: %(inst)s") % {'inst': inst} + + dest = gio.File(path=backup_full_file_name) + if backup_duplicate_overwrite: + flags = gio.FILE_COPY_OVERWRITE + else: + flags = gio.FILE_COPY_NONE + + try: + source.copy(dest, self.progress_callback, flags, + cancellable=self.cancel_copy) + backup_succeeded = True + except gio.Error, inst: + fileNotBackedUpMessageDisplayed = True + rpd_file.add_problem(None, pn.BACKUP_ERROR, self.mount_name) + rpd_file.add_extra_detail('%s%s' % (pn.BACKUP_ERROR, self.mount_name), inst) + rpd_file.error_title = _('Backing up error') + rpd_file.error_msg = \ + _("Source: %(source)s\nDestination: %(destination)s") % \ + {'source': rpd_file.download_full_file_name, 'destination': backup_full_file_name} + "\n" + \ + _("Error: %(inst)s") % {'inst': inst} + logger.error("%s:\n%s", rpd_file.error_title, rpd_file.error_msg) + + if not backup_succeeded: + if rpd_file.status == config.STATUS_DOWNLOAD_FAILED: + rpd_file.status = config.STATUS_DOWNLOAD_AND_BACKUP_FAILED + else: + rpd_file.status = config.STATUS_BACKUP_PROBLEM + + self.total_downloaded += rpd_file.size + bytes_not_downloaded = rpd_file.size - self.amount_downloaded + if bytes_not_downloaded: + self.results_pipe.send((rpdmp.CONN_PARTIAL, (rpdmp.MSG_BYTES, (self.scan_pid, self.pid, self.total_downloaded, bytes_not_downloaded)))) + + self.results_pipe.send((rpdmp.CONN_PARTIAL, (rpdmp.MSG_FILE, + (backup_succeeded, rpd_file)))) + + + + + + diff --git a/rapid/config.py b/rapid/config.py index da2f5c0..6019d6a 100644 --- a/rapid/config.py +++ b/rapid/config.py @@ -15,7 +15,7 @@ ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -version = '0.4.0~b1' +version = '0.4.0~rc1' GCONF_KEY="/apps/rapid-photo-downloader" diff --git a/rapid/copyfiles.py b/rapid/copyfiles.py index 08daafe..65a6c6d 100644 --- a/rapid/copyfiles.py +++ b/rapid/copyfiles.py @@ -38,7 +38,7 @@ from gettext import gettext as _ class CopyFiles(multiprocessing.Process): def __init__(self, photo_download_folder, video_download_folder, files, - generate_thumbnails, scan_pid, + scan_pid, batch_size_MB, results_pipe, terminate_queue, run_event): multiprocessing.Process.__init__(self) @@ -48,7 +48,6 @@ class CopyFiles(multiprocessing.Process): self.photo_download_folder = photo_download_folder self.video_download_folder = video_download_folder self.files = files - self.generate_thumbnails = generate_thumbnails self.scan_pid = scan_pid self.no_files= len(self.files) self.run_event = run_event @@ -71,15 +70,17 @@ class CopyFiles(multiprocessing.Process): # it is - cancel the current copy self.cancel_copy.cancel() else: - chunk_downloaded = amount_downloaded - self.bytes_downloaded - if (chunk_downloaded > self.batch_size_bytes) or (amount_downloaded == total): - self.bytes_downloaded = amount_downloaded - if amount_downloaded == total: - # this function is called a couple of times when total is reached - chunk_downloaded = 0 - self.results_pipe.send((rpdmp.CONN_PARTIAL, (rpdmp.MSG_BYTES, (self.scan_pid, self.total_downloaded + amount_downloaded, chunk_downloaded)))) - if amount_downloaded == total: - self.bytes_downloaded = 0 + if not self.total_reached: + chunk_downloaded = amount_downloaded - self.bytes_downloaded + if (chunk_downloaded > self.batch_size_bytes) or (amount_downloaded == total): + self.bytes_downloaded = amount_downloaded + if amount_downloaded == total: + # this function is called a couple of times when total is reached + self.total_reached = True + + self.results_pipe.send((rpdmp.CONN_PARTIAL, (rpdmp.MSG_BYTES, (self.scan_pid, self.total_downloaded + amount_downloaded, chunk_downloaded)))) + if amount_downloaded == total: + self.bytes_downloaded = 0 def progress_callback(self, amount_downloaded, total): self.update_progress(amount_downloaded, total) @@ -105,11 +106,11 @@ class CopyFiles(multiprocessing.Process): if self.photo_temp_dir or self.video_temp_dir: - if self.generate_thumbnails: - self.thumbnail_maker = tn.Thumbnail() + self.thumbnail_maker = tn.Thumbnail() for i in range(len(self.files)): rpd_file = self.files[i] + self.total_reached = False # pause if instructed by the caller self.run_event.wait() @@ -151,20 +152,21 @@ class CopyFiles(multiprocessing.Process): # succeeded or not. It's neccessary to keep the user informed. self.total_downloaded += rpd_file.size - if copy_succeeded and self.generate_thumbnails: + if copy_succeeded and rpd_file.generate_thumbnail: thumbnail, thumbnail_icon = self.thumbnail_maker.get_thumbnail( temp_full_file_name, rpd_file.file_type, (160, 120), (100,100)) - self.results_pipe.send((rpdmp.CONN_PARTIAL, - (rpdmp.MSG_THUMB, (rpd_file.unique_id, - thumbnail_icon, thumbnail)))) + else: + thumbnail = None + thumbnail_icon = None if rpd_file.metadata is not None: rpd_file.metadata = None self.results_pipe.send((rpdmp.CONN_PARTIAL, (rpdmp.MSG_FILE, - (copy_succeeded, rpd_file, i + 1, temp_full_file_name)))) + (copy_succeeded, rpd_file, i + 1, temp_full_file_name, + thumbnail_icon, thumbnail)))) self.results_pipe.send((rpdmp.CONN_COMPLETE, None)) diff --git a/rapid/downloadtracker.py b/rapid/downloadtracker.py index 309da71..75c9c9d 100644 --- a/rapid/downloadtracker.py +++ b/rapid/downloadtracker.py @@ -19,7 +19,8 @@ import time from rpdfile import FILE_TYPE_PHOTO, FILE_TYPE_VIDEO -from config import STATUS_DOWNLOAD_FAILED, STATUS_DOWNLOADED_WITH_WARNING +from config import STATUS_DOWNLOAD_FAILED, STATUS_DOWNLOADED_WITH_WARNING, \ + STATUS_DOWNLOAD_AND_BACKUP_FAILED, STATUS_BACKUP_PROBLEM from gettext import gettext as _ @@ -28,10 +29,17 @@ class DownloadTracker: Track file downloads - their size, number, and any problems """ def __init__(self): + self.file_types_present_by_scan_pid = dict() + self._refresh_values() + + def _refresh_values(self): + """ these values are reset when a download is completed""" self.size_of_download_in_bytes_by_scan_pid = dict() - self.total_bytes_copied_in_bytes_by_scan_pid = dict() + self.raw_size_of_download_in_bytes_by_scan_pid = dict() + self.total_bytes_copied_by_scan_pid = dict() + self.total_bytes_backed_up_by_scan_pid = dict() self.no_files_in_download_by_scan_pid = dict() - self.file_types_present_by_scan_pid = dict() + # 'Download count' tracks the index of the file being downloaded # into the list of files that need to be downloaded -- much like # a counter in a for loop, e.g. 'for i in list', where i is the counter @@ -50,11 +58,16 @@ class DownloadTracker: self.total_video_failures = 0 self.total_warnings = 0 self.total_bytes_to_download = 0 + self.backups_performed_by_unique_id = dict() + + def set_no_backup_devices(self, no_backup_devices): + self.no_backup_devices = no_backup_devices def init_stats(self, scan_pid, bytes, no_files): self.no_files_in_download_by_scan_pid[scan_pid] = no_files self.rename_chunk[scan_pid] = bytes / 10 / no_files self.size_of_download_in_bytes_by_scan_pid[scan_pid] = bytes + self.rename_chunk[scan_pid] * no_files + self.raw_size_of_download_in_bytes_by_scan_pid[scan_pid] = bytes self.total_bytes_to_download += self.size_of_download_in_bytes_by_scan_pid[scan_pid] self.files_downloaded[scan_pid] = 0 self.photos_downloaded[scan_pid] = 0 @@ -62,6 +75,7 @@ class DownloadTracker: self.photo_failures[scan_pid] = 0 self.video_failures[scan_pid] = 0 self.warnings[scan_pid] = 0 + self.total_bytes_backed_up_by_scan_pid[scan_pid] = 0 def get_no_files_in_download(self, scan_pid): return self.no_files_in_download_by_scan_pid[scan_pid] @@ -81,11 +95,19 @@ class DownloadTracker: def get_no_warnings(self, scan_pid): return self.warnings.get(scan_pid, 0) + + def file_backed_up(self, unique_id): + self.backups_performed_by_unique_id[unique_id] = \ + self.backups_performed_by_unique_id.get(unique_id, 0) + 1 + + def all_files_backed_up(self, unique_id): + v = self.backups_performed_by_unique_id[unique_id] == self.no_backup_devices + return v def file_downloaded_increment(self, scan_pid, file_type, status): self.files_downloaded[scan_pid] += 1 - if status <> STATUS_DOWNLOAD_FAILED: + if status <> STATUS_DOWNLOAD_FAILED and status <> STATUS_DOWNLOAD_AND_BACKUP_FAILED: if file_type == FILE_TYPE_PHOTO: self.photos_downloaded[scan_pid] += 1 self.total_photos_downloaded += 1 @@ -93,7 +115,7 @@ class DownloadTracker: self.videos_downloaded[scan_pid] += 1 self.total_videos_downloaded += 1 - if status == STATUS_DOWNLOADED_WITH_WARNING: + if status == STATUS_DOWNLOADED_WITH_WARNING or status == STATUS_BACKUP_PROBLEM: self.warnings[scan_pid] += 1 self.total_warnings += 1 else: @@ -112,16 +134,19 @@ class DownloadTracker: """ # three components: copy (download), rename, and backup - percent_complete = ((float( - self.total_bytes_copied_in_bytes_by_scan_pid[scan_pid]) + percent_complete = (((float( + self.total_bytes_copied_by_scan_pid[scan_pid]) + self.rename_chunk[scan_pid] * self.files_downloaded[scan_pid]) - / self.size_of_download_in_bytes_by_scan_pid[scan_pid]) * 100 + + self.total_bytes_backed_up_by_scan_pid[scan_pid]) + / (self.size_of_download_in_bytes_by_scan_pid[scan_pid] + + self.raw_size_of_download_in_bytes_by_scan_pid[scan_pid] * + self.no_backup_devices)) * 100 return percent_complete def get_overall_percent_complete(self): total = 0 - for scan_pid in self.total_bytes_copied_in_bytes_by_scan_pid: - total += (self.total_bytes_copied_in_bytes_by_scan_pid[scan_pid] + + for scan_pid in self.total_bytes_copied_by_scan_pid: + total += (self.total_bytes_copied_by_scan_pid[scan_pid] + (self.rename_chunk[scan_pid] * self.files_downloaded[scan_pid])) @@ -129,7 +154,10 @@ class DownloadTracker: return percent_complete def set_total_bytes_copied(self, scan_pid, total_bytes): - self.total_bytes_copied_in_bytes_by_scan_pid[scan_pid] = total_bytes + self.total_bytes_copied_by_scan_pid[scan_pid] = total_bytes + + def increment_bytes_backed_up(self, scan_pid, chunk_downloaded): + self.total_bytes_backed_up_by_scan_pid[scan_pid] += chunk_downloaded def set_download_count_for_file(self, unique_id, download_count): self.download_count_for_file_by_unique_id[unique_id] = download_count @@ -152,12 +180,13 @@ class DownloadTracker: else return False """ return (self.total_warnings == 0 and - self.photo_failures == 0 and - self.video_failures == 0) + self.total_photo_failures == 0 and + self.total_video_failures == 0) def purge(self, scan_pid): del self.no_files_in_download_by_scan_pid[scan_pid] del self.size_of_download_in_bytes_by_scan_pid[scan_pid] + del self.raw_size_of_download_in_bytes_by_scan_pid[scan_pid] del self.photos_downloaded[scan_pid] del self.videos_downloaded[scan_pid] del self.files_downloaded[scan_pid] @@ -166,7 +195,7 @@ class DownloadTracker: del self.warnings[scan_pid] def purge_all(self): - self.__init__() + self._refresh_values() @@ -241,9 +270,9 @@ class TimeRemaining: t.time_mark = time.time() self.times[scan_pid] = t - def update(self, scan_pid, total_size): + def update(self, scan_pid, bytes_downloaded): if scan_pid in self.times: - self.times[scan_pid].downloaded = total_size + self.times[scan_pid].downloaded += bytes_downloaded now = time.time() tm = self.times[scan_pid].time_mark amt_time = now - tm diff --git a/rapid/glade3/prefs.ui b/rapid/glade3/prefs.ui index ddbacdf..9d1eb31 100644 --- a/rapid/glade3/prefs.ui +++ b/rapid/glade3/prefs.ui @@ -1434,6 +1434,10 @@ <property name="width_chars">2</property> <property name="xalign">1</property> <property name="truncate_multiline">True</property> + <property name="primary_icon_activatable">False</property> + <property name="secondary_icon_activatable">False</property> + <property name="primary_icon_sensitive">True</property> + <property name="secondary_icon_sensitive">True</property> <property name="adjustment">hour_adjustment</property> <property name="numeric">True</property> <signal name="value-changed" handler="on_hour_spinbutton_value_changed" swapped="no"/> @@ -1465,6 +1469,10 @@ <property name="width_chars">2</property> <property name="xalign">1</property> <property name="truncate_multiline">True</property> + <property name="primary_icon_activatable">False</property> + <property name="secondary_icon_activatable">False</property> + <property name="primary_icon_sensitive">True</property> + <property name="secondary_icon_sensitive">True</property> <property name="adjustment">minute_adjustment</property> <property name="numeric">True</property> <signal name="value-changed" handler="on_minute_spinbutton_value_changed" swapped="no"/> @@ -2476,6 +2484,10 @@ You can download photos from multiple devices simultaneously, or you can specify <property name="can_focus">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="invisible_char">•</property> + <property name="primary_icon_activatable">False</property> + <property name="secondary_icon_activatable">False</property> + <property name="primary_icon_sensitive">True</property> + <property name="secondary_icon_sensitive">True</property> <signal name="changed" handler="on_backup_identifier_entry_changed" swapped="no"/> </object> <packing> @@ -2510,6 +2522,10 @@ You can download photos from multiple devices simultaneously, or you can specify <property name="can_focus">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="invisible_char">•</property> + <property name="primary_icon_activatable">False</property> + <property name="secondary_icon_activatable">False</property> + <property name="primary_icon_sensitive">True</property> + <property name="secondary_icon_sensitive">True</property> <signal name="changed" handler="on_video_backup_identifier_entry_changed" swapped="no"/> </object> <packing> @@ -2850,7 +2866,21 @@ You can download photos from multiple devices simultaneously, or you can specify </packing> </child> <child> - <placeholder/> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="xpad">12</property> + <property name="label" translatable="yes">Performance</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> </child> <child> <object class="GtkHBox" id="hbox25"> @@ -2879,7 +2909,15 @@ You can download photos from multiple devices simultaneously, or you can specify <placeholder/> </child> <child> - <placeholder/> + <object class="GtkCheckButton" id="generate_thumbnails_checkbutton"> + <property name="label" translatable="yes">Generate thumbnails (slower)</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_action_appearance">False</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_generate_thumbnails_checkbutton_toggled" swapped="no"/> + </object> </child> </object> <packing> diff --git a/rapid/preferencesdialog.py b/rapid/preferencesdialog.py index 0f46406..368b064 100644 --- a/rapid/preferencesdialog.py +++ b/rapid/preferencesdialog.py @@ -1177,6 +1177,8 @@ class PreferencesDialog(): self.prefs.auto_exit_force) self.auto_delete_checkbutton.set_active( self.prefs.auto_delete) + self.generate_thumbnails_checkbutton.set_active( + self.prefs.generate_thumbnails) self.update_misc_controls() @@ -1484,16 +1486,16 @@ class PreferencesDialog(): def on_auto_exit_force_checkbutton_toggled(self, checkbutton): self.prefs.auto_exit_force = checkbutton.get_active() - def on_scan_metadata_checkbutton_toggled(self, checkbutton): - self.prefs.enable_previews = checkbutton.get_active() - def on_autodetect_device_checkbutton_toggled(self, checkbutton): self.prefs.device_autodetection = checkbutton.get_active() self.update_device_controls() - def on_autodetect_psd_checkbutton_toggled(self, checkbutton): + def on_autodetect_psd_checkbutton_toggled(self, checkbutton): self.prefs.device_autodetection_psd = checkbutton.get_active() + def on_generate_thumbnails_checkbutton_toggled(self, checkbutton): + self.prefs.generate_thumbnails = checkbutton.get_active() + def on_backup_duplicate_overwrite_radiobutton_toggled(self, widget): self.prefs.backup_duplicate_overwrite = widget.get_active() diff --git a/rapid/prefsrapid.py b/rapid/prefsrapid.py index 81a425b..f13530f 100644 --- a/rapid/prefsrapid.py +++ b/rapid/prefsrapid.py @@ -125,14 +125,13 @@ class RapidPreferences(prefs.Preferences): _('Budapest'), _('Rome'), _('Moscow'), _('Delhi'), _('Warsaw'), _('Jakarta'), _('Madrid'), _('Stockholm')]), "synchronize_raw_jpg": prefs.Value(prefs.BOOL, False), - #~ "hpaned_pos": prefs.Value(prefs.INT, 0), "vpaned_pos": prefs.Value(prefs.INT, 0), "main_window_size_x": prefs.Value(prefs.INT, 0), "main_window_size_y": prefs.Value(prefs.INT, 0), "main_window_maximized": prefs.Value(prefs.INT, 0), "show_warning_downloading_from_camera": prefs.Value(prefs.BOOL, True), #~ "preview_zoom": prefs.Value(prefs.INT, zoom), - "enable_previews": prefs.Value(prefs.BOOL, True), + "generate_thumbnails": prefs.Value(prefs.BOOL, True), } def __init__(self): diff --git a/rapid/rapid.py b/rapid/rapid.py index df60790..335db34 100755 --- a/rapid/rapid.py +++ b/rapid/rapid.py @@ -67,6 +67,7 @@ import metadatavideo import scan as scan_process import copyfiles import subfolderfile +import backupfile import errorlog @@ -212,6 +213,7 @@ class DeviceCollection(gtk.TreeView): # please note, at program startup, self.row_height() will be less than it will be when already running # e.g. when starting with 3 cards, it could be 18, but when adding 2 cards to the already running program # (with one card at startup), it could be 21 + # must account for header row at the top row_height = self.get_background_area(0, self.get_column(0))[3] + 1 height = (len(self.map_process_to_row) + 1) * row_height self.parent_app.device_collection_scrolledwindow.set_size_request(-1, height) @@ -283,15 +285,16 @@ class DeviceCollection(gtk.TreeView): Look for left single click on eject button """ if event.button == 1: - x = int(event.x) - y = int(event.y) - path, column, cell_x, cell_y = self.get_path_at_pos(x, y) - if path is not None: - if column == self.get_column(0): - if cell_x >= column.get_width() - self.eject_pixbuf.get_width(): - iter = self.liststore.get_iter(path) - if self.liststore.get_value(iter, 5) is not None: - self.unmount(process_id = self.liststore.get_value(iter, 6)) + if len (self.liststore): + x = int(event.x) + y = int(event.y) + path, column, cell_x, cell_y = self.get_path_at_pos(x, y) + if path is not None: + if column == self.get_column(0): + if cell_x >= column.get_width() - self.eject_pixbuf.get_width(): + iter = self.liststore.get_iter(path) + if self.liststore.get_value(iter, 5) is not None: + self.unmount(process_id = self.liststore.get_value(iter, 6)) def unmount(self, process_id): device = self.devices_by_scan_pid[process_id] @@ -467,6 +470,12 @@ class ThumbnailDisplay(gtk.IconView): self.total_thumbs_to_generate = 0 self.thumbnails_generated = 0 + # dict of scan_pids that are having thumbnails generated + # value is the thumbnail process id + # this is needed when terminating thumbnailing early such as when + # user clicks download before the thumbnailing is finished + self.generating_thumbnails = {} + self.thumbnails = {} self.previews = {} self.previews_being_fetched = set() @@ -518,16 +527,11 @@ class ThumbnailDisplay(gtk.IconView): self.add_attribute(image, "filename", 3) self.add_attribute(image, "status", 8) - - #set the background color to a darkish grey self.modify_base(gtk.STATE_NORMAL, gtk.gdk.Color('#444444')) self.show_all() - self._setup_icons() - - self.connect('item-activated', self.on_item_activated) @@ -870,7 +874,14 @@ class ThumbnailDisplay(gtk.IconView): """Initiate thumbnail generation for files scanned in one process """ rpd_files = [self.rpd_files[unique_id] for unique_id in self.process_index[scan_pid]] - self.thumbnail_manager.add_task(rpd_files) + thumbnail_pid = self.thumbnail_manager.add_task((scan_pid, rpd_files)) + self.generating_thumbnails[scan_pid] = thumbnail_pid + + def _set_thumbnail(self, unique_id, icon): + treerowref = self.treerow_index[unique_id] + path = treerowref.get_path() + iter = self.liststore.get_iter(path) + self.liststore.set(iter, 0, icon) def update_thumbnail(self, thumbnail_data): """ @@ -886,24 +897,51 @@ class ThumbnailDisplay(gtk.IconView): # get the thumbnail icon in PIL format thumbnail_icon = thumbnail_icon.get_image() - treerowref = self.treerow_index[unique_id] - path = treerowref.get_path() - iter = self.liststore.get_iter(path) - if thumbnail_icon: - self.liststore.set(iter, 0, thumbnail_icon) + self._set_thumbnail(unique_id, thumbnail_icon) if len(thumbnail_data) > 2: # get the 2nd image in PIL format self.thumbnails[unique_id] = thumbnail_data[2].get_image() + def terminate_thumbnail_generation(self, scan_pid): + """ + Terminates thumbnail generation if thumbnails are currently + being generated for this scan_pid + """ + + if scan_pid in self.generating_thumbnails: + terminated = True + self.thumbnail_manager.terminate_process( + self.generating_thumbnails[scan_pid]) + del self.generating_thumbnails[scan_pid] + + if len(self.generating_thumbnails) == 0: + self._reset_thumbnail_tracking_and_display() + else: + terminated = False + return terminated + + def mark_thumbnails_needed(self, rpd_files): + for rpd_file in rpd_files: + if rpd_file.unique_id not in self.thumbnails: + rpd_file.generate_thumbnail = True + + def _reset_thumbnail_tracking_and_display(self): + self.rapid_app.download_progressbar.set_fraction(0.0) + self.rapid_app.download_progressbar.set_text('') + self.thumbnails_generated = 0 + self.total_thumbs_to_generate = 0 + def thumbnail_results(self, source, condition): connection = self.thumbnail_manager.get_pipe(source) conn_type, data = connection.recv() if conn_type == rpdmp.CONN_COMPLETE: + scan_pid = data + del self.generating_thumbnails[scan_pid] connection.close() return False else: @@ -916,14 +954,11 @@ class ThumbnailDisplay(gtk.IconView): # clear progress bar information if all thumbnails have been # extracted if self.thumbnails_generated == self.total_thumbs_to_generate: - self.rapid_app.download_progressbar.set_fraction(0.0) - self.rapid_app.download_progressbar.set_text('') - self.thumbnails_generated = 0 - self.total_thumbs_to_generate = 0 - + self._reset_thumbnail_tracking_and_display() else: - self.rapid_app.download_progressbar.set_fraction( - float(self.thumbnails_generated) / self.total_thumbs_to_generate) + if self.total_thumbs_to_generate: + self.rapid_app.download_progressbar.set_fraction( + float(self.thumbnails_generated) / self.total_thumbs_to_generate) return True @@ -937,7 +972,11 @@ class ThumbnailDisplay(gtk.IconView): preview_image = preview_full_size.get_image() self.previews[unique_id] = preview_image self.rapid_app.update_preview_image(unique_id, preview_image) - + + # user can turn off option for thumbnail generation after a scan + if unique_id not in self.thumbnails: + self._set_thumbnail(unique_id, preview_small.get_image()) + def clear_all(self, scan_pid=None, keep_downloaded_files=False): """ @@ -991,7 +1030,7 @@ class TaskManager: def _setup_task(self, task): - task_results_conn, task_process_conn = Pipe(duplex=False) + task_results_conn, task_process_conn = self._setup_pipe() source = task_results_conn.fileno() self._pipes[source] = task_results_conn @@ -1001,7 +1040,11 @@ class TaskManager: run_event = Event() run_event.set() - return self._initiate_task(task, task_process_conn, terminate_queue, run_event) + return self._initiate_task(task, task_results_conn, task_process_conn, + terminate_queue, run_event) + + def _setup_pipe(self): + return Pipe(duplex=False) def _initiate_task(self, task, task_process_conn, terminate_queue, run_event): logger.error("Implement child class method!") @@ -1009,7 +1052,7 @@ class TaskManager: def processes(self): for i in range(len(self._processes)): - yield self._processes[i] + yield self._processes[i] def start(self): self.paused = False @@ -1024,6 +1067,26 @@ class TaskManager: run_event = scan[2] if run_event.is_set(): run_event.clear() + + def _terminate_process(self, p): + self._send_termination_msg(p) + # The process might be paused: let it run + run_event = p[2] + if not run_event.is_set(): + run_event.set() + + def _send_termination_msg(self, p): + p[1].put(None) + + def terminate_process(self, process_id): + """ + Send a signal to process with matching process_id that it should + immediately terminate + """ + for p in self.processes(): + if p[0].pid == process_id: + if p[0].is_alive(): + self._terminate_process(p) def request_termination(self): """ @@ -1033,11 +1096,7 @@ class TaskManager: for p in self.processes(): if p[0].is_alive(): requested = True - p[1].put(None) - # The process might be paused: let it run - run_event = p[2] - if not run_event.is_set(): - run_event.set() + self._terminate_process(p) return requested @@ -1053,6 +1112,8 @@ class TaskManager: for p in self.processes(): if p[0].is_alive(): + logger.info("Forcefully terminating %s in %s" , p[0].name, + self.__class__.__name__) p[0].terminate() @@ -1078,7 +1139,9 @@ class ScanManager(TaskManager): self.add_device_function = add_device_function self.generate_folder = generate_folder - def _initiate_task(self, device, task_process_conn, terminate_queue, run_event): + def _initiate_task(self, device, task_results_conn, task_process_conn, + terminate_queue, run_event): + scan = scan_process.Scan(device.get_path(), self.batch_size, self.generate_folder, task_process_conn, terminate_queue, run_event) scan.start() @@ -1094,16 +1157,16 @@ class ScanManager(TaskManager): class CopyFilesManager(TaskManager): - def _initiate_task(self, task, task_process_conn, terminate_queue, run_event): + def _initiate_task(self, task, task_results_conn, + task_process_conn, terminate_queue, run_event): photo_download_folder = task[0] video_download_folder = task[1] scan_pid = task[2] files = task[3] - generate_thumbnails = task[4] copy_files = copyfiles.CopyFiles(photo_download_folder, video_download_folder, - files, generate_thumbnails, + files, scan_pid, self.batch_size, task_process_conn, terminate_queue, run_event) copy_files.start() @@ -1111,14 +1174,68 @@ class CopyFilesManager(TaskManager): return copy_files.pid class ThumbnailManager(TaskManager): - - def _initiate_task(self, files, task_process_conn, terminate_queue, run_event): - generator = tn.GenerateThumbnails(files, self.batch_size, task_process_conn, terminate_queue, run_event) + def _initiate_task(self, task, task_results_conn, + task_process_conn, terminate_queue, run_event): + scan_pid = task[0] + files = task[1] + generator = tn.GenerateThumbnails(scan_pid, files, self.batch_size, + task_process_conn, terminate_queue, + run_event) generator.start() self._processes.append((generator, terminate_queue, run_event)) return generator.pid + +class BackupFilesManager(TaskManager): + """ + Handles backup processes. This is a little different from other Task + Manager classes in that its pipe is Duplex, and the work done by it + is not pre-assigned when the process is started. + """ + def __init__(self, results_callback, batch_size): + TaskManager.__init__(self, results_callback, batch_size) + self.backup_devices_by_path = {} - + def _setup_pipe(self): + return Pipe(duplex=True) + + def _send_termination_msg(self, p): + p[1].put(None) + p[3].send((None, None, None, None)) + + def _initiate_task(self, task, task_results_conn, task_process_conn, + terminate_queue, run_event): + path = task[0] + name = task[1] + backup_files = backupfile.BackupFiles(path, name, self.batch_size, + task_process_conn, terminate_queue, + run_event) + backup_files.start() + self._processes.append((backup_files, terminate_queue, run_event, + task_results_conn)) + + self.backup_devices_by_path[path] = (task_results_conn, backup_files.pid) + + return backup_files.pid + + def backup_file(self, move_succeeded, rpd_file, path_suffix, + backup_duplicate_overwrite): + for path in self.backup_devices_by_path: + task_results_conn = self.backup_devices_by_path[path][0] + task_results_conn.send((move_succeeded, rpd_file, path_suffix, + backup_duplicate_overwrite)) + + def add_device(self, path, name): + """ + Convenience function to setup adding a backup device + """ + return self.add_task((path, name)) + + def remove_device(self, path): + pid = self.backup_devices_by_path[path][1] + self.terminate_process(pid) + del self.backup_devices_by_path[path] + + class SingleInstanceTaskManager: """ Base class to manage single instance processes. Examples are daemon @@ -1174,8 +1291,6 @@ class SubfolderFileManager(SingleInstanceTaskManager): self.results_callback(move_succeeded, rpd_file) return True - - class ResizblePilImage(gtk.DrawingArea): def __init__(self, bg_color=None): gtk.DrawingArea.__init__(self) @@ -1361,27 +1476,30 @@ class RapidApp(dbus.service.Object): def _terminate_processes(self, terminate_file_copies=False): - # FIXME: need more fine grained tuning here - must cancel large file - # copies midstream if terminate_file_copies: logger.info("Terminating all processes...") scan_termination_requested = self.scan_manager.request_termination() thumbnails_termination_requested = self.thumbnails.thumbnail_manager.request_termination() + backup_termination_requested = self.backup_manager.request_termination() + if terminate_file_copies: copy_files_termination_requested = self.copy_files_manager.request_termination() else: copy_files_termination_requested = False - if scan_termination_requested or thumbnails_termination_requested: + if (scan_termination_requested or thumbnails_termination_requested or + backup_termination_requested): time.sleep(1) if (self.scan_manager.get_no_active_processes() > 0 or - self.thumbnails.thumbnail_manager.get_no_active_processes() > 0): + self.thumbnails.thumbnail_manager.get_no_active_processes() > 0 or + self.backup_manager.get_no_active_processes() > 0): time.sleep(1) # must try again, just in case a new scan has meanwhile started! self.scan_manager.request_termination() self.thumbnails.thumbnail_manager.terminate_forcefully() self.scan_manager.terminate_forcefully() + self.backup_manager.terminate_forcefully() if terminate_file_copies and copy_files_termination_requested: time.sleep(1) @@ -1497,7 +1615,14 @@ class RapidApp(dbus.service.Object): self.vmonitor.connect("mount-added", self.on_mount_added) self.vmonitor.connect("mount-removed", self.on_mount_removed) - + + def _backup_device_name(self, path): + if self.backup_devices[path] is None: + name = path + else: + name = self.backup_devices[path].get_name() + return name + def setup_devices(self, on_startup, on_preference_change, block_auto_start): """ @@ -1527,9 +1652,6 @@ class RapidApp(dbus.service.Object): mounts = [] self.backup_devices = {} - # Clear download statistics and tracking - # FIXME - if self.using_volume_monitor(): # either using automatically detected backup devices # or download devices @@ -1567,6 +1689,12 @@ class RapidApp(dbus.service.Object): # will backup to this path, but don't need any volume info # associated with it self.backup_devices[self.prefs.backup_location] = None + + for path in self.backup_devices: + name = self._backup_device_name(path) + self.backup_manager.add_device(path, name) + + self.update_no_backup_devices() # Display amount of free space in a status bar message self.display_free_space() @@ -1580,12 +1708,6 @@ class RapidApp(dbus.service.Object): (self.prefs.auto_download_upon_device_insertion and not on_startup))) - - self.testing_auto_exit = False - self.testing_auto_exit_trip = len(mounts) - self.testing_auto_exit_trip_counter = 0 - - for m in mounts: path, mount = m device = dv.Device(path=path, mount=mount) @@ -1654,6 +1776,43 @@ class RapidApp(dbus.service.Object): # user manually specified the path return True return False + + def update_no_backup_devices(self): + self.download_tracker.set_no_backup_devices(len(self.backup_devices)) + + def refresh_backup_media(self): + """ + Setup the backup media + + Assumptions: this is being called after the user has changed their + preferences AND download media has already been setup + """ + + # terminate any running backup processes + self.backup_manager.request_termination() + + self.backup_devices = {} + if self.prefs.backup_images: + if not self.prefs.backup_device_autodetection: + # user manually specified backup location + # will backup to this path, but don't need any volume info associated with it + self.backup_devices[self.prefs.backup_location] = None + else: + for mount in self.vmonitor.get_mounts(): + if not mount.is_shadowed(): + path = mount.get_root().get_path() + if path: + if self.check_if_backup_mount(path): + # is a backup volume + if path not in self.backup_devices: + self.backup_devices[path] = mount + + for path in self.backup_devices: + name = self._backup_device_name(path) + self.backup_manager.add_device(path, name) + + self.update_no_backup_devices() + self.display_free_space() def using_volume_monitor(self): """ @@ -1688,6 +1847,9 @@ class RapidApp(dbus.service.Object): if is_backup_mount: if path not in self.backup_devices: self.backup_devices[path] = mount + name = self._backup_device_name(path) + self.backup_manager.add_device(path, name) + self.update_no_backup_devices() self.display_free_space() elif self.prefs.device_autodetection and (dv.is_DCIM_device(path) or @@ -1720,8 +1882,6 @@ class RapidApp(dbus.service.Object): del self.mounts_by_path[path] # temp directory should be cleaned by finishing of process - #~ if scan_pid in self.download_active_by_scan_pid: - #~ self._clean_temp_dirs_for_scan_pid(scan_pid) self.thumbnails.clear_all(scan_pid = scan_pid, keep_downloaded_files = True) self.device_collection.remove_device(scan_pid) @@ -1732,6 +1892,8 @@ class RapidApp(dbus.service.Object): elif path in self.backup_devices: del self.backup_devices[path] self.display_free_space() + self.backup_manager.remove_device(path) + self.update_no_backup_devices() # may need to disable download button and menu self.set_download_action_sensitivity() @@ -1892,8 +2054,9 @@ class RapidApp(dbus.service.Object): # Track which temporary directories are created when downloading files self.temp_dirs_by_scan_pid = dict() - # Track which downloads are running + # Track which downloads and backups are running self.download_active_by_scan_pid = [] + self.backups_active_by_scan_pid = [] @@ -1920,10 +2083,19 @@ class RapidApp(dbus.service.Object): # it is unset when all downloads are completed if self.download_start_time is None: self.download_start_time = datetime.datetime.now() - + + # Set status to download pending self.thumbnails.mark_download_pending(files_by_scan_pid) + + # disable refresh and preferences change while download is occurring + self.enable_prefs_and_refresh(enabled=False) + for scan_pid in files_by_scan_pid: files = files_by_scan_pid[scan_pid] + # if generating thumbnails for this scan_pid, stop it + if self.thumbnails.terminate_thumbnail_generation(scan_pid): + self.thumbnails.mark_thumbnails_needed(files) + self.download_files(files, scan_pid) self.set_download_action_label(is_download = False) @@ -1967,6 +2139,9 @@ class RapidApp(dbus.service.Object): bytes=download_size, no_files=len(files)) + if self.prefs.backup_images: + download_size = download_size * (len(self.backup_devices) + 1) + self.time_remaining.set(scan_pid, download_size) self.time_check.set_download_mark() @@ -1976,10 +2151,14 @@ class RapidApp(dbus.service.Object): if len(self.download_active_by_scan_pid) > 1: self.display_summary_notification = True + if self.auto_start_is_on and self.prefs.generate_thumbnails: + for rpd_file in files: + rpd_file.generate_thumbnail = True + # Initiate copy files process self.copy_files_manager.add_task((photo_download_folder, video_download_folder, scan_pid, - files, self.auto_start_is_on)) + files)) def copy_files_results(self, source, condition): """ @@ -2002,9 +2181,14 @@ class RapidApp(dbus.service.Object): percent_complete = self.download_tracker.get_percent_complete(scan_pid) self.device_collection.update_progress(scan_pid, percent_complete, None, None) - self.time_remaining.update(scan_pid, total_downloaded) + self.time_remaining.update(scan_pid, bytes_downloaded=chunk_downloaded) elif msg_type == rpdmp.MSG_FILE: - download_succeeded, rpd_file, download_count, temp_full_file_name = data + download_succeeded, rpd_file, download_count, temp_full_file_name, thumbnail_icon, thumbnail = data + + if thumbnail is not None or thumbnail_icon is not None: + self.thumbnails.update_thumbnail((rpd_file.unique_id, + thumbnail_icon, + thumbnail)) self.download_tracker.set_download_count_for_file( rpd_file.unique_id, download_count) @@ -2025,11 +2209,7 @@ class RapidApp(dbus.service.Object): download_succeeded, download_count, rpd_file - ) - elif msg_type == rpdmp.MSG_THUMB: - #~ unique_id, thumbnail, thumbnail_icon = data - #~ thumbnail_data = (unique_id - self.thumbnails.update_thumbnail(data) + ) return True else: @@ -2040,11 +2220,10 @@ class RapidApp(dbus.service.Object): def download_is_occurring(self): - """Returns True if a file is currently being downloaded or renamed + """Returns True if a file is currently being downloaded, renamed or + backed up """ - v = not len(self.download_active_by_scan_pid) == 0 - #~ logger.info("Download is occurring: %s", v) - return v + return not len(self.download_active_by_scan_pid) == 0 # # # # Create folder and file names for downloaded files @@ -2058,16 +2237,65 @@ class RapidApp(dbus.service.Object): scan_pid = rpd_file.scan_pid unique_id = rpd_file.unique_id - self.thumbnails.update_status_post_download(rpd_file) - + if rpd_file.status == config.STATUS_DOWNLOADED_WITH_WARNING: + self.log_error(config.WARNING, rpd_file.error_title, + rpd_file.error_msg, rpd_file.error_extra_detail) + self.error_title = '' + self.error_msg = '' + self.error_extra_detail = '' + + + if self.prefs.backup_images and len(self.backup_devices): + if self.prefs.backup_device_autodetection: + if rpd_file.file_type == rpdfile.FILE_TYPE_PHOTO: + path_suffix = self.prefs.backup_identifier + else: + path_suffix = self.prefs.video_backup_identifier + else: + path_suffix = None + + self.backup_manager.backup_file(move_succeeded, rpd_file, + path_suffix, + self.prefs.backup_duplicate_overwrite) + else: + self.file_download_finished(move_succeeded, rpd_file) + + + def backup_results(self, source, condition): + connection = self.backup_manager.get_pipe(source) + conn_type, msg_data = connection.recv() + if conn_type == rpdmp.CONN_PARTIAL: + msg_type, data = msg_data + + if msg_type == rpdmp.MSG_BYTES: + scan_pid, backup_pid, total_downloaded, chunk_downloaded = data + self.download_tracker.increment_bytes_backed_up(scan_pid, + chunk_downloaded) + self.time_check.increment(bytes_downloaded=chunk_downloaded) + percent_complete = self.download_tracker.get_percent_complete(scan_pid) + self.device_collection.update_progress(scan_pid, percent_complete, + None, None) + self.time_remaining.update(scan_pid, bytes_downloaded=chunk_downloaded) + + elif msg_type == rpdmp.MSG_FILE: + backup_succeeded, rpd_file = data + self.download_tracker.file_backed_up(rpd_file.unique_id) + if self.download_tracker.all_files_backed_up(rpd_file.unique_id): + self.file_download_finished(backup_succeeded, rpd_file) + return True + else: + return False + + + def file_download_finished(self, succeeded, rpd_file): + scan_pid = rpd_file.scan_pid + unique_id = rpd_file.unique_id # Update error log window if neccessary - if not move_succeeded: + if not succeeded: self.log_error(config.SERIOUS_ERROR, rpd_file.error_title, rpd_file.error_msg, rpd_file.error_extra_detail) - elif rpd_file.status == config.STATUS_DOWNLOADED_WITH_WARNING: - self.log_error(config.WARNING, rpd_file.error_title, - rpd_file.error_msg, rpd_file.error_extra_detail) - + + self.thumbnails.update_status_post_download(rpd_file) self.download_tracker.file_downloaded_increment(scan_pid, rpd_file.file_type, rpd_file.status) @@ -2090,6 +2318,7 @@ class RapidApp(dbus.service.Object): if not self.download_is_occurring(): logger.debug("Download completed") + self.enable_prefs_and_refresh(enabled=True) self.notify_download_complete() self.download_progressbar.set_fraction(0.0) @@ -2101,6 +2330,7 @@ class RapidApp(dbus.service.Object): if ((self.prefs.auto_exit and self.download_tracker.no_errors_or_warnings()) or self.prefs.auto_exit_force): if not self.thumbnails.files_remain_to_download(): + self._terminate_processes() gtk.main_quit() self.download_tracker.purge_all() @@ -2113,8 +2343,8 @@ class RapidApp(dbus.service.Object): self.job_code = '' self.download_start_time = None - - + + def update_time_remaining(self): update, download_speed = self.time_check.check_for_update() if update: @@ -2167,9 +2397,11 @@ class RapidApp(dbus.service.Object): device = self.device_collection.get_device(scan_pid) if device.mount is None: - notificationName = PROGRAM_NAME + notification_name = PROGRAM_NAME + icon = self.application_icon else: - notificationName = device.get_name() + notification_name = device.get_name() + icon = device.get_icon(self.notification_icon_size) no_photos_downloaded = self.download_tracker.get_no_files_downloaded( scan_pid, rpdfile.FILE_TYPE_PHOTO) @@ -2194,8 +2426,8 @@ class RapidApp(dbus.service.Object): if no_warnings: message = "%s\n%s " % (message, no_warnings) + _("warnings") - n = pynotify.Notification(notificationName, message) - n.set_icon_from_pixbuf(device.get_icon(self.notification_icon_size)) + n = pynotify.Notification(notification_name, message) + n.set_icon_from_pixbuf(icon) n.show() @@ -2265,6 +2497,8 @@ class RapidApp(dbus.service.Object): files_to_download = self.download_tracker.get_no_files_in_download(scan_pid) file_types = self.download_tracker.get_file_types_present(scan_pid) completed = files_downloaded == files_to_download + if completed and self.prefs.backup_images: + completed = self.download_tracker.all_files_backed_up(unique_id) if completed: files_remaining = self.thumbnails.get_no_files_remaining(scan_pid) @@ -2393,7 +2627,6 @@ class RapidApp(dbus.service.Object): Called when user changes the program's preferences """ logger.debug("Preference change detected: %s", key) - if key == 'show_log_dialog': self.menu_log_window.set_active(value) @@ -2423,10 +2656,6 @@ class RapidApp(dbus.service.Object): # Check if stored sequence no is being used self._check_for_sequence_value_use() - #~ elif key == 'job_codes': - #~ # update job code list in left pane - #~ self.selection_vbox.update_job_code_combo() - elif key in ['download_folder', 'video_download_folder']: self.display_free_space() @@ -2449,7 +2678,7 @@ class RapidApp(dbus.service.Object): self.start_volume_monitor() logger.info("Backup preferences were changed.") - logger.info("self.refreshBackupMedia()") + self.refresh_backup_media() self.rerun_setup_available_backup_media = False @@ -2516,6 +2745,8 @@ class RapidApp(dbus.service.Object): self.prev_image_action = builder.get_object("prev_image_action") self.menu_log_window = builder.get_object("menu_log_window") self.speed_label = builder.get_object("speed_label") + self.refresh_action = builder.get_object("refresh_action") + self.preferences_action = builder.get_object("preferences_action") # Only enable this action when actually displaying a preview self.next_image_action.set_sensitive(False) @@ -2583,11 +2814,10 @@ class RapidApp(dbus.service.Object): """ Set the size of the device collection scrolled window widget """ - - if self.device_collection.map_process_to_row: height = self.device_collection_viewport.size_request()[1] self.device_collection_scrolledwindow.set_size_request(-1, height) + self.main_vpaned.set_position(height) else: # don't allow the media collection to be absolutely empty self.device_collection_scrolledwindow.set_size_request(-1, 47) @@ -2633,18 +2863,56 @@ class RapidApp(dbus.service.Object): self.warning_image.hide() self.warning_vseparator.hide() + def enable_prefs_and_refresh(self, enabled): + """ + If enable is true, then the user is able to activate the preferences + or refresh command. + The intention is to be able to disable this during a download + """ + self.refresh_action.set_sensitive(enabled) + self.preferences_action.set_sensitive(enabled) + def statusbar_message(self, msg): self.rapid_statusbar.push(self.statusbar_context_id, msg) def statusbar_message_remove(self): self.rapid_statusbar.pop(self.statusbar_context_id) + + def display_backup_mounts(self): + """ + Create a message to be displayed to the user showing which backup + mounts will be used + """ + message = '' + + paths = self.backup_devices.keys() + i = 0 + v = len(paths) + prefix = '' + for b in paths: + if v > 1: + if i < (v -1) and i > 0: + prefix = ', ' + elif i == (v - 1) : + prefix = " " + _("and") + " " + i += 1 + message = "%s%s'%s'" % (message, prefix, self.backup_devices[b].get_name()) + + if v > 1: + message = _("Using backup devices") + " %s" % message + elif v == 1: + message = _("Using backup device") + " %s" % message + else: + message = _("No backup devices detected") + + return message def display_free_space(self): """ Displays the amount of space free on the filesystem the files will be downloaded to. - Also displays backup volumes / path being used. (NOT IMPLEMENTED YET) + Also displays backup volumes / path being used. """ photo_dir = self.is_valid_download_dir(path=self.prefs.download_folder, is_photo_dir=True, show_error_in_log=True) video_dir = self.is_valid_download_dir(path=self.prefs.video_download_folder, is_photo_dir=False, show_error_in_log=True) @@ -2697,12 +2965,12 @@ class RapidApp(dbus.service.Object): msg = " " + _("%(free)s free") % {'free': free} - if self.prefs.backup_images and False: #FIXME: skip this for now! + if self.prefs.backup_images: if not self.prefs.backup_device_autodetection: # user manually specified backup location msg2 = _('Backing up to %(path)s') % {'path':self.prefs.backup_location} else: - msg2 = self.displayBackupVolumes() #FIXME + msg2 = self.display_backup_mounts() if msg: msg = _("%(freespace)s. %(backuppaths)s.") % {'freespace': msg, 'backuppaths': msg2} @@ -2927,7 +3195,10 @@ class RapidApp(dbus.service.Object): self.scan_manager = ScanManager(self.scan_results, self.batch_size, self.generate_folder, self.device_collection.add_device) self.copy_files_manager = CopyFilesManager(self.copy_files_results, - self.batch_size_MB) + self.batch_size_MB) + self.backup_manager = BackupFilesManager(self.backup_results, + self.batch_size_MB) + def scan_results(self, source, condition): """ @@ -2948,20 +3219,17 @@ class RapidApp(dbus.service.Object): logger.info('Files total %s' % size) self.device_collection.update_device(scan_pid, size) self.device_collection.update_progress(scan_pid, 0.0, results_summary, 0) - self.testing_auto_exit_trip_counter += 1 self.set_download_action_sensitivity() - if self.testing_auto_exit_trip_counter == self.testing_auto_exit_trip and self.testing_auto_exit: - self.on_rapidapp_destroy(self.rapidapp) - else: - if not self.testing_auto_exit and not self.auto_start_is_on: - self.download_progressbar.set_text(_("Thumbnails")) - self.thumbnails.generate_thumbnails(scan_pid) - elif self.auto_start_is_on: - if self.need_job_code_for_naming and not self.job_code: - self.get_job_code() - else: - self.start_download(scan_pid=scan_pid) + if (not self.auto_start_is_on and + self.prefs.generate_thumbnails): + self.download_progressbar.set_text(_("Thumbnails")) + self.thumbnails.generate_thumbnails(scan_pid) + elif self.auto_start_is_on: + if self.need_job_code_for_naming and not self.job_code: + self.get_job_code() + else: + self.start_download(scan_pid=scan_pid) self.set_thumbnail_sort() diff --git a/rapid/rpdfile.py b/rapid/rpdfile.py index a0969f0..d9454d7 100644 --- a/rapid/rpdfile.py +++ b/rapid/rpdfile.py @@ -170,6 +170,10 @@ class RPDFile: self.problem = None self.job_code = None + # indicates whether to generate a thumbnail during the copy + # files process + self.generate_thumbnail = False + # generated values self.temp_full_file_name = '' diff --git a/rapid/rpdmultiprocessing.py b/rapid/rpdmultiprocessing.py index 4a06fc9..7fdd252 100644 --- a/rapid/rpdmultiprocessing.py +++ b/rapid/rpdmultiprocessing.py @@ -21,6 +21,5 @@ CONN_COMPLETE = 1 MSG_BYTES = 0 MSG_FILE = 1 MSG_TEMP_DIRS = 2 -MSG_THUMB = 3 MSG_SEQUENCE_VALUE = 0 diff --git a/rapid/thumbnail.py b/rapid/thumbnail.py index e9c7e66..7a41e54 100644 --- a/rapid/thumbnail.py +++ b/rapid/thumbnail.py @@ -333,7 +333,7 @@ class GetPreviewImage(multiprocessing.Process): def run(self): while True: unique_id, full_file_name, file_type, size_max = self.results_pipe.recv() - full_size_preview, reduced_size_preview = self.thumbnail_maker.get_thumbnail(full_file_name, file_type, size_max=size_max, size_reduced=None) + full_size_preview, reduced_size_preview = self.thumbnail_maker.get_thumbnail(full_file_name, file_type, size_max=size_max, size_reduced=(100,100)) if full_size_preview is None: full_size_preview = self.get_stock_image(file_type) self.results_pipe.send((unique_id, full_size_preview, reduced_size_preview)) @@ -341,7 +341,7 @@ class GetPreviewImage(multiprocessing.Process): class GenerateThumbnails(multiprocessing.Process): - def __init__(self, files, batch_size, results_pipe, terminate_queue, + def __init__(self, scan_pid, files, batch_size, results_pipe, terminate_queue, run_event): multiprocessing.Process.__init__(self) self.results_pipe = results_pipe @@ -353,6 +353,8 @@ class GenerateThumbnails(multiprocessing.Process): self.thumbnail_maker = Thumbnail() + self.scan_pid = scan_pid + def run(self): counter = 0 @@ -385,6 +387,6 @@ class GenerateThumbnails(multiprocessing.Process): if counter > 0: # send any remaining results self.results_pipe.send((rpdmp.CONN_PARTIAL, self.results)) - self.results_pipe.send((rpdmp.CONN_COMPLETE, None)) + self.results_pipe.send((rpdmp.CONN_COMPLETE, self.scan_pid)) self.results_pipe.close() diff --git a/rapid/utilities.py b/rapid/utilities.py index 07be833..ad77a29 100644 --- a/rapid/utilities.py +++ b/rapid/utilities.py @@ -146,5 +146,6 @@ def human_readable_version(v): """ returns a version in human readable form""" v = v.replace('~a', ' alpha ') v = v.replace('~b', ' beta ') + v = v.replace('~rc', ' RC ') return v |