diff options
author | Julien Valroff <julien@kirya.net> | 2013-02-15 18:54:38 +0100 |
---|---|---|
committer | Julien Valroff <julien@kirya.net> | 2013-02-15 18:54:38 +0100 |
commit | 063aca3a12dbf69d5ecdd2e949a788e01c91659d (patch) | |
tree | 0e23f95e8bb1b8a0a7250f9f15e3033d9e2cc924 | |
parent | 2a794565f77005a753930023e41c7b696eaed6ac (diff) |
Imported Upstream version 0.4.6upstream/0.4.6
-rw-r--r-- | PKG-INFO | 2 | ||||
-rw-r--r-- | po/ar.po | 1876 | ||||
-rw-r--r-- | po/cs.po | 1177 | ||||
-rw-r--r-- | po/da.po | 1209 | ||||
-rw-r--r-- | po/de.po | 63 | ||||
-rw-r--r-- | po/es.po | 204 | ||||
-rw-r--r-- | po/fr.po | 197 | ||||
-rw-r--r-- | po/it.po | 35 | ||||
-rw-r--r-- | po/nb.po | 38 | ||||
-rw-r--r-- | po/nl.po | 159 | ||||
-rw-r--r-- | po/rapid-photo-downloader.pot | 144 | ||||
-rw-r--r-- | po/ru.po | 200 | ||||
-rw-r--r-- | po/sr.po | 1314 | ||||
-rw-r--r-- | po/sv.po | 1212 | ||||
-rw-r--r-- | rapid/ChangeLog | 37 | ||||
-rw-r--r-- | rapid/backupfile.py | 111 | ||||
-rw-r--r-- | rapid/config.py | 6 | ||||
-rw-r--r-- | rapid/generatename.py | 156 | ||||
-rw-r--r-- | rapid/glade3/about.ui | 3 | ||||
-rw-r--r-- | rapid/glade3/xmp.ui | 1376 | ||||
-rwxr-xr-x | rapid/rapid.py | 1771 | ||||
-rw-r--r-- | rapid/rpdfile.py | 3 | ||||
-rw-r--r-- | rapid/subfolderfile.py | 408 |
23 files changed, 7591 insertions, 4110 deletions
@@ -1,6 +1,6 @@ Metadata-Version: 1.0 Name: rapid-photo-downloader -Version: 0.4.5 +Version: 0.4.6 Summary: Rapid Photo Downloader for Linux Home-page: http://www.damonlynch.net/rapid Author: Damon Lynch diff --git a/po/ar.po b/po/ar.po new file mode 100644 index 0000000..ebc483f --- /dev/null +++ b/po/ar.po @@ -0,0 +1,1876 @@ +# Arabic translation for rapid +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the rapid package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: rapid\n" +"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" +"POT-Creation-Date: 2012-06-23 04:00-0500\n" +"PO-Revision-Date: 2012-09-09 08:00+0000\n" +"Last-Translator: Ahmed Shubbar <Unknown>\n" +"Language-Team: Arabic <ar@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: 2012-09-11 00:24+0000\n" +"X-Generator: Launchpad (build 15924)\n" + +#. Translators: if neccessary, for guidance in how to translate this program, you may see http://damonlynch.net/translate.html +#: rapid/rapid.py:112 rapid/rapid.py:1784 rapid/glade3/rapid.ui.h:1 +msgid "Rapid Photo Downloader" +msgstr "" + +#: rapid/rapid.py:117 +#, python-format +msgid "" +"%(date)s\n" +"%(time)s" +msgstr "" + +#: rapid/rapid.py:119 +#, python-format +msgid "%(date)s %(time)s" +msgstr "" + +#: rapid/rapid.py:122 +#, 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:157 +msgid "Device" +msgstr "جهاز" + +#. Size refers to the total size of images on the device, typically in +#. MB or GB +#: rapid/rapid.py:175 +msgid "Size" +msgstr "الحجم" + +#: rapid/rapid.py:178 +msgid "Download Progress" +msgstr "اكتمال التنزيل" + +#: rapid/rapid.py:336 +#, 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:1216 +msgid "scanning..." +msgstr "جاري المسح ..." + +#. this location is a human readable explanation for /, and is inserted into Downloading from %(location)s +#: rapid/rapid.py:1782 +msgid "the root of the file system" +msgstr "" + +#. message in dialog box which asks the user if they really want to be downloading from this location +#: rapid/rapid.py:1786 +#, python-format +msgid "Downloading from %(location)s." +msgstr "تنزيل من %(location)s" + +#: rapid/rapid.py:1787 +msgid "" +"Do you really want to download from here? On some systems, scanning this " +"location can take a very long time." +msgstr "" +"هل فعلا تريد التنزيل من هنا؟ في بعض الانظمة, مسح هذا المكان يستغرق وقتا " +"طويلا جدا." + +#: rapid/rapid.py:2209 +msgid "Download" +msgstr "تنزيل" + +#: rapid/rapid.py:2212 +msgid "Pause" +msgstr "إيقاف" + +#: rapid/rapid.py:2317 +#, python-format +msgid "" +"These download folders are invalid:\n" +"%(folder1)s\n" +"%(folder2)s" +msgstr "" +"مجلدات التنزيل هذا غير صحيحة: \n" +"%(folder1)s\n" +"%(folder2)s" + +#: rapid/rapid.py:2320 +#, python-format +msgid "" +"This download folder is invalid:\n" +"%s" +msgstr "" +"مجلد التنزيل هذا غير صحيح: \n" +"%s" + +#: rapid/rapid.py:2321 +msgid "Download cannot proceed" +msgstr "لا يمكن بدء التنزيل" + +#: rapid/rapid.py:2700 +msgid "About 1 second remaining" +msgstr "تبقى حوالي ثانية واحدة" + +#: rapid/rapid.py:2702 +#, python-format +msgid "About %i seconds remaining" +msgstr "تبقى حوالي %i ثانية" + +#: rapid/rapid.py:2704 +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:2709 +#, python-format +msgid "About %(minutes)i:%(seconds)02i minutes remaining" +msgstr "تبقى حوالي %(minutes)i:%(seconds)02i دقيقة" + +#: rapid/rapid.py:2731 rapid/rpdfile.py:123 +msgid "photos and videos" +msgstr "صور وفيديو" + +#: rapid/rapid.py:2733 rapid/rpdfile.py:125 +msgid "photos or videos" +msgstr "صور وفيديو" + +#: rapid/rapid.py:2736 rapid/rapid.py:3558 rapid/rpdfile.py:128 +msgid "videos" +msgstr "فيديو" + +#: rapid/rapid.py:2738 rapid/preferencesdialog.py:1620 rapid/rpdfile.py:130 +#: rapid/rpdfile.py:291 +msgid "video" +msgstr "فيديو" + +#: rapid/rapid.py:2741 rapid/rapid.py:3556 rapid/rpdfile.py:133 +msgid "photos" +msgstr "صور" + +#. check subfolder preferences for bad values +#: rapid/rapid.py:2743 rapid/preferencesdialog.py:1619 rapid/rpdfile.py:135 +#: rapid/rpdfile.py:272 +msgid "photo" +msgstr "صورة" + +#: rapid/rapid.py:2770 +#, python-format +msgid "%(noFiles)s %(filetypes)s downloaded" +msgstr "%(noFiles)s %(filetypes)s تم تنزيلها" + +#: rapid/rapid.py:2774 +#, python-format +msgid "%(noFiles)s %(filetypes)s failed to download" +msgstr "%(noFiles)s %(filetypes)s فشل تنزيلها" + +#: rapid/rapid.py:2777 rapid/rapid.py:2829 +msgid "warnings" +msgstr "تحذير" + +#: rapid/rapid.py:2786 +msgid "All downloads complete" +msgstr "كل التنزيلات أكتملت" + +#: rapid/rapid.py:2792 rapid/rapid.py:2801 rapid/rapid.py:2810 +#: rapid/rapid.py:2819 rapid/rapid.py:2827 +#, python-format +msgid "%(number)s %(numberdownloaded)s" +msgstr "%(number)s %(numberdownloaded)s" + +#: rapid/rapid.py:2794 rapid/rapid.py:2812 +#, python-format +msgid "%(filetype)s downloaded" +msgstr "%(filetype)s نوع تم تنزيلها" + +#: rapid/rapid.py:2803 rapid/rapid.py:2821 +#, python-format +msgid "%(filetype)s failed to download" +msgstr "%(filetype)s نوع فشل تنزيلها" + +#. e.g.: 3 of 205 photos and videos (202 remaining) +#: rapid/rapid.py:2860 +#, 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:2867 +#, python-format +msgid "%(number)s of %(total)s %(filetypes)s" +msgstr "%(number)s من %(total)s من الـ %(filetypes)s" + +#: rapid/rapid.py:3222 +msgid "From" +msgstr "مِن" + +#: rapid/rapid.py:3230 +msgid "Auto Detect" +msgstr "اكتشاف تلقائي" + +#: rapid/rapid.py:3234 rapid/preferencesdialog.py:1327 +#, python-format +msgid "Select a folder containing %(file_types)s" +msgstr "اختر مجلد يحتوى %(file_types)s" + +#: rapid/rapid.py:3275 +msgid "Copy" +msgstr "نسخ" + +#: rapid/rapid.py:3288 +msgid "Move" +msgstr "انقل" + +#: rapid/rapid.py:3310 +msgid "To" +msgstr "إلى" + +#: rapid/rapid.py:3317 rapid/rapid.py:3986 +msgid "Photos:" +msgstr "صور:" + +#: rapid/rapid.py:3320 rapid/preferencesdialog.py:1164 +msgid "Select a folder to download photos to" +msgstr "اختر مجلد لتنزيل الصور اليه" + +#: rapid/rapid.py:3332 rapid/rapid.py:3986 +msgid "Videos:" +msgstr "مقاطع فيديو:" + +#: rapid/rapid.py:3334 rapid/preferencesdialog.py:1182 +msgid "Select a folder to download videos to" +msgstr "اختر مجلد لتنزيل مقاطع الفيديو إليه:" + +#: rapid/rapid.py:3526 +msgid "and" +msgstr "و" + +#: rapid/rapid.py:3531 +msgid "Using backup devices" +msgstr "جاري استخدام اجهزة الارشفة" + +#: rapid/rapid.py:3533 +msgid "Using backup device" +msgstr "جاري استخدام جهاز الارشفة" + +#: rapid/rapid.py:3535 +msgid "No backup devices detected" +msgstr "لم نعثر على جهاز أرشفة" + +#: rapid/rapid.py:3562 +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:3574 +#, 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:3578 +#, python-format +msgid "%(free)s %(file_type)s" +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:3583 +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:3588 +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:3594 +#, python-format +msgid "%(free)s free" +msgstr "%(free)s خالية" + +#. user manually specified the same location for photos and video backups +#: rapid/rapid.py:3602 +#, python-format +msgid "Backing up photos and videos to %(path)s" +msgstr "جاري ارشفة الصور ومقاطع الفيديو الى المسار %(path)s" + +#. user manually specified backup location +#: rapid/rapid.py:3605 +#, python-format +msgid "Backing up to %(path)s" +msgstr "جاري الارشفة الى المسار %(path)s" + +#. user manually specified different locations for photo and video backups +#: rapid/rapid.py:3608 +#, python-format +msgid "Backing up photos to %(path)s and videos to %(path2)s" +msgstr "" +"جاري أرشفة الصور الى المسار %(path)s ومقاطع الفيديو الى المسار %(path2)s" + +#: rapid/rapid.py:3615 +#, python-format +msgid "%(freespace)s. %(backuppaths)s." +msgstr "%(freespace)s. %(backuppaths)s." + +#: rapid/rapid.py:3644 +msgid "Program preferences are invalid" +msgstr "خيارات البرنامج غير صحيحة" + +#: rapid/rapid.py:3770 rapid/rpdfile.py:273 +msgid "Photo" +msgstr "صورة" + +#: rapid/rapid.py:3772 rapid/rpdfile.py:292 +msgid "Video" +msgstr "مقطع فيديو" + +#: rapid/rapid.py:3781 +#, python-format +msgid "%(file_type)s download folder does not exist" +msgstr "مجلد التنزيل لـ %(file_type)s غير موجود" + +#: rapid/rapid.py:3783 rapid/rapid.py:3797 rapid/rapid.py:3810 +#, python-format +msgid "Folder: %s" +msgstr "مجلد: %s" + +#: rapid/rapid.py:3795 +#, python-format +msgid "%(file_type)s download folder is invalid" +msgstr "مجلد التنزيل لـ %(file_type)s غير صحيح" + +#: rapid/rapid.py:3808 +#, python-format +msgid "%(file_type)s download folder is not writable" +msgstr "مجلد التنزيل لـ %(file_type)s لا يمكن الكتابة فيه" + +#: rapid/rapid.py:3894 +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:3949 +#, python-format +msgid "" +"display program information on the command line as the program runs " +"(default: %default)" +msgstr "" +"اعرض معلومات البرنامج على سطر الأوامر خلال عمل البرنامج (الافتراضي: %default)" + +#: rapid/rapid.py:3950 +msgid "display debugging information when run from the command line" +msgstr "اعرض معلومات التدقيق (ديبوق) عند العمل من سطر الأوامر" + +#: rapid/rapid.py:3951 +msgid "only output errors to the command line" +msgstr "فقط اخرج الأخطاء الى سطر الأوامر" + +#. image file extensions are recognized RAW files plus TIFF and JPG +#: rapid/rapid.py:3953 +msgid "list photo and video file extensions the program recognizes and exit" +msgstr "اعرض امتدادات الصور ومقاطع الفيديوات التي يتعرف عليها البرنامج واغلق" + +#: rapid/rapid.py:3955 +msgid "" +"automatically detect devices from which to download, overwriting existing " +"program preferences" +msgstr "" +"كشف تلقائي للاجهزة التي يمكن التنزيل منها, وتخطى بذلك الاعدادات الحالية " +"للبرنامج." + +#: rapid/rapid.py:3956 +msgid "" +"manually specify the PATH of the device from which to download, overwriting " +"existing program preferences" +msgstr "حدد مسار جهاز التنزيل يدويا, وتخطى بذلك الاعدادات الحالية للبرنامج" + +#: rapid/rapid.py:3957 +msgid "reset all program settings and preferences and exit" +msgstr "استعد كل اعدادات البرنامج الافتراضية واغلق" + +#: rapid/rapid.py:3970 +msgid "" +"Error: specify device auto-detection or manually specify a device's path " +"from which to download, but do not do both." +msgstr "" +"خطأ: اختر كشف جهاز التنزيل تلقائيا أو حدد مسار جهاز التنزيل يدويا, ولا تختار " +"الاثنين معا." + +#: rapid/rapid.py:3991 +#, python-format +msgid "and %s" +msgstr "و %s" + +#: rapid/rapid.py:3999 +msgid "All settings and preferences have been reset" +msgstr "كل الاعدادات والخيارات تم استعادتها للافتراضي" + +#: rapid/backupfile.py:157 rapid/backupfile.py:180 +msgid "Backing up error" +msgstr "خطأ اثناء الأرشفة" + +#: rapid/backupfile.py:159 +#, python-format +msgid "Destination directory could not be created: %(directory)s\n" +msgstr "لم نستطع إنشاء المجلد الهدف: %(directory)s\n" + +#: rapid/backupfile.py:161 rapid/backupfile.py:182 rapid/subfolderfile.py:199 +#, python-format +msgid "" +"Source: %(source)s\n" +"Destination: %(destination)s" +msgstr "" +"المصدر: %(source)s\n" +"الهدف: %(destination)s" + +#: rapid/backupfile.py:164 rapid/backupfile.py:184 +#, python-format +msgid "Error: %(inst)s" +msgstr "خطأ: %(inst)s" + +#: rapid/copyfiles.py:163 rapid/subfolderfile.py:214 +#: rapid/subfolderfile.py:347 rapid/subfolderfile.py:365 +#, python-format +msgid "" +"%(problem)s\n" +"File: %(file)s" +msgstr "" +"%(problem)s\n" +"الملف: %(file)s" + +#: rapid/device.py:80 +msgid "Device Detected" +msgstr "تم كشف جهاز" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#usedeviceprompt +#: rapid/device.py:89 +msgid "" +"Should this device or partition be used to download photos or videos from?" +msgstr "" +"هل تريد استخدام هذا الجهاز أو جزء القرص الصلب لإستيراد صور ومقاطع فيديو؟" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#usedeviceprompt +#: rapid/device.py:108 +msgid "_Remember this choice" +msgstr "تذكر هذا الخيار" + +#: rapid/downloadtracker.py:299 +msgid "MB/s" +msgstr "م.بايت/ث" + +#: rapid/generatenameconfig.py:151 +msgid "Date time" +msgstr "التاريخ الوقت" + +#: rapid/generatenameconfig.py:152 +msgid "Text" +msgstr "نص" + +#: rapid/generatenameconfig.py:153 +msgid "Filename" +msgstr "اسم الملف" + +#: rapid/generatenameconfig.py:154 +msgid "Metadata" +msgstr "البيانات الوصفية" + +#: rapid/generatenameconfig.py:155 +msgid "Sequences" +msgstr "" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode +#: rapid/generatenameconfig.py:157 rapid/preferencesdialog.py:577 +msgid "Job code" +msgstr "رمز المهمة" + +#: rapid/generatenameconfig.py:158 +msgid "Image date" +msgstr "تاريخ الصورة" + +#: rapid/generatenameconfig.py:159 +msgid "Video date" +msgstr "تاريخ مقطع الفيديو" + +#: rapid/generatenameconfig.py:160 +msgid "Today" +msgstr "اليوم" + +#: rapid/generatenameconfig.py:161 +msgid "Yesterday" +msgstr "الأمس" + +#. Translators: Download time is the time and date that the download started (when the user clicked the Download button) +#: rapid/generatenameconfig.py:163 +msgid "Download time" +msgstr "وقت التنزيل" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename +#: rapid/generatenameconfig.py:165 +msgid "Name + extension" +msgstr "الاسم + الامتداد" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename +#: rapid/generatenameconfig.py:167 +msgid "Name" +msgstr "الاسم" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename +#: rapid/generatenameconfig.py:169 +msgid "Extension" +msgstr "امتداد" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename +#: rapid/generatenameconfig.py:171 +msgid "Image number" +msgstr "رقم الصورة" + +#: rapid/generatenameconfig.py:172 +msgid "Video number" +msgstr "رقم مقطع الفيديو" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata +#: rapid/generatenameconfig.py:174 +msgid "Aperture" +msgstr "فتحة" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata +#: rapid/generatenameconfig.py:176 +msgid "ISO" +msgstr "الحساسية (ايزو)" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata +#: rapid/generatenameconfig.py:178 +msgid "Exposure time" +msgstr "التعريض" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata +#: rapid/generatenameconfig.py:180 +msgid "Focal length" +msgstr "الطول البؤري" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata +#: rapid/generatenameconfig.py:182 +msgid "Camera make" +msgstr "مصنع الكاميرا" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata +#: rapid/generatenameconfig.py:184 +msgid "Camera model" +msgstr "موديل الكاميرا" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata +#: rapid/generatenameconfig.py:186 +msgid "Short camera model" +msgstr "موديل الكاميرا المختصر" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata +#: rapid/generatenameconfig.py:188 +msgid "Hyphenated short camera model" +msgstr "موديل الكاميرا المختصر بوصلة" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata +#: rapid/generatenameconfig.py:190 +msgid "Serial number" +msgstr "الرقم التسلسلي" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata +#: rapid/generatenameconfig.py:192 +msgid "Shutter count" +msgstr "تعداد شغل المصراع" + +#. File number currently refers to the Exif value Exif.Canon.FileNumber +#: rapid/generatenameconfig.py:194 +msgid "File number" +msgstr "رقم الملف" + +#. Only the folder component of the Exif.Canon.FileNumber value +#: rapid/generatenameconfig.py:196 +msgid "Folder only" +msgstr "مجلد فقط" + +#. The folder and file component of the Exif.Canon.FileNumber value +#: rapid/generatenameconfig.py:198 +msgid "Folder and file" +msgstr "مجلد وملف" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata +#: rapid/generatenameconfig.py:200 +msgid "Owner name" +msgstr "اسم المالك" + +#: rapid/generatenameconfig.py:201 +msgid "Codec" +msgstr "نمط الترميز" + +#: rapid/generatenameconfig.py:202 +msgid "Width" +msgstr "العرض" + +#: rapid/generatenameconfig.py:203 +msgid "Height" +msgstr "الطول" + +#: rapid/generatenameconfig.py:204 +msgid "Length" +msgstr "طول المقطع" + +#: rapid/generatenameconfig.py:205 +msgid "Frames Per Second" +msgstr "لقطات لكل ثانية" + +#: rapid/generatenameconfig.py:206 +msgid "Artist" +msgstr "الفنان" + +#: rapid/generatenameconfig.py:207 +msgid "Copyright" +msgstr "حقوق المؤلف" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#sequencenumbers +#: rapid/generatenameconfig.py:209 +msgid "Downloads today" +msgstr "عدد الملفات المستوردة اليوم" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#sequencenumbers +#: rapid/generatenameconfig.py:211 +msgid "Session number" +msgstr "رقم الجلسة" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#sequencenumbers +#: rapid/generatenameconfig.py:213 +msgid "Subfolder number" +msgstr "عدد المجلد الفرعي" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#sequencenumbers +#: rapid/generatenameconfig.py:215 +msgid "Stored number" +msgstr "الرقم المخزن" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#sequenceletters +#: rapid/generatenameconfig.py:217 +msgid "Sequence letter" +msgstr "احرف التسلسل" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename +#: rapid/generatenameconfig.py:219 +msgid "All digits" +msgstr "كل خانات الارقام" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename +#: rapid/generatenameconfig.py:221 +msgid "Last digit" +msgstr "الخانة الاخيرة" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename +#: rapid/generatenameconfig.py:223 +msgid "Last 2 digits" +msgstr "الخانتان الاخيرتان" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename +#: rapid/generatenameconfig.py:225 +msgid "Last 3 digits" +msgstr "الخانات الثلاث الاخيرة" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename +#: rapid/generatenameconfig.py:227 +msgid "Last 4 digits" +msgstr "الخانات الاربع الاخيرة" + +#. Translators: please not the capitalization of this text, and keep it the same if your language features capitalization +#: rapid/generatenameconfig.py:229 +msgid "Original Case" +msgstr "" + +#. Translators: please not the capitalization of this text, and keep it the same if your language features capitalization +#: rapid/generatenameconfig.py:231 +msgid "UPPERCASE" +msgstr "أحرف كبيرة" + +#. Translators: please not the capitalization of this text, and keep it the same if your language features capitalization +#: rapid/generatenameconfig.py:233 +msgid "lowercase" +msgstr "أحرف صغيرة" + +#: rapid/generatenameconfig.py:234 +msgid "One digit" +msgstr "خانة واحدة" + +#: rapid/generatenameconfig.py:235 +msgid "Two digits" +msgstr "خانتان" + +#: rapid/generatenameconfig.py:236 +msgid "Three digits" +msgstr "ثلاث خانات" + +#: rapid/generatenameconfig.py:237 +msgid "Four digits" +msgstr "اربع خانات" + +#: rapid/generatenameconfig.py:238 +msgid "Five digits" +msgstr "خمس خانات" + +#: rapid/generatenameconfig.py:239 +msgid "Six digits" +msgstr "ست خانات" + +#: rapid/generatenameconfig.py:240 +msgid "Seven digits" +msgstr "سبع خانات" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:242 +msgid "Subseconds" +msgstr "جزء من الثانية" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:244 +msgid "YYYYMMDD" +msgstr "" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:246 +msgid "YYYY-MM-DD" +msgstr "" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:248 +msgid "YYMMDD" +msgstr "" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:250 +msgid "YY-MM-DD" +msgstr "" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:252 +msgid "MMDDYYYY" +msgstr "" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:254 +msgid "MMDDYY" +msgstr "" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:256 +msgid "MMDD" +msgstr "" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:258 +msgid "DDMMYYYY" +msgstr "" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:260 +msgid "DDMMYY" +msgstr "" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:262 +msgid "YYYY" +msgstr "" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:264 +msgid "YY" +msgstr "" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:266 +msgid "MM" +msgstr "" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:268 +msgid "DD" +msgstr "" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:270 +msgid "Month (full)" +msgstr "الشهر (كاملا)" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:272 +msgid "Month (abbreviated)" +msgstr "الشهر (مختصر)" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:274 +msgid "HHMMSS" +msgstr "" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:276 +msgid "HHMM" +msgstr "" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:278 +msgid "HH-MM-SS" +msgstr "" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:280 +msgid "HH-MM" +msgstr "" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:282 +msgid "HH" +msgstr "" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:284 +msgid "MM (minutes)" +msgstr "" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:286 +msgid "SS" +msgstr "" + +#: rapid/preferencesdialog.py:374 +#, python-format +msgid "Subfolder preferences should not start with a %s" +msgstr "خيارات المجلد الفرعي يجب أن لا تبدأ بـ %s" + +#: rapid/preferencesdialog.py:376 +#, python-format +msgid "Subfolder preferences should not end with a %s" +msgstr "خيارات المجلد الفرعي يجب أن لا تبتهي بـ %s" + +#: rapid/preferencesdialog.py:380 +#, python-format +msgid "Subfolder preferences should not contain two %s one after the other" +msgstr "خيارات المجلد الفرعي يبجب أن لا تحتوى %s اثنتان الواحد تلوى الاخرى" + +#: rapid/preferencesdialog.py:439 rapid/preferencesdialog.py:700 +msgid "Remove all Job Codes?" +msgstr "أزل كل برمجات المهمة؟" + +#: rapid/preferencesdialog.py:440 rapid/preferencesdialog.py:717 +msgid "Should all Job Codes be removed?" +msgstr "هل تريد إزالة كل برمجات المهمة؟" + +#: rapid/preferencesdialog.py:446 +msgid "Remove all Remembered Paths?" +msgstr "أزل كل المسارات المحفوظة؟" + +#: rapid/preferencesdialog.py:447 +msgid "Should all remembered paths be removed?" +msgstr "هل تريد إزالة كلم المسارات المحفوظة؟" + +#: rapid/preferencesdialog.py:453 +msgid "Remove all Ignored Paths?" +msgstr "أزل كل المسارات المتجاهلة؟" + +#: rapid/preferencesdialog.py:454 +msgid "Should all ignored paths be removed?" +msgstr "هل تريد إزالة كل المسارات المتجاهلة؟" + +#: rapid/preferencesdialog.py:465 +msgid "Error in Photo Rename preferences" +msgstr "خطأ في خيارات تغيير أسماء الصور" + +#: rapid/preferencesdialog.py:645 +msgid "Error in Video Rename preferences" +msgstr "خطأ في إعدادات تغيير أسماء مقاطع الفيديو" + +#: rapid/preferencesdialog.py:666 +msgid "Error in Photo Download Subfolders preferences" +msgstr "خطأ في إعدادات المجلدات الفرعية لتنزيل الصور" + +#: rapid/preferencesdialog.py:683 +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:742 +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:758 +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:761 +msgid "Enter a new Job Code" +msgstr "ادخل برمجة مهمة جديدة" + +#: rapid/preferencesdialog.py:766 +msgid "Job Code:" +msgstr "برمجة مهمة:" + +#: rapid/preferencesdialog.py:822 +msgid "Enter a Path to Ignore" +msgstr "ادخل مسار لتجاهله" + +#: rapid/preferencesdialog.py:834 +msgid "Specify a path that will never be scanned for photos or videos" +msgstr "حدد مسار لن يتم أبدا مسح ما فيه من صور أو مقاطع فيديو" + +#: rapid/preferencesdialog.py:839 +msgid "Path:" +msgstr "مسار:" + +#: rapid/preferencesdialog.py:1082 +msgid "Job Code" +msgstr "" + +#: rapid/preferencesdialog.py:1353 +msgid "Select a folder in which to backup photos" +msgstr "" + +#: rapid/preferencesdialog.py:1366 +msgid "Select a folder in which to backup videos" +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:1461 +msgid "" +"<i><b>Warning:</b> There is insufficient metadata to fully generate the " +"name. Please use other renaming options.</i>" +msgstr "" + +#: rapid/preferencesdialog.py:1512 +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:1515 +#, python-format +msgid "<i>Example: %s</i>" +msgstr "" + +#. Preferences list is now empty +#: rapid/preferencesdialog.py:1605 +#, python-format +msgid "" +"The %(filetype)s subfolder preferences entered are invalid and cannot be " +"used.\n" +"They will be reset to their default values." +msgstr "" + +#: rapid/preferencesdialog.py:1750 +#, python-format +msgid "" +"The following regular expressions are invalid, and will be removed unless " +"you correct them:\n" +" %s" +msgstr "" + +#: rapid/preferencesdialog.py:1752 +#, python-format +msgid "" +"This regular expression is invalid, and will be removed unless you correct " +"it:\n" +" %s" +msgstr "" + +#: rapid/preferencesdialog.py:1753 +msgid "Invalid regular expression" +msgstr "" + +#. Translators: this value is used as an example device when automatic backup device detection is enabled. You should translate this. +#: rapid/preferencesdialog.py:1934 +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:1936 +msgid "externaldrive2" +msgstr "" + +#: rapid/prefsrapid.py:127 +msgid "New York" +msgstr "" + +#: rapid/prefsrapid.py:128 +msgid "Manila" +msgstr "" + +#: rapid/prefsrapid.py:128 +msgid "Prague" +msgstr "" + +#: rapid/prefsrapid.py:128 +msgid "Helsinki" +msgstr "" + +#: rapid/prefsrapid.py:128 +msgid "Wellington" +msgstr "" + +#: rapid/prefsrapid.py:129 +msgid "Tehran" +msgstr "" + +#: rapid/prefsrapid.py:129 +msgid "Kampala" +msgstr "" + +#: rapid/prefsrapid.py:129 +msgid "Paris" +msgstr "" + +#: rapid/prefsrapid.py:129 +msgid "Berlin" +msgstr "" + +#: rapid/prefsrapid.py:129 +msgid "Sydney" +msgstr "" + +#: rapid/prefsrapid.py:130 +msgid "Budapest" +msgstr "" + +#: rapid/prefsrapid.py:130 +msgid "Rome" +msgstr "" + +#: rapid/prefsrapid.py:130 +msgid "Moscow" +msgstr "" + +#: rapid/prefsrapid.py:130 +msgid "Delhi" +msgstr "" + +#: rapid/prefsrapid.py:130 +msgid "Warsaw" +msgstr "" + +#: rapid/prefsrapid.py:131 +msgid "Jakarta" +msgstr "" + +#: rapid/prefsrapid.py:131 +msgid "Madrid" +msgstr "" + +#: rapid/prefsrapid.py:131 +msgid "Stockholm" +msgstr "" + +#. components +#: rapid/problemnotification.py:27 rapid/subfolderfile.py:358 +msgid "subfolder" +msgstr "" + +#: rapid/problemnotification.py:28 rapid/subfolderfile.py:356 +msgid "filename" +msgstr "" + +#: rapid/problemnotification.py:81 +#, python-format +msgid "Date time value %s appears invalid." +msgstr "" + +#: rapid/problemnotification.py:82 +msgid "Filename does not have an extension." +msgstr "" + +#. a number component is something like the 8346 in IMG_8346.JPG +#: rapid/problemnotification.py:84 +msgid "Filename does not have a number component." +msgstr "" + +#: rapid/problemnotification.py:85 +#, python-format +msgid "Error generating component %s." +msgstr "" + +#. a generic problem +#: rapid/problemnotification.py:87 +#, python-format +msgid "%(filetype)s metadata cannot be read" +msgstr "" + +#: rapid/problemnotification.py:89 +#, python-format +msgid "%(filetype)s %(area)s could not be generated" +msgstr "" + +#: rapid/problemnotification.py:91 rapid/problemnotification.py:92 +#, python-format +msgid "An error occurred when copying the %(filetype)s" +msgstr "" + +#: rapid/problemnotification.py:94 rapid/problemnotification.py:95 +#, python-format +msgid "%(filetype)s already exists" +msgstr "" + +#: rapid/problemnotification.py:98 +#, python-format +msgid "" +"%(filetype)s could not be backed up because no suitable backup locations " +"were found." +msgstr "" + +#: rapid/problemnotification.py:103 +#, python-format +msgid "" +"%(image1)s was taken on %(image1_date)s at %(image1_time)s, and %(image2)s " +"on %(image2_date)s at %(image2_time)s." +msgstr "" + +#: rapid/problemnotification.py:104 +#, python-format +msgid "%(filetype)s was already downloaded" +msgstr "" + +#: rapid/problemnotification.py:108 +#, python-format +msgid "" +"The existing %(filetype)s was last modified on %(date)s at %(time)s. Unique " +"identifier '%(identifier)s' added." +msgstr "" + +#: rapid/problemnotification.py:109 +#, python-format +msgid "The existing %(filetype)s was last modified on %(date)s at %(time)s." +msgstr "" + +#: rapid/problemnotification.py:110 +#, python-format +msgid "There is no data with which to name the %(filetype)s." +msgstr "" + +#: rapid/problemnotification.py:112 +#, python-format +msgid "Error: %(errorno)s %(strerror)s" +msgstr "" + +#: rapid/problemnotification.py:202 +msgid "The metadata might be corrupt." +msgstr "" + +#: rapid/problemnotification.py:205 +msgid "" +"The filename, extension and Exif information indicate it has already been " +"downloaded." +msgstr "" + +#: rapid/problemnotification.py:224 +#, python-format +msgid " It was backed up to %(volume)s" +msgstr "" + +#: rapid/problemnotification.py:226 +msgid " It was backed up to these devices: " +msgstr "" + +#: rapid/problemnotification.py:228 rapid/problemnotification.py:289 +#: rapid/problemnotification.py:301 +#, python-format +msgid "%s, " +msgstr "" + +#: rapid/problemnotification.py:229 rapid/problemnotification.py:290 +#: rapid/problemnotification.py:302 +#, python-format +msgid "%(volumes)s and %(final_volume)s." +msgstr "" + +#: rapid/problemnotification.py:241 +#, python-format +msgid "" +"Photos detected with the same filenames, but taken at different times: " +"%(details)s" +msgstr "" + +#: rapid/problemnotification.py:258 +#, python-format +msgid "An error occurred when backing up on %(volume)s: %(inst)s." +msgstr "" + +#: rapid/problemnotification.py:260 +#, python-format +msgid "An error occurred when backing up on %(volume)s." +msgstr "" + +#: rapid/problemnotification.py:262 +msgid "Errors occurred when backing up on the following backup devices: " +msgstr "" + +#: rapid/problemnotification.py:266 rapid/problemnotification.py:314 +#, python-format +msgid "%(volume)s (%(inst)s), " +msgstr "" + +#: rapid/problemnotification.py:268 +#, python-format +msgid "%(volume)s, " +msgstr "" + +#: rapid/problemnotification.py:272 rapid/problemnotification.py:316 +#, python-format +msgid "%(volumes)s and %(volume)s (%(inst)s)." +msgstr "" + +#: rapid/problemnotification.py:277 +#, python-format +msgid "%(volumes)s and %(volume)s." +msgstr "" + +#: rapid/problemnotification.py:285 +#, python-format +msgid "Backup already exists on %(volume)s." +msgstr "" + +#: rapid/problemnotification.py:287 +msgid "Backups already exist in these locations: " +msgstr "" + +#: rapid/problemnotification.py:297 +#, python-format +msgid "Backup overwritten on %(volume)s." +msgstr "" + +#: rapid/problemnotification.py:299 +msgid "Backups overwritten on these devices: " +msgstr "" + +#: rapid/problemnotification.py:310 +#, python-format +msgid "An error occurred when creating directories on %(volume)s: %(inst)s." +msgstr "" + +#: rapid/problemnotification.py:312 +msgid "" +"Errors occurred when creating directories on the following backup devices: " +msgstr "" + +#: rapid/problemnotification.py:323 +#, python-format +msgid "%(previousproblem)s Additionally, %(newproblem)s" +msgstr "" + +#: rapid/problemnotification.py:331 +#, python-format +msgid " Furthermore, there were %(problems)s." +msgstr "" + +#: rapid/problemnotification.py:333 +#, python-format +msgid " Furthermore, there was a %(problem)s." +msgstr "" + +#: rapid/problemnotification.py:342 +#, python-format +msgid "The %(type)s metadata is missing." +msgstr "" + +#: rapid/problemnotification.py:344 +msgid "The following metadata is missing: " +msgstr "" + +#: rapid/problemnotification.py:347 +#, python-format +msgid "%(missing_metadata_elements)s and %(final_missing_metadata_element)s." +msgstr "" + +#: rapid/problemnotification.py:364 +msgid "Problems in subfolder and filename generation" +msgstr "" + +#: rapid/problemnotification.py:366 +msgid "Problem in subfolder and filename generation" +msgstr "" + +#: rapid/problemnotification.py:369 +#, python-format +msgid "Problems in %s generation" +msgstr "" + +#: rapid/problemnotification.py:371 +#, python-format +msgid "Problem in %s generation" +msgstr "" + +#: rapid/problemnotification.py:380 +#, python-format +msgid "%(filetype)s already exists, but it was backed up" +msgstr "" + +#: rapid/problemnotification.py:382 +#, python-format +msgid "An error occurred when copying the %(filetype)s, but it was backed up" +msgstr "" + +#: rapid/problemnotification.py:402 +msgid "Multiple problems were encountered" +msgstr "" + +#: rapid/problemnotification.py:404 rapid/subfolderfile.py:233 +msgid "Photos detected with the same filenames, but taken at different times" +msgstr "" + +#: rapid/problemnotification.py:410 +msgid "there were errors backing up" +msgstr "" + +#: rapid/problemnotification.py:411 +msgid "There were errors backing up" +msgstr "" + +#: rapid/problemnotification.py:413 +msgid "there was an error backing up" +msgstr "" + +#: rapid/problemnotification.py:414 +msgid "There was an error backing up" +msgstr "" + +#. e.g. +#: rapid/problemnotification.py:417 +#, python-format +msgid "%(previousproblem)s, and %(backinguperror)s" +msgstr "" + +#: rapid/rpdfile.py:153 +#, python-format +msgid "%(number)s %(filetypes)s" +msgstr "" + +#: rapid/rpdfile.py:163 +#, python-format +msgid "scanning (found %(photos)s photos and %(videos)s videos)..." +msgstr "" + +#: rapid/subfolderfile.py:80 +#, python-format +msgid "%(hour)s:%(minute)s:%(second)s:%(subsecond)s" +msgstr "" + +#: rapid/subfolderfile.py:301 +msgid "Photo has already been downloaded" +msgstr "" + +#: rapid/subfolderfile.py:302 +#, python-format +msgid "Source: %(source)s" +msgstr "" + +#: rapid/subfolderfile.py:354 +msgid "subfolder and filename" +msgstr "" + +#: rapid/subfolderfile.py:393 +msgid "Failed to create download subfolder" +msgstr "" + +#: rapid/subfolderfile.py:394 +#, python-format +msgid "Path: %s" +msgstr "" + +#: rapid/glade3/rapid.ui.h:2 +msgid "_File" +msgstr "" + +#: rapid/glade3/rapid.ui.h:3 +msgid "Download / Pause" +msgstr "" + +#: rapid/glade3/rapid.ui.h:4 +msgid "_Select" +msgstr "" + +#: rapid/glade3/rapid.ui.h:5 +msgid "Select All Without _Job Code" +msgstr "" + +#: rapid/glade3/rapid.ui.h:6 +msgid "Select All Wit_h Job Code" +msgstr "" + +#: rapid/glade3/rapid.ui.h:7 +msgid "_View" +msgstr "" + +#: rapid/glade3/rapid.ui.h:8 +msgid "_Error Log" +msgstr "" + +#: rapid/glade3/rapid.ui.h:9 +msgid "_Clear Completed Downloads" +msgstr "" + +#: rapid/glade3/rapid.ui.h:10 +msgid "Previous File" +msgstr "" + +#: rapid/glade3/rapid.ui.h:11 +msgid "Next File" +msgstr "" + +#: rapid/glade3/rapid.ui.h:12 +msgid "_Help" +msgstr "" + +#: rapid/glade3/rapid.ui.h:13 +msgid "_Make a Donation..." +msgstr "" + +#: rapid/glade3/rapid.ui.h:14 +msgid "_Translate this Application..." +msgstr "" + +#: rapid/glade3/rapid.ui.h:15 +msgid "_Check All" +msgstr "" + +#: rapid/glade3/rapid.ui.h:16 +msgid "_Uncheck All" +msgstr "" + +#: rapid/glade3/rapid.ui.h:17 +msgid "_Include in download" +msgstr "" + +#: rapid/glade3/rapid.ui.h:18 +msgid "_Download" +msgstr "" + +#: rapid/glade3/prefs.ui.h:1 +msgid "Preferences: Rapid Photo Downloader" +msgstr "" + +#: rapid/glade3/prefs.ui.h:2 +msgid "<span weight=\"bold\" size=\"x-large\">Photo Download Folders</span>" +msgstr "" + +#: rapid/glade3/prefs.ui.h:3 +msgid "<i>Example: /home/user/Pictures</i>" +msgstr "" + +#: rapid/glade3/prefs.ui.h:4 +msgid "<b>Download Subfolders</b>" +msgstr "" + +#: rapid/glade3/prefs.ui.h:5 +msgid "Download folder:" +msgstr "" + +#: rapid/glade3/prefs.ui.h:6 +msgid "" +"Choose the download folder. Subfolders for the downloaded photos will be " +"automatically created in this folder using the structure specified below." +msgstr "" + +#: rapid/glade3/prefs.ui.h:7 +msgid "<b>Download Folder</b>" +msgstr "" + +#: rapid/glade3/prefs.ui.h:8 +msgid "Photo Folders" +msgstr "" + +#: rapid/glade3/prefs.ui.h:9 +msgid "<span weight=\"bold\" size=\"x-large\">Photo Rename</span>\t" +msgstr "" + +#: rapid/glade3/prefs.ui.h:10 +msgid "<b>Photo Rename</b>" +msgstr "" + +#: rapid/glade3/prefs.ui.h:11 +msgid " " +msgstr "" + +#: rapid/glade3/prefs.ui.h:12 +msgid "<i>New:</i>" +msgstr "" + +#: rapid/glade3/prefs.ui.h:13 +msgid "<i>Original:</i>" +msgstr "" + +#: rapid/glade3/prefs.ui.h:14 +msgid "<b>Example</b>" +msgstr "" + +#: rapid/glade3/prefs.ui.h:15 +msgid "Photo Rename" +msgstr "" + +#: rapid/glade3/prefs.ui.h:16 +msgid "<span weight=\"bold\" size=\"x-large\">Video Download Folders</span>" +msgstr "" + +#: rapid/glade3/prefs.ui.h:17 +msgid "" +"Sorry, video downloading functionality disabled. To download videos, please " +"install either the <i>hachoir metadata</i> and <i>kaa metadata</i> packages " +"for python, or <i>exiftool</i>." +msgstr "" + +#: rapid/glade3/prefs.ui.h:18 +msgid "" +"Choose the download folder. Subfolders for the downloaded videos will be " +"automatically created in this folder using the structure specified below." +msgstr "" + +#: rapid/glade3/prefs.ui.h:19 +msgid "Video Folders" +msgstr "" + +#: rapid/glade3/prefs.ui.h:20 +msgid "<span weight=\"bold\" size=\"x-large\">Video Rename</span>\t" +msgstr "" + +#: rapid/glade3/prefs.ui.h:21 +msgid "Video Rename" +msgstr "" + +#: rapid/glade3/prefs.ui.h:22 +msgid "<span weight=\"bold\" size=\"x-large\">Rename Options</span>" +msgstr "" + +#: rapid/glade3/prefs.ui.h:23 +msgid "<b>Sequence Numbers</b>" +msgstr "" + +#: rapid/glade3/prefs.ui.h:24 +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:25 +msgid "Day start:" +msgstr "" + +#: rapid/glade3/prefs.ui.h:26 +msgid "Downloads today:" +msgstr "" + +#: rapid/glade3/prefs.ui.h:27 +msgid "Stored number:" +msgstr "" + +#: rapid/glade3/prefs.ui.h:28 +msgid ":" +msgstr "" + +#: rapid/glade3/prefs.ui.h:29 +msgid " hh:mm" +msgstr "" + +#: rapid/glade3/prefs.ui.h:30 +msgid "Synchronize RAW + JPEG sequence numbers" +msgstr "" + +#: rapid/glade3/prefs.ui.h:31 +msgid "<b>Compatibility with Other Operating Systems</b>" +msgstr "" + +#: rapid/glade3/prefs.ui.h:32 +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:33 +msgid "Strip incompatible characters" +msgstr "" + +#: rapid/glade3/prefs.ui.h:34 +msgid "Rename Options" +msgstr "" + +#: rapid/glade3/prefs.ui.h:35 +msgid "<span weight=\"bold\" size=\"x-large\">Job Codes</span>" +msgstr "" + +#: rapid/glade3/prefs.ui.h:36 +msgid "<b>Job Codes</b>" +msgstr "" + +#: rapid/glade3/prefs.ui.h:37 +msgid "_Add..." +msgstr "" + +#: rapid/glade3/prefs.ui.h:39 +msgid "R_emove All" +msgstr "" + +#: rapid/glade3/prefs.ui.h:40 +msgid "Job Codes" +msgstr "" + +#: rapid/glade3/prefs.ui.h:41 +msgid "<span weight=\"bold\" size=\"x-large\">Devices</span>" +msgstr "" + +#: rapid/glade3/prefs.ui.h:42 +msgid "Devices" +msgstr "" + +#: rapid/glade3/prefs.ui.h:43 +msgid "" +"Devices are from where to download photos and videos, such as cameras, " +"memory cards or Portable Storage Devices.\n" +"\n" +"You can download from multiple devices simultaneously, or you can specify a " +"location on your hard drive.\n" +"\n" +"<i>Downloading directly from cameras is currently an experimental feature. " +"If downloading directly from your camera works poorly or not at all, try " +"setting it to PTP mode. If that is not possible, a card reader must be " +"used.</i>" +msgstr "" + +#: rapid/glade3/prefs.ui.h:48 +msgid "Automatically detect Portable Storage Devices" +msgstr "" + +#: rapid/glade3/prefs.ui.h:49 +msgid "Automatically detect devices" +msgstr "" + +#: rapid/glade3/prefs.ui.h:50 +msgid "" +"If you enable automatic detection of Portable Storage Devices, the entire " +"device will be scanned. On large devices, this could take some time.\n" +"\n" +"When this option is enabled, and a potential device is detected, you will be " +"prompted to determine if it should be scanned or not." +msgstr "" + +#: rapid/glade3/prefs.ui.h:53 +msgid "Location:" +msgstr "" + +#: rapid/glade3/prefs.ui.h:54 +msgid "" +"If you disable automatic detection, choose the exact location of the photos " +"and videos." +msgstr "" + +#: rapid/glade3/prefs.ui.h:55 +msgid "<span weight=\"bold\" size=\"x-large\">Device Options</span>" +msgstr "" + +#: rapid/glade3/prefs.ui.h:56 +msgid "Remembered Paths" +msgstr "" + +#: rapid/glade3/prefs.ui.h:57 +msgid "" +"Remembered paths are those associated with devices that you have chosen to " +"always scan or ignore when automatic detection of Portable Storage Devices " +"is enabled." +msgstr "" + +#: rapid/glade3/prefs.ui.h:58 +msgid "Ignored Paths" +msgstr "" + +#: rapid/glade3/prefs.ui.h:59 +msgid "" +"Specify the ending portion of any paths you want ignored when scanning " +"devices for photos or videos. Any path ending with the values below will not " +"be scanned." +msgstr "" + +#: rapid/glade3/prefs.ui.h:61 +msgid "Re_move All" +msgstr "" + +#: rapid/glade3/prefs.ui.h:62 +msgid "Use _python-style regular expressions" +msgstr "" + +#: rapid/glade3/prefs.ui.h:63 +msgid "Device Options" +msgstr "" + +#: rapid/glade3/prefs.ui.h:64 +msgid "<span weight=\"bold\" size=\"x-large\">Backup</span>\t" +msgstr "" + +#: rapid/glade3/prefs.ui.h:65 +msgid "<b>Backup</b>" +msgstr "" + +#: rapid/glade3/prefs.ui.h:66 +msgid "" +"If you disable automatic detection, choose the exact backup locations." +msgstr "" + +#: rapid/glade3/prefs.ui.h:67 +msgid "Automatically detect backup devices" +msgstr "" + +#: rapid/glade3/prefs.ui.h:68 +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:69 +msgid "Backup photos and videos when downloading" +msgstr "" + +#: rapid/glade3/prefs.ui.h:70 +msgid "" +"Specify the folder in which backups are stored on the device. \n" +"\n" +"<i>Note: this will also be used to determine whether or not the device is " +"used for backups. For each device you wish to use for backing up to, create " +"a folder in it with one of these names.</i>" +msgstr "" + +#: rapid/glade3/prefs.ui.h:73 +msgid "Photo backup location:" +msgstr "" + +#: rapid/glade3/prefs.ui.h:74 +msgid "Photo backup folder name:" +msgstr "" + +#: rapid/glade3/prefs.ui.h:75 +msgid "<i>Example:</i>" +msgstr "" + +#: rapid/glade3/prefs.ui.h:76 +msgid "<i>/media/externaldrive/Photos</i>" +msgstr "" + +#: rapid/glade3/prefs.ui.h:77 +msgid "Video backup folder name:" +msgstr "" + +#: rapid/glade3/prefs.ui.h:78 +msgid "Video backup location:" +msgstr "" + +#: rapid/glade3/prefs.ui.h:79 +msgid "Backup" +msgstr "" + +#: rapid/glade3/prefs.ui.h:80 +msgid "<span weight=\"bold\" size=\"x-large\">Miscellaneous</span>" +msgstr "" + +#: rapid/glade3/prefs.ui.h:81 +msgid "<b>Program Automation</b>" +msgstr "" + +#: rapid/glade3/prefs.ui.h:82 +msgid "Unmount (\"eject\") device upon download completion" +msgstr "" + +#: rapid/glade3/prefs.ui.h:83 +msgid "Start downloading at program startup" +msgstr "" + +#: rapid/glade3/prefs.ui.h:84 +msgid "Start downloading upon device insertion" +msgstr "" + +#: rapid/glade3/prefs.ui.h:85 +msgid "Exit program when download completes" +msgstr "" + +#: rapid/glade3/prefs.ui.h:86 +msgid "Exit program even if download had warnings or errors" +msgstr "" + +#: rapid/glade3/prefs.ui.h:87 +msgid "Automatically rotate JPEG images" +msgstr "" + +#: rapid/glade3/prefs.ui.h:88 +msgid "Performance" +msgstr "" + +#: rapid/glade3/prefs.ui.h:89 +msgid "Generate thumbnails (slower)" +msgstr "" + +#: rapid/glade3/prefs.ui.h:90 +msgid "Miscellaneous" +msgstr "" + +#: rapid/glade3/prefs.ui.h:91 +msgid "<span weight=\"bold\" size=\"x-large\">Error Handling</span>" +msgstr "" + +#: rapid/glade3/prefs.ui.h:92 +msgid "<b>Photo and Video Name Conflicts</b>" +msgstr "" + +#: rapid/glade3/prefs.ui.h:93 +msgid "Add unique identifier" +msgstr "" + +#: rapid/glade3/prefs.ui.h:94 +msgid "Skip download" +msgstr "" + +#: rapid/glade3/prefs.ui.h:95 +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:96 +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:97 +msgid "Overwrite" +msgstr "" + +#: rapid/glade3/prefs.ui.h:98 +msgid "Skip" +msgstr "" + +#: rapid/glade3/prefs.ui.h:99 +msgid "Error Handling" +msgstr "" + +#: rapid/glade3/about.ui.h:1 +msgid "Import your photos and videos efficiently and reliably" +msgstr "" @@ -7,22 +7,22 @@ msgid "" msgstr "" "Project-Id-Version: rapid\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" -"POT-Creation-Date: 2011-11-20 13:25-0600\n" -"PO-Revision-Date: 2011-11-21 17:16+0000\n" -"Last-Translator: Kuvaly [LCT] <kuvaly@seznam.cz>\n" +"POT-Creation-Date: 2012-06-23 04:00-0500\n" +"PO-Revision-Date: 2012-08-16 13:42+0000\n" +"Last-Translator: Radek Stastny <Unknown>\n" "Language-Team: Czech <cs@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-12-28 07:56+0000\n" -"X-Generator: Launchpad (build 14560)\n" +"X-Launchpad-Export-Date: 2012-09-11 00:24+0000\n" +"X-Generator: Launchpad (build 15924)\n" #. Translators: if neccessary, for guidance in how to translate this program, you may see http://damonlynch.net/translate.html -#: rapid/rapid.py:107 rapid/rapid.py:1699 rapid/glade3/rapid.ui.h:14 +#: rapid/rapid.py:112 rapid/rapid.py:1784 rapid/glade3/rapid.ui.h:1 msgid "Rapid Photo Downloader" msgstr "Rapid Photo Downloader" -#: rapid/rapid.py:112 +#: rapid/rapid.py:117 #, python-format msgid "" "%(date)s\n" @@ -31,33 +31,33 @@ msgstr "" "%(date)s\n" "%(time)s" -#: rapid/rapid.py:114 +#: rapid/rapid.py:119 #, python-format msgid "%(date)s %(time)s" msgstr "%(date)s %(time)s" -#: rapid/rapid.py:117 +#: rapid/rapid.py:122 #, 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:152 +#: rapid/rapid.py:157 msgid "Device" msgstr "Zařízení" #. Size refers to the total size of images on the device, typically in #. MB or GB -#: rapid/rapid.py:170 +#: rapid/rapid.py:175 msgid "Size" msgstr "Velikost" -#: rapid/rapid.py:173 +#: rapid/rapid.py:178 msgid "Download Progress" msgstr "Průběh stahování" -#: rapid/rapid.py:319 +#: rapid/rapid.py:336 #, python-format msgid "%(device)s did not unmount" msgstr "%(device)s se neodpojilo" @@ -66,36 +66,36 @@ msgstr "%(device)s se neodpojilo" #. 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:1186 +#: rapid/rapid.py:1216 msgid "scanning..." msgstr "skenování..." #. this location is a human readable explanation for /, and is inserted into Downloading from %(location)s -#: rapid/rapid.py:1697 +#: rapid/rapid.py:1782 msgid "the root of the file system" msgstr "kořen souborového systému" #. message in dialog box which asks the user if they really want to be downloading from this location -#: rapid/rapid.py:1701 +#: rapid/rapid.py:1786 #, python-format msgid "Downloading from %(location)s." msgstr "Stahování z %(location)s." -#: rapid/rapid.py:1702 +#: rapid/rapid.py:1787 msgid "" "Do you really want to download from here? On some systems, scanning this " "location can take a very long time." msgstr "" -#: rapid/rapid.py:2124 rapid/glade3/rapid.ui.h:5 +#: rapid/rapid.py:2209 msgid "Download" msgstr "Stáhnout" -#: rapid/rapid.py:2127 +#: rapid/rapid.py:2212 msgid "Pause" msgstr "Pozastavit" -#: rapid/rapid.py:2228 +#: rapid/rapid.py:2317 #, python-format msgid "" "These download folders are invalid:\n" @@ -106,7 +106,7 @@ msgstr "" "%(folder1)s\n" "%(folder2)s" -#: rapid/rapid.py:2231 +#: rapid/rapid.py:2320 #, python-format msgid "" "This download folder is invalid:\n" @@ -115,176 +115,176 @@ msgstr "" "Následující složka je neplatná:\n" "%s" -#: rapid/rapid.py:2232 +#: rapid/rapid.py:2321 msgid "Download cannot proceed" msgstr "Stahování nemůže pokračovat" -#: rapid/rapid.py:2559 +#: rapid/rapid.py:2700 msgid "About 1 second remaining" msgstr "Zbývá 1 sekunda" -#: rapid/rapid.py:2561 +#: rapid/rapid.py:2702 #, python-format msgid "About %i seconds remaining" msgstr "Zbývá %i sekund" -#: rapid/rapid.py:2563 +#: rapid/rapid.py:2704 msgid "About 1 minute remaining" msgstr "Zbývá 1 minuta" #. 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:2568 +#: rapid/rapid.py:2709 #, python-format msgid "About %(minutes)i:%(seconds)02i minutes remaining" msgstr "Zbývá %(minutes)i:%(seconds)02i minut" -#: rapid/rapid.py:2590 rapid/rpdfile.py:113 +#: rapid/rapid.py:2731 rapid/rpdfile.py:123 msgid "photos and videos" msgstr "fotografie a videa" -#: rapid/rapid.py:2592 rapid/rpdfile.py:115 +#: rapid/rapid.py:2733 rapid/rpdfile.py:125 msgid "photos or videos" msgstr "fotografie či videa" -#: rapid/rapid.py:2595 rapid/rapid.py:3408 rapid/rpdfile.py:118 +#: rapid/rapid.py:2736 rapid/rapid.py:3558 rapid/rpdfile.py:128 msgid "videos" msgstr "videa" -#: rapid/rapid.py:2597 rapid/preferencesdialog.py:1617 rapid/rpdfile.py:120 -#: rapid/rpdfile.py:254 +#: rapid/rapid.py:2738 rapid/preferencesdialog.py:1620 rapid/rpdfile.py:130 +#: rapid/rpdfile.py:291 msgid "video" msgstr "video" -#: rapid/rapid.py:2600 rapid/rapid.py:3406 rapid/rpdfile.py:123 +#: rapid/rapid.py:2741 rapid/rapid.py:3556 rapid/rpdfile.py:133 msgid "photos" msgstr "fotografie" #. check subfolder preferences for bad values -#: rapid/rapid.py:2602 rapid/preferencesdialog.py:1616 rapid/rpdfile.py:125 -#: rapid/rpdfile.py:234 +#: rapid/rapid.py:2743 rapid/preferencesdialog.py:1619 rapid/rpdfile.py:135 +#: rapid/rpdfile.py:272 msgid "photo" msgstr "fotografie" -#: rapid/rapid.py:2629 +#: rapid/rapid.py:2770 #, python-format msgid "%(noFiles)s %(filetypes)s downloaded" msgstr "%(noFiles)s %(filetypes)s staženo" -#: rapid/rapid.py:2633 +#: rapid/rapid.py:2774 #, python-format msgid "%(noFiles)s %(filetypes)s failed to download" msgstr "%(noFiles)s %(filetypes)s nebyly staženy" -#: rapid/rapid.py:2636 rapid/rapid.py:2688 +#: rapid/rapid.py:2777 rapid/rapid.py:2829 msgid "warnings" msgstr "varování" -#: rapid/rapid.py:2645 +#: rapid/rapid.py:2786 msgid "All downloads complete" msgstr "Všechna stahování kompletní" -#: rapid/rapid.py:2651 rapid/rapid.py:2660 rapid/rapid.py:2669 -#: rapid/rapid.py:2678 rapid/rapid.py:2686 +#: rapid/rapid.py:2792 rapid/rapid.py:2801 rapid/rapid.py:2810 +#: rapid/rapid.py:2819 rapid/rapid.py:2827 #, python-format msgid "%(number)s %(numberdownloaded)s" msgstr "%(number)s %(numberdownloaded)s" -#: rapid/rapid.py:2653 rapid/rapid.py:2671 +#: rapid/rapid.py:2794 rapid/rapid.py:2812 #, python-format msgid "%(filetype)s downloaded" msgstr "%(filetype)s staženo" -#: rapid/rapid.py:2662 rapid/rapid.py:2680 +#: rapid/rapid.py:2803 rapid/rapid.py:2821 #, python-format msgid "%(filetype)s failed to download" msgstr "%(filetype)s nelze stáhnout" #. e.g.: 3 of 205 photos and videos (202 remaining) -#: rapid/rapid.py:2719 +#: rapid/rapid.py:2860 #, python-format msgid "%(number)s of %(total)s %(filetypes)s (%(remaining)s remaining)" msgstr "%(number)s z %(total)s %(filetypes)s (%(remaining)s remaining)" #. e.g.: 205 of 205 photos and videos -#: rapid/rapid.py:2726 +#: rapid/rapid.py:2867 #, python-format msgid "%(number)s of %(total)s %(filetypes)s" msgstr "%(number)s z celkem %(total)s %(filetypes)s" -#: rapid/rapid.py:3072 +#: rapid/rapid.py:3222 msgid "From" msgstr "Z" -#: rapid/rapid.py:3080 +#: rapid/rapid.py:3230 msgid "Auto Detect" msgstr "Automatická detekce" -#: rapid/rapid.py:3084 rapid/preferencesdialog.py:1324 +#: rapid/rapid.py:3234 rapid/preferencesdialog.py:1327 #, python-format msgid "Select a folder containing %(file_types)s" msgstr "Vyberte složku, která obsahuje %(file_types)s" -#: rapid/rapid.py:3125 +#: rapid/rapid.py:3275 msgid "Copy" msgstr "Kopírovat" -#: rapid/rapid.py:3138 +#: rapid/rapid.py:3288 msgid "Move" msgstr "Přesun" -#: rapid/rapid.py:3160 +#: rapid/rapid.py:3310 msgid "To" msgstr "Do" -#: rapid/rapid.py:3167 rapid/rapid.py:3796 +#: rapid/rapid.py:3317 rapid/rapid.py:3986 msgid "Photos:" msgstr "Fotografie:" -#: rapid/rapid.py:3170 rapid/preferencesdialog.py:1161 +#: rapid/rapid.py:3320 rapid/preferencesdialog.py:1164 msgid "Select a folder to download photos to" msgstr "Vyberte složku do které mají být obrázky staženy" -#: rapid/rapid.py:3182 rapid/rapid.py:3796 +#: rapid/rapid.py:3332 rapid/rapid.py:3986 msgid "Videos:" msgstr "Videa:" -#: rapid/rapid.py:3184 rapid/preferencesdialog.py:1179 +#: rapid/rapid.py:3334 rapid/preferencesdialog.py:1182 msgid "Select a folder to download videos to" msgstr "Zvolte adresář do kterého se bude stahovat video" -#: rapid/rapid.py:3376 +#: rapid/rapid.py:3526 msgid "and" msgstr "a" -#: rapid/rapid.py:3381 +#: rapid/rapid.py:3531 msgid "Using backup devices" msgstr "Používání zálohovacích zařízení" -#: rapid/rapid.py:3383 +#: rapid/rapid.py:3533 msgid "Using backup device" msgstr "Používání zálohovacího zařízení" -#: rapid/rapid.py:3385 +#: rapid/rapid.py:3535 msgid "No backup devices detected" msgstr "Zálohovací zařízení nebylo detekováno" -#: rapid/rapid.py:3412 +#: rapid/rapid.py:3562 msgid "Free space:" msgstr "Volné místo:" #. (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:3424 +#: rapid/rapid.py:3574 #, 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:3428 +#: rapid/rapid.py:3578 #, python-format msgid "%(free)s %(file_type)s" msgstr "%(free)s %(file_type)s" @@ -292,129 +292,147 @@ 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:3433 +#: rapid/rapid.py:3583 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:3438 +#: rapid/rapid.py:3588 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:3444 +#: rapid/rapid.py:3594 #, python-format msgid "%(free)s free" msgstr "%(free)s volné" #. user manually specified the same location for photos and video backups -#: rapid/rapid.py:3452 +#: rapid/rapid.py:3602 #, python-format msgid "Backing up photos and videos to %(path)s" msgstr "Zálohování fotografií a videí do %(path)s" #. user manually specified backup location -#: rapid/rapid.py:3455 +#: rapid/rapid.py:3605 #, python-format msgid "Backing up to %(path)s" msgstr "Zálohování %(path)s" #. user manually specified different locations for photo and video backups -#: rapid/rapid.py:3458 +#: rapid/rapid.py:3608 #, python-format msgid "Backing up photos to %(path)s and videos to %(path2)s" msgstr "Zálohování fotografií do %(path)s a videí do %(path2)s" -#: rapid/rapid.py:3465 +#: rapid/rapid.py:3615 #, python-format msgid "%(freespace)s. %(backuppaths)s." msgstr "%(freespace)s. %(backuppaths)s." -#: rapid/rapid.py:3494 +#: rapid/rapid.py:3644 msgid "Program preferences are invalid" msgstr "Nastavení programu je nevalidní" -#: rapid/rapid.py:3613 rapid/rpdfile.py:235 +#: rapid/rapid.py:3770 rapid/rpdfile.py:273 msgid "Photo" msgstr "Fotografie" -#: rapid/rapid.py:3615 rapid/rpdfile.py:255 +#: rapid/rapid.py:3772 rapid/rpdfile.py:292 msgid "Video" msgstr "Video" -#: rapid/rapid.py:3624 +#: rapid/rapid.py:3781 #, python-format msgid "%(file_type)s download folder does not exist" msgstr "%(file_type)s složka neexistuje" -#: rapid/rapid.py:3626 rapid/rapid.py:3640 rapid/rapid.py:3653 +#: rapid/rapid.py:3783 rapid/rapid.py:3797 rapid/rapid.py:3810 #, python-format msgid "Folder: %s" msgstr "Složka: %s" -#: rapid/rapid.py:3638 +#: rapid/rapid.py:3795 #, python-format msgid "%(file_type)s download folder is invalid" msgstr "%(file_type)s složka je neplatná" -#: rapid/rapid.py:3651 +#: rapid/rapid.py:3808 #, python-format msgid "%(file_type)s download folder is not writable" msgstr "%(file_type)s do složky nelze zapisovat" -#: rapid/rapid.py:3729 +#: rapid/rapid.py:3894 msgid "Thumbnails" msgstr "Náhledy" #. 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:3777 +#: rapid/rapid.py:3949 #, python-format msgid "" "display program information on the command line as the program runs " "(default: %default)" msgstr "zobrazit informace o programu na příkazové řádce (default: %default)" -#: rapid/rapid.py:3778 +#: rapid/rapid.py:3950 msgid "display debugging information when run from the command line" msgstr "Zobrazit ladicí informace při spuštění z příkazové řádky" -#: rapid/rapid.py:3779 +#: rapid/rapid.py:3951 msgid "only output errors to the command line" msgstr "pouze výstup chyb do příkazové řádky" #. image file extensions are recognized RAW files plus TIFF and JPG -#: rapid/rapid.py:3781 +#: rapid/rapid.py:3953 msgid "list photo and video file extensions the program recognizes and exit" msgstr "zobrazit přípony souborů, které program rozpozná, a skončit" -#: rapid/rapid.py:3783 +#: rapid/rapid.py:3955 +msgid "" +"automatically detect devices from which to download, overwriting existing " +"program preferences" +msgstr "" + +#: rapid/rapid.py:3956 +msgid "" +"manually specify the PATH of the device from which to download, overwriting " +"existing program preferences" +msgstr "" + +#: rapid/rapid.py:3957 msgid "reset all program settings and preferences and exit" msgstr "resetovat nastavení programu a skončit" -#: rapid/rapid.py:3801 +#: rapid/rapid.py:3970 +msgid "" +"Error: specify device auto-detection or manually specify a device's path " +"from which to download, but do not do both." +msgstr "" + +#: rapid/rapid.py:3991 #, python-format msgid "and %s" msgstr "a %s" -#: rapid/rapid.py:3809 +#: rapid/rapid.py:3999 msgid "All settings and preferences have been reset" msgstr "Všechna nastavení a předvolby byly nastaveny na výchozí hodnoty" -#: rapid/backupfile.py:142 rapid/backupfile.py:165 +#: rapid/backupfile.py:157 rapid/backupfile.py:180 msgid "Backing up error" msgstr "Chyba zálohování" -#: rapid/backupfile.py:144 +#: rapid/backupfile.py:159 #, python-format msgid "Destination directory could not be created: %(directory)s\n" msgstr "Adresář destinace nelze vytvořit: %(directory)s\n" -#: rapid/backupfile.py:146 rapid/backupfile.py:167 rapid/subfolderfile.py:196 +#: rapid/backupfile.py:161 rapid/backupfile.py:182 rapid/subfolderfile.py:199 #, python-format msgid "" "Source: %(source)s\n" @@ -423,13 +441,13 @@ msgstr "" "Zdroj: %(source)s\n" "Destinace: %(destination)s" -#: rapid/backupfile.py:149 rapid/backupfile.py:169 +#: rapid/backupfile.py:164 rapid/backupfile.py:184 #, python-format msgid "Error: %(inst)s" msgstr "Chyba: %(inst)s" -#: rapid/copyfiles.py:159 rapid/subfolderfile.py:211 -#: rapid/subfolderfile.py:352 rapid/subfolderfile.py:370 +#: rapid/copyfiles.py:163 rapid/subfolderfile.py:214 +#: rapid/subfolderfile.py:347 rapid/subfolderfile.py:365 #, python-format msgid "" "%(problem)s\n" @@ -438,491 +456,501 @@ msgstr "" "%(problem)s\n" "Soubor: %(file)s" -#: rapid/device.py:79 +#: rapid/device.py:80 msgid "Device Detected" msgstr "Zařízení detekováno" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#usedeviceprompt -#: rapid/device.py:88 +#: rapid/device.py:89 msgid "" "Should this device or partition be used to download photos or videos from?" msgstr "Nacházejí se na tomto zařízení fotografie nebo videa ke stažení?" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#usedeviceprompt -#: rapid/device.py:107 +#: rapid/device.py:108 msgid "_Remember this choice" msgstr "_Zapamatovat si tuto volbu" -#: rapid/downloadtracker.py:298 +#: rapid/downloadtracker.py:299 msgid "MB/s" msgstr "MB/s" -#: rapid/generatenameconfig.py:150 +#: rapid/generatenameconfig.py:151 msgid "Date time" msgstr "Datum a čas" -#: rapid/generatenameconfig.py:151 +#: rapid/generatenameconfig.py:152 msgid "Text" msgstr "Text" -#: rapid/generatenameconfig.py:152 +#: rapid/generatenameconfig.py:153 msgid "Filename" msgstr "Jméno souboru" -#: rapid/generatenameconfig.py:153 +#: rapid/generatenameconfig.py:154 msgid "Metadata" msgstr "Metadata" -#: rapid/generatenameconfig.py:154 +#: rapid/generatenameconfig.py:155 msgid "Sequences" msgstr "Sekvence" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode -#: rapid/generatenameconfig.py:156 rapid/preferencesdialog.py:574 +#: rapid/generatenameconfig.py:157 rapid/preferencesdialog.py:577 msgid "Job code" msgstr "Pracovní kód" -#: rapid/generatenameconfig.py:157 +#: rapid/generatenameconfig.py:158 msgid "Image date" msgstr "Datum obrázku" -#: rapid/generatenameconfig.py:158 +#: rapid/generatenameconfig.py:159 msgid "Video date" msgstr "Datum videa" -#: rapid/generatenameconfig.py:159 +#: rapid/generatenameconfig.py:160 msgid "Today" msgstr "Dnes" -#: rapid/generatenameconfig.py:160 +#: rapid/generatenameconfig.py:161 msgid "Yesterday" msgstr "Včerejšek" #. Translators: Download time is the time and date that the download started (when the user clicked the Download button) -#: rapid/generatenameconfig.py:162 +#: rapid/generatenameconfig.py:163 msgid "Download time" msgstr "Čas stahování" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:164 +#: rapid/generatenameconfig.py:165 msgid "Name + extension" msgstr "Jméno + koncovka" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:166 +#: rapid/generatenameconfig.py:167 msgid "Name" msgstr "Název" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:168 +#: rapid/generatenameconfig.py:169 msgid "Extension" msgstr "Koncovka" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:170 +#: rapid/generatenameconfig.py:171 msgid "Image number" msgstr "Číslo obrázku" -#: rapid/generatenameconfig.py:171 +#: rapid/generatenameconfig.py:172 msgid "Video number" msgstr "Číslo videa" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:173 +#: rapid/generatenameconfig.py:174 msgid "Aperture" msgstr "Clona" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:175 +#: rapid/generatenameconfig.py:176 msgid "ISO" msgstr "ISO" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:177 +#: rapid/generatenameconfig.py:178 msgid "Exposure time" msgstr "Čas expozice" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:179 +#: rapid/generatenameconfig.py:180 msgid "Focal length" msgstr "Vzdálenost ohniska" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:181 +#: rapid/generatenameconfig.py:182 msgid "Camera make" msgstr "Vytvoření fotoaparátu" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:183 +#: rapid/generatenameconfig.py:184 msgid "Camera model" msgstr "Druh fotoaparátu" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:185 +#: rapid/generatenameconfig.py:186 msgid "Short camera model" msgstr "Krátký druh kamery" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:187 +#: rapid/generatenameconfig.py:188 msgid "Hyphenated short camera model" msgstr "Model kamery v označení odděleném pomlčkou" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:189 +#: rapid/generatenameconfig.py:190 msgid "Serial number" msgstr "Sériové číslo" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:191 +#: rapid/generatenameconfig.py:192 msgid "Shutter count" msgstr "Číslo snímku" #. File number currently refers to the Exif value Exif.Canon.FileNumber -#: rapid/generatenameconfig.py:193 +#: rapid/generatenameconfig.py:194 msgid "File number" msgstr "Číslo souboru" #. Only the folder component of the Exif.Canon.FileNumber value -#: rapid/generatenameconfig.py:195 +#: rapid/generatenameconfig.py:196 msgid "Folder only" msgstr "Pouze složka" #. The folder and file component of the Exif.Canon.FileNumber value -#: rapid/generatenameconfig.py:197 +#: rapid/generatenameconfig.py:198 msgid "Folder and file" msgstr "Složka a soubor" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:199 +#: rapid/generatenameconfig.py:200 msgid "Owner name" msgstr "Vlastníkovo jméno" -#: rapid/generatenameconfig.py:200 +#: rapid/generatenameconfig.py:201 msgid "Codec" msgstr "Kodek" -#: rapid/generatenameconfig.py:201 +#: rapid/generatenameconfig.py:202 msgid "Width" msgstr "Šířka" -#: rapid/generatenameconfig.py:202 +#: rapid/generatenameconfig.py:203 msgid "Height" msgstr "Výška" -#: rapid/generatenameconfig.py:203 +#: rapid/generatenameconfig.py:204 msgid "Length" msgstr "Délka" -#: rapid/generatenameconfig.py:204 +#: rapid/generatenameconfig.py:205 msgid "Frames Per Second" msgstr "Snímková hodnota" -#: rapid/generatenameconfig.py:205 +#: rapid/generatenameconfig.py:206 msgid "Artist" msgstr "Umělec" -#: rapid/generatenameconfig.py:206 +#: rapid/generatenameconfig.py:207 msgid "Copyright" msgstr "Copyright" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#sequencenumbers -#: rapid/generatenameconfig.py:208 +#: rapid/generatenameconfig.py:209 msgid "Downloads today" msgstr "Dnešní stahování" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#sequencenumbers -#: rapid/generatenameconfig.py:210 +#: rapid/generatenameconfig.py:211 msgid "Session number" msgstr "Číslo této relace" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#sequencenumbers -#: rapid/generatenameconfig.py:212 +#: rapid/generatenameconfig.py:213 msgid "Subfolder number" msgstr "Číslo podsložky" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#sequencenumbers -#: rapid/generatenameconfig.py:214 +#: rapid/generatenameconfig.py:215 msgid "Stored number" msgstr "Uskladněné číslo" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#sequenceletters -#: rapid/generatenameconfig.py:216 +#: rapid/generatenameconfig.py:217 msgid "Sequence letter" msgstr "Zpráva sekvence" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:218 +#: rapid/generatenameconfig.py:219 msgid "All digits" msgstr "Všechny číslice" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:220 +#: rapid/generatenameconfig.py:221 msgid "Last digit" msgstr "Poslední číslice" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:222 +#: rapid/generatenameconfig.py:223 msgid "Last 2 digits" msgstr "Poslední 2 číslice" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:224 +#: rapid/generatenameconfig.py:225 msgid "Last 3 digits" msgstr "Poslední 3 číslice" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:226 +#: rapid/generatenameconfig.py:227 msgid "Last 4 digits" msgstr "Poslední 4 číslice" #. Translators: please not the capitalization of this text, and keep it the same if your language features capitalization -#: rapid/generatenameconfig.py:228 +#: rapid/generatenameconfig.py:229 msgid "Original Case" msgstr "Originální obal" #. Translators: please not the capitalization of this text, and keep it the same if your language features capitalization -#: rapid/generatenameconfig.py:230 +#: rapid/generatenameconfig.py:231 msgid "UPPERCASE" msgstr "Velká písmena (ABCDEFG)" #. Translators: please not the capitalization of this text, and keep it the same if your language features capitalization -#: rapid/generatenameconfig.py:232 +#: rapid/generatenameconfig.py:233 msgid "lowercase" msgstr "Malá písmena (abcdefg)" -#: rapid/generatenameconfig.py:233 +#: rapid/generatenameconfig.py:234 msgid "One digit" msgstr "Jedna číslice" -#: rapid/generatenameconfig.py:234 +#: rapid/generatenameconfig.py:235 msgid "Two digits" msgstr "Dvě číslice" -#: rapid/generatenameconfig.py:235 +#: rapid/generatenameconfig.py:236 msgid "Three digits" msgstr "Tři číslice" -#: rapid/generatenameconfig.py:236 +#: rapid/generatenameconfig.py:237 msgid "Four digits" msgstr "Čtyři číslice" -#: rapid/generatenameconfig.py:237 +#: rapid/generatenameconfig.py:238 msgid "Five digits" msgstr "Pět číslic" -#: rapid/generatenameconfig.py:238 +#: rapid/generatenameconfig.py:239 msgid "Six digits" msgstr "Šest číslic" -#: rapid/generatenameconfig.py:239 +#: rapid/generatenameconfig.py:240 msgid "Seven digits" msgstr "Sedm číslic" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:241 +#: rapid/generatenameconfig.py:242 msgid "Subseconds" msgstr "Milisekundy" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:243 +#: rapid/generatenameconfig.py:244 msgid "YYYYMMDD" msgstr "RRRRMMDD" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:245 +#: rapid/generatenameconfig.py:246 msgid "YYYY-MM-DD" msgstr "RRRR-MM-DD" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:247 +#: rapid/generatenameconfig.py:248 msgid "YYMMDD" msgstr "RRMMDD" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:249 +#: rapid/generatenameconfig.py:250 msgid "YY-MM-DD" msgstr "RR-MM-DD" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:251 +#: rapid/generatenameconfig.py:252 msgid "MMDDYYYY" msgstr "MMDDRRRR" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:253 +#: rapid/generatenameconfig.py:254 msgid "MMDDYY" msgstr "MMDDRR" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:255 +#: rapid/generatenameconfig.py:256 msgid "MMDD" msgstr "MMDD" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:257 +#: rapid/generatenameconfig.py:258 msgid "DDMMYYYY" msgstr "DDMMRRRR" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:259 +#: rapid/generatenameconfig.py:260 msgid "DDMMYY" msgstr "DDMMRR" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:261 +#: rapid/generatenameconfig.py:262 msgid "YYYY" msgstr "RRRR" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:263 +#: rapid/generatenameconfig.py:264 msgid "YY" msgstr "RR" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:265 +#: rapid/generatenameconfig.py:266 msgid "MM" msgstr "MM" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:267 +#: rapid/generatenameconfig.py:268 msgid "DD" msgstr "DD" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:269 +#: rapid/generatenameconfig.py:270 +msgid "Month (full)" +msgstr "" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:272 +msgid "Month (abbreviated)" +msgstr "" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:274 msgid "HHMMSS" msgstr "HHMMSS" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:271 +#: rapid/generatenameconfig.py:276 msgid "HHMM" msgstr "HHMM" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:273 +#: rapid/generatenameconfig.py:278 msgid "HH-MM-SS" msgstr "HH-MM-SS" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:275 +#: rapid/generatenameconfig.py:280 msgid "HH-MM" msgstr "HH-MM" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:277 +#: rapid/generatenameconfig.py:282 msgid "HH" msgstr "HH" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:279 +#: rapid/generatenameconfig.py:284 msgid "MM (minutes)" msgstr "MM (minuty)" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:281 +#: rapid/generatenameconfig.py:286 msgid "SS" msgstr "SS" -#: rapid/preferencesdialog.py:371 +#: rapid/preferencesdialog.py:374 #, python-format msgid "Subfolder preferences should not start with a %s" msgstr "Nastavení podsložky nemělo začít %s" -#: rapid/preferencesdialog.py:373 +#: rapid/preferencesdialog.py:376 #, python-format msgid "Subfolder preferences should not end with a %s" msgstr "Nastavení podsložky nemělo končit %s" -#: rapid/preferencesdialog.py:377 +#: rapid/preferencesdialog.py:380 #, python-format msgid "Subfolder preferences should not contain two %s one after the other" msgstr "Nastavení podsložky by nemělo obsahovat dvě %s za sebou" -#: rapid/preferencesdialog.py:436 rapid/preferencesdialog.py:697 +#: rapid/preferencesdialog.py:439 rapid/preferencesdialog.py:700 msgid "Remove all Job Codes?" msgstr "Odstranit všechny pracovní kódy?" -#: rapid/preferencesdialog.py:437 rapid/preferencesdialog.py:714 +#: rapid/preferencesdialog.py:440 rapid/preferencesdialog.py:717 msgid "Should all Job Codes be removed?" msgstr "Chcete odstranit všechny pracovní kódy?" -#: rapid/preferencesdialog.py:443 +#: rapid/preferencesdialog.py:446 msgid "Remove all Remembered Paths?" msgstr "Odstranit všechny zapamatované cesty?" -#: rapid/preferencesdialog.py:444 +#: rapid/preferencesdialog.py:447 msgid "Should all remembered paths be removed?" msgstr "Opravdu chcete smazat všechny zapamatované cesty?" -#: rapid/preferencesdialog.py:450 +#: rapid/preferencesdialog.py:453 msgid "Remove all Ignored Paths?" msgstr "Odstranit všechny ignorované cesty?" -#: rapid/preferencesdialog.py:451 +#: rapid/preferencesdialog.py:454 msgid "Should all ignored paths be removed?" msgstr "Opravdu chcete smazat všechny ignorované cesty?" -#: rapid/preferencesdialog.py:462 +#: rapid/preferencesdialog.py:465 msgid "Error in Photo Rename preferences" msgstr "Chyba v nastavení přejmenování fotografií" -#: rapid/preferencesdialog.py:642 +#: rapid/preferencesdialog.py:645 msgid "Error in Video Rename preferences" msgstr "Chyba v nastavení přejmenování videí" -#: rapid/preferencesdialog.py:663 +#: rapid/preferencesdialog.py:666 msgid "Error in Photo Download Subfolders preferences" msgstr "Chyba v nastavení složek pro stahování fotek" -#: rapid/preferencesdialog.py:680 +#: rapid/preferencesdialog.py:683 msgid "Error in Video Download Subfolders preferences" msgstr "Chyba v nastavení složek pro stahování videí" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode -#: rapid/preferencesdialog.py:739 +#: rapid/preferencesdialog.py:742 msgid "Enter a Job Code" msgstr "Vložte pracovní kód" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode -#: rapid/preferencesdialog.py:755 +#: rapid/preferencesdialog.py:758 msgid "Enter a new Job Code, or select a previous one" msgstr "Vložte nový štítek nebo vyberte nějaký existující" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode -#: rapid/preferencesdialog.py:758 +#: rapid/preferencesdialog.py:761 msgid "Enter a new Job Code" msgstr "Vložte nový pracovní kód" -#: rapid/preferencesdialog.py:763 +#: rapid/preferencesdialog.py:766 msgid "Job Code:" msgstr "Pracovní kód:" -#: rapid/preferencesdialog.py:819 +#: rapid/preferencesdialog.py:822 msgid "Enter a Path to Ignore" msgstr "Vložte cestu k ignorování" -#: rapid/preferencesdialog.py:831 +#: rapid/preferencesdialog.py:834 msgid "Specify a path that will never be scanned for photos or videos" msgstr "" -#: rapid/preferencesdialog.py:836 +#: rapid/preferencesdialog.py:839 msgid "Path:" msgstr "Cesta:" -#: rapid/preferencesdialog.py:1079 +#: rapid/preferencesdialog.py:1082 msgid "Job Code" msgstr "Pracovní kód" -#: rapid/preferencesdialog.py:1350 +#: rapid/preferencesdialog.py:1353 msgid "Select a folder in which to backup photos" msgstr "Zvolte složku, ve které bude uložena záloha fotografií" -#: rapid/preferencesdialog.py:1363 +#: rapid/preferencesdialog.py:1366 msgid "Select a folder in which to backup videos" msgstr "Zvolte složku ve které budou zálohována videa" #. 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:1458 +#: rapid/preferencesdialog.py:1461 msgid "" "<i><b>Warning:</b> There is insufficient metadata to fully generate the " "name. Please use other renaming options.</i>" @@ -931,7 +959,7 @@ msgstr "" "možné vytvořit celé jméno. Použijte prosím pro vytvoření jména jiné " "možnosti.</i>" -#: rapid/preferencesdialog.py:1509 +#: rapid/preferencesdialog.py:1512 msgid "" "<i><b>Warning:</b> There is insufficient metadata to fully generate " "subfolders. Please use other subfolder naming options.</i>" @@ -941,13 +969,13 @@ msgstr "" "možnosti.</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:1512 +#: rapid/preferencesdialog.py:1515 #, python-format msgid "<i>Example: %s</i>" msgstr "<i>Příklad: %s</i>" #. Preferences list is now empty -#: rapid/preferencesdialog.py:1602 +#: rapid/preferencesdialog.py:1605 #, python-format msgid "" "The %(filetype)s subfolder preferences entered are invalid and cannot be " @@ -958,7 +986,7 @@ msgstr "" "použít.\n" "Použijí se výchozí hodnoty." -#: rapid/preferencesdialog.py:1747 +#: rapid/preferencesdialog.py:1750 #, python-format msgid "" "The following regular expressions are invalid, and will be removed unless " @@ -966,7 +994,7 @@ msgid "" " %s" msgstr "" -#: rapid/preferencesdialog.py:1749 +#: rapid/preferencesdialog.py:1752 #, python-format msgid "" "This regular expression is invalid, and will be removed unless you correct " @@ -974,142 +1002,142 @@ msgid "" " %s" msgstr "" -#: rapid/preferencesdialog.py:1750 +#: rapid/preferencesdialog.py:1753 msgid "Invalid regular expression" msgstr "Neplatný regulární výraz" #. Translators: this value is used as an example device when automatic backup device detection is enabled. You should translate this. -#: rapid/preferencesdialog.py:1931 +#: rapid/preferencesdialog.py:1934 msgid "externaldrive1" msgstr "externídisk1" #. Translators: this value is used as an example device when automatic backup device detection is enabled. You should translate this. -#: rapid/preferencesdialog.py:1933 +#: rapid/preferencesdialog.py:1936 msgid "externaldrive2" msgstr "externídisk2" -#: rapid/prefsrapid.py:126 +#: rapid/prefsrapid.py:127 msgid "New York" msgstr "New York" -#: rapid/prefsrapid.py:127 +#: rapid/prefsrapid.py:128 msgid "Manila" msgstr "Manila" -#: rapid/prefsrapid.py:127 +#: rapid/prefsrapid.py:128 msgid "Prague" msgstr "Praha" -#: rapid/prefsrapid.py:127 +#: rapid/prefsrapid.py:128 msgid "Helsinki" msgstr "Helsinki" -#: rapid/prefsrapid.py:127 +#: rapid/prefsrapid.py:128 msgid "Wellington" msgstr "Wellington" -#: rapid/prefsrapid.py:128 +#: rapid/prefsrapid.py:129 msgid "Tehran" msgstr "Teherán" -#: rapid/prefsrapid.py:128 +#: rapid/prefsrapid.py:129 msgid "Kampala" msgstr "Kampala" -#: rapid/prefsrapid.py:128 +#: rapid/prefsrapid.py:129 msgid "Paris" msgstr "Paříž" -#: rapid/prefsrapid.py:128 +#: rapid/prefsrapid.py:129 msgid "Berlin" msgstr "Berlín" -#: rapid/prefsrapid.py:128 +#: rapid/prefsrapid.py:129 msgid "Sydney" msgstr "Sydney" -#: rapid/prefsrapid.py:129 +#: rapid/prefsrapid.py:130 msgid "Budapest" msgstr "Budapešť" -#: rapid/prefsrapid.py:129 +#: rapid/prefsrapid.py:130 msgid "Rome" msgstr "Řím" -#: rapid/prefsrapid.py:129 +#: rapid/prefsrapid.py:130 msgid "Moscow" msgstr "Moskva" -#: rapid/prefsrapid.py:129 +#: rapid/prefsrapid.py:130 msgid "Delhi" msgstr "Dílí" -#: rapid/prefsrapid.py:129 +#: rapid/prefsrapid.py:130 msgid "Warsaw" msgstr "Varšava" -#: rapid/prefsrapid.py:130 +#: rapid/prefsrapid.py:131 msgid "Jakarta" msgstr "Jakarta" -#: rapid/prefsrapid.py:130 +#: rapid/prefsrapid.py:131 msgid "Madrid" msgstr "Madrid" -#: rapid/prefsrapid.py:130 +#: rapid/prefsrapid.py:131 msgid "Stockholm" msgstr "Stockholm" #. components -#: rapid/problemnotification.py:26 rapid/subfolderfile.py:363 +#: rapid/problemnotification.py:27 rapid/subfolderfile.py:358 msgid "subfolder" msgstr "podsložka" -#: rapid/problemnotification.py:27 rapid/subfolderfile.py:361 +#: rapid/problemnotification.py:28 rapid/subfolderfile.py:356 msgid "filename" msgstr "název souboru" -#: rapid/problemnotification.py:80 +#: rapid/problemnotification.py:81 #, python-format msgid "Date time value %s appears invalid." msgstr "Hodnota pro datum nebo čas %s je neplatná." -#: rapid/problemnotification.py:81 +#: rapid/problemnotification.py:82 msgid "Filename does not have an extension." msgstr "Jméno souboru neobsahuje příponu." #. a number component is something like the 8346 in IMG_8346.JPG -#: rapid/problemnotification.py:83 +#: rapid/problemnotification.py:84 msgid "Filename does not have a number component." msgstr "Jméno souboru neobsahuje číselnou hodnotu." -#: rapid/problemnotification.py:84 +#: rapid/problemnotification.py:85 #, python-format msgid "Error generating component %s." msgstr "Chyba při vytváření části %s." #. a generic problem -#: rapid/problemnotification.py:86 +#: rapid/problemnotification.py:87 #, python-format msgid "%(filetype)s metadata cannot be read" msgstr "Metadata %(filetype)s nelze načíst." -#: rapid/problemnotification.py:88 +#: rapid/problemnotification.py:89 #, python-format msgid "%(filetype)s %(area)s could not be generated" msgstr "Nelze vytvořit %(filetype)s %(area)s" -#: rapid/problemnotification.py:90 rapid/problemnotification.py:91 +#: rapid/problemnotification.py:91 rapid/problemnotification.py:92 #, python-format msgid "An error occurred when copying the %(filetype)s" msgstr "Při kopírování %(filetype)s došlo k chybě." -#: rapid/problemnotification.py:93 rapid/problemnotification.py:94 +#: rapid/problemnotification.py:94 rapid/problemnotification.py:95 #, python-format msgid "%(filetype)s already exists" msgstr "%(filetype)s a již existuje" -#: rapid/problemnotification.py:97 +#: rapid/problemnotification.py:98 #, python-format msgid "" "%(filetype)s could not be backed up because no suitable backup locations " @@ -1117,19 +1145,19 @@ msgid "" msgstr "" "%(filetype)s nelze zálohovat, protože nebylo nalezeno vhodné umístění." -#: rapid/problemnotification.py:102 +#: rapid/problemnotification.py:103 #, python-format msgid "" "%(image1)s was taken on %(image1_date)s at %(image1_time)s, and %(image2)s " "on %(image2_date)s at %(image2_time)s." msgstr "" -#: rapid/problemnotification.py:103 +#: rapid/problemnotification.py:104 #, python-format msgid "%(filetype)s was already downloaded" msgstr "%(filetype)s byl už stažen" -#: rapid/problemnotification.py:107 +#: rapid/problemnotification.py:108 #, python-format msgid "" "The existing %(filetype)s was last modified on %(date)s at %(time)s. Unique " @@ -1138,53 +1166,53 @@ msgstr "" "Existující %(filetype)s byl naposledy změněn %(date)s v %(time)s. Byl " "přidán jedinečný identifikátor '%(identifier)s'." -#: rapid/problemnotification.py:108 +#: rapid/problemnotification.py:109 #, python-format msgid "The existing %(filetype)s was last modified on %(date)s at %(time)s." msgstr "Existující %(filetype)s byl naposledy změněn %(date)s v %(time)s." -#: rapid/problemnotification.py:109 +#: rapid/problemnotification.py:110 #, python-format msgid "There is no data with which to name the %(filetype)s." msgstr "Neexistují žádná data k pojmenování %(filetype)s." -#: rapid/problemnotification.py:111 +#: rapid/problemnotification.py:112 #, python-format msgid "Error: %(errorno)s %(strerror)s" msgstr "Chyba: %(errorno)s %(strerror)s" -#: rapid/problemnotification.py:201 +#: rapid/problemnotification.py:202 msgid "The metadata might be corrupt." msgstr "Metadata jsou pravděpodobně poškozená." -#: rapid/problemnotification.py:204 +#: rapid/problemnotification.py:205 msgid "" "The filename, extension and Exif information indicate it has already been " "downloaded." msgstr "Jméno souboru, přípona a EXIF naznačují, že soubor byl již stažen." -#: rapid/problemnotification.py:223 +#: rapid/problemnotification.py:224 #, python-format msgid " It was backed up to %(volume)s" msgstr " byl zálohován na %(volume)s" -#: rapid/problemnotification.py:225 +#: rapid/problemnotification.py:226 msgid " It was backed up to these devices: " msgstr " byl zálohován na následující zařízení: " -#: rapid/problemnotification.py:227 rapid/problemnotification.py:288 -#: rapid/problemnotification.py:300 +#: rapid/problemnotification.py:228 rapid/problemnotification.py:289 +#: rapid/problemnotification.py:301 #, python-format msgid "%s, " msgstr "%s, " -#: rapid/problemnotification.py:228 rapid/problemnotification.py:289 -#: rapid/problemnotification.py:301 +#: rapid/problemnotification.py:229 rapid/problemnotification.py:290 +#: rapid/problemnotification.py:302 #, python-format msgid "%(volumes)s and %(final_volume)s." msgstr "%(volumes)s a %(final_volume)s." -#: rapid/problemnotification.py:240 +#: rapid/problemnotification.py:241 #, python-format msgid "" "Photos detected with the same filenames, but taken at different times: " @@ -1193,482 +1221,446 @@ msgstr "" "Byly nalezeny fotky se stejným jménem, ale rozdílným časem vzniku: " "%(details)s" -#: rapid/problemnotification.py:257 +#: rapid/problemnotification.py:258 #, python-format msgid "An error occurred when backing up on %(volume)s: %(inst)s." msgstr "Došlo k chybě při zálohování na %(volume)s: %(inst)s." -#: rapid/problemnotification.py:259 +#: rapid/problemnotification.py:260 #, python-format msgid "An error occurred when backing up on %(volume)s." msgstr "Došlo k chybě při zálohování na %(volume)s." -#: rapid/problemnotification.py:261 +#: rapid/problemnotification.py:262 msgid "Errors occurred when backing up on the following backup devices: " msgstr "Došlo k chybám při zálohování na následující zařízení: " -#: rapid/problemnotification.py:265 rapid/problemnotification.py:313 +#: rapid/problemnotification.py:266 rapid/problemnotification.py:314 #, python-format msgid "%(volume)s (%(inst)s), " msgstr "%(volume)s (%(inst)s), " -#: rapid/problemnotification.py:267 +#: rapid/problemnotification.py:268 #, python-format msgid "%(volume)s, " msgstr "%(volume)s, " -#: rapid/problemnotification.py:271 rapid/problemnotification.py:315 +#: rapid/problemnotification.py:272 rapid/problemnotification.py:316 #, python-format msgid "%(volumes)s and %(volume)s (%(inst)s)." msgstr "%(volumes)s a %(volume)s (%(inst)s)." -#: rapid/problemnotification.py:276 +#: rapid/problemnotification.py:277 #, python-format msgid "%(volumes)s and %(volume)s." msgstr "%(volumes)s a %(volume)s." -#: rapid/problemnotification.py:284 +#: rapid/problemnotification.py:285 #, python-format msgid "Backup already exists on %(volume)s." msgstr "Na zařízení %(volume)s už záloha existuje." -#: rapid/problemnotification.py:286 +#: rapid/problemnotification.py:287 msgid "Backups already exist in these locations: " msgstr "Zálohy už existují, a to v těchto umístěních: " -#: rapid/problemnotification.py:296 +#: rapid/problemnotification.py:297 #, python-format msgid "Backup overwritten on %(volume)s." msgstr "Záloha na %(volume)s byla přepsána." -#: rapid/problemnotification.py:298 +#: rapid/problemnotification.py:299 msgid "Backups overwritten on these devices: " msgstr "Zálohy na následujících zařízeních byly přepsány: " -#: rapid/problemnotification.py:309 +#: rapid/problemnotification.py:310 #, python-format msgid "An error occurred when creating directories on %(volume)s: %(inst)s." msgstr "Došlo k chybě při vytváření adresářů na %(volume)s: %(inst)s." -#: rapid/problemnotification.py:311 +#: rapid/problemnotification.py:312 msgid "" "Errors occurred when creating directories on the following backup devices: " msgstr "Došlo k chybě při vytváření adresářů na následujících zařízeních: " -#: rapid/problemnotification.py:322 +#: rapid/problemnotification.py:323 #, python-format msgid "%(previousproblem)s Additionally, %(newproblem)s" msgstr "%(previousproblem)s - kromě toho: %(newproblem)s" -#: rapid/problemnotification.py:330 +#: rapid/problemnotification.py:331 #, python-format msgid " Furthermore, there were %(problems)s." msgstr " Kromě toho došlo k dalším %(problems)s problémům." -#: rapid/problemnotification.py:332 +#: rapid/problemnotification.py:333 #, python-format msgid " Furthermore, there was a %(problem)s." msgstr " Kromě toho došlo k %(problem)s." -#: rapid/problemnotification.py:341 +#: rapid/problemnotification.py:342 #, python-format msgid "The %(type)s metadata is missing." msgstr "Metadata %(type)s chybí." -#: rapid/problemnotification.py:343 +#: rapid/problemnotification.py:344 msgid "The following metadata is missing: " msgstr "Následující metada chybí: " -#: rapid/problemnotification.py:346 +#: rapid/problemnotification.py:347 #, python-format msgid "%(missing_metadata_elements)s and %(final_missing_metadata_element)s." msgstr "%(missing_metadata_elements)s a %(final_missing_metadata_element)s." -#: rapid/problemnotification.py:363 +#: rapid/problemnotification.py:364 msgid "Problems in subfolder and filename generation" msgstr "Problémy při vytváření názvů pro složky a soubory" -#: rapid/problemnotification.py:365 +#: rapid/problemnotification.py:366 msgid "Problem in subfolder and filename generation" msgstr "Problém při vytváření názvů pro složky a soubory" -#: rapid/problemnotification.py:368 +#: rapid/problemnotification.py:369 #, python-format msgid "Problems in %s generation" msgstr "Problémy při vytváření %s" -#: rapid/problemnotification.py:370 +#: rapid/problemnotification.py:371 #, python-format msgid "Problem in %s generation" msgstr "Problém při vytváření %s" -#: rapid/problemnotification.py:379 +#: rapid/problemnotification.py:380 #, python-format msgid "%(filetype)s already exists, but it was backed up" msgstr "%(filetype)s už existuje, ale byl zálohován" -#: rapid/problemnotification.py:381 +#: rapid/problemnotification.py:382 #, python-format msgid "An error occurred when copying the %(filetype)s, but it was backed up" msgstr "Při kopírování %(filetype)s došlo k chybě, ale záloha proběhla" -#: rapid/problemnotification.py:401 +#: rapid/problemnotification.py:402 msgid "Multiple problems were encountered" msgstr "Došlo k více problémům" -#: rapid/problemnotification.py:403 rapid/subfolderfile.py:230 +#: rapid/problemnotification.py:404 rapid/subfolderfile.py:233 msgid "Photos detected with the same filenames, but taken at different times" msgstr "Byly nalezeny fotky se stejným jménem, ale různým datem vzniku" -#: rapid/problemnotification.py:409 +#: rapid/problemnotification.py:410 msgid "there were errors backing up" msgstr "chyby při zálohování" -#: rapid/problemnotification.py:410 +#: rapid/problemnotification.py:411 msgid "There were errors backing up" msgstr "Chyby při zálohování" -#: rapid/problemnotification.py:412 +#: rapid/problemnotification.py:413 msgid "there was an error backing up" msgstr "chyba při zálohování" -#: rapid/problemnotification.py:413 +#: rapid/problemnotification.py:414 msgid "There was an error backing up" msgstr "Chyba při zálohování" #. e.g. -#: rapid/problemnotification.py:416 +#: rapid/problemnotification.py:417 #, python-format msgid "%(previousproblem)s, and %(backinguperror)s" msgstr "%(previousproblem)s a %(backinguperror)s" -#: rapid/rpdfile.py:139 +#: rapid/rpdfile.py:153 #, python-format msgid "%(number)s %(filetypes)s" msgstr "%(number)s %(filetypes)s" -#: rapid/subfolderfile.py:79 +#: rapid/rpdfile.py:163 +#, python-format +msgid "scanning (found %(photos)s photos and %(videos)s videos)..." +msgstr "hledám (nalezeno %(photos)s fotek a %(videos)s videí)..." + +#: rapid/subfolderfile.py:80 #, python-format msgid "%(hour)s:%(minute)s:%(second)s:%(subsecond)s" msgstr "%(hour)s:%(minute)s:%(second)s:%(subsecond)s" -#: rapid/subfolderfile.py:300 +#: rapid/subfolderfile.py:301 msgid "Photo has already been downloaded" msgstr "Fotka už byla stažena" -#: rapid/subfolderfile.py:301 +#: rapid/subfolderfile.py:302 #, python-format msgid "Source: %(source)s" msgstr "Zdroj: %(source)s" -#: rapid/subfolderfile.py:359 +#: rapid/subfolderfile.py:354 msgid "subfolder and filename" msgstr "podsložka a název souboru" -#: rapid/subfolderfile.py:397 +#: rapid/subfolderfile.py:393 msgid "Failed to create download subfolder" msgstr "Nepodařilo se vytvořit podsložku" -#: rapid/subfolderfile.py:398 +#: rapid/subfolderfile.py:394 #, python-format msgid "Path: %s" msgstr "Cesta: %s" -#: rapid/glade3/rapid.ui.h:1 -msgid "About..." -msgstr "O aplikaci..." - #: rapid/glade3/rapid.ui.h:2 -msgid "Check All" -msgstr "Zaškrtnout všechny" +msgid "_File" +msgstr "_Soubor" #: rapid/glade3/rapid.ui.h:3 -msgid "Check All Photos" -msgstr "Zaškrtnout všechny fotky" +msgid "Download / Pause" +msgstr "Stahování / Pauza" #: rapid/glade3/rapid.ui.h:4 -msgid "Check All Videos" -msgstr "Zaškrtnout všechna videa" +msgid "_Select" +msgstr "_Vybrat" + +#: rapid/glade3/rapid.ui.h:5 +msgid "Select All Without _Job Code" +msgstr "Vybrat všechny _bez štítku" #: rapid/glade3/rapid.ui.h:6 -msgid "Download / Pause" -msgstr "Stahování / Pauza" +msgid "Select All Wit_h Job Code" +msgstr "Vybrat všechny se ští_tkem" #: rapid/glade3/rapid.ui.h:7 -msgid "Get Help Online..." -msgstr "Získat online pomoc..." +msgid "_View" +msgstr "_Zobrazení" #: rapid/glade3/rapid.ui.h:8 -msgid "Help" -msgstr "Nápověda" +msgid "_Error Log" +msgstr "_Záznam chyb" #: rapid/glade3/rapid.ui.h:9 -msgid "Make a Donation..." -msgstr "Darovat..." +msgid "_Clear Completed Downloads" +msgstr "_Vyčistit kompletní stahování" #: rapid/glade3/rapid.ui.h:10 -msgid "Next File" -msgstr "Další soubor" - -#: rapid/glade3/rapid.ui.h:11 -msgid "Preferences" -msgstr "Nastavení" - -#: rapid/glade3/rapid.ui.h:12 msgid "Previous File" msgstr "Předchozí soubor" -#: rapid/glade3/rapid.ui.h:13 -msgid "Quit" -msgstr "Konec" - -#: rapid/glade3/rapid.ui.h:15 -msgid "Refresh" -msgstr "Aktualizovat" - -#: rapid/glade3/rapid.ui.h:16 -msgid "Report a Problem..." -msgstr "Nahlásit problém..." - -#: rapid/glade3/rapid.ui.h:17 -msgid "Select All Wit_h Job Code" -msgstr "Vybrat všechny se ští_tkem" - -#: rapid/glade3/rapid.ui.h:18 -msgid "Select All Without _Job Code" -msgstr "Vybrat všechny _bez štítku" - -#: rapid/glade3/rapid.ui.h:19 -msgid "Translate this Application..." -msgstr "Přeložit tuto aplikaci..." - -#: rapid/glade3/rapid.ui.h:20 -msgid "Uncheck All" -msgstr "Odškrtnout všechny" - -#: rapid/glade3/rapid.ui.h:21 -msgid "_Check All" -msgstr "Zaškrtnout _všechny" - -#: rapid/glade3/rapid.ui.h:22 -msgid "_Clear Completed Downloads" -msgstr "_Vyčistit kompletní stahování" - -#: rapid/glade3/rapid.ui.h:23 -msgid "_Download" -msgstr "_Stáhnout" - -#: rapid/glade3/rapid.ui.h:24 -msgid "_Error Log" -msgstr "_Záznam chyb" - -#: rapid/glade3/rapid.ui.h:25 -msgid "_File" -msgstr "_Soubor" +#: rapid/glade3/rapid.ui.h:11 +msgid "Next File" +msgstr "Další soubor" -#: rapid/glade3/rapid.ui.h:26 +#: rapid/glade3/rapid.ui.h:12 msgid "_Help" msgstr "_Nápověda" -#: rapid/glade3/rapid.ui.h:27 -msgid "_Include in download" -msgstr "Vybrat pro stažení" - -#: rapid/glade3/rapid.ui.h:28 +#: rapid/glade3/rapid.ui.h:13 msgid "_Make a Donation..." msgstr "_Dejte příspěvek..." -#: rapid/glade3/rapid.ui.h:29 -msgid "_Select" -msgstr "_Vybrat" - -#: rapid/glade3/rapid.ui.h:30 +#: rapid/glade3/rapid.ui.h:14 msgid "_Translate this Application..." msgstr "_Přeložit tuto aplikaci..." -#: rapid/glade3/rapid.ui.h:31 +#: rapid/glade3/rapid.ui.h:15 +msgid "_Check All" +msgstr "Zaškrtnout _všechny" + +#: rapid/glade3/rapid.ui.h:16 msgid "_Uncheck All" msgstr "_Odznačit vše" -#: rapid/glade3/rapid.ui.h:32 -msgid "_View" -msgstr "_Zobrazení" +#: rapid/glade3/rapid.ui.h:17 +msgid "_Include in download" +msgstr "Vybrat pro stažení" + +#: rapid/glade3/rapid.ui.h:18 +msgid "_Download" +msgstr "_Stáhnout" #: rapid/glade3/prefs.ui.h:1 -msgid " " -msgstr " " +msgid "Preferences: Rapid Photo Downloader" +msgstr "Nastavení: Rapid Photo Downloader" #: rapid/glade3/prefs.ui.h:2 -msgid " hh:mm" -msgstr " hh:mm" +msgid "<span weight=\"bold\" size=\"x-large\">Photo Download Folders</span>" +msgstr "" +"<span weight=\"bold\" size=\"x-large\">Složky stahování fotografií</span>" #: rapid/glade3/prefs.ui.h:3 -msgid ":" -msgstr ":" +msgid "<i>Example: /home/user/Pictures</i>" +msgstr "<i>Příklad: /home/user/Pictures</i>" #: rapid/glade3/prefs.ui.h:4 -msgid "<b>Backup</b>" -msgstr "<b>Záloha</b>" +msgid "<b>Download Subfolders</b>" +msgstr "<b>Podsložky stahování</b>" #: rapid/glade3/prefs.ui.h:5 -msgid "<b>Compatibility with Other Operating Systems</b>" -msgstr "<b>Kompaktibilita s jinými operačními systémy</b>" +msgid "Download folder:" +msgstr "Složka stahování:" #: rapid/glade3/prefs.ui.h:6 -msgid "<b>Download Folder</b>" -msgstr "<b>Složka stahování</b>" +msgid "" +"Choose the download folder. Subfolders for the downloaded photos will be " +"automatically created in this folder using the structure specified below." +msgstr "" +"Vyberte složku stahování. Podsložky pro stahované obrázky budou vytvořeny " +"automaticky v této složce s použitím struktury specifikované níže." #: rapid/glade3/prefs.ui.h:7 -msgid "<b>Download Subfolders</b>" -msgstr "<b>Podsložky stahování</b>" +msgid "<b>Download Folder</b>" +msgstr "<b>Složka stahování</b>" #: rapid/glade3/prefs.ui.h:8 -msgid "<b>Example</b>" -msgstr "<b>Příklad</b>" +msgid "Photo Folders" +msgstr "Složky fotografií" #: rapid/glade3/prefs.ui.h:9 -msgid "<b>Job Codes</b>" -msgstr "<b>Pracovní kódy</b>" +msgid "<span weight=\"bold\" size=\"x-large\">Photo Rename</span>\t" +msgstr "" +"<span weight=\"bold\" size=\"x-large\">Přejmenování fotografií</span>\t" #: rapid/glade3/prefs.ui.h:10 msgid "<b>Photo Rename</b>" msgstr "<b>Přejmenování fotografie</b>" #: rapid/glade3/prefs.ui.h:11 -msgid "<b>Photo and Video Name Conflicts</b>" -msgstr "<b>Konflikty jmen fotografií a videa</b>" +msgid " " +msgstr " " #: rapid/glade3/prefs.ui.h:12 -msgid "<b>Program Automation</b>" -msgstr "<b>Automatizace programu</b>" +msgid "<i>New:</i>" +msgstr "<i>Nový:</i>" #: rapid/glade3/prefs.ui.h:13 -msgid "<b>Sequence Numbers</b>" -msgstr "<b>Sekvenční čísla</b>" +msgid "<i>Original:</i>" +msgstr "<i>Originál:</i>" #: rapid/glade3/prefs.ui.h:14 -msgid "<i>/media/externaldrive/Photos</i>" -msgstr "<i>/media/externaldrive/Photos</i>" +msgid "<b>Example</b>" +msgstr "<b>Příklad</b>" #: rapid/glade3/prefs.ui.h:15 -msgid "<i>Example: /home/user/Pictures</i>" -msgstr "<i>Příklad: /home/user/Pictures</i>" +msgid "Photo Rename" +msgstr "Přejmenování fotografií" #: rapid/glade3/prefs.ui.h:16 -msgid "<i>Example:</i>" -msgstr "<i>Příklad:</i>" +msgid "<span weight=\"bold\" size=\"x-large\">Video Download Folders</span>" +msgstr "<span weight=\"bold\" size=\"x-large\">Složky stahování videa</span>" #: rapid/glade3/prefs.ui.h:17 -msgid "<i>New:</i>" -msgstr "<i>Nový:</i>" +msgid "" +"Sorry, video downloading functionality disabled. To download videos, please " +"install either the <i>hachoir metadata</i> and <i>kaa metadata</i> packages " +"for python, or <i>exiftool</i>." +msgstr "" #: rapid/glade3/prefs.ui.h:18 -msgid "<i>Original:</i>" -msgstr "<i>Originál:</i>" +msgid "" +"Choose the download folder. Subfolders for the downloaded videos will be " +"automatically created in this folder using the structure specified below." +msgstr "" +"Vyberte složku pro stažení. Podsložky pro stažená videa jsou vytvořena " +"automaticky podle schématu, které si vytvoříte." #: rapid/glade3/prefs.ui.h:19 -msgid "<span weight=\"bold\" size=\"x-large\">Backup</span>\t" -msgstr "<span weight=\"bold\" size=\"x-large\">Záloha</span>\t" +msgid "Video Folders" +msgstr "Složky pro videa" #: rapid/glade3/prefs.ui.h:20 -msgid "<span weight=\"bold\" size=\"x-large\">Device Options</span>" -msgstr "<span weight=\"bold\" size=\"x-large\">Možnosti zařízení</span>" +msgid "<span weight=\"bold\" size=\"x-large\">Video Rename</span>\t" +msgstr "<span weight=\"bold\" size=\"x-large\">Přejmenování videa</span>\t" #: rapid/glade3/prefs.ui.h:21 -msgid "<span weight=\"bold\" size=\"x-large\">Devices</span>" -msgstr "<span weight=\"bold\" size=\"x-large\">Zařízení</span>" +msgid "Video Rename" +msgstr "Přejmenovat videa" #: rapid/glade3/prefs.ui.h:22 -msgid "<span weight=\"bold\" size=\"x-large\">Error Handling</span>" -msgstr "<span weight=\"bold\" size=\"x-large\">Chybová obsluha</span>" +msgid "<span weight=\"bold\" size=\"x-large\">Rename Options</span>" +msgstr "<span weight=\"bold\" size=\"x-large\">Možnosti přejmenování</span>" #: rapid/glade3/prefs.ui.h:23 -msgid "<span weight=\"bold\" size=\"x-large\">Job Codes</span>" -msgstr "<span weight=\"bold\" size=\"x-large\">Pracovní kódy</span>" +msgid "<b>Sequence Numbers</b>" +msgstr "<b>Sekvenční čísla</b>" #: rapid/glade3/prefs.ui.h:24 -msgid "<span weight=\"bold\" size=\"x-large\">Miscellaneous</span>" -msgstr "<span weight=\"bold\" size=\"x-large\">Různé</span>" +msgid "" +"Specify the time in 24 hour format at which the <i>Downloads today</i> " +"sequence number should be reset." +msgstr "" +"Specifikujte čas ve 24 hodinovém formátu aby mohlo být resetováno sekvenční " +"číslo v <i>Dnešní stahování</i>." #: rapid/glade3/prefs.ui.h:25 -msgid "<span weight=\"bold\" size=\"x-large\">Photo Download Folders</span>" -msgstr "" -"<span weight=\"bold\" size=\"x-large\">Složky stahování fotografií</span>" +msgid "Day start:" +msgstr "Začátek dne:" #: rapid/glade3/prefs.ui.h:26 -msgid "<span weight=\"bold\" size=\"x-large\">Photo Rename</span>\t" -msgstr "" -"<span weight=\"bold\" size=\"x-large\">Přejmenování fotografií</span>\t" +msgid "Downloads today:" +msgstr "Dnešní stahování:" #: rapid/glade3/prefs.ui.h:27 -msgid "<span weight=\"bold\" size=\"x-large\">Rename Options</span>" -msgstr "<span weight=\"bold\" size=\"x-large\">Možnosti přejmenování</span>" +msgid "Stored number:" +msgstr "Uskladněné číslo:" #: rapid/glade3/prefs.ui.h:28 -msgid "<span weight=\"bold\" size=\"x-large\">Video Download Folders</span>" -msgstr "<span weight=\"bold\" size=\"x-large\">Složky stahování videa</span>" +msgid ":" +msgstr ":" #: rapid/glade3/prefs.ui.h:29 -msgid "<span weight=\"bold\" size=\"x-large\">Video Rename</span>\t" -msgstr "<span weight=\"bold\" size=\"x-large\">Přejmenování videa</span>\t" +msgid " hh:mm" +msgstr " hh:mm" #: rapid/glade3/prefs.ui.h:30 -msgid "Add unique identifier" -msgstr "Přidat unikátní identifikátor" +msgid "Synchronize RAW + JPEG sequence numbers" +msgstr "Synchronizovat sekvenční čísla RAW + JPEG" #: rapid/glade3/prefs.ui.h:31 -msgid "Automatically detect Portable Storage Devices" -msgstr "Automatická detekce kapesních paměťových zařízení" +msgid "<b>Compatibility with Other Operating Systems</b>" +msgstr "<b>Kompaktibilita s jinými operačními systémy</b>" #: rapid/glade3/prefs.ui.h:32 -msgid "Automatically detect backup devices" -msgstr "Automatická detekce zálohovacích zařízení" +msgid "" +"Specify whether photo, video and folder names should have any characters " +"removed that are not allowed by other operating systems." +msgstr "" +"Určete znaky, které se mohou objevit v názvech souborů, ale mohly by později " +"působit problémy" #: rapid/glade3/prefs.ui.h:33 -msgid "Automatically detect devices" -msgstr "Automaticky detekovat zařízení" +msgid "Strip incompatible characters" +msgstr "Odstranit nekompatibilní znaky" #: rapid/glade3/prefs.ui.h:34 -msgid "Automatically rotate JPEG images" -msgstr "Automaticky otáčet obrázky formátu JPEG" +msgid "Rename Options" +msgstr "Možnosti přejmenování" #: rapid/glade3/prefs.ui.h:35 -msgid "Backup" -msgstr "Záloha" +msgid "<span weight=\"bold\" size=\"x-large\">Job Codes</span>" +msgstr "<span weight=\"bold\" size=\"x-large\">Pracovní kódy</span>" #: rapid/glade3/prefs.ui.h:36 -msgid "Backup photos and videos when downloading" -msgstr "Zálohovat fotografie a videa při stahování" +msgid "<b>Job Codes</b>" +msgstr "<b>Pracovní kódy</b>" #: rapid/glade3/prefs.ui.h:37 -msgid "" -"Choose the download folder. Subfolders for the downloaded photos will be " -"automatically created in this folder using the structure specified below." -msgstr "" -"Vyberte složku stahování. Podsložky pro stahované obrázky budou vytvořeny " -"automaticky v této složce s použitím struktury specifikované níže." - -#: rapid/glade3/prefs.ui.h:38 -msgid "" -"Choose the download folder. Subfolders for the downloaded videos will be " -"automatically created in this folder using the structure specified below." -msgstr "" -"Vyberte složku pro stažení. Podsložky pro stažená videa jsou vytvořena " -"automaticky podle schématu, které si vytvoříte." +msgid "_Add..." +msgstr "_Přidat..." #: rapid/glade3/prefs.ui.h:39 -msgid "Day start:" -msgstr "Začátek dne:" +msgid "R_emove All" +msgstr "O_dstranit vše" #: rapid/glade3/prefs.ui.h:40 -msgid "Device Options" -msgstr "Možnosti zařízení" +msgid "Job Codes" +msgstr "Pracovní kódy" #: rapid/glade3/prefs.ui.h:41 +msgid "<span weight=\"bold\" size=\"x-large\">Devices</span>" +msgstr "<span weight=\"bold\" size=\"x-large\">Zařízení</span>" + +#: rapid/glade3/prefs.ui.h:42 msgid "Devices" msgstr "Zařízení" -#: rapid/glade3/prefs.ui.h:42 +#: rapid/glade3/prefs.ui.h:43 msgid "" "Devices are from where to download photos and videos, such as cameras, " "memory cards or Portable Storage Devices.\n" @@ -1682,35 +1674,27 @@ msgid "" "used.</i>" msgstr "" -#: rapid/glade3/prefs.ui.h:47 -msgid "Download folder:" -msgstr "Složka stahování:" - #: rapid/glade3/prefs.ui.h:48 -msgid "Downloads today:" -msgstr "Dnešní stahování:" +msgid "Automatically detect Portable Storage Devices" +msgstr "Automatická detekce kapesních paměťových zařízení" #: rapid/glade3/prefs.ui.h:49 -msgid "Error Handling" -msgstr "Chybová obsluha" +msgid "Automatically detect devices" +msgstr "Automaticky detekovat zařízení" #: rapid/glade3/prefs.ui.h:50 -msgid "Exit program even if download had warnings or errors" -msgstr "Ukončit program, i když stahování skončilo varováními nebo chybami" - -#: rapid/glade3/prefs.ui.h:51 -msgid "Exit program when download completes" -msgstr "Ukončit program po stažení souborů" - -#: rapid/glade3/prefs.ui.h:52 -msgid "Generate thumbnails (slower)" -msgstr "Generovat náhledy (pomalé)" - -#: rapid/glade3/prefs.ui.h:53 msgid "" -"If you disable automatic detection, choose the exact backup locations." +"If you enable automatic detection of Portable Storage Devices, the entire " +"device will be scanned. On large devices, this could take some time.\n" +"\n" +"When this option is enabled, and a potential device is detected, you will be " +"prompted to determine if it should be scanned or not." msgstr "" +#: rapid/glade3/prefs.ui.h:53 +msgid "Location:" +msgstr "Umístění:" + #: rapid/glade3/prefs.ui.h:54 msgid "" "If you disable automatic detection, choose the exact location of the photos " @@ -1718,12 +1702,18 @@ msgid "" msgstr "" #: rapid/glade3/prefs.ui.h:55 +msgid "<span weight=\"bold\" size=\"x-large\">Device Options</span>" +msgstr "<span weight=\"bold\" size=\"x-large\">Možnosti zařízení</span>" + +#: rapid/glade3/prefs.ui.h:56 +msgid "Remembered Paths" +msgstr "Zapamatované cesty" + +#: rapid/glade3/prefs.ui.h:57 msgid "" -"If you enable automatic detection of Portable Storage Devices, the entire " -"device will be scanned. On large devices, this could take some time.\n" -"\n" -"When this option is enabled, and a potential device is detected, you will be " -"prompted to determine if it should be scanned or not." +"Remembered paths are those associated with devices that you have chosen to " +"always scan or ignore when automatic detection of Portable Storage Devices " +"is enabled." msgstr "" #: rapid/glade3/prefs.ui.h:58 @@ -1731,164 +1721,155 @@ msgid "Ignored Paths" msgstr "Ignorované cesty" #: rapid/glade3/prefs.ui.h:59 -msgid "Job Codes" -msgstr "Pracovní kódy" - -#: rapid/glade3/prefs.ui.h:60 -msgid "Location:" -msgstr "Umístění:" +msgid "" +"Specify the ending portion of any paths you want ignored when scanning " +"devices for photos or videos. Any path ending with the values below will not " +"be scanned." +msgstr "" #: rapid/glade3/prefs.ui.h:61 -msgid "Miscellaneous" -msgstr "Různé" +msgid "Re_move All" +msgstr "_Odstranit vše" #: rapid/glade3/prefs.ui.h:62 -msgid "Overwrite" -msgstr "Přepsat" +msgid "Use _python-style regular expressions" +msgstr "Použijte _python-style regulární zkratky" #: rapid/glade3/prefs.ui.h:63 -msgid "Performance" -msgstr "Výkon" +msgid "Device Options" +msgstr "Možnosti zařízení" #: rapid/glade3/prefs.ui.h:64 -msgid "Photo Folders" -msgstr "Složky fotografií" +msgid "<span weight=\"bold\" size=\"x-large\">Backup</span>\t" +msgstr "<span weight=\"bold\" size=\"x-large\">Záloha</span>\t" #: rapid/glade3/prefs.ui.h:65 -msgid "Photo Rename" -msgstr "Přejmenování fotografií" +msgid "<b>Backup</b>" +msgstr "<b>Záloha</b>" #: rapid/glade3/prefs.ui.h:66 -msgid "Photo backup folder name:" -msgstr "Název složky pro zálohu fotek" +msgid "" +"If you disable automatic detection, choose the exact backup locations." +msgstr "" #: rapid/glade3/prefs.ui.h:67 -msgid "Photo backup location:" -msgstr "Umístění zálohy fotografií:" +msgid "Automatically detect backup devices" +msgstr "Automatická detekce zálohovacích zařízení" #: rapid/glade3/prefs.ui.h:68 -msgid "Preferences: Rapid Photo Downloader" -msgstr "Nastavení: Rapid Photo Downloader" +msgid "" +"You can have your photos and videos backed up to multiple locations as they " +"are downloaded, e.g. external hard drives." +msgstr "" +"Při stahování můžete fotky a videa zálohovat na více umístění, např. na " +"externí disky." -#: rapid/glade3/prefs.ui.h:70 -msgid "R_emove All" -msgstr "O_dstranit vše" +#: rapid/glade3/prefs.ui.h:69 +msgid "Backup photos and videos when downloading" +msgstr "Zálohovat fotografie a videa při stahování" -#: rapid/glade3/prefs.ui.h:72 -msgid "Re_move All" -msgstr "_Odstranit vše" +#: rapid/glade3/prefs.ui.h:70 +msgid "" +"Specify the folder in which backups are stored on the device. \n" +"\n" +"<i>Note: this will also be used to determine whether or not the device is " +"used for backups. For each device you wish to use for backing up to, create " +"a folder in it with one of these names.</i>" +msgstr "" +"Vyberte složku, ve které jsou na zařízení uloženy zálohy. \n" +"<i>Poznámka: Podle toho se také pozná, zda je zařízení použito pro zálohy. " +"Na každém zařízení, které chcete pro zálohy použít, vytvořte složku s " +"některým jménem. </i>" #: rapid/glade3/prefs.ui.h:73 -msgid "Remembered Paths" -msgstr "Zapamatované cesty" +msgid "Photo backup location:" +msgstr "Umístění zálohy fotografií:" #: rapid/glade3/prefs.ui.h:74 -msgid "" -"Remembered paths are those associated with devices that you have chosen to " -"always scan or ignore when automatic detection of Portable Storage Devices " -"is enabled." -msgstr "" +msgid "Photo backup folder name:" +msgstr "Název složky pro zálohu fotek" #: rapid/glade3/prefs.ui.h:75 -msgid "Rename Options" -msgstr "Možnosti přejmenování" +msgid "<i>Example:</i>" +msgstr "<i>Příklad:</i>" #: rapid/glade3/prefs.ui.h:76 -msgid "Skip" -msgstr "Vynechat" +msgid "<i>/media/externaldrive/Photos</i>" +msgstr "<i>/media/externaldrive/Photos</i>" #: rapid/glade3/prefs.ui.h:77 -msgid "Skip download" -msgstr "Vynechat stahování" +msgid "Video backup folder name:" +msgstr "Název složky pro zálohu videí" #: rapid/glade3/prefs.ui.h:78 -msgid "" -"Sorry, video downloading functionality disabled. To download videos, please " -"install either the <i>hachoir metadata</i> and <i>kaa metadata</i> packages " -"for python, or <i>exiftool</i>." -msgstr "" +msgid "Video backup location:" +msgstr "Umístění zálohy videí:" #: rapid/glade3/prefs.ui.h:79 -msgid "" -"Specify the ending portion of any paths you want ignored when scanning " -"devices for photos or videos. Any path ending with the values below will not " -"be scanned." -msgstr "" +msgid "Backup" +msgstr "Záloha" #: rapid/glade3/prefs.ui.h:80 -msgid "" -"Specify the folder in which backups are stored on the device. \n" -"\n" -"<i>Note: this will also be used to determine whether or not the device is " -"used for backups. For each device you wish to use for backing up to, create " -"a folder in it with one of these names.</i>" -msgstr "" -"Vyberte složku, ve které jsou na zařízení uloženy zálohy. \n" -"<i>Poznámka: Podle toho se také pozná, zda je zařízení použito pro zálohy. " -"Na každém zařízení, které chcete pro zálohy použít, vytvořte složku s " -"některým jménem. </i>" +msgid "<span weight=\"bold\" size=\"x-large\">Miscellaneous</span>" +msgstr "<span weight=\"bold\" size=\"x-large\">Různé</span>" -#: rapid/glade3/prefs.ui.h:83 -msgid "" -"Specify the time in 24 hour format at which the <i>Downloads today</i> " -"sequence number should be reset." -msgstr "" -"Specifikujte čas ve 24 hodinovém formátu aby mohlo být resetováno sekvenční " -"číslo v <i>Dnešní stahování</i>." +#: rapid/glade3/prefs.ui.h:81 +msgid "<b>Program Automation</b>" +msgstr "<b>Automatizace programu</b>" -#: rapid/glade3/prefs.ui.h:84 -msgid "" -"Specify whether photo, video and folder names should have any characters " -"removed that are not allowed by other operating systems." -msgstr "" -"Určete znaky, které se mohou objevit v názvech souborů, ale mohly by později " -"působit problémy" +#: rapid/glade3/prefs.ui.h:82 +msgid "Unmount (\"eject\") device upon download completion" +msgstr "Po stažení souborů odpojit zařízení" -#: rapid/glade3/prefs.ui.h:85 +#: rapid/glade3/prefs.ui.h:83 msgid "Start downloading at program startup" msgstr "Start stahování při startu programu" -#: rapid/glade3/prefs.ui.h:86 +#: rapid/glade3/prefs.ui.h:84 msgid "Start downloading upon device insertion" msgstr "Začít stahovat hned po vložení zařízení" +#: rapid/glade3/prefs.ui.h:85 +msgid "Exit program when download completes" +msgstr "Ukončit program po stažení souborů" + +#: rapid/glade3/prefs.ui.h:86 +msgid "Exit program even if download had warnings or errors" +msgstr "Ukončit program, i když stahování skončilo varováními nebo chybami" + #: rapid/glade3/prefs.ui.h:87 -msgid "Stored number:" -msgstr "Uskladněné číslo:" +msgid "Automatically rotate JPEG images" +msgstr "Automaticky otáčet obrázky formátu JPEG" #: rapid/glade3/prefs.ui.h:88 -msgid "Strip incompatible characters" -msgstr "Odstranit nekompatibilní znaky" +msgid "Performance" +msgstr "Výkon" #: rapid/glade3/prefs.ui.h:89 -msgid "Synchronize RAW + JPEG sequence numbers" -msgstr "Synchronizovat sekvenční čísla RAW + JPEG" +msgid "Generate thumbnails (slower)" +msgstr "Generovat náhledy (pomalé)" #: rapid/glade3/prefs.ui.h:90 -msgid "Unmount (\"eject\") device upon download completion" -msgstr "Po stažení souborů odpojit zařízení" +msgid "Miscellaneous" +msgstr "Různé" #: rapid/glade3/prefs.ui.h:91 -msgid "Use _python-style regular expressions" -msgstr "Použijte _python-style regulární zkratky" +msgid "<span weight=\"bold\" size=\"x-large\">Error Handling</span>" +msgstr "<span weight=\"bold\" size=\"x-large\">Chybová obsluha</span>" #: rapid/glade3/prefs.ui.h:92 -msgid "Video Folders" -msgstr "Složky pro videa" +msgid "<b>Photo and Video Name Conflicts</b>" +msgstr "<b>Konflikty jmen fotografií a videa</b>" #: rapid/glade3/prefs.ui.h:93 -msgid "Video Rename" -msgstr "Přejmenovat videa" +msgid "Add unique identifier" +msgstr "Přidat unikátní identifikátor" #: rapid/glade3/prefs.ui.h:94 -msgid "Video backup folder name:" -msgstr "Název složky pro zálohu videí" +msgid "Skip download" +msgstr "Vynechat stahování" #: rapid/glade3/prefs.ui.h:95 -msgid "Video backup location:" -msgstr "Umístění zálohy videí:" - -#: rapid/glade3/prefs.ui.h:96 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." @@ -1896,7 +1877,7 @@ msgstr "" "Pokud má fotka nebo video stejný název jako již existující soubor, vyberte, " "zda se má stahování přeskočit, nebo přejmenovat." -#: rapid/glade3/prefs.ui.h:97 +#: rapid/glade3/prefs.ui.h:96 msgid "" "When backing up, choose whether to overwrite a file on the backup device " "that has the same name, or skip backing it up." @@ -1904,17 +1885,17 @@ msgstr "" "Vyberte, zda při zálohování přepsat na cílovém zařízení soubor se stejným " "jménem, nebo jeho zálohování přeskočit." +#: rapid/glade3/prefs.ui.h:97 +msgid "Overwrite" +msgstr "Přepsat" + #: rapid/glade3/prefs.ui.h:98 -msgid "" -"You can have your photos and videos backed up to multiple locations as they " -"are downloaded, e.g. external hard drives." -msgstr "" -"Při stahování můžete fotky a videa zálohovat na více umístění, např. na " -"externí disky." +msgid "Skip" +msgstr "Vynechat" #: rapid/glade3/prefs.ui.h:99 -msgid "_Add..." -msgstr "_Přidat..." +msgid "Error Handling" +msgstr "Chybová obsluha" #: rapid/glade3/about.ui.h:1 msgid "Import your photos and videos efficiently and reliably" @@ -7,22 +7,22 @@ msgid "" msgstr "" "Project-Id-Version: rapid\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" -"POT-Creation-Date: 2011-11-20 13:25-0600\n" -"PO-Revision-Date: 2011-11-21 07:04+0000\n" +"POT-Creation-Date: 2012-06-23 04:00-0500\n" +"PO-Revision-Date: 2012-06-25 07:23+0000\n" "Last-Translator: Torben Gundtofte-Bruun <torben@g-b.dk>\n" "Language-Team: Danish <da@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-12-28 07:56+0000\n" -"X-Generator: Launchpad (build 14560)\n" +"X-Launchpad-Export-Date: 2012-09-11 00:24+0000\n" +"X-Generator: Launchpad (build 15924)\n" #. Translators: if neccessary, for guidance in how to translate this program, you may see http://damonlynch.net/translate.html -#: rapid/rapid.py:107 rapid/rapid.py:1699 rapid/glade3/rapid.ui.h:14 +#: rapid/rapid.py:112 rapid/rapid.py:1784 rapid/glade3/rapid.ui.h:1 msgid "Rapid Photo Downloader" msgstr "Rapid Photo Downloader" -#: rapid/rapid.py:112 +#: rapid/rapid.py:117 #, python-format msgid "" "%(date)s\n" @@ -31,33 +31,33 @@ msgstr "" "%(date)s\n" "%(time)s" -#: rapid/rapid.py:114 +#: rapid/rapid.py:119 #, python-format msgid "%(date)s %(time)s" msgstr "%(date)s %(time)s" -#: rapid/rapid.py:117 +#: rapid/rapid.py:122 #, 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:152 +#: rapid/rapid.py:157 msgid "Device" msgstr "Enhed" #. Size refers to the total size of images on the device, typically in #. MB or GB -#: rapid/rapid.py:170 +#: rapid/rapid.py:175 msgid "Size" msgstr "Størrelse" -#: rapid/rapid.py:173 +#: rapid/rapid.py:178 msgid "Download Progress" msgstr "Downloadfremgang" -#: rapid/rapid.py:319 +#: rapid/rapid.py:336 #, python-format msgid "%(device)s did not unmount" msgstr "%(device)s kunne ikke afmonteres" @@ -66,22 +66,22 @@ msgstr "%(device)s kunne ikke afmonteres" #. 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:1186 +#: rapid/rapid.py:1216 msgid "scanning..." msgstr "gennemsøger..." #. this location is a human readable explanation for /, and is inserted into Downloading from %(location)s -#: rapid/rapid.py:1697 +#: rapid/rapid.py:1782 msgid "the root of the file system" msgstr "filsystemets rod" #. message in dialog box which asks the user if they really want to be downloading from this location -#: rapid/rapid.py:1701 +#: rapid/rapid.py:1786 #, python-format msgid "Downloading from %(location)s." msgstr "henter fra %(location)s." -#: rapid/rapid.py:1702 +#: rapid/rapid.py:1787 msgid "" "Do you really want to download from here? On some systems, scanning this " "location can take a very long time." @@ -89,15 +89,15 @@ msgstr "" "Vil du virkelig hente herfra? På nogle systemer kan det tage lang tid at " "gennemse denne kilde." -#: rapid/rapid.py:2124 rapid/glade3/rapid.ui.h:5 +#: rapid/rapid.py:2209 msgid "Download" msgstr "Hent" -#: rapid/rapid.py:2127 +#: rapid/rapid.py:2212 msgid "Pause" msgstr "Pause" -#: rapid/rapid.py:2228 +#: rapid/rapid.py:2317 #, python-format msgid "" "These download folders are invalid:\n" @@ -108,7 +108,7 @@ msgstr "" "%(folder1)s\n" "%(folder2)s" -#: rapid/rapid.py:2231 +#: rapid/rapid.py:2320 #, python-format msgid "" "This download folder is invalid:\n" @@ -117,176 +117,176 @@ msgstr "" "Denne download mappe er ugyldig:\n" "%s" -#: rapid/rapid.py:2232 +#: rapid/rapid.py:2321 msgid "Download cannot proceed" msgstr "Download kan ikke fortsætte" -#: rapid/rapid.py:2559 +#: rapid/rapid.py:2700 msgid "About 1 second remaining" msgstr "Cirka 1 sekund endnu" -#: rapid/rapid.py:2561 +#: rapid/rapid.py:2702 #, python-format msgid "About %i seconds remaining" msgstr "Cirka %i sekunder endnu" -#: rapid/rapid.py:2563 +#: rapid/rapid.py:2704 msgid "About 1 minute remaining" msgstr "Cirka 1 minut endnu" #. 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:2568 +#: rapid/rapid.py:2709 #, python-format msgid "About %(minutes)i:%(seconds)02i minutes remaining" msgstr "Cirka %(minutes)i:%(seconds)02i sekunder endnu" -#: rapid/rapid.py:2590 rapid/rpdfile.py:113 +#: rapid/rapid.py:2731 rapid/rpdfile.py:123 msgid "photos and videos" msgstr "fotos og videoer" -#: rapid/rapid.py:2592 rapid/rpdfile.py:115 +#: rapid/rapid.py:2733 rapid/rpdfile.py:125 msgid "photos or videos" msgstr "fotos eller videoer" -#: rapid/rapid.py:2595 rapid/rapid.py:3408 rapid/rpdfile.py:118 +#: rapid/rapid.py:2736 rapid/rapid.py:3558 rapid/rpdfile.py:128 msgid "videos" msgstr "videoer" -#: rapid/rapid.py:2597 rapid/preferencesdialog.py:1617 rapid/rpdfile.py:120 -#: rapid/rpdfile.py:254 +#: rapid/rapid.py:2738 rapid/preferencesdialog.py:1620 rapid/rpdfile.py:130 +#: rapid/rpdfile.py:291 msgid "video" msgstr "video" -#: rapid/rapid.py:2600 rapid/rapid.py:3406 rapid/rpdfile.py:123 +#: rapid/rapid.py:2741 rapid/rapid.py:3556 rapid/rpdfile.py:133 msgid "photos" msgstr "fotos" #. check subfolder preferences for bad values -#: rapid/rapid.py:2602 rapid/preferencesdialog.py:1616 rapid/rpdfile.py:125 -#: rapid/rpdfile.py:234 +#: rapid/rapid.py:2743 rapid/preferencesdialog.py:1619 rapid/rpdfile.py:135 +#: rapid/rpdfile.py:272 msgid "photo" msgstr "foto" -#: rapid/rapid.py:2629 +#: rapid/rapid.py:2770 #, python-format msgid "%(noFiles)s %(filetypes)s downloaded" msgstr "%(noFiles)s %(filetypes)s hentet" -#: rapid/rapid.py:2633 +#: rapid/rapid.py:2774 #, python-format msgid "%(noFiles)s %(filetypes)s failed to download" msgstr "%(noFiles)s %(filetypes)s kunne ikke hentes" -#: rapid/rapid.py:2636 rapid/rapid.py:2688 +#: rapid/rapid.py:2777 rapid/rapid.py:2829 msgid "warnings" msgstr "advarsler" -#: rapid/rapid.py:2645 +#: rapid/rapid.py:2786 msgid "All downloads complete" msgstr "Alle downloads er afsluttet" -#: rapid/rapid.py:2651 rapid/rapid.py:2660 rapid/rapid.py:2669 -#: rapid/rapid.py:2678 rapid/rapid.py:2686 +#: rapid/rapid.py:2792 rapid/rapid.py:2801 rapid/rapid.py:2810 +#: rapid/rapid.py:2819 rapid/rapid.py:2827 #, python-format msgid "%(number)s %(numberdownloaded)s" msgstr "%(number)s %(numberdownloaded)s" -#: rapid/rapid.py:2653 rapid/rapid.py:2671 +#: rapid/rapid.py:2794 rapid/rapid.py:2812 #, python-format msgid "%(filetype)s downloaded" msgstr "%(filetype)s hentet" -#: rapid/rapid.py:2662 rapid/rapid.py:2680 +#: rapid/rapid.py:2803 rapid/rapid.py:2821 #, python-format msgid "%(filetype)s failed to download" msgstr "%(filetype)s kunne ikke hentes" #. e.g.: 3 of 205 photos and videos (202 remaining) -#: rapid/rapid.py:2719 +#: rapid/rapid.py:2860 #, python-format msgid "%(number)s of %(total)s %(filetypes)s (%(remaining)s remaining)" msgstr "%(number)s af %(total)s %(filetypes)s (%(remaining)s endnu)" #. e.g.: 205 of 205 photos and videos -#: rapid/rapid.py:2726 +#: rapid/rapid.py:2867 #, python-format msgid "%(number)s of %(total)s %(filetypes)s" msgstr "%(number)s af %(total)s %(filetypes)s" -#: rapid/rapid.py:3072 +#: rapid/rapid.py:3222 msgid "From" msgstr "Fra" -#: rapid/rapid.py:3080 +#: rapid/rapid.py:3230 msgid "Auto Detect" msgstr "Opdag automatisk" -#: rapid/rapid.py:3084 rapid/preferencesdialog.py:1324 +#: rapid/rapid.py:3234 rapid/preferencesdialog.py:1327 #, python-format msgid "Select a folder containing %(file_types)s" msgstr "Vælg en mappe der indeholder %(file_types)s" -#: rapid/rapid.py:3125 +#: rapid/rapid.py:3275 msgid "Copy" msgstr "Kopier" -#: rapid/rapid.py:3138 +#: rapid/rapid.py:3288 msgid "Move" msgstr "Flyt" -#: rapid/rapid.py:3160 +#: rapid/rapid.py:3310 msgid "To" msgstr "Til" -#: rapid/rapid.py:3167 rapid/rapid.py:3796 +#: rapid/rapid.py:3317 rapid/rapid.py:3986 msgid "Photos:" msgstr "Fotos:" -#: rapid/rapid.py:3170 rapid/preferencesdialog.py:1161 +#: rapid/rapid.py:3320 rapid/preferencesdialog.py:1164 msgid "Select a folder to download photos to" msgstr "Vælg en mappe at downloade fotos til" -#: rapid/rapid.py:3182 rapid/rapid.py:3796 +#: rapid/rapid.py:3332 rapid/rapid.py:3986 msgid "Videos:" msgstr "Videoer:" -#: rapid/rapid.py:3184 rapid/preferencesdialog.py:1179 +#: rapid/rapid.py:3334 rapid/preferencesdialog.py:1182 msgid "Select a folder to download videos to" msgstr "Vælg en mappe at downloade videoer til" -#: rapid/rapid.py:3376 +#: rapid/rapid.py:3526 msgid "and" msgstr "og" -#: rapid/rapid.py:3381 +#: rapid/rapid.py:3531 msgid "Using backup devices" msgstr "Benytter backup enheder" -#: rapid/rapid.py:3383 +#: rapid/rapid.py:3533 msgid "Using backup device" msgstr "Benytter backup enhed" -#: rapid/rapid.py:3385 +#: rapid/rapid.py:3535 msgid "No backup devices detected" msgstr "Ingen backup enheder fundet" -#: rapid/rapid.py:3412 +#: rapid/rapid.py:3562 msgid "Free space:" msgstr "Fri plads:" #. (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:3424 +#: rapid/rapid.py:3574 #, 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:3428 +#: rapid/rapid.py:3578 #, python-format msgid "%(free)s %(file_type)s" msgstr "%(free)s %(file_type)s" @@ -294,87 +294,87 @@ 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:3433 +#: rapid/rapid.py:3583 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:3438 +#: rapid/rapid.py:3588 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:3444 +#: rapid/rapid.py:3594 #, python-format msgid "%(free)s free" msgstr "%(free)s fri plads" #. user manually specified the same location for photos and video backups -#: rapid/rapid.py:3452 +#: rapid/rapid.py:3602 #, python-format msgid "Backing up photos and videos to %(path)s" msgstr "Sikkerhedskopierer fotos og videoer til %(path)s" #. user manually specified backup location -#: rapid/rapid.py:3455 +#: rapid/rapid.py:3605 #, python-format msgid "Backing up to %(path)s" msgstr "Tager sikkerhedskopi til %(path)s" #. user manually specified different locations for photo and video backups -#: rapid/rapid.py:3458 +#: rapid/rapid.py:3608 #, python-format msgid "Backing up photos to %(path)s and videos to %(path2)s" msgstr "Sikkerhedskopierer fotos til %(path)s og videoer til %(path2)s" -#: rapid/rapid.py:3465 +#: rapid/rapid.py:3615 #, python-format msgid "%(freespace)s. %(backuppaths)s." msgstr "%(freespace)s. %(backuppaths)s." -#: rapid/rapid.py:3494 +#: rapid/rapid.py:3644 msgid "Program preferences are invalid" msgstr "Programmets indstillinger er ugyldige" -#: rapid/rapid.py:3613 rapid/rpdfile.py:235 +#: rapid/rapid.py:3770 rapid/rpdfile.py:273 msgid "Photo" msgstr "Foto" -#: rapid/rapid.py:3615 rapid/rpdfile.py:255 +#: rapid/rapid.py:3772 rapid/rpdfile.py:292 msgid "Video" msgstr "Video" -#: rapid/rapid.py:3624 +#: rapid/rapid.py:3781 #, python-format msgid "%(file_type)s download folder does not exist" msgstr "%(file_type)s download mappe findes ikke" -#: rapid/rapid.py:3626 rapid/rapid.py:3640 rapid/rapid.py:3653 +#: rapid/rapid.py:3783 rapid/rapid.py:3797 rapid/rapid.py:3810 #, python-format msgid "Folder: %s" msgstr "Mappe: %s" -#: rapid/rapid.py:3638 +#: rapid/rapid.py:3795 #, python-format msgid "%(file_type)s download folder is invalid" msgstr "%(file_type)s download mappe er ugyldig" -#: rapid/rapid.py:3651 +#: rapid/rapid.py:3808 #, python-format msgid "%(file_type)s download folder is not writable" msgstr "%(file_type)s download mappe er skrivebeskyttet" -#: rapid/rapid.py:3729 +#: rapid/rapid.py:3894 msgid "Thumbnails" msgstr "Små billeder" #. 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:3777 +#: rapid/rapid.py:3949 #, python-format msgid "" "display program information on the command line as the program runs " @@ -383,43 +383,67 @@ msgstr "" "vis programinformation på kommandolinien mens programmet kører (standard: " "%default)" -#: rapid/rapid.py:3778 +#: rapid/rapid.py:3950 msgid "display debugging information when run from the command line" msgstr "" "vis fejlsøgningsinformation når programmet startes fra kommandolinien" -#: rapid/rapid.py:3779 +#: rapid/rapid.py:3951 msgid "only output errors to the command line" msgstr "vis kun fejl på kommandolinien" #. image file extensions are recognized RAW files plus TIFF and JPG -#: rapid/rapid.py:3781 +#: rapid/rapid.py:3953 msgid "list photo and video file extensions the program recognizes and exit" msgstr "vis hvilke foto og video formater programmet kender, og afslut" -#: rapid/rapid.py:3783 +#: rapid/rapid.py:3955 +msgid "" +"automatically detect devices from which to download, overwriting existing " +"program preferences" +msgstr "" +"opdag enheder automatisk, hvorfra der skal hentes, og overskriv " +"eksisterende programindstillinger" + +#: rapid/rapid.py:3956 +msgid "" +"manually specify the PATH of the device from which to download, overwriting " +"existing program preferences" +msgstr "" +"angiv stien manuelt, hvorfra der skal hentes, og overskriv eksisterende " +"programindstillinger" + +#: rapid/rapid.py:3957 msgid "reset all program settings and preferences and exit" msgstr "nulstil alle programindstillinger og afslut" -#: rapid/rapid.py:3801 +#: rapid/rapid.py:3970 +msgid "" +"Error: specify device auto-detection or manually specify a device's path " +"from which to download, but do not do both." +msgstr "" +"Fejl: angiv automatisk opdagelse af enheder, eller angiv stien manuelt, " +"hvorfra der skal hentes, men angiv ikke begge dele." + +#: rapid/rapid.py:3991 #, python-format msgid "and %s" msgstr "og %s" -#: rapid/rapid.py:3809 +#: rapid/rapid.py:3999 msgid "All settings and preferences have been reset" msgstr "Alle indstillinger er blevet nulstillet" -#: rapid/backupfile.py:142 rapid/backupfile.py:165 +#: rapid/backupfile.py:157 rapid/backupfile.py:180 msgid "Backing up error" msgstr "Fejl ved sikkerhedskopiering" -#: rapid/backupfile.py:144 +#: rapid/backupfile.py:159 #, python-format msgid "Destination directory could not be created: %(directory)s\n" msgstr "Destinationsmappe kunne ikke oprettes: %(directory)s\n" -#: rapid/backupfile.py:146 rapid/backupfile.py:167 rapid/subfolderfile.py:196 +#: rapid/backupfile.py:161 rapid/backupfile.py:182 rapid/subfolderfile.py:199 #, python-format msgid "" "Source: %(source)s\n" @@ -428,13 +452,13 @@ msgstr "" "Kilde: %(source)s\n" "Destination: %(destination)s" -#: rapid/backupfile.py:149 rapid/backupfile.py:169 +#: rapid/backupfile.py:164 rapid/backupfile.py:184 #, python-format msgid "Error: %(inst)s" msgstr "Fejl: %(inst)s" -#: rapid/copyfiles.py:159 rapid/subfolderfile.py:211 -#: rapid/subfolderfile.py:352 rapid/subfolderfile.py:370 +#: rapid/copyfiles.py:163 rapid/subfolderfile.py:214 +#: rapid/subfolderfile.py:347 rapid/subfolderfile.py:365 #, python-format msgid "" "%(problem)s\n" @@ -443,491 +467,501 @@ msgstr "" "%(problem)s\n" "Fil: %(file)s" -#: rapid/device.py:79 +#: rapid/device.py:80 msgid "Device Detected" msgstr "Enhed fundet" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#usedeviceprompt -#: rapid/device.py:88 +#: rapid/device.py:89 msgid "" "Should this device or partition be used to download photos or videos from?" msgstr "Skal fotos og videoer hentes fra denne enhed?" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#usedeviceprompt -#: rapid/device.py:107 +#: rapid/device.py:108 msgid "_Remember this choice" msgstr "_Husk dette valg" -#: rapid/downloadtracker.py:298 +#: rapid/downloadtracker.py:299 msgid "MB/s" msgstr "MB/s" -#: rapid/generatenameconfig.py:150 +#: rapid/generatenameconfig.py:151 msgid "Date time" msgstr "Dato og klokkeslæt" -#: rapid/generatenameconfig.py:151 +#: rapid/generatenameconfig.py:152 msgid "Text" msgstr "Tekst" -#: rapid/generatenameconfig.py:152 +#: rapid/generatenameconfig.py:153 msgid "Filename" msgstr "Filnavn" -#: rapid/generatenameconfig.py:153 +#: rapid/generatenameconfig.py:154 msgid "Metadata" msgstr "Metadata" -#: rapid/generatenameconfig.py:154 +#: rapid/generatenameconfig.py:155 msgid "Sequences" msgstr "Sekvenser" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode -#: rapid/generatenameconfig.py:156 rapid/preferencesdialog.py:574 +#: rapid/generatenameconfig.py:157 rapid/preferencesdialog.py:577 msgid "Job code" msgstr "Job kode" -#: rapid/generatenameconfig.py:157 +#: rapid/generatenameconfig.py:158 msgid "Image date" msgstr "Billedets dato" -#: rapid/generatenameconfig.py:158 +#: rapid/generatenameconfig.py:159 msgid "Video date" msgstr "Videoens dato" -#: rapid/generatenameconfig.py:159 +#: rapid/generatenameconfig.py:160 msgid "Today" msgstr "I dag" -#: rapid/generatenameconfig.py:160 +#: rapid/generatenameconfig.py:161 msgid "Yesterday" msgstr "I går" #. Translators: Download time is the time and date that the download started (when the user clicked the Download button) -#: rapid/generatenameconfig.py:162 +#: rapid/generatenameconfig.py:163 msgid "Download time" msgstr "Download klokkeslæt" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:164 +#: rapid/generatenameconfig.py:165 msgid "Name + extension" msgstr "Navn + udvidelse" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:166 +#: rapid/generatenameconfig.py:167 msgid "Name" msgstr "Navn" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:168 +#: rapid/generatenameconfig.py:169 msgid "Extension" msgstr "Udvidelse" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:170 +#: rapid/generatenameconfig.py:171 msgid "Image number" msgstr "Billedets nummer" -#: rapid/generatenameconfig.py:171 +#: rapid/generatenameconfig.py:172 msgid "Video number" msgstr "Videoens nummer" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:173 +#: rapid/generatenameconfig.py:174 msgid "Aperture" msgstr "Blænde" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:175 +#: rapid/generatenameconfig.py:176 msgid "ISO" msgstr "ISO" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:177 +#: rapid/generatenameconfig.py:178 msgid "Exposure time" msgstr "Lukkertid" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:179 +#: rapid/generatenameconfig.py:180 msgid "Focal length" msgstr "Brændvidde" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:181 +#: rapid/generatenameconfig.py:182 msgid "Camera make" msgstr "Kameramærke" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:183 +#: rapid/generatenameconfig.py:184 msgid "Camera model" msgstr "Kameramodel" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:185 +#: rapid/generatenameconfig.py:186 msgid "Short camera model" msgstr "Forkortet kameramodel" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:187 +#: rapid/generatenameconfig.py:188 msgid "Hyphenated short camera model" msgstr "Forkortet kameramodel med bindestreg" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:189 +#: rapid/generatenameconfig.py:190 msgid "Serial number" msgstr "Serienummer" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:191 +#: rapid/generatenameconfig.py:192 msgid "Shutter count" msgstr "Lukker-antal" #. File number currently refers to the Exif value Exif.Canon.FileNumber -#: rapid/generatenameconfig.py:193 +#: rapid/generatenameconfig.py:194 msgid "File number" msgstr "Filnummer" #. Only the folder component of the Exif.Canon.FileNumber value -#: rapid/generatenameconfig.py:195 +#: rapid/generatenameconfig.py:196 msgid "Folder only" msgstr "Kun mappen" #. The folder and file component of the Exif.Canon.FileNumber value -#: rapid/generatenameconfig.py:197 +#: rapid/generatenameconfig.py:198 msgid "Folder and file" msgstr "Mappe og fil" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:199 +#: rapid/generatenameconfig.py:200 msgid "Owner name" msgstr "Ejernavn" -#: rapid/generatenameconfig.py:200 +#: rapid/generatenameconfig.py:201 msgid "Codec" msgstr "Kodning" -#: rapid/generatenameconfig.py:201 +#: rapid/generatenameconfig.py:202 msgid "Width" msgstr "Bredde" -#: rapid/generatenameconfig.py:202 +#: rapid/generatenameconfig.py:203 msgid "Height" msgstr "Højde" -#: rapid/generatenameconfig.py:203 +#: rapid/generatenameconfig.py:204 msgid "Length" msgstr "Længde" -#: rapid/generatenameconfig.py:204 +#: rapid/generatenameconfig.py:205 msgid "Frames Per Second" msgstr "Billeder per sekund" -#: rapid/generatenameconfig.py:205 +#: rapid/generatenameconfig.py:206 msgid "Artist" msgstr "Kunstner" -#: rapid/generatenameconfig.py:206 +#: rapid/generatenameconfig.py:207 msgid "Copyright" msgstr "Ophavsret" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#sequencenumbers -#: rapid/generatenameconfig.py:208 +#: rapid/generatenameconfig.py:209 msgid "Downloads today" msgstr "Downloads i dag" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#sequencenumbers -#: rapid/generatenameconfig.py:210 +#: rapid/generatenameconfig.py:211 msgid "Session number" msgstr "Kørselsnummer" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#sequencenumbers -#: rapid/generatenameconfig.py:212 +#: rapid/generatenameconfig.py:213 msgid "Subfolder number" msgstr "Undermappe nummer" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#sequencenumbers -#: rapid/generatenameconfig.py:214 +#: rapid/generatenameconfig.py:215 msgid "Stored number" msgstr "Gemt nummer" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#sequenceletters -#: rapid/generatenameconfig.py:216 +#: rapid/generatenameconfig.py:217 msgid "Sequence letter" msgstr "Sekvensbogstav" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:218 +#: rapid/generatenameconfig.py:219 msgid "All digits" msgstr "Alle cifre" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:220 +#: rapid/generatenameconfig.py:221 msgid "Last digit" msgstr "Sidste ciffer" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:222 +#: rapid/generatenameconfig.py:223 msgid "Last 2 digits" msgstr "Sidste 2 cifre" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:224 +#: rapid/generatenameconfig.py:225 msgid "Last 3 digits" msgstr "Sidste 3 cifre" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:226 +#: rapid/generatenameconfig.py:227 msgid "Last 4 digits" msgstr "Sidste 4 cifre" #. Translators: please not the capitalization of this text, and keep it the same if your language features capitalization -#: rapid/generatenameconfig.py:228 +#: rapid/generatenameconfig.py:229 msgid "Original Case" msgstr "Oprindelige Store/Små Bogstaver" #. Translators: please not the capitalization of this text, and keep it the same if your language features capitalization -#: rapid/generatenameconfig.py:230 +#: rapid/generatenameconfig.py:231 msgid "UPPERCASE" msgstr "STORE BOGSTAVER" #. Translators: please not the capitalization of this text, and keep it the same if your language features capitalization -#: rapid/generatenameconfig.py:232 +#: rapid/generatenameconfig.py:233 msgid "lowercase" msgstr "små bogstaver" -#: rapid/generatenameconfig.py:233 +#: rapid/generatenameconfig.py:234 msgid "One digit" msgstr "Et ciffer" -#: rapid/generatenameconfig.py:234 +#: rapid/generatenameconfig.py:235 msgid "Two digits" msgstr "To cifre" -#: rapid/generatenameconfig.py:235 +#: rapid/generatenameconfig.py:236 msgid "Three digits" msgstr "Tre cifre" -#: rapid/generatenameconfig.py:236 +#: rapid/generatenameconfig.py:237 msgid "Four digits" msgstr "Fire cifre" -#: rapid/generatenameconfig.py:237 +#: rapid/generatenameconfig.py:238 msgid "Five digits" msgstr "Fem cifre" -#: rapid/generatenameconfig.py:238 +#: rapid/generatenameconfig.py:239 msgid "Six digits" msgstr "Seks cifre" -#: rapid/generatenameconfig.py:239 +#: rapid/generatenameconfig.py:240 msgid "Seven digits" msgstr "Syv cifre" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:241 +#: rapid/generatenameconfig.py:242 msgid "Subseconds" msgstr "Delsekunder" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:243 +#: rapid/generatenameconfig.py:244 msgid "YYYYMMDD" msgstr "ÅÅÅÅMMDD" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:245 +#: rapid/generatenameconfig.py:246 msgid "YYYY-MM-DD" msgstr "ÅÅÅÅ-MM-DD" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:247 +#: rapid/generatenameconfig.py:248 msgid "YYMMDD" msgstr "ÅÅMMDD" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:249 +#: rapid/generatenameconfig.py:250 msgid "YY-MM-DD" msgstr "ÅÅ-MM-DD" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:251 +#: rapid/generatenameconfig.py:252 msgid "MMDDYYYY" msgstr "MMDDÅÅÅÅ" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:253 +#: rapid/generatenameconfig.py:254 msgid "MMDDYY" msgstr "MMDDÅÅ" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:255 +#: rapid/generatenameconfig.py:256 msgid "MMDD" msgstr "MMDD" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:257 +#: rapid/generatenameconfig.py:258 msgid "DDMMYYYY" msgstr "DDMMÅÅÅÅ" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:259 +#: rapid/generatenameconfig.py:260 msgid "DDMMYY" msgstr "DDMMÅÅ" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:261 +#: rapid/generatenameconfig.py:262 msgid "YYYY" msgstr "ÅÅÅÅ" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:263 +#: rapid/generatenameconfig.py:264 msgid "YY" msgstr "ÅÅ" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:265 +#: rapid/generatenameconfig.py:266 msgid "MM" msgstr "MM" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:267 +#: rapid/generatenameconfig.py:268 msgid "DD" msgstr "DD" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:269 +#: rapid/generatenameconfig.py:270 +msgid "Month (full)" +msgstr "Måned (udskrevet)" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:272 +msgid "Month (abbreviated)" +msgstr "Måned (forkortet)" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:274 msgid "HHMMSS" msgstr "TTMMSS" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:271 +#: rapid/generatenameconfig.py:276 msgid "HHMM" msgstr "TTMM" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:273 +#: rapid/generatenameconfig.py:278 msgid "HH-MM-SS" msgstr "TT-MM-SS" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:275 +#: rapid/generatenameconfig.py:280 msgid "HH-MM" msgstr "TT-MM" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:277 +#: rapid/generatenameconfig.py:282 msgid "HH" msgstr "TT" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:279 +#: rapid/generatenameconfig.py:284 msgid "MM (minutes)" msgstr "MM (minutter)" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:281 +#: rapid/generatenameconfig.py:286 msgid "SS" msgstr "SS" -#: rapid/preferencesdialog.py:371 +#: rapid/preferencesdialog.py:374 #, python-format msgid "Subfolder preferences should not start with a %s" msgstr "Undermappe indstillinger bør ikke begynde med et %s" -#: rapid/preferencesdialog.py:373 +#: rapid/preferencesdialog.py:376 #, python-format msgid "Subfolder preferences should not end with a %s" msgstr "Undermappe indstillinger bør ikke slutte med et %s" -#: rapid/preferencesdialog.py:377 +#: rapid/preferencesdialog.py:380 #, python-format msgid "Subfolder preferences should not contain two %s one after the other" msgstr "Undermappe indstillinger bør ikke indeholde to %s efter hinanden" -#: rapid/preferencesdialog.py:436 rapid/preferencesdialog.py:697 +#: rapid/preferencesdialog.py:439 rapid/preferencesdialog.py:700 msgid "Remove all Job Codes?" msgstr "Fjern alle job koder?" -#: rapid/preferencesdialog.py:437 rapid/preferencesdialog.py:714 +#: rapid/preferencesdialog.py:440 rapid/preferencesdialog.py:717 msgid "Should all Job Codes be removed?" msgstr "Skal alle job koder fjernes?" -#: rapid/preferencesdialog.py:443 +#: rapid/preferencesdialog.py:446 msgid "Remove all Remembered Paths?" msgstr "Fjern alle huskede stier?" -#: rapid/preferencesdialog.py:444 +#: rapid/preferencesdialog.py:447 msgid "Should all remembered paths be removed?" msgstr "Skal alle huskede stier fjernes?" -#: rapid/preferencesdialog.py:450 +#: rapid/preferencesdialog.py:453 msgid "Remove all Ignored Paths?" msgstr "Fjern alle ignorerede stier?" -#: rapid/preferencesdialog.py:451 +#: rapid/preferencesdialog.py:454 msgid "Should all ignored paths be removed?" msgstr "Skal alle ignorerede stier fjernes?" -#: rapid/preferencesdialog.py:462 +#: rapid/preferencesdialog.py:465 msgid "Error in Photo Rename preferences" msgstr "Fejl i indstillinger til foto omdøbning" -#: rapid/preferencesdialog.py:642 +#: rapid/preferencesdialog.py:645 msgid "Error in Video Rename preferences" msgstr "Fejl i indstillinger til video omdøbning" -#: rapid/preferencesdialog.py:663 +#: rapid/preferencesdialog.py:666 msgid "Error in Photo Download Subfolders preferences" msgstr "Fejl i indstillinger til foto download undermapper" -#: rapid/preferencesdialog.py:680 +#: rapid/preferencesdialog.py:683 msgid "Error in Video Download Subfolders preferences" msgstr "Fejl i indstillinger til video download undermapper" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode -#: rapid/preferencesdialog.py:739 +#: rapid/preferencesdialog.py:742 msgid "Enter a Job Code" msgstr "Angiv en jobkode" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode -#: rapid/preferencesdialog.py:755 +#: rapid/preferencesdialog.py:758 msgid "Enter a new Job Code, or select a previous one" msgstr "Angiv en ny jobkode eller vælg en eksisterende" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode -#: rapid/preferencesdialog.py:758 +#: rapid/preferencesdialog.py:761 msgid "Enter a new Job Code" msgstr "Angiv en ny jobkode" -#: rapid/preferencesdialog.py:763 +#: rapid/preferencesdialog.py:766 msgid "Job Code:" msgstr "Jobkode:" -#: rapid/preferencesdialog.py:819 +#: rapid/preferencesdialog.py:822 msgid "Enter a Path to Ignore" msgstr "Angiv en sti der skal ignoreres" -#: rapid/preferencesdialog.py:831 +#: rapid/preferencesdialog.py:834 msgid "Specify a path that will never be scanned for photos or videos" msgstr "Angiv en sti som aldrig skal gennemsøges efter fotos og videoer" -#: rapid/preferencesdialog.py:836 +#: rapid/preferencesdialog.py:839 msgid "Path:" msgstr "Sti:" -#: rapid/preferencesdialog.py:1079 +#: rapid/preferencesdialog.py:1082 msgid "Job Code" msgstr "Jobkode" -#: rapid/preferencesdialog.py:1350 +#: rapid/preferencesdialog.py:1353 msgid "Select a folder in which to backup photos" msgstr "Vælg en mappe til sikkerhedskopier af fotos" -#: rapid/preferencesdialog.py:1363 +#: rapid/preferencesdialog.py:1366 msgid "Select a folder in which to backup videos" msgstr "Vælg en mappe til sikkerhedskopier af videoer" #. 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:1458 +#: rapid/preferencesdialog.py:1461 msgid "" "<i><b>Warning:</b> There is insufficient metadata to fully generate the " "name. Please use other renaming options.</i>" @@ -935,7 +969,7 @@ msgstr "" "<i><b>Advarsel:</b> Metadata er utlistrækkelige til at generere navnet. Vælg " "andre muligheder for omdøbning.</i>" -#: rapid/preferencesdialog.py:1509 +#: rapid/preferencesdialog.py:1512 msgid "" "<i><b>Warning:</b> There is insufficient metadata to fully generate " "subfolders. Please use other subfolder naming options.</i>" @@ -944,13 +978,13 @@ msgstr "" "Vælg andre muligheder for navngivning af undermapper.</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:1512 +#: rapid/preferencesdialog.py:1515 #, python-format msgid "<i>Example: %s</i>" msgstr "<i>Eksempel: %s</i>" #. Preferences list is now empty -#: rapid/preferencesdialog.py:1602 +#: rapid/preferencesdialog.py:1605 #, python-format msgid "" "The %(filetype)s subfolder preferences entered are invalid and cannot be " @@ -960,7 +994,7 @@ msgstr "" "Indstillingerne til %(filetype)s undermappen er ugyldige.\n" "De bliver nulstillet til deres standardværdier." -#: rapid/preferencesdialog.py:1747 +#: rapid/preferencesdialog.py:1750 #, python-format msgid "" "The following regular expressions are invalid, and will be removed unless " @@ -971,7 +1005,7 @@ msgstr "" "ændrer dem:\n" " %s" -#: rapid/preferencesdialog.py:1749 +#: rapid/preferencesdialog.py:1752 #, python-format msgid "" "This regular expression is invalid, and will be removed unless you correct " @@ -982,142 +1016,142 @@ msgstr "" "ændrer det:\n" " %s" -#: rapid/preferencesdialog.py:1750 +#: rapid/preferencesdialog.py:1753 msgid "Invalid regular expression" msgstr "Ugyldigt regulært udtryk" #. Translators: this value is used as an example device when automatic backup device detection is enabled. You should translate this. -#: rapid/preferencesdialog.py:1931 +#: rapid/preferencesdialog.py:1934 msgid "externaldrive1" msgstr "eksterntdrev1" #. Translators: this value is used as an example device when automatic backup device detection is enabled. You should translate this. -#: rapid/preferencesdialog.py:1933 +#: rapid/preferencesdialog.py:1936 msgid "externaldrive2" msgstr "eksterntdrev2" -#: rapid/prefsrapid.py:126 +#: rapid/prefsrapid.py:127 msgid "New York" msgstr "New York" -#: rapid/prefsrapid.py:127 +#: rapid/prefsrapid.py:128 msgid "Manila" msgstr "Manila" -#: rapid/prefsrapid.py:127 +#: rapid/prefsrapid.py:128 msgid "Prague" msgstr "Prag" -#: rapid/prefsrapid.py:127 +#: rapid/prefsrapid.py:128 msgid "Helsinki" msgstr "Helsingfors" -#: rapid/prefsrapid.py:127 +#: rapid/prefsrapid.py:128 msgid "Wellington" msgstr "Wellington" -#: rapid/prefsrapid.py:128 +#: rapid/prefsrapid.py:129 msgid "Tehran" msgstr "Teheran" -#: rapid/prefsrapid.py:128 +#: rapid/prefsrapid.py:129 msgid "Kampala" msgstr "Kampala" -#: rapid/prefsrapid.py:128 +#: rapid/prefsrapid.py:129 msgid "Paris" msgstr "Paris" -#: rapid/prefsrapid.py:128 +#: rapid/prefsrapid.py:129 msgid "Berlin" msgstr "Berlin" -#: rapid/prefsrapid.py:128 +#: rapid/prefsrapid.py:129 msgid "Sydney" msgstr "Sydney" -#: rapid/prefsrapid.py:129 +#: rapid/prefsrapid.py:130 msgid "Budapest" msgstr "Budapest" -#: rapid/prefsrapid.py:129 +#: rapid/prefsrapid.py:130 msgid "Rome" msgstr "Rom" -#: rapid/prefsrapid.py:129 +#: rapid/prefsrapid.py:130 msgid "Moscow" msgstr "Moskva" -#: rapid/prefsrapid.py:129 +#: rapid/prefsrapid.py:130 msgid "Delhi" msgstr "Delhi" -#: rapid/prefsrapid.py:129 +#: rapid/prefsrapid.py:130 msgid "Warsaw" msgstr "Warszawa" -#: rapid/prefsrapid.py:130 +#: rapid/prefsrapid.py:131 msgid "Jakarta" msgstr "Jakarta" -#: rapid/prefsrapid.py:130 +#: rapid/prefsrapid.py:131 msgid "Madrid" msgstr "Madrid" -#: rapid/prefsrapid.py:130 +#: rapid/prefsrapid.py:131 msgid "Stockholm" msgstr "Stockholm" #. components -#: rapid/problemnotification.py:26 rapid/subfolderfile.py:363 +#: rapid/problemnotification.py:27 rapid/subfolderfile.py:358 msgid "subfolder" msgstr "undermappe" -#: rapid/problemnotification.py:27 rapid/subfolderfile.py:361 +#: rapid/problemnotification.py:28 rapid/subfolderfile.py:356 msgid "filename" msgstr "filnavn" -#: rapid/problemnotification.py:80 +#: rapid/problemnotification.py:81 #, python-format msgid "Date time value %s appears invalid." msgstr "Værdi for dato og klokkeslæt %s forekommer ugyldigt." -#: rapid/problemnotification.py:81 +#: rapid/problemnotification.py:82 msgid "Filename does not have an extension." msgstr "Filnavnet har ingen udvidelse." #. a number component is something like the 8346 in IMG_8346.JPG -#: rapid/problemnotification.py:83 +#: rapid/problemnotification.py:84 msgid "Filename does not have a number component." msgstr "Filnavnet indeholder ingen tal." -#: rapid/problemnotification.py:84 +#: rapid/problemnotification.py:85 #, python-format msgid "Error generating component %s." msgstr "Kunne ikke generere component %s." #. a generic problem -#: rapid/problemnotification.py:86 +#: rapid/problemnotification.py:87 #, python-format msgid "%(filetype)s metadata cannot be read" msgstr "%(filetype)s metadata kan ikke læses" -#: rapid/problemnotification.py:88 +#: rapid/problemnotification.py:89 #, python-format msgid "%(filetype)s %(area)s could not be generated" msgstr "%(filetype)s %(area)s kunne ikke genereres" -#: rapid/problemnotification.py:90 rapid/problemnotification.py:91 +#: rapid/problemnotification.py:91 rapid/problemnotification.py:92 #, python-format msgid "An error occurred when copying the %(filetype)s" msgstr "Der opstod en fejl ved kopiering af %(filetype)s" -#: rapid/problemnotification.py:93 rapid/problemnotification.py:94 +#: rapid/problemnotification.py:94 rapid/problemnotification.py:95 #, python-format msgid "%(filetype)s already exists" msgstr "%(filetype)s findes allerede" -#: rapid/problemnotification.py:97 +#: rapid/problemnotification.py:98 #, python-format msgid "" "%(filetype)s could not be backed up because no suitable backup locations " @@ -1126,7 +1160,7 @@ msgstr "" "Der kunne ikke tages sikkerhedskopi af %(filetype)s, fordi der ikke findes " "egnede placeringer til sikkerhedskopierne." -#: rapid/problemnotification.py:102 +#: rapid/problemnotification.py:103 #, python-format msgid "" "%(image1)s was taken on %(image1_date)s at %(image1_time)s, and %(image2)s " @@ -1135,12 +1169,12 @@ msgstr "" "%(image1)s blev taget den %(image1_date)s kl. %(image1_time)s, og %(image2)s " "den %(image2_date)s kl. %(image2_time)s." -#: rapid/problemnotification.py:103 +#: rapid/problemnotification.py:104 #, python-format msgid "%(filetype)s was already downloaded" msgstr "%(filetype)s er allerede blevet downloadet" -#: rapid/problemnotification.py:107 +#: rapid/problemnotification.py:108 #, python-format msgid "" "The existing %(filetype)s was last modified on %(date)s at %(time)s. Unique " @@ -1149,27 +1183,27 @@ msgstr "" "De eksisterende %(filetype)s er sidst ændret den %(date)s klokken %(time)s. " "Entydig angivelse '%(identifier)s' blev tilføjet." -#: rapid/problemnotification.py:108 +#: rapid/problemnotification.py:109 #, python-format msgid "The existing %(filetype)s was last modified on %(date)s at %(time)s." msgstr "" "De eksisterende %(filetype)s er sidst ændret den %(date)s klokken %(time)s." -#: rapid/problemnotification.py:109 +#: rapid/problemnotification.py:110 #, python-format msgid "There is no data with which to name the %(filetype)s." msgstr "Der mangler data til navngivning af %(filetype)sne." -#: rapid/problemnotification.py:111 +#: rapid/problemnotification.py:112 #, python-format msgid "Error: %(errorno)s %(strerror)s" msgstr "Fejl: %(errorno)s %(strerror)s" -#: rapid/problemnotification.py:201 +#: rapid/problemnotification.py:202 msgid "The metadata might be corrupt." msgstr "Metadata kan være korrupt." -#: rapid/problemnotification.py:204 +#: rapid/problemnotification.py:205 msgid "" "The filename, extension and Exif information indicate it has already been " "downloaded." @@ -1177,28 +1211,28 @@ msgstr "" "Filnavnet, udvidelsen og Exif informationerne antyder, at filen allerede er " "blevet downloadet." -#: rapid/problemnotification.py:223 +#: rapid/problemnotification.py:224 #, python-format msgid " It was backed up to %(volume)s" msgstr " Filen blev sikkerhedskopieret til %(volume)s" -#: rapid/problemnotification.py:225 +#: rapid/problemnotification.py:226 msgid " It was backed up to these devices: " msgstr " Filen blev sikkerhedskopieret til disse enheder: " -#: rapid/problemnotification.py:227 rapid/problemnotification.py:288 -#: rapid/problemnotification.py:300 +#: rapid/problemnotification.py:228 rapid/problemnotification.py:289 +#: rapid/problemnotification.py:301 #, python-format msgid "%s, " msgstr "%s, " -#: rapid/problemnotification.py:228 rapid/problemnotification.py:289 -#: rapid/problemnotification.py:301 +#: rapid/problemnotification.py:229 rapid/problemnotification.py:290 +#: rapid/problemnotification.py:302 #, python-format msgid "%(volumes)s and %(final_volume)s." msgstr "%(volumes)s og %(final_volume)s." -#: rapid/problemnotification.py:240 +#: rapid/problemnotification.py:241 #, python-format msgid "" "Photos detected with the same filenames, but taken at different times: " @@ -1206,484 +1240,451 @@ msgid "" msgstr "" "Der findes fotos med ens filnavne men forskellige datoer: %(details)s" -#: rapid/problemnotification.py:257 +#: rapid/problemnotification.py:258 #, python-format msgid "An error occurred when backing up on %(volume)s: %(inst)s." msgstr "Der opstod en fejl ved sikkerhedskopiering til %(volume)s: %(inst)s." -#: rapid/problemnotification.py:259 +#: rapid/problemnotification.py:260 #, python-format msgid "An error occurred when backing up on %(volume)s." msgstr "Der opstod en fejl ved sikkerhedskopiering til %(volume)s." -#: rapid/problemnotification.py:261 +#: rapid/problemnotification.py:262 msgid "Errors occurred when backing up on the following backup devices: " msgstr "Der opstod fejl ved sikkerhedskopiering til de følgende enheder: " -#: rapid/problemnotification.py:265 rapid/problemnotification.py:313 +#: rapid/problemnotification.py:266 rapid/problemnotification.py:314 #, python-format msgid "%(volume)s (%(inst)s), " msgstr "%(volume)s (%(inst)s), " -#: rapid/problemnotification.py:267 +#: rapid/problemnotification.py:268 #, python-format msgid "%(volume)s, " msgstr "%(volume)s, " -#: rapid/problemnotification.py:271 rapid/problemnotification.py:315 +#: rapid/problemnotification.py:272 rapid/problemnotification.py:316 #, python-format msgid "%(volumes)s and %(volume)s (%(inst)s)." msgstr "%(volumes)s og %(volume)s (%(inst)s)." -#: rapid/problemnotification.py:276 +#: rapid/problemnotification.py:277 #, python-format msgid "%(volumes)s and %(volume)s." msgstr "%(volumes)s og %(volume)s." -#: rapid/problemnotification.py:284 +#: rapid/problemnotification.py:285 #, python-format msgid "Backup already exists on %(volume)s." msgstr "Sikkerhedskopi findes allerede på %(volume)s." -#: rapid/problemnotification.py:286 +#: rapid/problemnotification.py:287 msgid "Backups already exist in these locations: " msgstr "Sikkerhedskopier findes allerede her: " -#: rapid/problemnotification.py:296 +#: rapid/problemnotification.py:297 #, python-format msgid "Backup overwritten on %(volume)s." msgstr "Sikkerhedskopi blev overskrevet på %(volume)s." -#: rapid/problemnotification.py:298 +#: rapid/problemnotification.py:299 msgid "Backups overwritten on these devices: " msgstr "Sikkerhedskopier blev overskrevet på disse enheder: " -#: rapid/problemnotification.py:309 +#: rapid/problemnotification.py:310 #, python-format msgid "An error occurred when creating directories on %(volume)s: %(inst)s." msgstr "Der opstod en fejl ved oprettelse af mapper på %(volume)s: %(inst)s." -#: rapid/problemnotification.py:311 +#: rapid/problemnotification.py:312 msgid "" "Errors occurred when creating directories on the following backup devices: " msgstr "Der opstod fejl ved oprettelse af mapper på disse enheder: " -#: rapid/problemnotification.py:322 +#: rapid/problemnotification.py:323 #, python-format msgid "%(previousproblem)s Additionally, %(newproblem)s" msgstr "%(previousproblem)s Og %(newproblem)s" -#: rapid/problemnotification.py:330 +#: rapid/problemnotification.py:331 #, python-format msgid " Furthermore, there were %(problems)s." msgstr " Desuden opstod der %(problems)s." -#: rapid/problemnotification.py:332 +#: rapid/problemnotification.py:333 #, python-format msgid " Furthermore, there was a %(problem)s." msgstr " Desuden opstod der %(problem)s." -#: rapid/problemnotification.py:341 +#: rapid/problemnotification.py:342 #, python-format msgid "The %(type)s metadata is missing." msgstr "Der mangler %(type)s metadata." -#: rapid/problemnotification.py:343 +#: rapid/problemnotification.py:344 msgid "The following metadata is missing: " msgstr "Følgende metadata mangler: " -#: rapid/problemnotification.py:346 +#: rapid/problemnotification.py:347 #, python-format msgid "%(missing_metadata_elements)s and %(final_missing_metadata_element)s." msgstr "%(missing_metadata_elements)s og %(final_missing_metadata_element)s." -#: rapid/problemnotification.py:363 +#: rapid/problemnotification.py:364 msgid "Problems in subfolder and filename generation" msgstr "Problemer ved generering af undermapper og filnavne" -#: rapid/problemnotification.py:365 +#: rapid/problemnotification.py:366 msgid "Problem in subfolder and filename generation" msgstr "Problem ved generering af undermapper og filnavne" -#: rapid/problemnotification.py:368 +#: rapid/problemnotification.py:369 #, python-format msgid "Problems in %s generation" msgstr "Problemer ved generering af %s" -#: rapid/problemnotification.py:370 +#: rapid/problemnotification.py:371 #, python-format msgid "Problem in %s generation" msgstr "Problem ved generering af %s" -#: rapid/problemnotification.py:379 +#: rapid/problemnotification.py:380 #, python-format msgid "%(filetype)s already exists, but it was backed up" msgstr "%(filetype)s findes allerede, men er sikkerhedskopieret" -#: rapid/problemnotification.py:381 +#: rapid/problemnotification.py:382 #, python-format msgid "An error occurred when copying the %(filetype)s, but it was backed up" msgstr "" "Der opstod en fejl ved kopiering af %(filetype)s, men det blev " "sikkerhedskopieret" -#: rapid/problemnotification.py:401 +#: rapid/problemnotification.py:402 msgid "Multiple problems were encountered" msgstr "Der opstod adskillige problemer" -#: rapid/problemnotification.py:403 rapid/subfolderfile.py:230 +#: rapid/problemnotification.py:404 rapid/subfolderfile.py:233 msgid "Photos detected with the same filenames, but taken at different times" msgstr "" "Der findes fotos med ens filnavne men forskellige klokkeslæt: %(details)s" -#: rapid/problemnotification.py:409 +#: rapid/problemnotification.py:410 msgid "there were errors backing up" msgstr "der opstod fejl ved sikkerhedskopiering" -#: rapid/problemnotification.py:410 +#: rapid/problemnotification.py:411 msgid "There were errors backing up" msgstr "Der opstod fejl ved sikkerhedskopiering" -#: rapid/problemnotification.py:412 +#: rapid/problemnotification.py:413 msgid "there was an error backing up" msgstr "der opstod en fejl ved sikkerhedskopiering" -#: rapid/problemnotification.py:413 +#: rapid/problemnotification.py:414 msgid "There was an error backing up" msgstr "Der opstod en fejl ved sikkerhedskopiering" #. e.g. -#: rapid/problemnotification.py:416 +#: rapid/problemnotification.py:417 #, python-format msgid "%(previousproblem)s, and %(backinguperror)s" msgstr "%(previousproblem)s, og %(backinguperror)s" -#: rapid/rpdfile.py:139 +#: rapid/rpdfile.py:153 #, python-format msgid "%(number)s %(filetypes)s" msgstr "%(number)s %(filetypes)s" -#: rapid/subfolderfile.py:79 +#: rapid/rpdfile.py:163 +#, python-format +msgid "scanning (found %(photos)s photos and %(videos)s videos)..." +msgstr "gennemsøger (%(photos)s fotos og %(videos)s videoer fundet)..." + +#: rapid/subfolderfile.py:80 #, python-format msgid "%(hour)s:%(minute)s:%(second)s:%(subsecond)s" msgstr "%(hour)s:%(minute)s:%(second)s:%(subsecond)s" -#: rapid/subfolderfile.py:300 +#: rapid/subfolderfile.py:301 msgid "Photo has already been downloaded" msgstr "Fotoet er allerede blevet downloadet" -#: rapid/subfolderfile.py:301 +#: rapid/subfolderfile.py:302 #, python-format msgid "Source: %(source)s" msgstr "Kilde: %(source)s" -#: rapid/subfolderfile.py:359 +#: rapid/subfolderfile.py:354 msgid "subfolder and filename" msgstr "undermappe og filnavn" -#: rapid/subfolderfile.py:397 +#: rapid/subfolderfile.py:393 msgid "Failed to create download subfolder" msgstr "Kunne ikke oprette undermappe" -#: rapid/subfolderfile.py:398 +#: rapid/subfolderfile.py:394 #, python-format msgid "Path: %s" msgstr "Sti: %s" -#: rapid/glade3/rapid.ui.h:1 -msgid "About..." -msgstr "Om..." - #: rapid/glade3/rapid.ui.h:2 -msgid "Check All" -msgstr "Markér alle" +msgid "_File" +msgstr "_Fil" #: rapid/glade3/rapid.ui.h:3 -msgid "Check All Photos" -msgstr "Markér alle fotos" +msgid "Download / Pause" +msgstr "Download / Pause" #: rapid/glade3/rapid.ui.h:4 -msgid "Check All Videos" -msgstr "Markér alle videoer" +msgid "_Select" +msgstr "_Markér" + +#: rapid/glade3/rapid.ui.h:5 +msgid "Select All Without _Job Code" +msgstr "Markér alle _uden jobkode" #: rapid/glade3/rapid.ui.h:6 -msgid "Download / Pause" -msgstr "Download / Pause" +msgid "Select All Wit_h Job Code" +msgstr "Markér alle med _jobkode" #: rapid/glade3/rapid.ui.h:7 -msgid "Get Help Online..." -msgstr "Få hjælp online..." +msgid "_View" +msgstr "_Vis" #: rapid/glade3/rapid.ui.h:8 -msgid "Help" -msgstr "Hjælp" +msgid "_Error Log" +msgstr "_Fejl-log" #: rapid/glade3/rapid.ui.h:9 -msgid "Make a Donation..." -msgstr "Giv et bidrag..." +msgid "_Clear Completed Downloads" +msgstr "_Ryd afsluttede downloads" #: rapid/glade3/rapid.ui.h:10 -msgid "Next File" -msgstr "Næste fil" - -#: rapid/glade3/rapid.ui.h:11 -msgid "Preferences" -msgstr "Indstillinger" - -#: rapid/glade3/rapid.ui.h:12 msgid "Previous File" msgstr "Forrige fil" -#: rapid/glade3/rapid.ui.h:13 -msgid "Quit" -msgstr "Afslut" - -#: rapid/glade3/rapid.ui.h:15 -msgid "Refresh" -msgstr "Opdatér" - -#: rapid/glade3/rapid.ui.h:16 -msgid "Report a Problem..." -msgstr "Rapportér et problem..." - -#: rapid/glade3/rapid.ui.h:17 -msgid "Select All Wit_h Job Code" -msgstr "Markér alle med _jobkode" - -#: rapid/glade3/rapid.ui.h:18 -msgid "Select All Without _Job Code" -msgstr "Markér alle _uden jobkode" - -#: rapid/glade3/rapid.ui.h:19 -msgid "Translate this Application..." -msgstr "Oversæt dette program..." - -#: rapid/glade3/rapid.ui.h:20 -msgid "Uncheck All" -msgstr "Afmarkér alle" - -#: rapid/glade3/rapid.ui.h:21 -msgid "_Check All" -msgstr "_Markér alle" - -#: rapid/glade3/rapid.ui.h:22 -msgid "_Clear Completed Downloads" -msgstr "_Ryd afsluttede downloads" - -#: rapid/glade3/rapid.ui.h:23 -msgid "_Download" -msgstr "_Download" - -#: rapid/glade3/rapid.ui.h:24 -msgid "_Error Log" -msgstr "_Fejl-log" - -#: rapid/glade3/rapid.ui.h:25 -msgid "_File" -msgstr "_Fil" +#: rapid/glade3/rapid.ui.h:11 +msgid "Next File" +msgstr "Næste fil" -#: rapid/glade3/rapid.ui.h:26 +#: rapid/glade3/rapid.ui.h:12 msgid "_Help" msgstr "_Hjælp" -#: rapid/glade3/rapid.ui.h:27 -msgid "_Include in download" -msgstr "_Indkludér i download" - -#: rapid/glade3/rapid.ui.h:28 +#: rapid/glade3/rapid.ui.h:13 msgid "_Make a Donation..." msgstr "_Giv et bidrag..." -#: rapid/glade3/rapid.ui.h:29 -msgid "_Select" -msgstr "_Markér" - -#: rapid/glade3/rapid.ui.h:30 +#: rapid/glade3/rapid.ui.h:14 msgid "_Translate this Application..." msgstr "_Oversæt denne applikation..." -#: rapid/glade3/rapid.ui.h:31 +#: rapid/glade3/rapid.ui.h:15 +msgid "_Check All" +msgstr "_Markér alle" + +#: rapid/glade3/rapid.ui.h:16 msgid "_Uncheck All" msgstr "_Afmarkér alle" -#: rapid/glade3/rapid.ui.h:32 -msgid "_View" -msgstr "_Vis" +#: rapid/glade3/rapid.ui.h:17 +msgid "_Include in download" +msgstr "_Indkludér i download" + +#: rapid/glade3/rapid.ui.h:18 +msgid "_Download" +msgstr "_Download" #: rapid/glade3/prefs.ui.h:1 -msgid " " -msgstr " " +msgid "Preferences: Rapid Photo Downloader" +msgstr "Indstillinger: Rapid Photo Downloader" #: rapid/glade3/prefs.ui.h:2 -msgid " hh:mm" -msgstr " hh:mm" +msgid "<span weight=\"bold\" size=\"x-large\">Photo Download Folders</span>" +msgstr "<span weight=\"bold\" size=\"x-large\">Foto download mapper</span>" #: rapid/glade3/prefs.ui.h:3 -msgid ":" -msgstr ":" +msgid "<i>Example: /home/user/Pictures</i>" +msgstr "<i>Eksempel: /home/user/Billeder</i>" #: rapid/glade3/prefs.ui.h:4 -msgid "<b>Backup</b>" -msgstr "<b>Sikkerhedskopi</b>" +msgid "<b>Download Subfolders</b>" +msgstr "<b>Download undermappe</b>" #: rapid/glade3/prefs.ui.h:5 -msgid "<b>Compatibility with Other Operating Systems</b>" -msgstr "<b>Kompatibilitet med andre styresystemer</b>" +msgid "Download folder:" +msgstr "Download mappe:" #: rapid/glade3/prefs.ui.h:6 -msgid "<b>Download Folder</b>" -msgstr "<b>Download mappe</b>" +msgid "" +"Choose the download folder. Subfolders for the downloaded photos will be " +"automatically created in this folder using the structure specified below." +msgstr "" +"Vælg download mappen. Undermapper for de downloadede fotos vil automatisk " +"blive oprettet her ved hjælp af den nedenfor angivne struktur." #: rapid/glade3/prefs.ui.h:7 -msgid "<b>Download Subfolders</b>" -msgstr "<b>Download undermappe</b>" +msgid "<b>Download Folder</b>" +msgstr "<b>Download mappe</b>" #: rapid/glade3/prefs.ui.h:8 -msgid "<b>Example</b>" -msgstr "<b>Eksempel</b>" +msgid "Photo Folders" +msgstr "Foto mapper" #: rapid/glade3/prefs.ui.h:9 -msgid "<b>Job Codes</b>" -msgstr "<b>Jobkoder</b>" +msgid "<span weight=\"bold\" size=\"x-large\">Photo Rename</span>\t" +msgstr "<span weight=\"bold\" size=\"x-large\">Foto omdøbning</span>\t" #: rapid/glade3/prefs.ui.h:10 msgid "<b>Photo Rename</b>" msgstr "<b>Photo omdøbning</b>" #: rapid/glade3/prefs.ui.h:11 -msgid "<b>Photo and Video Name Conflicts</b>" -msgstr "<b>Foto og video navnekonflikter</b>" +msgid " " +msgstr " " #: rapid/glade3/prefs.ui.h:12 -msgid "<b>Program Automation</b>" -msgstr "<b>Programautomatisering</b>" +msgid "<i>New:</i>" +msgstr "<i>Ny:</i>" #: rapid/glade3/prefs.ui.h:13 -msgid "<b>Sequence Numbers</b>" -msgstr "<b>Sekvensnumre</b>" +msgid "<i>Original:</i>" +msgstr "<i>Original:</i>" #: rapid/glade3/prefs.ui.h:14 -msgid "<i>/media/externaldrive/Photos</i>" -msgstr "<i>/medie/externtdrev/Fotos</i>" +msgid "<b>Example</b>" +msgstr "<b>Eksempel</b>" #: rapid/glade3/prefs.ui.h:15 -msgid "<i>Example: /home/user/Pictures</i>" -msgstr "<i>Eksempel: /home/user/Billeder</i>" +msgid "Photo Rename" +msgstr "Foto omdøbning" #: rapid/glade3/prefs.ui.h:16 -msgid "<i>Example:</i>" -msgstr "<i>Eksempel:</i>" +msgid "<span weight=\"bold\" size=\"x-large\">Video Download Folders</span>" +msgstr "<span weight=\"bold\" size=\"x-large\">Video download mapper</span>" #: rapid/glade3/prefs.ui.h:17 -msgid "<i>New:</i>" -msgstr "<i>Ny:</i>" +msgid "" +"Sorry, video downloading functionality disabled. To download videos, please " +"install either the <i>hachoir metadata</i> and <i>kaa metadata</i> packages " +"for python, or <i>exiftool</i>." +msgstr "" +"Funktionen til hentning af videoer er slået fra. For at hente videoer skal " +"du installere enten <i>hachoir metadata</i> og <i>kaa metadata</i> pakkerne " +"eller <i>exiftool</i>." #: rapid/glade3/prefs.ui.h:18 -msgid "<i>Original:</i>" -msgstr "<i>Original:</i>" +msgid "" +"Choose the download folder. Subfolders for the downloaded videos will be " +"automatically created in this folder using the structure specified below." +msgstr "" +"Vælg download mappen. Undermapper for de downloadede videoer vil automatisk " +"blive oprettet her ved hjælp af den nedenfor angivne struktur." #: rapid/glade3/prefs.ui.h:19 -msgid "<span weight=\"bold\" size=\"x-large\">Backup</span>\t" -msgstr "<span weight=\"bold\" size=\"x-large\">Sikkerhedskopi</span>\t" +msgid "Video Folders" +msgstr "Video mapper" #: rapid/glade3/prefs.ui.h:20 -msgid "<span weight=\"bold\" size=\"x-large\">Device Options</span>" -msgstr "<span weight=\"bold\" size=\"x-large\">Enhedsindstillinger</span>" +msgid "<span weight=\"bold\" size=\"x-large\">Video Rename</span>\t" +msgstr "<span weight=\"bold\" size=\"x-large\">Video omdøbning</span>\t" #: rapid/glade3/prefs.ui.h:21 -msgid "<span weight=\"bold\" size=\"x-large\">Devices</span>" -msgstr "<span weight=\"bold\" size=\"x-large\">Enheder</span>" +msgid "Video Rename" +msgstr "Video omdøbning" #: rapid/glade3/prefs.ui.h:22 -msgid "<span weight=\"bold\" size=\"x-large\">Error Handling</span>" -msgstr "<span weight=\"bold\" size=\"x-large\">Fejlhåndtering</span>" +msgid "<span weight=\"bold\" size=\"x-large\">Rename Options</span>" +msgstr "" +"<span weight=\"bold\" size=\"x-large\">Omdøbningsindstillinger</span>" #: rapid/glade3/prefs.ui.h:23 -msgid "<span weight=\"bold\" size=\"x-large\">Job Codes</span>" -msgstr "<span weight=\"bold\" size=\"x-large\">Jobkoder</span>" +msgid "<b>Sequence Numbers</b>" +msgstr "<b>Sekvensnumre</b>" #: rapid/glade3/prefs.ui.h:24 -msgid "<span weight=\"bold\" size=\"x-large\">Miscellaneous</span>" -msgstr "<span weight=\"bold\" size=\"x-large\">Diverse</span>" +msgid "" +"Specify the time in 24 hour format at which the <i>Downloads today</i> " +"sequence number should be reset." +msgstr "" +"Angiv på hvilket klokkeslæt <i>Downloads today</i> sekvensnummeret skal " +"nulstilles. Brug 24-timers format." #: rapid/glade3/prefs.ui.h:25 -msgid "<span weight=\"bold\" size=\"x-large\">Photo Download Folders</span>" -msgstr "<span weight=\"bold\" size=\"x-large\">Foto download mapper</span>" +msgid "Day start:" +msgstr "Dagen begynder:" #: rapid/glade3/prefs.ui.h:26 -msgid "<span weight=\"bold\" size=\"x-large\">Photo Rename</span>\t" -msgstr "<span weight=\"bold\" size=\"x-large\">Foto omdøbning</span>\t" +msgid "Downloads today:" +msgstr "Downloads i dag:" #: rapid/glade3/prefs.ui.h:27 -msgid "<span weight=\"bold\" size=\"x-large\">Rename Options</span>" -msgstr "" -"<span weight=\"bold\" size=\"x-large\">Omdøbningsindstillinger</span>" +msgid "Stored number:" +msgstr "Husket nummer:" #: rapid/glade3/prefs.ui.h:28 -msgid "<span weight=\"bold\" size=\"x-large\">Video Download Folders</span>" -msgstr "<span weight=\"bold\" size=\"x-large\">Video download mapper</span>" +msgid ":" +msgstr ":" #: rapid/glade3/prefs.ui.h:29 -msgid "<span weight=\"bold\" size=\"x-large\">Video Rename</span>\t" -msgstr "<span weight=\"bold\" size=\"x-large\">Video omdøbning</span>\t" +msgid " hh:mm" +msgstr " hh:mm" #: rapid/glade3/prefs.ui.h:30 -msgid "Add unique identifier" -msgstr "Tilføj entydig angivelse" +msgid "Synchronize RAW + JPEG sequence numbers" +msgstr "Synchronisér RAW + JPEG sekvensnumre" #: rapid/glade3/prefs.ui.h:31 -msgid "Automatically detect Portable Storage Devices" -msgstr "Opdag bærbare enheder automatisk" +msgid "<b>Compatibility with Other Operating Systems</b>" +msgstr "<b>Kompatibilitet med andre styresystemer</b>" #: rapid/glade3/prefs.ui.h:32 -msgid "Automatically detect backup devices" -msgstr "Opdag backup-enheder automatisk" +msgid "" +"Specify whether photo, video and folder names should have any characters " +"removed that are not allowed by other operating systems." +msgstr "" +"Angiv, om tegn skal fjernes fra foto-, video- og mappenavne, hvis de ikke er " +"tilladt på andre styresystemer." #: rapid/glade3/prefs.ui.h:33 -msgid "Automatically detect devices" -msgstr "Opdag enheder automatisk" +msgid "Strip incompatible characters" +msgstr "Fjern inkompatible tegn" #: rapid/glade3/prefs.ui.h:34 -msgid "Automatically rotate JPEG images" -msgstr "Rotér JPEG billeder automatisk" +msgid "Rename Options" +msgstr "Indstillinger for omdøbning" #: rapid/glade3/prefs.ui.h:35 -msgid "Backup" -msgstr "Sikkerhedskopi" +msgid "<span weight=\"bold\" size=\"x-large\">Job Codes</span>" +msgstr "<span weight=\"bold\" size=\"x-large\">Jobkoder</span>" #: rapid/glade3/prefs.ui.h:36 -msgid "Backup photos and videos when downloading" -msgstr "Tag sikkerhedskopi af fotos og videoer mens de downloades" +msgid "<b>Job Codes</b>" +msgstr "<b>Jobkoder</b>" #: rapid/glade3/prefs.ui.h:37 -msgid "" -"Choose the download folder. Subfolders for the downloaded photos will be " -"automatically created in this folder using the structure specified below." -msgstr "" -"Vælg download mappen. Undermapper for de downloadede fotos vil automatisk " -"blive oprettet her ved hjælp af den nedenfor angivne struktur." - -#: rapid/glade3/prefs.ui.h:38 -msgid "" -"Choose the download folder. Subfolders for the downloaded videos will be " -"automatically created in this folder using the structure specified below." -msgstr "" -"Vælg download mappen. Undermapper for de downloadede videoer vil automatisk " -"blive oprettet her ved hjælp af den nedenfor angivne struktur." +msgid "_Add..." +msgstr "_Tilføj..." #: rapid/glade3/prefs.ui.h:39 -msgid "Day start:" -msgstr "Dagen begynder:" +msgid "R_emove All" +msgstr "_Fjern alle" #: rapid/glade3/prefs.ui.h:40 -msgid "Device Options" -msgstr "Enhedsindstillinger" +msgid "Job Codes" +msgstr "Jobkoder" #: rapid/glade3/prefs.ui.h:41 +msgid "<span weight=\"bold\" size=\"x-large\">Devices</span>" +msgstr "<span weight=\"bold\" size=\"x-large\">Enheder</span>" + +#: rapid/glade3/prefs.ui.h:42 msgid "Devices" msgstr "Enheder" -#: rapid/glade3/prefs.ui.h:42 +#: rapid/glade3/prefs.ui.h:43 msgid "" "Devices are from where to download photos and videos, such as cameras, " "memory cards or Portable Storage Devices.\n" @@ -1707,37 +1708,31 @@ msgstr "" "indstille kameraet til PTP. Hvis det ikke er muligt, skal du benytte en " "kortlæser.</i>" -#: rapid/glade3/prefs.ui.h:47 -msgid "Download folder:" -msgstr "Download mappe:" - #: rapid/glade3/prefs.ui.h:48 -msgid "Downloads today:" -msgstr "Downloads i dag:" +msgid "Automatically detect Portable Storage Devices" +msgstr "Opdag bærbare enheder automatisk" #: rapid/glade3/prefs.ui.h:49 -msgid "Error Handling" -msgstr "Fejlhåndtering" +msgid "Automatically detect devices" +msgstr "Opdag enheder automatisk" #: rapid/glade3/prefs.ui.h:50 -msgid "Exit program even if download had warnings or errors" +msgid "" +"If you enable automatic detection of Portable Storage Devices, the entire " +"device will be scanned. On large devices, this could take some time.\n" +"\n" +"When this option is enabled, and a potential device is detected, you will be " +"prompted to determine if it should be scanned or not." msgstr "" -"Afslut programmet selvom der opstod fejl eller advarsler ved download" - -#: rapid/glade3/prefs.ui.h:51 -msgid "Exit program when download completes" -msgstr "Afslut programmet når download er afsluttet" - -#: rapid/glade3/prefs.ui.h:52 -msgid "Generate thumbnails (slower)" -msgstr "Dan små billeder" +"Hvis du slår automatisk opdagelse fra, bliver hele enheden gennemsøgt. På " +"store enheder kan det tage lang tid.\n" +"\n" +"Når en enhed bliver opdaget mens denne mulighed er valgt, bliver du spurgt " +"om enheden skal gennemsøges eller ej." #: rapid/glade3/prefs.ui.h:53 -msgid "" -"If you disable automatic detection, choose the exact backup locations." -msgstr "" -"Vælg nøjagtig placering af sikkerhedskopier, hvis du slår automatisk " -"opdagelse fra." +msgid "Location:" +msgstr "Sted:" #: rapid/glade3/prefs.ui.h:54 msgid "" @@ -1748,190 +1743,182 @@ msgstr "" "opdagelse fra." #: rapid/glade3/prefs.ui.h:55 +msgid "<span weight=\"bold\" size=\"x-large\">Device Options</span>" +msgstr "<span weight=\"bold\" size=\"x-large\">Enhedsindstillinger</span>" + +#: rapid/glade3/prefs.ui.h:56 +msgid "Remembered Paths" +msgstr "Huskede stier" + +#: rapid/glade3/prefs.ui.h:57 msgid "" -"If you enable automatic detection of Portable Storage Devices, the entire " -"device will be scanned. On large devices, this could take some time.\n" -"\n" -"When this option is enabled, and a potential device is detected, you will be " -"prompted to determine if it should be scanned or not." +"Remembered paths are those associated with devices that you have chosen to " +"always scan or ignore when automatic detection of Portable Storage Devices " +"is enabled." msgstr "" -"Hvis du slår automatisk opdagelse fra, bliver hele enheden gennemsøgt. På " -"store enheder kan det tage lang tid.\n" -"\n" -"Når en enhed bliver opdaget mens denne mulighed er valgt, bliver du spurgt " -"om enheden skal gennemsøges eller ej." +"Huskede stier er stier til bestemte enheder, som enten altid eller aldrig " +"gennemsøges, når automatisk genkendelse af bærbare enheder er slået til." #: rapid/glade3/prefs.ui.h:58 msgid "Ignored Paths" msgstr "Ignorerede stier" #: rapid/glade3/prefs.ui.h:59 -msgid "Job Codes" -msgstr "Jobkoder" - -#: rapid/glade3/prefs.ui.h:60 -msgid "Location:" -msgstr "Sted:" +msgid "" +"Specify the ending portion of any paths you want ignored when scanning " +"devices for photos or videos. Any path ending with the values below will not " +"be scanned." +msgstr "" +"Angiv den sidste del af stier, der skal ignoreres ved gennemsøgning af " +"enheder. Stier, der ender med disse værdier, vil ikke bliev gennemsøgt." #: rapid/glade3/prefs.ui.h:61 -msgid "Miscellaneous" -msgstr "Diverse" +msgid "Re_move All" +msgstr "_Fjern alle" #: rapid/glade3/prefs.ui.h:62 -msgid "Overwrite" -msgstr "Overskriv" +msgid "Use _python-style regular expressions" +msgstr "brug regulære udtryk i _python-style" #: rapid/glade3/prefs.ui.h:63 -msgid "Performance" -msgstr "Ydeevne" +msgid "Device Options" +msgstr "Enhedsindstillinger" #: rapid/glade3/prefs.ui.h:64 -msgid "Photo Folders" -msgstr "Foto mapper" +msgid "<span weight=\"bold\" size=\"x-large\">Backup</span>\t" +msgstr "<span weight=\"bold\" size=\"x-large\">Sikkerhedskopi</span>\t" #: rapid/glade3/prefs.ui.h:65 -msgid "Photo Rename" -msgstr "Foto omdøbning" +msgid "<b>Backup</b>" +msgstr "<b>Sikkerhedskopi</b>" #: rapid/glade3/prefs.ui.h:66 -msgid "Photo backup folder name:" -msgstr "Navn til mappe til foto sikkerhedskopier:" +msgid "" +"If you disable automatic detection, choose the exact backup locations." +msgstr "" +"Vælg nøjagtig placering af sikkerhedskopier, hvis du slår automatisk " +"opdagelse fra." #: rapid/glade3/prefs.ui.h:67 -msgid "Photo backup location:" -msgstr "Placering af foto sikkerhedskopier:" +msgid "Automatically detect backup devices" +msgstr "Opdag backup-enheder automatisk" #: rapid/glade3/prefs.ui.h:68 -msgid "Preferences: Rapid Photo Downloader" -msgstr "Indstillinger: Rapid Photo Downloader" +msgid "" +"You can have your photos and videos backed up to multiple locations as they " +"are downloaded, e.g. external hard drives." +msgstr "" +"Dine fotos og videoer kan sikkerhedskopieres til flere steder mens de " +"downloades, for eksempel en ekstern harddisk." -#: rapid/glade3/prefs.ui.h:70 -msgid "R_emove All" -msgstr "_Fjern alle" +#: rapid/glade3/prefs.ui.h:69 +msgid "Backup photos and videos when downloading" +msgstr "Tag sikkerhedskopi af fotos og videoer mens de downloades" -#: rapid/glade3/prefs.ui.h:72 -msgid "Re_move All" -msgstr "_Fjern alle" +#: rapid/glade3/prefs.ui.h:70 +msgid "" +"Specify the folder in which backups are stored on the device. \n" +"\n" +"<i>Note: this will also be used to determine whether or not the device is " +"used for backups. For each device you wish to use for backing up to, create " +"a folder in it with one of these names.</i>" +msgstr "" +"Angiv den mappe hvor sikkerhedskopier er gemt på enheden. \n" +"\n" +"<i>Bemærk: Dette afgør også, hvorvidt enheden bruges til sikkerhedskopier. " +"Opret en mappe med en af disse navne på hver enhed, du ønsker at bruge til " +"sikkerhedskopiering.</i>" #: rapid/glade3/prefs.ui.h:73 -msgid "Remembered Paths" -msgstr "Huskede stier" +msgid "Photo backup location:" +msgstr "Placering af foto sikkerhedskopier:" #: rapid/glade3/prefs.ui.h:74 -msgid "" -"Remembered paths are those associated with devices that you have chosen to " -"always scan or ignore when automatic detection of Portable Storage Devices " -"is enabled." -msgstr "" -"Huskede stier er stier til bestemte enheder, som enten altid eller aldrig " -"gennemsøges, når automatisk genkendelse af bærbare enheder er slået til." +msgid "Photo backup folder name:" +msgstr "Navn til mappe til foto sikkerhedskopier:" #: rapid/glade3/prefs.ui.h:75 -msgid "Rename Options" -msgstr "Indstillinger for omdøbning" +msgid "<i>Example:</i>" +msgstr "<i>Eksempel:</i>" #: rapid/glade3/prefs.ui.h:76 -msgid "Skip" -msgstr "Spring over" +msgid "<i>/media/externaldrive/Photos</i>" +msgstr "<i>/medie/externtdrev/Fotos</i>" #: rapid/glade3/prefs.ui.h:77 -msgid "Skip download" -msgstr "Spring download over" +msgid "Video backup folder name:" +msgstr "Mappenavn til video sikkerhedskopi:" #: rapid/glade3/prefs.ui.h:78 -msgid "" -"Sorry, video downloading functionality disabled. To download videos, please " -"install either the <i>hachoir metadata</i> and <i>kaa metadata</i> packages " -"for python, or <i>exiftool</i>." -msgstr "" -"Funktionen til hentning af videoer er slået fra. For at hente videoer skal " -"du installere enten <i>hachoir metadata</i> og <i>kaa metadata</i> pakkerne " -"eller <i>exiftool</i>." +msgid "Video backup location:" +msgstr "Placering af video sikkerhedskopi:" #: rapid/glade3/prefs.ui.h:79 -msgid "" -"Specify the ending portion of any paths you want ignored when scanning " -"devices for photos or videos. Any path ending with the values below will not " -"be scanned." -msgstr "" -"Angiv den sidste del af stier, der skal ignoreres ved gennemsøgning af " -"enheder. Stier, der ender med disse værdier, vil ikke bliev gennemsøgt." +msgid "Backup" +msgstr "Sikkerhedskopi" #: rapid/glade3/prefs.ui.h:80 -msgid "" -"Specify the folder in which backups are stored on the device. \n" -"\n" -"<i>Note: this will also be used to determine whether or not the device is " -"used for backups. For each device you wish to use for backing up to, create " -"a folder in it with one of these names.</i>" -msgstr "" -"Angiv den mappe hvor sikkerhedskopier er gemt på enheden. \n" -"\n" -"<i>Bemærk: Dette afgør også, hvorvidt enheden bruges til sikkerhedskopier. " -"Opret en mappe med en af disse navne på hver enhed, du ønsker at bruge til " -"sikkerhedskopiering.</i>" +msgid "<span weight=\"bold\" size=\"x-large\">Miscellaneous</span>" +msgstr "<span weight=\"bold\" size=\"x-large\">Diverse</span>" -#: rapid/glade3/prefs.ui.h:83 -msgid "" -"Specify the time in 24 hour format at which the <i>Downloads today</i> " -"sequence number should be reset." -msgstr "" -"Angiv på hvilket klokkeslæt <i>Downloads today</i> sekvensnummeret skal " -"nulstilles. Brug 24-timers format." +#: rapid/glade3/prefs.ui.h:81 +msgid "<b>Program Automation</b>" +msgstr "<b>Programautomatisering</b>" -#: rapid/glade3/prefs.ui.h:84 -msgid "" -"Specify whether photo, video and folder names should have any characters " -"removed that are not allowed by other operating systems." -msgstr "" -"Angiv, om tegn skal fjernes fra foto-, video- og mappenavne, hvis de ikke er " -"tilladt på andre styresystemer." +#: rapid/glade3/prefs.ui.h:82 +msgid "Unmount (\"eject\") device upon download completion" +msgstr "Unmount enhed (\"skub ud\") når download er afsluttet" -#: rapid/glade3/prefs.ui.h:85 +#: rapid/glade3/prefs.ui.h:83 msgid "Start downloading at program startup" msgstr "Start download når programmet starter" -#: rapid/glade3/prefs.ui.h:86 +#: rapid/glade3/prefs.ui.h:84 msgid "Start downloading upon device insertion" msgstr "Start download når enhed tilsluttes" +#: rapid/glade3/prefs.ui.h:85 +msgid "Exit program when download completes" +msgstr "Afslut programmet når download er afsluttet" + +#: rapid/glade3/prefs.ui.h:86 +msgid "Exit program even if download had warnings or errors" +msgstr "" +"Afslut programmet selvom der opstod fejl eller advarsler ved download" + #: rapid/glade3/prefs.ui.h:87 -msgid "Stored number:" -msgstr "Husket nummer:" +msgid "Automatically rotate JPEG images" +msgstr "Rotér JPEG billeder automatisk" #: rapid/glade3/prefs.ui.h:88 -msgid "Strip incompatible characters" -msgstr "Fjern inkompatible tegn" +msgid "Performance" +msgstr "Ydeevne" #: rapid/glade3/prefs.ui.h:89 -msgid "Synchronize RAW + JPEG sequence numbers" -msgstr "Synchronisér RAW + JPEG sekvensnumre" +msgid "Generate thumbnails (slower)" +msgstr "Dan små billeder" #: rapid/glade3/prefs.ui.h:90 -msgid "Unmount (\"eject\") device upon download completion" -msgstr "Unmount enhed (\"skub ud\") når download er afsluttet" +msgid "Miscellaneous" +msgstr "Diverse" #: rapid/glade3/prefs.ui.h:91 -msgid "Use _python-style regular expressions" -msgstr "brug regulære udtryk i _python-style" +msgid "<span weight=\"bold\" size=\"x-large\">Error Handling</span>" +msgstr "<span weight=\"bold\" size=\"x-large\">Fejlhåndtering</span>" #: rapid/glade3/prefs.ui.h:92 -msgid "Video Folders" -msgstr "Video mapper" +msgid "<b>Photo and Video Name Conflicts</b>" +msgstr "<b>Foto og video navnekonflikter</b>" #: rapid/glade3/prefs.ui.h:93 -msgid "Video Rename" -msgstr "Video omdøbning" +msgid "Add unique identifier" +msgstr "Tilføj entydig angivelse" #: rapid/glade3/prefs.ui.h:94 -msgid "Video backup folder name:" -msgstr "Mappenavn til video sikkerhedskopi:" +msgid "Skip download" +msgstr "Spring download over" #: rapid/glade3/prefs.ui.h:95 -msgid "Video backup location:" -msgstr "Placering af video sikkerhedskopi:" - -#: rapid/glade3/prefs.ui.h:96 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." @@ -1940,7 +1927,7 @@ msgstr "" "tilføjes en entydig kending, når et foto eller en video med samme navn " "allerede er downloadet." -#: rapid/glade3/prefs.ui.h:97 +#: rapid/glade3/prefs.ui.h:96 msgid "" "When backing up, choose whether to overwrite a file on the backup device " "that has the same name, or skip backing it up." @@ -1948,17 +1935,17 @@ msgstr "" "Vælg, om et foto eller en video skal springes over eller overskrives, når " "sikkerhedskopien allerede indeholder et foto eller en video med samme navn." +#: rapid/glade3/prefs.ui.h:97 +msgid "Overwrite" +msgstr "Overskriv" + #: rapid/glade3/prefs.ui.h:98 -msgid "" -"You can have your photos and videos backed up to multiple locations as they " -"are downloaded, e.g. external hard drives." -msgstr "" -"Dine fotos og videoer kan sikkerhedskopieres til flere steder mens de " -"downloades, for eksempel en ekstern harddisk." +msgid "Skip" +msgstr "Spring over" #: rapid/glade3/prefs.ui.h:99 -msgid "_Add..." -msgstr "_Tilføj..." +msgid "Error Handling" +msgstr "Fejlhåndtering" #: rapid/glade3/about.ui.h:1 msgid "Import your photos and videos efficiently and reliably" @@ -7,15 +7,15 @@ msgid "" msgstr "" "Project-Id-Version: rapid\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" -"POT-Creation-Date: 2012-06-17 03:05-0500\n" -"PO-Revision-Date: 2012-06-07 14:17+0000\n" -"Last-Translator: Uwe Dulz <uwe.dulz@gmail.com>\n" +"POT-Creation-Date: 2012-06-23 04:00-0500\n" +"PO-Revision-Date: 2013-01-03 18:47+0000\n" +"Last-Translator: Dennis Baudys <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: 2012-06-22 14:40+0000\n" -"X-Generator: Launchpad (build 15461)\n" +"X-Launchpad-Export-Date: 2013-01-22 23:36+0000\n" +"X-Generator: Launchpad (build 16430)\n" #. Translators: if neccessary, for guidance in how to translate this program, you may see http://damonlynch.net/translate.html #: rapid/rapid.py:112 rapid/rapid.py:1784 rapid/glade3/rapid.ui.h:1 @@ -55,7 +55,7 @@ msgstr "Grösse" #: rapid/rapid.py:178 msgid "Download Progress" -msgstr "Fortschritt beim Herunterladen" +msgstr "Fortschritt des Herunterladens" #: rapid/rapid.py:336 #, python-format @@ -66,7 +66,7 @@ msgstr "%(device)s konnte nicht entfernt werden" #. 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:1217 +#: rapid/rapid.py:1216 msgid "scanning..." msgstr "Laufwerk wird durchsucht …" @@ -144,7 +144,7 @@ msgstr "Etwa %(minutes)i:%(seconds)02i Minuten verbleibend" #: rapid/rapid.py:2731 rapid/rpdfile.py:123 msgid "photos and videos" -msgstr "BIlder und Filme" +msgstr "Bilder und Filme" #: rapid/rapid.py:2733 rapid/rpdfile.py:125 msgid "photos or videos" @@ -217,7 +217,7 @@ msgstr "%(number)s von %(total)s %(filetypes)s" #: rapid/rapid.py:3222 msgid "From" -msgstr "von" +msgstr "Von" #: rapid/rapid.py:3230 msgid "Auto Detect" @@ -238,9 +238,9 @@ msgstr "Verschieben" #: rapid/rapid.py:3310 msgid "To" -msgstr "An" +msgstr "Nach" -#: rapid/rapid.py:3317 rapid/rapid.py:3985 +#: rapid/rapid.py:3317 rapid/rapid.py:3986 msgid "Photos:" msgstr "Bilder:" @@ -248,7 +248,7 @@ msgstr "Bilder:" msgid "Select a folder to download photos to" msgstr "Wählen Sie ein Verzeichnis für den Download der Bilder" -#: rapid/rapid.py:3332 rapid/rapid.py:3985 +#: rapid/rapid.py:3332 rapid/rapid.py:3986 msgid "Videos:" msgstr "Filme:" @@ -376,7 +376,7 @@ 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:3948 +#: rapid/rapid.py:3949 #, python-format msgid "" "display program information on the command line as the program runs " @@ -385,50 +385,57 @@ msgstr "" "Zeige die Programminformationen an, wenn das Programm aus der Kommandozeile " "aufgerufen wurde (Voreinstellung: %default)" -#: rapid/rapid.py:3949 +#: rapid/rapid.py:3950 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:3950 +#: rapid/rapid.py:3951 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:3952 +#: rapid/rapid.py:3953 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:3954 +#: rapid/rapid.py:3955 msgid "" "automatically detect devices from which to download, overwriting existing " "program preferences" msgstr "" +"Laufwerke zum Herunterladen automatisch erkennen, bestehende " +"Programmeinstellungen übergehen" -#: rapid/rapid.py:3955 +#: rapid/rapid.py:3956 msgid "" "manually specify the PATH of the device from which to download, overwriting " "existing program preferences" msgstr "" +"PFAD zum Laufwerk für das Herunterladen manuell angeben, bestehende " +"Programmeinstellungen übergehen" -#: rapid/rapid.py:3956 +#: rapid/rapid.py:3957 msgid "reset all program settings and preferences and exit" msgstr "Alle Einstellungen auf Standardwerte zurücksetzten und beenden" -#: rapid/rapid.py:3969 +#: rapid/rapid.py:3970 msgid "" -"Error: specify device auto-detection or manually specifiy a device's path " +"Error: specify device auto-detection or manually specify a device's path " "from which to download, but do not do both." msgstr "" +"Fehler: Wählen Sie entweder »Laufwerke zum Herunterladen automatisch " +"erkennen« oder »PFAD zum Laufwerk für das Herunterladen manuell angeben«, " +"aber nicht beides gleichzeitig." -#: rapid/rapid.py:3990 +#: rapid/rapid.py:3991 #, python-format msgid "and %s" msgstr "und %s" -#: rapid/rapid.py:3998 +#: rapid/rapid.py:3999 msgid "All settings and preferences have been reset" msgstr "Alle Einstellungen wurden zurückgesetzt" @@ -1355,21 +1362,21 @@ msgstr "" #: rapid/problemnotification.py:364 msgid "Problems in subfolder and filename generation" -msgstr "Probleme bei der Erstllung der Order und Dateinamen" +msgstr "Probleme bei der Erstellung der Order und Dateinamen" #: rapid/problemnotification.py:366 msgid "Problem in subfolder and filename generation" -msgstr "Problem bei der Erstllung der Order und Dateinamen" +msgstr "Problem bei der Erstellung der Order und Dateinamen" #: rapid/problemnotification.py:369 #, python-format msgid "Problems in %s generation" -msgstr "Probleme bei der Erstllung von %s" +msgstr "Probleme bei der Erstellung von %s" #: rapid/problemnotification.py:371 #, python-format msgid "Problem in %s generation" -msgstr "Problem bei der Erstllung von %s" +msgstr "Problem bei der Erstellung von %s" #: rapid/problemnotification.py:380 #, python-format @@ -1422,7 +1429,7 @@ msgstr "%(number)s %(filetypes)s" #: rapid/rpdfile.py:163 #, python-format msgid "scanning (found %(photos)s photos and %(videos)s videos)..." -msgstr "" +msgstr "Suche läuft (%(photos)s Fotos und %(videos)s Videos gefunden) …" #: rapid/subfolderfile.py:80 #, python-format @@ -6,23 +6,24 @@ msgid "" msgstr "" "Project-Id-Version: rapid\n" -"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" -"POT-Creation-Date: 2012-05-13 22:31-0500\n" -"PO-Revision-Date: 2012-05-24 14:21+0000\n" -"Last-Translator: Jose Navajo Bardera <Unknown>\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-23 04:00-0500\n" +"PO-Revision-Date: 2013-01-12 00:14+0000\n" +"Last-Translator: Adolfo Jayme Barrientos <fitoschido@gmail.com>\n" "Language-Team: Spanish <es@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: 2012-05-29 18:44+0000\n" -"X-Generator: Launchpad (build 15316)\n" +"X-Launchpad-Export-Date: 2013-01-22 23:36+0000\n" +"X-Generator: Launchpad (build 16430)\n" +"Language: es\n" #. Translators: if neccessary, for guidance in how to translate this program, you may see http://damonlynch.net/translate.html -#: rapid/rapid.py:110 rapid/rapid.py:1749 rapid/glade3/rapid.ui.h:1 +#: rapid/rapid.py:112 rapid/rapid.py:1784 rapid/glade3/rapid.ui.h:1 msgid "Rapid Photo Downloader" -msgstr "Gestión Rápida de Fotografías" +msgstr "Descargador rápido de fotos" -#: rapid/rapid.py:115 +#: rapid/rapid.py:117 #, python-format msgid "" "%(date)s\n" @@ -31,57 +32,57 @@ msgstr "" "%(date)s\n" "%(time)s" -#: rapid/rapid.py:117 +#: rapid/rapid.py:119 #, python-format msgid "%(date)s %(time)s" msgstr "%(date)s %(time)s" -#: rapid/rapid.py:120 +#: rapid/rapid.py:122 #, 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:155 +#: rapid/rapid.py:157 msgid "Device" msgstr "Dispositivo" #. Size refers to the total size of images on the device, typically in #. MB or GB -#: rapid/rapid.py:173 +#: rapid/rapid.py:175 msgid "Size" msgstr "Tamaño" -#: rapid/rapid.py:176 +#: rapid/rapid.py:178 msgid "Download Progress" msgstr "Progreso de la descarga" -#: rapid/rapid.py:322 +#: rapid/rapid.py:336 #, python-format msgid "%(device)s did not unmount" -msgstr "%(device)s no se puede expulsar el dispositivo" +msgstr "%(device)s no se desmontó" #. 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:1189 +#: rapid/rapid.py:1216 msgid "scanning..." msgstr "analizando…" #. this location is a human readable explanation for /, and is inserted into Downloading from %(location)s -#: rapid/rapid.py:1747 +#: rapid/rapid.py:1782 msgid "the root of the file system" msgstr "la raíz del sistema de archivos" #. message in dialog box which asks the user if they really want to be downloading from this location -#: rapid/rapid.py:1751 +#: rapid/rapid.py:1786 #, python-format msgid "Downloading from %(location)s." msgstr "Descargando desde %(location)s." -#: rapid/rapid.py:1752 +#: rapid/rapid.py:1787 msgid "" "Do you really want to download from here? On some systems, scanning this " "location can take a very long time." @@ -89,15 +90,15 @@ msgstr "" "¿Quiere realmente descargar desde aquí? En algunos sistemas, analizar esta " "ubicación puede tardar mucho tiempo." -#: rapid/rapid.py:2174 +#: rapid/rapid.py:2209 msgid "Download" msgstr "Descargar" -#: rapid/rapid.py:2177 +#: rapid/rapid.py:2212 msgid "Pause" msgstr "Pausar" -#: rapid/rapid.py:2282 +#: rapid/rapid.py:2317 #, python-format msgid "" "These download folders are invalid:\n" @@ -108,7 +109,7 @@ msgstr "" "%(folder1)s\n" "%(folder2)s" -#: rapid/rapid.py:2285 +#: rapid/rapid.py:2320 #, python-format msgid "" "This download folder is invalid:\n" @@ -117,176 +118,176 @@ msgstr "" "Esta carpeta de descarga no es válida:\n" "%s" -#: rapid/rapid.py:2286 +#: rapid/rapid.py:2321 msgid "Download cannot proceed" msgstr "No se puede iniciar la descarga" -#: rapid/rapid.py:2653 +#: rapid/rapid.py:2700 msgid "About 1 second remaining" msgstr "Queda aproximadamente 1 segundo" -#: rapid/rapid.py:2655 +#: rapid/rapid.py:2702 #, python-format msgid "About %i seconds remaining" msgstr "Quedan aproximadamente %i segundos" -#: rapid/rapid.py:2657 +#: rapid/rapid.py:2704 msgid "About 1 minute remaining" msgstr "Queda aproximadamente 1 minuto" #. 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:2662 +#: rapid/rapid.py:2709 #, python-format msgid "About %(minutes)i:%(seconds)02i minutes remaining" msgstr "Quedan aproximadamente %(minutes)i:%(seconds)02i minutos" -#: rapid/rapid.py:2684 rapid/rpdfile.py:116 +#: rapid/rapid.py:2731 rapid/rpdfile.py:123 msgid "photos and videos" msgstr "fotos y vídeos" -#: rapid/rapid.py:2686 rapid/rpdfile.py:118 +#: rapid/rapid.py:2733 rapid/rpdfile.py:125 msgid "photos or videos" msgstr "fotos o vídeos" -#: rapid/rapid.py:2689 rapid/rapid.py:3502 rapid/rpdfile.py:121 +#: rapid/rapid.py:2736 rapid/rapid.py:3558 rapid/rpdfile.py:128 msgid "videos" msgstr "vídeos" -#: rapid/rapid.py:2691 rapid/preferencesdialog.py:1620 rapid/rpdfile.py:123 -#: rapid/rpdfile.py:272 +#: rapid/rapid.py:2738 rapid/preferencesdialog.py:1620 rapid/rpdfile.py:130 +#: rapid/rpdfile.py:291 msgid "video" msgstr "vídeo" -#: rapid/rapid.py:2694 rapid/rapid.py:3500 rapid/rpdfile.py:126 +#: rapid/rapid.py:2741 rapid/rapid.py:3556 rapid/rpdfile.py:133 msgid "photos" msgstr "fotos" #. check subfolder preferences for bad values -#: rapid/rapid.py:2696 rapid/preferencesdialog.py:1619 rapid/rpdfile.py:128 -#: rapid/rpdfile.py:253 +#: rapid/rapid.py:2743 rapid/preferencesdialog.py:1619 rapid/rpdfile.py:135 +#: rapid/rpdfile.py:272 msgid "photo" msgstr "foto" -#: rapid/rapid.py:2723 +#: rapid/rapid.py:2770 #, python-format msgid "%(noFiles)s %(filetypes)s downloaded" msgstr "%(noFiles)s %(filetypes)s descargados" -#: rapid/rapid.py:2727 +#: rapid/rapid.py:2774 #, python-format msgid "%(noFiles)s %(filetypes)s failed to download" msgstr "No se pudieron descargar %(noFiles)s %(filetypes)s" -#: rapid/rapid.py:2730 rapid/rapid.py:2782 +#: rapid/rapid.py:2777 rapid/rapid.py:2829 msgid "warnings" msgstr "avisos" -#: rapid/rapid.py:2739 +#: rapid/rapid.py:2786 msgid "All downloads complete" msgstr "Todas las descargas completadas" -#: rapid/rapid.py:2745 rapid/rapid.py:2754 rapid/rapid.py:2763 -#: rapid/rapid.py:2772 rapid/rapid.py:2780 +#: rapid/rapid.py:2792 rapid/rapid.py:2801 rapid/rapid.py:2810 +#: rapid/rapid.py:2819 rapid/rapid.py:2827 #, python-format msgid "%(number)s %(numberdownloaded)s" msgstr "%(number)s %(numberdownloaded)s" -#: rapid/rapid.py:2747 rapid/rapid.py:2765 +#: rapid/rapid.py:2794 rapid/rapid.py:2812 #, python-format msgid "%(filetype)s downloaded" msgstr "%(filetype)s descargados" -#: rapid/rapid.py:2756 rapid/rapid.py:2774 +#: rapid/rapid.py:2803 rapid/rapid.py:2821 #, python-format msgid "%(filetype)s failed to download" msgstr "No se pudieron descargar %(filetype)s" #. e.g.: 3 of 205 photos and videos (202 remaining) -#: rapid/rapid.py:2813 +#: rapid/rapid.py:2860 #, 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:2820 +#: rapid/rapid.py:2867 #, python-format msgid "%(number)s of %(total)s %(filetypes)s" msgstr "%(number)s de %(total)s %(filetypes)s" -#: rapid/rapid.py:3166 +#: rapid/rapid.py:3222 msgid "From" msgstr "Desde" -#: rapid/rapid.py:3174 +#: rapid/rapid.py:3230 msgid "Auto Detect" msgstr "Detectar automáticamente" -#: rapid/rapid.py:3178 rapid/preferencesdialog.py:1327 +#: rapid/rapid.py:3234 rapid/preferencesdialog.py:1327 #, python-format msgid "Select a folder containing %(file_types)s" msgstr "Elija un directorio que contenga %(file_types)s" -#: rapid/rapid.py:3219 +#: rapid/rapid.py:3275 msgid "Copy" msgstr "Copiar" -#: rapid/rapid.py:3232 +#: rapid/rapid.py:3288 msgid "Move" msgstr "Mover" -#: rapid/rapid.py:3254 +#: rapid/rapid.py:3310 msgid "To" msgstr "A" -#: rapid/rapid.py:3261 rapid/rapid.py:3897 +#: rapid/rapid.py:3317 rapid/rapid.py:3986 msgid "Photos:" msgstr "Fotos:" -#: rapid/rapid.py:3264 rapid/preferencesdialog.py:1164 +#: rapid/rapid.py:3320 rapid/preferencesdialog.py:1164 msgid "Select a folder to download photos to" msgstr "Elija una carpeta donde descargar las fotos" -#: rapid/rapid.py:3276 rapid/rapid.py:3897 +#: rapid/rapid.py:3332 rapid/rapid.py:3986 msgid "Videos:" msgstr "Vídeos:" -#: rapid/rapid.py:3278 rapid/preferencesdialog.py:1182 +#: rapid/rapid.py:3334 rapid/preferencesdialog.py:1182 msgid "Select a folder to download videos to" msgstr "Elija una carpeta donde descargar los vídeos" -#: rapid/rapid.py:3470 +#: rapid/rapid.py:3526 msgid "and" msgstr "y" -#: rapid/rapid.py:3475 +#: rapid/rapid.py:3531 msgid "Using backup devices" msgstr "Usando dispositivos de copia de seguridad" -#: rapid/rapid.py:3477 +#: rapid/rapid.py:3533 msgid "Using backup device" msgstr "Usando dispositivo de copia de seguridad" -#: rapid/rapid.py:3479 +#: rapid/rapid.py:3535 msgid "No backup devices detected" msgstr "No se detectaron dispositivos de copia de seguridad" -#: rapid/rapid.py:3506 +#: rapid/rapid.py:3562 msgid "Free space:" msgstr "Espacio libre:" #. (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:3518 +#: rapid/rapid.py:3574 #, 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:3522 +#: rapid/rapid.py:3578 #, python-format msgid "%(free)s %(file_type)s" msgstr "%(free)s %(file_type)s" @@ -294,87 +295,87 @@ 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:3527 +#: rapid/rapid.py:3583 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:3532 +#: rapid/rapid.py:3588 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:3538 +#: rapid/rapid.py:3594 #, python-format msgid "%(free)s free" msgstr "%(free)s disponible" #. user manually specified the same location for photos and video backups -#: rapid/rapid.py:3546 +#: rapid/rapid.py:3602 #, python-format msgid "Backing up photos and videos to %(path)s" msgstr "Respaldando fotos y vídeos en %(path)s" #. user manually specified backup location -#: rapid/rapid.py:3549 +#: rapid/rapid.py:3605 #, python-format msgid "Backing up to %(path)s" msgstr "Respaldando en %(path)s" #. user manually specified different locations for photo and video backups -#: rapid/rapid.py:3552 +#: rapid/rapid.py:3608 #, python-format msgid "Backing up photos to %(path)s and videos to %(path2)s" msgstr "Respaldando fotos en %(path)s y vídeos en %(path2)s" -#: rapid/rapid.py:3559 +#: rapid/rapid.py:3615 #, python-format msgid "%(freespace)s. %(backuppaths)s." msgstr "%(freespace)s. %(backuppaths)s." -#: rapid/rapid.py:3588 +#: rapid/rapid.py:3644 msgid "Program preferences are invalid" msgstr "Las preferencias del programa no son válidas" -#: rapid/rapid.py:3707 rapid/rpdfile.py:254 +#: rapid/rapid.py:3770 rapid/rpdfile.py:273 msgid "Photo" msgstr "Foto" -#: rapid/rapid.py:3709 rapid/rpdfile.py:273 +#: rapid/rapid.py:3772 rapid/rpdfile.py:292 msgid "Video" msgstr "Vídeo" -#: rapid/rapid.py:3718 +#: rapid/rapid.py:3781 #, python-format msgid "%(file_type)s download folder does not exist" msgstr "%(file_type)s directorio de descarga no existe" -#: rapid/rapid.py:3720 rapid/rapid.py:3734 rapid/rapid.py:3747 +#: rapid/rapid.py:3783 rapid/rapid.py:3797 rapid/rapid.py:3810 #, python-format msgid "Folder: %s" msgstr "Carpeta: %s" -#: rapid/rapid.py:3732 +#: rapid/rapid.py:3795 #, python-format msgid "%(file_type)s download folder is invalid" msgstr "%(file_type)s directorio de descarga es incorrecto" -#: rapid/rapid.py:3745 +#: rapid/rapid.py:3808 #, python-format msgid "%(file_type)s download folder is not writable" msgstr "%(file_type)s imposible escribir en directorio de descarga" -#: rapid/rapid.py:3831 +#: rapid/rapid.py:3894 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:3878 +#: rapid/rapid.py:3949 #, python-format msgid "" "display program information on the command line as the program runs " @@ -383,33 +384,57 @@ msgstr "" "mostrar información del programa en la línea de órdenes mientras se ejecuta " "el programa (predet.: %default)" -#: rapid/rapid.py:3879 +#: rapid/rapid.py:3950 msgid "display debugging information when run from the command line" msgstr "" "mostrar información de depuración cuando se ejecute desde la línea de órdenes" -#: rapid/rapid.py:3880 +#: rapid/rapid.py:3951 msgid "only output errors to the command line" msgstr "solo errores de salida en la línea de comando" #. image file extensions are recognized RAW files plus TIFF and JPG -#: rapid/rapid.py:3882 +#: rapid/rapid.py:3953 msgid "list photo and video file extensions the program recognizes and exit" msgstr "" "listar las extensiones de archivo para fotos y vídeos que el programa " "reconoce y salir" -#: rapid/rapid.py:3884 +#: rapid/rapid.py:3955 +msgid "" +"automatically detect devices from which to download, overwriting existing " +"program preferences" +msgstr "" +"detectar automáticamente los dispositivos de los cuales descargarr, " +"sobreescribiendo las preferencias existentes del programa" + +#: rapid/rapid.py:3956 +msgid "" +"manually specify the PATH of the device from which to download, overwriting " +"existing program preferences" +msgstr "" +"especificar manualmente de que dispositivos descargar, sobreescribiendo las " +"preferencias existentes del programa" + +#: rapid/rapid.py:3957 msgid "reset all program settings and preferences and exit" msgstr "" "Restablecer todas las configuraciones y preferencias del programa y salir" -#: rapid/rapid.py:3902 +#: rapid/rapid.py:3970 +msgid "" +"Error: specify device auto-detection or manually specify a device's path " +"from which to download, but do not do both." +msgstr "" +"Error: especificar autodeteccion del dispositivo o eleccion manual de " +"dispositivo desde donde descargar, pero no ambas." + +#: rapid/rapid.py:3991 #, python-format msgid "and %s" msgstr "y %s" -#: rapid/rapid.py:3910 +#: rapid/rapid.py:3999 msgid "All settings and preferences have been reset" msgstr "Todas las opciones y preferencias se han reestablecido" @@ -1386,11 +1411,16 @@ msgstr "Hubo un error al realizar la copia de seguridad" msgid "%(previousproblem)s, and %(backinguperror)s" msgstr "%(previousproblem)s, y %(backinguperror)s" -#: rapid/rpdfile.py:142 +#: rapid/rpdfile.py:153 #, python-format msgid "%(number)s %(filetypes)s" msgstr "%(number)s %(filetypes)s" +#: rapid/rpdfile.py:163 +#, python-format +msgid "scanning (found %(photos)s photos and %(videos)s videos)..." +msgstr "analizando (se encontraron %(photos)s fotos y %(videos)s vídeos)…" + #: rapid/subfolderfile.py:80 #, python-format msgid "%(hour)s:%(minute)s:%(second)s:%(subsecond)s" @@ -8,22 +8,22 @@ msgid "" msgstr "" "Project-Id-Version: rapid\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" -"POT-Creation-Date: 2012-05-13 22:31-0500\n" -"PO-Revision-Date: 2012-05-18 16:09+0000\n" -"Last-Translator: LEROY Jean-Christophe <Unknown>\n" +"POT-Creation-Date: 2012-06-23 04:00-0500\n" +"PO-Revision-Date: 2012-11-16 10:27+0000\n" +"Last-Translator: Olivier Devineau <Unknown>\n" "Language-Team: Français <null>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-05-29 18:44+0000\n" -"X-Generator: Launchpad (build 15316)\n" +"X-Launchpad-Export-Date: 2012-11-26 19:04+0000\n" +"X-Generator: Launchpad (build 16309)\n" #. Translators: if neccessary, for guidance in how to translate this program, you may see http://damonlynch.net/translate.html -#: rapid/rapid.py:110 rapid/rapid.py:1749 rapid/glade3/rapid.ui.h:1 +#: rapid/rapid.py:112 rapid/rapid.py:1784 rapid/glade3/rapid.ui.h:1 msgid "Rapid Photo Downloader" msgstr "Rapid Photo Downloader" -#: rapid/rapid.py:115 +#: rapid/rapid.py:117 #, python-format msgid "" "%(date)s\n" @@ -32,33 +32,33 @@ msgstr "" "%(date)s\n" "%(time)s" -#: rapid/rapid.py:117 +#: rapid/rapid.py:119 #, python-format msgid "%(date)s %(time)s" msgstr "%(date)s %(time)s" -#: rapid/rapid.py:120 +#: rapid/rapid.py:122 #, 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:155 +#: rapid/rapid.py:157 msgid "Device" msgstr "Périphérique" #. Size refers to the total size of images on the device, typically in #. MB or GB -#: rapid/rapid.py:173 +#: rapid/rapid.py:175 msgid "Size" msgstr "Taille" -#: rapid/rapid.py:176 +#: rapid/rapid.py:178 msgid "Download Progress" msgstr "Progression du transfert" -#: rapid/rapid.py:322 +#: rapid/rapid.py:336 #, python-format msgid "%(device)s did not unmount" msgstr "Le périphérique %(device)s n'a pas été démonté" @@ -67,22 +67,22 @@ msgstr "Le périphérique %(device)s n'a pas été démonté" #. 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:1189 +#: rapid/rapid.py:1216 msgid "scanning..." msgstr "Détection en cours..." #. this location is a human readable explanation for /, and is inserted into Downloading from %(location)s -#: rapid/rapid.py:1747 +#: rapid/rapid.py:1782 msgid "the root of the file system" msgstr "Partition racine" #. message in dialog box which asks the user if they really want to be downloading from this location -#: rapid/rapid.py:1751 +#: rapid/rapid.py:1786 #, python-format msgid "Downloading from %(location)s." msgstr "Transfert depuis %(location)s." -#: rapid/rapid.py:1752 +#: rapid/rapid.py:1787 msgid "" "Do you really want to download from here? On some systems, scanning this " "location can take a very long time." @@ -90,15 +90,15 @@ msgstr "" "Êtes-vous sûr de vouloir transférer depuis cet emplacement ? Sur certains " "systèmes, la recherche de photos ou de vidéos peut prendre du temps." -#: rapid/rapid.py:2174 +#: rapid/rapid.py:2209 msgid "Download" msgstr "Transférer" -#: rapid/rapid.py:2177 +#: rapid/rapid.py:2212 msgid "Pause" msgstr "Pause" -#: rapid/rapid.py:2282 +#: rapid/rapid.py:2317 #, python-format msgid "" "These download folders are invalid:\n" @@ -109,7 +109,7 @@ msgstr "" "%(folder1)s\n" "%(folder2)s" -#: rapid/rapid.py:2285 +#: rapid/rapid.py:2320 #, python-format msgid "" "This download folder is invalid:\n" @@ -118,176 +118,176 @@ msgstr "" "Ce répertoire de destination n'est pas valide:\n" "%s" -#: rapid/rapid.py:2286 +#: rapid/rapid.py:2321 msgid "Download cannot proceed" msgstr "Impossible de procéder au transfert" -#: rapid/rapid.py:2653 +#: rapid/rapid.py:2700 msgid "About 1 second remaining" msgstr "Environ 1 seconde restante" -#: rapid/rapid.py:2655 +#: rapid/rapid.py:2702 #, python-format msgid "About %i seconds remaining" msgstr "Environ %i secondes restantes" -#: rapid/rapid.py:2657 +#: rapid/rapid.py:2704 msgid "About 1 minute remaining" msgstr "Environ 1 minute restante" #. 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:2662 +#: rapid/rapid.py:2709 #, python-format msgid "About %(minutes)i:%(seconds)02i minutes remaining" msgstr "Environ %(minutes)i:%(seconds)02i restantes" -#: rapid/rapid.py:2684 rapid/rpdfile.py:116 +#: rapid/rapid.py:2731 rapid/rpdfile.py:123 msgid "photos and videos" msgstr "photos et vidéos" -#: rapid/rapid.py:2686 rapid/rpdfile.py:118 +#: rapid/rapid.py:2733 rapid/rpdfile.py:125 msgid "photos or videos" msgstr "photos ou vidéos" -#: rapid/rapid.py:2689 rapid/rapid.py:3502 rapid/rpdfile.py:121 +#: rapid/rapid.py:2736 rapid/rapid.py:3558 rapid/rpdfile.py:128 msgid "videos" msgstr "vidéos" -#: rapid/rapid.py:2691 rapid/preferencesdialog.py:1620 rapid/rpdfile.py:123 -#: rapid/rpdfile.py:272 +#: rapid/rapid.py:2738 rapid/preferencesdialog.py:1620 rapid/rpdfile.py:130 +#: rapid/rpdfile.py:291 msgid "video" msgstr "vidéo" -#: rapid/rapid.py:2694 rapid/rapid.py:3500 rapid/rpdfile.py:126 +#: rapid/rapid.py:2741 rapid/rapid.py:3556 rapid/rpdfile.py:133 msgid "photos" msgstr "photos" #. check subfolder preferences for bad values -#: rapid/rapid.py:2696 rapid/preferencesdialog.py:1619 rapid/rpdfile.py:128 -#: rapid/rpdfile.py:253 +#: rapid/rapid.py:2743 rapid/preferencesdialog.py:1619 rapid/rpdfile.py:135 +#: rapid/rpdfile.py:272 msgid "photo" msgstr "photo" -#: rapid/rapid.py:2723 +#: rapid/rapid.py:2770 #, python-format msgid "%(noFiles)s %(filetypes)s downloaded" msgstr "%(noFiles)s %(filetypes)s transférés" -#: rapid/rapid.py:2727 +#: rapid/rapid.py:2774 #, python-format msgid "%(noFiles)s %(filetypes)s failed to download" msgstr "erreur lors du transfert de %(noFiles)s %(filetypes)s" -#: rapid/rapid.py:2730 rapid/rapid.py:2782 +#: rapid/rapid.py:2777 rapid/rapid.py:2829 msgid "warnings" msgstr "avertissements" -#: rapid/rapid.py:2739 +#: rapid/rapid.py:2786 msgid "All downloads complete" msgstr "Tous les transferts sont terminés" -#: rapid/rapid.py:2745 rapid/rapid.py:2754 rapid/rapid.py:2763 -#: rapid/rapid.py:2772 rapid/rapid.py:2780 +#: rapid/rapid.py:2792 rapid/rapid.py:2801 rapid/rapid.py:2810 +#: rapid/rapid.py:2819 rapid/rapid.py:2827 #, python-format msgid "%(number)s %(numberdownloaded)s" msgstr "%(number)s %(numberdownloaded)s" -#: rapid/rapid.py:2747 rapid/rapid.py:2765 +#: rapid/rapid.py:2794 rapid/rapid.py:2812 #, python-format msgid "%(filetype)s downloaded" msgstr "%(filetype)s téléchargé" -#: rapid/rapid.py:2756 rapid/rapid.py:2774 +#: rapid/rapid.py:2803 rapid/rapid.py:2821 #, python-format msgid "%(filetype)s failed to download" msgstr "Echec de transfert pour %(filetype)s" #. e.g.: 3 of 205 photos and videos (202 remaining) -#: rapid/rapid.py:2813 +#: rapid/rapid.py:2860 #, python-format msgid "%(number)s of %(total)s %(filetypes)s (%(remaining)s remaining)" msgstr "%(number)s sur %(total)s %(filetypes)s (%(remaining)s restants)" #. e.g.: 205 of 205 photos and videos -#: rapid/rapid.py:2820 +#: rapid/rapid.py:2867 #, python-format msgid "%(number)s of %(total)s %(filetypes)s" msgstr "%(number)s sur %(total)s %(filetypes)s" -#: rapid/rapid.py:3166 +#: rapid/rapid.py:3222 msgid "From" msgstr "Depuis" -#: rapid/rapid.py:3174 +#: rapid/rapid.py:3230 msgid "Auto Detect" msgstr "Détecter automatiquement" -#: rapid/rapid.py:3178 rapid/preferencesdialog.py:1327 +#: rapid/rapid.py:3234 rapid/preferencesdialog.py:1327 #, python-format msgid "Select a folder containing %(file_types)s" msgstr "Sélectionnez un dossier contenant %(file_types)s" -#: rapid/rapid.py:3219 +#: rapid/rapid.py:3275 msgid "Copy" msgstr "Copier" -#: rapid/rapid.py:3232 +#: rapid/rapid.py:3288 msgid "Move" msgstr "Déplacer" -#: rapid/rapid.py:3254 +#: rapid/rapid.py:3310 msgid "To" msgstr "Vers" -#: rapid/rapid.py:3261 rapid/rapid.py:3897 +#: rapid/rapid.py:3317 rapid/rapid.py:3986 msgid "Photos:" msgstr "Photos :" -#: rapid/rapid.py:3264 rapid/preferencesdialog.py:1164 +#: rapid/rapid.py:3320 rapid/preferencesdialog.py:1164 msgid "Select a folder to download photos to" msgstr "Sélectionnez le dossier de destination" -#: rapid/rapid.py:3276 rapid/rapid.py:3897 +#: rapid/rapid.py:3332 rapid/rapid.py:3986 msgid "Videos:" msgstr "Vidéos :" -#: rapid/rapid.py:3278 rapid/preferencesdialog.py:1182 +#: rapid/rapid.py:3334 rapid/preferencesdialog.py:1182 msgid "Select a folder to download videos to" msgstr "Sélectionnez un dossier vers lequel transférer vos vidéos" -#: rapid/rapid.py:3470 +#: rapid/rapid.py:3526 msgid "and" msgstr "et" -#: rapid/rapid.py:3475 +#: rapid/rapid.py:3531 msgid "Using backup devices" msgstr "Utilisation des volumes de sauvegarde" -#: rapid/rapid.py:3477 +#: rapid/rapid.py:3533 msgid "Using backup device" msgstr "Utilisation du volume de sauvegarde" -#: rapid/rapid.py:3479 +#: rapid/rapid.py:3535 msgid "No backup devices detected" msgstr "Aucun volume de sauvegarde détécté" -#: rapid/rapid.py:3506 +#: rapid/rapid.py:3562 msgid "Free space:" msgstr "Espace libre :" #. (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:3518 +#: rapid/rapid.py:3574 #, 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:3522 +#: rapid/rapid.py:3578 #, python-format msgid "%(free)s %(file_type)s" msgstr "%(free)s %(file_type)s" @@ -295,87 +295,87 @@ 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:3527 +#: rapid/rapid.py:3583 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:3532 +#: rapid/rapid.py:3588 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:3538 +#: rapid/rapid.py:3594 #, python-format msgid "%(free)s free" msgstr "%(free)s disponibles" #. user manually specified the same location for photos and video backups -#: rapid/rapid.py:3546 +#: rapid/rapid.py:3602 #, python-format msgid "Backing up photos and videos to %(path)s" msgstr "Sauvegarde des photos et vidéos vers %(path)s" #. user manually specified backup location -#: rapid/rapid.py:3549 +#: rapid/rapid.py:3605 #, python-format msgid "Backing up to %(path)s" msgstr "Sauvegarde sur %(path)s" #. user manually specified different locations for photo and video backups -#: rapid/rapid.py:3552 +#: rapid/rapid.py:3608 #, python-format msgid "Backing up photos to %(path)s and videos to %(path2)s" msgstr "Sauvegarde des photos vers %(path)s et des vidéos vers %(path2)s" -#: rapid/rapid.py:3559 +#: rapid/rapid.py:3615 #, python-format msgid "%(freespace)s. %(backuppaths)s." msgstr "%(freespace)s. %(backuppaths)s." -#: rapid/rapid.py:3588 +#: rapid/rapid.py:3644 msgid "Program preferences are invalid" msgstr "Les préférences de l'application sont invalides" -#: rapid/rapid.py:3707 rapid/rpdfile.py:254 +#: rapid/rapid.py:3770 rapid/rpdfile.py:273 msgid "Photo" msgstr "Photo" -#: rapid/rapid.py:3709 rapid/rpdfile.py:273 +#: rapid/rapid.py:3772 rapid/rpdfile.py:292 msgid "Video" msgstr "Vidéo" -#: rapid/rapid.py:3718 +#: rapid/rapid.py:3781 #, python-format msgid "%(file_type)s download folder does not exist" msgstr "%(file_type)s répertoires de destination n'existe pas" -#: rapid/rapid.py:3720 rapid/rapid.py:3734 rapid/rapid.py:3747 +#: rapid/rapid.py:3783 rapid/rapid.py:3797 rapid/rapid.py:3810 #, python-format msgid "Folder: %s" msgstr "Répertoire: %s" -#: rapid/rapid.py:3732 +#: rapid/rapid.py:3795 #, python-format msgid "%(file_type)s download folder is invalid" msgstr "%(file_type)s répertoire de destination n'est pas valide" -#: rapid/rapid.py:3745 +#: rapid/rapid.py:3808 #, python-format msgid "%(file_type)s download folder is not writable" msgstr "%(file_type)s répertoire de destination protégé en écriture" -#: rapid/rapid.py:3831 +#: rapid/rapid.py:3894 msgid "Thumbnails" msgstr "Aperçus" #. 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:3878 +#: rapid/rapid.py:3949 #, python-format msgid "" "display program information on the command line as the program runs " @@ -384,30 +384,54 @@ msgstr "" "affiche les informations de l'application sur la ligne de commande lorsque " "l'application est active (défaut: %default)" -#: rapid/rapid.py:3879 +#: rapid/rapid.py:3950 msgid "display debugging information when run from the command line" msgstr "Affiche les informations de débogage en mode console" -#: rapid/rapid.py:3880 +#: rapid/rapid.py:3951 msgid "only output errors to the command line" msgstr "n'affiche que les erreurs sur la ligne de commande" #. image file extensions are recognized RAW files plus TIFF and JPG -#: rapid/rapid.py:3882 +#: rapid/rapid.py:3953 msgid "list photo and video file extensions the program recognizes and exit" msgstr "" "Liste des extensions de fichiers photo et vidéo reconnues par le programme" -#: rapid/rapid.py:3884 +#: rapid/rapid.py:3955 +msgid "" +"automatically detect devices from which to download, overwriting existing " +"program preferences" +msgstr "" +"Détecter automatiquement les périphériques à partir desquels télécharger, " +"écraser les préférences du programme" + +#: rapid/rapid.py:3956 +msgid "" +"manually specify the PATH of the device from which to download, overwriting " +"existing program preferences" +msgstr "" +"Spécifier manuellement le chemin des périphériques à partir desquels " +"télécharger, écraser les préférences du programme" + +#: rapid/rapid.py:3957 msgid "reset all program settings and preferences and exit" msgstr "Réinitialise tous les paramètres et préférences du programme" -#: rapid/rapid.py:3902 +#: rapid/rapid.py:3970 +msgid "" +"Error: specify device auto-detection or manually specify a device's path " +"from which to download, but do not do both." +msgstr "" +"Erreur: activez l'auto-détection ou spécifiez manuellement un chemin pour " +"les périphériques à partir desquels télécharger mais ne faites pas les deux." + +#: rapid/rapid.py:3991 #, python-format msgid "and %s" msgstr "et %s" -#: rapid/rapid.py:3910 +#: rapid/rapid.py:3999 msgid "All settings and preferences have been reset" msgstr "Tous les paramètres et préférences ont été réinitialisés" @@ -1390,11 +1414,16 @@ msgstr "Il y a eu une erreur lors de la sauvegarde" msgid "%(previousproblem)s, and %(backinguperror)s" msgstr "%(previousproblem)s, et %(backinguperror)s" -#: rapid/rpdfile.py:142 +#: rapid/rpdfile.py:153 #, python-format msgid "%(number)s %(filetypes)s" msgstr "%(number)s %(filetypes)s" +#: rapid/rpdfile.py:163 +#, python-format +msgid "scanning (found %(photos)s photos and %(videos)s videos)..." +msgstr "Lecture en cours: %(photos)s photos et %(videos)s vidéos trouvées" + #: rapid/subfolderfile.py:80 #, python-format msgid "%(hour)s:%(minute)s:%(second)s:%(subsecond)s" @@ -8,14 +8,14 @@ msgstr "" "Project-Id-Version: rapid\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" "POT-Creation-Date: 2012-06-23 04:00-0500\n" -"PO-Revision-Date: 2012-06-22 15:28+0000\n" -"Last-Translator: Marco Solari <marcosolari@gmail.com>\n" +"PO-Revision-Date: 2012-09-30 14:30+0000\n" +"Last-Translator: Milo Casagrande <milo.casagrande@gmail.com>\n" "Language-Team: Italian <it@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: 2012-06-25 00:48+0000\n" -"X-Generator: Launchpad (build 15461)\n" +"X-Launchpad-Export-Date: 2012-11-26 19:04+0000\n" +"X-Generator: Launchpad (build 16309)\n" #. Translators: if neccessary, for guidance in how to translate this program, you may see http://damonlynch.net/translate.html #: rapid/rapid.py:112 rapid/rapid.py:1784 rapid/glade3/rapid.ui.h:1 @@ -39,7 +39,7 @@ msgstr "%(date)s %(time)s" #: rapid/rapid.py:122 #, python-format msgid "%(date)s %(hour)s:%(minute)s:%(second)s:%(subsecond)s" -msgstr "%(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. @@ -55,12 +55,12 @@ msgstr "Dimensione" #: rapid/rapid.py:178 msgid "Download Progress" -msgstr "Avanzamento del download" +msgstr "Avanzamento scaricamento" #: rapid/rapid.py:336 #, python-format msgid "%(device)s did not unmount" -msgstr "%(device)s non si è smontato correttamente" +msgstr "%(device)s non è stato smontato correttamente" #. 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 @@ -68,7 +68,7 @@ msgstr "%(device)s non si è smontato correttamente" #. It maybe displayed only briefly if the contents of the device being scanned is small. #: rapid/rapid.py:1216 msgid "scanning..." -msgstr "scansione in corso..." +msgstr "Analisi..." #. this location is a human readable explanation for /, and is inserted into Downloading from %(location)s #: rapid/rapid.py:1782 @@ -79,7 +79,7 @@ msgstr "l'origine del file system" #: rapid/rapid.py:1786 #, python-format msgid "Downloading from %(location)s." -msgstr "Si scarica da %(location)s." +msgstr "Scaricamento da %(location)s." #: rapid/rapid.py:1787 msgid "" @@ -91,7 +91,7 @@ msgstr "" #: rapid/rapid.py:2209 msgid "Download" -msgstr "Download" +msgstr "Scarica" #: rapid/rapid.py:2212 msgid "Pause" @@ -104,7 +104,7 @@ msgid "" "%(folder1)s\n" "%(folder2)s" msgstr "" -"Queste cartelle per il download non sono valide:\n" +"Le seguenti cartelle da scaricare non sono valide:\n" "%(folder1)s\n" "%(folder2)s" @@ -114,7 +114,7 @@ msgid "" "This download folder is invalid:\n" "%s" msgstr "" -"Questa cartelle per il download non è valida:\n" +"La seguente cartella da scaricare non è valida:\n" "%s" #: rapid/rapid.py:2321 @@ -140,7 +140,7 @@ msgstr "Manca circa 1 minuto" #: rapid/rapid.py:2709 #, python-format msgid "About %(minutes)i:%(seconds)02i minutes remaining" -msgstr "Circa %(minutes)i:%(seconds)02i minuti rimanenti" +msgstr "Circa %(minutes)i.%(seconds)02i minuti rimanenti" #: rapid/rapid.py:2731 rapid/rpdfile.py:123 msgid "photos and videos" @@ -423,6 +423,9 @@ msgid "" "Error: specify device auto-detection or manually specify a device's path " "from which to download, but do not do both." msgstr "" +"Errore: specifica il dispositivo di autorilevamento o specifica manualmente " +"il percorso di un dispositivo dal quale scaricare, ma non fare entrambe le " +"cose." #: rapid/rapid.py:3991 #, python-format @@ -580,17 +583,17 @@ msgstr "Lunghezza focale" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata #: rapid/generatenameconfig.py:182 msgid "Camera make" -msgstr "Marca della fotocamera" +msgstr "Marca fotocamera" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata #: rapid/generatenameconfig.py:184 msgid "Camera model" -msgstr "Modello della fotocamera (es.: Canon EOS-1Ds Mark III)" +msgstr "Modello fotocamera" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata #: rapid/generatenameconfig.py:186 msgid "Short camera model" -msgstr "Modello brevissimo della fotocamera (es.: D300)" +msgstr "Modello fotocamera breve" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata #: rapid/generatenameconfig.py:188 @@ -7,15 +7,15 @@ msgid "" msgstr "" "Project-Id-Version: rapid\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" -"POT-Creation-Date: 2012-06-17 03:05-0500\n" -"PO-Revision-Date: 2012-06-17 10:05+0000\n" +"POT-Creation-Date: 2012-06-23 04:00-0500\n" +"PO-Revision-Date: 2012-06-25 09:45+0000\n" "Last-Translator: Erik M <Unknown>\n" "Language-Team: Norwegian Bokmal <nb@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: 2012-06-22 14:40+0000\n" -"X-Generator: Launchpad (build 15461)\n" +"X-Launchpad-Export-Date: 2012-09-11 00:24+0000\n" +"X-Generator: Launchpad (build 15924)\n" #. Translators: if neccessary, for guidance in how to translate this program, you may see http://damonlynch.net/translate.html #: rapid/rapid.py:112 rapid/rapid.py:1784 rapid/glade3/rapid.ui.h:1 @@ -66,7 +66,7 @@ msgstr "%(device)s ble ikke utløst" #. 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:1217 +#: rapid/rapid.py:1216 msgid "scanning..." msgstr "søker..." @@ -240,7 +240,7 @@ msgstr "Flytt" msgid "To" msgstr "Til" -#: rapid/rapid.py:3317 rapid/rapid.py:3985 +#: rapid/rapid.py:3317 rapid/rapid.py:3986 msgid "Photos:" msgstr "Bilder:" @@ -248,7 +248,7 @@ msgstr "Bilder:" msgid "Select a folder to download photos to" msgstr "Velg katalog for å laste inn bilder" -#: rapid/rapid.py:3332 rapid/rapid.py:3985 +#: rapid/rapid.py:3332 rapid/rapid.py:3986 msgid "Videos:" msgstr "Videoer:" @@ -374,7 +374,7 @@ msgstr "Miniatyrbilder" #. 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:3948 +#: rapid/rapid.py:3949 #, python-format msgid "" "display program information on the command line as the program runs " @@ -383,48 +383,48 @@ msgstr "" "vis programinformasjon på kommandolinjen når programmet kjører (standard: " "%default)" -#: rapid/rapid.py:3949 +#: rapid/rapid.py:3950 msgid "display debugging information when run from the command line" msgstr "vis feilrettingsinformasjon ved kjøring fra kommandolinje" -#: rapid/rapid.py:3950 +#: rapid/rapid.py:3951 msgid "only output errors to the command line" msgstr "vis bare feil på kommandolinjen" #. image file extensions are recognized RAW files plus TIFF and JPG -#: rapid/rapid.py:3952 +#: rapid/rapid.py:3953 msgid "list photo and video file extensions the program recognizes and exit" msgstr "" "vis hvilke bilde- og videofiltyper programmet gjenkjenner, og avslutt" -#: rapid/rapid.py:3954 +#: rapid/rapid.py:3955 msgid "" "automatically detect devices from which to download, overwriting existing " "program preferences" msgstr "" -#: rapid/rapid.py:3955 +#: rapid/rapid.py:3956 msgid "" "manually specify the PATH of the device from which to download, overwriting " "existing program preferences" msgstr "" -#: rapid/rapid.py:3956 +#: rapid/rapid.py:3957 msgid "reset all program settings and preferences and exit" msgstr "nullstill alle programinnstillinger og avslutt" -#: rapid/rapid.py:3969 +#: rapid/rapid.py:3970 msgid "" -"Error: specify device auto-detection or manually specifiy a device's path " +"Error: specify device auto-detection or manually specify a device's path " "from which to download, but do not do both." msgstr "" -#: rapid/rapid.py:3990 +#: rapid/rapid.py:3991 #, python-format msgid "and %s" msgstr "og %s" -#: rapid/rapid.py:3998 +#: rapid/rapid.py:3999 msgid "All settings and preferences have been reset" msgstr "Alle innstillingene er nullstillte" @@ -1650,7 +1650,7 @@ msgstr "Alternativer for gi nytt navn" #: rapid/glade3/prefs.ui.h:35 msgid "<span weight=\"bold\" size=\"x-large\">Job Codes</span>" -msgstr "<span weight=\"bold\" size=\"x-large\">Jobbnamn</span>" +msgstr "<span weight=\"bold\" size=\"x-large\">Jobbnavn</span>" #: rapid/glade3/prefs.ui.h:36 msgid "<b>Job Codes</b>" @@ -11,12 +11,12 @@ msgstr "" "PO-Revision-Date: 2012-06-24 09:07+0000\n" "Last-Translator: A.J. Baudrez <a.baudrez@gmail.com>\n" "Language-Team: Dutch <nl@li.org>\n" +"Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-06-25 00:48+0000\n" "X-Generator: Launchpad (build 15461)\n" -"Language: nl\n" #. Translators: if neccessary, for guidance in how to translate this program, you may see http://damonlynch.net/translate.html #: rapid/rapid.py:112 rapid/rapid.py:1784 rapid/glade3/rapid.ui.h:1 @@ -208,8 +208,7 @@ msgstr "%(filetype)s werden niet gedownload" #: rapid/rapid.py:2860 #, 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)" +msgstr "%(number)s van de %(total)s %(filetypes)s (%(remaining)s blijven over)" #. e.g.: 205 of 205 photos and videos #: rapid/rapid.py:2867 @@ -1582,8 +1581,8 @@ msgid "" "for python, or <i>exiftool</i>." msgstr "" "Sorry, de video download functionaliteit is uitgezet. Om video's te " -"downloaden moet je ofwel de <i>hachoir metadata</i> en de <i>kaa " -"metadata</i> paketten voor python, ofwel <i>exiftool</i> installeren." +"downloaden moet je ofwel de <i>hachoir metadata</i> en de <i>kaa metadata</" +"i> paketten voor python, ofwel <i>exiftool</i> installeren." #: rapid/glade3/prefs.ui.h:18 msgid "" @@ -1703,8 +1702,8 @@ msgid "" "\n" "<i>Downloading directly from cameras is currently an experimental feature. " "If downloading directly from your camera works poorly or not at all, try " -"setting it to PTP mode. If that is not possible, a card reader must be " -"used.</i>" +"setting it to PTP mode. If that is not possible, a card reader must be used." +"</i>" msgstr "" "Met apparaten wordt bedoeld waar je de foto's en video's van downloadt, " "zoals camera's, geheugenkaarten of Draagbare Opslagmedia.\n" @@ -1805,8 +1804,7 @@ msgid "<b>Backup</b>" msgstr "<b>Backup</b>" #: rapid/glade3/prefs.ui.h:66 -msgid "" -"If you disable automatic detection, choose the exact backup locations." +msgid "If you disable automatic detection, choose the exact backup locations." msgstr "" "Als je de automatische herkenning uitzet, moet je een exacte backup locatie " "ingeven." @@ -1978,13 +1976,12 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ "Please check preferences, restart the program, and try again." #~ msgstr "" #~ "\n" -#~ "Gelieve de voorkeuren te controleren, het programma te herstarten en opnieuw " -#~ "te proberen." +#~ "Gelieve de voorkeuren te controleren, het programma te herstarten en " +#~ "opnieuw te proberen." #~ msgid "There is an error in the program preferences." #~ msgstr "Er is een fout in de programma voorkeuren." -#, python-format #~ msgid "0 of %s images copied" #~ msgstr "0 van %s afbeeldingen gekopieerd" @@ -1994,19 +1991,16 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ msgid "Resetting to midnight.\n" #~ msgstr "Terugzetten op middernacht.\n" -#, python-format #~ msgid "Device scan complete: found %(number)s images on %(device)s" #~ msgstr "" #~ "Apparaat scan afgelopen: %(number)s afbeeldingen gevonden op %(device)s" -#, python-format #~ msgid "Device scan complete: no images found on %s" #~ msgstr "Apparaat scan afgelopen: geen afbeeldingen gevonden op %s" #~ msgid "Image filename could not be generated" #~ msgstr "Afbeeldingsnaam kon niet aangemaakt worden" -#, python-format #~ msgid "" #~ "Source: %(source)s\n" #~ "Problem: %(problem)s" @@ -2018,10 +2012,9 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ "Image filename could not be properly generated. Check to ensure there is " #~ "sufficient image metadata." #~ msgstr "" -#~ "Afbeeldingsnaam kon niet goed aangemaakt worden. Controlleer of er voldoende " -#~ "afbeeldingsmetadata aanwezig is." +#~ "Afbeeldingsnaam kon niet goed aangemaakt worden. Controlleer of er " +#~ "voldoende afbeeldingsmetadata aanwezig is." -#, python-format #~ msgid "" #~ "Source: %(source)s\n" #~ "Destination: %(destination)s\n" @@ -2034,21 +2027,18 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ msgid "Could not open image" #~ msgstr "Kon afbeelding niet openen" -#, python-format #~ msgid "Source: %s" #~ msgstr "Bron: %s" #~ msgid "Image has no metadata" #~ msgstr "Afbeelding heeft geen metadata" -#, python-format #~ msgid "Unique identifier '%s' added" #~ msgstr "Unieke identifier '%s' toegevoegd" #~ msgid "Download copying error" #~ msgstr "Download kopieer fout" -#, python-format #~ msgid "" #~ "Source: %(source)s\n" #~ "Destination: %(destination)s\n" @@ -2064,7 +2054,6 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ msgid "Backup image already exists" #~ msgstr "Backup afbeelding bestaat al" -#, python-format #~ msgid "" #~ "Destination directory could not be created\n" #~ "%(directory)s\n" @@ -2074,7 +2063,6 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ "%(directory)s\n" #~ "Fout: %(errno)s %(strerror)s" -#, python-format #~ msgid "" #~ "Source: %(source)s\n" #~ "Destination: %(destination)s\n" @@ -2087,11 +2075,9 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ msgid "The device can now be safely removed" #~ msgstr "Het apparaat kan nu veilig verwijderd worden" -#, python-format #~ msgid "%s images downloaded" #~ msgstr "%s afbeeldingen gedownload" -#, python-format #~ msgid "%s images skipped" #~ msgstr "%s afbeeldingen overgeslaan" @@ -2101,7 +2087,6 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ msgid "Backup device missing" #~ msgstr "Backup apparaat afwezig" -#, python-format #~ msgid "Download has started from %s" #~ msgstr "Download begonnen vanaf %s" @@ -2117,7 +2102,6 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ msgid "Image has no thumbnail" #~ msgstr "Afbeelding heeft geen miniatuur" -#, python-format #~ msgid "%(number)s of %(total)s images copied" #~ msgstr "%(number)s van %(total)s afbeeldingen gekopieerd" @@ -2127,21 +2111,21 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ msgid "It may be corrupted" #~ msgstr "Het kan corrupt zijn" -#, python-format #~ msgid "%s selected for downloading from" #~ msgstr "%s aangeduid om gedownload te worden van" #~ msgid "This device or partition will always be used to download from" #~ msgstr "" -#~ "Dit apparaat of deze partitie zal altijd gebruikt worden om van te downloaden" +#~ "Dit apparaat of deze partitie zal altijd gebruikt worden om van te " +#~ "downloaden" -#, python-format #~ msgid "%s rejected as a download device" #~ msgstr "%s afgewezen als download apparaat" #~ msgid "This device or partition will never be used to download from" #~ msgstr "" -#~ "Dit apparaat of deze partitie zal nooit gebruikt worden om van te downloaden" +#~ "Dit apparaat of deze partitie zal nooit gebruikt worden om van te " +#~ "downloaden" #~ msgid "Enter a new job code." #~ msgstr "Geef een nieuwe job code." @@ -2155,7 +2139,6 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ msgid "Some preferences will be reset." #~ msgstr "Sommige voorkeuren worden gereset" -#, python-format #~ msgid "Prompting whether to use %s" #~ msgstr "Vragen om %s te gebruiken" @@ -2193,8 +2176,8 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ msgstr "Voorkeuren werden aangepast." #~ msgid "" -#~ "This version of the program uses different preferences than the old version. " -#~ "Your preferences have been updated.\n" +#~ "This version of the program uses different preferences than the old " +#~ "version. Your preferences have been updated.\n" #~ "\n" #~ "Please check them to ensure correct operation." #~ msgstr "" @@ -2212,11 +2195,9 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ msgid "Failed to receive pynotify server capabilities." #~ msgstr "Kon de pynotify server mogelijkheden niet ontvangen." -#, python-format #~ msgid "Device %(device)s (%(path)s) ignored" #~ msgstr "Apparaat %(device)s (%(path)s) wordt genegeerd" -#, python-format #~ msgid "Detected %(device)s with path %(path)s" #~ msgstr "Detecteerde %(device)s met als pad %(path)s" @@ -2235,25 +2216,21 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ msgid "Using" #~ msgstr "Gebruik makend van" -#, python-format #~ msgid "%s is already running" #~ msgstr "%s is al draaiende" -#, python-format #~ msgid "Preference value '%(value)s' is invalid" #~ msgstr "Voorkeurwaarde '%(value)s' is ongeldig" #~ msgid "_Pause" #~ msgstr "_Pauze" -#, python-format #~ msgid "Error in date time component. Value %s appears invalid" #~ msgstr "Fout in datum/tijd component. Waarde %s blijkt ongeldig" #~ msgid "extension was specified but image name has no extension" #~ msgstr "Uitbreiding was gespecifieerd, maar afbeeldingsnaam heeft er geen" -#, python-format #~ msgid "error generating name with component %s" #~ msgstr "fout bij het aanmaken van de naam met component %s" @@ -2273,7 +2250,8 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ msgstr "Automatisering" #~ msgid "<span weight=\"bold\" size=\"x-large\">Image Rename</span>\t" -#~ msgstr "<span weight=\"bold\" size=\"x-large\">Afbeelding Hernoemen</span>\t" +#~ msgstr "" +#~ "<span weight=\"bold\" size=\"x-large\">Afbeelding Hernoemen</span>\t" #~ msgid "Copyright Damon Lynch 2007-09" #~ msgstr "Copyright Damon Lynch 2007-09" @@ -2284,9 +2262,11 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ msgid "Image Devices" #~ msgstr "Afbeeldingsapparaat" -#~ msgid "If you disable automatic detection, choose the exact backup location." +#~ msgid "" +#~ "If you disable automatic detection, choose the exact backup location." #~ msgstr "" -#~ "Als je de automatische herkenning uitschakelt, kies de juiste backup plaats." +#~ "Als je de automatische herkenning uitschakelt, kies de juiste backup " +#~ "plaats." #~ msgid "Exit program after completion of successful download" #~ msgstr "Verlaat programma na het beëindigen van een gelukte download" @@ -2295,10 +2275,11 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ msgstr "Negeren" #~ msgid "" -#~ "If you disable automatic detection, choose the exact location of the images." +#~ "If you disable automatic detection, choose the exact location of the " +#~ "images." #~ msgstr "" -#~ "Als je de automatische herkenning uitschakelt, kies de juiste plaats voor de " -#~ "afbeeldingen." +#~ "Als je de automatische herkenning uitschakelt, kies de juiste plaats voor " +#~ "de afbeeldingen." #~ msgid "Error Log" #~ msgstr "Foutenlog" @@ -2322,8 +2303,8 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ "Specify what to do when an image of the same name has already been " #~ "downloaded or backed up." #~ msgstr "" -#~ "Specifieer wat er dient te gebeuren indien een afbeelding met dezelfde naam " -#~ "reeds gedownload of gebackupped was." +#~ "Specifieer wat er dient te gebeuren indien een afbeelding met dezelfde " +#~ "naam reeds gedownload of gebackupped was." #~ msgid "Unmount (\"eject\") image device upon download completion" #~ msgstr "Ontkoppel (\"verwijder\") het afbeeldingsapparaat na de download" @@ -2332,8 +2313,8 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ "You can have your photos backed up to multiple locations as they are " #~ "downloaded, e.g. external hard drives." #~ msgstr "" -#~ "Je kan je foto's op meerdere plaatsen backuppen tijdens het downloaden, bv. " -#~ "externe harde schijven." +#~ "Je kan je foto's op meerdere plaatsen backuppen tijdens het downloaden, " +#~ "bv. externe harde schijven." #~ msgid "_Get Help Online..." #~ msgstr "_Online Help..." @@ -2351,7 +2332,8 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ msgstr "_Miniaturen" #~ msgid "" -#~ "Choose whether to skip downloading the image, or to add a unique indentifier." +#~ "Choose whether to skip downloading the image, or to add a unique " +#~ "indentifier." #~ msgstr "" #~ "Kies tussen het overslaan van de download van de afbeelding, of er een " #~ "unieke identifier aan toe te kennen." @@ -2361,9 +2343,9 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ "device will be scanned for images. On large devices, this could take some " #~ "time." #~ msgstr "" -#~ "Als je de automatische herkenning van Draagbare Opslagmedia inschakelt, zal " -#~ "het volledig apparaat gescanned worden op afbeeldingen. Bij grote apparaten, " -#~ "kan dat een tijd duren." +#~ "Als je de automatische herkenning van Draagbare Opslagmedia inschakelt, " +#~ "zal het volledig apparaat gescanned worden op afbeeldingen. Bij grote " +#~ "apparaten, kan dat een tijd duren." #~ msgid "" #~ "Image devices are devices from which to download photos, such as cameras, " @@ -2371,9 +2353,9 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ "\n" #~ "You can download photos from multiple image devices simultaneously.\n" #~ "\n" -#~ "<i>If downloading directly from your camera works poorly or not at all, try " -#~ "setting it to PTP mode. If that is not possible, consider using a card " -#~ "reader.</i>" +#~ "<i>If downloading directly from your camera works poorly or not at all, " +#~ "try setting it to PTP mode. If that is not possible, consider using a " +#~ "card reader.</i>" #~ msgstr "" #~ "Afbeeldingsapparaten zijn apparaten waar we foto's van kunnen downloaden " #~ "zoals camera's, geheugenkaarten en draagbare opslagmedia.\n" @@ -2381,12 +2363,12 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ "Je kunt foto's van meerdere afbeeldingsapparaten simultaan downloaden.\n" #~ "\n" #~ "<i>Indien het rechtstreeks downloaden vanaf je camera slecht of helemaal " -#~ "niet werkt, probeer het via de PTP mode. Als dat niet mogelijk is overweeg " -#~ "een kaartlezer te gebruiken.</i>" +#~ "niet werkt, probeer het via de PTP mode. Als dat niet mogelijk is " +#~ "overweeg een kaartlezer te gebruiken.</i>" #~ msgid "" -#~ "When backing up, choose whether to overwrite an image on the backup device " -#~ "that has the same name, or skip backing it up." +#~ "When backing up, choose whether to overwrite an image on the backup " +#~ "device that has the same name, or skip backing it up." #~ msgstr "" #~ "Kies tijdens het backuppen om een afbeelding met dezelfde naam op het " #~ "backupapparaat te overschrijven of over te slaan." @@ -2410,7 +2392,8 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ "The subfolder preferences entered are invalid and cannot be used.\n" #~ "They will be reset to their default values." #~ msgstr "" -#~ "De ingevulde submapvoorkeuren zijn ongeldig en kunnen niet gebruikt worden.\n" +#~ "De ingevulde submapvoorkeuren zijn ongeldig en kunnen niet gebruikt " +#~ "worden.\n" #~ "Ze zullen naar de standaard waardes worden teruggezet." #~ msgid "The subfolder preferences had some unnecessary values removed." @@ -2421,17 +2404,17 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ "<i><b>Warning:</b> There is insufficient image metadata to fully generate " #~ "the name. Please use other renaming options.</i>" #~ msgstr "" -#~ "<i><b>Opgepast:</b> Er is onvoldoende afbeeldingsmetadata om een volledige " -#~ "naam aan te maken. Gelieve andere hernoemingsopties te gebruiken.</i>" +#~ "<i><b>Opgepast:</b> Er is onvoldoende afbeeldingsmetadata om een " +#~ "volledige naam aan te maken. Gelieve andere hernoemingsopties te " +#~ "gebruiken.</i>" #~ msgid "" #~ "<i><b>Warning:</b> There is insufficient image metadata to fully generate " #~ "subfolders. Please use other subfolder naming options.</i>" #~ msgstr "" -#~ "<i><b>Opgepast:</b> Er is onvoldoende afbeeldingsmetadata om een submap aan " -#~ "te maken. Gelieve andere submap benoemingsopties te gebruiken.</i>" +#~ "<i><b>Opgepast:</b> Er is onvoldoende afbeeldingsmetadata om een submap " +#~ "aan te maken. Gelieve andere submap benoemingsopties te gebruiken.</i>" -#, python-format #~ msgid "" #~ "Metadata is essential for generating subfolders / image names.\n" #~ "Source: %s" @@ -2450,7 +2433,6 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ "Submapnaam kon niet goed aangemaakt worden. Controlleer of er voldoende " #~ "afbeeldingsmetadata aanwezig is." -#, python-format #~ msgid "" #~ "Subfolder: %(subfolder)s\n" #~ "Image: %(image)s\n" @@ -2466,7 +2448,6 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ msgid "This device has no images to download from." #~ msgstr "Dit apparaat bevat geen afbeeldingen die gedownload kunnen worden." -#, python-format #~ msgid "Download complete from %s" #~ msgstr "Download van %s afgelopen" @@ -2482,9 +2463,9 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ msgstr "Waarschuwing:" #~ msgid "" -#~ "This version of the program uses different preferences than the old version. " -#~ "Some of your previous preferences were invalid, and could not be updated. " -#~ "They will be reset." +#~ "This version of the program uses different preferences than the old " +#~ "version. Some of your previous preferences were invalid, and could not be " +#~ "updated. They will be reset." #~ msgstr "" #~ "Deze versie van het programma gebruikt andere voorkeuren dan de vorige. " #~ "Bepaalde van je vorige voorkeuren zijn ongeldig en kunnen niet aangepast " @@ -2498,9 +2479,9 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ msgid "list image file extensions the program recognizes and exit" #~ msgstr "" -#~ "toon een lijst van bestandextenties welke het programma herkent en keer terug" +#~ "toon een lijst van bestandextenties welke het programma herkent en keer " +#~ "terug" -#, python-format #~ msgid "" #~ "Preference key '%(key)s' is invalid.\n" #~ "Expected one of %(value)s" @@ -2511,7 +2492,6 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ msgid "Subsecond metadata not present in image" #~ msgstr "Subsecond metadata niet aanwezig in de afbeelding" -#, python-format #~ msgid "%s metadata is not present in image" #~ msgstr "%s metadata is niet aanwezig in de afbeelding" @@ -2545,18 +2525,19 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ msgid "" #~ "Rapid Photo Downloader 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.\n" +#~ "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.\n" #~ "\n" #~ "Rapid Photo Downloader 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.\n" #~ "\n" -#~ "You should have received a copy of the GNU General Public License along with " -#~ "Rapid Photo Downloader; if not, write to the Free Software Foundation, Inc., " -#~ "51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA." +#~ "You should have received a copy of the GNU General Public License along " +#~ "with Rapid Photo Downloader; if not, write to the Free Software " +#~ "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, " +#~ "USA." #~ msgstr "" #~ "Rapid Photo Downloader is vrije software; je mag het herverdelen en/of " #~ "aanpassen onder de termen van de GNU General Public License zoals " @@ -2565,13 +2546,13 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ "\n" #~ "Rapid Photo Downloader wordt verdeeld in de hoop dat het nuttig zal zijn, " #~ "maar ZONDER ENIGE GARANTIE; zelfs zonder de impliciete garantie van " -#~ "VERKOOPBAARHEID of GESCHIKTHEID VOOR EEN BEPAALD DOEL . Zie de GNU General " -#~ "Public License voor meer details.\n" +#~ "VERKOOPBAARHEID of GESCHIKTHEID VOOR EEN BEPAALD DOEL . Zie de GNU " +#~ "General Public License voor meer details.\n" #~ "\n" -#~ "Je zou een kopie van de GNU General Public License ontvangen moeten hebben " -#~ "samen met Rapid Photo Downloader; indien niet, contacteer de Free Software " -#~ "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, " -#~ "USA." +#~ "Je zou een kopie van de GNU General Public License ontvangen moeten " +#~ "hebben samen met Rapid Photo Downloader; indien niet, contacteer de Free " +#~ "Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA " +#~ "02110-1301, USA." #~ msgid "Specify what to do when there are no backup devices." #~ msgstr "" @@ -2581,8 +2562,8 @@ msgstr "Importeer je foto's en video's efficiënt en betrouwbaar" #~ "Specify the folder in which backups are stored on the device. \n" #~ "\n" #~ "<i>Note: this will also be used to determine whether or not the device is " -#~ "used for backups. For each device you wish to use for backing up to, create " -#~ "a folder in it with this name.</i>" +#~ "used for backups. For each device you wish to use for backing up to, " +#~ "create a folder in it with this name.</i>" #~ msgstr "" #~ "Specifieer de map waar de backups opgeslagen zijn op het apparaat. \n" #~ "\n" diff --git a/po/rapid-photo-downloader.pot b/po/rapid-photo-downloader.pot index d056e3a..365d0c2 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: 2012-06-23 03:53-0500\n" +"POT-Creation-Date: 2012-06-23 04:00-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,7 +18,7 @@ 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:112 rapid/rapid.py:1779 rapid/glade3/rapid.ui.h:1 +#: rapid/rapid.py:112 rapid/rapid.py:1784 rapid/glade3/rapid.ui.h:1 msgid "Rapid Photo Downloader" msgstr "" @@ -69,31 +69,31 @@ msgid "scanning..." msgstr "" #. this location is a human readable explanation for /, and is inserted into Downloading from %(location)s -#: rapid/rapid.py:1777 +#: rapid/rapid.py:1782 msgid "the root of the file system" msgstr "" #. message in dialog box which asks the user if they really want to be downloading from this location -#: rapid/rapid.py:1781 +#: rapid/rapid.py:1786 #, python-format msgid "Downloading from %(location)s." msgstr "" -#: rapid/rapid.py:1782 +#: rapid/rapid.py:1787 msgid "" "Do you really want to download from here? On some systems, scanning this " "location can take a very long time." msgstr "" -#: rapid/rapid.py:2204 +#: rapid/rapid.py:2209 msgid "Download" msgstr "" -#: rapid/rapid.py:2207 +#: rapid/rapid.py:2212 msgid "Pause" msgstr "" -#: rapid/rapid.py:2312 +#: rapid/rapid.py:2317 #, python-format msgid "" "These download folders are invalid:\n" @@ -101,183 +101,183 @@ msgid "" "%(folder2)s" msgstr "" -#: rapid/rapid.py:2315 +#: rapid/rapid.py:2320 #, python-format msgid "" "This download folder is invalid:\n" "%s" msgstr "" -#: rapid/rapid.py:2316 +#: rapid/rapid.py:2321 msgid "Download cannot proceed" msgstr "" -#: rapid/rapid.py:2695 +#: rapid/rapid.py:2700 msgid "About 1 second remaining" msgstr "" -#: rapid/rapid.py:2697 +#: rapid/rapid.py:2702 #, python-format msgid "About %i seconds remaining" msgstr "" -#: rapid/rapid.py:2699 +#: rapid/rapid.py:2704 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:2704 +#: rapid/rapid.py:2709 #, python-format msgid "About %(minutes)i:%(seconds)02i minutes remaining" msgstr "" -#: rapid/rapid.py:2726 rapid/rpdfile.py:123 +#: rapid/rapid.py:2731 rapid/rpdfile.py:123 msgid "photos and videos" msgstr "" -#: rapid/rapid.py:2728 rapid/rpdfile.py:125 +#: rapid/rapid.py:2733 rapid/rpdfile.py:125 msgid "photos or videos" msgstr "" -#: rapid/rapid.py:2731 rapid/rapid.py:3553 rapid/rpdfile.py:128 +#: rapid/rapid.py:2736 rapid/rapid.py:3558 rapid/rpdfile.py:128 msgid "videos" msgstr "" -#: rapid/rapid.py:2733 rapid/preferencesdialog.py:1620 rapid/rpdfile.py:130 +#: rapid/rapid.py:2738 rapid/preferencesdialog.py:1620 rapid/rpdfile.py:130 #: rapid/rpdfile.py:291 msgid "video" msgstr "" -#: rapid/rapid.py:2736 rapid/rapid.py:3551 rapid/rpdfile.py:133 +#: rapid/rapid.py:2741 rapid/rapid.py:3556 rapid/rpdfile.py:133 msgid "photos" msgstr "" #. check subfolder preferences for bad values -#: rapid/rapid.py:2738 rapid/preferencesdialog.py:1619 rapid/rpdfile.py:135 +#: rapid/rapid.py:2743 rapid/preferencesdialog.py:1619 rapid/rpdfile.py:135 #: rapid/rpdfile.py:272 msgid "photo" msgstr "" -#: rapid/rapid.py:2765 +#: rapid/rapid.py:2770 #, python-format msgid "%(noFiles)s %(filetypes)s downloaded" msgstr "" -#: rapid/rapid.py:2769 +#: rapid/rapid.py:2774 #, python-format msgid "%(noFiles)s %(filetypes)s failed to download" msgstr "" -#: rapid/rapid.py:2772 rapid/rapid.py:2824 +#: rapid/rapid.py:2777 rapid/rapid.py:2829 msgid "warnings" msgstr "" -#: rapid/rapid.py:2781 +#: rapid/rapid.py:2786 msgid "All downloads complete" msgstr "" -#: rapid/rapid.py:2787 rapid/rapid.py:2796 rapid/rapid.py:2805 -#: rapid/rapid.py:2814 rapid/rapid.py:2822 +#: rapid/rapid.py:2792 rapid/rapid.py:2801 rapid/rapid.py:2810 +#: rapid/rapid.py:2819 rapid/rapid.py:2827 #, python-format msgid "%(number)s %(numberdownloaded)s" msgstr "" -#: rapid/rapid.py:2789 rapid/rapid.py:2807 +#: rapid/rapid.py:2794 rapid/rapid.py:2812 #, python-format msgid "%(filetype)s downloaded" msgstr "" -#: rapid/rapid.py:2798 rapid/rapid.py:2816 +#: rapid/rapid.py:2803 rapid/rapid.py:2821 #, python-format msgid "%(filetype)s failed to download" msgstr "" #. e.g.: 3 of 205 photos and videos (202 remaining) -#: rapid/rapid.py:2855 +#: rapid/rapid.py:2860 #, 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:2862 +#: rapid/rapid.py:2867 #, python-format msgid "%(number)s of %(total)s %(filetypes)s" msgstr "" -#: rapid/rapid.py:3217 +#: rapid/rapid.py:3222 msgid "From" msgstr "" -#: rapid/rapid.py:3225 +#: rapid/rapid.py:3230 msgid "Auto Detect" msgstr "" -#: rapid/rapid.py:3229 rapid/preferencesdialog.py:1327 +#: rapid/rapid.py:3234 rapid/preferencesdialog.py:1327 #, python-format msgid "Select a folder containing %(file_types)s" msgstr "" -#: rapid/rapid.py:3270 +#: rapid/rapid.py:3275 msgid "Copy" msgstr "" -#: rapid/rapid.py:3283 +#: rapid/rapid.py:3288 msgid "Move" msgstr "" -#: rapid/rapid.py:3305 +#: rapid/rapid.py:3310 msgid "To" msgstr "" -#: rapid/rapid.py:3312 rapid/rapid.py:3981 +#: rapid/rapid.py:3317 rapid/rapid.py:3986 msgid "Photos:" msgstr "" -#: rapid/rapid.py:3315 rapid/preferencesdialog.py:1164 +#: rapid/rapid.py:3320 rapid/preferencesdialog.py:1164 msgid "Select a folder to download photos to" msgstr "" -#: rapid/rapid.py:3327 rapid/rapid.py:3981 +#: rapid/rapid.py:3332 rapid/rapid.py:3986 msgid "Videos:" msgstr "" -#: rapid/rapid.py:3329 rapid/preferencesdialog.py:1182 +#: rapid/rapid.py:3334 rapid/preferencesdialog.py:1182 msgid "Select a folder to download videos to" msgstr "" -#: rapid/rapid.py:3521 +#: rapid/rapid.py:3526 msgid "and" msgstr "" -#: rapid/rapid.py:3526 +#: rapid/rapid.py:3531 msgid "Using backup devices" msgstr "" -#: rapid/rapid.py:3528 +#: rapid/rapid.py:3533 msgid "Using backup device" msgstr "" -#: rapid/rapid.py:3530 +#: rapid/rapid.py:3535 msgid "No backup devices detected" msgstr "" -#: rapid/rapid.py:3557 +#: rapid/rapid.py:3562 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:3569 +#: rapid/rapid.py:3574 #, 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:3573 +#: rapid/rapid.py:3578 #, python-format msgid "%(free)s %(file_type)s" msgstr "" @@ -285,134 +285,134 @@ 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:3578 +#: rapid/rapid.py:3583 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:3583 +#: rapid/rapid.py:3588 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:3589 +#: rapid/rapid.py:3594 #, python-format msgid "%(free)s free" msgstr "" #. user manually specified the same location for photos and video backups -#: rapid/rapid.py:3597 +#: rapid/rapid.py:3602 #, python-format msgid "Backing up photos and videos to %(path)s" msgstr "" #. user manually specified backup location -#: rapid/rapid.py:3600 +#: rapid/rapid.py:3605 #, python-format msgid "Backing up to %(path)s" msgstr "" #. user manually specified different locations for photo and video backups -#: rapid/rapid.py:3603 +#: rapid/rapid.py:3608 #, python-format msgid "Backing up photos to %(path)s and videos to %(path2)s" msgstr "" -#: rapid/rapid.py:3610 +#: rapid/rapid.py:3615 #, python-format msgid "%(freespace)s. %(backuppaths)s." msgstr "" -#: rapid/rapid.py:3639 +#: rapid/rapid.py:3644 msgid "Program preferences are invalid" msgstr "" -#: rapid/rapid.py:3765 rapid/rpdfile.py:273 +#: rapid/rapid.py:3770 rapid/rpdfile.py:273 msgid "Photo" msgstr "" -#: rapid/rapid.py:3767 rapid/rpdfile.py:292 +#: rapid/rapid.py:3772 rapid/rpdfile.py:292 msgid "Video" msgstr "" -#: rapid/rapid.py:3776 +#: rapid/rapid.py:3781 #, python-format msgid "%(file_type)s download folder does not exist" msgstr "" -#: rapid/rapid.py:3778 rapid/rapid.py:3792 rapid/rapid.py:3805 +#: rapid/rapid.py:3783 rapid/rapid.py:3797 rapid/rapid.py:3810 #, python-format msgid "Folder: %s" msgstr "" -#: rapid/rapid.py:3790 +#: rapid/rapid.py:3795 #, python-format msgid "%(file_type)s download folder is invalid" msgstr "" -#: rapid/rapid.py:3803 +#: rapid/rapid.py:3808 #, python-format msgid "%(file_type)s download folder is not writable" msgstr "" -#: rapid/rapid.py:3889 +#: rapid/rapid.py:3894 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:3944 +#: rapid/rapid.py:3949 #, python-format msgid "" "display program information on the command line as the program runs " "(default: %default)" msgstr "" -#: rapid/rapid.py:3945 +#: rapid/rapid.py:3950 msgid "display debugging information when run from the command line" msgstr "" -#: rapid/rapid.py:3946 +#: rapid/rapid.py:3951 msgid "only output errors to the command line" msgstr "" #. image file extensions are recognized RAW files plus TIFF and JPG -#: rapid/rapid.py:3948 +#: rapid/rapid.py:3953 msgid "list photo and video file extensions the program recognizes and exit" msgstr "" -#: rapid/rapid.py:3950 +#: rapid/rapid.py:3955 msgid "" "automatically detect devices from which to download, overwriting existing " "program preferences" msgstr "" -#: rapid/rapid.py:3951 +#: rapid/rapid.py:3956 msgid "" "manually specify the PATH of the device from which to download, overwriting " "existing program preferences" msgstr "" -#: rapid/rapid.py:3952 +#: rapid/rapid.py:3957 msgid "reset all program settings and preferences and exit" msgstr "" -#: rapid/rapid.py:3965 +#: rapid/rapid.py:3970 msgid "" "Error: specify device auto-detection or manually specify a device's path " "from which to download, but do not do both." msgstr "" -#: rapid/rapid.py:3986 +#: rapid/rapid.py:3991 #, python-format msgid "and %s" msgstr "" -#: rapid/rapid.py:3994 +#: rapid/rapid.py:3999 msgid "All settings and preferences have been reset" msgstr "" @@ -6,23 +6,24 @@ msgid "" msgstr "" "Project-Id-Version: rapid\n" -"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" -"POT-Creation-Date: 2012-05-13 22:31-0500\n" -"PO-Revision-Date: 2012-05-20 07:07+0000\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-23 04:00-0500\n" +"PO-Revision-Date: 2012-07-03 07:38+0000\n" "Last-Translator: Eugene Marshal <Unknown>\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: 2012-05-29 18:44+0000\n" -"X-Generator: Launchpad (build 15316)\n" +"X-Launchpad-Export-Date: 2012-09-11 00:24+0000\n" +"X-Generator: Launchpad (build 15924)\n" +"Language: ru\n" #. Translators: if neccessary, for guidance in how to translate this program, you may see http://damonlynch.net/translate.html -#: rapid/rapid.py:110 rapid/rapid.py:1749 rapid/glade3/rapid.ui.h:1 +#: rapid/rapid.py:112 rapid/rapid.py:1784 rapid/glade3/rapid.ui.h:1 msgid "Rapid Photo Downloader" msgstr "Rapid Photo Downloader" -#: rapid/rapid.py:115 +#: rapid/rapid.py:117 #, python-format msgid "" "%(date)s\n" @@ -31,33 +32,33 @@ msgstr "" "%(date)s\n" "%(time)s" -#: rapid/rapid.py:117 +#: rapid/rapid.py:119 #, python-format msgid "%(date)s %(time)s" msgstr "%(date)s %(time)s" -#: rapid/rapid.py:120 +#: rapid/rapid.py:122 #, 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:155 +#: rapid/rapid.py:157 msgid "Device" msgstr "Носитель" #. Size refers to the total size of images on the device, typically in #. MB or GB -#: rapid/rapid.py:173 +#: rapid/rapid.py:175 msgid "Size" msgstr "Размер" -#: rapid/rapid.py:176 +#: rapid/rapid.py:178 msgid "Download Progress" msgstr "Ход загрузки" -#: rapid/rapid.py:322 +#: rapid/rapid.py:336 #, python-format msgid "%(device)s did not unmount" msgstr "%(device)s не отсоединён" @@ -66,22 +67,22 @@ msgstr "%(device)s не отсоединён" #. 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:1189 +#: rapid/rapid.py:1216 msgid "scanning..." msgstr "поиск файлов..." #. this location is a human readable explanation for /, and is inserted into Downloading from %(location)s -#: rapid/rapid.py:1747 +#: rapid/rapid.py:1782 msgid "the root of the file system" msgstr "корень файловой системы" #. message in dialog box which asks the user if they really want to be downloading from this location -#: rapid/rapid.py:1751 +#: rapid/rapid.py:1786 #, python-format msgid "Downloading from %(location)s." msgstr "Загрузка из %(location)s." -#: rapid/rapid.py:1752 +#: rapid/rapid.py:1787 msgid "" "Do you really want to download from here? On some systems, scanning this " "location can take a very long time." @@ -89,15 +90,15 @@ msgstr "" "Вы точно хотите загрузить отсюда? На некоторых системах сканирование этого " "местоположения может занять много времени." -#: rapid/rapid.py:2174 +#: rapid/rapid.py:2209 msgid "Download" msgstr "Загрузка" -#: rapid/rapid.py:2177 +#: rapid/rapid.py:2212 msgid "Pause" msgstr "Пауза" -#: rapid/rapid.py:2282 +#: rapid/rapid.py:2317 #, python-format msgid "" "These download folders are invalid:\n" @@ -108,7 +109,7 @@ msgstr "" "%(folder1)s\n" "%(folder2)s" -#: rapid/rapid.py:2285 +#: rapid/rapid.py:2320 #, python-format msgid "" "This download folder is invalid:\n" @@ -117,176 +118,176 @@ msgstr "" "Неправильно указанная папка загрузки:\n" "%s" -#: rapid/rapid.py:2286 +#: rapid/rapid.py:2321 msgid "Download cannot proceed" msgstr "Невозможно загрузить" -#: rapid/rapid.py:2653 +#: rapid/rapid.py:2700 msgid "About 1 second remaining" msgstr "Осталась примерно 1 секунда" -#: rapid/rapid.py:2655 +#: rapid/rapid.py:2702 #, python-format msgid "About %i seconds remaining" msgstr "Осталось %i секунд" -#: rapid/rapid.py:2657 +#: rapid/rapid.py:2704 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:2662 +#: rapid/rapid.py:2709 #, python-format msgid "About %(minutes)i:%(seconds)02i minutes remaining" msgstr "Осталось примерно %(minutes)i:%(seconds)02i" -#: rapid/rapid.py:2684 rapid/rpdfile.py:116 +#: rapid/rapid.py:2731 rapid/rpdfile.py:123 msgid "photos and videos" msgstr "фото и видео" -#: rapid/rapid.py:2686 rapid/rpdfile.py:118 +#: rapid/rapid.py:2733 rapid/rpdfile.py:125 msgid "photos or videos" msgstr "фото или видео" -#: rapid/rapid.py:2689 rapid/rapid.py:3502 rapid/rpdfile.py:121 +#: rapid/rapid.py:2736 rapid/rapid.py:3558 rapid/rpdfile.py:128 msgid "videos" msgstr "видео" -#: rapid/rapid.py:2691 rapid/preferencesdialog.py:1620 rapid/rpdfile.py:123 -#: rapid/rpdfile.py:272 +#: rapid/rapid.py:2738 rapid/preferencesdialog.py:1620 rapid/rpdfile.py:130 +#: rapid/rpdfile.py:291 msgid "video" msgstr "видео" -#: rapid/rapid.py:2694 rapid/rapid.py:3500 rapid/rpdfile.py:126 +#: rapid/rapid.py:2741 rapid/rapid.py:3556 rapid/rpdfile.py:133 msgid "photos" msgstr "фото" #. check subfolder preferences for bad values -#: rapid/rapid.py:2696 rapid/preferencesdialog.py:1619 rapid/rpdfile.py:128 -#: rapid/rpdfile.py:253 +#: rapid/rapid.py:2743 rapid/preferencesdialog.py:1619 rapid/rpdfile.py:135 +#: rapid/rpdfile.py:272 msgid "photo" msgstr "фото" -#: rapid/rapid.py:2723 +#: rapid/rapid.py:2770 #, python-format msgid "%(noFiles)s %(filetypes)s downloaded" msgstr "%(noFiles)s %(filetypes)s загружено" -#: rapid/rapid.py:2727 +#: rapid/rapid.py:2774 #, python-format msgid "%(noFiles)s %(filetypes)s failed to download" msgstr "%(noFiles)s %(filetypes)s не удалось загрузить" -#: rapid/rapid.py:2730 rapid/rapid.py:2782 +#: rapid/rapid.py:2777 rapid/rapid.py:2829 msgid "warnings" msgstr "предупреждения" -#: rapid/rapid.py:2739 +#: rapid/rapid.py:2786 msgid "All downloads complete" msgstr "Все загрузки завершены" -#: rapid/rapid.py:2745 rapid/rapid.py:2754 rapid/rapid.py:2763 -#: rapid/rapid.py:2772 rapid/rapid.py:2780 +#: rapid/rapid.py:2792 rapid/rapid.py:2801 rapid/rapid.py:2810 +#: rapid/rapid.py:2819 rapid/rapid.py:2827 #, python-format msgid "%(number)s %(numberdownloaded)s" msgstr "%(number)s %(numberdownloaded)s" -#: rapid/rapid.py:2747 rapid/rapid.py:2765 +#: rapid/rapid.py:2794 rapid/rapid.py:2812 #, python-format msgid "%(filetype)s downloaded" msgstr "%(filetype)s загружено" -#: rapid/rapid.py:2756 rapid/rapid.py:2774 +#: rapid/rapid.py:2803 rapid/rapid.py:2821 #, python-format msgid "%(filetype)s failed to download" msgstr "%(filetype)s не удалось загрузить" #. e.g.: 3 of 205 photos and videos (202 remaining) -#: rapid/rapid.py:2813 +#: rapid/rapid.py:2860 #, 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:2820 +#: rapid/rapid.py:2867 #, python-format msgid "%(number)s of %(total)s %(filetypes)s" msgstr "%(number)s из %(total)s %(filetypes)s" -#: rapid/rapid.py:3166 +#: rapid/rapid.py:3222 msgid "From" msgstr "Из" -#: rapid/rapid.py:3174 +#: rapid/rapid.py:3230 msgid "Auto Detect" msgstr "Автоопределение" -#: rapid/rapid.py:3178 rapid/preferencesdialog.py:1327 +#: rapid/rapid.py:3234 rapid/preferencesdialog.py:1327 #, python-format msgid "Select a folder containing %(file_types)s" msgstr "Выберите каталог, содержащий %(file_types)s" -#: rapid/rapid.py:3219 +#: rapid/rapid.py:3275 msgid "Copy" msgstr "Копировать" -#: rapid/rapid.py:3232 +#: rapid/rapid.py:3288 msgid "Move" msgstr "Переместить" -#: rapid/rapid.py:3254 +#: rapid/rapid.py:3310 msgid "To" msgstr "к" -#: rapid/rapid.py:3261 rapid/rapid.py:3897 +#: rapid/rapid.py:3317 rapid/rapid.py:3986 msgid "Photos:" msgstr "Фото:" -#: rapid/rapid.py:3264 rapid/preferencesdialog.py:1164 +#: rapid/rapid.py:3320 rapid/preferencesdialog.py:1164 msgid "Select a folder to download photos to" msgstr "Выберите каталог для загрузки фото" -#: rapid/rapid.py:3276 rapid/rapid.py:3897 +#: rapid/rapid.py:3332 rapid/rapid.py:3986 msgid "Videos:" msgstr "Видео:" -#: rapid/rapid.py:3278 rapid/preferencesdialog.py:1182 +#: rapid/rapid.py:3334 rapid/preferencesdialog.py:1182 msgid "Select a folder to download videos to" msgstr "Выберите каталог для загрузки видео" -#: rapid/rapid.py:3470 +#: rapid/rapid.py:3526 msgid "and" msgstr "и" -#: rapid/rapid.py:3475 +#: rapid/rapid.py:3531 msgid "Using backup devices" msgstr "Использование носителя для резервного копирования" -#: rapid/rapid.py:3477 +#: rapid/rapid.py:3533 msgid "Using backup device" msgstr "Использование носителя для резервного копирования" -#: rapid/rapid.py:3479 +#: rapid/rapid.py:3535 msgid "No backup devices detected" msgstr "Не обнаружен носитель для резервных копий" -#: rapid/rapid.py:3506 +#: rapid/rapid.py:3562 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:3518 +#: rapid/rapid.py:3574 #, 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:3522 +#: rapid/rapid.py:3578 #, python-format msgid "%(free)s %(file_type)s" msgstr "Доступно %(free)s для %(file_type)s" @@ -294,88 +295,88 @@ 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:3527 +#: rapid/rapid.py:3583 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:3532 +#: rapid/rapid.py:3588 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:3538 +#: rapid/rapid.py:3594 #, python-format msgid "%(free)s free" msgstr "%(free)s свободно" #. user manually specified the same location for photos and video backups -#: rapid/rapid.py:3546 +#: rapid/rapid.py:3602 #, python-format msgid "Backing up photos and videos to %(path)s" msgstr "Резервное копирование фотографий и видеозаписей в %(path)s" #. user manually specified backup location -#: rapid/rapid.py:3549 +#: rapid/rapid.py:3605 #, python-format msgid "Backing up to %(path)s" msgstr "Резервное копирование в %(path)s" #. user manually specified different locations for photo and video backups -#: rapid/rapid.py:3552 +#: rapid/rapid.py:3608 #, python-format msgid "Backing up photos to %(path)s and videos to %(path2)s" msgstr "" "Резервное копирование фотографий в %(path)s и видеозаписей в %(path2)s" -#: rapid/rapid.py:3559 +#: rapid/rapid.py:3615 #, python-format msgid "%(freespace)s. %(backuppaths)s." msgstr "%(freespace)s. %(backuppaths)s." -#: rapid/rapid.py:3588 +#: rapid/rapid.py:3644 msgid "Program preferences are invalid" msgstr "Настройки программы не корректны" -#: rapid/rapid.py:3707 rapid/rpdfile.py:254 +#: rapid/rapid.py:3770 rapid/rpdfile.py:273 msgid "Photo" msgstr "Фото" -#: rapid/rapid.py:3709 rapid/rpdfile.py:273 +#: rapid/rapid.py:3772 rapid/rpdfile.py:292 msgid "Video" msgstr "Видео" -#: rapid/rapid.py:3718 +#: rapid/rapid.py:3781 #, python-format msgid "%(file_type)s download folder does not exist" msgstr "Указанный для загрузки каталог %(file_type)s не существует" -#: rapid/rapid.py:3720 rapid/rapid.py:3734 rapid/rapid.py:3747 +#: rapid/rapid.py:3783 rapid/rapid.py:3797 rapid/rapid.py:3810 #, python-format msgid "Folder: %s" msgstr "Каталог: %s" -#: rapid/rapid.py:3732 +#: rapid/rapid.py:3795 #, python-format msgid "%(file_type)s download folder is invalid" msgstr "для %(file_type)s папка загрузки указана неверно." -#: rapid/rapid.py:3745 +#: rapid/rapid.py:3808 #, python-format msgid "%(file_type)s download folder is not writable" msgstr "каталог для %(file_type)s доступен только для чтения" -#: rapid/rapid.py:3831 +#: rapid/rapid.py:3894 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:3878 +#: rapid/rapid.py:3949 #, python-format msgid "" "display program information on the command line as the program runs " @@ -384,30 +385,55 @@ msgstr "" "выводить информацию в командной строке во время выполнения программы (по " "умолчанию: %default)" -#: rapid/rapid.py:3879 +#: rapid/rapid.py:3950 msgid "display debugging information when run from the command line" msgstr "отображать отладочную информацию при запуске из командной строки" -#: rapid/rapid.py:3880 +#: rapid/rapid.py:3951 msgid "only output errors to the command line" msgstr "выводить в командную строку только ошибки" #. image file extensions are recognized RAW files plus TIFF and JPG -#: rapid/rapid.py:3882 +#: rapid/rapid.py:3953 msgid "list photo and video file extensions the program recognizes and exit" msgstr "" "вывести расширения фото- и видеофайлов, которые распознает программа, и выйти" -#: rapid/rapid.py:3884 +#: rapid/rapid.py:3955 +msgid "" +"automatically detect devices from which to download, overwriting existing " +"program preferences" +msgstr "" +"автоматически определять устройство, с которого будет производиться " +"загрузка, заменяя существующие настройки программы" + +#: rapid/rapid.py:3956 +msgid "" +"manually specify the PATH of the device from which to download, overwriting " +"existing program preferences" +msgstr "" +"самостоятельно укажите расположение (PATH) устройства, с которого будет " +"производиться загрузка, заменяя существующие настройки программы" + +#: rapid/rapid.py:3957 msgid "reset all program settings and preferences and exit" msgstr "сбросить все настройки и выйти" -#: rapid/rapid.py:3902 +#: rapid/rapid.py:3970 +msgid "" +"Error: specify device auto-detection or manually specify a device's path " +"from which to download, but do not do both." +msgstr "" +"Ошибка: укажите автоматическое определение устройства или самостоятельно " +"укажите расположение устройства, с которого будет производиться загрузка, но " +"не используйте сразу оба варианта." + +#: rapid/rapid.py:3991 #, python-format msgid "and %s" msgstr "и %s" -#: rapid/rapid.py:3910 +#: rapid/rapid.py:3999 msgid "All settings and preferences have been reset" msgstr "Все установки и настройки были сброшены" @@ -1373,11 +1399,17 @@ msgstr "Была ошибка при резевном копировании" msgid "%(previousproblem)s, and %(backinguperror)s" msgstr "%(previousproblem)s, еще %(backinguperror)s" -#: rapid/rpdfile.py:142 +#: rapid/rpdfile.py:153 #, python-format msgid "%(number)s %(filetypes)s" msgstr "%(number)s %(filetypes)s" +#: rapid/rpdfile.py:163 +#, python-format +msgid "scanning (found %(photos)s photos and %(videos)s videos)..." +msgstr "" +"проверка (найдено %(photos)s фотографий и %(videos)s видеозаписей)..." + #: rapid/subfolderfile.py:80 #, python-format msgid "%(hour)s:%(minute)s:%(second)s:%(subsecond)s" @@ -1,28 +1,28 @@ # Serbian translation for rapid # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the rapid package. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2010. -# +# Мирослав Николић <miroslavnikolic@rocketmail.com>, 2012. msgid "" msgstr "" "Project-Id-Version: rapid\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" -"POT-Creation-Date: 2011-11-20 13:25-0600\n" -"PO-Revision-Date: 2011-11-21 09:55+0000\n" -"Last-Translator: Miloš Popović <gpopac@gmail.com>\n" -"Language-Team: Serbian <sr@li.org>\n" +"POT-Creation-Date: 2012-06-23 04:00-0500\n" +"PO-Revision-Date: 2012-10-30 08:48+0000\n" +"Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n" +"Language-Team: Serbian translators\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-12-28 07:56+0000\n" -"X-Generator: Launchpad (build 14560)\n" +"X-Launchpad-Export-Date: 2012-11-26 19:04+0000\n" +"X-Generator: Launchpad (build 16309)\n" +"Language: sr\n" #. Translators: if neccessary, for guidance in how to translate this program, you may see http://damonlynch.net/translate.html -#: rapid/rapid.py:107 rapid/rapid.py:1699 rapid/glade3/rapid.ui.h:14 +#: rapid/rapid.py:112 rapid/rapid.py:1784 rapid/glade3/rapid.ui.h:1 msgid "Rapid Photo Downloader" msgstr "Брзи преносилац фотографија" -#: rapid/rapid.py:112 +#: rapid/rapid.py:117 #, python-format msgid "" "%(date)s\n" @@ -31,33 +31,33 @@ msgstr "" "%(date)s\n" "%(time)s" -#: rapid/rapid.py:114 +#: rapid/rapid.py:119 #, python-format msgid "%(date)s %(time)s" msgstr "%(date)s %(time)s" -#: rapid/rapid.py:117 +#: rapid/rapid.py:122 #, 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:152 +#: rapid/rapid.py:157 msgid "Device" msgstr "Уређај" #. Size refers to the total size of images on the device, typically in #. MB or GB -#: rapid/rapid.py:170 +#: rapid/rapid.py:175 msgid "Size" msgstr "Величина" -#: rapid/rapid.py:173 +#: rapid/rapid.py:178 msgid "Download Progress" msgstr "Напредак преузимања" -#: rapid/rapid.py:319 +#: rapid/rapid.py:336 #, python-format msgid "%(device)s did not unmount" msgstr "%(device)s није демонтиран" @@ -66,22 +66,22 @@ msgstr "%(device)s није демонтиран" #. 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:1186 +#: rapid/rapid.py:1216 msgid "scanning..." msgstr "претражујем уређај..." #. this location is a human readable explanation for /, and is inserted into Downloading from %(location)s -#: rapid/rapid.py:1697 +#: rapid/rapid.py:1782 msgid "the root of the file system" msgstr "почетни директоријум система датотека" #. message in dialog box which asks the user if they really want to be downloading from this location -#: rapid/rapid.py:1701 +#: rapid/rapid.py:1786 #, python-format msgid "Downloading from %(location)s." msgstr "Преузми са %(location)s." -#: rapid/rapid.py:1702 +#: rapid/rapid.py:1787 msgid "" "Do you really want to download from here? On some systems, scanning this " "location can take a very long time." @@ -89,15 +89,15 @@ msgstr "" "Да ли заиста желите да преузмете слике одавде? На неким системима " "претраживање те путање може да потраје." -#: rapid/rapid.py:2124 rapid/glade3/rapid.ui.h:5 +#: rapid/rapid.py:2209 msgid "Download" msgstr "Преузми" -#: rapid/rapid.py:2127 +#: rapid/rapid.py:2212 msgid "Pause" msgstr "Паузирај" -#: rapid/rapid.py:2228 +#: rapid/rapid.py:2317 #, python-format msgid "" "These download folders are invalid:\n" @@ -108,7 +108,7 @@ msgstr "" "%(folder1)s\n" "%(folder2)s" -#: rapid/rapid.py:2231 +#: rapid/rapid.py:2320 #, python-format msgid "" "This download folder is invalid:\n" @@ -117,176 +117,176 @@ msgstr "" "Следећа фасцикла за преузимање је неисправна:\n" "%s" -#: rapid/rapid.py:2232 +#: rapid/rapid.py:2321 msgid "Download cannot proceed" msgstr "Не могу да наставим преузимање" -#: rapid/rapid.py:2559 +#: rapid/rapid.py:2700 msgid "About 1 second remaining" msgstr "Преостала је 1 секунда" -#: rapid/rapid.py:2561 +#: rapid/rapid.py:2702 #, python-format msgid "About %i seconds remaining" msgstr "Преостало је %i секунди" -#: rapid/rapid.py:2563 +#: rapid/rapid.py:2704 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:2568 +#: rapid/rapid.py:2709 #, python-format msgid "About %(minutes)i:%(seconds)02i minutes remaining" msgstr "Преостало је %(minutes)i:%(seconds)02i" -#: rapid/rapid.py:2590 rapid/rpdfile.py:113 +#: rapid/rapid.py:2731 rapid/rpdfile.py:123 msgid "photos and videos" msgstr "фотографије и видео" -#: rapid/rapid.py:2592 rapid/rpdfile.py:115 +#: rapid/rapid.py:2733 rapid/rpdfile.py:125 msgid "photos or videos" msgstr "фотографије или видео" -#: rapid/rapid.py:2595 rapid/rapid.py:3408 rapid/rpdfile.py:118 +#: rapid/rapid.py:2736 rapid/rapid.py:3558 rapid/rpdfile.py:128 msgid "videos" msgstr "видео" -#: rapid/rapid.py:2597 rapid/preferencesdialog.py:1617 rapid/rpdfile.py:120 -#: rapid/rpdfile.py:254 +#: rapid/rapid.py:2738 rapid/preferencesdialog.py:1620 rapid/rpdfile.py:130 +#: rapid/rpdfile.py:291 msgid "video" msgstr "видео" -#: rapid/rapid.py:2600 rapid/rapid.py:3406 rapid/rpdfile.py:123 +#: rapid/rapid.py:2741 rapid/rapid.py:3556 rapid/rpdfile.py:133 msgid "photos" msgstr "фотографије" #. check subfolder preferences for bad values -#: rapid/rapid.py:2602 rapid/preferencesdialog.py:1616 rapid/rpdfile.py:125 -#: rapid/rpdfile.py:234 +#: rapid/rapid.py:2743 rapid/preferencesdialog.py:1619 rapid/rpdfile.py:135 +#: rapid/rpdfile.py:272 msgid "photo" msgstr "фотографија" -#: rapid/rapid.py:2629 +#: rapid/rapid.py:2770 #, python-format msgid "%(noFiles)s %(filetypes)s downloaded" msgstr "%(noFiles)s %(filetypes)s преузето" -#: rapid/rapid.py:2633 +#: rapid/rapid.py:2774 #, python-format msgid "%(noFiles)s %(filetypes)s failed to download" msgstr "%(noFiles)s %(filetypes)s није преузето" -#: rapid/rapid.py:2636 rapid/rapid.py:2688 +#: rapid/rapid.py:2777 rapid/rapid.py:2829 msgid "warnings" msgstr "упозорења" -#: rapid/rapid.py:2645 +#: rapid/rapid.py:2786 msgid "All downloads complete" msgstr "Сва преузимања су завршена" -#: rapid/rapid.py:2651 rapid/rapid.py:2660 rapid/rapid.py:2669 -#: rapid/rapid.py:2678 rapid/rapid.py:2686 +#: rapid/rapid.py:2792 rapid/rapid.py:2801 rapid/rapid.py:2810 +#: rapid/rapid.py:2819 rapid/rapid.py:2827 #, python-format msgid "%(number)s %(numberdownloaded)s" msgstr "%(number)s %(numberdownloaded)s" -#: rapid/rapid.py:2653 rapid/rapid.py:2671 +#: rapid/rapid.py:2794 rapid/rapid.py:2812 #, python-format msgid "%(filetype)s downloaded" msgstr "%(filetype)s преузето" -#: rapid/rapid.py:2662 rapid/rapid.py:2680 +#: rapid/rapid.py:2803 rapid/rapid.py:2821 #, python-format msgid "%(filetype)s failed to download" msgstr "%(filetype)s није преузето" #. e.g.: 3 of 205 photos and videos (202 remaining) -#: rapid/rapid.py:2719 +#: rapid/rapid.py:2860 #, 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:2726 +#: rapid/rapid.py:2867 #, python-format msgid "%(number)s of %(total)s %(filetypes)s" msgstr "%(number)s од %(total)s %(filetypes)s" -#: rapid/rapid.py:3072 +#: rapid/rapid.py:3222 msgid "From" msgstr "Од" -#: rapid/rapid.py:3080 +#: rapid/rapid.py:3230 msgid "Auto Detect" msgstr "Сам одреди" -#: rapid/rapid.py:3084 rapid/preferencesdialog.py:1324 +#: rapid/rapid.py:3234 rapid/preferencesdialog.py:1327 #, python-format msgid "Select a folder containing %(file_types)s" msgstr "Изаберите фасциклу која садржи %(file_types)s" -#: rapid/rapid.py:3125 +#: rapid/rapid.py:3275 msgid "Copy" -msgstr "Копирај" +msgstr "Умножи" -#: rapid/rapid.py:3138 +#: rapid/rapid.py:3288 msgid "Move" msgstr "Премести" -#: rapid/rapid.py:3160 +#: rapid/rapid.py:3310 msgid "To" msgstr "У" -#: rapid/rapid.py:3167 rapid/rapid.py:3796 +#: rapid/rapid.py:3317 rapid/rapid.py:3986 msgid "Photos:" msgstr "Фотографије:" -#: rapid/rapid.py:3170 rapid/preferencesdialog.py:1161 +#: rapid/rapid.py:3320 rapid/preferencesdialog.py:1164 msgid "Select a folder to download photos to" msgstr "Изаберите фасциклу за чување фотографија" -#: rapid/rapid.py:3182 rapid/rapid.py:3796 +#: rapid/rapid.py:3332 rapid/rapid.py:3986 msgid "Videos:" msgstr "Видео:" -#: rapid/rapid.py:3184 rapid/preferencesdialog.py:1179 +#: rapid/rapid.py:3334 rapid/preferencesdialog.py:1182 msgid "Select a folder to download videos to" msgstr "Изаберите фасциклу за смештање преузетог видеа" -#: rapid/rapid.py:3376 +#: rapid/rapid.py:3526 msgid "and" msgstr "и" -#: rapid/rapid.py:3381 +#: rapid/rapid.py:3531 msgid "Using backup devices" msgstr "Употреба резервних уређаја" -#: rapid/rapid.py:3383 +#: rapid/rapid.py:3533 msgid "Using backup device" msgstr "Употреба резервног уређаја" -#: rapid/rapid.py:3385 +#: rapid/rapid.py:3535 msgid "No backup devices detected" msgstr "Нису изабрани резервни уређаји" -#: rapid/rapid.py:3412 +#: rapid/rapid.py:3562 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:3424 +#: rapid/rapid.py:3574 #, 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:3428 +#: rapid/rapid.py:3578 #, python-format msgid "%(free)s %(file_type)s" msgstr "%(free)s %(file_type)s" @@ -294,87 +294,87 @@ 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:3433 +#: rapid/rapid.py:3583 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:3438 +#: rapid/rapid.py:3588 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:3444 +#: rapid/rapid.py:3594 #, python-format msgid "%(free)s free" msgstr "%(free)s слободно" #. user manually specified the same location for photos and video backups -#: rapid/rapid.py:3452 +#: rapid/rapid.py:3602 #, python-format msgid "Backing up photos and videos to %(path)s" -msgstr "Направи резервну копију слика и видеа у %(path)s" +msgstr "Направи резерву слика и видеа у %(path)s" #. user manually specified backup location -#: rapid/rapid.py:3455 +#: rapid/rapid.py:3605 #, python-format msgid "Backing up to %(path)s" msgstr "Правим резерву у %(path)s" #. user manually specified different locations for photo and video backups -#: rapid/rapid.py:3458 +#: rapid/rapid.py:3608 #, python-format msgid "Backing up photos to %(path)s and videos to %(path2)s" -msgstr "Правим резервну копију слика у %(path)s и видеа у %(path2)s" +msgstr "Правим резерву слика у %(path)s и видеа у %(path2)s" -#: rapid/rapid.py:3465 +#: rapid/rapid.py:3615 #, python-format msgid "%(freespace)s. %(backuppaths)s." msgstr "%(freespace)s. у %(backuppaths)s." -#: rapid/rapid.py:3494 +#: rapid/rapid.py:3644 msgid "Program preferences are invalid" msgstr "Подешавања програма су неисправна" -#: rapid/rapid.py:3613 rapid/rpdfile.py:235 +#: rapid/rapid.py:3770 rapid/rpdfile.py:273 msgid "Photo" msgstr "Фотографија" -#: rapid/rapid.py:3615 rapid/rpdfile.py:255 +#: rapid/rapid.py:3772 rapid/rpdfile.py:292 msgid "Video" msgstr "Видео" -#: rapid/rapid.py:3624 +#: rapid/rapid.py:3781 #, python-format msgid "%(file_type)s download folder does not exist" msgstr "Фасцикла за преузимање %(file_type)s датотека не постоји" -#: rapid/rapid.py:3626 rapid/rapid.py:3640 rapid/rapid.py:3653 +#: rapid/rapid.py:3783 rapid/rapid.py:3797 rapid/rapid.py:3810 #, python-format msgid "Folder: %s" msgstr "Фасцикла: %s" -#: rapid/rapid.py:3638 +#: rapid/rapid.py:3795 #, python-format msgid "%(file_type)s download folder is invalid" msgstr "Фасцикла за преузимање %(file_type)s датотека је неисправна" -#: rapid/rapid.py:3651 +#: rapid/rapid.py:3808 #, python-format msgid "%(file_type)s download folder is not writable" msgstr "Фасцикла за преузимање %(file_type)s датотека је неуписива" -#: rapid/rapid.py:3729 +#: rapid/rapid.py:3894 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:3777 +#: rapid/rapid.py:3949 #, python-format msgid "" "display program information on the command line as the program runs " @@ -383,43 +383,68 @@ msgstr "" "исписује податке о програму у командној линији док је покренут програм " "(подразумевано: %default)" -#: rapid/rapid.py:3778 +#: rapid/rapid.py:3950 msgid "display debugging information when run from the command line" msgstr "" -"прикажи податке за тражење грешки у програму при покретању из командне линије" +"приказује податке за тражење грешака у програму при покретању из командне " +"линије" -#: rapid/rapid.py:3779 +#: rapid/rapid.py:3951 msgid "only output errors to the command line" msgstr "исписује грешке само у командној линији" #. image file extensions are recognized RAW files plus TIFF and JPG -#: rapid/rapid.py:3781 +#: rapid/rapid.py:3953 msgid "list photo and video file extensions the program recognizes and exit" -msgstr "исписује екстензије подржаних слика и видеа и напушта програма" +msgstr "исписује проширења подржаних слика и видеа и напушта програм" + +#: rapid/rapid.py:3955 +msgid "" +"automatically detect devices from which to download, overwriting existing " +"program preferences" +msgstr "" +"сам открива уређаје са којих ће да преузима, преписујући постојеће поставке " +"програма" + +#: rapid/rapid.py:3956 +msgid "" +"manually specify the PATH of the device from which to download, overwriting " +"existing program preferences" +msgstr "" +"ручно наводи ПУТАЊУ уређаја са којих ће да преузима, преписујући постојеће " +"поставке програма" -#: rapid/rapid.py:3783 +#: rapid/rapid.py:3957 msgid "reset all program settings and preferences and exit" msgstr "враћа све поставке на подразумевано и напушта програм" -#: rapid/rapid.py:3801 +#: rapid/rapid.py:3970 +msgid "" +"Error: specify device auto-detection or manually specify a device's path " +"from which to download, but do not do both." +msgstr "" +"Грешка: наведите самооткривање уређаја или ручно наведите путању уређаја са " +"којих вршити преузимање, али немојте оба истовремено." + +#: rapid/rapid.py:3991 #, python-format msgid "and %s" msgstr "и %s" -#: rapid/rapid.py:3809 +#: rapid/rapid.py:3999 msgid "All settings and preferences have been reset" msgstr "Сва подешавања су враћена на подразумеване вредности" -#: rapid/backupfile.py:142 rapid/backupfile.py:165 +#: rapid/backupfile.py:157 rapid/backupfile.py:180 msgid "Backing up error" -msgstr "Грешка приликом образовања резервне копије" +msgstr "Грешка прављења резерве" -#: rapid/backupfile.py:144 +#: rapid/backupfile.py:159 #, python-format msgid "Destination directory could not be created: %(directory)s\n" msgstr "Не могу да направим циљни директоријум: %(directory)s\n" -#: rapid/backupfile.py:146 rapid/backupfile.py:167 rapid/subfolderfile.py:196 +#: rapid/backupfile.py:161 rapid/backupfile.py:182 rapid/subfolderfile.py:199 #, python-format msgid "" "Source: %(source)s\n" @@ -428,13 +453,13 @@ msgstr "" "Извор: %(source)s\n" "Циљ: %(destination)s" -#: rapid/backupfile.py:149 rapid/backupfile.py:169 +#: rapid/backupfile.py:164 rapid/backupfile.py:184 #, python-format msgid "Error: %(inst)s" msgstr "Грешка: %(inst)s" -#: rapid/copyfiles.py:159 rapid/subfolderfile.py:211 -#: rapid/subfolderfile.py:352 rapid/subfolderfile.py:370 +#: rapid/copyfiles.py:163 rapid/subfolderfile.py:214 +#: rapid/subfolderfile.py:347 rapid/subfolderfile.py:365 #, python-format msgid "" "%(problem)s\n" @@ -443,491 +468,501 @@ msgstr "" "%(problem)s\n" "Датотека: %(file)s" -#: rapid/device.py:79 +#: rapid/device.py:80 msgid "Device Detected" msgstr "Пронађен је нови уређај" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#usedeviceprompt -#: rapid/device.py:88 +#: rapid/device.py:89 msgid "" "Should this device or partition be used to download photos or videos from?" -msgstr "Да ли да преузимам фотографије или видео са овог уређаја/партиције?" +msgstr "Да ли да преузмем фотографије или видео са овог уређаја/партиције?" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#usedeviceprompt -#: rapid/device.py:107 +#: rapid/device.py:108 msgid "_Remember this choice" msgstr "_Запамти овај избор" -#: rapid/downloadtracker.py:298 +#: rapid/downloadtracker.py:299 msgid "MB/s" msgstr "MB/s" -#: rapid/generatenameconfig.py:150 +#: rapid/generatenameconfig.py:151 msgid "Date time" msgstr "Датум" -#: rapid/generatenameconfig.py:151 +#: rapid/generatenameconfig.py:152 msgid "Text" msgstr "Текст" -#: rapid/generatenameconfig.py:152 +#: rapid/generatenameconfig.py:153 msgid "Filename" -msgstr "Име датотеке" +msgstr "Назив датотеке" -#: rapid/generatenameconfig.py:153 +#: rapid/generatenameconfig.py:154 msgid "Metadata" msgstr "Метаподаци" -#: rapid/generatenameconfig.py:154 +#: rapid/generatenameconfig.py:155 msgid "Sequences" msgstr "Низови" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode -#: rapid/generatenameconfig.py:156 rapid/preferencesdialog.py:574 +#: rapid/generatenameconfig.py:157 rapid/preferencesdialog.py:577 msgid "Job code" msgstr "Код задатка" -#: rapid/generatenameconfig.py:157 +#: rapid/generatenameconfig.py:158 msgid "Image date" msgstr "Датум фотографије" -#: rapid/generatenameconfig.py:158 +#: rapid/generatenameconfig.py:159 msgid "Video date" msgstr "Датум видеа" -#: rapid/generatenameconfig.py:159 +#: rapid/generatenameconfig.py:160 msgid "Today" msgstr "Данас" -#: rapid/generatenameconfig.py:160 +#: rapid/generatenameconfig.py:161 msgid "Yesterday" msgstr "Јуче" #. Translators: Download time is the time and date that the download started (when the user clicked the Download button) -#: rapid/generatenameconfig.py:162 +#: rapid/generatenameconfig.py:163 msgid "Download time" msgstr "Датум преузимања" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:164 +#: rapid/generatenameconfig.py:165 msgid "Name + extension" msgstr "Назив + наставак" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:166 +#: rapid/generatenameconfig.py:167 msgid "Name" msgstr "Назив" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:168 +#: rapid/generatenameconfig.py:169 msgid "Extension" msgstr "Наставак" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:170 +#: rapid/generatenameconfig.py:171 msgid "Image number" msgstr "Број слике" -#: rapid/generatenameconfig.py:171 +#: rapid/generatenameconfig.py:172 msgid "Video number" msgstr "Број видеа" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:173 +#: rapid/generatenameconfig.py:174 msgid "Aperture" msgstr "Отвор бленде" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:175 +#: rapid/generatenameconfig.py:176 msgid "ISO" msgstr "ИСО" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:177 +#: rapid/generatenameconfig.py:178 msgid "Exposure time" -msgstr "Време експозиције" +msgstr "Време излагања" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:179 +#: rapid/generatenameconfig.py:180 msgid "Focal length" msgstr "Жижна даљина" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:181 +#: rapid/generatenameconfig.py:182 msgid "Camera make" -msgstr "Произвођач фотоапарата" +msgstr "Произвођач фото-апарата" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:183 +#: rapid/generatenameconfig.py:184 msgid "Camera model" -msgstr "Модел фотоапарата" +msgstr "Модел фото-апарата" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:185 +#: rapid/generatenameconfig.py:186 msgid "Short camera model" -msgstr "Скраћени назив фотоапарата" +msgstr "Скраћени назив фото-апарата" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:187 +#: rapid/generatenameconfig.py:188 msgid "Hyphenated short camera model" -msgstr "Дужи назив фотоапарата" +msgstr "Дужи назив фото-апарата" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:189 +#: rapid/generatenameconfig.py:190 msgid "Serial number" msgstr "Серијски број" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:191 +#: rapid/generatenameconfig.py:192 msgid "Shutter count" msgstr "Број окидања" #. File number currently refers to the Exif value Exif.Canon.FileNumber -#: rapid/generatenameconfig.py:193 +#: rapid/generatenameconfig.py:194 msgid "File number" msgstr "Број датотеке" #. Only the folder component of the Exif.Canon.FileNumber value -#: rapid/generatenameconfig.py:195 +#: rapid/generatenameconfig.py:196 msgid "Folder only" msgstr "Само фасцикла" #. The folder and file component of the Exif.Canon.FileNumber value -#: rapid/generatenameconfig.py:197 +#: rapid/generatenameconfig.py:198 msgid "Folder and file" msgstr "Фасцикла и датотека" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:199 +#: rapid/generatenameconfig.py:200 msgid "Owner name" msgstr "Име власника" -#: rapid/generatenameconfig.py:200 +#: rapid/generatenameconfig.py:201 msgid "Codec" msgstr "Кодек" -#: rapid/generatenameconfig.py:201 +#: rapid/generatenameconfig.py:202 msgid "Width" msgstr "Ширина" -#: rapid/generatenameconfig.py:202 +#: rapid/generatenameconfig.py:203 msgid "Height" msgstr "Висина" -#: rapid/generatenameconfig.py:203 +#: rapid/generatenameconfig.py:204 msgid "Length" msgstr "Дужина" -#: rapid/generatenameconfig.py:204 +#: rapid/generatenameconfig.py:205 msgid "Frames Per Second" msgstr "Кадрова у секунди" -#: rapid/generatenameconfig.py:205 +#: rapid/generatenameconfig.py:206 msgid "Artist" msgstr "Аутор" -#: rapid/generatenameconfig.py:206 +#: rapid/generatenameconfig.py:207 msgid "Copyright" msgstr "Ауторска права" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#sequencenumbers -#: rapid/generatenameconfig.py:208 +#: rapid/generatenameconfig.py:209 msgid "Downloads today" msgstr "Данашња преузимања" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#sequencenumbers -#: rapid/generatenameconfig.py:210 +#: rapid/generatenameconfig.py:211 msgid "Session number" msgstr "Број сесије" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#sequencenumbers -#: rapid/generatenameconfig.py:212 +#: rapid/generatenameconfig.py:213 msgid "Subfolder number" msgstr "Број подфасцикле" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#sequencenumbers -#: rapid/generatenameconfig.py:214 +#: rapid/generatenameconfig.py:215 msgid "Stored number" msgstr "Сачувани број" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#sequenceletters -#: rapid/generatenameconfig.py:216 +#: rapid/generatenameconfig.py:217 msgid "Sequence letter" msgstr "Низ слова" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:218 +#: rapid/generatenameconfig.py:219 msgid "All digits" msgstr "Све цифре" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:220 +#: rapid/generatenameconfig.py:221 msgid "Last digit" msgstr "Последње цифре" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:222 +#: rapid/generatenameconfig.py:223 msgid "Last 2 digits" msgstr "Последње две цифре" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:224 +#: rapid/generatenameconfig.py:225 msgid "Last 3 digits" msgstr "Последње три цифре" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:226 +#: rapid/generatenameconfig.py:227 msgid "Last 4 digits" msgstr "Последње четири цифре" #. Translators: please not the capitalization of this text, and keep it the same if your language features capitalization -#: rapid/generatenameconfig.py:228 +#: rapid/generatenameconfig.py:229 msgid "Original Case" msgstr "Оригинална величина слова" #. Translators: please not the capitalization of this text, and keep it the same if your language features capitalization -#: rapid/generatenameconfig.py:230 +#: rapid/generatenameconfig.py:231 msgid "UPPERCASE" msgstr "ВЕЛИКА СЛОВА" #. Translators: please not the capitalization of this text, and keep it the same if your language features capitalization -#: rapid/generatenameconfig.py:232 +#: rapid/generatenameconfig.py:233 msgid "lowercase" msgstr "мала слова" -#: rapid/generatenameconfig.py:233 +#: rapid/generatenameconfig.py:234 msgid "One digit" msgstr "Једна цифра" -#: rapid/generatenameconfig.py:234 +#: rapid/generatenameconfig.py:235 msgid "Two digits" msgstr "Две цифре" -#: rapid/generatenameconfig.py:235 +#: rapid/generatenameconfig.py:236 msgid "Three digits" msgstr "Три цифре" -#: rapid/generatenameconfig.py:236 +#: rapid/generatenameconfig.py:237 msgid "Four digits" msgstr "Четири цифре" -#: rapid/generatenameconfig.py:237 +#: rapid/generatenameconfig.py:238 msgid "Five digits" msgstr "Пет цифре" -#: rapid/generatenameconfig.py:238 +#: rapid/generatenameconfig.py:239 msgid "Six digits" msgstr "Шест цифре" -#: rapid/generatenameconfig.py:239 +#: rapid/generatenameconfig.py:240 msgid "Seven digits" msgstr "Седам цифара" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:241 +#: rapid/generatenameconfig.py:242 msgid "Subseconds" msgstr "Стотинке" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:243 +#: rapid/generatenameconfig.py:244 msgid "YYYYMMDD" msgstr "ГГГГММДД" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:245 +#: rapid/generatenameconfig.py:246 msgid "YYYY-MM-DD" msgstr "ГГГГ-ММ-ДД" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:247 +#: rapid/generatenameconfig.py:248 msgid "YYMMDD" msgstr "ГГММДД" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:249 +#: rapid/generatenameconfig.py:250 msgid "YY-MM-DD" msgstr "ГГ-ММ-ДД" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:251 +#: rapid/generatenameconfig.py:252 msgid "MMDDYYYY" msgstr "ММДДГГГГ" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:253 +#: rapid/generatenameconfig.py:254 msgid "MMDDYY" msgstr "ММДДГГ" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:255 +#: rapid/generatenameconfig.py:256 msgid "MMDD" msgstr "ММДД" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:257 +#: rapid/generatenameconfig.py:258 msgid "DDMMYYYY" msgstr "ДДММГГГГ" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:259 +#: rapid/generatenameconfig.py:260 msgid "DDMMYY" msgstr "ДДММГГ" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:261 +#: rapid/generatenameconfig.py:262 msgid "YYYY" msgstr "ГГГГ" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:263 +#: rapid/generatenameconfig.py:264 msgid "YY" msgstr "ГГ" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:265 +#: rapid/generatenameconfig.py:266 msgid "MM" msgstr "ММ" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:267 +#: rapid/generatenameconfig.py:268 msgid "DD" msgstr "ДД" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:269 +#: rapid/generatenameconfig.py:270 +msgid "Month (full)" +msgstr "Месец (пун)" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:272 +msgid "Month (abbreviated)" +msgstr "Месец (скраћен)" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:274 msgid "HHMMSS" msgstr "ЧЧММСС" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:271 +#: rapid/generatenameconfig.py:276 msgid "HHMM" msgstr "ЧЧММ" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:273 +#: rapid/generatenameconfig.py:278 msgid "HH-MM-SS" msgstr "ЧЧ-ММ-СС" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:275 +#: rapid/generatenameconfig.py:280 msgid "HH-MM" msgstr "ЧЧ-ММ" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:277 +#: rapid/generatenameconfig.py:282 msgid "HH" msgstr "ЧЧ" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:279 +#: rapid/generatenameconfig.py:284 msgid "MM (minutes)" msgstr "ММ (минута)" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:281 +#: rapid/generatenameconfig.py:286 msgid "SS" msgstr "СС" -#: rapid/preferencesdialog.py:371 +#: rapid/preferencesdialog.py:374 #, python-format msgid "Subfolder preferences should not start with a %s" msgstr "Подешавања подфасцикле не треба да почиње са %s" -#: rapid/preferencesdialog.py:373 +#: rapid/preferencesdialog.py:376 #, python-format msgid "Subfolder preferences should not end with a %s" msgstr "Подешавања подфасцикле не треба да се завршава са %s" -#: rapid/preferencesdialog.py:377 +#: rapid/preferencesdialog.py:380 #, python-format msgid "Subfolder preferences should not contain two %s one after the other" msgstr "Подешавања подфасцикле не треба да садржи два %s један за другим" -#: rapid/preferencesdialog.py:436 rapid/preferencesdialog.py:697 +#: rapid/preferencesdialog.py:439 rapid/preferencesdialog.py:700 msgid "Remove all Job Codes?" msgstr "Да уклоним све кодове задатка?" -#: rapid/preferencesdialog.py:437 rapid/preferencesdialog.py:714 +#: rapid/preferencesdialog.py:440 rapid/preferencesdialog.py:717 msgid "Should all Job Codes be removed?" msgstr "Да ли да уклоним све кодове задатка?" -#: rapid/preferencesdialog.py:443 +#: rapid/preferencesdialog.py:446 msgid "Remove all Remembered Paths?" msgstr "Да уклоним све запамћене путање?" -#: rapid/preferencesdialog.py:444 +#: rapid/preferencesdialog.py:447 msgid "Should all remembered paths be removed?" msgstr "Да ли да уклоним све запамћене путање?" -#: rapid/preferencesdialog.py:450 +#: rapid/preferencesdialog.py:453 msgid "Remove all Ignored Paths?" msgstr "Да уклоним све занемарене путање?" -#: rapid/preferencesdialog.py:451 +#: rapid/preferencesdialog.py:454 msgid "Should all ignored paths be removed?" msgstr "Да ли да уклоним све занемарене путање?" -#: rapid/preferencesdialog.py:462 +#: rapid/preferencesdialog.py:465 msgid "Error in Photo Rename preferences" msgstr "Грешка у поставкама за преименовање фотографија" -#: rapid/preferencesdialog.py:642 +#: rapid/preferencesdialog.py:645 msgid "Error in Video Rename preferences" msgstr "Грешка у поставкама за преименовање видеа" -#: rapid/preferencesdialog.py:663 +#: rapid/preferencesdialog.py:666 msgid "Error in Photo Download Subfolders preferences" -msgstr "Грешка у поставкама субфасцикли за преузете фотографије" +msgstr "Грешка у поставкама подфасцикли за преузете фотографије" -#: rapid/preferencesdialog.py:680 +#: rapid/preferencesdialog.py:683 msgid "Error in Video Download Subfolders preferences" -msgstr "Грешка у поставкама субфасцикли за преузет видео" +msgstr "Грешка у поставкама подфасцикли за преузет видео" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode -#: rapid/preferencesdialog.py:739 +#: rapid/preferencesdialog.py:742 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:755 +#: rapid/preferencesdialog.py:758 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:758 +#: rapid/preferencesdialog.py:761 msgid "Enter a new Job Code" msgstr "Упишите нови код задатка" -#: rapid/preferencesdialog.py:763 +#: rapid/preferencesdialog.py:766 msgid "Job Code:" msgstr "Код задатка:" -#: rapid/preferencesdialog.py:819 +#: rapid/preferencesdialog.py:822 msgid "Enter a Path to Ignore" msgstr "Унесите путање за занемаривање" -#: rapid/preferencesdialog.py:831 +#: rapid/preferencesdialog.py:834 msgid "Specify a path that will never be scanned for photos or videos" msgstr "Одредите путање са којих никада не желите да преузмете слике и видео" -#: rapid/preferencesdialog.py:836 +#: rapid/preferencesdialog.py:839 msgid "Path:" msgstr "Путања:" -#: rapid/preferencesdialog.py:1079 +#: rapid/preferencesdialog.py:1082 msgid "Job Code" msgstr "Код задатка" -#: rapid/preferencesdialog.py:1350 +#: rapid/preferencesdialog.py:1353 msgid "Select a folder in which to backup photos" msgstr "Изаберите фасциклу за резерве фотографија" -#: rapid/preferencesdialog.py:1363 +#: rapid/preferencesdialog.py:1366 msgid "Select a folder in which to backup videos" 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:1458 +#: rapid/preferencesdialog.py:1461 msgid "" "<i><b>Warning:</b> There is insufficient metadata to fully generate the " "name. Please use other renaming options.</i>" @@ -935,7 +970,7 @@ msgstr "" "<i><b>Упозорење:</b> Нема довољно метаподатака за образовање пуног имена. " "Искористите друге опције за преименовање.</i>" -#: rapid/preferencesdialog.py:1509 +#: rapid/preferencesdialog.py:1512 msgid "" "<i><b>Warning:</b> There is insufficient metadata to fully generate " "subfolders. Please use other subfolder naming options.</i>" @@ -944,13 +979,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:1512 +#: rapid/preferencesdialog.py:1515 #, python-format msgid "<i>Example: %s</i>" msgstr "<i>Пример: %s</i>" #. Preferences list is now empty -#: rapid/preferencesdialog.py:1602 +#: rapid/preferencesdialog.py:1605 #, python-format msgid "" "The %(filetype)s subfolder preferences entered are invalid and cannot be " @@ -961,7 +996,7 @@ msgstr "" "коришћене.\n" "Враћам поставке на подразумеване вредности." -#: rapid/preferencesdialog.py:1747 +#: rapid/preferencesdialog.py:1750 #, python-format msgid "" "The following regular expressions are invalid, and will be removed unless " @@ -971,7 +1006,7 @@ msgstr "" "Следећи изрази су неисправни и биће уклоњени уколико их не поправите:\n" " %s" -#: rapid/preferencesdialog.py:1749 +#: rapid/preferencesdialog.py:1752 #, python-format msgid "" "This regular expression is invalid, and will be removed unless you correct " @@ -981,142 +1016,142 @@ msgstr "" "Следећи израз је неисправан и биће уклоњен уколико га не поправите:\n" " %s" -#: rapid/preferencesdialog.py:1750 +#: rapid/preferencesdialog.py:1753 msgid "Invalid regular expression" msgstr "Неисправан регуларни израз" #. Translators: this value is used as an example device when automatic backup device detection is enabled. You should translate this. -#: rapid/preferencesdialog.py:1931 +#: rapid/preferencesdialog.py:1934 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:1933 +#: rapid/preferencesdialog.py:1936 msgid "externaldrive2" msgstr "СпољниУређај2" -#: rapid/prefsrapid.py:126 +#: rapid/prefsrapid.py:127 msgid "New York" msgstr "Београд" -#: rapid/prefsrapid.py:127 +#: rapid/prefsrapid.py:128 msgid "Manila" msgstr "Софија" -#: rapid/prefsrapid.py:127 +#: rapid/prefsrapid.py:128 msgid "Prague" msgstr "Праг" -#: rapid/prefsrapid.py:127 +#: rapid/prefsrapid.py:128 msgid "Helsinki" msgstr "Зајечар" -#: rapid/prefsrapid.py:127 +#: rapid/prefsrapid.py:128 msgid "Wellington" msgstr "Нови Сад" -#: rapid/prefsrapid.py:128 +#: rapid/prefsrapid.py:129 msgid "Tehran" msgstr "Техеран" -#: rapid/prefsrapid.py:128 +#: rapid/prefsrapid.py:129 msgid "Kampala" msgstr "Будва" -#: rapid/prefsrapid.py:128 +#: rapid/prefsrapid.py:129 msgid "Paris" msgstr "Париз" -#: rapid/prefsrapid.py:128 +#: rapid/prefsrapid.py:129 msgid "Berlin" msgstr "Берлин" -#: rapid/prefsrapid.py:128 +#: rapid/prefsrapid.py:129 msgid "Sydney" msgstr "Сиднеј" -#: rapid/prefsrapid.py:129 +#: rapid/prefsrapid.py:130 msgid "Budapest" msgstr "Будимпешта" -#: rapid/prefsrapid.py:129 +#: rapid/prefsrapid.py:130 msgid "Rome" msgstr "Рим" -#: rapid/prefsrapid.py:129 +#: rapid/prefsrapid.py:130 msgid "Moscow" msgstr "Москва" -#: rapid/prefsrapid.py:129 +#: rapid/prefsrapid.py:130 msgid "Delhi" msgstr "Делфи" -#: rapid/prefsrapid.py:129 +#: rapid/prefsrapid.py:130 msgid "Warsaw" msgstr "Варшава" -#: rapid/prefsrapid.py:130 +#: rapid/prefsrapid.py:131 msgid "Jakarta" msgstr "Амазон" -#: rapid/prefsrapid.py:130 +#: rapid/prefsrapid.py:131 msgid "Madrid" msgstr "Мадрид" -#: rapid/prefsrapid.py:130 +#: rapid/prefsrapid.py:131 msgid "Stockholm" msgstr "Истамбул" #. components -#: rapid/problemnotification.py:26 rapid/subfolderfile.py:363 +#: rapid/problemnotification.py:27 rapid/subfolderfile.py:358 msgid "subfolder" msgstr "подфасцикла" -#: rapid/problemnotification.py:27 rapid/subfolderfile.py:361 +#: rapid/problemnotification.py:28 rapid/subfolderfile.py:356 msgid "filename" -msgstr "име датотеке" +msgstr "назив датотеке" -#: rapid/problemnotification.py:80 +#: rapid/problemnotification.py:81 #, python-format msgid "Date time value %s appears invalid." msgstr "Вредности за датум и време %s су неисправне." -#: rapid/problemnotification.py:81 +#: rapid/problemnotification.py:82 msgid "Filename does not have an extension." -msgstr "Име датотеке не садржи екстензију." +msgstr "Назив датотеке не садржи проширење." #. a number component is something like the 8346 in IMG_8346.JPG -#: rapid/problemnotification.py:83 +#: rapid/problemnotification.py:84 msgid "Filename does not have a number component." -msgstr "Име датотеке нема секвенцу бројева." +msgstr "Назив датотеке нема секвенцу бројева." -#: rapid/problemnotification.py:84 +#: rapid/problemnotification.py:85 #, python-format msgid "Error generating component %s." msgstr "Не могу да образујем део имена за %s." #. a generic problem -#: rapid/problemnotification.py:86 +#: rapid/problemnotification.py:87 #, python-format msgid "%(filetype)s metadata cannot be read" msgstr "Не могу да читам %(filetype)s метаподатке" -#: rapid/problemnotification.py:88 +#: rapid/problemnotification.py:89 #, python-format msgid "%(filetype)s %(area)s could not be generated" msgstr "Не могу да образујем %(filetype)s %(area)s" -#: rapid/problemnotification.py:90 rapid/problemnotification.py:91 +#: rapid/problemnotification.py:91 rapid/problemnotification.py:92 #, python-format msgid "An error occurred when copying the %(filetype)s" -msgstr "Грешка приликом копирања %(filetype)s" +msgstr "Грешка приликом умножавања %(filetype)s" -#: rapid/problemnotification.py:93 rapid/problemnotification.py:94 +#: rapid/problemnotification.py:94 rapid/problemnotification.py:95 #, python-format msgid "%(filetype)s already exists" msgstr "Већ постоји %(filetype)s" -#: rapid/problemnotification.py:97 +#: rapid/problemnotification.py:98 #, python-format msgid "" "%(filetype)s could not be backed up because no suitable backup locations " @@ -1125,7 +1160,7 @@ msgstr "" "Не могу да направим резерву %(filetype)s датотека јер није нађена " "одговарајућа локација." -#: rapid/problemnotification.py:102 +#: rapid/problemnotification.py:103 #, python-format msgid "" "%(image1)s was taken on %(image1_date)s at %(image1_time)s, and %(image2)s " @@ -1134,556 +1169,521 @@ msgstr "" "%(image1)s је сликана %(image1_date)s у %(image1_time)s, а %(image2)s " "%(image2_date)s у %(image2_time)s." -#: rapid/problemnotification.py:103 +#: rapid/problemnotification.py:104 #, python-format msgid "%(filetype)s was already downloaded" msgstr "%(filetype)s је већ преузет" -#: rapid/problemnotification.py:107 +#: rapid/problemnotification.py:108 #, python-format msgid "" "The existing %(filetype)s was last modified on %(date)s at %(time)s. Unique " "identifier '%(identifier)s' added." msgstr "" "Постојећи %(filetype)s је измењен %(date)s у %(time)s. Додата је јединствена " -"реч '%(identifier)s'." +"реч „%(identifier)s“." -#: rapid/problemnotification.py:108 +#: rapid/problemnotification.py:109 #, python-format msgid "The existing %(filetype)s was last modified on %(date)s at %(time)s." msgstr "Постојећи %(filetype)s је измењен %(date)s у %(time)s." -#: rapid/problemnotification.py:109 +#: rapid/problemnotification.py:110 #, python-format msgid "There is no data with which to name the %(filetype)s." msgstr "Не постоје подаци за именовање %(filetype)s." -#: rapid/problemnotification.py:111 +#: rapid/problemnotification.py:112 #, python-format msgid "Error: %(errorno)s %(strerror)s" msgstr "Грешка: %(errorno)s %(strerror)s" -#: rapid/problemnotification.py:201 +#: rapid/problemnotification.py:202 msgid "The metadata might be corrupt." msgstr "Метаподаци су можда неисправни." -#: rapid/problemnotification.py:204 +#: rapid/problemnotification.py:205 msgid "" "The filename, extension and Exif information indicate it has already been " "downloaded." msgstr "" -"Име датотеке, екстензија и Exif подаци указују да је датотека већ преузета." +"Назив датотеке, проширење и Ексиф подаци указују да је датотека већ преузета." -#: rapid/problemnotification.py:223 +#: rapid/problemnotification.py:224 #, python-format msgid " It was backed up to %(volume)s" -msgstr " Резервна копија је смешрена на %(volume)s" +msgstr " Резерва је смештена на %(volume)s" -#: rapid/problemnotification.py:225 +#: rapid/problemnotification.py:226 msgid " It was backed up to these devices: " -msgstr " Резервна копија је смештена на следеће уређаје: " +msgstr " Резерва је смештена на следеће уређаје: " -#: rapid/problemnotification.py:227 rapid/problemnotification.py:288 -#: rapid/problemnotification.py:300 +#: rapid/problemnotification.py:228 rapid/problemnotification.py:289 +#: rapid/problemnotification.py:301 #, python-format msgid "%s, " msgstr "%s, " -#: rapid/problemnotification.py:228 rapid/problemnotification.py:289 -#: rapid/problemnotification.py:301 +#: rapid/problemnotification.py:229 rapid/problemnotification.py:290 +#: rapid/problemnotification.py:302 #, python-format msgid "%(volumes)s and %(final_volume)s." msgstr "%(volumes)s и %(final_volume)s." -#: rapid/problemnotification.py:240 +#: rapid/problemnotification.py:241 #, python-format msgid "" "Photos detected with the same filenames, but taken at different times: " "%(details)s" msgstr "" -"Нађене су фотографије са истим именом датотека, али сликане у различито " +"Нађене су фотографије са истим називом датотека, али сликане у различито " "време: %(details)s" -#: rapid/problemnotification.py:257 +#: rapid/problemnotification.py:258 #, python-format msgid "An error occurred when backing up on %(volume)s: %(inst)s." -msgstr "Грешка приликом прављења резервне копије на %(volume)s: %(inst)s." +msgstr "Грешка приликом прављења резерве на %(volume)s: %(inst)s." -#: rapid/problemnotification.py:259 +#: rapid/problemnotification.py:260 #, python-format msgid "An error occurred when backing up on %(volume)s." -msgstr "Грешка приликом прављења резервне копије на %(volume)s." +msgstr "Грешка приликом прављења резерве на %(volume)s." -#: rapid/problemnotification.py:261 +#: rapid/problemnotification.py:262 msgid "Errors occurred when backing up on the following backup devices: " -msgstr "Грешка приликом прављења резервне копије на следећим уређајима: " +msgstr "Грешка приликом прављења резерве на следећим уређајима: " -#: rapid/problemnotification.py:265 rapid/problemnotification.py:313 +#: rapid/problemnotification.py:266 rapid/problemnotification.py:314 #, python-format msgid "%(volume)s (%(inst)s), " msgstr "%(volume)s (%(inst)s), " -#: rapid/problemnotification.py:267 +#: rapid/problemnotification.py:268 #, python-format msgid "%(volume)s, " msgstr "%(volume)s, " -#: rapid/problemnotification.py:271 rapid/problemnotification.py:315 +#: rapid/problemnotification.py:272 rapid/problemnotification.py:316 #, python-format msgid "%(volumes)s and %(volume)s (%(inst)s)." msgstr "%(volumes)s и %(volume)s (%(inst)s)." -#: rapid/problemnotification.py:276 +#: rapid/problemnotification.py:277 #, python-format msgid "%(volumes)s and %(volume)s." msgstr "%(volumes)s и %(volume)s." -#: rapid/problemnotification.py:284 +#: rapid/problemnotification.py:285 #, python-format msgid "Backup already exists on %(volume)s." -msgstr "Већ постоји резервна копија на %(volume)s." +msgstr "Већ постоји резерва на %(volume)s." -#: rapid/problemnotification.py:286 +#: rapid/problemnotification.py:287 msgid "Backups already exist in these locations: " -msgstr "Већ постоји резервна копија на овим местима: " +msgstr "Већ постоји резерва на овим местима: " -#: rapid/problemnotification.py:296 +#: rapid/problemnotification.py:297 #, python-format msgid "Backup overwritten on %(volume)s." -msgstr "Резервна копија је преписана на %(volume)s." +msgstr "Резерва је преписана на %(volume)s." -#: rapid/problemnotification.py:298 +#: rapid/problemnotification.py:299 msgid "Backups overwritten on these devices: " -msgstr "Резервна копија је преписана на овим уређајима: " +msgstr "Резерва је преписана на овим уређајима: " -#: rapid/problemnotification.py:309 +#: rapid/problemnotification.py:310 #, python-format msgid "An error occurred when creating directories on %(volume)s: %(inst)s." msgstr "Грешка при образовању директоријума на %(volume)s: %(inst)s." -#: rapid/problemnotification.py:311 +#: rapid/problemnotification.py:312 msgid "" "Errors occurred when creating directories on the following backup devices: " -msgstr ": Грешка при образовању директоријума на следећим уређајима: " +msgstr "Грешка при образовању директоријума на следећим уређајима: " -#: rapid/problemnotification.py:322 +#: rapid/problemnotification.py:323 #, python-format msgid "%(previousproblem)s Additionally, %(newproblem)s" msgstr "%(previousproblem)s Додатно, %(newproblem)s" -#: rapid/problemnotification.py:330 +#: rapid/problemnotification.py:331 #, python-format msgid " Furthermore, there were %(problems)s." msgstr " Такође, дошло је и до %(problems)s." -#: rapid/problemnotification.py:332 +#: rapid/problemnotification.py:333 #, python-format msgid " Furthermore, there was a %(problem)s." msgstr " Такође, дошло је и до %(problem)s." -#: rapid/problemnotification.py:341 +#: rapid/problemnotification.py:342 #, python-format msgid "The %(type)s metadata is missing." msgstr "Недостају %(type)s метаподаци." -#: rapid/problemnotification.py:343 +#: rapid/problemnotification.py:344 msgid "The following metadata is missing: " msgstr "Недостају следећи метаподаци: " -#: rapid/problemnotification.py:346 +#: rapid/problemnotification.py:347 #, python-format msgid "%(missing_metadata_elements)s and %(final_missing_metadata_element)s." msgstr "%(missing_metadata_elements)s и %(final_missing_metadata_element)s." -#: rapid/problemnotification.py:363 +#: rapid/problemnotification.py:364 msgid "Problems in subfolder and filename generation" -msgstr "Проблеми при образовању подфасцикли и имена датотека" +msgstr "Проблеми при образовању подфасцикли и назива датотека" -#: rapid/problemnotification.py:365 +#: rapid/problemnotification.py:366 msgid "Problem in subfolder and filename generation" -msgstr "Проблем при образовању подфасцикли и имена датотека" +msgstr "Проблем при образовању подфасцикли и назива датотека" -#: rapid/problemnotification.py:368 +#: rapid/problemnotification.py:369 #, python-format msgid "Problems in %s generation" msgstr "Проблеми при образовању %s" -#: rapid/problemnotification.py:370 +#: rapid/problemnotification.py:371 #, python-format msgid "Problem in %s generation" msgstr "Проблем при образовању %s" -#: rapid/problemnotification.py:379 +#: rapid/problemnotification.py:380 #, python-format msgid "%(filetype)s already exists, but it was backed up" -msgstr "Већ постоји %(filetype)s, али је направљена резервна копија" +msgstr "Већ постоји %(filetype)s, али је направљена резерва" -#: rapid/problemnotification.py:381 +#: rapid/problemnotification.py:382 #, python-format msgid "An error occurred when copying the %(filetype)s, but it was backed up" msgstr "" -"Дошло је до грешке приликом копирања %(filetype)s, али је направљена " -"резервна копија" +"Дошло је до грешке приликом умножавања %(filetype)s, али је направљена " +"резерва" -#: rapid/problemnotification.py:401 +#: rapid/problemnotification.py:402 msgid "Multiple problems were encountered" -msgstr "Јавило се више грешака" +msgstr "Дошло је до више грешака" -#: rapid/problemnotification.py:403 rapid/subfolderfile.py:230 +#: rapid/problemnotification.py:404 rapid/subfolderfile.py:233 msgid "Photos detected with the same filenames, but taken at different times" msgstr "" "Нађене су фотографије са истим именом, које су сликане у различито време" -#: rapid/problemnotification.py:409 +#: rapid/problemnotification.py:410 msgid "there were errors backing up" -msgstr "дошло је до грешки приликом образовања резервне копије" +msgstr "дошло је до грешака при прављењу резерве" -#: rapid/problemnotification.py:410 +#: rapid/problemnotification.py:411 msgid "There were errors backing up" -msgstr "Дошло је до грешки приликом образовања резервне копије" +msgstr "Дошло је до грешака при прављењу резерве" -#: rapid/problemnotification.py:412 +#: rapid/problemnotification.py:413 msgid "there was an error backing up" -msgstr "грешка при образовању резервне копије" +msgstr "дошло је до грешке при прављењу резерве" -#: rapid/problemnotification.py:413 +#: rapid/problemnotification.py:414 msgid "There was an error backing up" -msgstr "Грешка при образовању резервне копије" +msgstr "Дошло је до грешке при прављењу резерве" #. e.g. -#: rapid/problemnotification.py:416 +#: rapid/problemnotification.py:417 #, python-format msgid "%(previousproblem)s, and %(backinguperror)s" msgstr "%(previousproblem)s, и %(backinguperror)s" -#: rapid/rpdfile.py:139 +#: rapid/rpdfile.py:153 #, python-format msgid "%(number)s %(filetypes)s" msgstr "%(number)s %(filetypes)s" -#: rapid/subfolderfile.py:79 +#: rapid/rpdfile.py:163 +#, python-format +msgid "scanning (found %(photos)s photos and %(videos)s videos)..." +msgstr "прегледам (нађох %(photos)s фотографија и %(videos)s видеа)..." + +#: rapid/subfolderfile.py:80 #, python-format msgid "%(hour)s:%(minute)s:%(second)s:%(subsecond)s" msgstr "%(hour)s:%(minute)s:%(second)s:%(subsecond)s" -#: rapid/subfolderfile.py:300 +#: rapid/subfolderfile.py:301 msgid "Photo has already been downloaded" msgstr "Фотографије су већ преузете" -#: rapid/subfolderfile.py:301 +#: rapid/subfolderfile.py:302 #, python-format msgid "Source: %(source)s" msgstr "Извор: %(source)s" -#: rapid/subfolderfile.py:359 +#: rapid/subfolderfile.py:354 msgid "subfolder and filename" -msgstr "подфасцикла и име датотеке" +msgstr "подфасцикла и назив датотеке" -#: rapid/subfolderfile.py:397 +#: rapid/subfolderfile.py:393 msgid "Failed to create download subfolder" msgstr "Не могу да направим подфасциклу за преузимање" -#: rapid/subfolderfile.py:398 +#: rapid/subfolderfile.py:394 #, python-format msgid "Path: %s" msgstr "Путања: %s" -#: rapid/glade3/rapid.ui.h:1 -msgid "About..." -msgstr "О програму..." - #: rapid/glade3/rapid.ui.h:2 -msgid "Check All" -msgstr "Изабери све" +msgid "_File" +msgstr "_Датотека" #: rapid/glade3/rapid.ui.h:3 -msgid "Check All Photos" -msgstr "Изабери све фотографије" +msgid "Download / Pause" +msgstr "Преузми / Паузирај" #: rapid/glade3/rapid.ui.h:4 -msgid "Check All Videos" -msgstr "Изабери сав видео" +msgid "_Select" +msgstr "_Изабери" + +#: rapid/glade3/rapid.ui.h:5 +msgid "Select All Without _Job Code" +msgstr "Изабери све без к_ода задатка" #: rapid/glade3/rapid.ui.h:6 -msgid "Download / Pause" -msgstr "Преузми / Паузирај" +msgid "Select All Wit_h Job Code" +msgstr "Изабери све са _кодом задатка" #: rapid/glade3/rapid.ui.h:7 -msgid "Get Help Online..." -msgstr "Потражите помоћ на мрежи..." +msgid "_View" +msgstr "П_реглед" #: rapid/glade3/rapid.ui.h:8 -msgid "Help" -msgstr "Помоћ" +msgid "_Error Log" +msgstr "Списак са _грешкама" #: rapid/glade3/rapid.ui.h:9 -msgid "Make a Donation..." -msgstr "Дајте донацију..." +msgid "_Clear Completed Downloads" +msgstr "_Очисти завршена преузимања" #: rapid/glade3/rapid.ui.h:10 -msgid "Next File" -msgstr "Следећа датотека" +msgid "Previous File" +msgstr "Претходна датотека" #: rapid/glade3/rapid.ui.h:11 -msgid "Preferences" -msgstr "Поставке" +msgid "Next File" +msgstr "Следећа датотека" #: rapid/glade3/rapid.ui.h:12 -msgid "Previous File" -msgstr "Претходна датотека" +msgid "_Help" +msgstr "_Помоћ" #: rapid/glade3/rapid.ui.h:13 -msgid "Quit" -msgstr "Изађи" +msgid "_Make a Donation..." +msgstr "_Приложите неки динар..." + +#: rapid/glade3/rapid.ui.h:14 +msgid "_Translate this Application..." +msgstr "_Преведите овај програм..." #: rapid/glade3/rapid.ui.h:15 -msgid "Refresh" -msgstr "Освежи" +msgid "_Check All" +msgstr "Изабери _све" #: rapid/glade3/rapid.ui.h:16 -msgid "Report a Problem..." -msgstr "Пријавите проблем..." +msgid "_Uncheck All" +msgstr "_Поништи сав избор" #: rapid/glade3/rapid.ui.h:17 -msgid "Select All Wit_h Job Code" -msgstr "Изабери све са _кодом задатка" +msgid "_Include in download" +msgstr "_Укључи у преузето" #: rapid/glade3/rapid.ui.h:18 -msgid "Select All Without _Job Code" -msgstr "Изабери све без к_ода задатка" - -#: rapid/glade3/rapid.ui.h:19 -msgid "Translate this Application..." -msgstr "Преведите овај програм..." - -#: rapid/glade3/rapid.ui.h:20 -msgid "Uncheck All" -msgstr "Поништи сав избор" - -#: rapid/glade3/rapid.ui.h:21 -msgid "_Check All" -msgstr "И_забери све" - -#: rapid/glade3/rapid.ui.h:22 -msgid "_Clear Completed Downloads" -msgstr "_Очисти завршена преузимања" - -#: rapid/glade3/rapid.ui.h:23 msgid "_Download" msgstr "_Преузми" -#: rapid/glade3/rapid.ui.h:24 -msgid "_Error Log" -msgstr "Списак са _грешкама" - -#: rapid/glade3/rapid.ui.h:25 -msgid "_File" -msgstr "_Датотека" - -#: rapid/glade3/rapid.ui.h:26 -msgid "_Help" -msgstr "_Помоћ" - -#: rapid/glade3/rapid.ui.h:27 -msgid "_Include in download" -msgstr "_Укључи у преузето" - -#: rapid/glade3/rapid.ui.h:28 -msgid "_Make a Donation..." -msgstr "_Новчани прилог пројекту" - -#: rapid/glade3/rapid.ui.h:29 -msgid "_Select" -msgstr "_Изабери" - -#: rapid/glade3/rapid.ui.h:30 -msgid "_Translate this Application..." -msgstr "Помоћ у _локализацији" - -#: rapid/glade3/rapid.ui.h:31 -msgid "_Uncheck All" -msgstr "_Поништи сав избор" - -#: rapid/glade3/rapid.ui.h:32 -msgid "_View" -msgstr "П_реглед" - #: rapid/glade3/prefs.ui.h:1 -msgid " " -msgstr " " +msgid "Preferences: Rapid Photo Downloader" +msgstr "Поставке: Брзи преносилац фотографија" #: rapid/glade3/prefs.ui.h:2 -msgid " hh:mm" -msgstr " чч:мм" +msgid "<span weight=\"bold\" size=\"x-large\">Photo Download Folders</span>" +msgstr "" +"<span weight=\"bold\" size=\"x-large\">Фасцикла за преузете слике</span>" #: rapid/glade3/prefs.ui.h:3 -msgid ":" -msgstr ":" +msgid "<i>Example: /home/user/Pictures</i>" +msgstr "<i>Пример: /home/user/Фотографије</i>" #: rapid/glade3/prefs.ui.h:4 -msgid "<b>Backup</b>" -msgstr "<b>Резервна копија</b>" +msgid "<b>Download Subfolders</b>" +msgstr "<b>Подфасцикле за преузимања</b>" #: rapid/glade3/prefs.ui.h:5 -msgid "<b>Compatibility with Other Operating Systems</b>" -msgstr "<b>Сагласност са осталим оперативним системима</b>" +msgid "Download folder:" +msgstr "Фасцикла за чување:" #: rapid/glade3/prefs.ui.h:6 -msgid "<b>Download Folder</b>" -msgstr "<b>Фасцикла за чување фотографија</b>" +msgid "" +"Choose the download folder. Subfolders for the downloaded photos will be " +"automatically created in this folder using the structure specified below." +msgstr "" +"Изаберите фасциклу за чување преузетих фотографија. Подфасцикле ће бити " +"направљене на основу задатог редоследа." #: rapid/glade3/prefs.ui.h:7 -msgid "<b>Download Subfolders</b>" -msgstr "<b>Подфасцикле за чување фотографија</b>" +msgid "<b>Download Folder</b>" +msgstr "<b>Фасцикла за фотографија</b>" #: rapid/glade3/prefs.ui.h:8 -msgid "<b>Example</b>" -msgstr "<b>Пример</b>" +msgid "Photo Folders" +msgstr "Фасцикла за слике" #: rapid/glade3/prefs.ui.h:9 -msgid "<b>Job Codes</b>" -msgstr "<b>Кодови задатка</b>" +msgid "<span weight=\"bold\" size=\"x-large\">Photo Rename</span>\t" +msgstr "" +"<span weight=\"bold\" size=\"x-large\">Преименовање фотографија</span>\t" #: rapid/glade3/prefs.ui.h:10 msgid "<b>Photo Rename</b>" msgstr "<b>Преименовање фотографија</b>" #: rapid/glade3/prefs.ui.h:11 -msgid "<b>Photo and Video Name Conflicts</b>" -msgstr "<b>Несагласност имена видеа и слика</b>" +msgid " " +msgstr " " #: rapid/glade3/prefs.ui.h:12 -msgid "<b>Program Automation</b>" -msgstr "<b>Аутоматизација програма</b>" +msgid "<i>New:</i>" +msgstr "<i>Нова:</i>" #: rapid/glade3/prefs.ui.h:13 -msgid "<b>Sequence Numbers</b>" -msgstr "<b>Низ бројева</b>" +msgid "<i>Original:</i>" +msgstr "<i>Првобитна:</i>" #: rapid/glade3/prefs.ui.h:14 -msgid "<i>/media/externaldrive/Photos</i>" -msgstr "<i>/media/Спољни_Уређај/Фотографије</i>" +msgid "<b>Example</b>" +msgstr "<b>Пример</b>" #: rapid/glade3/prefs.ui.h:15 -msgid "<i>Example: /home/user/Pictures</i>" -msgstr "<i>Пример: /home/user/Фотографије</i>" +msgid "Photo Rename" +msgstr "Преименовање фотографија" #: rapid/glade3/prefs.ui.h:16 -msgid "<i>Example:</i>" -msgstr "<i>Пример:</i>" +msgid "<span weight=\"bold\" size=\"x-large\">Video Download Folders</span>" +msgstr "" +"<span weight=\"bold\" size=\"x-large\">Фасцикла за преузет видео</span>" #: rapid/glade3/prefs.ui.h:17 -msgid "<i>New:</i>" -msgstr "<i>Нова:</i>" +msgid "" +"Sorry, video downloading functionality disabled. To download videos, please " +"install either the <i>hachoir metadata</i> and <i>kaa metadata</i> packages " +"for python, or <i>exiftool</i>." +msgstr "" +"Преузимање видеа је онемогућено. За преузимање видеа инсталирајте <i>hachoir " +"metadata</i> и <i>kaa metadata</i> за Питон и <i>exiftool</i>." #: rapid/glade3/prefs.ui.h:18 -msgid "<i>Original:</i>" -msgstr "<i>Оригинал:</i>" +msgid "" +"Choose the download folder. Subfolders for the downloaded videos will be " +"automatically created in this folder using the structure specified below." +msgstr "" +"Изаберите фасциклу за чување преузетог видеа. Подфасцикле ће бити направљене " +"на основу задатог редоследа." #: rapid/glade3/prefs.ui.h:19 -msgid "<span weight=\"bold\" size=\"x-large\">Backup</span>\t" -msgstr "<span weight=\"bold\" size=\"x-large\">Резервна копија</span>\t" +msgid "Video Folders" +msgstr "Видео фасцикле" #: rapid/glade3/prefs.ui.h:20 -msgid "<span weight=\"bold\" size=\"x-large\">Device Options</span>" -msgstr "<span weight=\"bold\" size=\"x-large\">Опције уређаја</span>" +msgid "<span weight=\"bold\" size=\"x-large\">Video Rename</span>\t" +msgstr "<span weight=\"bold\" size=\"x-large\">Преименовање видеа</span>\t" #: rapid/glade3/prefs.ui.h:21 -msgid "<span weight=\"bold\" size=\"x-large\">Devices</span>" -msgstr "<span weight=\"bold\" size=\"x-large\">Уређаји</span>" +msgid "Video Rename" +msgstr "Преименовање видеа" #: rapid/glade3/prefs.ui.h:22 -msgid "<span weight=\"bold\" size=\"x-large\">Error Handling</span>" -msgstr "<span weight=\"bold\" size=\"x-large\">Превазилажење грешака</span>" +msgid "<span weight=\"bold\" size=\"x-large\">Rename Options</span>" +msgstr "<span weight=\"bold\" size=\"x-large\">Опције за преименовање</span>" #: rapid/glade3/prefs.ui.h:23 -msgid "<span weight=\"bold\" size=\"x-large\">Job Codes</span>" -msgstr "<span weight=\"bold\" size=\"x-large\">Кодови задатка</span>" +msgid "<b>Sequence Numbers</b>" +msgstr "<b>Низ бројева</b>" #: rapid/glade3/prefs.ui.h:24 -msgid "<span weight=\"bold\" size=\"x-large\">Miscellaneous</span>" -msgstr "<span weight=\"bold\" size=\"x-large\">Остало</span>" +msgid "" +"Specify the time in 24 hour format at which the <i>Downloads today</i> " +"sequence number should be reset." +msgstr "" +"Одређује време у које ће вредност <i>данашњих преузимања</i> бити поништена." #: rapid/glade3/prefs.ui.h:25 -msgid "<span weight=\"bold\" size=\"x-large\">Photo Download Folders</span>" -msgstr "" -"<span weight=\"bold\" size=\"x-large\">Фасцикла за преузете слике</span>" +msgid "Day start:" +msgstr "Почетак дана:" #: rapid/glade3/prefs.ui.h:26 -msgid "<span weight=\"bold\" size=\"x-large\">Photo Rename</span>\t" -msgstr "" -"<span weight=\"bold\" size=\"x-large\">Преименовање фотографија</span>\t" +msgid "Downloads today:" +msgstr "Данашњих преузимања:" #: rapid/glade3/prefs.ui.h:27 -msgid "<span weight=\"bold\" size=\"x-large\">Rename Options</span>" -msgstr "<span weight=\"bold\" size=\"x-large\">Опције за преименовање</span>" +msgid "Stored number:" +msgstr "Сачувани бројеви:" #: rapid/glade3/prefs.ui.h:28 -msgid "<span weight=\"bold\" size=\"x-large\">Video Download Folders</span>" -msgstr "" -"<span weight=\"bold\" size=\"x-large\">Фасцикла за преузет видео</span>" +msgid ":" +msgstr ":" #: rapid/glade3/prefs.ui.h:29 -msgid "<span weight=\"bold\" size=\"x-large\">Video Rename</span>\t" -msgstr "<span weight=\"bold\" size=\"x-large\">Преименовање видеа</span>\t" +msgid " hh:mm" +msgstr " чч:мм" #: rapid/glade3/prefs.ui.h:30 -msgid "Add unique identifier" -msgstr "Додај јединствену реч" +msgid "Synchronize RAW + JPEG sequence numbers" +msgstr "Усагласи називе РАВ и ЈПЕГ слика" #: rapid/glade3/prefs.ui.h:31 -msgid "Automatically detect Portable Storage Devices" -msgstr "Сам пронађи преносне меморијске уређаје" +msgid "<b>Compatibility with Other Operating Systems</b>" +msgstr "<b>Сагласност са осталим оперативним системима</b>" #: rapid/glade3/prefs.ui.h:32 -msgid "Automatically detect backup devices" -msgstr "Сам пронађи уређаје за резервне копије" +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:33 -msgid "Automatically detect devices" -msgstr "Сам пронађи уређаје" +msgid "Strip incompatible characters" +msgstr "Избаци неподржане знакове" #: rapid/glade3/prefs.ui.h:34 -msgid "Automatically rotate JPEG images" -msgstr "Сам окрени слике" +msgid "Rename Options" +msgstr "Опције преименовања" #: rapid/glade3/prefs.ui.h:35 -msgid "Backup" -msgstr "Резервна копија" +msgid "<span weight=\"bold\" size=\"x-large\">Job Codes</span>" +msgstr "<span weight=\"bold\" size=\"x-large\">Кодови задатка</span>" #: rapid/glade3/prefs.ui.h:36 -msgid "Backup photos and videos when downloading" -msgstr "Направи резерву слика и видеа при преузимању" +msgid "<b>Job Codes</b>" +msgstr "<b>Кодови задатка</b>" #: rapid/glade3/prefs.ui.h:37 -msgid "" -"Choose the download folder. Subfolders for the downloaded photos will be " -"automatically created in this folder using the structure specified below." -msgstr "" -"Изаберите фасциклу за чување преузетих фотографија. Подфасцикле ће бити " -"направљене на основу задатог редоследа." - -#: rapid/glade3/prefs.ui.h:38 -msgid "" -"Choose the download folder. Subfolders for the downloaded videos will be " -"automatically created in this folder using the structure specified below." -msgstr "" -"Изаберите фасциклу за чување преузетог видеа. Подфасцикле ће бити направљене " -"на основу задатог редоследа." +msgid "_Add..." +msgstr "_Додај..." #: rapid/glade3/prefs.ui.h:39 -msgid "Day start:" -msgstr "Почетак дана:" +msgid "R_emove All" +msgstr "У_клони све" #: rapid/glade3/prefs.ui.h:40 -msgid "Device Options" -msgstr "Опције уређаја" +msgid "Job Codes" +msgstr "Код задатка" #: rapid/glade3/prefs.ui.h:41 +msgid "<span weight=\"bold\" size=\"x-large\">Devices</span>" +msgstr "<span weight=\"bold\" size=\"x-large\">Уређаји</span>" + +#: rapid/glade3/prefs.ui.h:42 msgid "Devices" msgstr "Уређаји" -#: rapid/glade3/prefs.ui.h:42 +#: rapid/glade3/prefs.ui.h:43 msgid "" "Devices are from where to download photos and videos, such as cameras, " "memory cards or Portable Storage Devices.\n" @@ -1696,7 +1696,7 @@ msgid "" "setting it to PTP mode. If that is not possible, a card reader must be " "used.</i>" msgstr "" -"Уређаји са којих се преузима слике или видео, као што су фото-апарати, " +"Уређаји са којих се преузимају слике или видео, као што су фото-апарати, " "меморијске картице или преносна складишта.\n" "\n" "Можете преузимати податке са више уређаја у исто време или уместо уређаја " @@ -1706,35 +1706,31 @@ msgstr "" "приметите да је брзина преузимања мала, или да преузимање уопште не ради, " "поставите апарат у ПТП режим или купите читач картица.</i>" -#: rapid/glade3/prefs.ui.h:47 -msgid "Download folder:" -msgstr "Фасцикла за чување фотографија:" - #: rapid/glade3/prefs.ui.h:48 -msgid "Downloads today:" -msgstr "Данашњих преузимања:" +msgid "Automatically detect Portable Storage Devices" +msgstr "Сам пронађи преносне меморијске уређаје" #: rapid/glade3/prefs.ui.h:49 -msgid "Error Handling" -msgstr "Грешке" +msgid "Automatically detect devices" +msgstr "Сам пронађи уређаје" #: rapid/glade3/prefs.ui.h:50 -msgid "Exit program even if download had warnings or errors" -msgstr "Изађи из програма чак и када постоје грешке у преузимању" - -#: rapid/glade3/prefs.ui.h:51 -msgid "Exit program when download completes" -msgstr "Изађи из програма по преузимању" - -#: rapid/glade3/prefs.ui.h:52 -msgid "Generate thumbnails (slower)" -msgstr "Изгради умањене приказе (спорије)" - -#: rapid/glade3/prefs.ui.h:53 msgid "" -"If you disable automatic detection, choose the exact backup locations." +"If you enable automatic detection of Portable Storage Devices, the entire " +"device will be scanned. On large devices, this could take some time.\n" +"\n" +"When this option is enabled, and a potential device is detected, you will be " +"prompted to determine if it should be scanned or not." msgstr "" -"Уколико искључите аутоматско налажење уређаја, изаберите тачно место." +"Уколико омогућите аутоматско налажење преносних уређаја, то може да потраје " +"када је преносни уређај велики јер ће бити претражен у потпуности.\n" +"\n" +"При налажењу одговарајућег уређаја бићете упитани да ли желите да га " +"претражите или не." + +#: rapid/glade3/prefs.ui.h:53 +msgid "Location:" +msgstr "Место:" #: rapid/glade3/prefs.ui.h:54 msgid "" @@ -1742,217 +1738,209 @@ msgid "" "and videos." msgstr "" "Уколико онемогућите аутоматско налажење уређаја, изаберите место до слика " -"или видеа" +"или видеа." #: rapid/glade3/prefs.ui.h:55 +msgid "<span weight=\"bold\" size=\"x-large\">Device Options</span>" +msgstr "<span weight=\"bold\" size=\"x-large\">Опције уређаја</span>" + +#: rapid/glade3/prefs.ui.h:56 +msgid "Remembered Paths" +msgstr "Запамћене путање" + +#: rapid/glade3/prefs.ui.h:57 msgid "" -"If you enable automatic detection of Portable Storage Devices, the entire " -"device will be scanned. On large devices, this could take some time.\n" -"\n" -"When this option is enabled, and a potential device is detected, you will be " -"prompted to determine if it should be scanned or not." +"Remembered paths are those associated with devices that you have chosen to " +"always scan or ignore when automatic detection of Portable Storage Devices " +"is enabled." msgstr "" -"Уколико омогућите аутоматско налажење преносних уређаја, то може да потраје " -"када је преносни уређај велики јер ће он бити претражен у потпуности.\n" -"\n" -"При налажењу одговарајућег уређаја бићете упитани да ли желите да га " -"претражите или не." +"Упамћене путање су оне које се везују за уређаје које желите да увек " +"претражите или занемарите при аутоматском тражењу уређаја." #: rapid/glade3/prefs.ui.h:58 msgid "Ignored Paths" msgstr "Занемарене путање" #: rapid/glade3/prefs.ui.h:59 -msgid "Job Codes" -msgstr "Код задатка" - -#: rapid/glade3/prefs.ui.h:60 -msgid "Location:" -msgstr "Место:" +msgid "" +"Specify the ending portion of any paths you want ignored when scanning " +"devices for photos or videos. Any path ending with the values below will not " +"be scanned." +msgstr "" +"Унесите део назива путања које желите да занемарите приликом претраживања " +"уређаја. Све путање које се завршавају овим називом ће бити занемарене." #: rapid/glade3/prefs.ui.h:61 -msgid "Miscellaneous" -msgstr "Остало" +msgid "Re_move All" +msgstr "У_клони све" #: rapid/glade3/prefs.ui.h:62 -msgid "Overwrite" -msgstr "Препиши" +msgid "Use _python-style regular expressions" +msgstr "Користи _регуларни израз у Питоновом стилу" #: rapid/glade3/prefs.ui.h:63 -msgid "Performance" -msgstr "Перформансе" +msgid "Device Options" +msgstr "Опције уређаја" #: rapid/glade3/prefs.ui.h:64 -msgid "Photo Folders" -msgstr "Фасцикла за слике" +msgid "<span weight=\"bold\" size=\"x-large\">Backup</span>\t" +msgstr "<span weight=\"bold\" size=\"x-large\">Резерва</span>\t" #: rapid/glade3/prefs.ui.h:65 -msgid "Photo Rename" -msgstr "Преименовање фотографија" +msgid "<b>Backup</b>" +msgstr "<b>Резерва</b>" #: rapid/glade3/prefs.ui.h:66 -msgid "Photo backup folder name:" -msgstr "Име резевне фасцикле за слике:" +msgid "" +"If you disable automatic detection, choose the exact backup locations." +msgstr "" +"Уколико искључите аутоматско налажење уређаја, изаберите тачно место." #: rapid/glade3/prefs.ui.h:67 -msgid "Photo backup location:" -msgstr "Место до резервних фотографија:" +msgid "Automatically detect backup devices" +msgstr "Сам пронађи уређаје за резерве" #: rapid/glade3/prefs.ui.h:68 -msgid "Preferences: Rapid Photo Downloader" -msgstr "Поставке: Брзи преносилац фотографија" +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:70 -msgid "R_emove All" -msgstr "У_клони све" +#: rapid/glade3/prefs.ui.h:69 +msgid "Backup photos and videos when downloading" +msgstr "Направи резерву слика и видеа при преузимању" -#: rapid/glade3/prefs.ui.h:72 -msgid "Re_move All" -msgstr "У_клони све" +#: rapid/glade3/prefs.ui.h:70 +msgid "" +"Specify the folder in which backups are stored on the device. \n" +"\n" +"<i>Note: this will also be used to determine whether or not the device is " +"used for backups. For each device you wish to use for backing up to, create " +"a folder in it with one of these names.</i>" +msgstr "" +"Наведите фасциклу на уређају у којој се чувају резерве. \n" +"\n" +"<i>Примедба: ово одређује и да ли се уређаји користе као резервни. Унутар " +"сваког резервног уређаја морате направити фасцику са неким од ових " +"назива.</i>" #: rapid/glade3/prefs.ui.h:73 -msgid "Remembered Paths" -msgstr "Запамћене путање" +msgid "Photo backup location:" +msgstr "Место до резервних фотографија:" #: rapid/glade3/prefs.ui.h:74 -msgid "" -"Remembered paths are those associated with devices that you have chosen to " -"always scan or ignore when automatic detection of Portable Storage Devices " -"is enabled." -msgstr "" -"Упамћене путање су оне које се везују за уређаје које желите да увек " -"претражите или занемарите при аутоматском тражењу уређаја." +msgid "Photo backup folder name:" +msgstr "Назив фасцикле резерве за слике:" #: rapid/glade3/prefs.ui.h:75 -msgid "Rename Options" -msgstr "Опције преименовања" +msgid "<i>Example:</i>" +msgstr "<i>Пример:</i>" #: rapid/glade3/prefs.ui.h:76 -msgid "Skip" -msgstr "Прескочи" +msgid "<i>/media/externaldrive/Photos</i>" +msgstr "<i>/media/Спољни_уређај/Фотографије</i>" #: rapid/glade3/prefs.ui.h:77 -msgid "Skip download" -msgstr "Прескочи преузимање" +msgid "Video backup folder name:" +msgstr "Назив фасцикле резерве за видео:" #: rapid/glade3/prefs.ui.h:78 -msgid "" -"Sorry, video downloading functionality disabled. To download videos, please " -"install either the <i>hachoir metadata</i> and <i>kaa metadata</i> packages " -"for python, or <i>exiftool</i>." -msgstr "" -"Преузимање видеа је онемогућено. За преузимање видеа инсталирајте <i>hachoir " -"metadata</i> и <i>kaa metadata</i> за Питон и <i>exiftool</i>." +msgid "Video backup location:" +msgstr "Путања до резервног видеа:" #: rapid/glade3/prefs.ui.h:79 -msgid "" -"Specify the ending portion of any paths you want ignored when scanning " -"devices for photos or videos. Any path ending with the values below will not " -"be scanned." -msgstr "" -"Унесите део имена путања које желите да занемарите приликом претраживања " -"уређаја. Све путање које се завршавају овом именом ће бити занемарене." +msgid "Backup" +msgstr "Резерва" #: rapid/glade3/prefs.ui.h:80 -msgid "" -"Specify the folder in which backups are stored on the device. \n" -"\n" -"<i>Note: this will also be used to determine whether or not the device is " -"used for backups. For each device you wish to use for backing up to, create " -"a folder in it with one of these names.</i>" -msgstr "" -"Одређује фасциклу на уређају у којој се чувају резервне копије. \n" -"\n" -"<i>Примедба: ово одређује и да ли се уређаји користе као резервни. Унутар " -"сваког резервног уређаја морате направити фасцику са неким од ових " -"назива.</i>" +msgid "<span weight=\"bold\" size=\"x-large\">Miscellaneous</span>" +msgstr "<span weight=\"bold\" size=\"x-large\">Остало</span>" -#: rapid/glade3/prefs.ui.h:83 -msgid "" -"Specify the time in 24 hour format at which the <i>Downloads today</i> " -"sequence number should be reset." -msgstr "" -"Одређује време у које ће вредност <i>данашњих преузимања</i> бити поништена." +#: rapid/glade3/prefs.ui.h:81 +msgid "<b>Program Automation</b>" +msgstr "<b>Аутоматизација програма</b>" -#: rapid/glade3/prefs.ui.h:84 -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:82 +msgid "Unmount (\"eject\") device upon download completion" +msgstr "Демонтирај (избаци) уређај након успешног преузимања" -#: rapid/glade3/prefs.ui.h:85 +#: rapid/glade3/prefs.ui.h:83 msgid "Start downloading at program startup" msgstr "Започни преузимање по покретању програма" -#: rapid/glade3/prefs.ui.h:86 +#: rapid/glade3/prefs.ui.h:84 msgid "Start downloading upon device insertion" msgstr "Започни преузимање по прикључивању уређаја" +#: rapid/glade3/prefs.ui.h:85 +msgid "Exit program when download completes" +msgstr "Изађи из програма по преузимању" + +#: rapid/glade3/prefs.ui.h:86 +msgid "Exit program even if download had warnings or errors" +msgstr "Изађи из програма чак и када постоје грешке у преузимању" + #: rapid/glade3/prefs.ui.h:87 -msgid "Stored number:" -msgstr "Сачувани бројеви:" +msgid "Automatically rotate JPEG images" +msgstr "Сам окрени слике" #: rapid/glade3/prefs.ui.h:88 -msgid "Strip incompatible characters" -msgstr "Избаци неподржане знакове" +msgid "Performance" +msgstr "Учинак" #: rapid/glade3/prefs.ui.h:89 -msgid "Synchronize RAW + JPEG sequence numbers" -msgstr "Усагласи називе RAW и JPEG слика" +msgid "Generate thumbnails (slower)" +msgstr "Изгради умањене приказе (спорије)" #: rapid/glade3/prefs.ui.h:90 -msgid "Unmount (\"eject\") device upon download completion" -msgstr "Демонтирај (избаци) уређај након успешног преузимања" +msgid "Miscellaneous" +msgstr "Остало" #: rapid/glade3/prefs.ui.h:91 -msgid "Use _python-style regular expressions" -msgstr "Користи _регуларни израз у Питоновом стилу" +msgid "<span weight=\"bold\" size=\"x-large\">Error Handling</span>" +msgstr "<span weight=\"bold\" size=\"x-large\">Превазилажење грешака</span>" #: rapid/glade3/prefs.ui.h:92 -msgid "Video Folders" -msgstr "Видео фасцикле" +msgid "<b>Photo and Video Name Conflicts</b>" +msgstr "<b>Сукоби назива видеа и слика</b>" #: rapid/glade3/prefs.ui.h:93 -msgid "Video Rename" -msgstr "Преименовање видеа" +msgid "Add unique identifier" +msgstr "Додај јединствену реч" #: rapid/glade3/prefs.ui.h:94 -msgid "Video backup folder name:" -msgstr "Име резервне фасцикле за видео:" +msgid "Skip download" +msgstr "Прескочи преузимање" #: rapid/glade3/prefs.ui.h:95 -msgid "Video backup location:" -msgstr "Путања до резервног видеа:" - -#: rapid/glade3/prefs.ui.h:96 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:97 +#: rapid/glade3/prefs.ui.h:96 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:97 +msgid "Overwrite" +msgstr "Препиши" #: rapid/glade3/prefs.ui.h:98 -msgid "" -"You can have your photos and videos backed up to multiple locations as they " -"are downloaded, e.g. external hard drives." -msgstr "" -"Можете направити резервне кпије фотографија и видеа на више места при " -"преузимању, нпр. на екстерним дисковима." +msgid "Skip" +msgstr "Прескочи" #: rapid/glade3/prefs.ui.h:99 -msgid "_Add..." -msgstr "_Додај..." +msgid "Error Handling" +msgstr "Руковање грешкама" #: rapid/glade3/about.ui.h:1 msgid "Import your photos and videos efficiently and reliably" @@ -7,22 +7,22 @@ msgid "" msgstr "" "Project-Id-Version: rapid\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" -"POT-Creation-Date: 2011-11-20 13:25-0600\n" -"PO-Revision-Date: 2011-12-16 16:45+0000\n" -"Last-Translator: Silas Lenz <Unknown>\n" +"POT-Creation-Date: 2012-06-23 04:00-0500\n" +"PO-Revision-Date: 2012-11-09 01:10+0000\n" +"Last-Translator: Mikael Hiort af Ornäs <lakritslemmel@hotmail.com>\n" "Language-Team: Swedish <sv@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-12-28 07:56+0000\n" -"X-Generator: Launchpad (build 14560)\n" +"X-Launchpad-Export-Date: 2012-11-26 19:04+0000\n" +"X-Generator: Launchpad (build 16309)\n" #. Translators: if neccessary, for guidance in how to translate this program, you may see http://damonlynch.net/translate.html -#: rapid/rapid.py:107 rapid/rapid.py:1699 rapid/glade3/rapid.ui.h:14 +#: rapid/rapid.py:112 rapid/rapid.py:1784 rapid/glade3/rapid.ui.h:1 msgid "Rapid Photo Downloader" msgstr "Rapid Photo Downloader" -#: rapid/rapid.py:112 +#: rapid/rapid.py:117 #, python-format msgid "" "%(date)s\n" @@ -31,33 +31,33 @@ msgstr "" "%(date)s\n" "%(time)s" -#: rapid/rapid.py:114 +#: rapid/rapid.py:119 #, python-format msgid "%(date)s %(time)s" msgstr "%(date)s %(time)s" -#: rapid/rapid.py:117 +#: rapid/rapid.py:122 #, 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:152 +#: rapid/rapid.py:157 msgid "Device" msgstr "Enhet" #. Size refers to the total size of images on the device, typically in #. MB or GB -#: rapid/rapid.py:170 +#: rapid/rapid.py:175 msgid "Size" msgstr "Storlek" -#: rapid/rapid.py:173 +#: rapid/rapid.py:178 msgid "Download Progress" msgstr "Överföringsförlopp" -#: rapid/rapid.py:319 +#: rapid/rapid.py:336 #, python-format msgid "%(device)s did not unmount" msgstr "%(device)s enheter avmonterades inte" @@ -66,36 +66,38 @@ msgstr "%(device)s enheter avmonterades inte" #. 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:1186 +#: rapid/rapid.py:1216 msgid "scanning..." msgstr "söker av..." #. this location is a human readable explanation for /, and is inserted into Downloading from %(location)s -#: rapid/rapid.py:1697 +#: rapid/rapid.py:1782 msgid "the root of the file system" -msgstr "" +msgstr "filsystemets rotmapp" #. message in dialog box which asks the user if they really want to be downloading from this location -#: rapid/rapid.py:1701 +#: rapid/rapid.py:1786 #, python-format msgid "Downloading from %(location)s." msgstr "Laddar ner från %(location)s." -#: rapid/rapid.py:1702 +#: rapid/rapid.py:1787 msgid "" "Do you really want to download from here? On some systems, scanning this " "location can take a very long time." msgstr "" +"Vill du verkligen ladda ner härifrån? På vissa filsystem kan det ta väldigt " +"lång tid att scanna den här platsen." -#: rapid/rapid.py:2124 rapid/glade3/rapid.ui.h:5 +#: rapid/rapid.py:2209 msgid "Download" msgstr "Hämta" -#: rapid/rapid.py:2127 +#: rapid/rapid.py:2212 msgid "Pause" msgstr "Pausa" -#: rapid/rapid.py:2228 +#: rapid/rapid.py:2317 #, python-format msgid "" "These download folders are invalid:\n" @@ -106,7 +108,7 @@ msgstr "" "%(folder1)s\n" "%(folder2)s" -#: rapid/rapid.py:2231 +#: rapid/rapid.py:2320 #, python-format msgid "" "This download folder is invalid:\n" @@ -115,176 +117,176 @@ msgstr "" "Denna mapp är ogiltig:\n" "%s" -#: rapid/rapid.py:2232 +#: rapid/rapid.py:2321 msgid "Download cannot proceed" msgstr "Kan inte fortsätta överföringen" -#: rapid/rapid.py:2559 +#: rapid/rapid.py:2700 msgid "About 1 second remaining" msgstr "Cirka en sekund återstår" -#: rapid/rapid.py:2561 +#: rapid/rapid.py:2702 #, python-format msgid "About %i seconds remaining" msgstr "Cirka %i sekunder återstår" -#: rapid/rapid.py:2563 +#: rapid/rapid.py:2704 msgid "About 1 minute remaining" msgstr "Cirka en minut återstår" #. 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:2568 +#: rapid/rapid.py:2709 #, python-format msgid "About %(minutes)i:%(seconds)02i minutes remaining" msgstr "Ungefär %(minutes)i:%(seconds)02i minuter återstår" -#: rapid/rapid.py:2590 rapid/rpdfile.py:113 +#: rapid/rapid.py:2731 rapid/rpdfile.py:123 msgid "photos and videos" msgstr "bilder och filmer" -#: rapid/rapid.py:2592 rapid/rpdfile.py:115 +#: rapid/rapid.py:2733 rapid/rpdfile.py:125 msgid "photos or videos" msgstr "bilder eller filmer" -#: rapid/rapid.py:2595 rapid/rapid.py:3408 rapid/rpdfile.py:118 +#: rapid/rapid.py:2736 rapid/rapid.py:3558 rapid/rpdfile.py:128 msgid "videos" msgstr "video" -#: rapid/rapid.py:2597 rapid/preferencesdialog.py:1617 rapid/rpdfile.py:120 -#: rapid/rpdfile.py:254 +#: rapid/rapid.py:2738 rapid/preferencesdialog.py:1620 rapid/rpdfile.py:130 +#: rapid/rpdfile.py:291 msgid "video" msgstr "video" -#: rapid/rapid.py:2600 rapid/rapid.py:3406 rapid/rpdfile.py:123 +#: rapid/rapid.py:2741 rapid/rapid.py:3556 rapid/rpdfile.py:133 msgid "photos" msgstr "bilder" #. check subfolder preferences for bad values -#: rapid/rapid.py:2602 rapid/preferencesdialog.py:1616 rapid/rpdfile.py:125 -#: rapid/rpdfile.py:234 +#: rapid/rapid.py:2743 rapid/preferencesdialog.py:1619 rapid/rpdfile.py:135 +#: rapid/rpdfile.py:272 msgid "photo" msgstr "bild" -#: rapid/rapid.py:2629 +#: rapid/rapid.py:2770 #, python-format msgid "%(noFiles)s %(filetypes)s downloaded" msgstr "%(noFiles)s %(filetypes)s överfördes" -#: rapid/rapid.py:2633 +#: rapid/rapid.py:2774 #, python-format msgid "%(noFiles)s %(filetypes)s failed to download" msgstr "%(noFiles)s %(filetypes)s gick inte att hämta" -#: rapid/rapid.py:2636 rapid/rapid.py:2688 +#: rapid/rapid.py:2777 rapid/rapid.py:2829 msgid "warnings" msgstr "varningar" -#: rapid/rapid.py:2645 +#: rapid/rapid.py:2786 msgid "All downloads complete" msgstr "Alla överföringar klara" -#: rapid/rapid.py:2651 rapid/rapid.py:2660 rapid/rapid.py:2669 -#: rapid/rapid.py:2678 rapid/rapid.py:2686 +#: rapid/rapid.py:2792 rapid/rapid.py:2801 rapid/rapid.py:2810 +#: rapid/rapid.py:2819 rapid/rapid.py:2827 #, python-format msgid "%(number)s %(numberdownloaded)s" msgstr "%(number)s %(numberdownloaded)s" -#: rapid/rapid.py:2653 rapid/rapid.py:2671 +#: rapid/rapid.py:2794 rapid/rapid.py:2812 #, python-format msgid "%(filetype)s downloaded" msgstr "%(filetype)s hämtade" -#: rapid/rapid.py:2662 rapid/rapid.py:2680 +#: rapid/rapid.py:2803 rapid/rapid.py:2821 #, python-format msgid "%(filetype)s failed to download" msgstr "%(filetype)s gick inte att hämta" #. e.g.: 3 of 205 photos and videos (202 remaining) -#: rapid/rapid.py:2719 +#: rapid/rapid.py:2860 #, python-format msgid "%(number)s of %(total)s %(filetypes)s (%(remaining)s remaining)" msgstr "%(number)s av %(total)s %(filetypes)s (%(remaining)s återstår)" #. e.g.: 205 of 205 photos and videos -#: rapid/rapid.py:2726 +#: rapid/rapid.py:2867 #, python-format msgid "%(number)s of %(total)s %(filetypes)s" msgstr "%(number)s av %(total)s %(filetypes)s" -#: rapid/rapid.py:3072 +#: rapid/rapid.py:3222 msgid "From" msgstr "Från" -#: rapid/rapid.py:3080 +#: rapid/rapid.py:3230 msgid "Auto Detect" msgstr "Upptäck automatiskt" -#: rapid/rapid.py:3084 rapid/preferencesdialog.py:1324 +#: rapid/rapid.py:3234 rapid/preferencesdialog.py:1327 #, python-format msgid "Select a folder containing %(file_types)s" msgstr "Välj en katalog innehållande %(file_types)s" -#: rapid/rapid.py:3125 +#: rapid/rapid.py:3275 msgid "Copy" msgstr "Kopiera" -#: rapid/rapid.py:3138 +#: rapid/rapid.py:3288 msgid "Move" msgstr "Flytta" -#: rapid/rapid.py:3160 +#: rapid/rapid.py:3310 msgid "To" msgstr "Till" -#: rapid/rapid.py:3167 rapid/rapid.py:3796 +#: rapid/rapid.py:3317 rapid/rapid.py:3986 msgid "Photos:" msgstr "Bilder:" -#: rapid/rapid.py:3170 rapid/preferencesdialog.py:1161 +#: rapid/rapid.py:3320 rapid/preferencesdialog.py:1164 msgid "Select a folder to download photos to" msgstr "Välj en katalog att överföra bilder till" -#: rapid/rapid.py:3182 rapid/rapid.py:3796 +#: rapid/rapid.py:3332 rapid/rapid.py:3986 msgid "Videos:" msgstr "Filmer:" -#: rapid/rapid.py:3184 rapid/preferencesdialog.py:1179 +#: rapid/rapid.py:3334 rapid/preferencesdialog.py:1182 msgid "Select a folder to download videos to" msgstr "Välj en katalog att överföra filmer till" -#: rapid/rapid.py:3376 +#: rapid/rapid.py:3526 msgid "and" msgstr "och" -#: rapid/rapid.py:3381 +#: rapid/rapid.py:3531 msgid "Using backup devices" msgstr "Använder enheter för säkerhetskopiering" -#: rapid/rapid.py:3383 +#: rapid/rapid.py:3533 msgid "Using backup device" msgstr "Använder enhet för säkerhetskopiering" -#: rapid/rapid.py:3385 +#: rapid/rapid.py:3535 msgid "No backup devices detected" msgstr "Inga enheter för säkerhetskopiering hittades" -#: rapid/rapid.py:3412 +#: rapid/rapid.py:3562 msgid "Free space:" msgstr "Ledigt utrymme:" #. (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:3424 +#: rapid/rapid.py:3574 #, 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:3428 +#: rapid/rapid.py:3578 #, python-format msgid "%(free)s %(file_type)s" msgstr "%(free)s %(file_type)s" @@ -292,87 +294,87 @@ 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:3433 +#: rapid/rapid.py:3583 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:3438 +#: rapid/rapid.py:3588 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:3444 +#: rapid/rapid.py:3594 #, python-format msgid "%(free)s free" msgstr "%(free)s tillgängligt" #. user manually specified the same location for photos and video backups -#: rapid/rapid.py:3452 +#: rapid/rapid.py:3602 #, python-format msgid "Backing up photos and videos to %(path)s" msgstr "Säkerhetskopierar bilder och filmer till %(path)s" #. user manually specified backup location -#: rapid/rapid.py:3455 +#: rapid/rapid.py:3605 #, python-format msgid "Backing up to %(path)s" msgstr "Säkerhetskopierar till %(path)s" #. user manually specified different locations for photo and video backups -#: rapid/rapid.py:3458 +#: rapid/rapid.py:3608 #, python-format msgid "Backing up photos to %(path)s and videos to %(path2)s" msgstr "Säkerhetskopierar bolder till %(path)s och videor till %(path2)s" -#: rapid/rapid.py:3465 +#: rapid/rapid.py:3615 #, python-format msgid "%(freespace)s. %(backuppaths)s." msgstr "%(freespace)s. %(backuppaths)s." -#: rapid/rapid.py:3494 +#: rapid/rapid.py:3644 msgid "Program preferences are invalid" msgstr "Programinställningarna är ogiltiga" -#: rapid/rapid.py:3613 rapid/rpdfile.py:235 +#: rapid/rapid.py:3770 rapid/rpdfile.py:273 msgid "Photo" msgstr "Bild" -#: rapid/rapid.py:3615 rapid/rpdfile.py:255 +#: rapid/rapid.py:3772 rapid/rpdfile.py:292 msgid "Video" msgstr "Film" -#: rapid/rapid.py:3624 +#: rapid/rapid.py:3781 #, python-format msgid "%(file_type)s download folder does not exist" msgstr "%(file_type)s nedladdningsmapp saknas" -#: rapid/rapid.py:3626 rapid/rapid.py:3640 rapid/rapid.py:3653 +#: rapid/rapid.py:3783 rapid/rapid.py:3797 rapid/rapid.py:3810 #, python-format msgid "Folder: %s" msgstr "Mapp: %s" -#: rapid/rapid.py:3638 +#: rapid/rapid.py:3795 #, python-format msgid "%(file_type)s download folder is invalid" msgstr "%(file_type)s nedladdningsmapp är ogiltig" -#: rapid/rapid.py:3651 +#: rapid/rapid.py:3808 #, python-format msgid "%(file_type)s download folder is not writable" msgstr "%(file_type)s nedladdningsmapp är inte skrivbar" -#: rapid/rapid.py:3729 +#: rapid/rapid.py:3894 msgid "Thumbnails" msgstr "Miniatyrer" #. 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:3777 +#: rapid/rapid.py:3949 #, python-format msgid "" "display program information on the command line as the program runs " @@ -381,42 +383,66 @@ msgstr "" "visa programinformation på kommandoraden när programmet körs (standardvärde: " "%default)" -#: rapid/rapid.py:3778 +#: rapid/rapid.py:3950 msgid "display debugging information when run from the command line" msgstr "visa debuginformation när programmet körs från kommandorad" -#: rapid/rapid.py:3779 +#: rapid/rapid.py:3951 msgid "only output errors to the command line" msgstr "Visa fel endast på kommandoraden" #. image file extensions are recognized RAW files plus TIFF and JPG -#: rapid/rapid.py:3781 +#: rapid/rapid.py:3953 msgid "list photo and video file extensions the program recognizes and exit" msgstr "lista filändelser som programmet stödjer och avsluta" -#: rapid/rapid.py:3783 +#: rapid/rapid.py:3955 +msgid "" +"automatically detect devices from which to download, overwriting existing " +"program preferences" +msgstr "" +"identifiera automatiskt enheter att hämta objekt från och ersätt därmed " +"befintliga programinställningar" + +#: rapid/rapid.py:3956 +msgid "" +"manually specify the PATH of the device from which to download, overwriting " +"existing program preferences" +msgstr "" +"ange SÖKVÄGEN manuellt till den enhet från vilken du önskar hämta objekt och " +"ersätt därmed befintliga programinställningar" + +#: rapid/rapid.py:3957 msgid "reset all program settings and preferences and exit" msgstr "nollställ alla inställningar och avsluta" -#: rapid/rapid.py:3801 +#: rapid/rapid.py:3970 +msgid "" +"Error: specify device auto-detection or manually specify a device's path " +"from which to download, but do not do both." +msgstr "" +"Fel: Aktivera antingen automatisk identifiering av enheter eller ange en " +"enhetssökväg manuellt. Du kan inte välja båda." + +#: rapid/rapid.py:3991 #, python-format msgid "and %s" msgstr "och %s" -#: rapid/rapid.py:3809 +#: rapid/rapid.py:3999 msgid "All settings and preferences have been reset" msgstr "Alla inställningar har nollställts" -#: rapid/backupfile.py:142 rapid/backupfile.py:165 +#: rapid/backupfile.py:157 rapid/backupfile.py:180 msgid "Backing up error" msgstr "Fel vid säkerhetskopiering" -#: rapid/backupfile.py:144 +#: rapid/backupfile.py:159 #, python-format msgid "Destination directory could not be created: %(directory)s\n" msgstr "Målplatsen kunde inte skapas: %(directory)s\n" -#: rapid/backupfile.py:146 rapid/backupfile.py:167 rapid/subfolderfile.py:196 +#: rapid/backupfile.py:161 rapid/backupfile.py:182 rapid/subfolderfile.py:199 #, python-format msgid "" "Source: %(source)s\n" @@ -425,13 +451,13 @@ msgstr "" "Källa: %(source)s\n" "Destination: %(destination)s" -#: rapid/backupfile.py:149 rapid/backupfile.py:169 +#: rapid/backupfile.py:164 rapid/backupfile.py:184 #, python-format msgid "Error: %(inst)s" msgstr "Fel: %(inst)s" -#: rapid/copyfiles.py:159 rapid/subfolderfile.py:211 -#: rapid/subfolderfile.py:352 rapid/subfolderfile.py:370 +#: rapid/copyfiles.py:163 rapid/subfolderfile.py:214 +#: rapid/subfolderfile.py:347 rapid/subfolderfile.py:365 #, python-format msgid "" "%(problem)s\n" @@ -440,492 +466,502 @@ msgstr "" "%(problem)s\n" "Fil: %(file)s" -#: rapid/device.py:79 +#: rapid/device.py:80 msgid "Device Detected" msgstr "Enhet hittad" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#usedeviceprompt -#: rapid/device.py:88 +#: rapid/device.py:89 msgid "" "Should this device or partition be used to download photos or videos from?" msgstr "Skall denna enhet användas för bild- eller filmöverföring?" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#usedeviceprompt -#: rapid/device.py:107 +#: rapid/device.py:108 msgid "_Remember this choice" msgstr "_Kom ihåg mitt val" -#: rapid/downloadtracker.py:298 +#: rapid/downloadtracker.py:299 msgid "MB/s" msgstr "MB/s" -#: rapid/generatenameconfig.py:150 +#: rapid/generatenameconfig.py:151 msgid "Date time" msgstr "Datumtid" -#: rapid/generatenameconfig.py:151 +#: rapid/generatenameconfig.py:152 msgid "Text" msgstr "Text" -#: rapid/generatenameconfig.py:152 +#: rapid/generatenameconfig.py:153 msgid "Filename" msgstr "Filnamn" -#: rapid/generatenameconfig.py:153 +#: rapid/generatenameconfig.py:154 msgid "Metadata" msgstr "Metadata" -#: rapid/generatenameconfig.py:154 +#: rapid/generatenameconfig.py:155 msgid "Sequences" msgstr "Sekvenser" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode -#: rapid/generatenameconfig.py:156 rapid/preferencesdialog.py:574 +#: rapid/generatenameconfig.py:157 rapid/preferencesdialog.py:577 msgid "Job code" msgstr "Fototillfälle" -#: rapid/generatenameconfig.py:157 +#: rapid/generatenameconfig.py:158 msgid "Image date" msgstr "Bilddatum" -#: rapid/generatenameconfig.py:158 +#: rapid/generatenameconfig.py:159 msgid "Video date" msgstr "Filmdatum" -#: rapid/generatenameconfig.py:159 +#: rapid/generatenameconfig.py:160 msgid "Today" msgstr "Idag" -#: rapid/generatenameconfig.py:160 +#: rapid/generatenameconfig.py:161 msgid "Yesterday" msgstr "Igår" #. Translators: Download time is the time and date that the download started (when the user clicked the Download button) -#: rapid/generatenameconfig.py:162 +#: rapid/generatenameconfig.py:163 msgid "Download time" msgstr "Nedladdningstid" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:164 +#: rapid/generatenameconfig.py:165 msgid "Name + extension" msgstr "Namn + filändelse" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:166 +#: rapid/generatenameconfig.py:167 msgid "Name" msgstr "Namn" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:168 +#: rapid/generatenameconfig.py:169 msgid "Extension" msgstr "Filändelse" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:170 +#: rapid/generatenameconfig.py:171 msgid "Image number" msgstr "Bildnummer" -#: rapid/generatenameconfig.py:171 +#: rapid/generatenameconfig.py:172 msgid "Video number" msgstr "Filmnummer" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:173 +#: rapid/generatenameconfig.py:174 msgid "Aperture" msgstr "Bländare" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:175 +#: rapid/generatenameconfig.py:176 msgid "ISO" msgstr "ISO" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:177 +#: rapid/generatenameconfig.py:178 msgid "Exposure time" msgstr "Bländartid" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:179 +#: rapid/generatenameconfig.py:180 msgid "Focal length" msgstr "Brännvidd" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:181 +#: rapid/generatenameconfig.py:182 msgid "Camera make" msgstr "Kameratillverkare" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:183 +#: rapid/generatenameconfig.py:184 msgid "Camera model" msgstr "Kameramodell" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:185 +#: rapid/generatenameconfig.py:186 msgid "Short camera model" msgstr "Förkortning på kameramodell" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:187 +#: rapid/generatenameconfig.py:188 msgid "Hyphenated short camera model" msgstr "Utökad förkortning på kameramodell" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:189 +#: rapid/generatenameconfig.py:190 msgid "Serial number" msgstr "Serienummer" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:191 +#: rapid/generatenameconfig.py:192 msgid "Shutter count" msgstr "Antal exponeringar" #. File number currently refers to the Exif value Exif.Canon.FileNumber -#: rapid/generatenameconfig.py:193 +#: rapid/generatenameconfig.py:194 msgid "File number" -msgstr "" +msgstr "Filnummer" #. Only the folder component of the Exif.Canon.FileNumber value -#: rapid/generatenameconfig.py:195 +#: rapid/generatenameconfig.py:196 msgid "Folder only" msgstr "Endast mappen" #. The folder and file component of the Exif.Canon.FileNumber value -#: rapid/generatenameconfig.py:197 +#: rapid/generatenameconfig.py:198 msgid "Folder and file" -msgstr "" +msgstr "Mapp och fil" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamemetadata -#: rapid/generatenameconfig.py:199 +#: rapid/generatenameconfig.py:200 msgid "Owner name" msgstr "Ägarens namn" -#: rapid/generatenameconfig.py:200 +#: rapid/generatenameconfig.py:201 msgid "Codec" msgstr "Kodek" -#: rapid/generatenameconfig.py:201 +#: rapid/generatenameconfig.py:202 msgid "Width" msgstr "Bredd" -#: rapid/generatenameconfig.py:202 +#: rapid/generatenameconfig.py:203 msgid "Height" msgstr "Höjd" -#: rapid/generatenameconfig.py:203 +#: rapid/generatenameconfig.py:204 msgid "Length" msgstr "Längd" -#: rapid/generatenameconfig.py:204 +#: rapid/generatenameconfig.py:205 msgid "Frames Per Second" msgstr "Bildrutor per sekund" -#: rapid/generatenameconfig.py:205 +#: rapid/generatenameconfig.py:206 msgid "Artist" msgstr "Artist" -#: rapid/generatenameconfig.py:206 +#: rapid/generatenameconfig.py:207 msgid "Copyright" msgstr "Upphovsrätt" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#sequencenumbers -#: rapid/generatenameconfig.py:208 +#: rapid/generatenameconfig.py:209 msgid "Downloads today" msgstr "Överföringar idag" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#sequencenumbers -#: rapid/generatenameconfig.py:210 +#: rapid/generatenameconfig.py:211 msgid "Session number" msgstr "Sessionsnummer" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#sequencenumbers -#: rapid/generatenameconfig.py:212 +#: rapid/generatenameconfig.py:213 msgid "Subfolder number" msgstr "Nummer på underkatalog" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#sequencenumbers -#: rapid/generatenameconfig.py:214 +#: rapid/generatenameconfig.py:215 msgid "Stored number" msgstr "Tidigare sekvensnummer" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#sequenceletters -#: rapid/generatenameconfig.py:216 +#: rapid/generatenameconfig.py:217 msgid "Sequence letter" msgstr "Sekvensbokstav" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:218 +#: rapid/generatenameconfig.py:219 msgid "All digits" msgstr "Alla siffror" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:220 +#: rapid/generatenameconfig.py:221 msgid "Last digit" msgstr "Senaste siffra" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:222 +#: rapid/generatenameconfig.py:223 msgid "Last 2 digits" msgstr "Senaste två siffrorna" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:224 +#: rapid/generatenameconfig.py:225 msgid "Last 3 digits" msgstr "Senaste tre siffrorna" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamefilename -#: rapid/generatenameconfig.py:226 +#: rapid/generatenameconfig.py:227 msgid "Last 4 digits" msgstr "Senaste fyra siffrorna" #. Translators: please not the capitalization of this text, and keep it the same if your language features capitalization -#: rapid/generatenameconfig.py:228 +#: rapid/generatenameconfig.py:229 msgid "Original Case" msgstr "Använd ursprungligt skiftläge" #. Translators: please not the capitalization of this text, and keep it the same if your language features capitalization -#: rapid/generatenameconfig.py:230 +#: rapid/generatenameconfig.py:231 msgid "UPPERCASE" msgstr "VERSALER" #. Translators: please not the capitalization of this text, and keep it the same if your language features capitalization -#: rapid/generatenameconfig.py:232 +#: rapid/generatenameconfig.py:233 msgid "lowercase" msgstr "gemener" -#: rapid/generatenameconfig.py:233 +#: rapid/generatenameconfig.py:234 msgid "One digit" msgstr "En siffra" -#: rapid/generatenameconfig.py:234 +#: rapid/generatenameconfig.py:235 msgid "Two digits" msgstr "Två siffror" -#: rapid/generatenameconfig.py:235 +#: rapid/generatenameconfig.py:236 msgid "Three digits" msgstr "Tre siffror" -#: rapid/generatenameconfig.py:236 +#: rapid/generatenameconfig.py:237 msgid "Four digits" msgstr "Fyra siffror" -#: rapid/generatenameconfig.py:237 +#: rapid/generatenameconfig.py:238 msgid "Five digits" msgstr "Fem siffror" -#: rapid/generatenameconfig.py:238 +#: rapid/generatenameconfig.py:239 msgid "Six digits" msgstr "Sex siffror" -#: rapid/generatenameconfig.py:239 +#: rapid/generatenameconfig.py:240 msgid "Seven digits" msgstr "Sju siffror" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:241 +#: rapid/generatenameconfig.py:242 msgid "Subseconds" msgstr "Sekunder" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:243 +#: rapid/generatenameconfig.py:244 msgid "YYYYMMDD" msgstr "ÅÅÅÅMMDD" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:245 +#: rapid/generatenameconfig.py:246 msgid "YYYY-MM-DD" msgstr "ÅÅÅÅ-MM-DD" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:247 +#: rapid/generatenameconfig.py:248 msgid "YYMMDD" msgstr "ÅÅMMDD" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:249 +#: rapid/generatenameconfig.py:250 msgid "YY-MM-DD" msgstr "ÅÅ-MM-DD" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:251 +#: rapid/generatenameconfig.py:252 msgid "MMDDYYYY" msgstr "MMDDÅÅÅÅ" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:253 +#: rapid/generatenameconfig.py:254 msgid "MMDDYY" msgstr "MMDDÅÅ" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:255 +#: rapid/generatenameconfig.py:256 msgid "MMDD" msgstr "MMDD" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:257 +#: rapid/generatenameconfig.py:258 msgid "DDMMYYYY" msgstr "DDMMÅÅÅÅ" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:259 +#: rapid/generatenameconfig.py:260 msgid "DDMMYY" msgstr "DDMMÅÅ" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:261 +#: rapid/generatenameconfig.py:262 msgid "YYYY" msgstr "ÅÅÅÅ" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:263 +#: rapid/generatenameconfig.py:264 msgid "YY" msgstr "ÅÅ" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:265 +#: rapid/generatenameconfig.py:266 msgid "MM" msgstr "MM" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:267 +#: rapid/generatenameconfig.py:268 msgid "DD" msgstr "DD" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:269 +#: rapid/generatenameconfig.py:270 +msgid "Month (full)" +msgstr "Månad (fullständigt namn)" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:272 +msgid "Month (abbreviated)" +msgstr "Månad (förkortad)" + +#. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime +#: rapid/generatenameconfig.py:274 msgid "HHMMSS" msgstr "HHMMSS" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:271 +#: rapid/generatenameconfig.py:276 msgid "HHMM" msgstr "HHMM" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:273 +#: rapid/generatenameconfig.py:278 msgid "HH-MM-SS" msgstr "HH-MM-SS" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:275 +#: rapid/generatenameconfig.py:280 msgid "HH-MM" msgstr "HH-MM" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:277 +#: rapid/generatenameconfig.py:282 msgid "HH" msgstr "HH" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:279 +#: rapid/generatenameconfig.py:284 msgid "MM (minutes)" msgstr "MM (minuter)" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#renamedateandtime -#: rapid/generatenameconfig.py:281 +#: rapid/generatenameconfig.py:286 msgid "SS" msgstr "SS" -#: rapid/preferencesdialog.py:371 +#: rapid/preferencesdialog.py:374 #, python-format msgid "Subfolder preferences should not start with a %s" msgstr "Inställningen för underkataloger skall inte börja med %s" -#: rapid/preferencesdialog.py:373 +#: rapid/preferencesdialog.py:376 #, python-format msgid "Subfolder preferences should not end with a %s" msgstr "Inställning för underkatalog skall inte börja med %s" -#: rapid/preferencesdialog.py:377 +#: rapid/preferencesdialog.py:380 #, python-format msgid "Subfolder preferences should not contain two %s one after the other" msgstr "Inställning för underkatalog skall inte innehålla två %s i rad" -#: rapid/preferencesdialog.py:436 rapid/preferencesdialog.py:697 +#: rapid/preferencesdialog.py:439 rapid/preferencesdialog.py:700 msgid "Remove all Job Codes?" msgstr "Ta bort alla fototillfällen?" -#: rapid/preferencesdialog.py:437 rapid/preferencesdialog.py:714 +#: rapid/preferencesdialog.py:440 rapid/preferencesdialog.py:717 msgid "Should all Job Codes be removed?" msgstr "Vill du ta bort alla fototillfällen?" -#: rapid/preferencesdialog.py:443 +#: rapid/preferencesdialog.py:446 msgid "Remove all Remembered Paths?" msgstr "Ta bort alla sparade sökvägar?" -#: rapid/preferencesdialog.py:444 +#: rapid/preferencesdialog.py:447 msgid "Should all remembered paths be removed?" msgstr "Ska alla sparade sökvägar tas bort?" -#: rapid/preferencesdialog.py:450 +#: rapid/preferencesdialog.py:453 msgid "Remove all Ignored Paths?" msgstr "Ta bort alla ignorerade sökvägar?" -#: rapid/preferencesdialog.py:451 +#: rapid/preferencesdialog.py:454 msgid "Should all ignored paths be removed?" msgstr "Ska alla ignorerade sökvägar tas bort?" -#: rapid/preferencesdialog.py:462 +#: rapid/preferencesdialog.py:465 msgid "Error in Photo Rename preferences" msgstr "Fel i inställningarna för bildnamnbyte" -#: rapid/preferencesdialog.py:642 +#: rapid/preferencesdialog.py:645 msgid "Error in Video Rename preferences" msgstr "Fel i inställningarna för filmnamnbyte" -#: rapid/preferencesdialog.py:663 +#: rapid/preferencesdialog.py:666 msgid "Error in Photo Download Subfolders preferences" msgstr "Fel i inställningarna för bildöverföring" -#: rapid/preferencesdialog.py:680 +#: rapid/preferencesdialog.py:683 msgid "Error in Video Download Subfolders preferences" msgstr "Fel i inställningarna för filmöverföring" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode -#: rapid/preferencesdialog.py:739 +#: rapid/preferencesdialog.py:742 msgid "Enter a Job Code" msgstr "Ange fototillfälle" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode -#: rapid/preferencesdialog.py:755 +#: rapid/preferencesdialog.py:758 msgid "Enter a new Job Code, or select a previous one" msgstr "Skriv ett nytt jobbnummer, eller välj ett föregående" #. Translators: for an explanation of what this means, see http://damonlynch.net/rapid/documentation/index.html#jobcode -#: rapid/preferencesdialog.py:758 +#: rapid/preferencesdialog.py:761 msgid "Enter a new Job Code" msgstr "Ange nytt jobbnamn" -#: rapid/preferencesdialog.py:763 +#: rapid/preferencesdialog.py:766 msgid "Job Code:" msgstr "Fototillfälle:" -#: rapid/preferencesdialog.py:819 +#: rapid/preferencesdialog.py:822 msgid "Enter a Path to Ignore" msgstr "Ange sökväg att ignorera" -#: rapid/preferencesdialog.py:831 +#: rapid/preferencesdialog.py:834 msgid "Specify a path that will never be scanned for photos or videos" msgstr "" "Ange en sökväg som aldrig kommer att avsökas efter bilder eller videor" -#: rapid/preferencesdialog.py:836 +#: rapid/preferencesdialog.py:839 msgid "Path:" msgstr "Sökväg:" -#: rapid/preferencesdialog.py:1079 +#: rapid/preferencesdialog.py:1082 msgid "Job Code" msgstr "Jobbnamn" -#: rapid/preferencesdialog.py:1350 +#: rapid/preferencesdialog.py:1353 msgid "Select a folder in which to backup photos" msgstr "Välj en plats för att säkerhetskopiera bilder" -#: rapid/preferencesdialog.py:1363 +#: rapid/preferencesdialog.py:1366 msgid "Select a folder in which to backup videos" msgstr "Välj en plats för att säkerhetskopiera videor" #. 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:1458 +#: rapid/preferencesdialog.py:1461 msgid "" "<i><b>Warning:</b> There is insufficient metadata to fully generate the " "name. Please use other renaming options.</i>" @@ -933,7 +969,7 @@ msgstr "" "<i><b>Varning:</b> Det saknas metadata för att namnge. Var god välj andra " "inställningar för namngivning.</i>" -#: rapid/preferencesdialog.py:1509 +#: rapid/preferencesdialog.py:1512 msgid "" "<i><b>Warning:</b> There is insufficient metadata to fully generate " "subfolders. Please use other subfolder naming options.</i>" @@ -942,13 +978,13 @@ msgstr "" "underkataloger. Välj andra inställningar för att namnge underkataloger.</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:1512 +#: rapid/preferencesdialog.py:1515 #, python-format msgid "<i>Example: %s</i>" msgstr "<i>Exempel: %s</i>" #. Preferences list is now empty -#: rapid/preferencesdialog.py:1602 +#: rapid/preferencesdialog.py:1605 #, python-format msgid "" "The %(filetype)s subfolder preferences entered are invalid and cannot be " @@ -959,7 +995,7 @@ msgstr "" "användas.\n" "Återställer till standardvärden." -#: rapid/preferencesdialog.py:1747 +#: rapid/preferencesdialog.py:1750 #, python-format msgid "" "The following regular expressions are invalid, and will be removed unless " @@ -970,7 +1006,7 @@ msgstr "" "ändrar dem:\n" " %s" -#: rapid/preferencesdialog.py:1749 +#: rapid/preferencesdialog.py:1752 #, python-format msgid "" "This regular expression is invalid, and will be removed unless you correct " @@ -981,142 +1017,142 @@ msgstr "" "ändrar det:\n" " %s" -#: rapid/preferencesdialog.py:1750 +#: rapid/preferencesdialog.py:1753 msgid "Invalid regular expression" msgstr "Ogiltigt reguljärt uttryck" #. Translators: this value is used as an example device when automatic backup device detection is enabled. You should translate this. -#: rapid/preferencesdialog.py:1931 +#: rapid/preferencesdialog.py:1934 msgid "externaldrive1" msgstr "extern_enhet_1" #. Translators: this value is used as an example device when automatic backup device detection is enabled. You should translate this. -#: rapid/preferencesdialog.py:1933 +#: rapid/preferencesdialog.py:1936 msgid "externaldrive2" msgstr "extern_enhet_2" -#: rapid/prefsrapid.py:126 +#: rapid/prefsrapid.py:127 msgid "New York" msgstr "New York" -#: rapid/prefsrapid.py:127 +#: rapid/prefsrapid.py:128 msgid "Manila" msgstr "Manilla" -#: rapid/prefsrapid.py:127 +#: rapid/prefsrapid.py:128 msgid "Prague" msgstr "Prag" -#: rapid/prefsrapid.py:127 +#: rapid/prefsrapid.py:128 msgid "Helsinki" msgstr "Helsingfors" -#: rapid/prefsrapid.py:127 +#: rapid/prefsrapid.py:128 msgid "Wellington" msgstr "Wellington" -#: rapid/prefsrapid.py:128 +#: rapid/prefsrapid.py:129 msgid "Tehran" msgstr "Teheran" -#: rapid/prefsrapid.py:128 +#: rapid/prefsrapid.py:129 msgid "Kampala" msgstr "Kampala" -#: rapid/prefsrapid.py:128 +#: rapid/prefsrapid.py:129 msgid "Paris" msgstr "Paris" -#: rapid/prefsrapid.py:128 +#: rapid/prefsrapid.py:129 msgid "Berlin" msgstr "Berlin" -#: rapid/prefsrapid.py:128 +#: rapid/prefsrapid.py:129 msgid "Sydney" msgstr "Sydney" -#: rapid/prefsrapid.py:129 +#: rapid/prefsrapid.py:130 msgid "Budapest" msgstr "Budapest" -#: rapid/prefsrapid.py:129 +#: rapid/prefsrapid.py:130 msgid "Rome" msgstr "Rom" -#: rapid/prefsrapid.py:129 +#: rapid/prefsrapid.py:130 msgid "Moscow" msgstr "Moskva" -#: rapid/prefsrapid.py:129 +#: rapid/prefsrapid.py:130 msgid "Delhi" msgstr "Delhi" -#: rapid/prefsrapid.py:129 +#: rapid/prefsrapid.py:130 msgid "Warsaw" msgstr "Warszawa" -#: rapid/prefsrapid.py:130 +#: rapid/prefsrapid.py:131 msgid "Jakarta" msgstr "Djakarta" -#: rapid/prefsrapid.py:130 +#: rapid/prefsrapid.py:131 msgid "Madrid" msgstr "Madrid" -#: rapid/prefsrapid.py:130 +#: rapid/prefsrapid.py:131 msgid "Stockholm" msgstr "Stockholm" #. components -#: rapid/problemnotification.py:26 rapid/subfolderfile.py:363 +#: rapid/problemnotification.py:27 rapid/subfolderfile.py:358 msgid "subfolder" msgstr "Underkatalog" -#: rapid/problemnotification.py:27 rapid/subfolderfile.py:361 +#: rapid/problemnotification.py:28 rapid/subfolderfile.py:356 msgid "filename" msgstr "Filnamn" -#: rapid/problemnotification.py:80 +#: rapid/problemnotification.py:81 #, python-format msgid "Date time value %s appears invalid." msgstr "Datum/tid-värde %s verkar ogiltigt." -#: rapid/problemnotification.py:81 +#: rapid/problemnotification.py:82 msgid "Filename does not have an extension." msgstr "Filnamnet saknar filändelse." #. a number component is something like the 8346 in IMG_8346.JPG -#: rapid/problemnotification.py:83 +#: rapid/problemnotification.py:84 msgid "Filename does not have a number component." msgstr "Filnamnet saknar sekvensnummer." -#: rapid/problemnotification.py:84 +#: rapid/problemnotification.py:85 #, python-format msgid "Error generating component %s." msgstr "Ett fel uppstod när nummer %s skulle skapas." #. a generic problem -#: rapid/problemnotification.py:86 +#: rapid/problemnotification.py:87 #, python-format msgid "%(filetype)s metadata cannot be read" msgstr "Metadata i %(filetype)s kan inte läsas." -#: rapid/problemnotification.py:88 +#: rapid/problemnotification.py:89 #, python-format msgid "%(filetype)s %(area)s could not be generated" msgstr "%(filetype)s %(area)s kunde inte skapas." -#: rapid/problemnotification.py:90 rapid/problemnotification.py:91 +#: rapid/problemnotification.py:91 rapid/problemnotification.py:92 #, python-format msgid "An error occurred when copying the %(filetype)s" msgstr "Ett fel uppstod när %(filetype)s skulle kopieras" -#: rapid/problemnotification.py:93 rapid/problemnotification.py:94 +#: rapid/problemnotification.py:94 rapid/problemnotification.py:95 #, python-format msgid "%(filetype)s already exists" msgstr "%(filetype)s finns redan" -#: rapid/problemnotification.py:97 +#: rapid/problemnotification.py:98 #, python-format msgid "" "%(filetype)s could not be backed up because no suitable backup locations " @@ -1125,7 +1161,7 @@ msgstr "" "%(filetype)s kunde inte säkerhetskopieras, eftersom ingen plats för " "säkerhetskopior hittades." -#: rapid/problemnotification.py:102 +#: rapid/problemnotification.py:103 #, python-format msgid "" "%(image1)s was taken on %(image1_date)s at %(image1_time)s, and %(image2)s " @@ -1134,12 +1170,12 @@ msgstr "" "%(image1)s togs den %(image1_date)s kl %(image1_time)s, och %(image2)s den " "%(image2_date)s kl %(image2_time)s." -#: rapid/problemnotification.py:103 +#: rapid/problemnotification.py:104 #, python-format msgid "%(filetype)s was already downloaded" msgstr "%(filetype)s är redan nedladdad" -#: rapid/problemnotification.py:107 +#: rapid/problemnotification.py:108 #, python-format msgid "" "The existing %(filetype)s was last modified on %(date)s at %(time)s. Unique " @@ -1148,54 +1184,54 @@ msgstr "" "Den existerande %(filetype)s ändrades senast den %(date)s kl %(time)s. Den " "har fått '%(identifier)s' som unik identifierare." -#: rapid/problemnotification.py:108 +#: rapid/problemnotification.py:109 #, python-format msgid "The existing %(filetype)s was last modified on %(date)s at %(time)s." msgstr "" "Den existerande %(filetype)s ändrades senast den %(date)s kl %(time)s." -#: rapid/problemnotification.py:109 +#: rapid/problemnotification.py:110 #, python-format msgid "There is no data with which to name the %(filetype)s." msgstr "Det saknas data för att namnge %(filetype)s." -#: rapid/problemnotification.py:111 +#: rapid/problemnotification.py:112 #, python-format msgid "Error: %(errorno)s %(strerror)s" msgstr "Fel: %(errorno)s %(strerror)s" -#: rapid/problemnotification.py:201 +#: rapid/problemnotification.py:202 msgid "The metadata might be corrupt." msgstr "Metadatan kan vara korrupt." -#: rapid/problemnotification.py:204 +#: rapid/problemnotification.py:205 msgid "" "The filename, extension and Exif information indicate it has already been " "downloaded." msgstr "Filnamnet, filändelsen och Exif-informationen har redan överförts." -#: rapid/problemnotification.py:223 +#: rapid/problemnotification.py:224 #, python-format msgid " It was backed up to %(volume)s" msgstr " Den har säkerhetskopierats till %(volume)s" -#: rapid/problemnotification.py:225 +#: rapid/problemnotification.py:226 msgid " It was backed up to these devices: " msgstr " Den har säkerhetskopierats till följande enheter: " -#: rapid/problemnotification.py:227 rapid/problemnotification.py:288 -#: rapid/problemnotification.py:300 +#: rapid/problemnotification.py:228 rapid/problemnotification.py:289 +#: rapid/problemnotification.py:301 #, python-format msgid "%s, " msgstr "%s, " -#: rapid/problemnotification.py:228 rapid/problemnotification.py:289 -#: rapid/problemnotification.py:301 +#: rapid/problemnotification.py:229 rapid/problemnotification.py:290 +#: rapid/problemnotification.py:302 #, python-format msgid "%(volumes)s and %(final_volume)s." msgstr "%(volumes)s och %(final_volume)s." -#: rapid/problemnotification.py:240 +#: rapid/problemnotification.py:241 #, python-format msgid "" "Photos detected with the same filenames, but taken at different times: " @@ -1204,486 +1240,453 @@ msgstr "" "Hittade bilder med samma filnamn, fast tagna vid olika tillfällen: " "%(details)s" -#: rapid/problemnotification.py:257 +#: rapid/problemnotification.py:258 #, python-format msgid "An error occurred when backing up on %(volume)s: %(inst)s." msgstr "" "Ett fel uppstod när säkerhetskopia skulle tas till %(volume)s: %(inst)s." -#: rapid/problemnotification.py:259 +#: rapid/problemnotification.py:260 #, python-format msgid "An error occurred when backing up on %(volume)s." msgstr "Ett fel uppstod när säkerhetskopia skulle tas till %(volume)s." -#: rapid/problemnotification.py:261 +#: rapid/problemnotification.py:262 msgid "Errors occurred when backing up on the following backup devices: " msgstr "" "Ett fel uppstod när säkerhetskopia skulle tas till följande enheter: " -#: rapid/problemnotification.py:265 rapid/problemnotification.py:313 +#: rapid/problemnotification.py:266 rapid/problemnotification.py:314 #, python-format msgid "%(volume)s (%(inst)s), " msgstr "%(volume)s (%(inst)s), " -#: rapid/problemnotification.py:267 +#: rapid/problemnotification.py:268 #, python-format msgid "%(volume)s, " msgstr "%(volume)s, " -#: rapid/problemnotification.py:271 rapid/problemnotification.py:315 +#: rapid/problemnotification.py:272 rapid/problemnotification.py:316 #, python-format msgid "%(volumes)s and %(volume)s (%(inst)s)." msgstr "%(volumes)s och %(volume)s (%(inst)s)." -#: rapid/problemnotification.py:276 +#: rapid/problemnotification.py:277 #, python-format msgid "%(volumes)s and %(volume)s." msgstr "%(volumes)s och %(volume)s." -#: rapid/problemnotification.py:284 +#: rapid/problemnotification.py:285 #, python-format msgid "Backup already exists on %(volume)s." msgstr "Säkerhetskopia finns redan på %(volume)s." -#: rapid/problemnotification.py:286 +#: rapid/problemnotification.py:287 msgid "Backups already exist in these locations: " msgstr "Säkerhetskopia finns redan i: " -#: rapid/problemnotification.py:296 +#: rapid/problemnotification.py:297 #, python-format msgid "Backup overwritten on %(volume)s." msgstr "Säkerhetskopia skrevs över på %(volume)s." -#: rapid/problemnotification.py:298 +#: rapid/problemnotification.py:299 msgid "Backups overwritten on these devices: " msgstr "Säkerhetskopia skrevs över i: " -#: rapid/problemnotification.py:309 +#: rapid/problemnotification.py:310 #, python-format msgid "An error occurred when creating directories on %(volume)s: %(inst)s." msgstr "Ett fel uppstod när kataloger skulle skapas på %(volume)s: %(inst)s." -#: rapid/problemnotification.py:311 +#: rapid/problemnotification.py:312 msgid "" "Errors occurred when creating directories on the following backup devices: " msgstr "Ett fel uppstod när kataloger skulle skapas på följande enheter: " -#: rapid/problemnotification.py:322 +#: rapid/problemnotification.py:323 #, python-format msgid "%(previousproblem)s Additionally, %(newproblem)s" msgstr "%(previousproblem)s Mer problem därtill, %(newproblem)s" -#: rapid/problemnotification.py:330 +#: rapid/problemnotification.py:331 #, python-format msgid " Furthermore, there were %(problems)s." msgstr " Problem hittades %(problems)s." -#: rapid/problemnotification.py:332 +#: rapid/problemnotification.py:333 #, python-format msgid " Furthermore, there was a %(problem)s." msgstr " Ett problem hittades %(problem)s." -#: rapid/problemnotification.py:341 +#: rapid/problemnotification.py:342 #, python-format msgid "The %(type)s metadata is missing." msgstr "%(type)s metadata saknas." -#: rapid/problemnotification.py:343 +#: rapid/problemnotification.py:344 msgid "The following metadata is missing: " msgstr "Följande metadata saknas: " -#: rapid/problemnotification.py:346 +#: rapid/problemnotification.py:347 #, python-format msgid "%(missing_metadata_elements)s and %(final_missing_metadata_element)s." msgstr "" "%(missing_metadata_elements)s oct %(final_missing_metadata_element)s." -#: rapid/problemnotification.py:363 +#: rapid/problemnotification.py:364 msgid "Problems in subfolder and filename generation" msgstr "Problem med skapande av undermappar och filnamn" -#: rapid/problemnotification.py:365 +#: rapid/problemnotification.py:366 msgid "Problem in subfolder and filename generation" msgstr "Problem med skapande av undermappar och filnamn" -#: rapid/problemnotification.py:368 +#: rapid/problemnotification.py:369 #, python-format msgid "Problems in %s generation" msgstr "Problem med skapande av %s" -#: rapid/problemnotification.py:370 +#: rapid/problemnotification.py:371 #, python-format msgid "Problem in %s generation" msgstr "Problem med skapande av %s" -#: rapid/problemnotification.py:379 +#: rapid/problemnotification.py:380 #, python-format msgid "%(filetype)s already exists, but it was backed up" msgstr "%(filetype)s finns redan, men säkerhetskopierades" -#: rapid/problemnotification.py:381 +#: rapid/problemnotification.py:382 #, python-format msgid "An error occurred when copying the %(filetype)s, but it was backed up" msgstr "" "Ett fel uppstod vid kopiering av %(filetype)s, men säkerhetskopierades" -#: rapid/problemnotification.py:401 +#: rapid/problemnotification.py:402 msgid "Multiple problems were encountered" msgstr "Flera fel hittades" -#: rapid/problemnotification.py:403 rapid/subfolderfile.py:230 +#: rapid/problemnotification.py:404 rapid/subfolderfile.py:233 msgid "Photos detected with the same filenames, but taken at different times" msgstr "Bilder med samma filnamn hittades, fast tagna vid olika tillfällen" -#: rapid/problemnotification.py:409 +#: rapid/problemnotification.py:410 msgid "there were errors backing up" msgstr "det uppstod fel vid säkerhetskopiering" -#: rapid/problemnotification.py:410 +#: rapid/problemnotification.py:411 msgid "There were errors backing up" msgstr "Det uppstod fel vid säkerhetskopiering" -#: rapid/problemnotification.py:412 +#: rapid/problemnotification.py:413 msgid "there was an error backing up" msgstr "det uppstod ett fel vid säkerhetskopiering" -#: rapid/problemnotification.py:413 +#: rapid/problemnotification.py:414 msgid "There was an error backing up" msgstr "Det uppstod ett fel vid säkerhetskopiering" #. e.g. -#: rapid/problemnotification.py:416 +#: rapid/problemnotification.py:417 #, python-format msgid "%(previousproblem)s, and %(backinguperror)s" msgstr "%(previousproblem)s, och %(backinguperror)s" -#: rapid/rpdfile.py:139 +#: rapid/rpdfile.py:153 #, python-format msgid "%(number)s %(filetypes)s" msgstr "%(number)s %(filetypes)s" -#: rapid/subfolderfile.py:79 +#: rapid/rpdfile.py:163 +#, python-format +msgid "scanning (found %(photos)s photos and %(videos)s videos)..." +msgstr "söker igenom (har hittat %(photos)s bilder och %(videos)s videor)…" + +#: rapid/subfolderfile.py:80 #, python-format msgid "%(hour)s:%(minute)s:%(second)s:%(subsecond)s" msgstr "%(hour)s:%(minute)s:%(second)s:%(subsecond)s" -#: rapid/subfolderfile.py:300 +#: rapid/subfolderfile.py:301 msgid "Photo has already been downloaded" msgstr "Bilden har redan överförts" -#: rapid/subfolderfile.py:301 +#: rapid/subfolderfile.py:302 #, python-format msgid "Source: %(source)s" msgstr "Källa: %(source)s" -#: rapid/subfolderfile.py:359 +#: rapid/subfolderfile.py:354 msgid "subfolder and filename" msgstr "undermapp och filnamn" -#: rapid/subfolderfile.py:397 +#: rapid/subfolderfile.py:393 msgid "Failed to create download subfolder" msgstr "Misslyckades med att skapa mapp för nedladdning" -#: rapid/subfolderfile.py:398 +#: rapid/subfolderfile.py:394 #, python-format msgid "Path: %s" msgstr "Sökväg: %s" -#: rapid/glade3/rapid.ui.h:1 -msgid "About..." -msgstr "Om..." - #: rapid/glade3/rapid.ui.h:2 -msgid "Check All" -msgstr "Markera alla" +msgid "_File" +msgstr "_Arkiv" #: rapid/glade3/rapid.ui.h:3 -msgid "Check All Photos" -msgstr "Markera alla bilder" +msgid "Download / Pause" +msgstr "Överföring / Paus" #: rapid/glade3/rapid.ui.h:4 -msgid "Check All Videos" -msgstr "Markera alla videor" +msgid "_Select" +msgstr "_Markera" + +#: rapid/glade3/rapid.ui.h:5 +msgid "Select All Without _Job Code" +msgstr "Markera alla som sakna_r fototillfälle" #: rapid/glade3/rapid.ui.h:6 -msgid "Download / Pause" -msgstr "Överföring / Paus" +msgid "Select All Wit_h Job Code" +msgstr "Markera alla vid ett fototillf_älle" #: rapid/glade3/rapid.ui.h:7 -msgid "Get Help Online..." -msgstr "Få hjälp på internet..." +msgid "_View" +msgstr "_Visa" #: rapid/glade3/rapid.ui.h:8 -msgid "Help" -msgstr "Hjälp" +msgid "_Error Log" +msgstr "_Fellogg" #: rapid/glade3/rapid.ui.h:9 -msgid "Make a Donation..." -msgstr "Donera..." +msgid "_Clear Completed Downloads" +msgstr "_Töm slutförda överföringar" #: rapid/glade3/rapid.ui.h:10 -msgid "Next File" -msgstr "Nästa fil" - -#: rapid/glade3/rapid.ui.h:11 -msgid "Preferences" -msgstr "Inställningar" - -#: rapid/glade3/rapid.ui.h:12 msgid "Previous File" msgstr "Föregående fil" -#: rapid/glade3/rapid.ui.h:13 -msgid "Quit" -msgstr "Avsluta" - -#: rapid/glade3/rapid.ui.h:15 -msgid "Refresh" -msgstr "Uppdatera" - -#: rapid/glade3/rapid.ui.h:16 -msgid "Report a Problem..." -msgstr "Rapportera problem..." - -#: rapid/glade3/rapid.ui.h:17 -msgid "Select All Wit_h Job Code" -msgstr "Markera alla vid ett fototillf_älle" - -#: rapid/glade3/rapid.ui.h:18 -msgid "Select All Without _Job Code" -msgstr "Markera alla som sakna_r fototillfälle" - -#: rapid/glade3/rapid.ui.h:19 -msgid "Translate this Application..." -msgstr "Översätt detta program..." - -#: rapid/glade3/rapid.ui.h:20 -msgid "Uncheck All" -msgstr "Avmarkera alla" - -#: rapid/glade3/rapid.ui.h:21 -msgid "_Check All" -msgstr "_Markera allt" - -#: rapid/glade3/rapid.ui.h:22 -msgid "_Clear Completed Downloads" -msgstr "_Töm slutförda överföringar" - -#: rapid/glade3/rapid.ui.h:23 -msgid "_Download" -msgstr "_Överför" - -#: rapid/glade3/rapid.ui.h:24 -msgid "_Error Log" -msgstr "_Fellogg" - -#: rapid/glade3/rapid.ui.h:25 -msgid "_File" -msgstr "_Arkiv" +#: rapid/glade3/rapid.ui.h:11 +msgid "Next File" +msgstr "Nästa fil" -#: rapid/glade3/rapid.ui.h:26 +#: rapid/glade3/rapid.ui.h:12 msgid "_Help" msgstr "_Hjälp" -#: rapid/glade3/rapid.ui.h:27 -msgid "_Include in download" -msgstr "_Ta med i överföring" - -#: rapid/glade3/rapid.ui.h:28 +#: rapid/glade3/rapid.ui.h:13 msgid "_Make a Donation..." msgstr "_Donera..." -#: rapid/glade3/rapid.ui.h:29 -msgid "_Select" -msgstr "_Markera" - -#: rapid/glade3/rapid.ui.h:30 +#: rapid/glade3/rapid.ui.h:14 msgid "_Translate this Application..." msgstr "_Översätt programmet..." -#: rapid/glade3/rapid.ui.h:31 +#: rapid/glade3/rapid.ui.h:15 +msgid "_Check All" +msgstr "_Markera allt" + +#: rapid/glade3/rapid.ui.h:16 msgid "_Uncheck All" msgstr "_Avmarkera allt" -#: rapid/glade3/rapid.ui.h:32 -msgid "_View" -msgstr "_Visa" +#: rapid/glade3/rapid.ui.h:17 +msgid "_Include in download" +msgstr "_Ta med i överföring" + +#: rapid/glade3/rapid.ui.h:18 +msgid "_Download" +msgstr "_Överför" #: rapid/glade3/prefs.ui.h:1 -msgid " " -msgstr " " +msgid "Preferences: Rapid Photo Downloader" +msgstr "Inställningar: Rapid Photo Downloader" #: rapid/glade3/prefs.ui.h:2 -msgid " hh:mm" -msgstr " hh:mm" +msgid "<span weight=\"bold\" size=\"x-large\">Photo Download Folders</span>" +msgstr "" +"<span weight=\"bold\" size=\"x-large\">Bildöverföringskataloger</span>" #: rapid/glade3/prefs.ui.h:3 -msgid ":" -msgstr ":" +msgid "<i>Example: /home/user/Pictures</i>" +msgstr "<i>Exempel: /home/user/Bilder</i>" #: rapid/glade3/prefs.ui.h:4 -msgid "<b>Backup</b>" -msgstr "<b>Säkerhetskopia</b>" +msgid "<b>Download Subfolders</b>" +msgstr "<b>Underkataloger till överföring</b>" #: rapid/glade3/prefs.ui.h:5 -msgid "<b>Compatibility with Other Operating Systems</b>" -msgstr "<b>Kompatibilitet med andra operativsystem</b>" +msgid "Download folder:" +msgstr "Katalog för överföring:" #: rapid/glade3/prefs.ui.h:6 -msgid "<b>Download Folder</b>" -msgstr "<b>Överföringskatalog</b>" +msgid "" +"Choose the download folder. Subfolders for the downloaded photos will be " +"automatically created in this folder using the structure specified below." +msgstr "" +"Ange en katalog för överföring. Underkataloger kommer att skapas automatiskt " +"enligt strukturen nedan." #: rapid/glade3/prefs.ui.h:7 -msgid "<b>Download Subfolders</b>" -msgstr "<b>Underkataloger till överföring</b>" +msgid "<b>Download Folder</b>" +msgstr "<b>Överföringskatalog</b>" #: rapid/glade3/prefs.ui.h:8 -msgid "<b>Example</b>" -msgstr "<b>Exempel</b>" +msgid "Photo Folders" +msgstr "Bildkataloger" #: rapid/glade3/prefs.ui.h:9 -msgid "<b>Job Codes</b>" -msgstr "<b>Fototillfällen</b>" +msgid "<span weight=\"bold\" size=\"x-large\">Photo Rename</span>\t" +msgstr "<span weight=\"bold\" size=\"x-large\">Bildnamngivning</span>\t" #: rapid/glade3/prefs.ui.h:10 msgid "<b>Photo Rename</b>" msgstr "<b>Bildnamngivning</b>" #: rapid/glade3/prefs.ui.h:11 -msgid "<b>Photo and Video Name Conflicts</b>" -msgstr "<b>Bild- och filmnamnkonflikter</b>" +msgid " " +msgstr " " #: rapid/glade3/prefs.ui.h:12 -msgid "<b>Program Automation</b>" -msgstr "<b>Automatisering av programmet</b>" +msgid "<i>New:</i>" +msgstr "<i>Ny:</i>" #: rapid/glade3/prefs.ui.h:13 -msgid "<b>Sequence Numbers</b>" -msgstr "<b>Sekvensnummer</b>" +msgid "<i>Original:</i>" +msgstr "<i>Original:</i>" #: rapid/glade3/prefs.ui.h:14 -msgid "<i>/media/externaldrive/Photos</i>" -msgstr "<i>/media/extern_enhet/Photos</i>" +msgid "<b>Example</b>" +msgstr "<b>Exempel</b>" #: rapid/glade3/prefs.ui.h:15 -msgid "<i>Example: /home/user/Pictures</i>" -msgstr "<i>Exempel: /home/user/Bilder</i>" +msgid "Photo Rename" +msgstr "Bildnamngivning" #: rapid/glade3/prefs.ui.h:16 -msgid "<i>Example:</i>" -msgstr "<i>Exempel:</i>" +msgid "<span weight=\"bold\" size=\"x-large\">Video Download Folders</span>" +msgstr "<span weight=\"bold\" size=\"x-large\">Filmöverföringsmappar</span>" #: rapid/glade3/prefs.ui.h:17 -msgid "<i>New:</i>" -msgstr "<i>Ny:</i>" +msgid "" +"Sorry, video downloading functionality disabled. To download videos, please " +"install either the <i>hachoir metadata</i> and <i>kaa metadata</i> packages " +"for python, or <i>exiftool</i>." +msgstr "" +"Ledsen, men videohämtningsfunktionen har inaktiverats. För att hämta videor, " +"installera antingen paketen <i>hachoir metadata</i> och <i>kaa metadata</i> " +"för python, eller <i>exiftool</i>." #: rapid/glade3/prefs.ui.h:18 -msgid "<i>Original:</i>" -msgstr "<i>Original:</i>" +msgid "" +"Choose the download folder. Subfolders for the downloaded videos will be " +"automatically created in this folder using the structure specified below." +msgstr "" +"Välj katalog för överföring. Underkataloger kommer att skapas automatiskt " +"enligt inställningarna nedan." #: rapid/glade3/prefs.ui.h:19 -msgid "<span weight=\"bold\" size=\"x-large\">Backup</span>\t" -msgstr "<span weight=\"bold\" size=\"x-large\">Säkerhetskopiering</span>\t" +msgid "Video Folders" +msgstr "Filmkataloger" #: rapid/glade3/prefs.ui.h:20 -msgid "<span weight=\"bold\" size=\"x-large\">Device Options</span>" -msgstr "<span weight=\"bold\" size=\"x-large\">Enhetsinställningar</span>" +msgid "<span weight=\"bold\" size=\"x-large\">Video Rename</span>\t" +msgstr "<span weight=\"bold\" size=\"x-large\">Filmnamngivning</span>\t" #: rapid/glade3/prefs.ui.h:21 -msgid "<span weight=\"bold\" size=\"x-large\">Devices</span>" -msgstr "<span weight=\"bold\" size=\"x-large\">Enheter</span>" +msgid "Video Rename" +msgstr "Filmnamngivning" #: rapid/glade3/prefs.ui.h:22 -msgid "<span weight=\"bold\" size=\"x-large\">Error Handling</span>" -msgstr "<span weight=\"bold\" size=\"x-large\">Felhantering</span>" +msgid "<span weight=\"bold\" size=\"x-large\">Rename Options</span>" +msgstr "" +"<span weight=\"bold\" size=\"x-large\">Alternativ för namnbyte</span>" #: rapid/glade3/prefs.ui.h:23 -msgid "<span weight=\"bold\" size=\"x-large\">Job Codes</span>" -msgstr "<span weight=\"bold\" size=\"x-large\">Fototillfällen</span>" +msgid "<b>Sequence Numbers</b>" +msgstr "<b>Sekvensnummer</b>" #: rapid/glade3/prefs.ui.h:24 -msgid "<span weight=\"bold\" size=\"x-large\">Miscellaneous</span>" -msgstr "<span weight=\"bold\" size=\"x-large\">Diverse</span>" +msgid "" +"Specify the time in 24 hour format at which the <i>Downloads today</i> " +"sequence number should be reset." +msgstr "" +"Ange tiden i 24-timmarsformat då <i>Antal överföringar idag</i> ska " +"nollställas." #: rapid/glade3/prefs.ui.h:25 -msgid "<span weight=\"bold\" size=\"x-large\">Photo Download Folders</span>" -msgstr "" -"<span weight=\"bold\" size=\"x-large\">Bildöverföringskataloger</span>" +msgid "Day start:" +msgstr "Början på dagen:" #: rapid/glade3/prefs.ui.h:26 -msgid "<span weight=\"bold\" size=\"x-large\">Photo Rename</span>\t" -msgstr "<span weight=\"bold\" size=\"x-large\">Bildnamngivning</span>\t" +msgid "Downloads today:" +msgstr "Antal överföringar idag:" #: rapid/glade3/prefs.ui.h:27 -msgid "<span weight=\"bold\" size=\"x-large\">Rename Options</span>" -msgstr "" -"<span weight=\"bold\" size=\"x-large\">Alternativ för namnbyte</span>" +msgid "Stored number:" +msgstr "Lagrat nummer:" #: rapid/glade3/prefs.ui.h:28 -msgid "<span weight=\"bold\" size=\"x-large\">Video Download Folders</span>" -msgstr "<span weight=\"bold\" size=\"x-large\">Filmöverföringsmappar</span>" +msgid ":" +msgstr ":" #: rapid/glade3/prefs.ui.h:29 -msgid "<span weight=\"bold\" size=\"x-large\">Video Rename</span>\t" -msgstr "<span weight=\"bold\" size=\"x-large\">Filmnamngivning</span>\t" +msgid " hh:mm" +msgstr " hh:mm" #: rapid/glade3/prefs.ui.h:30 -msgid "Add unique identifier" -msgstr "Lägg till unik identifierare" +msgid "Synchronize RAW + JPEG sequence numbers" +msgstr "Synkronisera RAW och JPEG-sekvensnummer" #: rapid/glade3/prefs.ui.h:31 -msgid "Automatically detect Portable Storage Devices" -msgstr "Hitta bärbara lagringsenheter automatiskt" +msgid "<b>Compatibility with Other Operating Systems</b>" +msgstr "<b>Kompatibilitet med andra operativsystem</b>" #: rapid/glade3/prefs.ui.h:32 -msgid "Automatically detect backup devices" -msgstr "Hitta enheter för säkerhetskopiering automatiskt" +msgid "" +"Specify whether photo, video and folder names should have any characters " +"removed that are not allowed by other operating systems." +msgstr "" +"Ange om specialtecken som inte stöds av operativsystemet ska tas bort från " +"filnamn." #: rapid/glade3/prefs.ui.h:33 -msgid "Automatically detect devices" -msgstr "Hitta enheter automatiskt" +msgid "Strip incompatible characters" +msgstr "Avlägsna inkompatibla tecken" #: rapid/glade3/prefs.ui.h:34 -msgid "Automatically rotate JPEG images" -msgstr "" +msgid "Rename Options" +msgstr "Inställningar för namnbyte" #: rapid/glade3/prefs.ui.h:35 -msgid "Backup" -msgstr "Säkerhetskopiering" +msgid "<span weight=\"bold\" size=\"x-large\">Job Codes</span>" +msgstr "<span weight=\"bold\" size=\"x-large\">Fototillfällen</span>" #: rapid/glade3/prefs.ui.h:36 -msgid "Backup photos and videos when downloading" -msgstr "Säkerhetskopiera bilder och filmer vid överföring" +msgid "<b>Job Codes</b>" +msgstr "<b>Fototillfällen</b>" #: rapid/glade3/prefs.ui.h:37 -msgid "" -"Choose the download folder. Subfolders for the downloaded photos will be " -"automatically created in this folder using the structure specified below." -msgstr "" -"Ange en katalog för överföring. Underkataloger kommer att skapas automatiskt " -"enligt strukturen nedan." - -#: rapid/glade3/prefs.ui.h:38 -msgid "" -"Choose the download folder. Subfolders for the downloaded videos will be " -"automatically created in this folder using the structure specified below." -msgstr "" -"Välj katalog för överföring. Underkataloger kommer att skapas automatiskt " -"enligt inställningarna nedan." +msgid "_Add..." +msgstr "_Lägg till..." #: rapid/glade3/prefs.ui.h:39 -msgid "Day start:" -msgstr "Början på dagen:" +msgid "R_emove All" +msgstr "_Ta bort alla" #: rapid/glade3/prefs.ui.h:40 -msgid "Device Options" -msgstr "Enhetsinställningar" +msgid "Job Codes" +msgstr "Fototillfällen" #: rapid/glade3/prefs.ui.h:41 +msgid "<span weight=\"bold\" size=\"x-large\">Devices</span>" +msgstr "<span weight=\"bold\" size=\"x-large\">Enheter</span>" + +#: rapid/glade3/prefs.ui.h:42 msgid "Devices" msgstr "Enheter" -#: rapid/glade3/prefs.ui.h:42 +#: rapid/glade3/prefs.ui.h:43 msgid "" "Devices are from where to download photos and videos, such as cameras, " "memory cards or Portable Storage Devices.\n" @@ -1706,35 +1709,31 @@ msgstr "" "fungerar dåligt eller inte alls, prova att aktivera PTP läge på din kamera. " "Om det ändå inte fungerar måste du använda en kortläsare.</i>" -#: rapid/glade3/prefs.ui.h:47 -msgid "Download folder:" -msgstr "Katalog för överföring:" - #: rapid/glade3/prefs.ui.h:48 -msgid "Downloads today:" -msgstr "Antal överföringar idag:" +msgid "Automatically detect Portable Storage Devices" +msgstr "Hitta bärbara lagringsenheter automatiskt" #: rapid/glade3/prefs.ui.h:49 -msgid "Error Handling" -msgstr "Felhantering" +msgid "Automatically detect devices" +msgstr "Hitta enheter automatiskt" #: rapid/glade3/prefs.ui.h:50 -msgid "Exit program even if download had warnings or errors" -msgstr "Avsluta programmet även om fel eller varningar uppstod" - -#: rapid/glade3/prefs.ui.h:51 -msgid "Exit program when download completes" -msgstr "Avsluta programmet när överföring är klar" - -#: rapid/glade3/prefs.ui.h:52 -msgid "Generate thumbnails (slower)" -msgstr "Skapa miniatyrer (långsammare)" - -#: rapid/glade3/prefs.ui.h:53 msgid "" -"If you disable automatic detection, choose the exact backup locations." +"If you enable automatic detection of Portable Storage Devices, the entire " +"device will be scanned. On large devices, this could take some time.\n" +"\n" +"When this option is enabled, and a potential device is detected, you will be " +"prompted to determine if it should be scanned or not." msgstr "" -"Om du inaktiverar automatisk sökning, ange exakt plats för säkerhetskopior." +"Om du aktiverar sökning av externa enheter så kommer hela enheten att " +"avsökas. På stora enheter kan det ta en stund.\n" +"\n" +"När denna inställning är påslagen och en potentiell enhet hittas, så kommer " +"du att frågas om den ska avsökas eller ej." + +#: rapid/glade3/prefs.ui.h:53 +msgid "Location:" +msgstr "Plats:" #: rapid/glade3/prefs.ui.h:54 msgid "" @@ -1744,185 +1743,178 @@ msgstr "" "Om du inaktiverar automatisk sökning, ange exakt plats för bilder och videor." #: rapid/glade3/prefs.ui.h:55 +msgid "<span weight=\"bold\" size=\"x-large\">Device Options</span>" +msgstr "<span weight=\"bold\" size=\"x-large\">Enhetsinställningar</span>" + +#: rapid/glade3/prefs.ui.h:56 +msgid "Remembered Paths" +msgstr "Sparade sökvägar" + +#: rapid/glade3/prefs.ui.h:57 msgid "" -"If you enable automatic detection of Portable Storage Devices, the entire " -"device will be scanned. On large devices, this could take some time.\n" -"\n" -"When this option is enabled, and a potential device is detected, you will be " -"prompted to determine if it should be scanned or not." +"Remembered paths are those associated with devices that you have chosen to " +"always scan or ignore when automatic detection of Portable Storage Devices " +"is enabled." msgstr "" -"Om du aktiverar sökning av externa enheter så kommer hela enheten att " -"avsökas. På stora enheter kan det ta en stund.\n" -"\n" -"När denna inställning är påslagen och en potentiell enhet hittas, så kommer " -"du att frågas om den ska avsökas eller ej." +"Sparade sökvägar är sådana som förknippas med enheter där du har valt att " +"alltid avsöka eller ignorera, när automatisk avsökning är påslaget." #: rapid/glade3/prefs.ui.h:58 msgid "Ignored Paths" msgstr "Ignorerade sökvägar" #: rapid/glade3/prefs.ui.h:59 -msgid "Job Codes" -msgstr "Fototillfällen" - -#: rapid/glade3/prefs.ui.h:60 -msgid "Location:" -msgstr "Plats:" +msgid "" +"Specify the ending portion of any paths you want ignored when scanning " +"devices for photos or videos. Any path ending with the values below will not " +"be scanned." +msgstr "Ange namnändelse på sökvägar som du inte vill att de ska avsökas." #: rapid/glade3/prefs.ui.h:61 -msgid "Miscellaneous" -msgstr "Diverse" +msgid "Re_move All" +msgstr "Ta bo_rt alla" #: rapid/glade3/prefs.ui.h:62 -msgid "Overwrite" -msgstr "Ersätt" +msgid "Use _python-style regular expressions" +msgstr "Använd Python-kompatibla reguljära uttryck" #: rapid/glade3/prefs.ui.h:63 -msgid "Performance" -msgstr "Prestanda" +msgid "Device Options" +msgstr "Enhetsinställningar" #: rapid/glade3/prefs.ui.h:64 -msgid "Photo Folders" -msgstr "Bildkataloger" +msgid "<span weight=\"bold\" size=\"x-large\">Backup</span>\t" +msgstr "<span weight=\"bold\" size=\"x-large\">Säkerhetskopiering</span>\t" #: rapid/glade3/prefs.ui.h:65 -msgid "Photo Rename" -msgstr "Bildnamngivning" +msgid "<b>Backup</b>" +msgstr "<b>Säkerhetskopia</b>" #: rapid/glade3/prefs.ui.h:66 -msgid "Photo backup folder name:" -msgstr "Plats för säkerhetskopiering av bilder:" +msgid "" +"If you disable automatic detection, choose the exact backup locations." +msgstr "" +"Om du inaktiverar automatisk sökning, ange exakt plats för säkerhetskopior." #: rapid/glade3/prefs.ui.h:67 -msgid "Photo backup location:" -msgstr "Plats för säkerhetskopiering av bilder:" +msgid "Automatically detect backup devices" +msgstr "Hitta enheter för säkerhetskopiering automatiskt" #: rapid/glade3/prefs.ui.h:68 -msgid "Preferences: Rapid Photo Downloader" -msgstr "Inställningar: Rapid Photo Downloader" +msgid "" +"You can have your photos and videos backed up to multiple locations as they " +"are downloaded, e.g. external hard drives." +msgstr "" +"Du kan säkerhetskopiera dina bilder och filmer till flera mål när de " +"överförs, till exempel externa hårddiskar." -#: rapid/glade3/prefs.ui.h:70 -msgid "R_emove All" -msgstr "_Ta bort alla" +#: rapid/glade3/prefs.ui.h:69 +msgid "Backup photos and videos when downloading" +msgstr "Säkerhetskopiera bilder och filmer vid överföring" -#: rapid/glade3/prefs.ui.h:72 -msgid "Re_move All" -msgstr "Ta bo_rt alla" +#: rapid/glade3/prefs.ui.h:70 +msgid "" +"Specify the folder in which backups are stored on the device. \n" +"\n" +"<i>Note: this will also be used to determine whether or not the device is " +"used for backups. For each device you wish to use for backing up to, create " +"a folder in it with one of these names.</i>" +msgstr "" +"Välj i vilken katalog på enheten som används till säkerhetskopior.\n" +"\n" +"<i>Observera att katalogen kommer användas för att avgöra om enheten används " +"till säkerhetskopior. För varje enhet du vill använda till säkerhetskopior " +"kan du skapa en mapp med ett av dessa namn.</i>" #: rapid/glade3/prefs.ui.h:73 -msgid "Remembered Paths" -msgstr "Sparade sökvägar" +msgid "Photo backup location:" +msgstr "Plats för säkerhetskopiering av bilder:" #: rapid/glade3/prefs.ui.h:74 -msgid "" -"Remembered paths are those associated with devices that you have chosen to " -"always scan or ignore when automatic detection of Portable Storage Devices " -"is enabled." -msgstr "" -"Sparade sökvägar är sådana som förknippas med enheter där du har valt att " -"alltid avsöka eller ignorera, när automatisk avsökning är påslaget." +msgid "Photo backup folder name:" +msgstr "Plats för säkerhetskopiering av bilder:" #: rapid/glade3/prefs.ui.h:75 -msgid "Rename Options" -msgstr "Inställningar för namnbyte" +msgid "<i>Example:</i>" +msgstr "<i>Exempel:</i>" #: rapid/glade3/prefs.ui.h:76 -msgid "Skip" -msgstr "Hoppa över" +msgid "<i>/media/externaldrive/Photos</i>" +msgstr "<i>/media/extern_enhet/Photos</i>" #: rapid/glade3/prefs.ui.h:77 -msgid "Skip download" -msgstr "Hoppa över överföring" +msgid "Video backup folder name:" +msgstr "Katalog för säkerhetskopiering av film:" #: rapid/glade3/prefs.ui.h:78 -msgid "" -"Sorry, video downloading functionality disabled. To download videos, please " -"install either the <i>hachoir metadata</i> and <i>kaa metadata</i> packages " -"for python, or <i>exiftool</i>." -msgstr "" +msgid "Video backup location:" +msgstr "Plats för säkerhetskopiering av videor:" #: rapid/glade3/prefs.ui.h:79 -msgid "" -"Specify the ending portion of any paths you want ignored when scanning " -"devices for photos or videos. Any path ending with the values below will not " -"be scanned." -msgstr "Ange namnändelse på sökvägar som du inte vill att de ska avsökas." +msgid "Backup" +msgstr "Säkerhetskopiering" #: rapid/glade3/prefs.ui.h:80 -msgid "" -"Specify the folder in which backups are stored on the device. \n" -"\n" -"<i>Note: this will also be used to determine whether or not the device is " -"used for backups. For each device you wish to use for backing up to, create " -"a folder in it with one of these names.</i>" -msgstr "" -"Välj i vilken katalog på enheten som används till säkerhetskopior.\n" -"\n" -"<i>Observera att katalogen kommer användas för att avgöra om enheten används " -"till säkerhetskopior. För varje enhet du vill använda till säkerhetskopior " -"kan du skapa en mapp med ett av dessa namn.</i>" +msgid "<span weight=\"bold\" size=\"x-large\">Miscellaneous</span>" +msgstr "<span weight=\"bold\" size=\"x-large\">Diverse</span>" -#: rapid/glade3/prefs.ui.h:83 -msgid "" -"Specify the time in 24 hour format at which the <i>Downloads today</i> " -"sequence number should be reset." -msgstr "" -"Ange tiden i 24-timmarsformat då <i>Antal överföringar idag</i> ska " -"nollställas." +#: rapid/glade3/prefs.ui.h:81 +msgid "<b>Program Automation</b>" +msgstr "<b>Automatisering av programmet</b>" -#: rapid/glade3/prefs.ui.h:84 -msgid "" -"Specify whether photo, video and folder names should have any characters " -"removed that are not allowed by other operating systems." -msgstr "" -"Ange om specialtecken som inte stöds av operativsystemet ska tas bort från " -"filnamn." +#: rapid/glade3/prefs.ui.h:82 +msgid "Unmount (\"eject\") device upon download completion" +msgstr "Mata ut och avmontera enheter när överföring är klar" -#: rapid/glade3/prefs.ui.h:85 +#: rapid/glade3/prefs.ui.h:83 msgid "Start downloading at program startup" msgstr "Börja överföring vid programstart" -#: rapid/glade3/prefs.ui.h:86 +#: rapid/glade3/prefs.ui.h:84 msgid "Start downloading upon device insertion" msgstr "Påbörja överföring när enhet sätts i" +#: rapid/glade3/prefs.ui.h:85 +msgid "Exit program when download completes" +msgstr "Avsluta programmet när överföring är klar" + +#: rapid/glade3/prefs.ui.h:86 +msgid "Exit program even if download had warnings or errors" +msgstr "Avsluta programmet även om fel eller varningar uppstod" + #: rapid/glade3/prefs.ui.h:87 -msgid "Stored number:" -msgstr "Lagrat nummer:" +msgid "Automatically rotate JPEG images" +msgstr "Rotera JPEG-bilder automatiskt" #: rapid/glade3/prefs.ui.h:88 -msgid "Strip incompatible characters" -msgstr "Avlägsna inkompatibla tecken" +msgid "Performance" +msgstr "Prestanda" #: rapid/glade3/prefs.ui.h:89 -msgid "Synchronize RAW + JPEG sequence numbers" -msgstr "Synkronisera RAW och JPEG-sekvensnummer" +msgid "Generate thumbnails (slower)" +msgstr "Skapa miniatyrer (långsammare)" #: rapid/glade3/prefs.ui.h:90 -msgid "Unmount (\"eject\") device upon download completion" -msgstr "Mata ut och avmontera enheter när överföring är klar" +msgid "Miscellaneous" +msgstr "Diverse" #: rapid/glade3/prefs.ui.h:91 -msgid "Use _python-style regular expressions" -msgstr "Använd Python-kompatibla reguljära uttryck" +msgid "<span weight=\"bold\" size=\"x-large\">Error Handling</span>" +msgstr "<span weight=\"bold\" size=\"x-large\">Felhantering</span>" #: rapid/glade3/prefs.ui.h:92 -msgid "Video Folders" -msgstr "Filmkataloger" +msgid "<b>Photo and Video Name Conflicts</b>" +msgstr "<b>Bild- och filmnamnkonflikter</b>" #: rapid/glade3/prefs.ui.h:93 -msgid "Video Rename" -msgstr "Filmnamngivning" +msgid "Add unique identifier" +msgstr "Lägg till unik identifierare" #: rapid/glade3/prefs.ui.h:94 -msgid "Video backup folder name:" -msgstr "Katalog för säkerhetskopiering av film:" +msgid "Skip download" +msgstr "Hoppa över överföring" #: rapid/glade3/prefs.ui.h:95 -msgid "Video backup location:" -msgstr "Plats för säkerhetskopiering av videor:" - -#: rapid/glade3/prefs.ui.h:96 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." @@ -1930,7 +1922,7 @@ msgstr "" "När en bild eller video med samma namn redan har överförts, välj om den ska " "skippas eller tilldelas ett unikt nummer." -#: rapid/glade3/prefs.ui.h:97 +#: rapid/glade3/prefs.ui.h:96 msgid "" "When backing up, choose whether to overwrite a file on the backup device " "that has the same name, or skip backing it up." @@ -1938,17 +1930,17 @@ msgstr "" "Ange om filer som redan finns på enheten för säkerhetskopiering skall " "skrivas över, eller inte säkerhetskopieras." +#: rapid/glade3/prefs.ui.h:97 +msgid "Overwrite" +msgstr "Ersätt" + #: rapid/glade3/prefs.ui.h:98 -msgid "" -"You can have your photos and videos backed up to multiple locations as they " -"are downloaded, e.g. external hard drives." -msgstr "" -"Du kan säkerhetskopiera dina bilder och filmer till flera mål när de " -"överförs, till exempel externa hårddiskar." +msgid "Skip" +msgstr "Hoppa över" #: rapid/glade3/prefs.ui.h:99 -msgid "_Add..." -msgstr "_Lägg till..." +msgid "Error Handling" +msgstr "Felhantering" #: rapid/glade3/about.ui.h:1 msgid "Import your photos and videos efficiently and reliably" diff --git a/rapid/ChangeLog b/rapid/ChangeLog index 6a28146..cc27252 100644 --- a/rapid/ChangeLog +++ b/rapid/ChangeLog @@ -1,3 +1,38 @@ +Version 0.4.6 +------------- + +2013-01-22 + +Fixed bug #1083756: Application shows duplicate sources. +Fixed bug #1093330: Photo rename ignores SubSeconds when 00. + +Added extra debugging output to help trace program execution progress. + +Updated German and Spanish translations. + +Version 0.4.6 Beta 1 +------------- + +2012-11-26 + +Fixed bug #1023586: Added RAW file support for Nikon NRW files. Rapid Photo +Downloader uses the exiv2 program to read a photo's metadata. Although the NRW +format is not officially supported by exiv2, it appears to work. If you have +NRW files and Rapid Photo Downloader crashes while reading this files, please +file a bug report. + +Preliminary and tentative fix for bug #1025908: Application freezes under +Ubuntu 12.10. This fix should not be considered final, and needs further +testing. + +Added Arabic translation. Updated Czech, Danish, French, Italian, Norwegian, +Russian, Serbian, Spanish and Swedish translations. + +Fixed missing dependencies on python-dbus and exiv2 in Debian/control file. + +Added extra debugging output to help trace program execution progress. + + Version 0.4.5 ------------- @@ -113,6 +148,8 @@ confirm if this is really what they want to do. Fixed bug #792228: clear all thumbnails when refresh command issued. +Fixed bug #890949: Panasonic MOD format and duplicate filename issue + Fixed a bug where the device progress bar would occasionally disappear when the download device was changed. diff --git a/rapid/backupfile.py b/rapid/backupfile.py index 6581e6d..310e665 100644 --- a/rapid/backupfile.py +++ b/rapid/backupfile.py @@ -23,6 +23,7 @@ import tempfile import os import gio +import shutil import logging logger = multiprocessing.get_logger() @@ -41,7 +42,7 @@ from gettext import gettext as _ class BackupFiles(multiprocessing.Process): def __init__(self, path, name, - batch_size_MB, results_pipe, terminate_queue, + batch_size_MB, results_pipe, terminate_queue, run_event): multiprocessing.Process.__init__(self) self.results_pipe = results_pipe @@ -50,7 +51,11 @@ class BackupFiles(multiprocessing.Process): self.path = path self.mount_name = name self.run_event = run_event - + + # As of Ubuntu 12.10 / Fedora 18, the file move/rename command is running agonisingly slowly + # A hackish workaround is to replace it with the standard python function + self.use_gnome_file_operations = True + def check_termination_request(self): """ Check to see this process has not been requested to immediately terminate @@ -61,8 +66,8 @@ class BackupFiles(multiprocessing.Process): 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 @@ -74,22 +79,22 @@ class BackupFiles(multiprocessing.Process): 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 progress_callback_no_update(self, amount_downloaded, total): """called when copying very small files""" pass - + def backup_additional_file(self, dest_dir, full_file_name): """Backs up small files like XMP or THM files""" source = gio.File(full_file_name) @@ -99,55 +104,57 @@ class BackupFiles(multiprocessing.Process): try: source.copy(dest, self.progress_callback_no_update, cancellable=None) except gio.Error, inst: - logger.error("Failed to backup file %s", full_file_name) - + logger.error("Failed to backup file %s", full_file_name) + 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() + move_succeeded, rpd_file, path_suffix, backup_duplicate_overwrite, download_count = 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) - + 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: + logger.debug("Creating subfolder %s on backup device %s...", dest_dir, self.mount_name) subfolder.make_directory_with_parents(cancellable=gio.Cancellable()) + logger.debug("...backup subfolder created") 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. + # 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) @@ -159,7 +166,7 @@ class BackupFiles(multiprocessing.Process): _("Destination directory could not be created: %(directory)s\n") % \ {'directory': subfolder, } + \ _("Source: %(source)s\nDestination: %(destination)s") % \ - {'source': rpd_file.download_full_file_name, + {'source': rpd_file.download_full_file_name, 'destination': backup_full_file_name} + "\n" + \ _("Error: %(inst)s") % {'inst': inst} @@ -168,21 +175,33 @@ class BackupFiles(multiprocessing.Process): 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 self.use_gnome_file_operations: + try: + logger.debug("Backing up file %s on device %s...", download_count, self.mount_name) + source.copy(dest, self.progress_callback, flags, + cancellable=self.cancel_copy) + backup_succeeded = True + logger.debug("...backing up file %s on device %s succeeded", download_count, self.mount_name) + 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) + else: + try: + logger.debug("Using python to back up file %s on device %s...", download_count, self.mount_name) + shutil.copy(rpd_file.download_full_file_name, backup_full_file_name) + backup_succeeded = True + logger.debug("...backing up file %s on device %s succeeded", download_count, self.mount_name) + except: + logger.error("Backup of %s failed", backup_full_file_name) + if not backup_succeeded: if rpd_file.status == config.STATUS_DOWNLOAD_FAILED: @@ -197,17 +216,17 @@ class BackupFiles(multiprocessing.Process): if rpd_file.download_xmp_full_name: self.backup_additional_file(dest_dir, rpd_file.download_xmp_full_name) - + 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 d44c9bb..977c342 100644 --- a/rapid/config.py +++ b/rapid/config.py @@ -16,7 +16,7 @@ ### Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 ### USA -version = '0.4.5' +version = '0.4.6' GCONF_KEY="/apps/rapid-photo-downloader" @@ -30,9 +30,9 @@ MEDIA_LOCATION = "/media" SKIP_DOWNLOAD = "skip download" ADD_UNIQUE_IDENTIFIER = "add unique identifier" -# These next three values are fall back values that are used only +# These next three values are fall back values that are used only # if calls to xdg-user-dir fail -DEFAULT_PHOTO_LOCATIONS = ['Pictures', 'Photos'] +DEFAULT_PHOTO_LOCATIONS = ['Pictures', 'Photos'] DEFAULT_BACKUP_LOCATION = 'Pictures' DEFAULT_VIDEO_BACKUP_LOCATION = 'Videos' diff --git a/rapid/generatename.py b/rapid/generatename.py index 84c9310..6d138e8 100644 --- a/rapid/generatename.py +++ b/rapid/generatename.py @@ -43,18 +43,18 @@ class PhotoName: Generate the name of a photo. Used as a base class for generating names of videos, as well as subfolder names for both file types """ - + def __init__(self, pref_list): self.pref_list = pref_list - + # Some of the next values are overwritten in derived classes self.strip_initial_period_from_extension = False self.strip_forward_slash = True self.L1_date_check = IMAGE_DATE #used in _get_date_component() self.component = pn.FILENAME_COMPONENT #used in error reporting - - + + def _get_values_from_pref_list(self): for i in range(0, len(self.pref_list), 3): yield (self.pref_list[i], self.pref_list[i+1], self.pref_list[i+2]) @@ -64,19 +64,19 @@ class PhotoName: Returns portion of new file / subfolder name based on date time. If the date is missing, will attempt to use the fallback date. """ - + # step 1: get the correct value from metadata if self.L1 == self.L1_date_check: if self.L2 == SUBSECONDS: - d = self.rpd_file.metadata.sub_seconds() - if d == '00': + d = self.rpd_file.metadata.sub_seconds(missing=None) + if d is None: self.rpd_file.problem.add_problem(self.component, pn.MISSING_METADATA, _(self.L2)) return '' else: return d else: d = self.rpd_file.metadata.date_time(missing=None) - + elif self.L1 == TODAY: d = datetime.datetime.now() elif self.L1 == YESTERDAY: @@ -86,7 +86,7 @@ class PhotoName: d = self.rpd_file.download_start_time else: raise("Date options invalid") - + # step 2: if have a value, try to convert it to string format if d: try: @@ -105,14 +105,14 @@ class PhotoName: else: self.rpd_file.add_problem(self.component, pn.MISSING_METADATA, _(self.L1)) return '' - + try: return d.strftime(convert_date_for_strftime(self.L2)) except: self.rpd_file.add_problem(self.component, pn.INVALID_DATE_TIME, d) logger.error("Both file modification time and metadata date & time are invalid for file %s", self.rpd_file.full_file_name) return '' - + def _get_thm_extension(self): """ Generates THM extension with correct capitalization, if needed @@ -126,7 +126,7 @@ class PhotoName: self.rpd_file.thm_extension = thm_extension else: self.rpd_file.thm_extension = None - + def _get_xmp_extension(self, extension): """ Generates XMP extension with correct capitalization, if needed. @@ -144,15 +144,15 @@ class PhotoName: self.rpd_file.xmp_extension = '.xmp' else: self.rpd_file.xmp_extension = None - - + + def _get_filename_component(self): """ Returns portion of new file / subfolder name based on the file name """ - + name, extension = os.path.splitext(self.rpd_file.name) - + if self.L1 == NAME_EXTENSION: filename = self.rpd_file.name self._get_thm_extension() @@ -178,10 +178,10 @@ class PhotoName: n = re.search("(?P<image_number>[0-9]+$)", name) if not n: self.rpd_file.add_problem(self.component, pn.MISSING_IMAGE_NUMBER) - return '' + return '' else: image_number = n.group("image_number") - + if self.L2 == IMAGE_NUMBER_ALL: filename = image_number elif self.L2 == IMAGE_NUMBER_1: @@ -201,14 +201,14 @@ class PhotoName: filename = filename.lower() return filename - + def _get_metadata_component(self): """ Returns portion of new image / subfolder name based on the metadata - + Note: date time metadata found in _getDateComponent() """ - + if self.L1 == APERTURE: v = self.rpd_file.metadata.aperture() elif self.L1 == ISO: @@ -247,7 +247,7 @@ class PhotoName: else: raise TypeError("Invalid metadata option specified") if self.L1 in [CAMERA_MAKE, CAMERA_MODEL, SHORT_CAMERA_MODEL, - SHORT_CAMERA_MODEL_HYPHEN, OWNER_NAME, ARTIST, + SHORT_CAMERA_MODEL_HYPHEN, OWNER_NAME, ARTIST, COPYRIGHT]: if self.L2 == UPPERCASE: v = v.upper() @@ -269,49 +269,49 @@ class PhotoName: x= x / 26 - 1 v = string.lowercase[r] + v v = string.lowercase[x] + v - + return v - - + + v = _letters(sequence) if self.L2 == UPPERCASE: v = v.upper() - + return v def _format_sequence_no(self, value, amountToPad): padding = LIST_SEQUENCE_NUMBERS_L2.index(amountToPad) + 1 formatter = '%0' + str(padding) + "i" return formatter % value - + def _get_downloads_today(self): return self._format_sequence_no(self.rpd_file.sequences.get_downloads_today(), self.L2) def _get_session_sequence_no(self): - return self._format_sequence_no(self.rpd_file.sequences.get_session_sequence_no(), self.L2) - + return self._format_sequence_no(self.rpd_file.sequences.get_session_sequence_no(), self.L2) + def _get_stored_sequence_no(self): return self._format_sequence_no(self.rpd_file.sequences.get_stored_sequence_no(), self.L2) def _get_sequence_letter(self): return self._calculate_letter_sequence(self.rpd_file.sequences.get_sequence_letter()) - + def _get_sequences_component(self): if self.L1 == DOWNLOAD_SEQ_NUMBER: - return self._get_downloads_today() + return self._get_downloads_today() elif self.L1 == SESSION_SEQ_NUMBER: return self._get_session_sequence_no() elif self.L1 == STORED_SEQ_NUMBER: - return self._get_stored_sequence_no() + return self._get_stored_sequence_no() elif self.L1 == SEQUENCE_LETTER: - return self._get_sequence_letter() + return self._get_sequence_letter() #~ elif self.L1 == SUBFOLDER_SEQ_NUMBER: #~ return self._getSubfolderSequenceNo() - - - + + + def _get_component(self): try: if self.L0 == DATE_TIME: @@ -331,8 +331,8 @@ class PhotoName: except: self.rpd_file.add_problem(self.component, pn.ERROR_IN_GENERATION, _(self.L0)) return '' - - + + def generate_name(self, rpd_file): self.rpd_file = rpd_file @@ -342,89 +342,89 @@ class PhotoName: v = self._get_component() if v: name += v - + # remove any null characters - they are bad news in filenames name = name.replace('\x00', '') if self.rpd_file.strip_characters: for c in r'\:*?"<>|': name = name.replace(c, '') - + if self.strip_forward_slash: name = name.replace('/', '') - + name = name.strip() - + return name - - + + class VideoName(PhotoName): def __init__(self, pref_list): PhotoName.__init__(self, pref_list) self.L1_date_check = VIDEO_DATE #used in _get_date_component() - + def _get_metadata_component(self): """ Returns portion of video / subfolder name based on the metadata - + Note: date time metadata found in _getDateComponent() """ - return get_video_metadata_component(self) + return get_video_metadata_component(self) class PhotoSubfolder(PhotoName): """ Generate subfolder names for photo files """ - + def __init__(self, pref_list): self.pref_list = pref_list - + self.strip_extraneous_white_space = re.compile(r'\s*%s\s*' % os.sep) self.strip_initial_period_from_extension = True self.strip_forward_slash = False self.L1_date_check = IMAGE_DATE #used in _get_date_component() self.component = pn.SUBFOLDER_COMPONENT #used in error reporting - + def generate_name(self, rpd_file): - + subfolders = PhotoName.generate_name(self, rpd_file) - - # subfolder value must never start with a separator, or else any - # os.path.join function call will fail to join a subfolder to its + + # subfolder value must never start with a separator, or else any + # os.path.join function call will fail to join a subfolder to its # parent folder if subfolders: if subfolders[0] == os.sep: subfolders = subfolders[1:] - + # remove any spaces before and after a directory name if subfolders and self.rpd_file.strip_characters: subfolders = self.strip_extraneous_white_space.sub(os.sep, subfolders) - + return subfolders - - - + + + class VideoSubfolder(PhotoSubfolder): """ Generate subfolder names for video files """ - + def __init__(self, pref_list): PhotoSubfolder.__init__(self, pref_list) self.L1_date_check = VIDEO_DATE #used in _get_date_component() - - + + def _get_metadata_component(self): """ Returns portion of video / subfolder name based on the metadata - + Note: date time metadata found in _getDateComponent() """ - return get_video_metadata_component(self) - + return get_video_metadata_component(self) + def get_video_metadata_component(video): """ Returns portion of video / subfolder name based on the metadata @@ -432,7 +432,7 @@ def get_video_metadata_component(video): This is outside of a class definition because of the inheritence hierarchy. """ - + problem = None if video.L1 == CODEC: v = video.rpd_file.metadata.codec() @@ -456,7 +456,7 @@ def get_video_metadata_component(video): return v class Sequences: - """ + """ Holds sequence numbers and letters used in generating filenames. """ def __init__(self, downloads_today_tracker, stored_sequence_no): @@ -465,58 +465,58 @@ class Sequences: self.downloads_today_tracker = downloads_today_tracker self.stored_sequence_no = stored_sequence_no self.matched_sequences = None - + def set_matched_sequence_value(self, matched_sequences): self.matched_sequences = matched_sequences - + def get_session_sequence_no(self): if self.matched_sequences is not None: return self.matched_sequences.session_sequence_no else: return self._get_session_sequence_no() - + def _get_session_sequence_no(self): return self.session_sequence_no + 1 - + def get_sequence_letter(self): if self.matched_sequences is not None: return self.matched_sequences.sequence_letter else: return self._get_sequence_letter() - + def _get_sequence_letter(self): return self.sequence_letter + 1 - + def increment(self, uses_session_sequece_no, uses_sequence_letter): if uses_session_sequece_no: self.session_sequence_no += 1 if uses_sequence_letter: self.sequence_letter += 1 - + def get_downloads_today(self): if self.matched_sequences is not None: return self.matched_sequences.downloads_today else: return self._get_downloads_today() - + def _get_downloads_today(self): v = self.downloads_today_tracker.get_downloads_today() if v == -1: return 1 else: return v + 1 - + def get_stored_sequence_no(self): if self.matched_sequences is not None: return self.matched_sequences.stored_sequence_no else: return self._get_stored_sequence_no() - + def _get_stored_sequence_no(self): # Must add 1 to the value, for historic reasons (that is how it used # to work) return self.stored_sequence_no + 1 - + def create_matched_sequences(self): sequences = collections.namedtuple( 'AssignedSequences', diff --git a/rapid/glade3/about.ui b/rapid/glade3/about.ui index b770f72..221c62e 100644 --- a/rapid/glade3/about.ui +++ b/rapid/glade3/about.ui @@ -28,6 +28,7 @@ Martin Dahl Moe Marco de Freitas <marcodefreitas@gmail.com> Martin Egger <martin.egger@gmx.net> Tauno Erik <tauno.erik@gmail.com> +Sergiy Gavrylov <sergiovana@bigmir.net> Emanuele Grande <caccolangrifata@gmail.com> Torben Gundtofte-Bruun <torben@g-b.dk> Miroslav Matejaš <silverspace@ubuntu-hr.org> @@ -43,7 +44,7 @@ Michal Predotka <mpredotka@googlemail.com> Ye Qing <allen19920930@gmail.com> Luca Reverberi <thereve@gmail.com> Mikko Ruohola <polarfox@polarfox.net> -Sergiy Gavrylov <sergiovana@bigmir.net> +Ahmed Shubbar <ahmed.shubbar@gmail.com> Sergei Sedov <sedov@webmail.perm.ru> Marco Solari <marcosolari@gmail.com> Toni Lähdekorpi <toni@lygon.net> diff --git a/rapid/glade3/xmp.ui b/rapid/glade3/xmp.ui new file mode 100644 index 0000000..c0fd03b --- /dev/null +++ b/rapid/glade3/xmp.ui @@ -0,0 +1,1376 @@ +<?xml version="1.0" encoding="UTF-8"?> +<interface> + <requires lib="gtk+" version="2.24"/> + <!-- interface-naming-policy project-wide --> + <object class="GtkDialog" id="dialog1"> + <property name="can_focus">False</property> + <property name="border_width">5</property> + <property name="type_hint">dialog</property> + <child internal-child="vbox"> + <object class="GtkVBox" id="dialog-vbox1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">2</property> + <child internal-child="action_area"> + <object class="GtkHButtonBox" id="dialog-action_area1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkHBox" id="hbox1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <object class="GtkNotebook" id="notebook"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkTable" id="table1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="n_rows">10</property> + <property name="n_columns">5</property> + <child> + <object class="GtkLabel" id="label14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="label" translatable="yes" comments="The Description field, often referred to as "Caption," should report the who, what and why of what the photograph depicts. Source: http://www.photometadata.org/META-Resources-Field-Guide-to-Metadata#Description">Description:</property> + </object> + <packing> + <property name="x_options">GTK_FILL</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow" id="scrolledwindow1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">automatic</property> + <property name="vscrollbar_policy">automatic</property> + <child> + <object class="GtkViewport" id="viewport1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkTextView" id="textview1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes" comments="A headline is a brief, publishable synopsis or summary of the contents of the photograph. Source: http://www.photometadata.org/META-Resources-Field-Guide-to-Metadata#Headline">Headline:</property> + </object> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkEntry" id="entry1"> + <property name="visible">True</property> + <property name="can_focus">True</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> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="label" translatable="yes" comments="Keyword terms or phrases describe the subject of content in the photograph. Source: http://www.photometadata.org/META-Resources-Field-Guide-to-Metadata#Keywords">Keywords:</property> + </object> + <packing> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow" id="scrolledwindow3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">automatic</property> + <property name="vscrollbar_policy">automatic</property> + <child> + <object class="GtkViewport" id="viewport3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkTextView" id="textview2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes" comments="The name of the person writing, editing or correcting the description of the photograph. Source: http://www.photometadata.org/META-Resources-Field-Guide-to-Metadata#Description%20writer">Description writer:</property> + </object> + <packing> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkEntry" id="entry2"> + <property name="visible">True</property> + <property name="can_focus">True</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> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes" comments="The Copyright Notice for the photo.">Copyright:</property> + </object> + <packing> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkEntry" id="entry3"> + <property name="visible">True</property> + <property name="can_focus">True</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> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes" comments="The location of a web page describing the owner and/or rights statement for this photo.">Copyright URL:</property> + </object> + <packing> + <property name="top_attach">6</property> + <property name="bottom_attach">7</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkEntry" id="entry4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">•</property> + <property name="invisible_char_set">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> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">6</property> + <property name="bottom_attach">7</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="label" translatable="yes" comments="Name or names of a person or the people shown in the photo.">Person(s) shown:</property> + </object> + <packing> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow" id="scrolledwindow4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">automatic</property> + <property name="vscrollbar_policy">automatic</property> + <child> + <object class="GtkViewport" id="viewport4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkTextView" id="textview3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + </packing> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + </child> + <child type="tab"> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Description</property> + </object> + <packing> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="GtkTable" id="table3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="n_rows">16</property> + <property name="n_columns">5</property> + <child> + <object class="GtkLabel" id="label21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Location Created</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + <packing> + <property name="right_attach">5</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Sublocation:</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">City:</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Province/state:</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Country name:</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Country ISO-code:</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">World region:</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">6</property> + <property name="bottom_attach">7</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="entry5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">•</property> + <property name="invisible_char_set">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> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkEntry" id="entry6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">•</property> + <property name="invisible_char_set">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> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkEntry" id="entry7"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">•</property> + <property name="invisible_char_set">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> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkEntry" id="entry8"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">•</property> + <property name="invisible_char_set">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> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkEntry" id="entry9"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">•</property> + <property name="invisible_char_set">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> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkEntry" id="entry10"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">•</property> + <property name="invisible_char_set">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> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">6</property> + <property name="bottom_attach">7</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Location Shown</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + <packing> + <property name="right_attach">5</property> + <property name="top_attach">8</property> + <property name="bottom_attach">9</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Sublocation:</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">9</property> + <property name="bottom_attach">10</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label30"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">City:</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">10</property> + <property name="bottom_attach">11</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label31"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Province/state:</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">11</property> + <property name="bottom_attach">12</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label32"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Country name:</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">12</property> + <property name="bottom_attach">13</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label33"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Country ISO-code:</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">13</property> + <property name="bottom_attach">14</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label34"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">World region:</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">14</property> + <property name="bottom_attach">15</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="entry11"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">•</property> + <property name="invisible_char_set">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> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">9</property> + <property name="bottom_attach">10</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkEntry" id="entry12"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">•</property> + <property name="invisible_char_set">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> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">10</property> + <property name="bottom_attach">11</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkEntry" id="entry13"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">•</property> + <property name="invisible_char_set">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> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">11</property> + <property name="bottom_attach">12</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkEntry" id="entry14"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">•</property> + <property name="invisible_char_set">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> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">12</property> + <property name="bottom_attach">13</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkEntry" id="entry15"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">•</property> + <property name="invisible_char_set">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> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">13</property> + <property name="bottom_attach">14</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkEntry" id="entry16"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">•</property> + <property name="invisible_char_set">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> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">14</property> + <property name="bottom_attach">15</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <object class="GtkButton" id="copy_location_button"> + <property name="label" translatable="yes">Copy to Location Shown</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_action_appearance">False</property> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">7</property> + <property name="bottom_attach">8</property> + </packing> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="label35"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Location</property> + </object> + <packing> + <property name="position">1</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="GtkTable" id="table2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="n_rows">10</property> + <property name="n_columns">2</property> + <property name="column_spacing">12</property> + <property name="row_spacing">6</property> + <child> + <object class="GtkLabel" id="label4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes" comments="Person who created the photograph">Creator:</property> + </object> + <packing> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes" comments="Job title of the person who created the photograph">Creator's job title:</property> + </object> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="label" translatable="yes" comments="Address of the person who created the photograph">Address:</property> + </object> + <packing> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">City:</property> + </object> + <packing> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes" comments="State or province of the person who created the photograph">State/province:</property> + </object> + <packing> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes" comments="Postal code of the person who created the photograph">Postal code:</property> + </object> + <packing> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes" comments="Country of the person who created the photograph">Country: </property> + </object> + <packing> + <property name="top_attach">6</property> + <property name="bottom_attach">7</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes" comments="Phone numbers / number of the person who created the photograph">Phone(s):</property> + </object> + <packing> + <property name="top_attach">7</property> + <property name="bottom_attach">8</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes" comments="Email address / addresses of the person who created the photograph">Email(s):</property> + </object> + <packing> + <property name="top_attach">8</property> + <property name="bottom_attach">9</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes" comments="Websites / website of the person who created the photograph">Website(s):</property> + </object> + <packing> + <property name="top_attach">9</property> + <property name="bottom_attach">10</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkComboBox" id="creator_combobox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="has_entry">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkComboBox" id="job_title_combobox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="has_entry">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkComboBox" id="city_combobox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="has_entry">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkComboBox" id="state_combobox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="has_entry">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkComboBox" id="postal_code_combobox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="has_entry">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkComboBox" id="country_combobox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="has_entry">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">6</property> + <property name="bottom_attach">7</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkComboBox" id="phone_combobox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="has_entry">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">7</property> + <property name="bottom_attach">8</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkComboBox" id="email_combobox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="has_entry">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">8</property> + <property name="bottom_attach">9</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkComboBox" id="website_combobox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="has_entry">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">9</property> + <property name="bottom_attach">10</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow" id="scrolledwindow2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">automatic</property> + <property name="vscrollbar_policy">automatic</property> + <child> + <object class="GtkViewport" id="viewport2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkTextView" id="address_textview"> + <property name="visible">True</property> + <property name="can_focus">True</property> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + </packing> + </child> + </object> + <packing> + <property name="position">2</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" comments="Contact information for the photographer">Photographer</property> + </object> + <packing> + <property name="position">2</property> + <property name="tab_fill">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <placeholder/> + </child> + </object> + </child> + </object> +</interface> diff --git a/rapid/rapid.py b/rapid/rapid.py index fab5796..7de18c2 100755 --- a/rapid/rapid.py +++ b/rapid/rapid.py @@ -18,6 +18,7 @@ ### Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 ### USA +use_pynotify = True import tempfile @@ -39,7 +40,9 @@ import webbrowser import sys, time, types, os, datetime import gobject, pango, cairo, array, pangocairo, gio -import pynotify + +if use_pynotify: + import pynotify from multiprocessing import Process, Pipe, Queue, Event, Value, Array, current_process, log_to_stderr from ctypes import c_int, c_bool, c_char @@ -50,7 +53,7 @@ logger = log_to_stderr() # Rapid Photo Downloader modules import rpdfile - + import problemnotification as pn import thumbnail as tn import rpdmultiprocessing as rpdmp @@ -105,10 +108,10 @@ from config import STATUS_CANNOT_DOWNLOAD, STATUS_DOWNLOADED, \ STATUS_NOT_DOWNLOADED, \ STATUS_DOWNLOAD_AND_BACKUP_FAILED, \ STATUS_WARNING - + DOWNLOADED = [STATUS_DOWNLOADED, STATUS_DOWNLOADED_WITH_WARNING, STATUS_BACKUP_PROBLEM] -#Translators: if neccessary, for guidance in how to translate this program, you may see http://damonlynch.net/translate.html +#Translators: if neccessary, for guidance in how to translate this program, you may see http://damonlynch.net/translate.html PROGRAM_NAME = _('Rapid Photo Downloader') __version__ = config.version @@ -117,12 +120,12 @@ def date_time_human_readable(date, with_line_break=True): return _("%(date)s\n%(time)s") % {'date':date.strftime("%x"), 'time':date.strftime("%X")} else: return _("%(date)s %(time)s") % {'date':date.strftime("%x"), 'time':date.strftime("%X")} - + def date_time_subseconds_human_readable(date, subseconds): return _("%(date)s %(hour)s:%(minute)s:%(second)s:%(subsecond)s") % \ - {'date':date.strftime("%x"), + {'date':date.strftime("%x"), 'hour':date.strftime("%H"), - 'minute':date.strftime("%M"), + 'minute':date.strftime("%M"), 'second':date.strftime("%S"), 'subsecond': subseconds} @@ -135,7 +138,7 @@ class DeviceCollection(gtk.TreeView): def __init__(self, parent_app): self.parent_app = parent_app - # device icon & name, size of images on the device (human readable), + # device icon & name, size of images on the device (human readable), # copy progress (%), copy text, eject button (None if irrelevant), # process id, pulse self.liststore = gtk.ListStore(gtk.gdk.Pixbuf, str, str, float, str, @@ -144,15 +147,15 @@ class DeviceCollection(gtk.TreeView): self.devices_by_scan_pid = {} gtk.TreeView.__init__(self, self.liststore) - + self.props.enable_search = False # make it impossible to select a row selection = self.get_selection() selection.set_mode(gtk.SELECTION_NONE) self.set_headers_visible(False) - - - # Device refers to a thing like a camera, memory card in its reader, + + + # Device refers to a thing like a camera, memory card in its reader, # external hard drive, Portable Storage Device, etc. column0 = gtk.TreeViewColumn(_("Device")) pixbuf_renderer = gtk.CellRendererPixbuf() @@ -168,46 +171,46 @@ class DeviceCollection(gtk.TreeView): column0.add_attribute(text_renderer, 'text', 1) column0.add_attribute(eject_renderer, 'pixbuf', 5) self.append_column(column0) - - + + # Size refers to the total size of images on the device, typically in # MB or GB column1 = gtk.TreeViewColumn(_("Size"), gtk.CellRendererText(), text=2) self.append_column(column1) - - column2 = gtk.TreeViewColumn(_("Download Progress"), + + column2 = gtk.TreeViewColumn(_("Download Progress"), gtk.CellRendererProgress(), value=3, text=4, pulse=7) self.append_column(column2) self.show_all() - + icontheme = gtk.icon_theme_get_default() try: - self.eject_pixbuf = icontheme.load_icon('media-eject', 16, + self.eject_pixbuf = icontheme.load_icon('media-eject', 16, gtk.ICON_LOOKUP_USE_BUILTIN) except: self.eject_pixbuf = gtk.gdk.pixbuf_new_from_file( paths.share_dir('glade3/media-eject.png')) - + self.add_events(gtk.gdk.BUTTON_PRESS_MASK) self.connect('button-press-event', self.button_clicked) - + def add_device(self, process_id, device, progress_bar_text = ''): - + # add the row, and get a temporary pointer to the row size_files = '' progress = 0.0 - + if device.mount is None: eject = None else: eject = self.eject_pixbuf - + self.devices_by_scan_pid[process_id] = device - + iter = self.liststore.append((device.get_icon(), device.get_name(), size_files, @@ -216,9 +219,9 @@ class DeviceCollection(gtk.TreeView): eject, process_id, -1)) - + self._set_process_map(process_id, iter) - + # adjust scrolled window height, based on row height and number of ready to start downloads # please note, at program startup, self.row_height() will be less than it will be when already running @@ -228,7 +231,8 @@ class DeviceCollection(gtk.TreeView): row_height = self.get_background_area(0, self.get_column(0))[3] + 1 height = max(((len(self.map_process_to_row) + 1) * row_height), 24) self.parent_app.device_collection_scrolledwindow.set_size_request(-1, height) - + + def update_device(self, process_id, total_size_files): """ Updates the size of the photos and videos on the device, displayed to the user @@ -238,39 +242,39 @@ class DeviceCollection(gtk.TreeView): self.liststore.set_value(iter, 2, total_size_files) else: logger.critical("This device is unknown") - + def get_device(self, process_id): return self.devices_by_scan_pid.get(process_id) - + def remove_device(self, process_id): if process_id in self.map_process_to_row: iter = self._get_process_map(process_id) self.liststore.remove(iter) del self.map_process_to_row[process_id] del self.devices_by_scan_pid[process_id] - + def get_all_displayed_processes(self): """ - returns a list of the processes currently being displayed to the user + returns a list of the processes currently being displayed to the user """ return self.map_process_to_row.keys() def _set_process_map(self, process_id, iter): """ - convert the temporary iter into a tree reference, which is + convert the temporary iter into a tree reference, which is permanent """ path = self.liststore.get_path(iter) treerowref = gtk.TreeRowReference(self.liststore, path) self.map_process_to_row[process_id] = treerowref - + def _get_process_map(self, process_id): """ return the tree iter for this process """ - + if process_id in self.map_process_to_row: treerowref = self.map_process_to_row[process_id] path = treerowref.get_path() @@ -278,16 +282,16 @@ class DeviceCollection(gtk.TreeView): return iter else: return None - + def update_progress(self, scan_pid, percent_complete, progress_bar_text, bytes_downloaded, pulse=None): - + iter = self._get_process_map(scan_pid) if iter: if percent_complete: self.liststore.set_value(iter, 3, percent_complete) if progress_bar_text: self.liststore.set_value(iter, 4, progress_bar_text) - + if pulse is not None: if pulse: # Make the bar pulse @@ -316,14 +320,14 @@ class DeviceCollection(gtk.TreeView): 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] if device.mount is not None: logger.debug("Unmounting device with scan pid %s", process_id) device.mount.unmount(self.unmount_callback) - - + + def unmount_callback(self, mount, result): name = mount.get_name() @@ -332,13 +336,14 @@ class DeviceCollection(gtk.TreeView): logger.debug("%s successfully unmounted" % name) except gio.Error, inst: logger.error("%s did not unmount: %s", name, inst) - - title = _("%(device)s did not unmount") % {'device': name} - message = '%s' % inst - - n = pynotify.Notification(title, message) - n.set_icon_from_pixbuf(self.parent_app.application_icon) - n.show() + + if use_pynotify: + title = _("%(device)s did not unmount") % {'device': name} + message = '%s' % inst + + n = pynotify.Notification(title, message) + n.set_icon_from_pixbuf(self.parent_app.application_icon) + n.show() def create_cairo_image_surface(pil_image, image_width, image_height): @@ -353,55 +358,55 @@ class ThumbnailCellRenderer(gtk.CellRenderer): __gproperties__ = { "image": (gobject.TYPE_PYOBJECT, "Image", "Image", gobject.PARAM_READWRITE), - - "filename": (gobject.TYPE_STRING, "Filename", + + "filename": (gobject.TYPE_STRING, "Filename", "Filename", '', gobject.PARAM_READWRITE), - + "status": (gtk.gdk.Pixbuf, "Status", "Status", gobject.PARAM_READWRITE), } - + def __init__(self, checkbutton_height): gtk.CellRenderer.__init__(self) self.image = None - + self.image_area_size = 100 self.text_area_size = 30 self.padding = 6 self.checkbutton_height = checkbutton_height self.icon_width = 20 - + def do_set_property(self, pspec, value): setattr(self, pspec.name, value) def do_get_property(self, pspec): return getattr(self, pspec.name) - + def do_render(self, window, widget, background_area, cell_area, expose_area, flags): - + cairo_context = window.cairo_create() - + x = cell_area.x y = cell_area.y + self.checkbutton_height - 8 w = cell_area.width h = cell_area.height - - #constrain operations to cell area, allowing for a 1 pixel border + + #constrain operations to cell area, allowing for a 1 pixel border #either side #~ cairo_context.rectangle(x-1, y-1, w+2, h+2) #~ cairo_context.clip() - + #fill in the background with dark grey #this ensures that a selected cell's fill does not make #the text impossible to read #~ cairo_context.rectangle(x, y, w, h) #~ cairo_context.set_source_rgb(0.267, 0.267, 0.267) #~ cairo_context.fill() - + #image width and height image_w = self.image.size[0] image_h = self.image.size[1] - + #center the image horizontally #bottom align vertically #top left and right corners for the image: @@ -416,33 +421,33 @@ class ThumbnailCellRenderer(gtk.CellRenderer): cairo_context.set_line_width(1) cairo_context.rectangle(image_x-.5, image_y-.5, image_w+1, image_h+1) cairo_context.stroke() - + # draw a thin border around each cell #~ cairo_context.set_source_rgb(0.33,0.33,0.33) #~ cairo_context.rectangle(x, y, w, h) #~ cairo_context.stroke() - + #place the image cairo_context.set_source_surface(image, image_x, image_y) cairo_context.paint() - + #text context = pangocairo.CairoContext(cairo_context) - + text_y = y + self.image_area_size + 10 text_w = w - self.icon_width text_x = x + self.icon_width #~ context.rectangle(text_x, text_y, text_w, 15) - #~ context.clip() - + #~ context.clip() + layout = context.create_layout() width = text_w * pango.SCALE layout.set_width(width) - + layout.set_alignment(pango.ALIGN_CENTER) layout.set_ellipsize(pango.ELLIPSIZE_END) - + #font color and size fg_color = pango.AttrForeground(65535, 65535, 65535, 0, -1) font_size = pango.AttrSize(8192, 0, -1) # 8 * 1024 = 8192 @@ -453,7 +458,7 @@ class ThumbnailCellRenderer(gtk.CellRenderer): attr.insert(font_family) layout.set_attributes(attr) - layout.set_text(self.filename) + layout.set_text(self.filename) context.move_to(text_x, text_y) context.show_layout(layout) @@ -461,13 +466,13 @@ class ThumbnailCellRenderer(gtk.CellRenderer): #status cairo_context.set_source_pixbuf(self.status, x, y + self.image_area_size + 10) cairo_context.paint() - + def do_get_size(self, widget, cell_area): return (0, 0, self.image_area_size, self.image_area_size + self.text_area_size - self.checkbutton_height + 4) - + gobject.type_register(ThumbnailCellRenderer) - + class ThumbnailDisplay(gtk.IconView): def __init__(self, parent_app): @@ -475,39 +480,39 @@ class ThumbnailDisplay(gtk.IconView): self.set_spacing(0) self.set_row_spacing(5) self.set_margin(25) - + self.set_selection_mode(gtk.SELECTION_MULTIPLE) self.connect('selection-changed', self.on_selection_changed) self._selected_items = [] - + self.rapid_app = parent_app - + self.batch_size = 10 - + self.thumbnail_manager = ThumbnailManager(self.thumbnail_results, self.batch_size) self.preview_manager = PreviewManager(self.preview_results) - - self.treerow_index = {} - self.process_index = {} - + + self.treerow_index = {} + self.process_index = {} + self.rpd_files = {} - + 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() - + self.stock_photo_thumbnails = tn.PhotoIcons() self.stock_video_thumbnails = tn.VideoIcons() - + self.SELECTED_COL = 1 self.UNIQUE_ID_COL = 2 self.TIMESTAMP_COL = 4 @@ -515,11 +520,11 @@ class ThumbnailDisplay(gtk.IconView): self.CHECKBUTTON_VISIBLE_COL = 6 self.DOWNLOAD_STATUS_COL = 7 self.STATUS_ICON_COL = 8 - + self._create_liststore() self.clear() - + checkbutton = gtk.CellRendererToggle() checkbutton.set_radio(False) checkbutton.props.activatable = True @@ -529,11 +534,11 @@ class ThumbnailDisplay(gtk.IconView): self.add_attribute(checkbutton, "active", 1) self.add_attribute(checkbutton, "visible", 6) - + checkbutton_size = checkbutton.get_size(self, None) checkbutton_height = checkbutton_size[3] checkbutton_width = checkbutton_size[2] - + image = ThumbnailCellRenderer(checkbutton_height) self.pack_start(image, expand=True) self.add_attribute(image, "image", 0) @@ -542,12 +547,12 @@ class ThumbnailDisplay(gtk.IconView): #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) - + def _create_liststore(self): """ Creates the default list store to hold the icons @@ -562,8 +567,8 @@ class ThumbnailDisplay(gtk.IconView): gobject.TYPE_BOOLEAN, # 6 visibility of checkbutton int, # 7 status of download gtk.gdk.Pixbuf, # 8 status icon - ) - + ) + def _setup_icons(self): # icons to be displayed in status column @@ -582,19 +587,19 @@ class ThumbnailDisplay(gtk.IconView): size, size) self.download_pending_icon = gtk.gdk.pixbuf_new_from_file_at_size( paths.share_dir('glade3/rapid-photo-downloader-download-pending.png'), - size, size) + size, size) self.downloaded_with_warning_icon = gtk.gdk.pixbuf_new_from_file_at_size( paths.share_dir('glade3/rapid-photo-downloader-downloaded-with-warning.svg'), size, size) self.downloaded_with_error_icon = gtk.gdk.pixbuf_new_from_file_at_size( paths.share_dir('glade3/rapid-photo-downloader-downloaded-with-error.svg'), size, size) - + # make the not yet downloaded icon a transparent square self.not_downloaded_icon = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, 16, 16) self.not_downloaded_icon.fill(0xffffffff) self.not_downloaded_icon = self.not_downloaded_icon.add_alpha(True, chr(255), chr(255), chr(255)) - + def get_status_icon(self, status): """ Returns the correct icon, based on the status @@ -616,33 +621,33 @@ class ThumbnailDisplay(gtk.IconView): else: logger.critical("FIXME: unknown status: %s", status) status_icon = self.not_downloaded_icon - return status_icon - + return status_icon + def sort_by_timestamp(self): self.liststore.set_sort_column_id(self.TIMESTAMP_COL, gtk.SORT_ASCENDING) - + def on_selection_changed(self, iconview): self._selected_items = self.get_selected_items() - + def on_checkbutton_toggled(self, cellrenderertoggle, path): paths = [p[0] for p in self._selected_items] if int(path) not in paths: self._selected_items = [path,] - + for path in self._selected_items: iter = self.liststore.get_iter(path) status = self.liststore.get_value(iter, self.DOWNLOAD_STATUS_COL) if status == STATUS_NOT_DOWNLOADED: self.liststore.set_value(iter, self.SELECTED_COL, not cellrenderertoggle.get_active()) self.select_path(path) - + self.rapid_app.set_download_action_sensitivity() - - + + def set_selected(self, unique_id, value): iter = self.get_iter_from_unique_id(unique_id) self.liststore.set_value(iter, self.SELECTED_COL, value) - + def add_file(self, rpd_file, generate_thumbnail): thumbnail_icon = self.get_stock_icon(rpd_file.file_type) @@ -650,7 +655,7 @@ class ThumbnailDisplay(gtk.IconView): scan_pid = rpd_file.scan_pid timestamp = int(rpd_file.modification_time) - + iter = self.liststore.append((thumbnail_icon, True, unique_id, @@ -661,47 +666,47 @@ class ThumbnailDisplay(gtk.IconView): STATUS_NOT_DOWNLOADED, self.not_downloaded_icon )) - + path = self.liststore.get_path(iter) treerowref = gtk.TreeRowReference(self.liststore, path) - + if scan_pid in self.process_index: self.process_index[scan_pid].append(unique_id) else: self.process_index[scan_pid] = [unique_id,] - + self.treerow_index[unique_id] = treerowref self.rpd_files[unique_id] = rpd_file - + if generate_thumbnail: self.total_thumbs_to_generate += 1 def get_sample_file(self, file_type): - """Returns an rpd_file for of a given file type, or None if it does + """Returns an rpd_file for of a given file type, or None if it does not exist""" for unique_id, rpd_file in self.rpd_files.iteritems(): if rpd_file.file_type == file_type: if rpd_file.status <> STATUS_CANNOT_DOWNLOAD: return rpd_file - + return None - + def get_unique_id_from_iter(self, iter): return self.liststore.get_value(iter, 2) - + def get_iter_from_unique_id(self, unique_id): treerowref = self.treerow_index[unique_id] path = treerowref.get_path() return self.liststore.get_iter(path) - - def on_item_activated(self, iconview, path): + + def on_item_activated(self, iconview, path): """ """ iter = self.liststore.get_iter(path) self.show_preview(iter=iter) self.advance_get_preview_image(iter) - + def _get_preview(self, unique_id, rpd_file): if unique_id not in self.previews_being_fetched: #check if preview should be from a downloaded file, or the source @@ -711,13 +716,13 @@ class ThumbnailDisplay(gtk.IconView): else: file_location = rpd_file.full_file_name thm_file_name = rpd_file.thm_full_name - + self.preview_manager.get_preview(unique_id, file_location, thm_file_name, rpd_file.file_type, size_max=None,) - + self.previews_being_fetched.add(unique_id) - + def show_preview(self, unique_id=None, iter=None): if unique_id is not None: iter = self.get_iter_from_unique_id(unique_id) @@ -734,31 +739,31 @@ class ThumbnailDisplay(gtk.IconView): path = 0 iter = self.liststore.get_iter(path) unique_id = self.get_unique_id_from_iter(iter) - - - rpd_file = self.rpd_files[unique_id] - + + + rpd_file = self.rpd_files[unique_id] + if unique_id in self.previews: preview_image = self.previews[unique_id] else: # request daemon process to get a full size thumbnail self._get_preview(unique_id, rpd_file) - if unique_id in self.thumbnails: + if unique_id in self.thumbnails: preview_image = self.thumbnails[unique_id] else: preview_image = self.get_stock_icon(rpd_file.file_type) - + checked = self.liststore.get_value(iter, self.SELECTED_COL) include_checkbutton_visible = rpd_file.status == STATUS_NOT_DOWNLOADED - self.rapid_app.show_preview_image(unique_id, preview_image, + self.rapid_app.show_preview_image(unique_id, preview_image, include_checkbutton_visible, checked) - + def _get_next_iter(self, iter): iter = self.liststore.iter_next(iter) if iter is None: iter = self.liststore.get_iter_first() return iter - + def _get_prev_iter(self, iter): row = self.liststore.get_path(iter)[0] if row == 0: @@ -766,44 +771,44 @@ class ThumbnailDisplay(gtk.IconView): else: row -= 1 iter = self.liststore.get_iter(row) - return iter - + return iter + def show_next_image(self, unique_id): iter = self.get_iter_from_unique_id(unique_id) iter = self._get_next_iter(iter) if iter is not None: self.show_preview(iter=iter) - + # cache next image self.advance_get_preview_image(iter, prev=False, next=True) - + def show_prev_image(self, unique_id): iter = self.get_iter_from_unique_id(unique_id) iter = self._get_prev_iter(iter) if iter is not None: self.show_preview(iter=iter) - + # cache next image self.advance_get_preview_image(iter, prev=True, next=False) - + def advance_get_preview_image(self, iter, prev=True, next=True): unique_ids = [] if next: next_iter = self._get_next_iter(iter) unique_ids.append(self.get_unique_id_from_iter(next_iter)) - + if prev: prev_iter = self._get_prev_iter(iter) unique_ids.append(self.get_unique_id_from_iter(prev_iter)) - + for unique_id in unique_ids: if not unique_id in self.previews: rpd_file = self.rpd_files[unique_id] self._get_preview(unique_id, rpd_file) - + def check_all(self, check_all, file_type=None): for row in self.liststore: if row[self.CHECKBUTTON_VISIBLE_COL]: @@ -813,7 +818,7 @@ class ThumbnailDisplay(gtk.IconView): else: row[self.SELECTED_COL] = check_all self.rapid_app.set_download_action_sensitivity() - + def files_are_checked_to_download(self): """ Returns True if there is any file that the user has indicated they @@ -825,12 +830,12 @@ class ThumbnailDisplay(gtk.IconView): if rpd_file.status not in DOWNLOADED: return True return False - + def get_files_checked_for_download(self, scan_pid): """ Returns a dict of scan ids and associated files the user has indicated they want to download - + If scan_pid is not None, then returns only those files from that scan_pid """ files = dict() @@ -853,7 +858,7 @@ class ThumbnailDisplay(gtk.IconView): if self.liststore.get_value(iter, self.SELECTED_COL): files[scan_pid].append(rpd_file) return files - + def get_no_files_remaining(self, scan_pid): """ Returns the number of files that have not yet been downloaded for the @@ -865,17 +870,17 @@ class ThumbnailDisplay(gtk.IconView): if rpd_file.status == STATUS_NOT_DOWNLOADED: i += 1 return i - + def files_remain_to_download(self): """ - Returns True if any files remain that are not downloaded, else returns + Returns True if any files remain that are not downloaded, else returns False """ for row in self.liststore: if row[self.DOWNLOAD_STATUS_COL] == STATUS_NOT_DOWNLOADED: return True return False - + def mark_download_pending(self, files_by_scan_pid): """ @@ -895,19 +900,19 @@ class ThumbnailDisplay(gtk.IconView): self.liststore.set_value(iter, self.DOWNLOAD_STATUS_COL, STATUS_DOWNLOAD_PENDING) icon = self.get_status_icon(STATUS_DOWNLOAD_PENDING) self.liststore.set_value(iter, self.STATUS_ICON_COL, icon) - + def select_image(self, unique_id): iter = self.get_iter_from_unique_id(unique_id) path = self.liststore.get_path(iter) self.select_path(path) self.scroll_to_path(path, use_align=False, row_align=0.5, col_align=0.5) - + def get_stock_icon(self, file_type): if file_type == rpdfile.FILE_TYPE_PHOTO: return self.stock_photo_thumbnails.stock_thumbnail_image_icon else: return self.stock_video_thumbnails.stock_thumbnail_image_icon - + def update_status_post_download(self, rpd_file): iter = self.get_iter_from_unique_id(rpd_file.unique_id) self.liststore.set_value(iter, self.DOWNLOAD_STATUS_COL, rpd_file.status) @@ -915,7 +920,7 @@ class ThumbnailDisplay(gtk.IconView): self.liststore.set_value(iter, self.STATUS_ICON_COL, icon) self.liststore.set_value(iter, self.CHECKBUTTON_VISIBLE_COL, False) self.rpd_files[rpd_file.unique_id] = rpd_file - + def generate_thumbnails(self, scan_pid): """Initiate thumbnail generation for files scanned in one process """ @@ -923,81 +928,81 @@ class ThumbnailDisplay(gtk.IconView): rpd_files = [self.rpd_files[unique_id] for unique_id in self.process_index[scan_pid]] 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) - + self.liststore.set(iter, 0, icon) + def update_thumbnail(self, thumbnail_data): """ Takes the generated thumbnail and updates the display - + If the thumbnail_data includes a second image, that is used to update the thumbnail list using the unique_id """ unique_id = thumbnail_data[0] thumbnail_icon = thumbnail_data[1] - + if thumbnail_icon is not None: # get the thumbnail icon in PIL format thumbnail_icon = thumbnail_icon.get_image() - + if 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 + 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: - + for thumbnail_data in data: self.update_thumbnail(thumbnail_data) - + self.thumbnails_generated += len(data) - + # clear progress bar information if all thumbnails have been # extracted if self.thumbnails_generated == self.total_thumbs_to_generate: @@ -1006,10 +1011,10 @@ class ThumbnailDisplay(gtk.IconView): if self.total_thumbs_to_generate: self.rapid_app.download_progressbar.set_fraction( float(self.thumbnails_generated) / self.total_thumbs_to_generate) - - + + return True - + def preview_results(self, unique_id, preview_full_size, preview_small): """ Receive a full size preview image and update @@ -1019,24 +1024,24 @@ 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 and preview_small is not None: self._set_thumbnail(unique_id, preview_small.get_image()) - - + + def clear_all(self, scan_pid=None, keep_downloaded_files=False): """ Removes files from display and internal tracking. - + If scan_pid is not None, then only files matching that scan_pid will be removed. Otherwise, everything will be removed. - + If keep_downloaded_files is True, files will not be removed if they have been downloaded. """ if scan_pid is None and not keep_downloaded_files: - + # Here it is critically important to create a brand new liststore, # because the old one is set to be sorted, which is extremely slow. logger.debug("Creating new thumbnails model") @@ -1045,7 +1050,7 @@ class ThumbnailDisplay(gtk.IconView): self.treerow_index = {} self.process_index = {} - + self.rpd_files = {} else: if scan_pid in self.process_index: @@ -1060,80 +1065,80 @@ class ThumbnailDisplay(gtk.IconView): del self.rpd_files[rpd_file.unique_id] if not keep_downloaded_files or not len(self.process_index[scan_pid]): del self.process_index[scan_pid] - + def display_thumbnails(self): self.set_model(self.liststore) - + class TaskManager: def __init__(self, results_callback, batch_size): self.results_callback = results_callback - + # List of actual process, it's terminate_queue, and it's run_event self._processes = [] - + self._pipes = {} self.batch_size = batch_size - + self.paused = False self.no_tasks = 0 - - + + def add_task(self, task): pid = self._setup_task(task) logger.debug("TaskManager PID: %s", pid) self.no_tasks += 1 return pid - + def _setup_task(self, task): task_results_conn, task_process_conn = self._setup_pipe() - + source = task_results_conn.fileno() self._pipes[source] = task_results_conn gobject.io_add_watch(source, gobject.IO_IN, self.results_callback) - + terminate_queue = Queue() run_event = Event() run_event.set() - - return self._initiate_task(task, task_results_conn, task_process_conn, + + 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!") - - + + def processes(self): for i in range(len(self._processes)): yield self._processes[i] - + def start(self): self.paused = False for scan in self.processes(): run_event = scan[2] if not run_event.is_set(): run_event.set() - + def pause(self): self.paused = True for scan in self.processes(): 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 @@ -1143,7 +1148,7 @@ class TaskManager: if p[0].pid == process_id: if p[0].is_alive(): self._terminate_process(p) - + def request_termination(self): """ Send a signal to processes that they should immediately terminate @@ -1153,29 +1158,29 @@ class TaskManager: if p[0].is_alive(): requested = True self._terminate_process(p) - + return requested - + def terminate_forcefully(self): """ Forcefully terminates any running processes. Use with great caution. - No cleanup action is performed. - + No cleanup action is performed. + As python essential reference (4th edition) says, if the process 'holds a lock or is involved with interprocess communication, terminating it might cause a deadlock or corrupted I/O.' """ - + for p in self.processes(): if p[0].is_alive(): - logger.info("Forcefully terminating %s in %s" , p[0].name, + logger.info("Forcefully terminating %s in %s" , p[0].name, self.__class__.__name__) p[0].terminate() - + def get_pipe(self, source): return self._pipes[source] - + def get_no_active_processes(self): """ Returns how many processes are currently active, i.e. running @@ -1188,38 +1193,38 @@ class TaskManager: class ScanManager(TaskManager): - - def __init__(self, results_callback, batch_size, + + def __init__(self, results_callback, batch_size, add_device_function): TaskManager.__init__(self, results_callback, batch_size) self.add_device_function = add_device_function - - def _initiate_task(self, task, task_results_conn, task_process_conn, + + def _initiate_task(self, task, task_results_conn, task_process_conn, terminate_queue, run_event): - + device = task[0] ignored_paths = task[1] use_re_ignored_paths = task[2] - + scan = scan_process.Scan(device.get_path(), ignored_paths, use_re_ignored_paths, - self.batch_size, + self.batch_size, task_process_conn, terminate_queue, run_event) scan.start() self._processes.append((scan, terminate_queue, run_event)) - self.add_device_function(scan.pid, device, + self.add_device_function(scan.pid, device, # 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 + # 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. progress_bar_text=_('scanning...')) - + return scan.pid - + class CopyFilesManager(TaskManager): - - def _initiate_task(self, task, task_results_conn, + + 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] @@ -1227,25 +1232,25 @@ class CopyFilesManager(TaskManager): files = task[3] modify_files_during_download = task[4] modify_pipe = task[5] - + copy_files = copyfiles.CopyFiles(photo_download_folder, video_download_folder, - files, + files, modify_files_during_download, modify_pipe, - scan_pid, self.batch_size, + scan_pid, self.batch_size, task_process_conn, terminate_queue, run_event) copy_files.start() self._processes.append((copy_files, terminate_queue, run_event)) return copy_files.pid - + class ThumbnailManager(TaskManager): 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, + 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)) @@ -1256,44 +1261,44 @@ class FileModifyManager(TaskManager): Duplex, multiprocess, similar to BackupFilesManager """ def __init__(self, results_callback): - TaskManager.__init__(self, results_callback=results_callback, + TaskManager.__init__(self, results_callback=results_callback, batch_size=0) self.file_modify_by_scan_pid = {} - - def _initiate_task(self, task, task_results_conn, task_process_conn, + + def _initiate_task(self, task, task_results_conn, task_process_conn, terminate_queue, run_event): scan_pid = task[0] auto_rotate_jpeg = task[1] focal_length = task[2] - + file_modify = filemodify.FileModify(auto_rotate_jpeg, focal_length, - task_process_conn, terminate_queue, + task_process_conn, terminate_queue, run_event) file_modify.start() - self._processes.append((file_modify, terminate_queue, run_event, + self._processes.append((file_modify, terminate_queue, run_event, task_results_conn)) - + self.file_modify_by_scan_pid[scan_pid] = (task_results_conn, file_modify.pid) - + return file_modify.pid def _setup_pipe(self): return Pipe(duplex=True) - + def _send_termination_msg(self, p): p[1].put(None) p[3].send((None, None)) - + def get_modify_pipe(self, scan_pid): return self.file_modify_by_scan_pid[scan_pid][0] - - + + class BackupFilesManager(TaskManager): """ Handles backup processes. This is a little different from some 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. - + Duplex, multiprocess. """ def __init__(self, results_callback, batch_size): @@ -1302,30 +1307,31 @@ class BackupFilesManager(TaskManager): 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, + p[3].send((None, 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_type = task[2] - backup_files = backupfile.BackupFiles(path, name, self.batch_size, - task_process_conn, terminate_queue, + 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, + self._processes.append((backup_files, terminate_queue, run_event, task_results_conn)) - + self.backup_devices_by_path[path] = (task_results_conn, backup_files.pid, backup_type) - + return backup_files.pid - - def backup_file(self, move_succeeded, rpd_file, path_suffix, - backup_duplicate_overwrite): + + def backup_file(self, move_succeeded, rpd_file, path_suffix, + backup_duplicate_overwrite, + download_count): if rpd_file.file_type == rpdfile.FILE_TYPE_PHOTO: logger.debug("Backing up photo %s", rpd_file.download_name) @@ -1334,124 +1340,124 @@ class BackupFilesManager(TaskManager): for path in self.backup_devices_by_path: backup_type = self.backup_devices_by_path[path][2] - if ((backup_type == PHOTO_VIDEO_BACKUP) or + if ((backup_type == PHOTO_VIDEO_BACKUP) or (rpd_file.file_type == rpdfile.FILE_TYPE_PHOTO and backup_type == PHOTO_BACKUP) or (rpd_file.file_type == rpdfile.FILE_TYPE_VIDEO and backup_type == VIDEO_BACKUP)): logger.debug("Backing up to %s", path) task_results_conn = self.backup_devices_by_path[path][0] - task_results_conn.send((move_succeeded, rpd_file, path_suffix, - backup_duplicate_overwrite)) + task_results_conn.send((move_succeeded, rpd_file, path_suffix, + backup_duplicate_overwrite, download_count)) else: logger.debug("Not backing up to %s", path) - + def add_device(self, path, name, backup_type): """ Convenience function to setup adding a backup device """ return self.add_task((path, name, backup_type)) - + 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 processes, but also a non-daemon process that has one simple task. - + Core (infrastructure) functionality is implemented in this class. Derived classes should implemented functionality to actually implement specific tasks. """ - def __init__(self, results_callback): + def __init__(self, results_callback): self.results_callback = results_callback - + self.task_results_conn, self.task_process_conn = Pipe(duplex=True) - + source = self.task_results_conn.fileno() gobject.io_add_watch(source, gobject.IO_IN, self.task_results) - + class PreviewManager(SingleInstanceTaskManager): def __init__(self, results_callback): SingleInstanceTaskManager.__init__(self, results_callback) self._get_preview = tn.GetPreviewImage(self.task_process_conn) self._get_preview.start() - + def get_preview(self, unique_id, full_file_name, thm_file_name, file_type, size_max): self.task_results_conn.send((unique_id, full_file_name, thm_file_name, file_type, size_max)) - + def task_results(self, source, condition): unique_id, preview_full_size, preview_small = self.task_results_conn.recv() self.results_callback(unique_id, preview_full_size, preview_small) - return True - + return True + class SubfolderFileManager(SingleInstanceTaskManager): """ Manages the daemon process that renames files and creates subfolders """ def __init__(self, results_callback, sequence_values): SingleInstanceTaskManager.__init__(self, results_callback) - self._subfolder_file = subfolderfile.SubfolderFile(self.task_process_conn, + self._subfolder_file = subfolderfile.SubfolderFile(self.task_process_conn, sequence_values) self._subfolder_file.start() logger.debug("SubfolderFile PID: %s", self._subfolder_file.pid) - - def rename_file_and_move_to_subfolder(self, download_succeeded, + + def rename_file_and_move_to_subfolder(self, download_succeeded, download_count, rpd_file): - - self.task_results_conn.send((download_succeeded, download_count, + + logger.debug("Sending file for rename: %s.", download_count) + self.task_results_conn.send((download_succeeded, download_count, rpd_file)) - logger.debug("Download count: %s.", download_count) - + def task_results(self, source, condition): - move_succeeded, rpd_file = self.task_results_conn.recv() - self.results_callback(move_succeeded, rpd_file) + move_succeeded, rpd_file, download_count = self.task_results_conn.recv() + self.results_callback(move_succeeded, rpd_file, download_count) return True - + class ResizblePilImage(gtk.DrawingArea): def __init__(self, bg_color=None): gtk.DrawingArea.__init__(self) self.base_image = None self.bg_color = bg_color self.connect('expose_event', self.expose) - + def set_image(self, image): self.base_image = image - + #set up sizes and ratio used for drawing the derived image self.base_image_w = self.base_image.size[0] self.base_image_h = self.base_image.size[1] self.base_image_aspect = float(self.base_image_w) / self.base_image_h - + self.queue_draw() - + def expose(self, widget, event): cairo_context = self.window.cairo_create() - - x = event.area.x - y = event.area.y + + x = event.area.x + y = event.area.y w = event.area.width h = event.area.height - - #constrain operations to event area + + #constrain operations to event area cairo_context.rectangle(x, y, w, h) cairo_context.clip_preserve() - + #set background color, if needed if self.bg_color: cairo_context.set_source_rgb(*self.bg_color) - cairo_context.fill_preserve() + cairo_context.fill_preserve() if not self.base_image: return False - + frame_aspect = float(w) / h - + if frame_aspect > self.base_image_aspect: # Frame is wider than image height = h @@ -1460,7 +1466,7 @@ class ResizblePilImage(gtk.DrawingArea): # Frame is taller than image width = w height = int(width / self.base_image_aspect) - + #resize image pil_image = self.base_image.copy() if self.base_image_w < width or self.base_image_h < height: @@ -1473,38 +1479,38 @@ class ResizblePilImage(gtk.DrawingArea): #image width and height image_w = pil_image.size[0] image_h = pil_image.size[1] - + #center the image horizontally and vertically #top left and right corners for the image: image_x = x + ((w - image_w) / 2) image_y = y + ((h - image_h) / 2) - + image = create_cairo_image_surface(pil_image, image_w, image_h) cairo_context.set_source_surface(image, image_x, image_y) - cairo_context.paint() + cairo_context.paint() + + return False + - return False - - class PreviewImage: - + def __init__(self, parent_app, builder): #set background color to equivalent of '#444444 - self.preview_image = ResizblePilImage(bg_color=(0.267, 0.267, 0.267)) + self.preview_image = ResizblePilImage(bg_color=(0.267, 0.267, 0.267)) self.preview_image_eventbox = builder.get_object("preview_eventbox") self.preview_image_eventbox.add(self.preview_image) self.preview_image.show() self.download_this_checkbutton = builder.get_object("download_this_checkbutton") self.rapid_app = parent_app - + self.base_preview_image = None # large size image used to scale down from self.current_preview_size = (0,0) self.preview_image_size_limit = (0,0) - + self.unique_id = None - - def set_preview_image(self, unique_id, pil_image, include_checkbutton_visible=None, + + def set_preview_image(self, unique_id, pil_image, include_checkbutton_visible=None, checked=None): """ """ @@ -1516,72 +1522,74 @@ class PreviewImage: if include_checkbutton_visible is not None: self.download_this_checkbutton.props.visible = include_checkbutton_visible - + def update_preview_image(self, unique_id, pil_image): if unique_id == self.unique_id: self.set_preview_image(unique_id, pil_image) - + class RapidApp(dbus.service.Object): """ The main Rapid Photo Downloader application class. - + Contains functionality for main program window, and directs all other processes. """ - + def __init__(self, bus, path, name, taskserver=None, focal_length=None, - auto_detect=None, device_location=None): - + auto_detect=None, device_location=None): + dbus.service.Object.__init__ (self, bus, path, name) self.running = False - + self.taskserver = taskserver - + self.focal_length = focal_length - + # Setup program preferences, and set callback for when they change self._init_prefs(auto_detect, device_location) - + # Initialize widgets in the main window, and variables that point to them self._init_widgets() - self._init_pynotify() - + + if use_pynotify: + self._init_pynotify() + # Initialize job code handling self._init_job_code() - + # Remember the window size from the last time the program was run, or # set a default size self._set_window_size() - + # Setup various widgets self._setup_buttons() self._setup_error_icons() self._setup_icons() - + # Show the main window self.rapidapp.show() - + # Check program preferences - don't allow auto start if there is a problem prefs_valid, msg = prefsrapid.check_prefs_for_validity(self.prefs) if not prefs_valid: self.notify_prefs_are_invalid(details=msg) - + # Initialize variables with which to track important downloads results self._init_download_tracking() - + # Set up process managers. # A task such as scanning a device or copying files is handled in its # own process. self._start_process_managers() - + # Setup devices from which to download from and backup to - self.setup_devices(on_startup=True, on_preference_change=False, + self.setup_devices(on_startup=True, on_preference_change=False, block_auto_start=not prefs_valid) - + # Ensure the device collection scrolled window is not too small self._set_device_collection_size() - + def on_rapidapp_destroy(self, widget, data=None): self._terminate_processes(terminate_file_copies = True) @@ -1592,30 +1600,30 @@ class RapidApp(dbus.service.Object): x, y, width, height = self.rapidapp.get_allocation() self.prefs.main_window_size_x = width self.prefs.main_window_size_y = height - + self.prefs.set_downloads_today_from_tracker(self.downloads_today_tracker) - + gtk.main_quit() - + def _terminate_processes(self, terminate_file_copies=False): - + if terminate_file_copies: logger.info("Terminating all processes...") - scan_termination_requested = self.scan_manager.request_termination() + 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() file_modify_termination_requested = self.file_modify_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 or backup_termination_requested or file_modify_termination_requested): time.sleep(1) - if (self.scan_manager.get_no_active_processes() > 0 or + if (self.scan_manager.get_no_active_processes() > 0 or self.thumbnails.thumbnail_manager.get_no_active_processes() > 0 or self.backup_manager.get_no_active_processes() > 0 or self.file_modify_manager.get_no_active_processes() > 0): @@ -1626,14 +1634,14 @@ class RapidApp(dbus.service.Object): self.scan_manager.terminate_forcefully() self.backup_manager.terminate_forcefully() self.file_modify_manager.terminate_forcefully() - + if terminate_file_copies and copy_files_termination_requested: time.sleep(1) self.copy_files_manager.terminate_forcefully() - + if terminate_file_copies: self._clean_all_temp_dirs() - + # # # # Events and tasks related to displaying preview images and thumbnails # # # @@ -1642,61 +1650,61 @@ class RapidApp(dbus.service.Object): value = checkbutton.get_active() self.thumbnails.set_selected(self.preview_image.unique_id, value) self.set_download_action_sensitivity() - + def on_preview_eventbox_button_press_event(self, widget, event): - + if event.type == gtk.gdk._2BUTTON_PRESS and event.button == 1: - self.show_thumbnails() - + self.show_thumbnails() + def on_show_thumbnails_action_activate(self, action): logger.debug("on_show_thumbnails_action_activate") self.show_thumbnails() - + def on_show_image_action_activate(self, action): logger.debug("on_show_image_action_activate") self.thumbnails.show_preview() - + def on_check_all_action_activate(self, action): self.thumbnails.check_all(check_all=True) - + def on_uncheck_all_action_activate(self, action): self.thumbnails.check_all(check_all=False) def on_check_all_photos_action_activate(self, action): - self.thumbnails.check_all(check_all=True, + self.thumbnails.check_all(check_all=True, file_type=rpdfile.FILE_TYPE_PHOTO) - + def on_check_all_videos_action_activate(self, action): - self.thumbnails.check_all(check_all=True, + self.thumbnails.check_all(check_all=True, file_type=rpdfile.FILE_TYPE_VIDEO) - + def on_quit_action_activate(self, action): self.on_rapidapp_destroy(widget=self.rapidapp, data=None) - + def on_refresh_action_activate(self, action): self.thumbnails.clear_all() self.setup_devices(on_startup=False, on_preference_change=False, block_auto_start=True) - + def on_get_help_action_activate(self, action): webbrowser.open("http://www.damonlynch.net/rapid/help.html") - + def on_about_action_activate(self, action): self.about.set_property("name", PROGRAM_NAME) self.about.set_property("version", utilities.human_readable_version( __version__)) self.about.run() self.about.hide() - + def on_report_problem_action_activate(self, action): webbrowser.open("https://bugs.launchpad.net/rapid") - + def on_translate_action_activate(self, action): webbrowser.open("http://www.damonlynch.net/rapid/translate.html") - + def on_donate_action_activate(self, action): webbrowser.open("http://www.damonlynch.net/rapid/donate.html") - + def show_preview_image(self, unique_id, image, include_checkbutton_visible, checked): if self.main_notebook.get_current_page() == 0: # thumbnails logger.debug("Switching to preview image display") @@ -1704,26 +1712,26 @@ class RapidApp(dbus.service.Object): self.preview_image.set_preview_image(unique_id, image, include_checkbutton_visible, checked) self.next_image_action.set_sensitive(True) self.prev_image_action.set_sensitive(True) - + def update_preview_image(self, unique_id, image): self.preview_image.update_preview_image(unique_id, image) - + def show_thumbnails(self): logger.debug("Switching to thumbnails display") self.main_notebook.set_current_page(0) self.thumbnails.select_image(self.preview_image.unique_id) self.next_image_action.set_sensitive(False) self.prev_image_action.set_sensitive(False) - - + + def on_next_image_action_activate(self, action): if self.preview_image.unique_id is not None: self.thumbnails.show_next_image(self.preview_image.unique_id) - + def on_prev_image_action_activate(self, action): - if self.preview_image.unique_id is not None: + if self.preview_image.unique_id is not None: self.thumbnails.show_prev_image(self.preview_image.unique_id) - + def display_scan_thumbnails(self): """ If all the scans are complete, sets the sort order and displays @@ -1737,35 +1745,36 @@ class RapidApp(dbus.service.Object): # # # # Volume management # # # - + def start_volume_monitor(self): if not self.vmonitor: self.vmonitor = gio.volume_monitor_get() self.vmonitor.connect("mount-added", self.on_mount_added) - self.vmonitor.connect("mount-removed", self.on_mount_removed) - - + self.vmonitor.connect("mount-removed", self.on_mount_removed) + + def _backup_device_name(self, path): if self.backup_devices[path][0] is None: name = path else: name = self.backup_devices[path][0].get_name() return name - + def start_device_scan(self, device): """ - Commences the scanning of a device using the preference values for + Commences the scanning of a device using the preference values for any paths to ignore while scanning """ - return self.scan_manager.add_task([device, + logger.debug("Starting a device scan for device %s", device.get_name()) + return self.scan_manager.add_task([device, self.prefs.ignored_paths, self.prefs.use_re_ignored_paths]) - + def confirm_manual_location(self): """ - Queries the user to ask if they really want to download from locations + Queries the user to ask if they really want to download from locations that could take a very long time to scan. They can choose yes or no. - + Returns True if yes or there was no need to ask the user, False if the user said no. """ @@ -1781,34 +1790,34 @@ class RapidApp(dbus.service.Object): question="<b>" + _("Downloading from %(location)s.") % {'location': l} + "</b>\n\n" + _("Do you really want to download from here? On some systems, scanning this location can take a very long time."), default_to_yes=False, - use_markup=True) + use_markup=True) response = c.run() user_confirmed = response == gtk.RESPONSE_OK c.destroy() if not user_confirmed: return False return True - + def setup_devices(self, on_startup, on_preference_change, block_auto_start): """ - + Setup devices from which to download from and backup to - + Sets up volumes for downloading from and backing up to - - on_startup should be True if the program is still starting, + + on_startup should be True if the program is still starting, i.e. this is being called from the program's initialization. - + on_preference_change should be True if this is being called as the result of a preference being changed - + block_auto_start should be True if automation options to automatically start a download should be ignored - - Removes any image media that are currently not downloaded, - or finished downloading + + Removes any image media that are currently not downloaded, + or finished downloading """ - + if self.using_volume_monitor(): self.start_volume_monitor() @@ -1816,10 +1825,10 @@ class RapidApp(dbus.service.Object): if not self.prefs.device_autodetection: if not self.confirm_manual_location(): return - + mounts = [] self.backup_devices = {} - + if self.using_volume_monitor(): # either using automatically detected backup devices # or download devices @@ -1827,7 +1836,7 @@ class RapidApp(dbus.service.Object): if not mount.is_shadowed(): path = mount.get_root().get_path() if path: - if (path in self.prefs.device_blacklist and + if (path in self.prefs.device_blacklist and self.search_for_PSD()): logger.info("%s ignored", mount.get_name()) else: @@ -1835,17 +1844,17 @@ class RapidApp(dbus.service.Object): is_backup_mount, backup_file_type = self.check_if_backup_mount(path) if is_backup_mount: self.backup_devices[path] = (mount, backup_file_type) - elif (self.prefs.device_autodetection and - (dv.is_DCIM_device(path) or + elif (self.prefs.device_autodetection and + (dv.is_DCIM_device(path) or self.search_for_PSD())): logger.debug("Appending %s", mount.get_name()) mounts.append((path, mount)) else: logger.debug("Ignoring %s", mount.get_name()) - - + + if not self.prefs.device_autodetection: - # user manually specified the path from which to download + # user manually specified the path from which to download path = self.prefs.device_location if path: logger.info("Using manually specified path %s", path) @@ -1858,35 +1867,47 @@ class RapidApp(dbus.service.Object): if not self.prefs.backup_device_autodetection: self._setup_manual_backup() self._add_backup_devices() - + self.update_no_backup_devices() - + # Display amount of free space in a status bar message self.display_free_space() - + if block_auto_start: self.auto_start_is_on = False else: self.auto_start_is_on = ((not on_preference_change) and - ((self.prefs.auto_download_at_startup and - on_startup) or + ((self.prefs.auto_download_at_startup and + on_startup) or (self.prefs.auto_download_upon_device_insertion and not on_startup))) - + + logger.debug("Working with %s devices", len(mounts)) for m in mounts: path, mount = m device = dv.Device(path=path, mount=mount) - if (self.search_for_PSD() and - path not in self.prefs.device_whitelist): - # prompt user to see if device should be used or not - self.get_use_device(device) - else: - scan_pid = self.start_device_scan(device) - if mount is not None: - self.mounts_by_path[path] = scan_pid + + + if not self._device_already_detected(device): + if (self.search_for_PSD() and + path not in self.prefs.device_whitelist): + # prompt user to see if device should be used or not + self.get_use_device(device) + else: + scan_pid = self.start_device_scan(device) + if mount is not None: + self.mounts_by_path[path] = scan_pid if not mounts: self.set_download_action_sensitivity() - + + def _device_already_detected(self, device): + path = device.get_path() + if path in self.mounts_by_path: + logger.debug("Ignoring device %s as already have path %s", device.get_name(), path) + return True + else: + return False + def _setup_manual_backup(self): """ Setup backup devices that the user has manually specified. @@ -1894,8 +1915,8 @@ class RapidApp(dbus.service.Object): video backup will either be the same or they will differ. """ # user manually specified backup locations - # will backup to these paths, but don't need any volume info - # associated with them + # will backup to these paths, but don't need any volume info + # associated with them self.backup_devices[self.prefs.backup_location] = (None, PHOTO_BACKUP) if DOWNLOAD_VIDEO: if self.prefs.backup_location <> self.prefs.backup_video_location: @@ -1908,7 +1929,7 @@ class RapidApp(dbus.service.Object): logger.info("Backing up photos and videos to %s", self.prefs.backup_location) else: logger.info("Backing up photos to %s", self.prefs.backup_location) - + def _add_backup_devices(self): """ Add each backup devices / path to backup manager @@ -1917,20 +1938,28 @@ class RapidApp(dbus.service.Object): name = self._backup_device_name(path) backup_type = self.backup_devices[path][1] self.backup_manager.add_device(path, name, backup_type) - - - def get_use_device(self, device): + + + def get_use_device(self, device): """ Prompt user whether or not to download from this device """ - + logger.info("Prompting whether to use %s", device.get_name()) + + # On some systems, e.g. Ubuntu 12.10, the GTK/Gnome environment + # unexpectedly results in a device being added twice and not once. + # The hack on the next line ensures the user is not prompted twice + # for the same device. + + self.mounts_by_path[device.get_path()] = "PROMPTING" + d = dv.UseDeviceDialog(self.rapidapp, device, self.got_use_device) - + def got_use_device(self, dialog, user_selected, permanent_choice, device): """ User has chosen whether or not to use a device to download from """ dialog.destroy() - + path = device.get_path() - + if user_selected: if permanent_choice and path not in self.prefs.device_whitelist: # do NOT do a list append operation here without the assignment, @@ -1941,37 +1970,37 @@ class RapidApp(dbus.service.Object): self.prefs.device_whitelist = [path] scan_pid = self.start_device_scan(device) self.mounts_by_path[path] = scan_pid - + elif permanent_choice and path not in self.prefs.device_blacklist: # do not do a list append operation here without the assignment, or the preferences will not be updated! if len(self.prefs.device_blacklist): self.prefs.device_blacklist = self.prefs.device_blacklist + [path] else: - self.prefs.device_blacklist = [path] - + self.prefs.device_blacklist = [path] + def search_for_PSD(self): """ - Check to see if user preferences are to automatically search for + Check to see if user preferences are to automatically search for Portable Storage Devices or not """ return self.prefs.device_autodetection_psd and self.prefs.device_autodetection def check_if_backup_mount(self, path): """ - Checks to see if backups are enabled and path represents a valid backup + Checks to see if backups are enabled and path represents a valid backup location. It must be writeable. - + Checks against user preferences. - + Returns a tuple: (True, <backup-type> (one of PHOTO_VIDEO_BACKUP, PHOTO_BACKUP, or VIDEO_BACKUP)) or - (False, None) + (False, None) """ if self.prefs.backup_images: if self.prefs.backup_device_autodetection: - # Determine if the auto-detected backup device is + # Determine if the auto-detected backup device is # to be used to backup only photos, or videos, or both. - # Use the presence of a corresponding directory to + # Use the presence of a corresponding directory to # determine this. # The directory must be writable. photo_path = os.path.join(path, self.prefs.backup_identifier) @@ -1991,7 +2020,7 @@ class RapidApp(dbus.service.Object): logger.info("Videos will be backed up to %s", path) return (True, VIDEO_BACKUP) elif path == self.prefs.backup_location: - # user manually specified the path + # user manually specified the path if os.access(self.prefs.backup_location, os.W_OK): return (True, PHOTO_BACKUP) elif path == self.prefs.backup_video_location: @@ -2013,22 +2042,22 @@ class RapidApp(dbus.service.Object): #both videos and photos are backed up to this device / path self.no_photo_backup_devices += 1 self.no_video_backup_devices += 1 - logger.info("# photo backup devices: %s; # video backup devices: %s", + logger.info("# photo backup devices: %s; # video backup devices: %s", self.no_photo_backup_devices, self.no_video_backup_devices) - self.download_tracker.set_no_backup_devices(self.no_photo_backup_devices, + self.download_tracker.set_no_backup_devices(self.no_photo_backup_devices, self.no_video_backup_devices) def refresh_backup_media(self): """ Setup the backup media - - Assumptions: this is being called after the user has changed their + + 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: @@ -2043,22 +2072,22 @@ class RapidApp(dbus.service.Object): # is a backup volume if path not in self.backup_devices: self.backup_devices[path] = (mount, backup_file_type) - + self._add_backup_devices() self.update_no_backup_devices() self.display_free_space() - + def using_volume_monitor(self): """ Returns True if programs needs to use gio volume monitor """ - - return (self.prefs.device_autodetection or - (self.prefs.backup_images and + + return (self.prefs.device_autodetection or + (self.prefs.backup_images and self.prefs.backup_device_autodetection )) - + def on_mount_added(self, vmonitor, mount): """ callback run when gio indicates a new volume @@ -2069,7 +2098,7 @@ class RapidApp(dbus.service.Object): if mount.is_shadowed(): # ignore this type of mount return - + path = mount.get_root().get_path() if path is not None: @@ -2078,7 +2107,7 @@ class RapidApp(dbus.service.Object): 'device': mount.get_name(), 'path': path}) else: is_backup_mount, backup_file_type = self.check_if_backup_mount(path) - + if is_backup_mount: if path not in self.backup_devices: self.backup_devices[path] = mount @@ -2087,84 +2116,86 @@ class RapidApp(dbus.service.Object): self.update_no_backup_devices() self.display_free_space() - elif self.prefs.device_autodetection and (dv.is_DCIM_device(path) or + elif self.prefs.device_autodetection and (dv.is_DCIM_device(path) or self.search_for_PSD()): - + self.auto_start_is_on = self.prefs.auto_download_upon_device_insertion device = dv.Device(path=path, mount=mount) - if self.search_for_PSD() and path not in self.prefs.device_whitelist: - # prompt user if device should be used or not - self.get_use_device(device) - else: - scan_pid = self.start_device_scan(device) - self.mounts_by_path[path] = scan_pid - + + if not self._device_already_detected(device): + if self.search_for_PSD() and path not in self.prefs.device_whitelist: + # prompt user if device should be used or not + self.get_use_device(device) + else: + scan_pid = self.start_device_scan(device) + self.mounts_by_path[path] = scan_pid + def on_mount_removed(self, vmonitor, mount): """ callback run when gio indicates a new volume has been mounted """ - + path = mount.get_root().get_path() # three scenarios - # the mount has been scanned but downloading has not yet started # files are being downloaded from mount (it must be a messy unmount) # files have finished downloading from mount - + if path in self.mounts_by_path: scan_pid = self.mounts_by_path[path] del self.mounts_by_path[path] # temp directory should be cleaned by finishing of process - - self.thumbnails.clear_all(scan_pid = scan_pid, + + self.thumbnails.clear_all(scan_pid = scan_pid, keep_downloaded_files = True) self.device_collection.remove_device(scan_pid) - - - + + + # remove backup volumes 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() - + def clear_non_running_downloads(self): """ Clears the display of downloads that are currently not running """ - + # Stop any processes currently scanning or creating thumbnails self._terminate_processes(terminate_file_copies=False) - + # Remove them from the user interface for scan_pid in self.device_collection.get_all_displayed_processes(): if scan_pid not in self.download_active_by_scan_pid: self.device_collection.remove_device(scan_pid) self.thumbnails.clear_all(scan_pid=scan_pid) - - - + + + # # # # Download and help buttons, and menu items # # # - + def on_download_action_activate(self, action): """ Called when a download is activated """ - + if self.copy_files_manager.paused: logger.debug("Download resumed") self.resume_download() else: logger.debug("Download activated") - + if self.download_action_is_download: if self.need_job_code_for_naming and not self.prompting_for_job_code: self.get_job_code() @@ -2173,18 +2204,18 @@ class RapidApp(dbus.service.Object): else: self.pause_download() - + def on_help_action_activate(self, action): webbrowser.open("http://www.damonlynch.net/rapid/documentation") - + def on_preferences_action_activate(self, action): preferencesdialog.PreferencesDialog(self) - + def set_download_action_sensitivity(self): """ Sets sensitivity of Download action to enable or disable it - + Affects download button and menu item """ if not self.download_is_occurring(): @@ -2192,26 +2223,26 @@ class RapidApp(dbus.service.Object): if self.scan_manager.no_tasks == 0: if self.thumbnails.files_are_checked_to_download(): sensitivity = True - + self.download_action.set_sensitive(sensitivity) - + def set_download_action_label(self, is_download): """ - Toggles label betwen pause and download + Toggles label betwen pause and download """ - + if is_download: self.download_action.set_label(_("Download")) self.download_action_is_download = True else: self.download_action.set_label(_("Pause")) self.download_action_is_download = False - + # # # # Job codes # # # - - + + def _init_job_code(self): self.job_code = self.last_chosen_job_code = '' self.need_job_code_for_naming = self.prefs.any_pref_uses_job_code() @@ -2219,64 +2250,64 @@ class RapidApp(dbus.service.Object): def assign_job_code(self, code): """ assign job code (which may be empty) to member variable and update user preferences - + Update preferences only if code is not empty. Do not duplicate job code. """ self.job_code = code - + if code: #add this value to job codes preferences #delete any existing value which is the same #(this way it comes to the front, which is where it should be) #never modify self.prefs.job_codes in place! (or prefs become screwed up) - + jcs = self.prefs.job_codes while code in jcs: jcs.remove(code) - + self.prefs.job_codes = [code] + jcs def _get_job_code(self, post_job_code_entry_callback): """ prompt for a job code """ - + if not self.prompting_for_job_code: logger.debug("Prompting for Job Code") self.prompting_for_job_code = True j = preferencesdialog.JobCodeDialog(parent_window = self.rapidapp, job_codes = self.prefs.job_codes, - default_job_code = self.last_chosen_job_code, + default_job_code = self.last_chosen_job_code, post_job_code_entry_callback=post_job_code_entry_callback, entry_only = False) else: logger.debug("Already prompting for Job Code, do not prompt again") - + def get_job_code(self): self._get_job_code(self.got_job_code) - + def got_job_code(self, dialog, user_chose_code, code): dialog.destroy() self.prompting_for_job_code = False - + if user_chose_code: if code is None: code = '' self.assign_job_code(code) self.last_chosen_job_code = code logger.debug("Job Code %s entered", self.job_code) - self.start_download() - + self.start_download() + else: # user cancelled logger.debug("No Job Code entered") self.job_code = '' self.auto_start_is_on = False - - + + # # # # Download # # # - + def _init_download_tracking(self): """ Initialize variables to track downloads @@ -2285,28 +2316,28 @@ class RapidApp(dbus.service.Object): # (Scan id acts as an index to each device. A device could be scanned # more than once). self.download_tracker = downloadtracker.DownloadTracker() - + # Track which temporary directories are created when downloading files self.temp_dirs_by_scan_pid = dict() - + # Track which downloads are running self.download_active_by_scan_pid = [] - + def modify_files_during_download(self): """ Returns True if there is a need to modify files during download""" return self.prefs.auto_rotate_jpeg or (self.focal_length is not None) - + def start_download(self, scan_pid=None): """ Start download, renaming and backup of files. - + If scan_pid is specified, only files matching it will be downloaded """ - + files_by_scan_pid = self.thumbnails.get_files_checked_for_download(scan_pid) folders_valid, invalid_dirs = self.check_download_folder_validity(files_by_scan_pid) - + if not folders_valid: if len(invalid_dirs) > 1: msg = _("These download folders are invalid:\n%(folder1)s\n%(folder2)s") % { @@ -2319,40 +2350,40 @@ class RapidApp(dbus.service.Object): # set time download is starting if it is not already set # it is unset when all downloads are completed if self.download_start_time is None: - self.download_start_time = datetime.datetime.now() + self.download_start_time = datetime.datetime.now() - # Set status to download pending + # 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) - + def pause_download(self): - + self.copy_files_manager.pause() - + # set action to display Download if not self.download_action_is_download: self.set_download_action_label(is_download = True) - + self.time_check.pause() - + def resume_download(self): for scan_pid in self.download_active_by_scan_pid: self.time_remaining.set_time_mark(scan_pid) - + self.time_check.set_download_mark() - + self.copy_files_manager.start() def download_files(self, files, scan_pid): @@ -2360,16 +2391,16 @@ class RapidApp(dbus.service.Object): Initiate downloading and renaming of files """ # Check which file types will be downloaded for this particular process - no_photos_to_download = self.files_of_type_present(files, - rpdfile.FILE_TYPE_PHOTO, + no_photos_to_download = self.files_of_type_present(files, + rpdfile.FILE_TYPE_PHOTO, return_file_count=True) if no_photos_to_download: photo_download_folder = self.prefs.download_folder else: photo_download_folder = None - + if DOWNLOAD_VIDEO: - no_videos_to_download = self.files_of_type_present(files, + no_videos_to_download = self.files_of_type_present(files, rpdfile.FILE_TYPE_VIDEO, return_file_count=True) if no_videos_to_download: @@ -2379,30 +2410,30 @@ class RapidApp(dbus.service.Object): else: video_download_folder = None no_videos_to_download = 0 - + photo_download_size, video_download_size = self.size_files_to_be_downloaded(files) - self.download_tracker.init_stats(scan_pid=scan_pid, - photo_size_in_bytes=photo_download_size, + self.download_tracker.init_stats(scan_pid=scan_pid, + photo_size_in_bytes=photo_download_size, video_size_in_bytes=video_download_size, no_photos_to_download=no_photos_to_download, no_videos_to_download=no_videos_to_download) - - + + download_size = photo_download_size + video_download_size - + if self.prefs.backup_images: download_size = download_size + ((self.no_photo_backup_devices * photo_download_size) + (self.no_video_backup_devices * video_download_size)) - + self.time_remaining.set(scan_pid, download_size) self.time_check.set_download_mark() - + self.download_active_by_scan_pid.append(scan_pid) - - + + 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 @@ -2414,13 +2445,13 @@ class RapidApp(dbus.service.Object): else: modify_pipe = None - + # Initiate copy files process - self.copy_files_manager.add_task((photo_download_folder, + self.copy_files_manager.add_task((photo_download_folder, video_download_folder, scan_pid, files, modify_files_during_download, modify_pipe)) - + def copy_files_results(self, source, condition): """ Handle results from copy files process @@ -2434,7 +2465,7 @@ class RapidApp(dbus.service.Object): if msg_type == rpdmp.MSG_TEMP_DIRS: scan_pid, photo_temp_dir, video_temp_dir = data self.temp_dirs_by_scan_pid[scan_pid] = (photo_temp_dir, video_temp_dir) - + # Report which temporary directories are being used for this # download if photo_temp_dir and video_temp_dir: @@ -2445,10 +2476,10 @@ class RapidApp(dbus.service.Object): photo_temp_dir) else: logger.debug("Using temp dir %s (videos)", - video_temp_dir) + video_temp_dir) elif msg_type == rpdmp.MSG_BYTES: scan_pid, total_downloaded, chunk_downloaded = data - self.download_tracker.set_total_bytes_copied(scan_pid, + self.download_tracker.set_total_bytes_copied(scan_pid, total_downloaded) self.time_check.increment(bytes_downloaded=chunk_downloaded) percent_complete = self.download_tracker.get_percent_complete(scan_pid) @@ -2457,39 +2488,39 @@ class RapidApp(dbus.service.Object): self.time_remaining.update(scan_pid, bytes_downloaded=chunk_downloaded) elif msg_type == rpdmp.MSG_FILE: self.copy_file_results_single_file(data) - + return True else: # Process is complete, i.e. conn_type == rpdmp.CONN_COMPLETE connection.close() return False - + def copy_file_results_single_file(self, data): """ Handles results from one of two processes: 1. copy_files 2. file_modify - + Operates after a single file has been copied from the download device to the local folder. - + Calls the process to rename files and create subfolders (subfolderfile) """ - + 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, + 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) self.download_tracker.set_download_count( rpd_file.scan_pid, download_count) rpd_file.download_start_time = self.download_start_time - + if download_succeeded: # Insert preference values needed for name generation rpd_file = prefsrapid.insert_pref_lists(self.prefs, rpd_file) @@ -2498,21 +2529,21 @@ class RapidApp(dbus.service.Object): rpd_file.download_conflict_resolution = self.prefs.download_conflict_resolution rpd_file.synchronize_raw_jpg = self.prefs.must_synchronize_raw_jpg() rpd_file.job_code = self.job_code - + self.subfolder_file_manager.rename_file_and_move_to_subfolder( - download_succeeded, - download_count, + download_succeeded, + download_count, rpd_file - ) + ) def file_modify_results(self, source, condition): """ - 'file modify' is a process that runs immediately after 'copy files', - meaning there can be more than one at one time. - + 'file modify' is a process that runs immediately after 'copy files', + meaning there can be more than one at one time. + It runs before the renaming process. """ connection = self.file_modify_manager.get_pipe(source) - + conn_type, data = connection.recv() if conn_type == rpdmp.CONN_PARTIAL: self.copy_file_results_single_file(data) @@ -2520,31 +2551,31 @@ class RapidApp(dbus.service.Object): else: # Process is complete, i.e. conn_type == rpdmp.CONN_COMPLETE connection.close() - return False + return False + - def download_is_occurring(self): - """Returns True if a file is currently being downloaded, renamed or + """Returns True if a file is currently being downloaded, renamed or backed up """ return not len(self.download_active_by_scan_pid) == 0 - + # # # # Create folder and file names for downloaded files # # # - - def subfolder_file_results(self, move_succeeded, rpd_file): + + def subfolder_file_results(self, move_succeeded, rpd_file, download_count): """ Handle results of subfolder creation and file renaming """ - + scan_pid = rpd_file.scan_pid unique_id = rpd_file.unique_id - + if rpd_file.status == config.STATUS_DOWNLOADED_WITH_WARNING: - self.log_error(config.WARNING, rpd_file.error_title, + self.log_error(config.WARNING, rpd_file.error_title, rpd_file.error_msg, rpd_file.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: @@ -2553,23 +2584,24 @@ class RapidApp(dbus.service.Object): path_suffix = self.prefs.video_backup_identifier else: path_suffix = None - - self.backup_manager.backup_file(move_succeeded, rpd_file, + + self.backup_manager.backup_file(move_succeeded, rpd_file, path_suffix, - self.prefs.backup_duplicate_overwrite) + self.prefs.backup_duplicate_overwrite, + download_count) else: self.file_download_finished(move_succeeded, rpd_file) - - + + def multiple_backup_devices(self, file_type): """Returns true if more than one backup device is being used for that file type """ - return ((file_type == rpdfile.FILE_TYPE_PHOTO and + return ((file_type == rpdfile.FILE_TYPE_PHOTO and self.no_photo_backup_devices > 1) or - (file_type == rpdfile.FILE_TYPE_VIDEO and + (file_type == rpdfile.FILE_TYPE_VIDEO and self.no_video_backup_devices > 1)) - + def backup_results(self, source, condition): """ Handle results sent from backup processes @@ -2578,30 +2610,30 @@ class RapidApp(dbus.service.Object): 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, + 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 - + # Only show an error message if there is more than one device # backing up files of this type - if that is the case, - # do not want to reply on showing an error message in the + # do not want to reply on showing an error message in the # function file_download_finished, as it is only called once, # when all files have been backed up if not backup_succeeded and self.multiple_backup_devices(rpd_file.file_type): - self.log_error(config.SERIOUS_ERROR, - rpd_file.error_title, + self.log_error(config.SERIOUS_ERROR, + rpd_file.error_title, rpd_file.error_msg, rpd_file.error_extra_detail) - + self.download_tracker.file_backed_up(rpd_file.unique_id) if self.download_tracker.all_files_backed_up(rpd_file.unique_id, rpd_file.file_type): @@ -2610,7 +2642,7 @@ class RapidApp(dbus.service.Object): else: return False - + def file_download_finished(self, succeeded, rpd_file): """ Called when a file has been downloaded i.e. copied, renamed, and backed up @@ -2619,23 +2651,23 @@ class RapidApp(dbus.service.Object): unique_id = rpd_file.unique_id # Update error log window if neccessary if not succeeded and not self.multiple_backup_devices(rpd_file.file_type): - self.log_error(config.SERIOUS_ERROR, rpd_file.error_title, + self.log_error(config.SERIOUS_ERROR, rpd_file.error_title, rpd_file.error_msg, rpd_file.error_extra_detail) elif self.prefs.auto_delete: - # record which files to automatically delete when download + # record which files to automatically delete when download # completes self.download_tracker.add_to_auto_delete(rpd_file) - + self.thumbnails.update_status_post_download(rpd_file) - self.download_tracker.file_downloaded_increment(scan_pid, + self.download_tracker.file_downloaded_increment(scan_pid, rpd_file.file_type, rpd_file.status) - + completed, files_remaining = self._update_file_download_device_progress(scan_pid, unique_id, rpd_file.file_type) - + if self.download_is_occurring(): self.update_time_remaining() - + if completed: # Last file for this scan pid has been downloaded, so clean temp directory logger.debug("Purging temp directories") @@ -2649,63 +2681,63 @@ class RapidApp(dbus.service.Object): self.notify_downloaded_from_device(scan_pid) if files_remaining == 0 and self.prefs.auto_unmount: self.device_collection.unmount(scan_pid) - - + + 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) - + self.prefs.stored_sequence_no = self.stored_sequence_value.value self.downloads_today_tracker.set_raw_downloads_today_from_int(self.downloads_today_value.value) self.downloads_today_tracker.set_raw_downloads_today_date(self.downloads_today_date_value.value) self.prefs.set_downloads_today_from_tracker(self.downloads_today_tracker) - if ((self.prefs.auto_exit and self.download_tracker.no_errors_or_warnings()) + 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() self.speed_label.set_label(" ") - + self.display_free_space() - + self.set_download_action_label(is_download=True) self.set_download_action_sensitivity() - + self.job_code = '' self.download_start_time = None - - + + def update_time_remaining(self): update, download_speed = self.time_check.check_for_update() if update: self.speed_label.set_text(download_speed) - + time_remaining = self.time_remaining.time_remaining() if time_remaining: secs = int(time_remaining) - + if secs == 0: message = "" elif secs == 1: message = _("About 1 second remaining") elif secs < 60: - message = _("About %i seconds remaining") % secs + message = _("About %i seconds remaining") % secs elif secs == 60: message = _("About 1 minute remaining") else: - # Translators: in the text '%(minutes)i:%(seconds)02i', only the : should be translated, if needed. + # 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' message = _("About %(minutes)i:%(seconds)02i minutes remaining") % {'minutes': secs / 60, 'seconds': secs % 60} - + self.rapid_statusbar.pop(self.statusbar_context_id) - self.rapid_statusbar.push(self.statusbar_context_id, message) - + self.rapid_statusbar.push(self.statusbar_context_id, message) + def auto_delete(self, scan_pid): """Delete files from download device at completion of download""" for file in self.download_tracker.get_files_to_auto_delete(scan_pid): @@ -2714,10 +2746,10 @@ class RapidApp(dbus.service.Object): f.delete(cancellable=None) except gio.Error, inst: logger.error("Failure deleting file %s", file) - logger.error(inst) - + logger.error(inst) + def file_types_by_number(self, no_photos, no_videos): - """ + """ returns a string to be displayed to the user that can be used to show if a value refers to photos or videos or both, or just one of each @@ -2740,14 +2772,14 @@ class RapidApp(dbus.service.Object): def notify_downloaded_from_device(self, scan_pid): device = self.device_collection.get_device(scan_pid) - + if device.mount is None: notification_name = PROGRAM_NAME icon = self.application_icon else: 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) no_videos_downloaded = self.download_tracker.get_no_files_downloaded( @@ -2759,36 +2791,37 @@ class RapidApp(dbus.service.Object): no_files_downloaded = no_photos_downloaded + no_videos_downloaded no_files_failed = no_photos_failed + no_videos_failed no_warnings = self.download_tracker.get_no_warnings(scan_pid) - + file_types = self.file_types_by_number(no_photos_downloaded, no_videos_downloaded) file_types_failed = self.file_types_by_number(no_photos_failed, no_videos_failed) message = _("%(noFiles)s %(filetypes)s downloaded") % \ {'noFiles':no_files_downloaded, 'filetypes': file_types} - + if no_files_failed: message += "\n" + _("%(noFiles)s %(filetypes)s failed to download") % {'noFiles':no_files_failed, 'filetypes':file_types_failed} - + if no_warnings: - message = "%s\n%s " % (message, no_warnings) + _("warnings") - - n = pynotify.Notification(notification_name, message) - n.set_icon_from_pixbuf(icon) - - n.show() - + message = "%s\n%s " % (message, no_warnings) + _("warnings") + + if use_pynotify: + n = pynotify.Notification(notification_name, message) + n.set_icon_from_pixbuf(icon) + + n.show() + def notify_download_complete(self): if self.display_summary_notification: message = _("All downloads complete") - + # photo downloads photo_downloads = self.download_tracker.total_photos_downloaded if photo_downloads: filetype = self.file_types_by_number(photo_downloads, 0) message += "\n" + _("%(number)s %(numberdownloaded)s") % \ - {'number': photo_downloads, + {'number': photo_downloads, 'numberdownloaded': _("%(filetype)s downloaded") % \ {'filetype': filetype}} - + # photo failures photo_failures = self.download_tracker.total_photo_failures if photo_failures: @@ -2797,16 +2830,16 @@ class RapidApp(dbus.service.Object): {'number': photo_failures, 'numberdownloaded': _("%(filetype)s failed to download") % \ {'filetype': filetype}} - + # video downloads video_downloads = self.download_tracker.total_videos_downloaded if video_downloads: filetype = self.file_types_by_number(0, video_downloads) message += "\n" + _("%(number)s %(numberdownloaded)s") % \ - {'number': video_downloads, + {'number': video_downloads, 'numberdownloaded': _("%(filetype)s downloaded") % \ {'filetype': filetype}} - + # video failures video_failures = self.download_tracker.total_video_failures if video_failures: @@ -2815,65 +2848,66 @@ class RapidApp(dbus.service.Object): {'number': video_failures, 'numberdownloaded': _("%(filetype)s failed to download") % \ {'filetype': filetype}} - + # warnings - warnings = self.download_tracker.total_warnings + warnings = self.download_tracker.total_warnings if warnings: message += "\n" + _("%(number)s %(numberdownloaded)s") % \ - {'number': warnings, + {'number': warnings, 'numberdownloaded': _("warnings")} - - n = pynotify.Notification(PROGRAM_NAME, message) - n.set_icon_from_pixbuf(self.application_icon) - n.show() + + if use_pynotify: + n = pynotify.Notification(PROGRAM_NAME, message) + n.set_icon_from_pixbuf(self.application_icon) + n.show() self.display_summary_notification = False # don't show it again unless needed - - + + def _update_file_download_device_progress(self, scan_pid, unique_id, file_type): """ Increments the progress bar for an individual device - + Returns if the download is completed for that scan_pid It also returns the number of files remaining for the scan_pid, BUT this value is valid ONLY if the download is completed """ - + files_downloaded = self.download_tracker.get_download_count_for_file(unique_id) 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 and len(self.backup_devices)): completed = self.download_tracker.all_files_backed_up(unique_id, file_type) - + if completed: files_remaining = self.thumbnails.get_no_files_remaining(scan_pid) else: files_remaining = 0 - + if completed and files_remaining: # e.g.: 3 of 205 photos and videos (202 remaining) progress_bar_text = _("%(number)s of %(total)s %(filetypes)s (%(remaining)s remaining)") % { - 'number': files_downloaded, + 'number': files_downloaded, 'total': files_to_download, 'filetypes': file_types, 'remaining': files_remaining} else: # e.g.: 205 of 205 photos and videos progress_bar_text = _("%(number)s of %(total)s %(filetypes)s") % \ - {'number': files_downloaded, + {'number': files_downloaded, 'total': files_to_download, 'filetypes': file_types} percent_complete = self.download_tracker.get_percent_complete(scan_pid) self.device_collection.update_progress(scan_pid=scan_pid, percent_complete=percent_complete, - progress_bar_text=progress_bar_text, + progress_bar_text=progress_bar_text, bytes_downloaded=None) - + percent_complete = self.download_tracker.get_overall_percent_complete() self.download_progressbar.set_fraction(percent_complete) - + return (completed, files_remaining) - + def _clean_all_temp_dirs(self): """ @@ -2882,10 +2916,10 @@ class RapidApp(dbus.service.Object): for scan_pid in self.temp_dirs_by_scan_pid: for temp_dir in self.temp_dirs_by_scan_pid[scan_pid]: self._purge_dir(temp_dir) - + self.temp_dirs_by_scan_pid = {} - - + + def _clean_temp_dirs_for_scan_pid(self, scan_pid): """ Deletes temp files and folders used in download @@ -2897,10 +2931,10 @@ class RapidApp(dbus.service.Object): def _purge_dir(self, directory): """ Deletes all files in the directory, and the directory itself. - + Does not recursively traverse any subfolders in the directory. """ - + if directory: try: path = gio.File(directory) @@ -2916,16 +2950,16 @@ class RapidApp(dbus.service.Object): except gio.Error, inst: logger.error("Failure deleting temporary folder %s", directory) logger.error(inst) - - - # # # + + + # # # # Preferences # # # - - - def _init_prefs(self, auto_detect, device_location): + + + def _init_prefs(self, auto_detect, device_location): self.prefs = prefsrapid.RapidPreferences() - + # handle device preferences set from the command line # do this before preference changes are handled with notify_add if auto_detect: @@ -2933,82 +2967,82 @@ class RapidApp(dbus.service.Object): elif device_location: self.prefs.device_location = device_location self.prefs.device_autodetection = False - + self.prefs.notify_add(self.on_preference_changed) - - # flag to indicate whether the user changed some preferences that + + # flag to indicate whether the user changed some preferences that # indicate the image and backup devices should be setup again self.rerun_setup_available_image_and_video_media = False self.rerun_setup_available_backup_media = False - - # flag to indicate that the preferences dialog window is being + + # flag to indicate that the preferences dialog window is being # displayed to the user self.preferences_dialog_displayed = False # flag to indicate that the user has modified the download today # related values in the preferences dialog window self.refresh_downloads_today = False - - # these values are used to track the number of backup devices / + + # these values are used to track the number of backup devices / # locations for each file type self.no_photo_backup_devices = 0 self.no_video_backup_devices = 0 - + self.downloads_today_tracker = self.prefs.get_downloads_today_tracker() - + downloads_today = self.downloads_today_tracker.get_and_maybe_reset_downloads_today() if downloads_today > 0: logger.info("Downloads that have occurred so far today: %s", downloads_today) else: - logger.info("No downloads have occurred so far today") + logger.info("No downloads have occurred so far today") - self.downloads_today_value = Value(c_int, + self.downloads_today_value = Value(c_int, self.downloads_today_tracker.get_raw_downloads_today()) self.downloads_today_date_value = Array(c_char, self.downloads_today_tracker.get_raw_downloads_today_date()) - self.day_start_value = Array(c_char, + self.day_start_value = Array(c_char, self.downloads_today_tracker.get_raw_day_start()) self.refresh_downloads_today_value = Value(c_bool, False) self.stored_sequence_value = Value(c_int, self.prefs.stored_sequence_no) self.uses_stored_sequence_no_value = Value(c_bool, self.prefs.any_pref_uses_stored_sequence_no()) self.uses_session_sequece_no_value = Value(c_bool, self.prefs.any_pref_uses_session_sequece_no()) self.uses_sequence_letter_value = Value(c_bool, self.prefs.any_pref_uses_sequence_letter_value()) - + self.check_prefs_upgrade(__version__) self.prefs.program_version = __version__ - + def _check_for_sequence_value_use(self): self.uses_stored_sequence_no_value.value = self.prefs.any_pref_uses_stored_sequence_no() self.uses_session_sequece_no_value.value = self.prefs.any_pref_uses_session_sequece_no() - self.uses_sequence_letter_value.value = self.prefs.any_pref_uses_sequence_letter_value() - + self.uses_sequence_letter_value.value = self.prefs.any_pref_uses_sequence_letter_value() + def check_prefs_upgrade(self, running_version): """ - Checks if the running version of the program is different from the + Checks if the running version of the program is different from the version recorded in the preferences. - + If the version is different, the preferences are checked to see whether they should be upgraded or not. """ previous_version = self.prefs.program_version if len(previous_version) > 0: # the program has been run previously for this user - + pv = utilities.pythonify_version(previous_version) rv = utilities.pythonify_version(running_version) - + if pv <> rv: # 0.4.1 and below had only one manual backup location # 0.4.2 introduced a distinct video back up location that can be manually set - # Therefore must duplicate the previous photo & video manual backup location into the + # Therefore must duplicate the previous photo & video manual backup location into the # new video field, unless it has already been changed already. - + if pv < utilities.pythonify_version('0.4.2'): if self.prefs.backup_video_location == os.path.expanduser('~'): self.prefs.backup_video_location = self.prefs.backup_location - logger.info("Migrated manual backup location preference to videos: %s", + logger.info("Migrated manual backup location preference to videos: %s", self.prefs.backup_video_location) - + def on_preference_changed(self, key, value): """ Called when user changes the program's preferences @@ -3017,90 +3051,89 @@ class RapidApp(dbus.service.Object): if key == 'show_log_dialog': self.menu_log_window.set_active(value) - elif key in ['device_autodetection', 'device_autodetection_psd', + elif key in ['device_autodetection', 'device_autodetection_psd', 'device_location', 'ignored_paths', 'use_re_ignored_paths', 'device_blacklist']: self.rerun_setup_available_image_and_video_media = True self._set_from_toolbar_state() if not self.preferences_dialog_displayed: self.post_preference_change() - - - elif key in ['backup_images', 'backup_device_autodetection', - 'backup_location', 'backup_video_location', + + + elif key in ['backup_images', 'backup_device_autodetection', + 'backup_location', 'backup_video_location', 'backup_identifier', 'video_backup_identifier']: self.rerun_setup_available_backup_media = True if not self.preferences_dialog_displayed: self.post_preference_change() - + # Downloads today and stored sequence numbers are kept in shared memory, # so that the subfolderfile daemon process can access and modify them - + # Note, totally ignore any changes in downloads today, as it # is modified in a special manner via a tracking class - + elif key == 'stored_sequence_no': if type(value) <> types.IntType: logger.critical("Stored sequence number value is malformed") else: self.stored_sequence_value.value = value - + elif key in ['image_rename', 'subfolder', 'video_rename', 'video_subfolder']: self.need_job_code_for_naming = self.prefs.any_pref_uses_job_code() # Check if stored sequence no is being used self._check_for_sequence_value_use() - + elif key in ['download_folder', 'video_download_folder']: self._set_to_toolbar_values() self.display_free_space() - + def post_preference_change(self): if self.rerun_setup_available_image_and_video_media: logger.info("Download device settings preferences were changed") - + self.thumbnails.clear_all() self.setup_devices(on_startup = False, on_preference_change = True, block_auto_start = True) self._set_device_collection_size() - + if self.main_notebook.get_current_page() == 1: # preview of file self.main_notebook.set_current_page(0) - + self.rerun_setup_available_image_and_video_media = False - + if self.rerun_setup_available_backup_media: if self.using_volume_monitor(): - self.start_volume_monitor() + self.start_volume_monitor() logger.info("Backup preferences were changed.") - + self.refresh_backup_media() - + self.rerun_setup_available_backup_media = False - + if self.refresh_downloads_today: self.downloads_today_value.value = self.downloads_today_tracker.get_raw_downloads_today() self.downloads_today_date_value.value = self.downloads_today_tracker.get_raw_downloads_today_date() self.day_start_value.value = self.downloads_today_tracker.get_raw_day_start() self.refresh_downloads_today_value.value = True self.prefs.set_downloads_today_from_tracker(self.downloads_today_tracker) - - + + # # # # Main app window management and setup # # # - + def _init_pynotify(self): """ Initialize system notification messages """ - + if not pynotify.init("TestCaps"): logger.warning("There might be problems using pynotify.") - #~ sys.exit(1) do_not_size_icon = False - self.notification_icon_size = 48 + self.notification_icon_size = 48 try: info = pynotify.get_server_info() except: @@ -3111,7 +3144,7 @@ class RapidApp(dbus.service.Object): do_not_size_icon = True except: pass - + if do_not_size_icon: self.application_icon = gtk.gdk.pixbuf_new_from_file( paths.share_dir('glade3/rapid-photo-downloader.svg')) @@ -3137,7 +3170,7 @@ class RapidApp(dbus.service.Object): self.main_notebook = builder.get_object("main_notebook") self.download_action = builder.get_object("download_action") self.download_button = builder.get_object("download_button") - + self.download_progressbar = builder.get_object("download_progressbar") self.rapid_statusbar = builder.get_object("rapid_statusbar") self.statusbar_context_id = self.rapid_statusbar.get_context_id("progress") @@ -3148,71 +3181,71 @@ class RapidApp(dbus.service.Object): 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) self.prev_image_action.set_sensitive(False) - + self._init_toolbars() - + # About dialog builder.add_from_file(paths.share_dir("glade3/about.ui")) self.about = builder.get_object("about") - + builder.connect_signals(self) - + self.preview_image = PreviewImage(self, builder) thumbnails_scrolledwindow = builder.get_object('thumbnails_scrolledwindow') self.thumbnails = ThumbnailDisplay(self) - thumbnails_scrolledwindow.add(self.thumbnails) - + thumbnails_scrolledwindow.add(self.thumbnails) + #collection of devices from which to download self.device_collection_viewport = builder.get_object("device_collection_viewport") self.device_collection = DeviceCollection(self) self.device_collection_viewport.add(self.device_collection) - + #error log window self.error_log = errorlog.ErrorLog(self) - + # monitor to handle mounts and dismounts self.vmonitor = None # track scan ids for mount paths - very useful when a device is unmounted self.mounts_by_path = {} - + # Download action state self.download_action_is_download = True - + # Track the time a download commences self.download_start_time = None - + # Whether a system wide notifcation message should be shown # after a download has occurred in parallel self.display_summary_notification = False - + # Values used to display how much longer a download will take self.time_remaining = downloadtracker.TimeRemaining() self.time_check = downloadtracker.TimeCheck() - + def _init_toolbars(self): """ Setup the 3 vertical toolbars on the main screen """ self._setup_from_toolbar() self._setup_copy_move_toolbar() self._setup_dest_toolbar() - + # size label widths so they are equal, or else the left border of the file chooser will not match self.photo_dest_label.realize() self._make_widget_widths_equal(self.photo_dest_label, self.video_dest_label) self.photo_dest_label.set_alignment(xalign=0.0, yalign=0.5) self.video_dest_label.set_alignment(xalign=0.0, yalign=0.5) - + # size copy / move buttons so they are equal in length, so arrows align self._make_widget_widths_equal(self.copy_button, self.move_button) - + def _setup_from_toolbar(self): self.from_toolbar.set_style(gtk.TOOLBAR_TEXT) self.from_toolbar.set_border_width(5) - + from_label = gtk.Label() from_label.set_markup("<i>" + _("From") + "</i>") self.from_toolbar_label = gtk.ToolItem() @@ -3229,32 +3262,32 @@ class RapidApp(dbus.service.Object): _("Select a folder containing %(file_types)s") % {'file_types':file_types_to_download()}) self.from_filechooser_button.set_action( gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER) - + self.from_filechooser = gtk.ToolItem() self.from_filechooser.set_is_important(True) self.from_filechooser.add(self.from_filechooser_button) self.from_filechooser.set_expand(True) self.from_toolbar.insert(self.from_filechooser, 2) - + self._set_from_toolbar_state() - + #set events after having initialized the values self.auto_detect_button.connect("toggled", self.on_auto_detect_button_toggled_event) - self.from_filechooser_button.connect("selection-changed", + self.from_filechooser_button.connect("selection-changed", self.on_from_filechooser_button_selection_changed) - + self.from_toolbar.show_all() - + def _setup_copy_move_toolbar(self): self.copy_toolbar.set_style(gtk.TOOLBAR_TEXT) self.copy_toolbar.set_border_width(5) - + copy_move_label = gtk.Label(" ") self.copy_move_toolbar_label = gtk.ToolItem() self.copy_move_toolbar_label.add(copy_move_label) self.copy_move_toolbar_label.set_is_important(True) self.copy_toolbar.insert(self.copy_move_toolbar_label, 0) - + self.copy_hbox = gtk.HBox() self.move_hbox = gtk.HBox() self.forward_image = gtk.image_new_from_stock(gtk.STOCK_GO_FORWARD, gtk.ICON_SIZE_SMALL_TOOLBAR) @@ -3265,7 +3298,7 @@ class RapidApp(dbus.service.Object): self.forward_label2 = gtk.Label(" ") self.forward_label3 = gtk.Label(" ") self.forward_label4 = gtk.Label(" ") - + self.copy_button = gtk.RadioToolButton() self.copy_button.set_label(_("Copy")) self.copy_button.set_is_important(True) @@ -3278,7 +3311,7 @@ class RapidApp(dbus.service.Object): copy_box = gtk.ToolItem() copy_box.add(self.copy_hbox) self.copy_toolbar.insert(copy_box, 1) - + self.move_button = gtk.RadioToolButton(self.copy_button) self.move_button.set_label(_("Move")) self.move_button.set_is_important(True) @@ -3290,27 +3323,27 @@ class RapidApp(dbus.service.Object): move_box = gtk.ToolItem() move_box.add(self.move_hbox) self.copy_toolbar.insert(move_box, 2) - + self.move_button.set_active(self.prefs.auto_delete) - self.copy_button.connect("toggled", self.on_copy_button_toggle_event) - + self.copy_button.connect("toggled", self.on_copy_button_toggle_event) + self.copy_toolbar.show_all() - self._set_copy_toolbar_active_arrows() - + self._set_copy_toolbar_active_arrows() + def _setup_dest_toolbar(self): #Destination Toolbar self.dest_toolbar.set_border_width(5) - + dest_label = gtk.Label() dest_label.set_markup("<i>" + _("To") + "</i>") self.dest_toolbar_label = gtk.ToolItem() self.dest_toolbar_label.add(dest_label) self.dest_toolbar_label.set_is_important(True) self.dest_toolbar.insert(self.dest_toolbar_label, 0) - + photo_dest_hbox = gtk.HBox() self.photo_dest_label = gtk.Label(_("Photos:")) - + self.to_photo_filechooser_button = gtk.FileChooserButton( _("Select a folder to download photos to")) self.to_photo_filechooser_button.set_action( @@ -3336,9 +3369,9 @@ class RapidApp(dbus.service.Object): self.to_video_filechooser.set_expand(True) self.to_video_filechooser.add(video_dest_hbox) self.dest_toolbar.insert(self.to_video_filechooser, 2) - + self._set_to_toolbar_values() - self.to_photo_filechooser_button.connect("selection-changed", + self.to_photo_filechooser_button.connect("selection-changed", self.on_to_photo_filechooser_button_selection_changed) self.to_video_filechooser_button.connect("selection-changed", self.on_to_video_filechooser_button_selection_changed) @@ -3346,14 +3379,14 @@ class RapidApp(dbus.service.Object): def _make_widget_widths_equal(self, widget1, widget2): """takes two widgets and sets a width for both equal to widest one""" - + x1, y1, w1, h1 = widget1.get_allocation() x2, y2, w2, h2 = widget2.get_allocation() w = max(w1, w2) h = max(h1, h2) widget1.set_size_request(w,h) widget2.set_size_request(w,h) - + def _set_copy_toolbar_active_arrows(self): if self.copy_button.get_active(): self.forward_image.set_visible(True) @@ -3377,36 +3410,36 @@ class RapidApp(dbus.service.Object): def on_copy_button_toggle_event(self, radio_button): self._set_copy_toolbar_active_arrows() self.prefs.auto_delete = not self.copy_button.get_active() - + def _set_from_toolbar_state(self): logger.debug("_set_from_toolbar_state") self.auto_detect_button.set_active(self.prefs.device_autodetection) if self.prefs.device_autodetection: self.from_filechooser_button.set_sensitive(False) self.from_filechooser_button.set_current_folder(self.prefs.device_location) - + def on_auto_detect_button_toggled_event(self, button): logger.debug("on_auto_detect_button_toggled_event") self.from_filechooser_button.set_sensitive(not button.get_active()) if not self.rerun_setup_available_image_and_video_media: self.prefs.device_autodetection = button.get_active() - + def on_from_filechooser_button_selection_changed(self, filechooserbutton): logger.debug("on_from_filechooser_button_selection_changed") path = filechooserbutton.get_current_folder() if path and not self.rerun_setup_available_image_and_video_media: self.prefs.device_location = path - + def on_to_photo_filechooser_button_selection_changed(self, filechooserbutton): path = filechooserbutton.get_current_folder() if path: self.prefs.download_folder = path - + def on_to_video_filechooser_button_selection_changed(self, filechooserbutton): path = filechooserbutton.get_current_folder() if path: self.prefs.video_download_folder = path - + def _set_to_toolbar_values(self): self.to_photo_filechooser_button.set_current_folder(self.prefs.download_folder) self.to_video_filechooser_button.set_current_folder(self.prefs.video_download_folder) @@ -3419,20 +3452,20 @@ class RapidApp(dbus.service.Object): def _set_window_size(self): """ Remember the window size from the last time the program was run, or - set a default size + set a default size """ - + if self.prefs.main_window_maximized: self.rapidapp.maximize() - self.rapidapp.set_default_size(config.DEFAULT_WINDOW_WIDTH, + self.rapidapp.set_default_size(config.DEFAULT_WINDOW_WIDTH, config.DEFAULT_WINDOW_HEIGHT) elif self.prefs.main_window_size_x > 0: self.rapidapp.set_default_size(self.prefs.main_window_size_x, self.prefs.main_window_size_y) else: # set a default size - self.rapidapp.set_default_size(config.DEFAULT_WINDOW_WIDTH, + self.rapidapp.set_default_size(config.DEFAULT_WINDOW_WIDTH, config.DEFAULT_WINDOW_HEIGHT) - + def _set_device_collection_size(self): """ @@ -3445,36 +3478,36 @@ class RapidApp(dbus.service.Object): else: # don't allow the media collection to be absolutely empty self.device_collection_scrolledwindow.set_size_request(-1, 47) - - + + def on_rapidapp_window_state_event(self, widget, event): """ Records the window maximization state in the preferences.""" - + if event.changed_mask & gdk.WINDOW_STATE_MAXIMIZED: self.prefs.main_window_maximized = event.new_window_state & gdk.WINDOW_STATE_MAXIMIZED - + def _setup_buttons(self): thumbnails_button = self.builder.get_object("thumbnails_button") image = gtk.image_new_from_file(paths.share_dir('glade3/thumbnails_icon.png')) thumbnails_button.set_image(image) - + preview_button = self.builder.get_object("preview_button") image = gtk.image_new_from_file(paths.share_dir('glade3/photo_icon.png')) preview_button.set_image(image) - + next_image_button = self.builder.get_object("next_image_button") image = gtk.image_new_from_stock(gtk.STOCK_GO_FORWARD, gtk.ICON_SIZE_BUTTON) next_image_button.set_image(image) - + prev_image_button = self.builder.get_object("prev_image_button") image = gtk.image_new_from_stock(gtk.STOCK_GO_BACK, gtk.ICON_SIZE_BUTTON) prev_image_button.set_image(image) - + def _setup_icons(self): icons = ['rapid-photo-downloader-jobcode',] - icon_list = [(icon, paths.share_dir('glade3/%s.svg' % icon)) for icon in icons] + icon_list = [(icon, paths.share_dir('glade3/%s.svg' % icon)) for icon in icons] register_iconsets(icon_list) - + def _setup_error_icons(self): """ hide display of warning and error symbols in the taskbar until they @@ -3486,7 +3519,7 @@ class RapidApp(dbus.service.Object): self.error_image.hide() 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 @@ -3495,20 +3528,20 @@ class RapidApp(dbus.service.Object): """ 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 + 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) @@ -3521,22 +3554,22 @@ class RapidApp(dbus.service.Object): prefix = " " + _("and") + " " i += 1 message = "%s%s'%s'" % (message, prefix, self.backup_devices[b][0].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 + Displays the amount of space free on the filesystem the files will be downloaded to. - - Also displays backup volumes / path being used. + + 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) @@ -3545,17 +3578,17 @@ class RapidApp(dbus.service.Object): self.prefs.video_download_folder) else: same_file_system = False - + dirs = [] if photo_dir: dirs.append((self.prefs.download_folder, _("photos"))) if video_dir and not same_file_system: dirs.append((self.prefs.video_download_folder, _("videos"))) - + msg = '' if len(dirs) > 1: msg = ' ' + _('Free space:') + ' ' - + for i in range(len(dirs)): dir_info = dirs[i] folder = gio.File(dir_info[0]) @@ -3563,13 +3596,13 @@ class RapidApp(dbus.service.Object): size = file_info.get_attribute_uint64(gio.FILE_ATTRIBUTE_FILESYSTEM_FREE) free = format_size_for_user(bytes=size) if len(dirs) > 1: - #(videos) or (photos) will be appended to the free space message displayed to the + #(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 + #you should only translate this if your language does not use parantheses file_type = _("(%(file_type)s)") % {'file_type': dir_info[1]} #Freespace available on the filesystem for downloading to - #Displayed in status bar message on main window + #Displayed in status bar message on main window msg += _("%(free)s %(file_type)s") % {'free': free, 'file_type': file_type} if i == 0: #Inserted in the middle of the statusbar message concerning the amount of freespace @@ -3579,17 +3612,17 @@ class RapidApp(dbus.service.Object): elif not self.prefs.backup_images: #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). + #e.g. Free space: 21.3GB (photos); 14.7GB (videos). msg += _(".") - + else: #Freespace available on the filesystem for downloading to #Displayed in status bar message on main window #e.g. 14.7GB available msg = " " + _("%(free)s free") % {'free': free} - - - if self.prefs.backup_images: + + + if self.prefs.backup_images: if not self.prefs.backup_device_autodetection: if self.prefs.backup_location == self.prefs.backup_video_location: if DOWNLOAD_VIDEO: @@ -3604,29 +3637,29 @@ class RapidApp(dbus.service.Object): 'path':self.prefs.backup_location, 'path2': self.prefs.backup_video_location} else: - msg2 = self.display_backup_mounts() - + msg2 = self.display_backup_mounts() + if msg: msg = _("%(freespace)s. %(backuppaths)s.") % {'freespace': msg, 'backuppaths': msg2} else: msg = msg2 - + msg = msg.rstrip() - + self.statusbar_message(msg) - + def log_error(self, severity, problem, details, extra_detail=None): """ Display error and warning messages to user in log window """ self.error_log.add_message(severity, problem, details, extra_detail) - - + + def on_error_eventbox_button_press_event(self, widget, event): self.prefs.show_log_dialog = True - self.error_log.widget.show() - - + self.error_log.widget.show() + + def on_menu_log_window_toggled(self, widget): active = widget.get_active() self.prefs.show_log_dialog = active @@ -3634,14 +3667,14 @@ class RapidApp(dbus.service.Object): self.error_log.widget.show() else: self.error_log.widget.hide() - + def notify_prefs_are_invalid(self, details): title = _("Program preferences are invalid") logger.critical(title) self.log_error(severity=config.CRITICAL_ERROR, problem=title, details=details) - - + + # # # # Utility functions # # # @@ -3650,7 +3683,7 @@ class RapidApp(dbus.service.Object): """ Returns true if there is at least one instance of the file_type in the list of files to be copied - + If return_file_count is True, then the number of files of that type will be counted and returned instead of True or False """ @@ -3665,7 +3698,7 @@ class RapidApp(dbus.service.Object): return False else: return i - + def size_files_to_be_downloaded(self, files): """ Returns the total sizes of the photos and videos to be downloaded in bytes @@ -3679,12 +3712,12 @@ class RapidApp(dbus.service.Object): video_size += rpd_file.size return (photo_size, video_size) - + def check_download_folder_validity(self, files_by_scan_pid): """ Checks validity of download folders based on the file types the user is attempting to download. - + If valid, returns a tuple of True and an empty list. If invalid, returns a tuple of False and a list of the invalid directores. """ @@ -3702,27 +3735,27 @@ class RapidApp(dbus.service.Object): if not need_video_folder: if self.files_of_type_present(files, rpdfile.FILE_TYPE_VIDEO): need_video_folder = True - + # second, check validity if need_photo_folder: - if not self.is_valid_download_dir(self.prefs.download_folder, + if not self.is_valid_download_dir(self.prefs.download_folder, is_photo_dir=True): valid = False invalid_dirs.append(self.prefs.download_folder) else: - logger.debug("Photo download folder is valid: %s", + logger.debug("Photo download folder is valid: %s", self.prefs.download_folder) - + if need_video_folder: if not self.is_valid_download_dir(self.prefs.video_download_folder, - is_photo_dir=False): + is_photo_dir=False): valid = False invalid_dirs.append(self.prefs.video_download_folder) else: - logger.debug("Video download folder is valid: %s", + logger.debug("Video download folder is valid: %s", self.prefs.video_download_folder) - + return (valid, invalid_dirs) def same_file_system(self, file1, file2): @@ -3735,27 +3768,27 @@ class RapidApp(dbus.service.Object): f2_info = f2.query_info(gio.FILE_ATTRIBUTE_ID_FILESYSTEM) f2_id = f2_info.get_attribute_string(gio.FILE_ATTRIBUTE_ID_FILESYSTEM) return f1_id == f2_id - - + + def same_file(self, file1, file2): """Returns True if the files / directories are the same """ f1 = gio.File(file1) f2 = gio.File(file2) - + file_attributes = "id::file" f1_info = f1.query_filesystem_info(file_attributes) f1_id = f1_info.get_attribute_string(gio.FILE_ATTRIBUTE_ID_FILE) f2_info = f2.query_filesystem_info(file_attributes) f2_id = f2_info.get_attribute_string(gio.FILE_ATTRIBUTE_ID_FILE) return f1_id == f2_id - + def is_valid_download_dir(self, path, is_photo_dir, show_error_in_log=False): """ Checks the following conditions: Does the directory exist? Is it writable? - + if show_error_in_log is True, then display warning in log window, using is_photo_dir, which if true means the download directory is for photos, if false, for Videos @@ -3765,11 +3798,11 @@ class RapidApp(dbus.service.Object): download_folder_type = _("Photo") else: download_folder_type = _("Video") - + try: d = gio.File(path) if not d.query_exists(cancellable=None): - logger.error("%s download folder does not exist: %s", + logger.error("%s download folder does not exist: %s", download_folder_type, path) if show_error_in_log: severity = config.WARNING @@ -3781,16 +3814,16 @@ class RapidApp(dbus.service.Object): file_attributes = "standard::type,access::can-read,access::can-write" file_info = d.query_filesystem_info(file_attributes) file_type = file_info.get_file_type() - + if file_type != gio.FILE_TYPE_DIRECTORY and file_type != gio.FILE_TYPE_UNKNOWN: - logger.error("%s download folder is invalid: %s", + logger.error("%s download folder is invalid: %s", download_folder_type, path) if show_error_in_log: severity = config.WARNING problem = _("%(file_type)s download folder is invalid") % { 'file_type': download_folder_type} details = _("Folder: %s") % path - self.log_error(severity, problem, details) + self.log_error(severity, problem, details) else: # is the directory writable? try: @@ -3803,7 +3836,7 @@ class RapidApp(dbus.service.Object): problem = _("%(file_type)s download folder is not writable") % { 'file_type': download_folder_type} details = _("Folder: %s") % path - self.log_error(severity, problem, details) + self.log_error(severity, problem, details) else: f = gio.File(temp_dir) f.delete(cancellable=None) @@ -3811,66 +3844,66 @@ class RapidApp(dbus.service.Object): except gio.Error, inst: logger.error("Error checking download directory %s", path) logger.error(inst) - + return valid - - - + + + # # # # Process results and management # # # - - + + def _start_process_managers(self): """ Set up process managers. - + A task such as scanning a device or copying files is handled in its own process. """ - + self.batch_size = 10 self.batch_size_MB = 2 - + sequence_values = (self.downloads_today_value, self.downloads_today_date_value, self.day_start_value, self.refresh_downloads_today_value, - self.stored_sequence_value, + self.stored_sequence_value, self.uses_stored_sequence_no_value, self.uses_session_sequece_no_value, self.uses_sequence_letter_value) - - # daemon process to rename files and create subfolders + + # daemon process to rename files and create subfolders self.subfolder_file_manager = SubfolderFileManager( self.subfolder_file_results, sequence_values) - + # process to scan source devices / paths - self.scan_manager = ScanManager(self.scan_results, self.batch_size, + self.scan_manager = ScanManager(self.scan_results, self.batch_size, self.device_collection.add_device) - + #process to copy files from source to destination - self.copy_files_manager = CopyFilesManager(self.copy_files_results, + self.copy_files_manager = CopyFilesManager(self.copy_files_results, self.batch_size_MB) - + #process to back files up self.backup_manager = BackupFilesManager(self.backup_results, self.batch_size_MB) - + #process to enhance files after they've been copied and before they're #renamed self.file_modify_manager = FileModifyManager(self.file_modify_results) - - + + def scan_results(self, source, condition): """ Receive results from scan processes """ connection = self.scan_manager.get_pipe(source) - + conn_type, data = connection.recv() - + if conn_type == rpdmp.CONN_COMPLETE: connection.close() self.scan_manager.no_tasks -= 1 @@ -3883,7 +3916,7 @@ class RapidApp(dbus.service.Object): self.device_collection.update_device(scan_pid, size) self.device_collection.update_progress(scan_pid, 0.0, results_summary, 0, pulse=False) self.set_download_action_sensitivity() - + if (not self.auto_start_is_on and self.prefs.generate_thumbnails): self.download_progressbar.set_text(_("Thumbnails")) @@ -3897,7 +3930,7 @@ class RapidApp(dbus.service.Object): logger.debug("Turning on display of thumbnails") self.display_scan_thumbnails() self.download_button.grab_focus() - + # signal that no more data is coming, finishing io watch for this pipe return False else: @@ -3910,20 +3943,20 @@ class RapidApp(dbus.service.Object): scanning_progress = file_type_counter.running_file_count() self.device_collection.update_device(scan_pid, size) self.device_collection.update_progress(scan_pid, 0.0, scanning_progress, 0, pulse=True) - + for rpd_file in rpd_files: - self.thumbnails.add_file(rpd_file=rpd_file, + self.thumbnails.add_file(rpd_file=rpd_file, generate_thumbnail = not self.auto_start_is_on) - + # must return True for this method to be called again return True - + @dbus.service.method (config.DBUS_NAME, in_signature='', out_signature='b') def is_running (self): return self.running - + @dbus.service.method (config.DBUS_NAME, in_signature='', out_signature='') def start (self): @@ -3932,14 +3965,14 @@ class RapidApp(dbus.service.Object): else: self.running = True gtk.main() - + def start(): is_beta = config.version.find('~') > 0 - + parser = OptionParser(version= "%%prog %s" % utilities.human_readable_version(config.version)) parser.set_defaults(verbose=is_beta, extensions=False) - # Translators: this text is displayed to the user when they request information on the command line options. + # 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. parser.add_option("-v", "--verbose", action="store_true", dest="verbose", help=_("display program information on the command line as the program runs (default: %default)")) parser.add_option("-d", "--debug", action="store_true", dest="debug", help=_('display debugging information when run from the command line')) @@ -3951,26 +3984,26 @@ def start(): parser.add_option("-l", "--device-location", type="string", metavar="PATH", dest="device_location", help=_("manually specify the PATH of the device from which to download, overwriting existing program preferences")) parser.add_option("--reset-settings", action="store_true", dest="reset", help=_("reset all program settings and preferences and exit")) (options, args) = parser.parse_args() - + if options.debug: logging_level = logging.DEBUG elif options.verbose: logging_level = logging.INFO else: logging_level = logging.ERROR - + logger.setLevel(logging_level) - + if options.auto_detect and options.device_location: logger.info(_("Error: specify device auto-detection or manually specify a device's path from which to download, but do not do both.")) sys.exit(1) - + if options.auto_detect: auto_detect=True logger.info("Device auto detection set from command line") else: auto_detect=None - + if options.device_location: device_location=options.device_location if device_location[-1]=='/': @@ -3987,15 +4020,15 @@ def start(): v += '%s, ' % e.upper() v = file_type + " " + v[:-1] + ' '+ (_('and %s') % exts[-1].upper()) print v - + sys.exit(0) - + if options.reset: prefs = prefsrapid.RapidPreferences() prefs.reset() print _("All settings and preferences have been reset") sys.exit(0) - + if options.focal_length: focal_length = options.focal_length else: @@ -4017,7 +4050,7 @@ def start(): bus = dbus.SessionBus () request = bus.request_name (config.DBUS_NAME, dbus.bus.NAME_FLAG_DO_NOT_QUEUE) - if request != dbus.bus.REQUEST_NAME_REPLY_EXISTS: + if request != dbus.bus.REQUEST_NAME_REPLY_EXISTS: app = RapidApp(bus, '/', config.DBUS_NAME, focal_length=focal_length, auto_detect=auto_detect, device_location=device_location) else: @@ -4025,8 +4058,8 @@ def start(): print "Rapid Photo Downloader is already running" object = bus.get_object (config.DBUS_NAME, "/") app = dbus.Interface (object, config.DBUS_NAME) - - app.start() + + app.start() if __name__ == "__main__": start() diff --git a/rapid/rpdfile.py b/rapid/rpdfile.py index cf38ebc..a405782 100644 --- a/rapid/rpdfile.py +++ b/rapid/rpdfile.py @@ -43,7 +43,8 @@ import thumbnail as tn RAW_EXTENSIONS = ['arw', 'dcr', 'cr2', 'crw', 'dng', 'mos', 'mef', 'mrw', - 'nef', 'orf', 'pef', 'raf', 'raw', 'rw2', 'sr2', 'srw'] + 'nef', 'nrw', 'orf', 'pef', 'raf', 'raw', 'rw2', 'sr2', + 'srw'] JPEG_EXTENSIONS = ['jpg', 'jpe', 'jpeg'] diff --git a/rapid/subfolderfile.py b/rapid/subfolderfile.py index a7b0f89..4e23309 100644 --- a/rapid/subfolderfile.py +++ b/rapid/subfolderfile.py @@ -26,6 +26,8 @@ Runs as a daemon process. import os, datetime, collections +import shutil +import errno import gio import multiprocessing import logging @@ -44,7 +46,7 @@ from gettext import gettext as _ class SyncRawJpeg: def __init__(self): self.photos = {} - + def add_download(self, name, extension, date_time, sub_seconds, sequence_number_used): if name not in self.photos: self.photos[name] = ([extension], date_time, sub_seconds, sequence_number_used) @@ -52,16 +54,16 @@ class SyncRawJpeg: if extension not in self.photos[name][0]: self.photos[name][0].append(extension) - + def matching_pair(self, name, extension, date_time, sub_seconds): """Checks to see if the image matches an image that has already been downloaded. Image name (minus extension), exif date time, and exif subseconds are checked. - + Returns -1 and a sequence number if the name, extension, and exif values match (i.e. it has already been downloaded) Returns 0 and a sequence number if name and exif values match, but the extension is different (i.e. a matching RAW + JPG image) Returns -99 and a sequence number of None if photos detected with the same filenames, but taken at different times Returns 1 and a sequence number of None if no match""" - + if name in self.photos: if self.photos[name][1] == date_time and self.photos[name][2] == sub_seconds: if extension in self.photos[name][0]: @@ -71,37 +73,37 @@ class SyncRawJpeg: else: return (-99, None) return (1, None) - + def ext_exif_date_time(self, name): """Returns first extension, exif date time and subseconds data for the already downloaded photo""" return (self.photos[name][0][0], self.photos[name][1], self.photos[name][2]) - + def time_subseconds_human_readable(date, subseconds): return _("%(hour)s:%(minute)s:%(second)s:%(subsecond)s") % \ {'hour':date.strftime("%H"), - 'minute':date.strftime("%M"), + 'minute':date.strftime("%M"), 'second':date.strftime("%S"), - 'subsecond': subseconds} + 'subsecond': subseconds} def load_metadata(rpd_file, temp_file=True): """ Loads the metadata for the file. Returns True if operation succeeded, false otherwise - + If temp_file is true, the the metadata from the temporary file rather than the original source file is used. This is important, because the metadata can be modified by the filemodify process. """ - if rpd_file.metadata is None: + if rpd_file.metadata is None: if not rpd_file.load_metadata(temp_file): # Error in reading metadata rpd_file.add_problem(None, pn.CANNOT_DOWNLOAD_BAD_METADATA, {'filetype': rpd_file.title_capitalized}) return False return True - + def _generate_name(generator, rpd_file): - + do_generation = True if rpd_file.file_type == rpdfile.FILE_TYPE_PHOTO: do_generation = load_metadata(rpd_file) @@ -115,37 +117,37 @@ def _generate_name(generator, rpd_file): value = '' else: value = '' - + return value def generate_subfolder(rpd_file): - + if rpd_file.file_type == rpdfile.FILE_TYPE_PHOTO: generator = gn.PhotoSubfolder(rpd_file.subfolder_pref_list) else: generator = gn.VideoSubfolder(rpd_file.subfolder_pref_list) - + rpd_file.download_subfolder = _generate_name(generator, rpd_file) return rpd_file - + def generate_name(rpd_file): do_generation = True - + if rpd_file.file_type == rpdfile.FILE_TYPE_PHOTO: generator = gn.PhotoName(rpd_file.name_pref_list) else: generator = gn.VideoName(rpd_file.name_pref_list) - + rpd_file.download_name = _generate_name(generator, rpd_file) return rpd_file - + class SubfolderFile(multiprocessing.Process): def __init__(self, results_pipe, sequence_values): multiprocessing.Process.__init__(self) self.daemon = True self.results_pipe = results_pipe - + self.downloads_today = sequence_values[0] self.downloads_today_date = sequence_values[1] self.day_start = sequence_values[2] @@ -154,12 +156,17 @@ class SubfolderFile(multiprocessing.Process): self.uses_stored_sequence_no = sequence_values[5] self.uses_session_sequece_no = sequence_values[6] self.uses_sequence_letter = sequence_values[7] - + # As of Ubuntu 12.10 / Fedora 18, the file move/rename command is running agonisingly slowly + # A hackish workaround is to replace it with the standard python function + self.use_gnome_file_operations = False + logger.debug("Start of day is set to %s", self.day_start.value) - + def progress_callback_no_update(self, amount_downloaded, total): pass - + #~ if debug_progress: + #~ logger.debug("%.1f", amount_downloaded / float(total)) + def file_exists(self, rpd_file, identifier=None): """ Notify user that the download file already exists @@ -171,24 +178,24 @@ class SubfolderFile(multiprocessing.Process): date = dt.strftime("%x") time = dt.strftime("%X") except: - logger.warning("Could not determine the file modification time of %s", + logger.warning("Could not determine the file modification time of %s", rpd_file.download_full_file_name) date = time = '' - + if not identifier: - rpd_file.add_problem(None, pn.FILE_ALREADY_EXISTS_NO_DOWNLOAD, + rpd_file.add_problem(None, pn.FILE_ALREADY_EXISTS_NO_DOWNLOAD, {'filetype':rpd_file.title_capitalized}) - rpd_file.add_extra_detail(pn.EXISTING_FILE, - {'filetype': rpd_file.title, + rpd_file.add_extra_detail(pn.EXISTING_FILE, + {'filetype': rpd_file.title, 'date': date, 'time': time}) rpd_file.status = config.STATUS_DOWNLOAD_FAILED rpd_file.error_extra_detail = pn.extra_detail_definitions[pn.EXISTING_FILE] % \ {'date':date, 'time':time, 'filetype': rpd_file.title} else: - rpd_file.add_problem(None, pn.UNIQUE_IDENTIFIER_ADDED, + rpd_file.add_problem(None, pn.UNIQUE_IDENTIFIER_ADDED, {'filetype':rpd_file.title_capitalized}) - rpd_file.add_extra_detail(pn.UNIQUE_IDENTIFIER, - {'identifier': identifier, + rpd_file.add_extra_detail(pn.UNIQUE_IDENTIFIER, + {'identifier': identifier, 'filetype': rpd_file.title, 'date': date, 'time': time}) rpd_file.status = config.STATUS_DOWNLOADED_WITH_WARNING @@ -197,10 +204,10 @@ class SubfolderFile(multiprocessing.Process): 'date': date, 'time': time} rpd_file.error_title = rpd_file.problem.get_title() rpd_file.error_msg = _("Source: %(source)s\nDestination: %(destination)s") \ - % {'source': rpd_file.full_file_name, + % {'source': rpd_file.full_file_name, 'destination': rpd_file.download_full_file_name} return rpd_file - + def download_failure_file_error(self, rpd_file, inst): """ Handle cases where file failed to download @@ -209,24 +216,49 @@ class SubfolderFile(multiprocessing.Process): rpd_file.add_extra_detail(pn.DOWNLOAD_COPYING_ERROR_DETAIL, inst) rpd_file.status = config.STATUS_DOWNLOAD_FAILED logger.error("Failed to create file %s: %s", rpd_file.download_full_file_name, inst) - + rpd_file.error_title = rpd_file.problem.get_title() rpd_file.error_msg = _("%(problem)s\nFile: %(file)s") % \ {'problem': rpd_file.problem.get_problems(), 'file': rpd_file.full_file_name} - + return rpd_file - + + def download_file_exists(self, rpd_file): + """ + Check how to handle a download file already existing + """ + if (rpd_file.download_conflict_resolution == + config.ADD_UNIQUE_IDENTIFIER): + add_unique_identifier = True + logger.debug("Will add unique identifier to avoid duplicate filename") + else: + rpd_file = self.file_exists(rpd_file) + add_unique_identifier = False + return (rpd_file, add_unique_identifier) + + def added_unique_identifier(self, rpd_file): + """ + Track fact that a unique identifier was added to a file name + """ + move_succeeded = True + suffix_already_used = False + rpd_file = self.file_exists(rpd_file, identifier) + logger.error("%s: %s - %s", rpd_file.full_file_name, + rpd_file.problem.get_title(), + rpd_file.problem.get_problems()) + return (rpd_file, move_succeeded, suffix_already_used) + def same_name_different_exif(self, sync_photo_name, rpd_file): """Notify the user that a file was already downloaded with the same name, but the exif information was different""" i1_ext, i1_date_time, i1_subseconds = self.sync_raw_jpeg.ext_exif_date_time(sync_photo_name) - detail = {'image1': "%s%s" % (sync_photo_name, i1_ext), + detail = {'image1': "%s%s" % (sync_photo_name, i1_ext), 'image1_date': i1_date_time.strftime("%x"), - 'image1_time': time_subseconds_human_readable(i1_date_time, i1_subseconds), - 'image2': rpd_file.name, + 'image1_time': time_subseconds_human_readable(i1_date_time, i1_subseconds), + 'image2': rpd_file.name, 'image2_date': rpd_file.metadata.date_time().strftime("%x"), 'image2_time': time_subseconds_human_readable( - rpd_file.metadata.date_time(), + rpd_file.metadata.date_time(), rpd_file.metadata.sub_seconds())} rpd_file.add_problem(None, pn.SAME_FILE_DIFFERENT_EXIF, detail) @@ -234,8 +266,8 @@ class SubfolderFile(multiprocessing.Process): rpd_file.error_msg = pn.problem_definitions[pn.SAME_FILE_DIFFERENT_EXIF][1] % detail rpd_file.status = config.STATUS_DOWNLOADED_WITH_WARNING return rpd_file - - + + def run(self): """ Get subfolder and name. @@ -246,37 +278,39 @@ class SubfolderFile(multiprocessing.Process): """ i = 0 download_count = 0 - + duplicate_files = {} - # Track downloads today, using a class whose purpose is to + # Track downloads today, using a class whose purpose is to # take the value in the user prefs, increment, and then be used # to update the prefs (which can only happen via the main process) self.downloads_today_tracker = prefsrapid.DownloadsTodayTracker( day_start = self.day_start.value, downloads_today = self.downloads_today.value, downloads_today_date = self.downloads_today_date.value) - + # Track sequences using shared downloads today and stored sequence number # (shared with main process) - self.sequences = gn.Sequences(self.downloads_today_tracker, + self.sequences = gn.Sequences(self.downloads_today_tracker, self.stored_sequence_no.value) - + self.sync_raw_jpeg = SyncRawJpeg() - + while True: - logger.debug("Finished %s. Getting next task.", download_count) + if download_count: + logger.debug("Finished %s. Getting next task.", download_count) - # rename file and move to generated subfolder + # rename file and move to generated subfolder download_succeeded, download_count, rpd_file = self.results_pipe.recv() - + move_succeeded = False - + if download_succeeded: - temp_file = gio.File(rpd_file.temp_full_file_name) + if self.use_gnome_file_operations: + temp_file = gio.File(rpd_file.temp_full_file_name) synchronize_raw_jpg_failed = False if not (rpd_file.synchronize_raw_jpg and @@ -290,8 +324,8 @@ class SubfolderFile(multiprocessing.Process): synchronize_raw_jpg_failed = True else: j, sequence_to_use = self.sync_raw_jpeg.matching_pair( - name=sync_photo_name, extension=sync_photo_ext, - date_time=rpd_file.metadata.date_time(), + name=sync_photo_name, extension=sync_photo_ext, + date_time=rpd_file.metadata.date_time(), sub_seconds=rpd_file.metadata.sub_seconds()) if j == -1: # this exact file has already been downloaded (same extension, same filename, and same exif date time subsecond info) @@ -306,26 +340,29 @@ class SubfolderFile(multiprocessing.Process): self.sequences.set_matched_sequence_value(sequence_to_use) if j == -99: rpd_file = self.same_name_different_exif(sync_photo_name, rpd_file) - + if synchronize_raw_jpg_failed: generation_succeeded = False else: # Generate subfolder name and new file name generation_succeeded = True - + if rpd_file.file_type == rpdfile.FILE_TYPE_PHOTO: if hasattr(rpd_file, 'new_focal_length'): # A RAW file has had its focal length and aperture adjusted. # These have been written out to an XMP sidecar, but they won't - # be picked up by pyexiv2. So temporarily change the values inplace here, + # be picked up by pyexiv2. So temporarily change the values inplace here, # without saving them. if load_metadata(rpd_file): rpd_file.metadata["Exif.Photo.FocalLength"] = rpd_file.new_focal_length rpd_file.metadata["Exif.Photo.FNumber"] = rpd_file.new_aperture - + rpd_file = generate_subfolder(rpd_file) + + if rpd_file.download_subfolder: - + logger.debug("Generated subfolder name %s for file %s", rpd_file.download_subfolder, rpd_file.name) + if self.refresh_downloads_today.value: # overwrite downloads today value tracked here, # as user has modified their preferences @@ -333,21 +370,26 @@ class SubfolderFile(multiprocessing.Process): self.downloads_today_tracker.set_raw_downloads_today_date(self.downloads_today_date.value) self.downloads_today_tracker.day_start = self.day_start.value self.refresh_downloads_today.value = False - + # update whatever the stored value is self.sequences.stored_sequence_no = self.stored_sequence_no.value rpd_file.sequences = self.sequences - + # generate the file name rpd_file = generate_name(rpd_file) - + if rpd_file.has_problem(): + logger.debug("Encountered a problem generating file name for file %s", rpd_file.name) rpd_file.status = config.STATUS_DOWNLOADED_WITH_WARNING rpd_file.error_title = rpd_file.problem.get_title() rpd_file.error_msg = _("%(problem)s\nFile: %(file)s") % \ {'problem': rpd_file.problem.get_problems(), 'file': rpd_file.full_file_name} - + else: + logger.debug("Generated file name %s for file %s", rpd_file.download_name, rpd_file.name) + else: + logger.debug("Failed to generate subfolder name for file: %s", rpd_file.name) + # Check for any errors if not rpd_file.download_subfolder or not rpd_file.download_name: if not rpd_file.download_subfolder and not rpd_file.download_name: @@ -360,59 +402,93 @@ class SubfolderFile(multiprocessing.Process): rpd_file.add_extra_detail(pn.NO_DATA_TO_NAME, {'filetype': area}) generation_succeeded = False rpd_file.status = config.STATUS_DOWNLOAD_FAILED - + rpd_file.error_title = rpd_file.problem.get_title() rpd_file.error_msg = _("%(problem)s\nFile: %(file)s") % \ {'problem': rpd_file.problem.get_problems(), 'file': rpd_file.full_file_name} - - + + if generation_succeeded: rpd_file.download_path = os.path.join(rpd_file.download_folder, rpd_file.download_subfolder) rpd_file.download_full_file_name = os.path.join(rpd_file.download_path, rpd_file.download_name) rpd_file.download_full_base_name = os.path.splitext(rpd_file.download_full_file_name)[0] - + subfolder = gio.File(path=rpd_file.download_path) - + # Create subfolder if it does not exist. # It is possible to skip the query step, and just try to create # the directories and ignore the error of it already existing - # but it takes twice as long to fail with an error than just # run the straight query - + + logger.debug("Probing to see if subfolder already exists...") if not subfolder.query_exists(cancellable=None): - try: - subfolder.make_directory_with_parents(cancellable=gio.Cancellable()) - except gio.Error, inst: - # The 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 download subfolder: %s", rpd_file.download_path) - logger.error(inst) - rpd_file.error_title = _("Failed to create download subfolder") - rpd_file.error_msg = _("Path: %s") % rpd_file.download_path - + if self.use_gnome_file_operations: + try: + logger.debug("...subfolder doesn't exist: creating it using gnome...") + subfolder.make_directory_with_parents(cancellable=gio.Cancellable()) + logger.debug("...subfolder created") + except gio.Error, inst: + # The 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 download subfolder: %s", rpd_file.download_path) + logger.error(inst) + rpd_file.error_title = _("Failed to create download subfolder") + rpd_file.error_msg = _("Path: %s") % rpd_file.download_path + else: + try: + logger.debug("...subfolder doesn't exist: creating it using python...") + os.makedirs(rpd_file.download_path) + logger.debug("...subfolder created") + except IOError as inst: + if inst.errno <> errno.EEXIST: + logger.error("Failed to create download subfolder: %s", rpd_file.download_path) + logger.error(inst) + rpd_file.error_title = _("Failed to create download subfolder") + rpd_file.error_msg = _("Path: %s") % rpd_file.download_path + else: + logger.debug("...subfolder already exists") + # Move temp file to subfolder - download_file = gio.File(rpd_file.download_full_file_name) - add_unique_identifier = False - try: - temp_file.move(download_file, self.progress_callback_no_update, cancellable=None) - move_succeeded = True - if rpd_file.status <> config.STATUS_DOWNLOADED_WITH_WARNING: - rpd_file.status = config.STATUS_DOWNLOADED - except gio.Error, inst: - if inst.code == gio.ERROR_EXISTS: - if (rpd_file.download_conflict_resolution == - config.ADD_UNIQUE_IDENTIFIER): - add_unique_identifier = True + if self.use_gnome_file_operations: + download_file = gio.File(rpd_file.download_full_file_name) + try: + logger.debug("Attempting to use Gnome to rename file %s to %s .....", rpd_file.temp_full_file_name, rpd_file.download_full_file_name) + temp_file.move(download_file, self.progress_callback_no_update, cancellable=None) + logger.debug("....successfully renamed file") + move_succeeded = True + if rpd_file.status <> config.STATUS_DOWNLOADED_WITH_WARNING: + rpd_file.status = config.STATUS_DOWNLOADED + except gio.Error as inst: + if inst.code == gio.ERROR_EXISTS: + rpd_file, add_unique_identifier = download_file_exists(rpd_file) else: - rpd_file = self.file_exists(rpd_file) - else: - rpd_file = self.download_failure_file_error(rpd_file, inst) - + rpd_file = self.download_failure_file_error(rpd_file, inst) + else: + # Use python library functions to rename file + # Sadly this code basically duplicates the logic of the previous block + try: + if os.path.exists(rpd_file.download_full_file_name): + raise IOError(errno.EEXIST, "File exists: %s" % rpd_file.download_full_file_name) + logger.debug("Attempting to use python to rename file %s to %s .....", rpd_file.temp_full_file_name, rpd_file.download_full_file_name) + shutil.move(rpd_file.temp_full_file_name, rpd_file.download_full_file_name) + logger.debug("....successfully renamed file") + move_succeeded = True + if rpd_file.status <> config.STATUS_DOWNLOADED_WITH_WARNING: + rpd_file.status = config.STATUS_DOWNLOADED + except IOError as inst: + if inst.errno == errno.EEXIST: + rpd_file, add_unique_identifier = self.download_file_exists(rpd_file) + else: + rpd_file = self.download_failure_file_error(rpd_file, inst.strerror) + except: + rpd_file = self.download_failure_file_error(rpd_file, inst.strerror) + if add_unique_identifier: name = os.path.splitext(rpd_file.download_name) full_name = rpd_file.download_full_file_name @@ -425,25 +501,35 @@ class SubfolderFile(multiprocessing.Process): rpd_file.download_full_file_name = os.path.join( rpd_file.download_path, rpd_file.download_name) - download_file = gio.File( + + if self.use_gnome_file_operations: + download_file = gio.File( rpd_file.download_full_file_name) - - try: - temp_file.move(download_file, self.progress_callback_no_update, cancellable=None) - move_succeeded = True - suffix_already_used = False - rpd_file = self.file_exists(rpd_file, identifier) - logger.error("%s: %s - %s", rpd_file.full_file_name, - rpd_file.problem.get_title(), - rpd_file.problem.get_problems()) - except gio.Error, inst: - if inst.code <> gio.ERROR_EXISTS: + try: + temp_file.move(download_file, self.progress_callback_no_update, cancellable=None) + rpd_file, move_succeeded, suffix_already_used = self.added_unique_identifier(rpd_file) + except gio.Error, inst: + if inst.code <> gio.ERROR_EXISTS: + rpd_file = self.download_failure_file_error(rpd_file, inst) + else: + try: + if os.path.exists(rpd_file.download_full_file_name): + raise IOError(errno.EEXIST, "File exists: %s" % rpd_file.download_full_file_name) + shutil.move(rpd_file.temp_full_file_name, rpd_file.download_full_file_name) + rpd_file, move_succeeded, suffix_already_used = self.added_unique_identifier(rpd_file) + except IOError as inst: + if inst.errno <> errno.EEXIST: + rpd_file = self.download_failure_file_error(rpd_file, inst) + break + except: rpd_file = self.download_failure_file_error(rpd_file, inst) - - - - logger.debug("Finish processing file: %s", download_count) - + break + + + + + logger.debug("Finish processing file: %s", download_count) + if move_succeeded: if synchronize_raw_jpg: if sequence_to_use is None: @@ -458,17 +544,15 @@ class SubfolderFile(multiprocessing.Process): if sequence_to_use is None: if self.uses_session_sequece_no.value or self.uses_sequence_letter.value: self.sequences.increment( - self.uses_session_sequece_no.value, + self.uses_session_sequece_no.value, self.uses_sequence_letter.value) if self.uses_stored_sequence_no.value: self.stored_sequence_no.value += 1 self.downloads_today_tracker.increment_downloads_today() self.downloads_today.value = self.downloads_today_tracker.get_raw_downloads_today() self.downloads_today_date.value = self.downloads_today_tracker.get_raw_downloads_today_date() - + if rpd_file.temp_thm_full_name: - # copy and rename THM video file - source = gio.File(path=rpd_file.temp_thm_full_name) ext = None if hasattr(rpd_file, 'thm_extension'): if rpd_file.thm_extension: @@ -476,45 +560,69 @@ class SubfolderFile(multiprocessing.Process): if ext is None: ext = '.THM' download_thm_full_name = rpd_file.download_full_base_name + ext - dest = gio.File(path=download_thm_full_name) - try: - source.move(dest, self.progress_callback_no_update, cancellable=None) - rpd_file.download_thm_full_name = download_thm_full_name - except gio.Error, inst: - logger.error("Failed to move video THM file %s", download_thm_full_name) - + + # copy and rename THM video file + if self.use_gnome_file_operations: + source = gio.File(path=rpd_file.temp_thm_full_name) + dest = gio.File(path=download_thm_full_name) + try: + source.move(dest, self.progress_callback_no_update, cancellable=None) + rpd_file.download_thm_full_name = download_thm_full_name + except gio.Error, inst: + logger.error("Failed to move video THM file %s", download_thm_full_name) + else: + try: + # don't check to see if it already exists + shutil.move(rpd_file.temp_thm_full_name, download_thm_full_name) + rpd_file.download_thm_full_name = download_thm_full_name + except: + logger.error("Failed to move video THM file %s", download_thm_full_name) + if rpd_file.temp_xmp_full_name: # copy and rename XMP sidecar file - source = gio.File(path=rpd_file.temp_xmp_full_name) # generate_name() has generated xmp extension with correct capitalization download_xmp_full_name = rpd_file.download_full_base_name + rpd_file.xmp_extension - dest = gio.File(path=download_xmp_full_name) - try: - source.move(dest, self.progress_callback_no_update, cancellable=None) - rpd_file.download_xmp_full_name = download_xmp_full_name - except gio.Error, inst: - logger.error("Failed to move XMP sidecar file %s", download_xmp_full_name) - - + if self.use_gnome_file_operations: + source = gio.File(path=rpd_file.temp_xmp_full_name) + dest = gio.File(path=download_xmp_full_name) + try: + source.move(dest, self.progress_callback_no_update, cancellable=None) + rpd_file.download_xmp_full_name = download_xmp_full_name + except gio.Error, inst: + logger.error("Failed to move XMP sidecar file %s", download_xmp_full_name) + else: + try: + shutil.move(rpd_file.temp_xmp_full_name, download_xmp_full_name) + rpd_file.download_xmp_full_name = download_xmp_full_name + except: + logger.error("Failed to move XMP sidecar file %s", download_xmp_full_name) + + if not move_succeeded: - logger.error("%s: %s - %s", rpd_file.full_file_name, - rpd_file.problem.get_title(), + logger.error("%s: %s - %s", rpd_file.full_file_name, + rpd_file.problem.get_title(), rpd_file.problem.get_problems()) - try: - temp_file.delete(cancellable=None) - except gio.Error, inst: - logger.error("Failed to delete temporary file %s", rpd_file.temp_full_file_name) - logger.error(inst) - - - - - + if self.use_gnome_file_operations: + try: + temp_file.delete(cancellable=None) + except gio.Error, inst: + logger.error("Failed to delete temporary file %s", rpd_file.temp_full_file_name) + logger.error(inst) + else: + try: + os.remove(rpd_file.temp_full_file_name) + except: + logger.error("Failed to delete temporary file %s", rpd_file.temp_full_file_name) + + + + + rpd_file.metadata = None #purge metadata, as it cannot be pickled rpd_file.sequences = None - self.results_pipe.send((move_succeeded, rpd_file,)) - + self.results_pipe.send((move_succeeded, rpd_file, download_count)) + i += 1 - + |