summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--PKG-INFO2
-rw-r--r--po/de.po582
-rw-r--r--po/nl.po425
-rw-r--r--po/pt_BR.po493
-rw-r--r--po/rapid-photo-downloader.pot256
-rw-r--r--po/ru.po384
-rw-r--r--rapid/ChangeLog27
-rw-r--r--rapid/backupfile.py187
-rw-r--r--rapid/config.py2
-rw-r--r--rapid/copyfiles.py38
-rw-r--r--rapid/downloadtracker.py61
-rw-r--r--rapid/glade3/prefs.ui42
-rw-r--r--rapid/preferencesdialog.py10
-rw-r--r--rapid/prefsrapid.py3
-rwxr-xr-xrapid/rapid.py494
-rw-r--r--rapid/rpdfile.py4
-rw-r--r--rapid/rpdmultiprocessing.py1
-rw-r--r--rapid/thumbnail.py8
-rw-r--r--rapid/utilities.py1
19 files changed, 1977 insertions, 1043 deletions
diff --git a/PKG-INFO b/PKG-INFO
index 2349c68..d4319f2 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -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
diff --git a/po/de.po b/po/de.po
index 587ad27..9c0b49d 100644
--- a/po/de.po
+++ b/po/de.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-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"
diff --git a/po/nl.po b/po/nl.po
index 84d26ad..f56a9d5 100644
--- a/po/nl.po
+++ b/po/nl.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-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 ""
diff --git a/po/ru.po b/po/ru.po
index eb69d6e..11c6e28 100644
--- a/po/ru.po
+++ b/po/ru.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-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