summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xChangelog.txt15
-rwxr-xr-xFreeFileSync/Build/Languages/arabic.lng2098
-rwxr-xr-xFreeFileSync/Build/Languages/bulgarian.lng575
-rwxr-xr-xFreeFileSync/Build/Languages/chinese_simple.lng561
-rwxr-xr-xFreeFileSync/Build/Languages/chinese_traditional.lng571
-rwxr-xr-xFreeFileSync/Build/Languages/croatian.lng569
-rwxr-xr-xFreeFileSync/Build/Languages/czech.lng581
-rwxr-xr-xFreeFileSync/Build/Languages/danish.lng567
-rwxr-xr-xFreeFileSync/Build/Languages/dutch.lng577
-rwxr-xr-xFreeFileSync/Build/Languages/english_uk.lng565
-rwxr-xr-xFreeFileSync/Build/Languages/french.lng573
-rwxr-xr-xFreeFileSync/Build/Languages/german.lng557
-rwxr-xr-xFreeFileSync/Build/Languages/greek.lng565
-rwxr-xr-xFreeFileSync/Build/Languages/hebrew.lng569
-rwxr-xr-xFreeFileSync/Build/Languages/hindi.lng565
-rwxr-xr-xFreeFileSync/Build/Languages/hungarian.lng565
-rwxr-xr-xFreeFileSync/Build/Languages/italian.lng565
-rwxr-xr-xFreeFileSync/Build/Languages/japanese.lng565
-rwxr-xr-xFreeFileSync/Build/Languages/korean.lng565
-rwxr-xr-xFreeFileSync/Build/Languages/lithuanian.lng573
-rwxr-xr-xFreeFileSync/Build/Languages/norwegian.lng569
-rwxr-xr-xFreeFileSync/Build/Languages/polish.lng569
-rwxr-xr-xFreeFileSync/Build/Languages/portuguese.lng565
-rwxr-xr-xFreeFileSync/Build/Languages/portuguese_br.lng569
-rwxr-xr-xFreeFileSync/Build/Languages/romanian.lng573
-rwxr-xr-xFreeFileSync/Build/Languages/russian.lng577
-rwxr-xr-xFreeFileSync/Build/Languages/slovak.lng571
-rwxr-xr-xFreeFileSync/Build/Languages/slovenian.lng573
-rwxr-xr-xFreeFileSync/Build/Languages/spanish.lng573
-rwxr-xr-xFreeFileSync/Build/Languages/swedish.lng565
-rwxr-xr-xFreeFileSync/Build/Languages/turkish.lng579
-rwxr-xr-xFreeFileSync/Build/Languages/ukrainian.lng573
-rwxr-xr-xFreeFileSync/Build/Resources.zipbin318268 -> 316800 bytes
-rwxr-xr-xFreeFileSync/Build/ding.wavbin33692 -> 134636 bytes
-rwxr-xr-xFreeFileSync/Source/Makefile10
-rwxr-xr-xFreeFileSync/Source/RealTimeSync/Makefile6
-rwxr-xr-xFreeFileSync/Source/RealTimeSync/main_dlg.cpp2
-rwxr-xr-xFreeFileSync/Source/RealTimeSync/tray_menu.cpp3
-rwxr-xr-xFreeFileSync/Source/base/algorithm.cpp17
-rwxr-xr-xFreeFileSync/Source/base/application.cpp4
-rwxr-xr-xFreeFileSync/Source/base/comparison.cpp146
-rwxr-xr-xFreeFileSync/Source/base/db_file.cpp8
-rwxr-xr-xFreeFileSync/Source/base/dir_exist_async.h8
-rwxr-xr-xFreeFileSync/Source/base/dir_lock.cpp131
-rwxr-xr-xFreeFileSync/Source/base/error_log.h2
-rwxr-xr-xFreeFileSync/Source/base/ffs_paths.cpp2
-rwxr-xr-xFreeFileSync/Source/base/file_hierarchy.h8
-rwxr-xr-xFreeFileSync/Source/base/generate_logfile.cpp57
-rwxr-xr-xFreeFileSync/Source/base/hard_filter.cpp2
-rwxr-xr-xFreeFileSync/Source/base/hard_filter.h17
-rwxr-xr-xFreeFileSync/Source/base/parallel_scan.cpp88
-rwxr-xr-xFreeFileSync/Source/base/parallel_scan.h31
-rwxr-xr-xFreeFileSync/Source/base/parse_lng.h2
-rwxr-xr-xFreeFileSync/Source/base/process_xml.cpp115
-rwxr-xr-xFreeFileSync/Source/base/process_xml.h4
-rwxr-xr-xFreeFileSync/Source/base/status_handler_impl.h122
-rwxr-xr-xFreeFileSync/Source/base/structures.cpp35
-rwxr-xr-xFreeFileSync/Source/base/structures.h47
-rwxr-xr-xFreeFileSync/Source/base/synchronization.cpp614
-rwxr-xr-xFreeFileSync/Source/base/synchronization.h7
-rwxr-xr-xFreeFileSync/Source/base/versioning.cpp539
-rwxr-xr-xFreeFileSync/Source/base/versioning.h42
-rwxr-xr-xFreeFileSync/Source/fs/abstract.cpp150
-rwxr-xr-xFreeFileSync/Source/fs/abstract.h65
-rwxr-xr-x[-rw-r--r--]FreeFileSync/Source/fs/concrete_impl.h2
-rwxr-xr-xFreeFileSync/Source/fs/native.cpp8
-rwxr-xr-xFreeFileSync/Source/ui/cfg_grid.cpp6
-rwxr-xr-xFreeFileSync/Source/ui/folder_selector.cpp2
-rwxr-xr-xFreeFileSync/Source/ui/gui_generated.cpp164
-rwxr-xr-xFreeFileSync/Source/ui/gui_generated.h18
-rwxr-xr-xFreeFileSync/Source/ui/gui_status_handler.h2
-rwxr-xr-xFreeFileSync/Source/ui/main_dlg.cpp28
-rwxr-xr-xFreeFileSync/Source/ui/progress_indicator.cpp53
-rwxr-xr-xFreeFileSync/Source/ui/small_dlgs.cpp4
-rwxr-xr-xFreeFileSync/Source/ui/sorting.h2
-rwxr-xr-xFreeFileSync/Source/ui/sync_cfg.cpp247
-rwxr-xr-xFreeFileSync/Source/ui/tree_grid.cpp2
-rwxr-xr-xFreeFileSync/Source/version/version.h2
-rwxr-xr-xLicense.txt150
-rwxr-xr-xwx+/image_holder.h2
-rwxr-xr-xwx+/popup_dlg.cpp2
-rwxr-xr-xzen/crc.h89
-rwxr-xr-xzen/file_access.cpp17
-rwxr-xr-xzen/file_io.cpp8
-rwxr-xr-xzen/guid.h55
-rwxr-xr-xzen/perf.h51
-rwxr-xr-xzen/ring_buffer.h12
-rwxr-xr-xzen/serialize.h2
-rwxr-xr-xzen/stl_tools.h10
-rwxr-xr-xzen/string_tools.h8
-rwxr-xr-xzen/string_traits.h8
-rwxr-xr-xzen/thread.h56
-rwxr-xr-xzen/warn_static.h2
-rwxr-xr-xzen/zstring.h18
-rwxr-xr-xzenXml/zenxml/bind.h2
-rwxr-xr-xzenXml/zenxml/dom.h8
-rwxr-xr-xzenXml/zenxml/parser.h2
97 files changed, 12924 insertions, 9599 deletions
diff --git a/Changelog.txt b/Changelog.txt
index 54ba2ebd..3386a0a4 100755
--- a/Changelog.txt
+++ b/Changelog.txt
@@ -1,3 +1,18 @@
+FreeFileSync 10.2 [2018-07-06]
+------------------------------
+Limit number of file versions by age and count
+Report not yet existing folders as warning instead of error
+Improved comparison speed for high-latency traversals
+Set up parallel file operations for versioning folder
+Early clean up to avoid hitting (S)FTP connection limits
+Support FTP servers with ANSI encoding
+Fixed folder drag and drop for modal dialogs
+Fixed progress graph glitch caused by unsteady system clock
+Unbuffered folder lock file existence checking
+Fixed macOS Donation Edition not being recognized after bundle rename
+Updated translation files
+
+
FreeFileSync 10.1 [2018-06-03]
------------------------------
Binary-compare multiple files in parallel
diff --git a/FreeFileSync/Build/Languages/arabic.lng b/FreeFileSync/Build/Languages/arabic.lng
new file mode 100755
index 00000000..d6250172
--- /dev/null
+++ b/FreeFileSync/Build/Languages/arabic.lng
@@ -0,0 +1,2098 @@
+<header>
+ <language>العربية</language>
+ <translator>Waleed Cordy</translator>
+ <locale>ar</locale>
+ <image>flag_arabic.png</image>
+ <plural_count>6</plural_count>
+ <plural_definition>n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5</plural_definition>
+</header>
+
+<source>Both sides have changed since last synchronization.</source>
+<target>كلا الجانبين قد تغير منذ المزامنة الأخيرة.</target>
+
+<source>Cannot determine sync-direction:</source>
+<target>لا يمكن تحديد اتجاه المزامنة:</target>
+
+<source>No change since last synchronization.</source>
+<target>لم يطرأ أي تغيير منذ المزامنة الأخيرة.</target>
+
+<source>The database entry is not in sync considering current settings.</source>
+<target>مدخلات قواعد البيانات غير متزامنة حسب إعدادات المزامنة الحالية.</target>
+
+<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
+<target>تحديد الاتجاهات الافتراضية للمزامنة: ستتم الكتابة فوق الملفات القديمة بالملفات الأحدث.</target>
+
+<source>Creating file %x</source>
+<target>إنشاء الملف %x</target>
+
+<source>Creating folder %x</source>
+<target>إنشاء مجلد %x</target>
+
+<source>Creating symbolic link %x</source>
+<target>إنشاء ارتباط رمزي %x</target>
+
+<source>Moving file %x to the recycle bin</source>
+<target>نقل الملف %x إلى سلة المهملات</target>
+
+<source>Moving folder %x to the recycle bin</source>
+<target>نقل المجلد %x إلى سلة المهملات</target>
+
+<source>Moving symbolic link %x to the recycle bin</source>
+<target>نقل الارتباط الرمزي %x إلى سلة المهملات</target>
+
+<source>Deleting file %x</source>
+<target>حذف الملف %x</target>
+
+<source>Deleting folder %x</source>
+<target>حذف المجلد %x</target>
+
+<source>Deleting symbolic link %x</source>
+<target>حذف الارتباط الرمزي %x</target>
+
+<source>Checking recycle bin availability for folder %x...</source>
+<target>التحقق من توافر سلة المحذوفات من أجل المجلد %x...</target>
+
+<source>The recycle bin is not supported by the following folders. Deleted or overwritten files will not be able to be restored:</source>
+<target>سلة المهملات غير مدعومة بواسطة المجلدات التالية. لن تتمكن من استعادة الملفات المحذوفة أو التي يتم استبدالها:</target>
+
+<source>An exception occurred</source>
+<target>حدث استثناء</target>
+
+<source>A directory path is expected after %x.</source>
+<target>مسار متوقع بعد %x.</target>
+
+<source>Syntax error</source>
+<target>خطأ في البنية</target>
+
+<source>A left and a right directory path are expected after %x.</source>
+<target>متوقع المسار لليمين واليسار بعد %x.</target>
+
+<source>Cannot find file %x.</source>
+<target>لا يمكن العثور على المجلد %x.</target>
+
+<source>Error</source>
+<target>خطأ</target>
+
+<source>File %x does not contain a valid configuration.</source>
+<target>لا يحتوي الملف %x تكويناً صحيحاً.</target>
+
+<source>Unequal number of left and right directories specified.</source>
+<target>لم يتم تحديد عدد متساوي من المسارات على الطرفين.</target>
+
+<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
+<target>يجب أن يحتوي ملف الخيارات الخيارات على مستوى أزواج المسارات عند تحديد المسارات بواسطة سطر الأوامر.</target>
+
+<source>Directories cannot be set for more than one configuration file.</source>
+<target>لا يمكن اختيار المسارات لأكثر من ملف خيارات واحد.</target>
+
+<source>Command line</source>
+<target>سطر الأوامر</target>
+
+<source>Syntax:</source>
+<target>بنية:</target>
+
+<source>config files:</source>
+<target>ملفات الخيارات:</target>
+
+<source>directory</source>
+<target>مسار</target>
+
+<source>global config file:</source>
+<target>ملف الخيارات العام:</target>
+
+<source>Any number of FreeFileSync .ffs_gui and/or .ffs_batch configuration files.</source>
+<target>أي عدد من ملفات تكوين FreeFileSync بامتداد .ffs_gui أو/و .ffs_batch.</target>
+
+<source>Any number of alternative directory pairs for at most one config file.</source>
+<target>أي عدد من أزواج المسارات البديلة من أجل ملف خيارات واحد.</target>
+
+<source>Open the selected configuration for editing only without executing it.</source>
+<target>فتح التكوين المحدد لتعديله فقط بدون تنفيذه.</target>
+
+<source>Path to an alternate GlobalSettings.xml file.</source>
+<target>تحديد مسار مختلف لملف GlobalSettings.xml.</target>
+
+<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
+<target>ملفات التثبيت تالفة. الرجاء إعادة تثبيت FreeFileSync.</target>
+
+<source>Cannot load file %x.</source>
+<target>لا يمكن فتح الملف %x.</target>
+
+<source>Cannot find the following folders:</source>
+<target>تعذر العثور على المجلدات التالية:</target>
+
+<source>The following folders do not yet exist:</source>
+<target>المجلدات الأتية غير موجودة حتى الأن:</target>
+
+<source>The folders are created automatically when needed.</source>
+<target>المجلدات سيتم انئاءها عند الحاجة.</target>
+
+<source>Scanning:</source>
+<target>الفحص:</target>
+
+<source>Comparison finished:</source>
+<target>انتهاء المقارنة:</target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+<pluralform>0 عنصر تم العثور عليه</pluralform>
+<pluralform>1 عنصر تم العثور عليه</pluralform>
+<pluralform>2 عنصران تم العثور عليهما</pluralform>
+<pluralform>%x عناصر تم العثور عليها</pluralform>
+<pluralform>%x عناصر تم العثور عليها</pluralform>
+<pluralform>%x عناصر تم العثور عليها</pluralform>
+</target>
+
+<source>File %x has an invalid date.</source>
+<target>يحتوي الملف %x تاريخ غير صالح.</target>
+
+<source>Date:</source>
+<target>التاريخ:</target>
+
+<source>Files have the same date but a different size.</source>
+<target>الملفات لها نفس التاريخ ولكن حجم مختلف.</target>
+
+<source>Size:</source>
+<target>الحجم:</target>
+
+<source>Content comparison was skipped for excluded files.</source>
+<target>تم تخطي مقارنة المحتوى لملفات مستبعدة.</target>
+
+<source>Items differ in attributes only</source>
+<target>العناصر مختلفة في السمات فقط</target>
+
+<source>Resolving symbolic link %x</source>
+<target>جاري حل المسار الرمزي %x</target>
+
+<source>Comparing content of files %x</source>
+<target>مقارنة محتويات الملفات %x</target>
+
+<source>Generating file list...</source>
+<target>إنشاء قائمة الملفات...</target>
+
+<source>Fail-safe file copy</source>
+<target>نسخ ملفات آمن من الفشل</target>
+
+<source>Enabled</source>
+<target>ممكن</target>
+
+<source>Disabled</source>
+<target>معطل</target>
+
+<source>Copy locked files</source>
+<target>نسخ الملفات المقفلة</target>
+
+<source>Copy file access permissions</source>
+<target>نسخ أذونات الوصول إلى الملف</target>
+
+<source>File time tolerance</source>
+<target>التفاوت في وقت الملف</target>
+
+<source>Folder access timeout</source>
+<target>مهلة وصول المجلد</target>
+
+<source>Run with background priority</source>
+<target>تشغيل مع أولوية في الخلفية</target>
+
+<source>Lock directories during sync</source>
+<target>قفل المسارات أثناء المزامنة</target>
+
+<source>Verify copied files</source>
+<target>التحقق من الملفات التي تم نسخها</target>
+
+<source>Using non-default global settings:</source>
+<target>استخدام إعدادات عامة غير افتراضية:</target>
+
+<source>A folder input field is empty.</source>
+<target>حقل إدخال خاص بمجلد فارغ.</target>
+
+<source>The corresponding folder will be considered as empty.</source>
+<target>سيتم اعتبار المجلد الموافق كمجلد فارغ.</target>
+
+<source>Exclude:</source>
+<target>استثناء:</target>
+
+<source>One base folder of a folder pair is contained in the other one.</source>
+<target>يوجد مجلد أساسي لزوج من المجلدات في المجلد الآخر.</target>
+
+<source>The folder should be excluded from synchronization via filter.</source>
+<target>يجب استبعاد المجلد من المزامنة عبر المرشح.</target>
+
+<source>Calculating sync directions...</source>
+<target>جاري حساب اتجاهات المزامنة...</target>
+
+<source>Out of memory.</source>
+<target>نفدت الذاكرة.</target>
+
+<source>Database file %x is incompatible.</source>
+<target>ملف قاعدة البيانات %x غير متوافق.</target>
+
+<source>Initial synchronization:</source>
+<target>المزامنة الأولية:</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>ملف قاعدة البيانات %x غير موجود حتى الآن.</target>
+
+<source>Database file is corrupted:</source>
+<target>ملف قاعدة البيانات تالف:</target>
+
+<source>Cannot write file %x.</source>
+<target>لا يمكن كتابة الملف %x.</target>
+
+<source>Cannot read file %x.</source>
+<target>لا يمكن قراءة الملف %x.</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>لا تحتوي ملفات قاعدة البيانات حتى الآن على معلومات حول المزامنة الأخيرة.</target>
+
+<source>Loading file %x...</source>
+<target>جار تحميل الملف %x...</target>
+
+<source>Saving file %x...</source>
+<target>جاري حفظ الملف %x...</target>
+
+<source>Searching for folder %x...</source>
+<target>البحث عن المجلد %x...</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>انقضت المهلة أثناء البحث عن مجلد %x.</target>
+
+<source>Cannot get process information.</source>
+<target>لا يمكن الحصول على معلومات العملية.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>لا يمكن قراءة سمات الملف %x.</target>
+
+<source>Waiting while directory is locked:</source>
+<target>انتظر بينما يتم إنشاء قفل للمسار:</target>
+
+<source>Lock owner:</source>
+<target>صاحب القفل:</target>
+
+<source>Detecting abandoned lock...</source>
+<target>اكتشاف قفل مهمل...</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>0 ثانية</pluralform>
+<pluralform>1 ثانية واحدة</pluralform>
+<pluralform>2 ثانيتين</pluralform>
+<pluralform>%x ثواني</pluralform>
+<pluralform>%x ثانية</pluralform>
+<pluralform>%x ثانية</pluralform>
+</target>
+
+<source>Item exists on left side only</source>
+<target>العنصر موجود على الجانب الأيمن فقط</target>
+
+<source>Item exists on right side only</source>
+<target>العنصر موجود في الجانب الأيسر فقط</target>
+
+<source>Left side is newer</source>
+<target>الجانب الأيمن أحدث</target>
+
+<source>Right side is newer</source>
+<target>الجانب الأيسر أحدث</target>
+
+<source>Items have different content</source>
+<target>العناصر مختلفة بالمحتوى</target>
+
+<source>Both sides are equal</source>
+<target>كلا الجانبين متماثلان</target>
+
+<source>Conflict/item cannot be categorized</source>
+<target>الاختلاف\العنصر لا يمكن تصنيفه</target>
+
+<source>Copy new item to left</source>
+<target>نسخ عنصر جديد إلى اليمين</target>
+
+<source>Copy new item to right</source>
+<target>نسخ عنصر جديد إلى اليسار</target>
+
+<source>Delete left item</source>
+<target>حذف العنصر الأيمن</target>
+
+<source>Delete right item</source>
+<target>حذف العنصر الأيسر</target>
+
+<source>Move file on left</source>
+<target>نقل ملف على اليمين</target>
+
+<source>Move file on right</source>
+<target>نقل ملف على اليسار</target>
+
+<source>Update left item</source>
+<target>تحديث العنصر اليميني</target>
+
+<source>Update right item</source>
+<target>تحديث العنصر اليساري</target>
+
+<source>Do nothing</source>
+<target>لا تفعل شيئا</target>
+
+<source>Update attributes on left</source>
+<target>تحديث السمات على اليمين</target>
+
+<source>Update attributes on right</source>
+<target>تحديث السمات على اليسار</target>
+
+<source>Items processed:</source>
+<target>معالجة العناصر:</target>
+
+<source>Items remaining:</source>
+<target>العناصر المتبقية:</target>
+
+<source>Total time:</source>
+<target>مجموع الوقت:</target>
+
+<source>Cleaning up log files:</source>
+<target>تنظيف ملفات السجل:</target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>حدث خطأ أثناء تحليل الملف %x، الصف %y، و العمود %z.</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>لا يمكن وضع قفل المسار للمجلدات الأتية:</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>0 بند</pluralform>
+<pluralform>1 بند واحد</pluralform>
+<pluralform>2 بندان</pluralform>
+<pluralform>%x بنود</pluralform>
+<pluralform>%x بنداً</pluralform>
+<pluralform>%x بند</pluralform>
+</target>
+
+<source>Cannot read directory %x.</source>
+<target>لا يمكن قراءة الدليل %x.</target>
+
+<source>/sec</source>
+<target>\ثانية</target>
+
+<source>%x items/sec</source>
+<target>%x عنصر\الثانية</target>
+
+<source>Show in Explorer</source>
+<target>إظهار في المستكشف</target>
+
+<source>Open with default application</source>
+<target>فتح باستخدام التطبيق الافتراضي</target>
+
+<source>Browse directory</source>
+<target>تصفح المسار</target>
+
+<source>Unable to connect to %x.</source>
+<target>لا يمكن الاتصال بـ %x.</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>لا يمكن الوصول إلى خدمة "نسخ الظل لوحدة التخزين".</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>الرجاء تشغيل نسخة 64-بت من FreeFileSync لإنشاء نسخ الظل على هذا النظام.</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>تعذر تحديد اسم الوسط %x.</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>اسم وحدة التخزين %x ليس جزءاُ من اسم الملف %y.</target>
+
+<source>File time and size</source>
+<target>تاريخ الملف و حجمه</target>
+
+<source>File content</source>
+<target>محتوى الملف</target>
+
+<source>File size</source>
+<target>حجم الملف</target>
+
+<source>Two way</source>
+<target>بالاتجاهين</target>
+
+<source>Mirror</source>
+<target>انعكاس</target>
+
+<source>Update</source>
+<target>تحديث</target>
+
+<source>Custom</source>
+<target>مخصص</target>
+
+<source>Multiple...</source>
+<target>متعددة...</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>لا يمكن كتابة سمات الملف %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>تعذر فتح الملف %x.</target>
+
+<source>%x and %y have different content.</source>
+<target>%x و %y لديهما محتوى مختلف.</target>
+
+<source>Data verification error:</source>
+<target>خطأ في التحقق من البيانات:</target>
+
+<source>Moving file %x to %y</source>
+<target>نقل الملف %x إلى %y</target>
+
+<source>Moving folder %x to %y</source>
+<target>نقل المجلد %x إلى %y</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>نقل الارتباط الرمزي %x إلى %y</target>
+
+<source>Updating file %x</source>
+<target>جاري تحديث الملف %x</target>
+
+<source>Updating symbolic link %x</source>
+<target>جاري تحديث المسار الرمزي %x</target>
+
+<source>Verifying file %x</source>
+<target>التحقق من الملف %x</target>
+
+<source>Updating attributes of %x</source>
+<target>تحديث سمات %x</target>
+
+<source>Source item %x not found</source>
+<target>العنصر المصدر %x لم يتم ايجاده</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>جاري إنشاء نسخة ظل وسيطة لـ %x...</target>
+
+<source>Cannot find folder %x.</source>
+<target>تعذر العثور على المجلد %x.</target>
+
+<source>Target folder %x already existing.</source>
+<target>المجلد الهدف %x موجود سابقاً.</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>يجب أن لا يكون حقل إدخال المجلد الهدف فارغاً.</target>
+
+<source>Source folder %x not found.</source>
+<target>لم يتم العثور على المجلد المصدر %x.</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>الرجاء تحديد مجلد هدف من أجل الوسم حسب الإصدار.</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>العناصر التالية لم تحل اختلافاتها، و لن يتم مزامنتها:</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>المجلدات التالية تختلف اختلافا كبيرا. يرجى التحقق من تحديد المجلدات الصحيحة لإجراء التزامن.</target>
+
+<source>Not enough free disk space available in:</source>
+<target>المساحة الحرة المتوفرة على القرص غير كافية:</target>
+
+<source>Required:</source>
+<target>مطلوب:</target>
+
+<source>Available:</source>
+<target>متاح:</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>ستتم مزامنة بعض الملفات كجزء من مجلدات قاعدة متعددة.</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>لتجنب التعارضات، قم بإعداد مرشحات استبعاد بحيث يتم النظر في كل ملف محدث من قبل مجلد أساسي واحد فقط.</target>
+
+<source>Versioning folder:</source>
+<target>مجلد الإصدار:</target>
+
+<source>Base folder:</source>
+<target>المجلد الأساس:</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>مجلد الإصدار موجود داخل مجلد أساس.</target>
+
+<source>Synchronizing folder pair:</source>
+<target>مزامنة زوج مجلدات:</target>
+
+<source>Generating database...</source>
+<target>إنشاء قاعدة بيانات...</target>
+
+<source>Searching for excess file versions:</source>
+<target>البحث عن اصدارات الملف الزائدة:</target>
+
+<source>Removing excess file versions:</source>
+<target>إزالة اصدارات الملف الزائدة:</target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>تعذر إنشاء بصمة زمنية من أجل المفاضلة الزمنية:</target>
+
+<source>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target>
+حجم غير متوقع لتدفق البيانات.
+المتوقع: ‎%x bytes
+الفعلي: ‎%y bytes
+</target>
+
+<source>Cannot write permissions of %x.</source>
+<target>لا يمكن كتابة أذونات %x.</target>
+
+<source>Operation not supported for different base folder types.</source>
+<target>العملية غير مدعومة لأنواع المجلدات مختلفة الأساس.</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>لا يمكن نقل الملف %x إلى %y.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>لا يمكن نسخ الرابط الرمزي من %x إلى %y.</target>
+
+<source>Error Code %x</source>
+<target>رمز الخطأ %x</target>
+
+<source>Failed to get information about server %x.</source>
+<target>فشل الحصول على معلومات حول الخادم %x.</target>
+
+<source>Cannot open directory %x.</source>
+<target>لا يمكن فتح المسار %x.</target>
+
+<source>Cannot create directory %x.</source>
+<target>لا يمكن إنشاء المسار %x.</target>
+
+<source>Cannot delete file %x.</source>
+<target>لا يمكن حذف الملف %x.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>لا يمكن حذف المسار %x.</target>
+
+<source>Cannot write modification time of %x.</source>
+<target>لا يمكن كتابة وقت تعديل %x.</target>
+
+<source>Cannot determine final path for %x.</source>
+<target>تعذر تحديد المسار النهائي لـ %x.</target>
+
+<source>Cannot resolve symbolic link %x.</source>
+<target>لا يمكن حل الارتباط الرمزي %x.</target>
+
+<source>Unable to move %x to the recycle bin.</source>
+<target>تعذر نقل %x إلى سلة المحذوفات.</target>
+
+<source>Cannot find %x.</source>
+<target>لا يمكن العثور على %x.</target>
+
+<source>Cannot find device %x.</source>
+<target>لا يمكن العثور على الجهاز %x.</target>
+
+<source>Type of item %x is not supported:</source>
+<target>نوع العنصر %x غير مدعوم:</target>
+
+<source>Cannot delete symbolic link %x.</source>
+<target>لا يمكن حذف الرابط الرمزي %x.</target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target>لا يمكن تحديد مساحة القرص الحرة لـ %x.</target>
+
+<source>Incorrect command line:</source>
+<target>سطر أوامر خاطئ:</target>
+
+<source>The server does not support authentication via %x.</source>
+<target>لا يدعم الخادم المصادقة عبر %x.</target>
+
+<source>Unable to access %x.</source>
+<target>لا يمكن الوصول إلى %x.</target>
+
+<source>
+<pluralform>Operation timed out after 1 second.</pluralform>
+<pluralform>Operation timed out after %x seconds.</pluralform>
+</source>
+<target>
+<pluralform>انقضت مهلة العملية بعد 0 ثانية.</pluralform>
+<pluralform>انقضت مهلة العملية بعد 1 ثانية.</pluralform>
+<pluralform>انقضت مهلة العملية بعد 2 ثانية.</pluralform>
+<pluralform>انقضت مهلة العملية بعد %x ثوان.</pluralform>
+<pluralform>انقضت مهلة العملية بعد %x ثانية.</pluralform>
+<pluralform>انقضت مهلة العملية بعد %x ثانية.</pluralform>
+</target>
+
+<source>
+<pluralform>Cannot wait on more than 1 connection at a time.</pluralform>
+<pluralform>Cannot wait on more than %x connections at a time.</pluralform>
+</source>
+<target>
+<pluralform>لا يمكن الانتظار على أكثر 0 اتصال في وقت واحد.</pluralform>
+<pluralform>لا يمكن الانتظار على أكثر 1 اتصال في وقت واحد.</pluralform>
+<pluralform>لا يمكن الانتظار على أكثر 2 اتصال في وقت واحد.</pluralform>
+<pluralform>لا يمكن الانتظار على أكثر %x اتصالات في وقت واحد.</pluralform>
+<pluralform>لا يمكن الانتظار على أكثر من %x اتصالات في وقت واحد.</pluralform>
+<pluralform>لا يمكن الانتظار على أكثر من %x اتصالات في وقت واحد.</pluralform>
+</target>
+
+<source>Active connections: %x</source>
+<target>الاتصال النشط: %x</target>
+
+<source>Failed to open SFTP channel number %x.</source>
+<target>فشل فتح قناة SFTP رقم %x.</target>
+
+<source>
+<pluralform>1 byte</pluralform>
+<pluralform>%x bytes</pluralform>
+</source>
+<target>
+<pluralform>‎0 byte</pluralform>
+<pluralform>‎1 byte</pluralform>
+<pluralform>‎2 bytes</pluralform>
+<pluralform>‎%x bytes</pluralform>
+<pluralform>‎%x bytes</pluralform>
+<pluralform>‎%x bytes</pluralform>
+</target>
+
+<source>%x MB</source>
+<target>‎%x MB</target>
+
+<source>%x KB</source>
+<target>‎%x KB</target>
+
+<source>%x GB</source>
+<target>‎%x GB</target>
+
+<source>Drag && drop</source>
+<target>سحب و إفلات</target>
+
+<source>Select a folder</source>
+<target>تحديد مجلد</target>
+
+<source>&New</source>
+<target>&جديد</target>
+
+<source>&Open...</source>
+<target>&فتح...</target>
+
+<source>Save &as...</source>
+<target>&حفظ باسم...</target>
+
+<source>E&xit</source>
+<target>&إغلاق</target>
+
+<source>&File</source>
+<target>&ملف</target>
+
+<source>&View help</source>
+<target>إ&ظهار المساعدة</target>
+
+<source>&About</source>
+<target>&حول</target>
+
+<source>&Help</source>
+<target>&تعليمات</target>
+
+<source>Usage:</source>
+<target>الاستخدام:</target>
+
+<source>1. Select folders to watch.</source>
+<target>1. حدد المجلدات للمتابعة.</target>
+
+<source>2. Enter a command line.</source>
+<target>2. إدخال سطر أوامر.</target>
+
+<source>3. Press 'Start'.</source>
+<target>3. اضغط على 'ابدأ'.</target>
+
+<source>To get started just import a .ffs_batch file.</source>
+<target>للبدء قم باستيراد ملف .ffs_batch.</target>
+
+<source>Folders to watch:</source>
+<target>المجلدات للمتابعة:</target>
+
+<source>Add folder</source>
+<target>إضافة مجلد</target>
+
+<source>Remove folder</source>
+<target>إزالة مجلد</target>
+
+<source>Browse</source>
+<target>تصفح</target>
+
+<source>Idle time (in seconds):</source>
+<target>وقت الخمول (بالثانية):</target>
+
+<source>Idle time between last detected change and execution of command</source>
+<target>وقت الخمول بين آخر تغيير تم الكشف عنه وتنفيذ الأوامر</target>
+
+<source>Command line:</source>
+<target>سطر الأوامر:</target>
+
+<source>
+The command is triggered if:
+- files or subfolders change
+- new folders arrive (e.g. USB stick insert)
+</source>
+<target>
+يتم تشغيل الأمر إذا:
+-حدوث تغيير في الملفات أو المجلدات الفرعية
+-ظهور مجلدات جديدة (مثال: إدخال USB stick)
+</target>
+
+<source>Start</source>
+<target>بدء</target>
+
+<source>About</source>
+<target>حول</target>
+
+<source>Build: %x</source>
+<target>بناء: %x</target>
+
+<source>All files</source>
+<target>جميع الملفات</target>
+
+<source>Automated Synchronization</source>
+<target>مزامنة تلقائية</target>
+
+<source>The %x protocol does not support directory monitoring:</source>
+<target>بروتوكول %x لا يدعم مراقبة المجلدات:</target>
+
+<source>Directory monitoring active</source>
+<target>مراقبة المسارات فعالة</target>
+
+<source>Waiting until directory is available:</source>
+<target>بإنتظار توافر المسار:</target>
+
+<source>&Restore</source>
+<target>&استعادة</target>
+
+<source>&Show error</source>
+<target>إ&ظهار الخطأ</target>
+
+<source>&Quit</source>
+<target>إ&نهاء</target>
+
+<source>&Retry</source>
+<target>إ&عادة المحاولة</target>
+
+<source>Loading...</source>
+<target>تحميل...</target>
+
+<source>job name</source>
+<target>اسم المهمة</target>
+
+<source>System: Sleep</source>
+<target>النظام: سكون</target>
+
+<source>System: Shut down</source>
+<target>النظام: إيقاف التشغيل</target>
+
+<source>Stopped</source>
+<target>توقف</target>
+
+<source>Completed with errors</source>
+<target>تم بأخطاء</target>
+
+<source>Completed with warnings</source>
+<target>تم بتحذيرات</target>
+
+<source>Warning</source>
+<target>تحذير</target>
+
+<source>Nothing to synchronize</source>
+<target>لا يوجد شيء للمزامنة</target>
+
+<source>Completed successfully</source>
+<target>تم بنجاح</target>
+
+<source>Executing command %x</source>
+<target>تنفيذ الأمر %x</target>
+
+<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
+<target>بإمكانك العودة إلى نافذة FreeFileSync الرئيسية لحل هذه المشكلة.</target>
+
+<source>&Don't show this warning again</source>
+<target>&لا تظهر هذا التنبيه مرة ثانية</target>
+
+<source>&Ignore</source>
+<target>&تجاهل</target>
+
+<source>&Switch</source>
+<target>&تبديل</target>
+
+<source>Switching to FreeFileSync's main window</source>
+<target>العودة إلى نافذة FreeFileSync الرئيسية</target>
+
+<source>Automatic retry</source>
+<target>المحاولة تلقائياً</target>
+
+<source>Ignore &all</source>
+<target>تجاهل &الكل</target>
+
+<source>Retrying operation...</source>
+<target>إعادة محاولة العملية...</target>
+
+<source>Serious Error</source>
+<target>خطأ فادح</target>
+
+<source>Last session</source>
+<target>مصدر الجلسة</target>
+
+<source>Today</source>
+<target>اليوم</target>
+
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>0 يوم</pluralform>
+<pluralform>1 يوم واحد</pluralform>
+<pluralform>2 يومان</pluralform>
+<pluralform>%x أيام</pluralform>
+<pluralform>%x يوماً</pluralform>
+<pluralform>%x يوم</pluralform>
+</target>
+
+<source>Name</source>
+<target>الاسم</target>
+
+<source>Last sync</source>
+<target>أخر مزامنة</target>
+
+<source>Folder</source>
+<target>المجلد</target>
+
+<source>Symlink</source>
+<target>ارتباط-رمزي</target>
+
+<source>Full path</source>
+<target>المسار الكامل</target>
+
+<source>Relative path</source>
+<target>المسار النسبي</target>
+
+<source>Item name</source>
+<target>اسم العنصر</target>
+
+<source>Size</source>
+<target>الحجم</target>
+
+<source>Date</source>
+<target>تاريخ</target>
+
+<source>Extension</source>
+<target>اللاحقة</target>
+
+<source>Category</source>
+<target>الفئة</target>
+
+<source>Action</source>
+<target>التصرف</target>
+
+<source>Local comparison settings</source>
+<target>إعدادات المقارنة المحلية</target>
+
+<source>Local synchronization settings</source>
+<target>إعدادات المزامنة المحلية</target>
+
+<source>Local filter</source>
+<target>فلتر محلي</target>
+
+<source>Active</source>
+<target>مفعل</target>
+
+<source>None</source>
+<target>لا شيء</target>
+
+<source>Remove local settings</source>
+<target>إزالة الإعدادات المحلية</target>
+
+<source>Clear local filter</source>
+<target>إزالة الفلتر المحلي</target>
+
+<source>Copy</source>
+<target>نسخ</target>
+
+<source>Paste</source>
+<target>لصق</target>
+
+<source>The selected folder %x cannot be used with FreeFileSync.</source>
+<target>المجلد المحدد %x لا يمكن استخدامه مع FreeFileSync.</target>
+
+<source>Please select a folder on a local file system, network or an MTP device.</source>
+<target>الرجاء تحديد مجلد على نظام الملفات المحلي، الشبكة أو جهاز MTP.</target>
+
+<source>Defined by context of use</source>
+<target>معرف بواسطة سياق الاستخدام</target>
+
+<source>Requires FreeFileSync Donation Edition</source>
+<target>يتطلب FreeFileSync Donation Edition</target>
+
+<source>&Save</source>
+<target>&حفظ</target>
+
+<source>Save as &batch job...</source>
+<target>&حفظ كمهمة دفعية...</target>
+
+<source>Start &comparison</source>
+<target>بدأ الم&قارنة</target>
+
+<source>C&omparison settings</source>
+<target>&مقارنة</target>
+
+<source>&Filter settings</source>
+<target>إعدادات ال&فلتر</target>
+
+<source>S&ynchronization settings</source>
+<target>إ&عدادات</target>
+
+<source>Start &synchronization</source>
+<target>بدأ الم&زامنة</target>
+
+<source>&Actions</source>
+<target>&مهام</target>
+
+<source>&Preferences</source>
+<target>&التفضيلات</target>
+
+<source>&Language</source>
+<target>الل&غة</target>
+
+<source>&Find...</source>
+<target>&بحث...</target>
+
+<source>&Export file list...</source>
+<target>&تصدير قائمة الملفات...</target>
+
+<source>&Reset layout</source>
+<target>إعادة ال&تنسيق إلى الإفتراضي</target>
+
+<source>&Tools</source>
+<target>أ&دوات</target>
+
+<source>&Check for updates now</source>
+<target>&تحقق من وجود تحديثات الآن</target>
+
+<source>Check &automatically once a week</source>
+<target>&تحقق أوتوماتيكياً بشكل أسبوعي</target>
+
+<source>Cancel</source>
+<target>إلغاء الأمر</target>
+
+<source>Compare</source>
+<target>قارن</target>
+
+<source>Synchronize</source>
+<target>مزامنة</target>
+
+<source>Add folder pair</source>
+<target>إضافة زوج مجلدات</target>
+
+<source>Remove folder pair</source>
+<target>إزالة زوج مجلدات</target>
+
+<source>Access online storage</source>
+<target>الوصول إلى التخزين عبر الإنترنت</target>
+
+<source>Swap sides</source>
+<target>مبادلة الجانبين</target>
+
+<source>Close search bar</source>
+<target>إغلاق شريط البحث</target>
+
+<source>Find:</source>
+<target>بحث:</target>
+
+<source>Match case</source>
+<target>مطابقة الحالة</target>
+
+<source>New</source>
+<target>جديد</target>
+
+<source>Open...</source>
+<target>فتح...</target>
+
+<source>Save</source>
+<target>حفظ</target>
+
+<source>Save as...</source>
+<target>حفظ كـ...</target>
+
+<source>View type:</source>
+<target>عرض النوع:</target>
+
+<source>Select view:</source>
+<target>اختيار نمط العرض:</target>
+
+<source>Statistics:</source>
+<target>إحصائيات:</target>
+
+<source>Number of files and folders that will be deleted</source>
+<target>عدد الملفات و المجلدات التي سيتم حذفها</target>
+
+<source>Number of files that will be updated</source>
+<target>عدد الملفات التي سيتم تحديثها</target>
+
+<source>Number of files and folders that will be created</source>
+<target>عدد الملفات و المجلدات التي سيتم إنشاؤها</target>
+
+<source>Total bytes to copy</source>
+<target>إجمالي عدد الـ bytes التي سيتم نسخها</target>
+
+<source>Arrange folder pair</source>
+<target>ترتيب زوج المجلدات</target>
+
+<source>Folder pair:</source>
+<target>زوج المجلدات:</target>
+
+<source>Main settings:</source>
+<target>الإعدادات الرئيسية:</target>
+
+<source>Use local settings:</source>
+<target>استخدام الإعدادات المحلية:</target>
+
+<source>Select a variant:</source>
+<target>اختيار بديل:</target>
+
+<source>Include &symbolic links:</source>
+<target>تضمين &الروابط الرمزية:</target>
+
+<source>&Follow</source>
+<target>&متابعة</target>
+
+<source>&Direct</source>
+<target>&مباشر</target>
+
+<source>More information</source>
+<target>المزيد من المعلومات</target>
+
+<source>&Ignore time shift [hh:mm]</source>
+<target>&تجاهل تغيير الوقت [hh:mm]</target>
+
+<source>List of file time offsets to ignore</source>
+<target>قائمة إزاحات وقت للملفات ليتم تجاهلها</target>
+
+<source>Example:</source>
+<target>مثال:</target>
+
+<source>Handle daylight saving time</source>
+<target>تعامل مع التوقيت الصيفي</target>
+
+<source>Performance improvements:</source>
+<target>تحسينات الأداء:</target>
+
+<source>Parallel file operations:</source>
+<target>العمليات المتوازية للملف:</target>
+
+<source>How to get best performance?</source>
+<target>كيفية الحصول على أفضل أداء؟</target>
+
+<source>Local settings:</source>
+<target>الإعدادات المحلية:</target>
+
+<source>Include:</source>
+<target>إدخال:</target>
+
+<source>Show examples</source>
+<target>إظهار أمثلة</target>
+
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>اختيار قوانين فلترة لاستثناء ملفات معينة من المزامنة. أدخل مسارات الملفات منسوبة إلى زوج المجلدات المقابل.</target>
+
+<source>File size:</source>
+<target>حجم الملف:</target>
+
+<source>Minimum:</source>
+<target>الحد الأدنى:</target>
+
+<source>Maximum:</source>
+<target>الحد الأقصى:</target>
+
+<source>Time span:</source>
+<target>المجال الزمني:</target>
+
+<source>C&lear</source>
+<target>إ&زالة</target>
+
+<source>Detect moved files</source>
+<target>اكتشاف الملفات المنقولة</target>
+
+<source>
+- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
+</source>
+<target>
+- غير مدعوم من كل أنظمة الملفات
+- يتطلب وينشىء ملفات قواعد البيانات
+- الاكتشاف غير متاح للمزامنة الأولى
+</target>
+
+<source>Delete files:</source>
+<target>حذف الملفات:</target>
+
+<source>&Recycle bin</source>
+<target>&سلة المهملات</target>
+
+<source>&Permanent</source>
+<target>&دائم</target>
+
+<source>&Versioning</source>
+<target>ال&وسم حسب الإصدار</target>
+
+<source>Move files to a user-defined folder</source>
+<target>نقل الملفات إلى المجلد المحدد من قبل المستخدم</target>
+
+<source>Naming convention:</source>
+<target>اصطلاح التسمية:</target>
+
+<source>Limit file versions:</source>
+<target>حد اصدارات الملف:</target>
+
+<source>Last x days:</source>
+<target>اخر x أيام:</target>
+
+<source>Ignore errors</source>
+<target>تجاهل الأخطاء</target>
+
+<source>Retry count:</source>
+<target>تعداد محاولات الإعادة:</target>
+
+<source>Delay (in seconds):</source>
+<target>التأخير (بالثواني):</target>
+
+<source>Run a command after synchronization:</source>
+<target>تشغيل أمر بعد المزامنة:</target>
+
+<source>OK</source>
+<target>موافق</target>
+
+<source>Enter your login details:</source>
+<target>أدخل تفاصيل تسجيل الدخول:</target>
+
+<source>Connection type:</source>
+<target>نوع الاتصال:</target>
+
+<source>Server name or IP address:</source>
+<target>اسم الخادم أو عنوان IP:</target>
+
+<source>Port:</source>
+<target>المنفذ:</target>
+
+<source>Encryption:</source>
+<target>التشفير:</target>
+
+<source>&Disabled</source>
+<target>&معطل</target>
+
+<source>&Explicit SSL/TLS</source>
+<target>&Explicit SSL/TLS</target>
+
+<source>Authentication:</source>
+<target>المصادقة:</target>
+
+<source>&Password</source>
+<target>&كلمة المرو</target>
+
+<source>&Key file</source>
+<target>&ملف المفتاح</target>
+
+<source>&SSH agent</source>
+<target>&عميل بروتوكول SSH</target>
+
+<source>User name:</source>
+<target>اسم المستخدم:</target>
+
+<source>Private key file:</source>
+<target>ملف المفتاح الخاص:</target>
+
+<source>&Show password</source>
+<target>&إظهار كلمة المرور</target>
+
+<source>Directory on server:</source>
+<target>المسار على الخادم:</target>
+
+<source>SFTP channels per connection:</source>
+<target>قنوات SFTP لكل اتصال:</target>
+
+<source>Detect server limit</source>
+<target>اكتشاف حد الخادم</target>
+
+<source>Select a directory on the server:</source>
+<target>تحديد دليل على الخادم:</target>
+
+<source>Select Folder</source>
+<target>اختر مجلد</target>
+
+<source>Start synchronization now?</source>
+<target>بدأ المزامنة الآن؟</target>
+
+<source>Variant:</source>
+<target>بديل:</target>
+
+<source>&Don't show this dialog again</source>
+<target>&لا تظهر نافذة الحوار هذه مرة ثانية</target>
+
+<source>Items found:</source>
+<target>العناصر التي تم العثور عليها:</target>
+
+<source>Time remaining:</source>
+<target>الوقت المتبقي:</target>
+
+<source>Time elapsed:</source>
+<target>الوقت المنقضي:</target>
+
+<source>Bytes</source>
+<target>بايت</target>
+
+<source>Items</source>
+<target>العناصر</target>
+
+<source>Synchronizing...</source>
+<target>مزامنة...</target>
+
+<source>Minimize to notification area</source>
+<target>تصغير إلى منطقة التنبيهات</target>
+
+<source>When finished:</source>
+<target>عند الانتهاء:</target>
+
+<source>Auto-close</source>
+<target>اغلاق تلقائى</target>
+
+<source>Close</source>
+<target>إغلاق</target>
+
+<source>&Pause</source>
+<target>إ&يقاف مؤقت</target>
+
+<source>Stop</source>
+<target>توقف</target>
+
+<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
+<target>إنشاء ملف دفعي من أجل عمليات المزامنة غير المحضورة. للبدأ, انقر نقراً مزدوجاً على الملف أو المهمة المجدولة في منظم المهام: %x</target>
+
+<source>Progress dialog:</source>
+<target>شريط التقدم:</target>
+
+<source>Run minimized</source>
+<target>تشغيل بوضع التصغير</target>
+
+<source>&Show error dialog</source>
+<target>&إظهار نافذة الأخطاء</target>
+
+<source>Show pop-up on errors or warnings</source>
+<target>إظهار إطارات منبثقة عند حصول أخطاء أو تحذيرات</target>
+
+<source>&Cancel</source>
+<target>&إلغاء</target>
+
+<source>Stop synchronization at first error</source>
+<target>إحباط المزامنة عند أول خطأ</target>
+
+<source>Save log:</source>
+<target>حفظ السجل:</target>
+
+<source>Limit number of log files:</source>
+<target>حد عدد ملفات السجل:</target>
+
+<source>How can I schedule a batch job?</source>
+<target>كيف يمكنني جدولة مهمة دفعية؟</target>
+
+<source>&Keep relative paths</source>
+<target>&إبقاء المسارات النسبية</target>
+
+<source>&Overwrite existing files</source>
+<target>&الكتابة فوق الملفات الموجودة</target>
+
+<source>The following settings are used for all synchronization jobs.</source>
+<target>هذه الإعدادات مستخدمة لجميع مهمات المزامنة.</target>
+
+<source>
+Copy to a temporary file (*.ffs_tmp) before overwriting target.
+This guarantees a consistent state even in case of a serious error.
+</source>
+<target>
+قم بالنسخ إلى ملف مؤقت (*.ffs_tmp) قبل استبدال الملف الهدف.
+هذه العملية تضمن حالة مستقرة حتى في حال حدوث خطأ فادح.
+</target>
+
+<source>recommended</source>
+<target>‏منصوح به‏</target>
+
+<source>Copy shared or locked files using the Volume Shadow Copy Service.</source>
+<target>نسخ الملفات المشتركة مع مستخدمين آخرين أو المقفولة باستخدام خدمة نسخ الظل الوسيط.</target>
+
+<source>requires administrator rights</source>
+<target>يتطلب صلاحيات مسؤول</target>
+
+<source>Transfer file and folder permissions.</source>
+<target>نقل أذونات الملفات و المجلدات.</target>
+
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>إعادة إظهار جميع التنبهات و نوافذ الحوار التي تم إخفاؤها</target>
+
+<source>Customize context menu:</source>
+<target>تخصيص القائمة المحلية:</target>
+
+<source>Description</source>
+<target>الوصف</target>
+
+<source>&Default</source>
+<target>الا&فتراضي</target>
+
+<source>Feedback and suggestions are welcome</source>
+<target>التعليقات و الاقتراحات موضع ترحيب</target>
+
+<source>Home page</source>
+<target>الصفحة الرئيسية</target>
+
+<source>FreeFileSync Forum</source>
+<target>منتدى FreeFileSync</target>
+
+<source>Email</source>
+<target>البريد الإلكتروني</target>
+
+<source>If you like FreeFileSync:</source>
+<target>إذا أعجبك FreeFileSync:</target>
+
+<source>Support with a donation</source>
+<target>دعم عبر التبرع</target>
+
+<source>The auto updater was disabled by the administrator.</source>
+<target>تم تعطيل المحدث التلقائي بواسطة المسؤول.</target>
+
+<source>Donation details</source>
+<target>تفاصيل التبرع</target>
+
+<source>Source code written in C++ using:</source>
+<target>الرماز المصدري مكتوب بلغة C++‎ باستخدام:</target>
+
+<source>Published under the GNU General Public License</source>
+<target>نشر تحت رخصة GNU General Public License</target>
+
+<source>Many thanks for localization:</source>
+<target>شكرا جزيلا للترجمة:</target>
+
+<source>Activate the FreeFileSync Donation Edition by one of the following methods:</source>
+<target>قم بتنشيط FreeFileSync Donation Edition بإحدى الطرق التالية:</target>
+
+<source>1. Activate via internet now:</source>
+<target>1. تنشيط عبر الإنترنت الآن:</target>
+
+<source>Activate online</source>
+<target>التنشيط عبر الإنترنت</target>
+
+<source>2. Retrieve an offline activation key from the following URL:</source>
+<target>2. استرداد مفتاح تنشيط دون اتصال من الرابط التالي:</target>
+
+<source>&Copy to clipboard</source>
+<target>&نسخ من الذاكرة</target>
+
+<source>Enter activation key:</source>
+<target>أدخل مفتاح التنشيط:</target>
+
+<source>Activate offline</source>
+<target>تنشيط دون اتصال</target>
+
+<source>Highlight configurations that have not been run for more than the following number of days:</source>
+<target>ميز التكوينات التى لم يتم تشغيلها لأكثر من عدد الأيام الأتية:</target>
+
+<source>Synchronization Settings</source>
+<target>إعدادات المزامنة</target>
+
+<source>Access Online Storage</source>
+<target>الوصول الى التخزين السحابي</target>
+
+<source>Save as a Batch Job</source>
+<target>حفظ كمهمة دفعية</target>
+
+<source>Delete Items</source>
+<target>حذف العناصر</target>
+
+<source>Copy Items</source>
+<target>نسخ العناصر</target>
+
+<source>Options</source>
+<target>خيارات</target>
+
+<source>Select Time Span</source>
+<target>اختيار المطال الزمني</target>
+
+<source>Highlight Configurations</source>
+<target>تمييز التكوينات</target>
+
+<source>&Options</source>
+<target>&خيارات</target>
+
+<source>Main Bar</source>
+<target>الشريط الرئيسي</target>
+
+<source>Folder Pairs</source>
+<target>أزواج المجلدات</target>
+
+<source>Find</source>
+<target>بحث</target>
+
+<source>View Settings</source>
+<target>عرض الإعدادات</target>
+
+<source>Configuration</source>
+<target>التكوين</target>
+
+<source>Overview</source>
+<target>نظرة عامة</target>
+
+<source>Show "%x"</source>
+<target>إظهار "%x"</target>
+
+<source>&Show details</source>
+<target>&عرض التفاصيل</target>
+
+<source>FreeFileSync %x is available!</source>
+<target>FreeFileSync %x متوفر!</target>
+
+<source>Local path not available for %x.</source>
+<target>المسار المحلي غير متوفر لـ %x.</target>
+
+<source>Confirm</source>
+<target>تأكيد</target>
+
+<source>
+<pluralform>Do you really want to execute the command %y for one item?</pluralform>
+<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
+</source>
+<target>
+<pluralform>هل تريد حقاً تنفيذ العملية %y من أجل عنصر 0</pluralform>
+<pluralform>هل تريد حقاً تنفيذ العملية %y من أجل عنصر وحيد 1</pluralform>
+<pluralform>هل تريد حقاً تنفيذ العملية %y من أجل عنصرين اثنين 2</pluralform>
+<pluralform>هل تريد حقاً تنفيذ العملية %y من أجل %x عناصر</pluralform>
+<pluralform>هل تريد حقاً تنفيذ العملية %y من أجل %x عنصراً</pluralform>
+<pluralform>هل تريد حقاً تنفيذ العملية %y من أجل %x عنصر</pluralform>
+</target>
+
+<source>&Execute</source>
+<target>&تنفيذ</target>
+
+<source>
+<pluralform>1 directory</pluralform>
+<pluralform>%x directories</pluralform>
+</source>
+<target>
+<pluralform>0 مسار</pluralform>
+<pluralform>1 مسار واحد</pluralform>
+<pluralform>2 مساران</pluralform>
+<pluralform>%x مسارات</pluralform>
+<pluralform>%x مساراً</pluralform>
+<pluralform>%x مسار</pluralform>
+</target>
+
+<source>
+<pluralform>1 file</pluralform>
+<pluralform>%x files</pluralform>
+</source>
+<target>
+<pluralform>0 ملف</pluralform>
+<pluralform>1 ملف واحد</pluralform>
+<pluralform>2 ملفان</pluralform>
+<pluralform>%x ملفات</pluralform>
+<pluralform>%x ملفاً</pluralform>
+<pluralform>%x ملف</pluralform>
+</target>
+
+<source>
+<pluralform>Showing %y of 1 row</pluralform>
+<pluralform>Showing %y of %x rows</pluralform>
+</source>
+<target>
+<pluralform>الظاهر %y من أصل سطر 0</pluralform>
+<pluralform>الظاهر %y من أصل سطر وحيد 1</pluralform>
+<pluralform>الظاهر %y من أصل سطرين اثنين 2</pluralform>
+<pluralform>الظاهر %y من أصل %x سطور</pluralform>
+<pluralform>الظاهر %y من أصل %x سطراً</pluralform>
+<pluralform>الظاهر %y من أصل %x سطر</pluralform>
+</target>
+
+<source>Set direction:</source>
+<target>تحديد الاتجاه:</target>
+
+<source>multiple selection</source>
+<target>تحديد متعدد</target>
+
+<source>Include via filter:</source>
+<target>تضمن عن طريق فلتر:</target>
+
+<source>Exclude via filter:</source>
+<target>استبعاد باستخدام عامل الفلترة:</target>
+
+<source>Include temporarily</source>
+<target>شمول مؤقتاً</target>
+
+<source>Exclude temporarily</source>
+<target>استبعاد مؤقتاً</target>
+
+<source>&Copy to...</source>
+<target>&نسخ إلى...</target>
+
+<source>&Delete</source>
+<target>&حذف</target>
+
+<source>Include all</source>
+<target>شمول الكل</target>
+
+<source>Exclude all</source>
+<target>استبعاد الكل</target>
+
+<source>Show icons:</source>
+<target>إظهار الأيقونات:</target>
+
+<source>Small</source>
+<target>صغيرة</target>
+
+<source>Medium</source>
+<target>متوسطة</target>
+
+<source>Large</source>
+<target>كبيرة</target>
+
+<source>Select time span...</source>
+<target>حدد المجال الزمني...</target>
+
+<source>Donation Edition</source>
+<target>نسخة التبرعات</target>
+
+<source>Folder Comparison and Synchronization</source>
+<target>مقارنة و مزامنة المجلد</target>
+
+<source>Configuration saved</source>
+<target>تم حفظ التكوين</target>
+
+<source>FreeFileSync batch</source>
+<target>دفعة FreeFileSync</target>
+
+<source>Do you want to save changes to %x?</source>
+<target>هل تريد حفظ التغييرات إلى %x؟</target>
+
+<source>Never save &changes</source>
+<target>&لا تقم بحفظ التغيرات</target>
+
+<source>Do&n't save</source>
+<target>&لا تحفظ</target>
+
+<source>Hide configuration</source>
+<target>اخفاء التكوين</target>
+
+<source>Highlight...</source>
+<target>تمييز...</target>
+
+<source>Clear filter</source>
+<target>إزالة الفلاتر الحالية</target>
+
+<source>Show files that exist on left side only</source>
+<target>إظهار الملفات الموجودة في الجانب الأيمن فقط</target>
+
+<source>Show files that exist on right side only</source>
+<target>إظهار الملفات الموجودة في الجانب الأيسر فقط</target>
+
+<source>Show files that are newer on left</source>
+<target>إظهار الملفات الأحدث في اليمين</target>
+
+<source>Show files that are newer on right</source>
+<target>إظهار الملفات الأحدث في اليسار</target>
+
+<source>Show files that are equal</source>
+<target>إظهار الملفات المتماثلة على الطرفين</target>
+
+<source>Show files that are different</source>
+<target>إظهار الملفات المختلفة على الطرفين</target>
+
+<source>Show conflicts</source>
+<target>إظهار الاختلافات</target>
+
+<source>Show files that will be created on the left side</source>
+<target>إظهار الملفات التي سيتم إنشاؤها في الجانب الأيمن</target>
+
+<source>Show files that will be created on the right side</source>
+<target>إظهار الملفات التي سيتم إنشاؤها في الجانب الأيسر</target>
+
+<source>Show files that will be deleted on the left side</source>
+<target>إظهار الملفات التي سيتم حذفها من من الجانب الأيمن</target>
+
+<source>Show files that will be deleted on the right side</source>
+<target>إظهار الملفات التي سيتم حذفها من الجانب الأيسر</target>
+
+<source>Show files that will be updated on the left side</source>
+<target>إظهار الملفات التي سيتم تحديثها في الجانب الأيسر</target>
+
+<source>Show files that will be updated on the right side</source>
+<target>إظهار الملفات التي سيتم تحديثها في الجانب الأيمن</target>
+
+<source>Show files that won't be copied</source>
+<target>إظهار الملفات التي لن يتم نسخها</target>
+
+<source>Show filtered or temporarily excluded files</source>
+<target>إظهار الملفات التي تم فلترتها أو استبعادها بشكل مؤقت</target>
+
+<source>Save as default</source>
+<target>حفظ كافتراضي</target>
+
+<source>Filter</source>
+<target>عامل الفلترة</target>
+
+<source>All files are in sync</source>
+<target>جميع الملفات في تزامن كامل</target>
+
+<source>Cannot find %x</source>
+<target>لا يمكن العثور على %x</target>
+
+<source>Move up</source>
+<target>تحريك لأعلى</target>
+
+<source>Move down</source>
+<target>تحريك لأسفل</target>
+
+<source>Comma-separated values</source>
+<target>قائمة قيم مفصولة بفواصل</target>
+
+<source>File list exported</source>
+<target>تم تصدير قائمة الملفات</target>
+
+<source>Searching for program updates...</source>
+<target>جاري البحث عن تحديثات للبرنامج...</target>
+
+<source>Paused</source>
+<target>تم الإيقاف مؤقتاً</target>
+
+<source>Stop requested...</source>
+<target>طلب الوقف...</target>
+
+<source>Initializing...</source>
+<target>التجهيز للبدأ...</target>
+
+<source>Scanning...</source>
+<target>جاري الفحص...</target>
+
+<source>Comparing content...</source>
+<target>مقارنة المحتوى...</target>
+
+<source>Info</source>
+<target>معلومات</target>
+
+<source>Select all</source>
+<target>اختيار الجميع</target>
+
+<source>&Continue</source>
+<target>&مواصلة</target>
+
+<source>Progress</source>
+<target>التقدم</target>
+
+<source>Log</source>
+<target>السجل</target>
+
+<source>Thank you, %x, for your donation and support!</source>
+<target>شكرا لك، %x, للتبرع والدعم.</target>
+
+<source>Connections</source>
+<target>اتصالات</target>
+
+<source>Recommended range:</source>
+<target>النطاق المستحسن:</target>
+
+<source>Password:</source>
+<target>كلمة المرور:</target>
+
+<source>Key password:</source>
+<target>كلمة المرور الرئيسية:</target>
+
+<source>Please enter a file path.</source>
+<target>الرجاء إدخال مسار الملف.</target>
+
+<source>
+<pluralform>Copy the following item to another folder?</pluralform>
+<pluralform>Copy the following %x items to another folder?</pluralform>
+</source>
+<target>
+<pluralform>نسخ العنصر 0 التالي إلى مجلد آخر؟</pluralform>
+<pluralform>نسخ العنصر 1 التالي إلى مجلد آخر؟</pluralform>
+<pluralform>نسخ العنصران التاليان إلى مجلد آخر؟</pluralform>
+<pluralform>نسخ الـ %x عناصر التالية إلى مجلد آخر؟</pluralform>
+<pluralform>نسخ الـ %x عنصراً التالية إلى مجلد آخر؟</pluralform>
+<pluralform>نسخ الـ %x عنصر التالية إلى مجلد آخر؟</pluralform>
+</target>
+
+<source>Please enter a target folder.</source>
+<target>الرجاء إدخال المجلد الهدف.</target>
+
+<source>
+<pluralform>Do you really want to move the following item to the recycle bin?</pluralform>
+<pluralform>Do you really want to move the following %x items to the recycle bin?</pluralform>
+</source>
+<target>
+<pluralform>هل تريد حقاً نقل 0 ملف إلى سلة المهملات ؟</pluralform>
+<pluralform>هل تريد حقاً نقل هذا الملف الوحيد 1 إلى سلة المهملات ؟</pluralform>
+<pluralform>هل تريد حقاً نقل هذين الملفبن 2 إلى سلة المهملات ؟</pluralform>
+<pluralform>هل تريد حقاً نقل %x ملفات إلى سلة المهملات ؟</pluralform>
+<pluralform>هل تريد حقاً نقل %x ملفاً إلى سلة المهملات ؟</pluralform>
+<pluralform>هل تريد حقاً نقل %x ملف إلى سلة المهملات ؟</pluralform>
+</target>
+
+<source>Move</source>
+<target>نقل</target>
+
+<source>
+<pluralform>Do you really want to delete the following item?</pluralform>
+<pluralform>Do you really want to delete the following %x items?</pluralform>
+</source>
+<target>
+<pluralform>هل تريد حقاً حذف 0 ملف التالي ؟</pluralform>
+<pluralform>هل تريد حقاً حذف الملف 1 التالي ؟</pluralform>
+<pluralform>هل تريد حقاً حذف الملفين 2 التاليين ؟</pluralform>
+<pluralform>هل تريد حقاً حذف الـ %x ملفات التالية ؟</pluralform>
+<pluralform>هل تريد حقاً حذف الـ %x ملفاً التالية ؟</pluralform>
+<pluralform>هل تريد حقاً حذف الـ %x ملف التالية ؟</pluralform>
+</target>
+
+<source>Copy DACL, SACL, Owner, Group</source>
+<target>نسخ DACL, SACL, Owner, Group</target>
+
+<source>Integrate external applications into context menu. The following macros are available:</source>
+<target>دمج تطبيقات خارجية في قائمة السياق. تتوفر وحدات الماكرو التالية:</target>
+
+<source>Full file or folder path</source>
+<target>المسار الكامل للملف أو المجلد</target>
+
+<source>Parent folder path</source>
+<target>مسار المجلد الحاوي</target>
+
+<source>Temporary local copy for SFTP and MTP storage</source>
+<target>نسخة محلية مؤقتة لتخزين SFTP و MTP</target>
+
+<source>Parameters for opposite side</source>
+<target>معلمات الجانب المعاكس</target>
+
+<source>Show hidden dialogs again</source>
+<target>إظهار التنبهات و نوافذ الحوار المخفية</target>
+
+<source>All dialogs shown</source>
+<target>أظهر جميع مربعات الحوار</target>
+
+<source>Downloading update...</source>
+<target>جار تحميل التحديث...</target>
+
+<source>Identify equal files by comparing modification time and size.</source>
+<target>التعرف على الملفات المتساوية عن طريق مقارنة التاريخ و الحجم.</target>
+
+<source>Identify equal files by comparing the file content.</source>
+<target>التعرف على الملفات المتساوية عن طريق مقارنة محتوى الملف.</target>
+
+<source>Identify equal files by comparing their file size.</source>
+<target>تحديد الملفات المتساوية بمقارنة حجم الملف لها.</target>
+
+<source>Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database.</source>
+<target>تحديد التغيرات و مواكبتها على الجانبين. عمليات الحذف, النقل و المشاكل المكتشفة باستخدام قواعد البيانات.</target>
+
+<source>Create a mirror backup of the left folder by adapting the right folder to match.</source>
+<target>إنشاء نسخة احتياطية من الجانب الأيمن عن طريق تعديل الطرف الأيسر ليطابق الأيمن.</target>
+
+<source>Copy new and updated files to the right folder.</source>
+<target>نسخ الملفات المحدثة إلى المجلد المناسب.</target>
+
+<source>Configure your own synchronization rules.</source>
+<target>تحديد قواعد المزامنة الخاصة بك.</target>
+
+<source>Comparison</source>
+<target>المقارنة</target>
+
+<source>Synchronization</source>
+<target>المزامنة</target>
+
+<source>This week</source>
+<target>هذا الأسبوع</target>
+
+<source>This month</source>
+<target>هذا الشهر</target>
+
+<source>This year</source>
+<target>هذه السنة</target>
+
+<source>Byte</source>
+<target>Byte</target>
+
+<source>KB</source>
+<target>KB</target>
+
+<source>MB</source>
+<target>MB</target>
+
+<source>Retain deleted and overwritten files in the recycle bin</source>
+<target>الاحتفاظ بالملفات المحذوفة والمستبدلة في سلة المهملات</target>
+
+<source>Delete and overwrite files permanently</source>
+<target>حذف واستبدال الملفات نهائيا</target>
+
+<source>Replace</source>
+<target>استبدال</target>
+
+<source>Move files and replace if existing</source>
+<target>نقل الملفات و استبدال الموجودة بها إن وجدت</target>
+
+<source>Time stamp</source>
+<target>البصمة الزمنية</target>
+
+<source>Move files into a time-stamped subfolder</source>
+<target>انقل الملفات الى مجلد فرعى ذو وقت مُوقع</target>
+
+<source>File</source>
+<target>ملف</target>
+
+<source>Append a time stamp to each file name</source>
+<target>إلحاق ختم زمني بكل اسم ملف</target>
+
+<source>On completion:</source>
+<target>عند الانتهاء:</target>
+
+<source>On errors:</source>
+<target>عند حصول أخطاء:</target>
+
+<source>On success:</source>
+<target>عند النجاح:</target>
+
+<source>Main config</source>
+<target>التكوين الرئيسي</target>
+
+<source>empty</source>
+<target>فارغ</target>
+
+<source>Leave as unresolved conflict</source>
+<target>ترك كاختلافات من دون حل</target>
+
+<source>YYYY-MM-DD hhmmss</source>
+<target>YYYY-MM-DD hhmmss</target>
+
+<source>Minimum version count must be smaller than maximum count.</source>
+<target>العد الأدنى من الاصدار لابد وان يكون اقل من العد الأقصى.</target>
+
+<source>Files</source>
+<target>ملفات</target>
+
+<source>Percentage</source>
+<target>النسبة المئوية</target>
+
+<source>Failed to retrieve update information.</source>
+<target>فشل استرداد معلومات التحديث.</target>
+
+<source>Automatic updates:</source>
+<target>التحديثات التلقائية:</target>
+
+<source>Check for Program Updates</source>
+<target>تفقد وجود تحديثات للبرنامج</target>
+
+<source>Auto-update now or download manually from the FreeFileSync home page?</source>
+<target>التحديث التلقائي الآن أو تحميل يدويا من الصفحة الرئيسية لـ FreeFileSync؟</target>
+
+<source>&Auto-update</source>
+<target>&تحديث تلقائي</target>
+
+<source>&Home page</source>
+<target>&الصفحة الرئيسية</target>
+
+<source>Download now?</source>
+<target>تنزيل الآن؟</target>
+
+<source>&Download</source>
+<target>&تنزيل</target>
+
+<source>FreeFileSync is up to date.</source>
+<target>FreeFileSync بأحدث إصدار بالفعل.</target>
+
+<source>Cannot find current FreeFileSync version number online. A newer version is likely available. Check manually now?</source>
+<target>لا يمكن إيجاد رقم النسخة الحالية لـ FreeFileSync عبر الإنترنت. ربما تتوفر نسخة جديدة، هل تريد فعل ذلك يدويا؟</target>
+
+<source>&Check</source>
+<target>&تحقق</target>
+
+<source>Consistency check failed for %x.</source>
+<target>فشل فحص التناسق لـ %x.</target>
+
+<source>Installation was registered on a different operating system.</source>
+<target>تم تسجيل التثبيت على نظام تشغيل مختلف.</target>
+
+<source>Failed to activate FreeFileSync Donation Edition.</source>
+<target>فشل تفعيل FreeFileSync Donation Edition.</target>
+
+<source>Incorrect activation key.</source>
+<target>مفتاح التفعيل غير صحيح.</target>
+
+<source>Unable to register to receive system messages.</source>
+<target>تعذر التسجيل لاستقبال رسائل النظام.</target>
+
+<source>Cannot find system function %x.</source>
+<target>لا يمكن العثور على وظيفة نظام %x.</target>
+
+<source>Unable to register device notifications for %x.</source>
+<target>تعذر تسجيل تنبيهات الجهاز لـ %x.</target>
+
+<source>Cannot monitor directory %x.</source>
+<target>لا يمكن مراقبة المسار %x.</target>
+
+<source>The file is locked by another process:</source>
+<target>الملف مقفول من قبل عملية أخرى:</target>
+
+<source>Cannot read security context of %x.</source>
+<target>لا يمكن قراءة سياق الأمان %x.</target>
+
+<source>Cannot write security context of %x.</source>
+<target>لا يمكن كتابة سياق الأمان %x.</target>
+
+<source>Cannot read permissions of %x.</source>
+<target>لا يمكن قراءة أذونات %x.</target>
+
+<source>Cannot copy permissions from %x to %y.</source>
+<target>لا يمكن نسخ الأذونات من %x إلى %y.</target>
+
+<source>%x is not a regular directory name.</source>
+<target>%x ليس اسم دليل اعتيادي.</target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>لا يمكن نسخ الملف %x إلى %y.</target>
+
+<source>Cannot copy attributes from %x to %y.</source>
+<target>لا يمكن نسخ السمات من %x إلى %y.</target>
+
+<source>%x TB</source>
+<target>‎%x TB</target>
+
+<source>%x PB</source>
+<target>‎%x PB</target>
+
+<source>
+<pluralform>1 min</pluralform>
+<pluralform>%x min</pluralform>
+</source>
+<target>
+<pluralform>0 دقيقة</pluralform>
+<pluralform>1 دقيقة واحدة</pluralform>
+<pluralform>2 دقيقتان</pluralform>
+<pluralform>%x دقائق</pluralform>
+<pluralform>%x دقيقة</pluralform>
+<pluralform>%x دقيقة</pluralform>
+</target>
+
+<source>
+<pluralform>1 hour</pluralform>
+<pluralform>%x hours</pluralform>
+</source>
+<target>
+<pluralform>0 ساعة</pluralform>
+<pluralform>1 ساعة واحدة</pluralform>
+<pluralform>2 ساعتين</pluralform>
+<pluralform>%x ساعات</pluralform>
+<pluralform>%x ساعة</pluralform>
+<pluralform>%x ساعة</pluralform>
+</target>
+
+<source>Cannot set privilege %x.</source>
+<target>لا يمكن تعيين امتيازات %x.</target>
+
+<source>Unable to suspend system sleep mode.</source>
+<target>تعذر تعليق وضع النوم للنظام.</target>
+
+<source>Cannot change process I/O priorities.</source>
+<target>تعذر تغيير أولويات I/O للعملية.</target>
+
+<source>Unable to shut down the system.</source>
+<target>غير فادر على إيقاف تشغيل النظام.</target>
+
+<source>Checking recycle bin failed for folder %x.</source>
+<target>فشل تصفح سلة المهملات من أجل الملف %x.</target>
+
+<source>The following XML elements could not be read:</source>
+<target>عناصر XML التالية لا يمكن قراءتها:</target>
+
+<source>Configuration file %x is incomplete. The missing elements will be set to their default values.</source>
+<target>ملف التكوين %x غير مكتمل. سيتم إعادة تعيين العناصر المفقودة إلى قيمها الافتراضية.</target>
+
+<source>Prepare installation</source>
+<target>الاستعداد للتثبيت</target>
+
+<source>Choose which components you want to install.</source>
+<target>اختر المكونات التي تريد تنصيبها.</target>
+
+<source>Select installation type:</source>
+<target>اختيار نوع التنصيب:</target>
+
+<source>Local</source>
+<target>محلي</target>
+
+<source>Portable</source>
+<target>متنقل</target>
+
+<source>Save settings in %x</source>
+<target>احفظ الاعدادت الى %x</target>
+
+<source>Register FreeFileSync file extensions</source>
+<target>تسجيل امتدادات الملفات لـ FreeFileSync</target>
+
+<source>Create Explorer context menu entries</source>
+<target>إنشاء مدخلات القوائم المحلية في متصفح الملفات</target>
+
+<source>Save settings in installation directory</source>
+<target>احفظ إعدادات التثبيت في مسار التثبيت</target>
+
+<source>Do not write to Registry</source>
+<target>لا تسجل في ملفات الرجيستري</target>
+
+<source>Just copy the files</source>
+<target>انسخ الملفات فقط</target>
+
+<source>Choose a directory for installation:</source>
+<target>اختيار مسار التثبيت:</target>
+
+<source>Create shortcuts:</source>
+<target>إنشاء اختصار:</target>
+
+<source>Desktop</source>
+<target>سطح المكتب</target>
+
+<source>Start Menu</source>
+<target>قائمة البدء</target>
+
+<source>Send To</source>
+<target>ارسال الى</target>
+
+<source>Registering FreeFileSync file extensions</source>
+<target>جار تسجيل امتدادات الملفات لـ FreeFileSync</target>
+
+<source>Unregistering FreeFileSync file extensions</source>
+<target>جار إلغاء تسجيل امتدادات الملفات لـ FreeFileSync</target>
+
+<source>FreeFileSync Configuration</source>
+<target>تضبيطات FreeFileSync</target>
+
+<source>FreeFileSync Batch File</source>
+<target>الملف الدفعي الخاص بـ FreeFileSync</target>
+
+<source>FreeFileSync Synchronization Database</source>
+<target>قاعدة بيانات المزامنة الخاصة بـ FreeFileSync</target>
+
+<source>RealTimeSync Configuration</source>
+<target>تضبيطات RealTimeSync</target>
+
+<source>Edit with FreeFileSync</source>
+<target>تعديل بواسطة FreeFileSync</target>
+
+<source>Instead of an ad, here's an animal.</source>
+<target>بدلاً من الاعلانات، هذا حيوان.</target>
+
+<source>The FreeFileSync portable version cannot install into a subfolder of %x.</source>
+<target>لا يمكن تثبيت النسخة المحمولة من FreeFileSync في مجلد فرعي داخل %x.</target>
+
+<source>Please choose the local installation type or select a different folder for installation.</source>
+<target>الرجاء اختيار نوع التثبيت المحلي أو اختيار مجلد آخر للتثبيت.</target>
+
+<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
+<target>خيار التحميل %x متوفر فقط فى نسخة التبرعات من FreeFileSync.</target>
+
+<source>Get the Donation Edition with bonus features and help keep FreeFileSync ad-free.</source>
+<target>احصل على نسخة التبرعات بالميزات الأضافية وساعد ليكون FreeFileSync خالى من الأعلانات.</target>
+
diff --git a/FreeFileSync/Build/Languages/bulgarian.lng b/FreeFileSync/Build/Languages/bulgarian.lng
index f016e045..7ee65a5c 100755
--- a/FreeFileSync/Build/Languages/bulgarian.lng
+++ b/FreeFileSync/Build/Languages/bulgarian.lng
@@ -115,11 +115,20 @@
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
<target>Инсталационните файлове са повредени. Моля, преинсталирайте FreeFileSync.</target>
+<source>Cannot load file %x.</source>
+<target>Не може да зареди файл %x.</target>
+
<source>Cannot find the following folders:</source>
-<target>Не са намерени следните папки:</target>
+<target>Не може да намери следните папки:</target>
+
+<source>The following folders do not yet exist:</source>
+<target>Следните папки все още не съществуват:</target>
-<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>Ако тази грешка се игнорира, папките се считат празни. Липсващи папки се създават автоматично при нужда.</target>
+<source>The folders are created automatically when needed.</source>
+<target>Папките се създават автоматично, когато потрябват.</target>
+
+<source>Scanning:</source>
+<target>Търси файлове:</target>
<source>Comparison finished:</source>
<target>Сравняването завърши:</target>
@@ -214,6 +223,63 @@
<source>Out of memory.</source>
<target>Недостатъчна памет.</target>
+<source>Database file %x is incompatible.</source>
+<target>Базата данни %x е несъвместима.</target>
+
+<source>Initial synchronization:</source>
+<target>Начална синхронизация:</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>Базата данни %x още не съществува.</target>
+
+<source>Database file is corrupted:</source>
+<target>Базата данни е повредена:</target>
+
+<source>Cannot write file %x.</source>
+<target>Не може да запише файл %x.</target>
+
+<source>Cannot read file %x.</source>
+<target>Не може да прочете файл %x.</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>Базите данни още не съдържат информация за последната синхронизация.</target>
+
+<source>Loading file %x...</source>
+<target>Зарежда файл %x...</target>
+
+<source>Saving file %x...</source>
+<target>Запазва файл %x...</target>
+
+<source>Searching for folder %x...</source>
+<target>Търси папка %x...</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>Изтекло време за търсене на папка %x.</target>
+
+<source>Cannot get process information.</source>
+<target>Не може да получи информация за процеса.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Не може да прочете атрибутите на файл %x.</target>
+
+<source>Waiting while directory is locked:</source>
+<target>Изчаква, докато е заключена директорията:</target>
+
+<source>Lock owner:</source>
+<target>Притежател на заключването:</target>
+
+<source>Detecting abandoned lock...</source>
+<target>Открива изоставено заключване...</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 сек.</pluralform>
+<pluralform>%x сек.</pluralform>
+</target>
+
<source>Item exists on left side only</source>
<target>Елементът съществува само отляво</target>
@@ -268,8 +334,188 @@
<source>Update attributes on right</source>
<target>Актуализирай атрибутите на десния елемент</target>
-<source>Cannot read file %x.</source>
-<target>Не може да прочете файл %x.</target>
+<source>Items processed:</source>
+<target>Обработени елементи:</target>
+
+<source>Items remaining:</source>
+<target>Оставащи елементи:</target>
+
+<source>Total time:</source>
+<target>Общо време:</target>
+
+<source>Cleaning up log files:</source>
+<target>Почистване на log-файловете:</target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>Грешка при анализ на файл %x, ред %y, колона %z.</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>Не може да заключи директориите за следните папки:</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>1 нишка</pluralform>
+<pluralform>%x нишки</pluralform>
+</target>
+
+<source>Cannot read directory %x.</source>
+<target>Не може да прочете директория %x.</target>
+
+<source>/sec</source>
+<target>/сек.</target>
+
+<source>%x items/sec</source>
+<target>%x елем./сек.</target>
+
+<source>Show in Explorer</source>
+<target>Покажи в Експлорера</target>
+
+<source>Open with default application</source>
+<target>Отвори с приложение по подразбиране</target>
+
+<source>Browse directory</source>
+<target>Преглед на директорията</target>
+
+<source>Unable to connect to %x.</source>
+<target>Не може да се свърже със %x.</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>Не може да получи достъп до услуга Volume Shadow Copy.</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>Моля, ползвайте 64-битова FreeFileSync-версия за създаване на shadow-копия на тази система.</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>Не може да определи името на тома за %x.</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>Името на тома %x не е част от пътя до файла %y.</target>
+
+<source>File time and size</source>
+<target>Дата и размер на файла</target>
+
+<source>File content</source>
+<target>Съдържание на файла</target>
+
+<source>File size</source>
+<target>Размер на файла</target>
+
+<source>Two way</source>
+<target>Двупосочно</target>
+
+<source>Mirror</source>
+<target>Огледално</target>
+
+<source>Update</source>
+<target>Актуализирай</target>
+
+<source>Custom</source>
+<target>По избор</target>
+
+<source>Multiple...</source>
+<target>Разни...</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>Не може да запише файловите атрибути на %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Не може да отвори файл %x.</target>
+
+<source>%x and %y have different content.</source>
+<target>%x и %y имат различно съдържание.</target>
+
+<source>Data verification error:</source>
+<target>Грешка при верификация на данните:</target>
+
+<source>Moving file %x to %y</source>
+<target>Премества файл %x към %y</target>
+
+<source>Moving folder %x to %y</source>
+<target>Премества папка %x към %y</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>Премества символна връзка %x към %y</target>
+
+<source>Updating file %x</source>
+<target>Актуализира файл %x</target>
+
+<source>Updating symbolic link %x</source>
+<target>Актуализира символна връзка %x</target>
+
+<source>Verifying file %x</source>
+<target>Верифицира файл %x</target>
+
+<source>Updating attributes of %x</source>
+<target>Актуализира атрибутите на %x</target>
+
+<source>Source item %x not found</source>
+<target>Изходен елемент %x не е намерен</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>Създава се Volume Shadow Copy за %x...</target>
+
+<source>Searching for excess file versions:</source>
+<target>Търси излишни файлови версии:</target>
+
+<source>Removing excess file versions:</source>
+<target>Премахва излишни файлови версии:</target>
+
+<source>Cannot find folder %x.</source>
+<target>Не е намерена папка %x.</target>
+
+<source>Target folder %x already existing.</source>
+<target>Целевата папка %x вече съществува.</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>Полето за целева папка не бива да е празно.</target>
+
+<source>Source folder %x not found.</source>
+<target>Изходната папка %x не е намерена.</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>Моля, въведете целева папка за версии.</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>Следните елементи имат нерешени конфликти и няма да бъдат синхронизирани:</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>Следните папки са съществено различни. Моля, проверете дали са избрани верни папки за синхронизация.</target>
+
+<source>Not enough free disk space available in:</source>
+<target>Недостатъчно свободно дисково пространство в:</target>
+
+<source>Required:</source>
+<target>Необходимо:</target>
+
+<source>Available:</source>
+<target>Налично:</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>Някои файлове ще бъдат синхронизирани като част от повече базови папки.</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>За избягване на конфликти задайте изключващи филтри, тъй че всеки актуализиран файл да се следи само от една базова папка.</target>
+
+<source>Versioning folder:</source>
+<target>Папка за версии:</target>
+
+<source>Base folder:</source>
+<target>Базова папка:</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>Папката за версии се съдържа в основната папка.</target>
+
+<source>Synchronizing folder pair:</source>
+<target>Синхронизация на двойка папки:</target>
+
+<source>Generating database...</source>
+<target>Създава база данни...</target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>Не може да маркира времето на версиите:</target>
<source>
Unexpected size of data stream.
@@ -288,17 +534,14 @@ Actual: %y bytes
<source>Operation not supported for different base folder types.</source>
<target>Операцията не се поддържа за различни типове основни папки.</target>
-<source>Cannot write file %x.</source>
-<target>Не може да запише файл %x.</target>
-
<source>Cannot move file %x to %y.</source>
<target>Не може да премести файл %x в %y.</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>Не може да копира символната връзка %x в %y.</target>
-<source>Unable to connect to %x.</source>
-<target>Не може да се свърже със %x.</target>
+<source>Error Code %x</source>
+<target>Код на грешка %x</target>
<source>Failed to get information about server %x.</source>
<target>Не може да получи информация за сървъра %x.</target>
@@ -306,12 +549,6 @@ Actual: %y bytes
<source>Cannot open directory %x.</source>
<target>Не може да отвори директория %x.</target>
-<source>Cannot read directory %x.</source>
-<target>Не може да прочете директория %x.</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>Не може да прочете атрибутите на файл %x.</target>
-
<source>Cannot create directory %x.</source>
<target>Не може да създаде директория %x.</target>
@@ -339,9 +576,6 @@ Actual: %y bytes
<source>Cannot find device %x.</source>
<target>Не е намерено устройство %x.</target>
-<source>Cannot open file %x.</source>
-<target>Не може да отвори файл %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Типа на елемент %x не се поддържа:</target>
@@ -354,15 +588,9 @@ Actual: %y bytes
<source>Incorrect command line:</source>
<target>Невалиден команден ред:</target>
-<source>Error Code %x</source>
-<target>Код на грешка %x</target>
-
<source>The server does not support authentication via %x.</source>
<target>Сървърът не поддържа идентификация чрез %x.</target>
-<source>Required:</source>
-<target>Необходимо:</target>
-
<source>Unable to access %x.</source>
<target>Няма достъп до %x.</target>
@@ -408,123 +636,9 @@ Actual: %y bytes
<source>%x GB</source>
<target>%x ГБ</target>
-<source>Cannot load file %x.</source>
-<target>Не може да зареди файл %x.</target>
-
-<source>Database file %x is incompatible.</source>
-<target>Базата данни %x е несъвместима.</target>
-
-<source>Initial synchronization:</source>
-<target>Начална синхронизация:</target>
-
-<source>Database file %x does not yet exist.</source>
-<target>Базата данни %x още не съществува.</target>
-
-<source>Database file is corrupted:</source>
-<target>Базата данни е повредена:</target>
-
-<source>The database files do not yet contain information about the last synchronization.</source>
-<target>Базите данни още не съдържат информация за последната синхронизация.</target>
-
-<source>Loading file %x...</source>
-<target>Зарежда файл %x...</target>
-
-<source>Saving file %x...</source>
-<target>Запазва файл %x...</target>
-
-<source>Searching for folder %x...</source>
-<target>Търси папка %x...</target>
-
-<source>Timeout while searching for folder %x.</source>
-<target>Изтекло време за търсене на папка %x.</target>
-
-<source>Cannot get process information.</source>
-<target>Не може да получи информация за процеса.</target>
-
-<source>Waiting while directory is locked:</source>
-<target>Изчаква, докато е заключена директорията:</target>
-
-<source>Lock owner:</source>
-<target>Притежател на заключването:</target>
-
-<source>Detecting abandoned lock...</source>
-<target>Открива изоставено заключване...</target>
-
-<source>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</source>
-<target>
-<pluralform>1 сек.</pluralform>
-<pluralform>%x сек.</pluralform>
-</target>
-
-<source>Items processed:</source>
-<target>Обработени елементи:</target>
-
-<source>Items remaining:</source>
-<target>Оставащи елементи:</target>
-
-<source>Total time:</source>
-<target>Общо време:</target>
-
-<source>Cleaning up old log files...</source>
-<target>Изчиства старите протоколни файлове...</target>
-
-<source>Error parsing file %x, row %y, column %z.</source>
-<target>Грешка при анализ на файл %x, ред %y, колона %z.</target>
-
-<source>Cannot set directory locks for the following folders:</source>
-<target>Не може да заключи директориите за следните папки:</target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-<pluralform>1 нишка</pluralform>
-<pluralform>%x нишки</pluralform>
-</target>
-
-<source>Scanning:</source>
-<target>Търси файлове:</target>
-
-<source>/sec</source>
-<target>/сек.</target>
-
-<source>%x items/sec</source>
-<target>%x елем./сек.</target>
-
-<source>Show in Explorer</source>
-<target>Покажи в Експлорера</target>
-
-<source>Open with default application</source>
-<target>Отвори с приложение по подразбиране</target>
-
-<source>Browse directory</source>
-<target>Преглед на директорията</target>
-
-<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>Не може да получи достъп до услуга Volume Shadow Copy.</target>
-
-<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>Моля, ползвайте 64-битова FreeFileSync-версия за създаване на shadow-копия на тази система.</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>Не може да определи името на тома за %x.</target>
-
-<source>Volume name %x is not part of file path %y.</source>
-<target>Името на тома %x не е част от пътя до файла %y.</target>
-
-<source>Unable to create time stamp for versioning:</source>
-<target>Не може да отбележи времето на версификация:</target>
-
<source>Drag && drop</source>
<target>Влачете и пуснете</target>
-<source>Cannot find folder %x.</source>
-<target>Не е намерена папка %x.</target>
-
<source>Select a folder</source>
<target>Изберете папка</target>
@@ -620,8 +734,8 @@ The command is triggered if:
<source>Directory monitoring active</source>
<target>Следенето на директории е активирано</target>
-<source>Waiting until all directories are available...</source>
-<target>Изчаква достъпност на всички директории...</target>
+<source>Waiting until directory is available:</source>
+<target>Изчаква достъп до директорията:</target>
<source>&Restore</source>
<target>&Възстановяване</target>
@@ -635,114 +749,6 @@ The command is triggered if:
<source>&Retry</source>
<target>&Повтори</target>
-<source>File time and size</source>
-<target>Дата и размер на файла</target>
-
-<source>File content</source>
-<target>Съдържание на файла</target>
-
-<source>File size</source>
-<target>Размер на файла</target>
-
-<source>Two way</source>
-<target>Двупосочно</target>
-
-<source>Mirror</source>
-<target>Огледално</target>
-
-<source>Update</source>
-<target>Актуализирай</target>
-
-<source>Custom</source>
-<target>По избор</target>
-
-<source>Multiple...</source>
-<target>Разни...</target>
-
-<source>Cannot write file attributes of %x.</source>
-<target>Не може да запише файловите атрибути на %x.</target>
-
-<source>%x and %y have different content.</source>
-<target>%x и %y имат различно съдържание.</target>
-
-<source>Data verification error:</source>
-<target>Грешка при верификация на данните:</target>
-
-<source>Moving file %x to %y</source>
-<target>Премества файл %x към %y</target>
-
-<source>Moving folder %x to %y</source>
-<target>Премества папка %x към %y</target>
-
-<source>Moving symbolic link %x to %y</source>
-<target>Премества символна връзка %x към %y</target>
-
-<source>Removing old versions...</source>
-<target>Премахва стари версии...</target>
-
-<source>Updating file %x</source>
-<target>Актуализира файл %x</target>
-
-<source>Updating symbolic link %x</source>
-<target>Актуализира символна връзка %x</target>
-
-<source>Verifying file %x</source>
-<target>Верифицира файл %x</target>
-
-<source>Updating attributes of %x</source>
-<target>Актуализира атрибутите на %x</target>
-
-<source>Source item %x not found</source>
-<target>Изходен елемент %x не е намерен</target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>Създава се Volume Shadow Copy за %x...</target>
-
-<source>Target folder %x already existing.</source>
-<target>Целевата папка %x вече съществува.</target>
-
-<source>Target folder input field must not be empty.</source>
-<target>Полето за целева папка не бива да е празно.</target>
-
-<source>Source folder %x not found.</source>
-<target>Изходната папка %x не е намерена.</target>
-
-<source>Please enter a target folder for versioning.</source>
-<target>Моля, въведете целева папка за версификация.</target>
-
-<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>Следните елементи имат нерешени конфликти и няма да бъдат синхронизирани:</target>
-
-<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>Следните папки са съществено различни. Моля, проверете дали са избрани верните папки за синхронизация.</target>
-
-<source>Not enough free disk space available in:</source>
-<target>Недостатъчно свободно дисково пространство в:</target>
-
-<source>Available:</source>
-<target>Налично:</target>
-
-<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>Някои файлове ще бъдат синхронизирани като част от повече базови папки.</target>
-
-<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>За избягване на конфликти задайте изключващи филтри, тъй че всеки актуализиран файл да се следи само от една базова папка.</target>
-
-<source>Versioning folder:</source>
-<target>Папка за версии:</target>
-
-<source>Base folder:</source>
-<target>Базова папка:</target>
-
-<source>The versioning folder is contained in a base folder.</source>
-<target>Папката за версии се съдържа в основната папка.</target>
-
-<source>Synchronizing folder pair:</source>
-<target>Синхронизация на двойка папки:</target>
-
-<source>Generating database...</source>
-<target>Създава база данни...</target>
-
<source>Loading...</source>
<target>Зареждане...</target>
@@ -888,7 +894,7 @@ The command is triggered if:
<target>Моля, изберете папка от локална файлова система, мрежа или MTP-устройство.</target>
<source>Defined by context of use</source>
-<target></target>
+<target>Определя се от контекста на употреба</target>
<source>Requires FreeFileSync Donation Edition</source>
<target>Изисква FreeFileSync Дарителско Издание</target>
@@ -1061,8 +1067,8 @@ The command is triggered if:
<source>Show examples</source>
<target>Примери</target>
-<source>Time span:</source>
-<target>Интервал време:</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>Изберете филтърни правила за изключване някои файлове от синхронизация. Въведете относителни файлови пътища към съответните двойки папки.</target>
<source>File size:</source>
<target>Размер на файла:</target>
@@ -1073,8 +1079,8 @@ The command is triggered if:
<source>Maximum:</source>
<target>Максимум:</target>
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target>Изберете филтърни правила за изключване някои файлове от синхронизация. Въведете относителни файлови пътища към съответните двойки папки.</target>
+<source>Time span:</source>
+<target>Интервал време:</target>
<source>C&lear</source>
<target>И&зчисти</target>
@@ -1103,11 +1109,20 @@ The command is triggered if:
<target>&Необратимо</target>
<source>&Versioning</source>
-<target>&Версифициране</target>
+<target>&Версии</target>
+
+<source>Move files to a user-defined folder</source>
+<target>Премести файловете в зададена потребителска папка</target>
<source>Naming convention:</source>
<target>Конвенция за именуване:</target>
+<source>Limit file versions:</source>
+<target>Ограничи файловите версии:</target>
+
+<source>Last x days:</source>
+<target>Последните x дни:</target>
+
<source>Ignore errors</source>
<target>Игнорирай грешките</target>
@@ -1249,11 +1264,8 @@ The command is triggered if:
<source>Save log:</source>
<target>Запази протокол:</target>
-<source>Limit:</source>
-<target>Ограничи:</target>
-
-<source>Limit maximum number of log files</source>
-<target>Ограничи максималния брой протоколни файлове</target>
+<source>Limit number of log files:</source>
+<target>Ограничи броя протоколни файлове:</target>
<source>How can I schedule a batch job?</source>
<target>Как да планирам пакетна задача?</target>
@@ -1288,9 +1300,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Transfer file and folder permissions.</source>
<target>Прехвърли правата за достъп на файла и папката.</target>
-<source>Show hidden dialogs again</source>
-<target>Покажи скритите диалози отново</target>
-
<source>Show all permanently hidden dialogs and warning messages again</source>
<target>Покажи всички постоянно скрити диалози и предупреждения отново</target>
@@ -1381,9 +1390,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Select Time Span</source>
<target>Избор на Интервал Време</target>
-<source>FreeFileSync Donation Edition</source>
-<target>FreeFileSync Дарителско Издание</target>
-
<source>Highlight Configurations</source>
<target>Маркирай Конфигурациите</target>
@@ -1507,6 +1513,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Select time span...</source>
<target>Избор на времеви интервал...</target>
+<source>Donation Edition</source>
+<target>Дарителско Издание</target>
+
<source>Folder Comparison and Synchronization</source>
<target>Сравняване и синхронизация на папки</target>
@@ -1705,6 +1714,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Parameters for opposite side</source>
<target>Параметри за срещуположната страна</target>
+<source>Show hidden dialogs again</source>
+<target>Покажи отново скритите диалози</target>
+
+<source>All dialogs shown</source>
+<target>Всички диалози са показани</target>
+
<source>Downloading update...</source>
<target>Сваляне на актуализация...</target>
@@ -1744,9 +1759,6 @@ This guarantees a consistent state even in case of a serious error.
<source>This year</source>
<target>Тази година</target>
-<source>Last x days</source>
-<target>Последните x дена</target>
-
<source>Byte</source>
<target>Байта</target>
@@ -1762,9 +1774,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Delete and overwrite files permanently</source>
<target>Изтрий и презапиши файловете</target>
-<source>Move files to a user-defined folder</source>
-<target>Премести файловете в зададена потребителска папка</target>
-
<source>Replace</source>
<target>Замени</target>
@@ -1774,6 +1783,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Time stamp</source>
<target>Отбележи времето</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>Премести файловете в маркирана по време подпапка</target>
+
+<source>File</source>
+<target>Файл</target>
+
<source>Append a time stamp to each file name</source>
<target>Добави времето към името на всеки файл</target>
@@ -1795,12 +1810,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Leave as unresolved conflict</source>
<target>Остави като нерешен конфликт</target>
-<source>File</source>
-<target>Файл</target>
-
<source>YYYY-MM-DD hhmmss</source>
<target>ГГГГ-ММ-ДД ччммсс</target>
+<source>Minimum version count must be smaller than maximum count.</source>
+<target>Минималния брой версии трябва да е по-малък от максималния.</target>
+
<source>Files</source>
<target>Файлове</target>
@@ -1814,10 +1829,10 @@ This guarantees a consistent state even in case of a serious error.
<target>Автоматично актуализиране:</target>
<source>Check for Program Updates</source>
-<target>Проверка за нова версия на програмата</target>
+<target>Проверка за обновления на програмата</target>
<source>Auto-update now or download manually from the FreeFileSync home page?</source>
-<target>Автоматично актуализиране сега или ръчно сваляне от домашната страница на FreeFileSync?</target>
+<target>Автоматично обновяване сега или ръчно сваляне от домашната страница на FreeFileSync?</target>
<source>&Auto-update</source>
<target>&Автоматично</target>
@@ -1835,7 +1850,7 @@ This guarantees a consistent state even in case of a serious error.
<target>FreeFileSync вече е актуална.</target>
<source>Cannot find current FreeFileSync version number online. A newer version is likely available. Check manually now?</source>
-<target>Онлайн-номера на текущата FreeFileSync-версия не е открит. Изглежда има по-нова версия. Ще опитате ли ръчно?</target>
+<target>Не открива онлайн номера на текущата FreeFileSync-версия. Изглежда има по-нова версия. Ще опитате ли ръчно?</target>
<source>&Check</source>
<target>&Опитай</target>
@@ -1948,8 +1963,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Portable</source>
<target>Преносима</target>
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>Запази настройките в "%APPDATA%\FreeFileSync"</target>
+<source>Save settings in %x</source>
+<target>Запази настройките в %x</target>
<source>Register FreeFileSync file extensions</source>
<target>Регистрирай файлови разширения за FreeFileSync</target>
diff --git a/FreeFileSync/Build/Languages/chinese_simple.lng b/FreeFileSync/Build/Languages/chinese_simple.lng
index 4bef3554..223d2b7d 100755
--- a/FreeFileSync/Build/Languages/chinese_simple.lng
+++ b/FreeFileSync/Build/Languages/chinese_simple.lng
@@ -115,11 +115,20 @@
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
<target>安装文件已损坏, 请重新安装FreeFileSync.</target>
+<source>Cannot load file %x.</source>
+<target>不能载入文件 %x.</target>
+
<source>Cannot find the following folders:</source>
<target>无法找到如下文件夹:</target>
-<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>如果这个错误被忽略, 文件夹将被认为是空的. 当有必要时丢失的 文件夹将会被创建.</target>
+<source>The following folders do not yet exist:</source>
+<target>如下文件夹还未存在:</target>
+
+<source>The folders are created automatically when needed.</source>
+<target>当有需要时, 此文件夹会自动创建.</target>
+
+<source>Scanning:</source>
+<target>扫描中:</target>
<source>Comparison finished:</source>
<target>比较已完成:</target>
@@ -213,6 +222,62 @@
<source>Out of memory.</source>
<target>内存不足.</target>
+<source>Database file %x is incompatible.</source>
+<target>数据库文件 %x 不兼容.</target>
+
+<source>Initial synchronization:</source>
+<target>初始化同步:</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>数据库文件 %x 还未存在.</target>
+
+<source>Database file is corrupted:</source>
+<target>数据库文件已损坏:</target>
+
+<source>Cannot write file %x.</source>
+<target>无法写入文件 %x .</target>
+
+<source>Cannot read file %x.</source>
+<target>无法读取文件 %x .</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>此数据库文件并未包含 有关最后同步的信息.</target>
+
+<source>Loading file %x...</source>
+<target>正在加载文件 %x...</target>
+
+<source>Saving file %x...</source>
+<target>正在保存文件 %x...</target>
+
+<source>Searching for folder %x...</source>
+<target>正在搜索文件夹 %x...</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>搜索文件夹 %x 超时.</target>
+
+<source>Cannot get process information.</source>
+<target>无法取得进程信息.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>无法读取 %x 的文件属性.</target>
+
+<source>Waiting while directory is locked:</source>
+<target>正在等待因目录被锁定:</target>
+
+<source>Lock owner:</source>
+<target>锁定的所有者:</target>
+
+<source>Detecting abandoned lock...</source>
+<target>正在检测被遗弃的锁定...</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>%x 秒</pluralform>
+</target>
+
<source>Item exists on left side only</source>
<target>项目仅存在于左侧</target>
@@ -267,8 +332,187 @@
<source>Update attributes on right</source>
<target>更新右侧的文件属性</target>
-<source>Cannot read file %x.</source>
-<target>无法读取文件 %x .</target>
+<source>Items processed:</source>
+<target>已处理的项目:</target>
+
+<source>Items remaining:</source>
+<target>剩余的项目:</target>
+
+<source>Total time:</source>
+<target>总共时间:</target>
+
+<source>Cleaning up log files:</source>
+<target>正在清理日志文件:</target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>当分析文件 %x , 行 %y, 列 %z 时出错.</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>无法为如下文件夹设置 目录锁定:</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>%x 线程</pluralform>
+</target>
+
+<source>Cannot read directory %x.</source>
+<target>无法读取目录 %x.</target>
+
+<source>/sec</source>
+<target>/秒</target>
+
+<source>%x items/sec</source>
+<target>%x 个项目/秒</target>
+
+<source>Show in Explorer</source>
+<target>在Explorer中显示</target>
+
+<source>Open with default application</source>
+<target>用默认应用软件打开</target>
+
+<source>Browse directory</source>
+<target>浏览目录</target>
+
+<source>Unable to connect to %x.</source>
+<target>无法连接到 %x.</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>无法访问卷影复制服务.</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>请运行 FreeFileSync 的64位版本来在此系统上创建卷影.</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>无法为 %x 确定卷名.</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>卷名 %x 不是文件路径 %y 的一部分.</target>
+
+<source>File time and size</source>
+<target>文件时间和大小</target>
+
+<source>File content</source>
+<target>文件内容</target>
+
+<source>File size</source>
+<target>文件大小</target>
+
+<source>Two way</source>
+<target>双向</target>
+
+<source>Mirror</source>
+<target>镜像</target>
+
+<source>Update</source>
+<target>更新</target>
+
+<source>Custom</source>
+<target>自定义</target>
+
+<source>Multiple...</source>
+<target>并联...</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>无法写入 %x 的文件属性.</target>
+
+<source>Cannot open file %x.</source>
+<target>无法打开文件 %x.</target>
+
+<source>%x and %y have different content.</source>
+<target>%x 和 %y 有着不同的内容.</target>
+
+<source>Data verification error:</source>
+<target>数据校验出错:</target>
+
+<source>Moving file %x to %y</source>
+<target>正在移动文件 %x 到 %y</target>
+
+<source>Moving folder %x to %y</source>
+<target>正在移动文件夹 %x 到 %y</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>正在移动符号连接 %x 到 %y</target>
+
+<source>Updating file %x</source>
+<target>正在更新文件 %x</target>
+
+<source>Updating symbolic link %x</source>
+<target>正在更新符号连接 %x</target>
+
+<source>Verifying file %x</source>
+<target>正在校验文件 %x</target>
+
+<source>Updating attributes of %x</source>
+<target>正在更新 %x 的属性</target>
+
+<source>Source item %x not found</source>
+<target>来源项目 %x 未找到</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>正在为 %x 创建一个卷影副本...</target>
+
+<source>Cannot find folder %x.</source>
+<target>无法找到文件夹 %x.</target>
+
+<source>Target folder %x already existing.</source>
+<target>目标文件夹 %x 已经存在.</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>目标文件夹输入框必须不为空.</target>
+
+<source>Source folder %x not found.</source>
+<target>无法找到源文件夹 %x.</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>请输入一个用于保存历史版本的目标文件夹.</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>如下项目有无法解决的冲突并将不会被同步:</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>如下的文件夹有显著不同. 请检查是否选择了正确 的文件夹来进行同步.</target>
+
+<source>Not enough free disk space available in:</source>
+<target>没有足够的可用磁盘空间:</target>
+
+<source>Required:</source>
+<target>必需:</target>
+
+<source>Available:</source>
+<target>可用:</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>某些文件将作为多个基础文件夹 的一部分被同步.</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>为了避免冲突, 请设置排除过滤器, 以便每个已更新的文件 仅被一个基础文件夹所考虑.</target>
+
+<source>Versioning folder:</source>
+<target>历史版本文件夹:</target>
+
+<source>Base folder:</source>
+<target>基础文件夹:</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>历史版本文件夹被包含 在一个基础文件夹中.</target>
+
+<source>Synchronizing folder pair:</source>
+<target>正在同步成对的文件夹:</target>
+
+<source>Generating database...</source>
+<target>正在生成数据库...</target>
+
+<source>Searching for excess file versions:</source>
+<target>正在搜索多余的文件版本:</target>
+
+<source>Removing excess file versions:</source>
+<target>正在删除多余的文件版本:</target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>无法为历史版本创建时间戳:</target>
<source>
Unexpected size of data stream.
@@ -287,17 +531,14 @@ Actual: %y bytes
<source>Operation not supported for different base folder types.</source>
<target>对于不同基础文件夹类型 此操作不被支持.</target>
-<source>Cannot write file %x.</source>
-<target>无法写入文件 %x .</target>
-
<source>Cannot move file %x to %y.</source>
<target>无法移动文件 %x 到 %y.</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>无法复制符号连接 %x 到 %y.</target>
-<source>Unable to connect to %x.</source>
-<target>无法连接到 %x.</target>
+<source>Error Code %x</source>
+<target>错误代码 %x</target>
<source>Failed to get information about server %x.</source>
<target>获取关于服务器 %x 的信息时失败.</target>
@@ -305,12 +546,6 @@ Actual: %y bytes
<source>Cannot open directory %x.</source>
<target>无法打开目录 %x.</target>
-<source>Cannot read directory %x.</source>
-<target>无法读取目录 %x.</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>无法读取 %x 的文件属性.</target>
-
<source>Cannot create directory %x.</source>
<target>无法创建目录 %x.</target>
@@ -338,9 +573,6 @@ Actual: %y bytes
<source>Cannot find device %x.</source>
<target>无法找到设备 %x.</target>
-<source>Cannot open file %x.</source>
-<target>无法打开文件 %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>项目 %x 的类型不被支持:</target>
@@ -353,15 +585,9 @@ Actual: %y bytes
<source>Incorrect command line:</source>
<target>不正确的命令行:</target>
-<source>Error Code %x</source>
-<target>错误代码 %x</target>
-
<source>The server does not support authentication via %x.</source>
<target>此服务器并不支持通过 %x 进行认证.</target>
-<source>Required:</source>
-<target>必需:</target>
-
<source>Unable to access %x.</source>
<target>无法访问 %x.</target>
@@ -404,121 +630,9 @@ Actual: %y bytes
<source>%x GB</source>
<target>%x GB</target>
-<source>Cannot load file %x.</source>
-<target>不能载入文件 %x.</target>
-
-<source>Database file %x is incompatible.</source>
-<target>数据库文件 %x 不兼容.</target>
-
-<source>Initial synchronization:</source>
-<target>初始化同步:</target>
-
-<source>Database file %x does not yet exist.</source>
-<target>数据库文件 %x 还未存在.</target>
-
-<source>Database file is corrupted:</source>
-<target>数据库文件已损坏:</target>
-
-<source>The database files do not yet contain information about the last synchronization.</source>
-<target>此数据库文件并未包含 有关最后同步的信息.</target>
-
-<source>Loading file %x...</source>
-<target>正在加载文件 %x...</target>
-
-<source>Saving file %x...</source>
-<target>正在保存文件 %x...</target>
-
-<source>Searching for folder %x...</source>
-<target>正在搜索文件夹 %x...</target>
-
-<source>Timeout while searching for folder %x.</source>
-<target>搜索文件夹 %x 超时.</target>
-
-<source>Cannot get process information.</source>
-<target>无法取得进程信息.</target>
-
-<source>Waiting while directory is locked:</source>
-<target>正在等待因目录被锁定:</target>
-
-<source>Lock owner:</source>
-<target>锁定的所有者:</target>
-
-<source>Detecting abandoned lock...</source>
-<target>正在检测被遗弃的锁定...</target>
-
-<source>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</source>
-<target>
-<pluralform>%x 秒</pluralform>
-</target>
-
-<source>Items processed:</source>
-<target>已处理的项目:</target>
-
-<source>Items remaining:</source>
-<target>剩余的项目:</target>
-
-<source>Total time:</source>
-<target>总共时间:</target>
-
-<source>Cleaning up old log files...</source>
-<target>正在清理旧日志文件...</target>
-
-<source>Error parsing file %x, row %y, column %z.</source>
-<target>当分析文件 %x , 行 %y, 列 %z 时出错.</target>
-
-<source>Cannot set directory locks for the following folders:</source>
-<target>无法为如下文件夹设置 目录锁定:</target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-<pluralform>%x 线程</pluralform>
-</target>
-
-<source>Scanning:</source>
-<target>扫描中:</target>
-
-<source>/sec</source>
-<target>/秒</target>
-
-<source>%x items/sec</source>
-<target>%x 个项目/秒</target>
-
-<source>Show in Explorer</source>
-<target>在Explorer中显示</target>
-
-<source>Open with default application</source>
-<target>用默认应用软件打开</target>
-
-<source>Browse directory</source>
-<target>浏览目录</target>
-
-<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>无法访问卷影复制服务.</target>
-
-<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>请运行 FreeFileSync 的64位版本来在此系统上创建卷影.</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>无法为 %x 确定卷名.</target>
-
-<source>Volume name %x is not part of file path %y.</source>
-<target>卷名 %x 不是文件路径 %y 的一部分.</target>
-
-<source>Unable to create time stamp for versioning:</source>
-<target>无法为历史版本创建时间戳:</target>
-
<source>Drag && drop</source>
<target>拖放</target>
-<source>Cannot find folder %x.</source>
-<target>无法找到文件夹 %x.</target>
-
<source>Select a folder</source>
<target>选择一个文件夹</target>
@@ -614,8 +728,8 @@ The command is triggered if:
<source>Directory monitoring active</source>
<target>目录监视激活</target>
-<source>Waiting until all directories are available...</source>
-<target>正在等待直到所有目录都可用...</target>
+<source>Waiting until directory is available:</source>
+<target>等待直到目录可用:</target>
<source>&Restore</source>
<target>恢复(&R)</target>
@@ -629,114 +743,6 @@ The command is triggered if:
<source>&Retry</source>
<target>重试(&R)</target>
-<source>File time and size</source>
-<target>文件时间和大小</target>
-
-<source>File content</source>
-<target>文件内容</target>
-
-<source>File size</source>
-<target>文件大小</target>
-
-<source>Two way</source>
-<target>双向</target>
-
-<source>Mirror</source>
-<target>镜像</target>
-
-<source>Update</source>
-<target>更新</target>
-
-<source>Custom</source>
-<target>自定义</target>
-
-<source>Multiple...</source>
-<target>并联...</target>
-
-<source>Cannot write file attributes of %x.</source>
-<target>无法写入 %x 的文件属性.</target>
-
-<source>%x and %y have different content.</source>
-<target>%x 和 %y 有着不同的内容.</target>
-
-<source>Data verification error:</source>
-<target>数据校验出错:</target>
-
-<source>Moving file %x to %y</source>
-<target>正在移动文件 %x 到 %y</target>
-
-<source>Moving folder %x to %y</source>
-<target>正在移动文件夹 %x 到 %y</target>
-
-<source>Moving symbolic link %x to %y</source>
-<target>正在移动符号连接 %x 到 %y</target>
-
-<source>Removing old versions...</source>
-<target>正在移除旧版本...</target>
-
-<source>Updating file %x</source>
-<target>正在更新文件 %x</target>
-
-<source>Updating symbolic link %x</source>
-<target>正在更新符号连接 %x</target>
-
-<source>Verifying file %x</source>
-<target>正在校验文件 %x</target>
-
-<source>Updating attributes of %x</source>
-<target>正在更新 %x 的属性</target>
-
-<source>Source item %x not found</source>
-<target>来源项目 %x 未找到</target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>正在为 %x 创建一个卷影副本...</target>
-
-<source>Target folder %x already existing.</source>
-<target>目标文件夹 %x 已经存在.</target>
-
-<source>Target folder input field must not be empty.</source>
-<target>目标文件夹输入框必须不为空.</target>
-
-<source>Source folder %x not found.</source>
-<target>无法找到源文件夹 %x.</target>
-
-<source>Please enter a target folder for versioning.</source>
-<target>请输入一个用于保存历史版本的目标文件夹.</target>
-
-<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>如下项目有无法解决的冲突并将不会被同步:</target>
-
-<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>如下的文件夹有显著不同. 请检查是否选择了正确 的文件夹来进行同步.</target>
-
-<source>Not enough free disk space available in:</source>
-<target>没有足够的可用磁盘空间:</target>
-
-<source>Available:</source>
-<target>可用:</target>
-
-<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>某些文件将作为多个基础文件夹 的一部分被同步.</target>
-
-<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>为了避免冲突, 请设置排除过滤器, 以便每个已更新的文件 仅被一个基础文件夹所考虑.</target>
-
-<source>Versioning folder:</source>
-<target>历史版本文件夹:</target>
-
-<source>Base folder:</source>
-<target>基础文件夹:</target>
-
-<source>The versioning folder is contained in a base folder.</source>
-<target>历史版本文件夹被包含 在一个基础文件夹中.</target>
-
-<source>Synchronizing folder pair:</source>
-<target>正在同步成对的文件夹:</target>
-
-<source>Generating database...</source>
-<target>正在生成数据库...</target>
-
<source>Loading...</source>
<target>正在载入...</target>
@@ -881,7 +887,7 @@ The command is triggered if:
<target>请选择在本地文件系统, 网络或MTP设备上的文件夹.</target>
<source>Defined by context of use</source>
-<target></target>
+<target>依使用环境定义</target>
<source>Requires FreeFileSync Donation Edition</source>
<target>需要FreeFileSync捐赠版</target>
@@ -1054,8 +1060,8 @@ The command is triggered if:
<source>Show examples</source>
<target>显示范例</target>
-<source>Time span:</source>
-<target>时间跨度:</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>选择过滤器规则以将某些文件 从同步中排除. 输入与相应的文件夹对相关的 文件路径.</target>
<source>File size:</source>
<target>文件大小:</target>
@@ -1066,8 +1072,8 @@ The command is triggered if:
<source>Maximum:</source>
<target>最大:</target>
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target>选择过滤器规则以将某些文件 从同步中排除. 输入与相应的文件夹对相关的 文件路径.</target>
+<source>Time span:</source>
+<target>时间跨度:</target>
<source>C&lear</source>
<target>清除(&L)</target>
@@ -1098,9 +1104,18 @@ The command is triggered if:
<source>&Versioning</source>
<target>历史版本(&V)</target>
+<source>Move files to a user-defined folder</source>
+<target>移动文件到一个用户定义的文件夹</target>
+
<source>Naming convention:</source>
<target>命名规则:</target>
+<source>Limit file versions:</source>
+<target>限制文件历史版本数:</target>
+
+<source>Last x days:</source>
+<target>最近 x 天:</target>
+
<source>Ignore errors</source>
<target>忽略错误</target>
@@ -1242,11 +1257,8 @@ The command is triggered if:
<source>Save log:</source>
<target>保存日志:</target>
-<source>Limit:</source>
-<target>限制:</target>
-
-<source>Limit maximum number of log files</source>
-<target>限制日志文件的量大个数</target>
+<source>Limit number of log files:</source>
+<target>限制日志文件数量:</target>
<source>How can I schedule a batch job?</source>
<target>我如何计划一个批处理作业?</target>
@@ -1278,9 +1290,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Transfer file and folder permissions.</source>
<target>传输文件及文件夹的权限.</target>
-<source>Show hidden dialogs again</source>
-<target>重新显示被隐藏的对话框</target>
-
<source>Show all permanently hidden dialogs and warning messages again</source>
<target>重新显示所有被永久性隐藏的 对话框和警告信息</target>
@@ -1371,9 +1380,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Select Time Span</source>
<target>选择时间跨度</target>
-<source>FreeFileSync Donation Edition</source>
-<target>FreeFileSync捐赠版</target>
-
<source>Highlight Configurations</source>
<target>突出显示配置文件</target>
@@ -1493,6 +1499,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Select time span...</source>
<target>选择时间跨度...</target>
+<source>Donation Edition</source>
+<target>捐赠版本</target>
+
<source>Folder Comparison and Synchronization</source>
<target>文件夹比较与同步</target>
@@ -1688,6 +1697,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Parameters for opposite side</source>
<target>用于对侧的参数</target>
+<source>Show hidden dialogs again</source>
+<target>重新显示被隐藏的对话框</target>
+
+<source>All dialogs shown</source>
+<target>所有对话框已显示</target>
+
<source>Downloading update...</source>
<target>正在下载更新...</target>
@@ -1727,9 +1742,6 @@ This guarantees a consistent state even in case of a serious error.
<source>This year</source>
<target>今年</target>
-<source>Last x days</source>
-<target>最后 x 天</target>
-
<source>Byte</source>
<target>字节</target>
@@ -1745,9 +1757,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Delete and overwrite files permanently</source>
<target>永久性删除和覆盖文件</target>
-<source>Move files to a user-defined folder</source>
-<target>移动文件到一个用户定义的文件夹</target>
-
<source>Replace</source>
<target>替换</target>
@@ -1757,6 +1766,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Time stamp</source>
<target>时间戳</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>移动文件到时间戳子文件夹</target>
+
+<source>File</source>
+<target>文件</target>
+
<source>Append a time stamp to each file name</source>
<target>添加一个时间戳到每个文件名</target>
@@ -1778,12 +1793,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Leave as unresolved conflict</source>
<target>遗留为未解决的冲突</target>
-<source>File</source>
-<target>文件</target>
-
<source>YYYY-MM-DD hhmmss</source>
<target>YYYY-MM-DD hhmmss</target>
+<source>Minimum version count must be smaller than maximum count.</source>
+<target>最小版本计数必须小于最大计数.</target>
+
<source>Files</source>
<target>文件</target>
@@ -1929,8 +1944,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Portable</source>
<target>便携</target>
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>保存设置到 "%APPDATA%\FreeFileSync"</target>
+<source>Save settings in %x</source>
+<target>在 %x 中保存设置</target>
<source>Register FreeFileSync file extensions</source>
<target>注册 FreeFileSync 文件关联</target>
diff --git a/FreeFileSync/Build/Languages/chinese_traditional.lng b/FreeFileSync/Build/Languages/chinese_traditional.lng
index 6550e726..c93a07a5 100755
--- a/FreeFileSync/Build/Languages/chinese_traditional.lng
+++ b/FreeFileSync/Build/Languages/chinese_traditional.lng
@@ -115,11 +115,20 @@
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
<target>安裝檔已損壞。請重新安裝FreeFileSync。</target>
+<source>Cannot load file %x.</source>
+<target>無法載入檔案 %x。</target>
+
<source>Cannot find the following folders:</source>
<target>找不到下列資料夾:</target>
-<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>如果忽略此錯誤的資料夾將視為空的。在需要時會自動建立缺少的資料夾。</target>
+<source>The following folders do not yet exist:</source>
+<target>下列資料夾不存在:</target>
+
+<source>The folders are created automatically when needed.</source>
+<target>這些資料夾是在需要時自動建立的。</target>
+
+<source>Scanning:</source>
+<target>正在掃瞄:</target>
<source>Comparison finished:</source>
<target>比對完成:</target>
@@ -213,6 +222,62 @@
<source>Out of memory.</source>
<target>記憶體不足。</target>
+<source>Database file %x is incompatible.</source>
+<target>資料庫檔案 %x 不相容。</target>
+
+<source>Initial synchronization:</source>
+<target>初始化同步:</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>資料庫檔案 %x 不存在。</target>
+
+<source>Database file is corrupted:</source>
+<target>資料庫檔案已損壞:</target>
+
+<source>Cannot write file %x.</source>
+<target>無法寫入檔案 %x。</target>
+
+<source>Cannot read file %x.</source>
+<target>無法讀取檔案 %x。</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>資料庫檔案尚未包含關於上次同步資訊。</target>
+
+<source>Loading file %x...</source>
+<target>正在讀取檔案 %x…</target>
+
+<source>Saving file %x...</source>
+<target>正在儲存檔案 %x…</target>
+
+<source>Searching for folder %x...</source>
+<target>正在搜尋資料夾 %x…</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>搜尋資料夾 %x 時超時。</target>
+
+<source>Cannot get process information.</source>
+<target>無法取得處理訊息。</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>無法讀取 %x 的檔案屬性。</target>
+
+<source>Waiting while directory is locked:</source>
+<target>等待目錄被鎖定:</target>
+
+<source>Lock owner:</source>
+<target>鎖定擁有者:</target>
+
+<source>Detecting abandoned lock...</source>
+<target>正在檢測被遺棄的鎖定…</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>%x 秒</pluralform>
+</target>
+
<source>Item exists on left side only</source>
<target>只存在於左邊的項目</target>
@@ -267,8 +332,187 @@
<source>Update attributes on right</source>
<target>更新右邊的屬性</target>
-<source>Cannot read file %x.</source>
-<target>無法讀取檔案 %x。</target>
+<source>Items processed:</source>
+<target>已處理項目:</target>
+
+<source>Items remaining:</source>
+<target>剩餘項目:</target>
+
+<source>Total time:</source>
+<target>全部時間:</target>
+
+<source>Cleaning up log files:</source>
+<target>清除日誌檔:</target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>解析 %x 檔案,第 %y 列,第 %z 行出現錯誤。</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>無法為以下資料夾設定目錄鎖定:</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>%x 執行緒</pluralform>
+</target>
+
+<source>Cannot read directory %x.</source>
+<target>無法讀取目錄 %x。</target>
+
+<source>/sec</source>
+<target>(秒)</target>
+
+<source>%x items/sec</source>
+<target>%x 個項目(秒)</target>
+
+<source>Show in Explorer</source>
+<target>在資源管理器中顯示</target>
+
+<source>Open with default application</source>
+<target>使用預設的應用程式開啟</target>
+
+<source>Browse directory</source>
+<target>瀏覽目錄</target>
+
+<source>Unable to connect to %x.</source>
+<target>無法連接到 %x。</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>無法存取磁碟區陰影複製服務。</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>請在此系統上執行64位元版本的FreeFileSync建立陰影複製副本。</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>無法確定 %x 磁碟機名稱。</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>磁碟機名稱 %x 不是檔案路徑 %y 的一部分。</target>
+
+<source>File time and size</source>
+<target>檔案時間和大小</target>
+
+<source>File content</source>
+<target>檔案内容</target>
+
+<source>File size</source>
+<target>檔案大小</target>
+
+<source>Two way</source>
+<target>雙向</target>
+
+<source>Mirror</source>
+<target>鏡像</target>
+
+<source>Update</source>
+<target>更新</target>
+
+<source>Custom</source>
+<target>自訂</target>
+
+<source>Multiple...</source>
+<target>多個…</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>無法寫入 %x 的檔案屬性。</target>
+
+<source>Cannot open file %x.</source>
+<target>無法開啟檔案 %x。</target>
+
+<source>%x and %y have different content.</source>
+<target>%x 和 %y 具有不同的內容。</target>
+
+<source>Data verification error:</source>
+<target>資料驗證錯誤:</target>
+
+<source>Moving file %x to %y</source>
+<target>正在移動檔案 %x 到 %y</target>
+
+<source>Moving folder %x to %y</source>
+<target>正在移動資料夾 %x 到 %y</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>正在移動符號連結 %x 到 %y</target>
+
+<source>Updating file %x</source>
+<target>正在更新檔案 %x</target>
+
+<source>Updating symbolic link %x</source>
+<target>正在更新符號連結 %x</target>
+
+<source>Verifying file %x</source>
+<target>正在驗證檔案 %x</target>
+
+<source>Updating attributes of %x</source>
+<target>正在更新 %x 的屬性</target>
+
+<source>Source item %x not found</source>
+<target>找不到來源項目 %x</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>正在建立磁碟區陰影複製為 %x…</target>
+
+<source>Searching for excess file versions:</source>
+<target>正在搜尋多餘的檔案版本:</target>
+
+<source>Removing excess file versions:</source>
+<target>正在刪除多餘的檔案版本:</target>
+
+<source>Cannot find folder %x.</source>
+<target>找不到資料夾 %x。</target>
+
+<source>Target folder %x already existing.</source>
+<target>目標資料夾 %x 已存在。</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>目標資料夾輸入欄位不能為空白。</target>
+
+<source>Source folder %x not found.</source>
+<target>找不到來源資料夾 %x。</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>請輸入版本控制的目標資料夾。</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>下列項目有未解決的衝突,將不會同步:</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>下列資料夾明顯不同。請檢查同步中所選的正確資料夾。</target>
+
+<source>Not enough free disk space available in:</source>
+<target>沒有足夠的可用磁碟空間:</target>
+
+<source>Required:</source>
+<target>必要:</target>
+
+<source>Available:</source>
+<target>可用:</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>某些檔案將作為多個底層資料夾的一部分進行同步。</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>為了避免衝突,設定排除過濾器,以便每個更新過的檔案被視為只有一個底層資料夾。</target>
+
+<source>Versioning folder:</source>
+<target>版本控制資料夾:</target>
+
+<source>Base folder:</source>
+<target>底層資料夾:</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>版本控制資料夾包含在底層資料夾中。</target>
+
+<source>Synchronizing folder pair:</source>
+<target>同步配對資料夾:</target>
+
+<source>Generating database...</source>
+<target>正在產生資料庫…</target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>無法建立時間戳記的版本控制:</target>
<source>
Unexpected size of data stream.
@@ -287,30 +531,21 @@ Actual: %y bytes
<source>Operation not supported for different base folder types.</source>
<target>不支援不同底層資料夾類型的操作。</target>
-<source>Cannot write file %x.</source>
-<target>無法寫入檔案 %x。</target>
-
<source>Cannot move file %x to %y.</source>
<target>無法移動檔案 %x 到 %y。</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>無法複製符號連結 %x 到 %y。</target>
-<source>Unable to connect to %x.</source>
-<target>無法連接到 %x。</target>
+<source>Error Code %x</source>
+<target>錯誤代碼 %x</target>
<source>Failed to get information about server %x.</source>
-<target>無法獲取關於伺服器 %x 的資訊。</target>
+<target>無法取得關於伺服器 %x 的資訊。</target>
<source>Cannot open directory %x.</source>
<target>無法開啟目錄 %x。</target>
-<source>Cannot read directory %x.</source>
-<target>無法讀取目錄 %x。</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>無法讀取 %x 的檔案屬性。</target>
-
<source>Cannot create directory %x.</source>
<target>無法建立目錄 %x。</target>
@@ -338,9 +573,6 @@ Actual: %y bytes
<source>Cannot find device %x.</source>
<target>找不到裝置 %x。</target>
-<source>Cannot open file %x.</source>
-<target>無法開啟檔案 %x。</target>
-
<source>Type of item %x is not supported:</source>
<target>項目類型 %x 不被支援:</target>
@@ -353,15 +585,9 @@ Actual: %y bytes
<source>Incorrect command line:</source>
<target>不正確的命令列:</target>
-<source>Error Code %x</source>
-<target>錯誤代碼 %x</target>
-
<source>The server does not support authentication via %x.</source>
<target>伺服器不支援透過 %x 進行身份驗證。</target>
-<source>Required:</source>
-<target>必要:</target>
-
<source>Unable to access %x.</source>
<target>無法存取 %x。</target>
@@ -404,121 +630,9 @@ Actual: %y bytes
<source>%x GB</source>
<target>%x GB</target>
-<source>Cannot load file %x.</source>
-<target>無法載入檔案 %x。</target>
-
-<source>Database file %x is incompatible.</source>
-<target>資料庫檔案 %x 不相容。</target>
-
-<source>Initial synchronization:</source>
-<target>初始化同步:</target>
-
-<source>Database file %x does not yet exist.</source>
-<target>資料庫檔案 %x 不存在。</target>
-
-<source>Database file is corrupted:</source>
-<target>資料庫檔案已損壞:</target>
-
-<source>The database files do not yet contain information about the last synchronization.</source>
-<target>資料庫檔案尚未包含關於上次同步資訊。</target>
-
-<source>Loading file %x...</source>
-<target>正在讀取檔案 %x…</target>
-
-<source>Saving file %x...</source>
-<target>正在儲存檔案 %x…</target>
-
-<source>Searching for folder %x...</source>
-<target>正在搜尋資料夾 %x…</target>
-
-<source>Timeout while searching for folder %x.</source>
-<target>搜尋資料夾 %x 時超時。</target>
-
-<source>Cannot get process information.</source>
-<target>無法得到處理訊息。</target>
-
-<source>Waiting while directory is locked:</source>
-<target>等待目錄被鎖定:</target>
-
-<source>Lock owner:</source>
-<target>鎖定擁有者:</target>
-
-<source>Detecting abandoned lock...</source>
-<target>正在檢測被遺棄的鎖定…</target>
-
-<source>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</source>
-<target>
-<pluralform>%x 秒</pluralform>
-</target>
-
-<source>Items processed:</source>
-<target>已處理項目:</target>
-
-<source>Items remaining:</source>
-<target>剩餘項目:</target>
-
-<source>Total time:</source>
-<target>全部時間:</target>
-
-<source>Cleaning up old log files...</source>
-<target>清理舊日誌檔…</target>
-
-<source>Error parsing file %x, row %y, column %z.</source>
-<target>解析 %x 檔案,第 %y 列,第 %z 行出現錯誤。</target>
-
-<source>Cannot set directory locks for the following folders:</source>
-<target>無法為以下資料夾設定目錄鎖定:</target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-<pluralform>%x 執行緒</pluralform>
-</target>
-
-<source>Scanning:</source>
-<target>正在掃瞄:</target>
-
-<source>/sec</source>
-<target>(秒)</target>
-
-<source>%x items/sec</source>
-<target>%x 個項目(秒)</target>
-
-<source>Show in Explorer</source>
-<target>在資源管理器中顯示</target>
-
-<source>Open with default application</source>
-<target>使用預設的應用程式開啟</target>
-
-<source>Browse directory</source>
-<target>瀏覽目錄</target>
-
-<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>無法存取磁碟區陰影複製服務。</target>
-
-<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>請在此系統上執行64位元版本的FreeFileSync建立陰影複製副本。</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>無法確定 %x 磁碟機名稱。</target>
-
-<source>Volume name %x is not part of file path %y.</source>
-<target>磁碟機名稱 %x 不是檔案路徑 %y 的一部分。</target>
-
-<source>Unable to create time stamp for versioning:</source>
-<target>無法建立時間戳記的版本控制:</target>
-
<source>Drag && drop</source>
<target>拖放</target>
-<source>Cannot find folder %x.</source>
-<target>找不到資料夾 %x。</target>
-
<source>Select a folder</source>
<target>選擇一個資料夾</target>
@@ -614,8 +728,8 @@ The command is triggered if:
<source>Directory monitoring active</source>
<target>目錄監測活動</target>
-<source>Waiting until all directories are available...</source>
-<target>正在等到所有目錄可用…</target>
+<source>Waiting until directory is available:</source>
+<target>正在等待可用目錄:</target>
<source>&Restore</source>
<target>還原(&R)</target>
@@ -629,114 +743,6 @@ The command is triggered if:
<source>&Retry</source>
<target>重試(&R)</target>
-<source>File time and size</source>
-<target>檔案時間和大小</target>
-
-<source>File content</source>
-<target>檔案内容</target>
-
-<source>File size</source>
-<target>檔案大小</target>
-
-<source>Two way</source>
-<target>雙向</target>
-
-<source>Mirror</source>
-<target>鏡像</target>
-
-<source>Update</source>
-<target>更新</target>
-
-<source>Custom</source>
-<target>自訂</target>
-
-<source>Multiple...</source>
-<target>多個…</target>
-
-<source>Cannot write file attributes of %x.</source>
-<target>無法寫入 %x 的檔案屬性。</target>
-
-<source>%x and %y have different content.</source>
-<target>%x 和 %y 具有不同的內容。</target>
-
-<source>Data verification error:</source>
-<target>資料驗證錯誤:</target>
-
-<source>Moving file %x to %y</source>
-<target>正在移動檔案 %x 到 %y</target>
-
-<source>Moving folder %x to %y</source>
-<target>正在移動資料夾 %x 到 %y</target>
-
-<source>Moving symbolic link %x to %y</source>
-<target>正在移動符號連結 %x 到 %y</target>
-
-<source>Removing old versions...</source>
-<target>正在移除舊版本…</target>
-
-<source>Updating file %x</source>
-<target>正在更新檔案 %x</target>
-
-<source>Updating symbolic link %x</source>
-<target>正在更新符號連結 %x</target>
-
-<source>Verifying file %x</source>
-<target>正在驗證檔案 %x</target>
-
-<source>Updating attributes of %x</source>
-<target>正在更新 %x 的屬性</target>
-
-<source>Source item %x not found</source>
-<target>找不到來源項目 %x</target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>正在建立磁碟區陰影複製為 %x…</target>
-
-<source>Target folder %x already existing.</source>
-<target>目標資料夾 %x 已存在。</target>
-
-<source>Target folder input field must not be empty.</source>
-<target>目標資料夾輸入欄位不能為空白。</target>
-
-<source>Source folder %x not found.</source>
-<target>找不到來源資料夾 %x。</target>
-
-<source>Please enter a target folder for versioning.</source>
-<target>請輸入版本控制的目標資料夾。</target>
-
-<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>下列項目有未解決的衝突,將不會同步:</target>
-
-<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>下列資料夾明顯不同。請檢查同步中所選的正確資料夾。</target>
-
-<source>Not enough free disk space available in:</source>
-<target>沒有足夠的可用空間:</target>
-
-<source>Available:</source>
-<target>可用:</target>
-
-<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>某些檔案將作為多個底層資料夾的一部分進行同步。</target>
-
-<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>為了避免衝突,設定排除過濾器,以便每個更新過的檔案被視為只有一個底層資料夾。</target>
-
-<source>Versioning folder:</source>
-<target>版本控制資料夾:</target>
-
-<source>Base folder:</source>
-<target>底層資料夾:</target>
-
-<source>The versioning folder is contained in a base folder.</source>
-<target>版本控制資料夾包含在底層資料夾中。</target>
-
-<source>Synchronizing folder pair:</source>
-<target>同步配對資料夾:</target>
-
-<source>Generating database...</source>
-<target>正在產生資料庫…</target>
-
<source>Loading...</source>
<target>正在載入…</target>
@@ -881,7 +887,7 @@ The command is triggered if:
<target>請選擇一個本機檔案系統、網路或MTP裝置上的資料夾。</target>
<source>Defined by context of use</source>
-<target></target>
+<target>由使用環境定義</target>
<source>Requires FreeFileSync Donation Edition</source>
<target>需要FreeFileSync贊助版</target>
@@ -1043,7 +1049,7 @@ The command is triggered if:
<target>並列檔案操作:</target>
<source>How to get best performance?</source>
-<target>如何獲得最佳效能?</target>
+<target>如何取得最佳效能?</target>
<source>Local settings:</source>
<target>本機設定:</target>
@@ -1054,8 +1060,8 @@ The command is triggered if:
<source>Show examples</source>
<target>顯示範例</target>
-<source>Time span:</source>
-<target>時間間隔:</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>選擇從同步中排除某些檔案的篩選器規則。輸入相對於其對應的配對資料夾路徑。</target>
<source>File size:</source>
<target>檔案大小:</target>
@@ -1066,8 +1072,8 @@ The command is triggered if:
<source>Maximum:</source>
<target>最大:</target>
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target>選擇從同步中排除某些檔案的篩選器規則。輸入相對於其對應的配對資料夾路徑。</target>
+<source>Time span:</source>
+<target>時間間隔:</target>
<source>C&lear</source>
<target>清除(&L)</target>
@@ -1098,9 +1104,18 @@ The command is triggered if:
<source>&Versioning</source>
<target>版本控制(&V)</target>
+<source>Move files to a user-defined folder</source>
+<target>將檔案移動到一個使用者定義的資料夾</target>
+
<source>Naming convention:</source>
<target>命名慣例:</target>
+<source>Limit file versions:</source>
+<target>限制檔案版本:</target>
+
+<source>Last x days:</source>
+<target>最近 x 天:</target>
+
<source>Ignore errors</source>
<target>忽略錯誤</target>
@@ -1242,11 +1257,8 @@ The command is triggered if:
<source>Save log:</source>
<target>儲存日誌:</target>
-<source>Limit:</source>
-<target>限制:</target>
-
-<source>Limit maximum number of log files</source>
-<target>限制日誌檔的最大數量</target>
+<source>Limit number of log files:</source>
+<target>限制日誌檔數量:</target>
<source>How can I schedule a batch job?</source>
<target>如何排程批次工作?</target>
@@ -1281,9 +1293,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Transfer file and folder permissions.</source>
<target>傳輸檔案和資料夾的權限。</target>
-<source>Show hidden dialogs again</source>
-<target>再次顯示隱藏的對話框</target>
-
<source>Show all permanently hidden dialogs and warning messages again</source>
<target>再次顯示所有永久 隱藏的對話框和警告訊息</target>
@@ -1374,9 +1383,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Select Time Span</source>
<target>選擇時間間隔</target>
-<source>FreeFileSync Donation Edition</source>
-<target>FreeFileSync贊助版</target>
-
<source>Highlight Configurations</source>
<target>突顯配置</target>
@@ -1496,6 +1502,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Select time span...</source>
<target>選擇時間間隔…</target>
+<source>Donation Edition</source>
+<target>贊助版</target>
+
<source>Folder Comparison and Synchronization</source>
<target>資料夾比對和同步</target>
@@ -1677,7 +1686,7 @@ This guarantees a consistent state even in case of a serious error.
<target>複製DACL、SACL、擁有者、群組</target>
<source>Integrate external applications into context menu. The following macros are available:</source>
-<target>整合內容功能表中的外部應用程式。可使用下面的巨集:</target>
+<target>整合內容功能表中的外部應用程式。可使用下列的巨集:</target>
<source>Full file or folder path</source>
<target>完整檔案或資料夾路徑</target>
@@ -1691,6 +1700,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Parameters for opposite side</source>
<target>另一邊的參數</target>
+<source>Show hidden dialogs again</source>
+<target>再次顯示隱藏的對話框</target>
+
+<source>All dialogs shown</source>
+<target>顯示所有對話框</target>
+
<source>Downloading update...</source>
<target>正在下載更新…</target>
@@ -1730,9 +1745,6 @@ This guarantees a consistent state even in case of a serious error.
<source>This year</source>
<target>今年</target>
-<source>Last x days</source>
-<target>最後 x 天</target>
-
<source>Byte</source>
<target>位元組</target>
@@ -1748,9 +1760,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Delete and overwrite files permanently</source>
<target>永久刪除和覆蓋的檔案</target>
-<source>Move files to a user-defined folder</source>
-<target>將檔案移動到一個使用者定義的資料夾</target>
-
<source>Replace</source>
<target>取代</target>
@@ -1760,6 +1769,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Time stamp</source>
<target>時間戳記</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>將檔案移動到時間戳記的子資料夾中</target>
+
+<source>File</source>
+<target>檔案</target>
+
<source>Append a time stamp to each file name</source>
<target>將時間戳記附加到每個檔案名稱上</target>
@@ -1781,12 +1796,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Leave as unresolved conflict</source>
<target>保留給未解決的衝突</target>
-<source>File</source>
-<target>檔案</target>
-
<source>YYYY-MM-DD hhmmss</source>
<target>YYYY-MM-DD hhmmss</target>
+<source>Minimum version count must be smaller than maximum count.</source>
+<target>最小版本總數必須小於最大總數。</target>
+
<source>Files</source>
<target>檔案</target>
@@ -1836,7 +1851,7 @@ This guarantees a consistent state even in case of a serious error.
<target>無法啟動FreeFileSync贊助版。</target>
<source>Incorrect activation key.</source>
-<target>不正確的啟用金鑰。</target>
+<target>啟用金鑰不正確。</target>
<source>Unable to register to receive system messages.</source>
<target>無法註冊以接收系統訊息。</target>
@@ -1932,8 +1947,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Portable</source>
<target>可攜式</target>
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>儲存到「%APPDATA%\FreeFileSync」</target>
+<source>Save settings in %x</source>
+<target>將設定儲存在 %x 中</target>
<source>Register FreeFileSync file extensions</source>
<target>註冊FreeFileSync檔案關聯</target>
@@ -1999,5 +2014,5 @@ This guarantees a consistent state even in case of a serious error.
<target>%x 安裝選項僅在FreeFileSync贊助版可用。</target>
<source>Get the Donation Edition with bonus features and help keep FreeFileSync ad-free.</source>
-<target>獲得贊助版的獎勵功能,並協助維持FreeFileSync無廣告。</target>
+<target>取得贊助版的獎勵功能,並協助維持FreeFileSync無廣告。</target>
diff --git a/FreeFileSync/Build/Languages/croatian.lng b/FreeFileSync/Build/Languages/croatian.lng
index dce705ac..85ce9399 100755
--- a/FreeFileSync/Build/Languages/croatian.lng
+++ b/FreeFileSync/Build/Languages/croatian.lng
@@ -115,11 +115,20 @@
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
<target>Instalacijske datoteke su oštećene. Molimo ponovno instalirajte FreeFileSync.</target>
+<source>Cannot load file %x.</source>
+<target>Ne mogu učitati datoteku %x.</target>
+
<source>Cannot find the following folders:</source>
<target>Ne mogu pronaći slijedeće mape:</target>
-<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>Ukoliko ignorirate ovu pogrešku zanemarene mape će se smatrati praznima.Prazne mape se izrade automatski kad bude potrebno.</target>
+<source>The following folders do not yet exist:</source>
+<target>Navedene mape još ne postoje:</target>
+
+<source>The folders are created automatically when needed.</source>
+<target>Mape se izrađuju automatski kada su potrebne.</target>
+
+<source>Scanning:</source>
+<target>Pretražujem:</target>
<source>Comparison finished:</source>
<target>Usporedba dovršena:</target>
@@ -215,6 +224,64 @@
<source>Out of memory.</source>
<target>Nedostatak memorije.</target>
+<source>Database file %x is incompatible.</source>
+<target>Datoteka baze %x je nekompatibilna.</target>
+
+<source>Initial synchronization:</source>
+<target>Početna sinkronizacija:</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>Datoteka baze %x još ne postoji.</target>
+
+<source>Database file is corrupted:</source>
+<target>Datoteka baze je oštećena:</target>
+
+<source>Cannot write file %x.</source>
+<target>Ne mogu zapisati datoteku %x.</target>
+
+<source>Cannot read file %x.</source>
+<target>Ne mogu čitati datoteku %x.</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>Datoteke baze još uvijek ne sadrže informacije o zadnjoj sinkronizaciji.</target>
+
+<source>Loading file %x...</source>
+<target>Učitavam datoteku %x...</target>
+
+<source>Saving file %x...</source>
+<target>Spremanje datoteke %x...</target>
+
+<source>Searching for folder %x...</source>
+<target>Tražim mapu %x...</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>Isteklo vrijeme traženja mape %x.</target>
+
+<source>Cannot get process information.</source>
+<target>Ne mogu dobit informacije o procesu.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Ne mogu pročitati osobine od %x.</target>
+
+<source>Waiting while directory is locked:</source>
+<target>Čekam dok se mapa zaključa:</target>
+
+<source>Lock owner:</source>
+<target>Vlasnik ključa:</target>
+
+<source>Detecting abandoned lock...</source>
+<target>Pronalazim napušteni ključ...</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>%x sek</pluralform>
+<pluralform>%x sek</pluralform>
+<pluralform>%x sek</pluralform>
+</target>
+
<source>Item exists on left side only</source>
<target>Stavka postoji samo na lijevoj strani</target>
@@ -269,8 +336,189 @@
<source>Update attributes on right</source>
<target>Osvježi atribute desno</target>
-<source>Cannot read file %x.</source>
-<target>Ne mogu čitati datoteku %x.</target>
+<source>Items processed:</source>
+<target>Obrađene stavke:</target>
+
+<source>Items remaining:</source>
+<target>Preostale stavke:</target>
+
+<source>Total time:</source>
+<target>Ukupno vrijeme:</target>
+
+<source>Cleaning up log files:</source>
+<target>Brisanje log datoteka:</target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>Greška u analizi datoteke %x, red %y, stupac %z.</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>Nije moguće zaključavanje slijedećih foldera:</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>%x nit</pluralform>
+<pluralform>%x niti</pluralform>
+<pluralform>%x niti</pluralform>
+</target>
+
+<source>Cannot read directory %x.</source>
+<target>Nije moguće učitati mapu %x.</target>
+
+<source>/sec</source>
+<target>/sek</target>
+
+<source>%x items/sec</source>
+<target>%x stavki/sek</target>
+
+<source>Show in Explorer</source>
+<target>Prikaži u Exploreru</target>
+
+<source>Open with default application</source>
+<target>Otvori s zadanom aplikacijom</target>
+
+<source>Browse directory</source>
+<target>Odaberi direktorij</target>
+
+<source>Unable to connect to %x.</source>
+<target>Nije moguće povezivanje na %x.</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>Ne mogu pristupiti Voulme Shadow Copy servisu.</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>Molimo pokrenite 64-bitnu verziju FreeFileSync-a da bi izradili shadow kopije na ovom sustavu.</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>Ne mogu utvrditi naziv spremnika za %x.</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>Naziv spremnika %x nije dio putanje datotke %y.</target>
+
+<source>File time and size</source>
+<target>Vrijeme i veličina datoteke</target>
+
+<source>File content</source>
+<target>Sadržaj datoteke</target>
+
+<source>File size</source>
+<target>Veličina datoteke</target>
+
+<source>Two way</source>
+<target>Dvosmjerno</target>
+
+<source>Mirror</source>
+<target>Zrcalno</target>
+
+<source>Update</source>
+<target>Ažuriraj</target>
+
+<source>Custom</source>
+<target>Prilagođeno</target>
+
+<source>Multiple...</source>
+<target>Mnogostruko...</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>Ne mogu zapisati svojstva od %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Ne mogu otvoriti datoteku %x.</target>
+
+<source>%x and %y have different content.</source>
+<target>%x. i %y imaju različit sadržaj.</target>
+
+<source>Data verification error:</source>
+<target>Pogreška verificiranja podataka:</target>
+
+<source>Moving file %x to %y</source>
+<target>Premještanje datoteke %x u %y</target>
+
+<source>Moving folder %x to %y</source>
+<target>Premještanje mape %x u %y</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>Premještanje simboličnog linka %x u %y</target>
+
+<source>Updating file %x</source>
+<target>Ažuriram datoteku %x</target>
+
+<source>Updating symbolic link %x</source>
+<target>Ažuriram simboličnu poveznicu %x</target>
+
+<source>Verifying file %x</source>
+<target>Provjeravanje datoteke %x</target>
+
+<source>Updating attributes of %x</source>
+<target>Obnavljam atribute od %x</target>
+
+<source>Source item %x not found</source>
+<target>Izvorna datoteka %x nije pronađena</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>Kreiranje Volume Shadow Copy za %x...</target>
+
+<source>Searching for excess file versions:</source>
+<target>Traženje višestrukih verzija datoteka:</target>
+
+<source>Removing excess file versions:</source>
+<target>Uklanjanje višestrukih verzija datoteka:</target>
+
+<source>Cannot find folder %x.</source>
+<target>Ne mogu pronaći mapu %x.</target>
+
+<source>Target folder %x already existing.</source>
+<target>Odredišna mapa %x već postoji.</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>Odredišna mapa ne može biti prazna.</target>
+
+<source>Source folder %x not found.</source>
+<target>Izvorna mapa %x nije pronađena.</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>Molimo odaberite odredišnu mapu za označavanje.</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>Slijedeće stavke imaju nerješene konflikte i zato neće biti sinkronizirane:</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>Slijedeće mape su značajno različite. Molimo provjerite da su mape za sinkronizaciju ispravno odabrane.</target>
+
+<source>Not enough free disk space available in:</source>
+<target>Nedovoljno prostora na disku:</target>
+
+<source>Required:</source>
+<target>Potrebno:</target>
+
+<source>Available:</source>
+<target>Dostupno:</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>Neke datoteke će biti sinkronizirane kao dio više baznih mapa.</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>Da bi izbjegli konflikt, postavite filtere za izdvajanje tako da se svaka ažurirana datoteka uzima u obzir samo kod jedne bazne mape.</target>
+
+<source>Versioning folder:</source>
+<target>Verzija mape:</target>
+
+<source>Base folder:</source>
+<target>Bazna mapa:</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>Usporedni folder se nalazi u baznom folderu.</target>
+
+<source>Synchronizing folder pair:</source>
+<target>Mape sinkronizacije::</target>
+
+<source>Generating database...</source>
+<target>Izrađivanje baze podataka...</target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>Nije moguća izrada vremenske oznake za označavanje:</target>
<source>
Unexpected size of data stream.
@@ -289,17 +537,14 @@ Stvarno: %y bajta
<source>Operation not supported for different base folder types.</source>
<target>Operacija nije podržana za različite bazne mape.</target>
-<source>Cannot write file %x.</source>
-<target>Ne mogu zapisati datoteku %x.</target>
-
<source>Cannot move file %x to %y.</source>
<target>Ne mogu premjestiti datoteku %x u %y.</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>Ne može se kopirati simbolična poveznica %x prema %y.</target>
-<source>Unable to connect to %x.</source>
-<target>Nije moguće povezivanje na %x.</target>
+<source>Error Code %x</source>
+<target>Kod greške %x.</target>
<source>Failed to get information about server %x.</source>
<target>Nije moguće pristupiti informacijama servera %x.</target>
@@ -307,12 +552,6 @@ Stvarno: %y bajta
<source>Cannot open directory %x.</source>
<target>Ne mogu otvoriti mapu %x.</target>
-<source>Cannot read directory %x.</source>
-<target>Nije moguće učitati mapu %x.</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>Ne mogu pročitati osobine od %x.</target>
-
<source>Cannot create directory %x.</source>
<target>Ne mogu izraditi mapu %x.</target>
@@ -340,9 +579,6 @@ Stvarno: %y bajta
<source>Cannot find device %x.</source>
<target>Nije moguće pronaći uređaj %x.</target>
-<source>Cannot open file %x.</source>
-<target>Ne mogu otvoriti datoteku %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Vrsta stavke %x koji nije podržan:</target>
@@ -355,15 +591,9 @@ Stvarno: %y bajta
<source>Incorrect command line:</source>
<target>Netočna naredbena linija:</target>
-<source>Error Code %x</source>
-<target>Kod greške %x.</target>
-
<source>The server does not support authentication via %x.</source>
<target>Server ne podržava provjeru autentičnosti preko %x.</target>
-<source>Required:</source>
-<target>Potrebno:</target>
-
<source>Unable to access %x.</source>
<target>Nije moguće pristupiti %x.</target>
@@ -412,125 +642,9 @@ Stvarno: %y bajta
<source>%x GB</source>
<target>%x GB</target>
-<source>Cannot load file %x.</source>
-<target>Ne mogu učitati datoteku %x.</target>
-
-<source>Database file %x is incompatible.</source>
-<target>Datoteka baze %x je nekompatibilna.</target>
-
-<source>Initial synchronization:</source>
-<target>Početna sinkronizacija:</target>
-
-<source>Database file %x does not yet exist.</source>
-<target>Datoteka baze %x još ne postoji.</target>
-
-<source>Database file is corrupted:</source>
-<target>Datoteka baze je oštećena:</target>
-
-<source>The database files do not yet contain information about the last synchronization.</source>
-<target>Datoteke baze još uvijek ne sadrže informacije o zadnjoj sinkronizaciji.</target>
-
-<source>Loading file %x...</source>
-<target>Učitavam datoteku %x...</target>
-
-<source>Saving file %x...</source>
-<target>Spremanje datoteke %x...</target>
-
-<source>Searching for folder %x...</source>
-<target>Tražim mapu %x...</target>
-
-<source>Timeout while searching for folder %x.</source>
-<target>Isteklo vrijeme traženja mape %x.</target>
-
-<source>Cannot get process information.</source>
-<target>Ne mogu dobit informacije o procesu.</target>
-
-<source>Waiting while directory is locked:</source>
-<target>Čekam dok se mapa zaključa:</target>
-
-<source>Lock owner:</source>
-<target>Vlasnik ključa:</target>
-
-<source>Detecting abandoned lock...</source>
-<target>Pronalazim napušteni ključ...</target>
-
-<source>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</source>
-<target>
-<pluralform>%x sek</pluralform>
-<pluralform>%x sek</pluralform>
-<pluralform>%x sek</pluralform>
-</target>
-
-<source>Items processed:</source>
-<target>Obrađene stavke:</target>
-
-<source>Items remaining:</source>
-<target>Preostale stavke:</target>
-
-<source>Total time:</source>
-<target>Ukupno vrijeme:</target>
-
-<source>Cleaning up old log files...</source>
-<target>Čistim stare datoteke o izvješću...</target>
-
-<source>Error parsing file %x, row %y, column %z.</source>
-<target>Greška u analizi datoteke %x, red %y, stupac %z.</target>
-
-<source>Cannot set directory locks for the following folders:</source>
-<target>Nije moguće zaključavanje slijedećih foldera:</target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-<pluralform>%x nit</pluralform>
-<pluralform>%x niti</pluralform>
-<pluralform>%x niti</pluralform>
-</target>
-
-<source>Scanning:</source>
-<target>Pretražujem:</target>
-
-<source>/sec</source>
-<target>/sek</target>
-
-<source>%x items/sec</source>
-<target>%x stavki/sek</target>
-
-<source>Show in Explorer</source>
-<target>Prikaži u Exploreru</target>
-
-<source>Open with default application</source>
-<target>Otvori s zadanom aplikacijom</target>
-
-<source>Browse directory</source>
-<target>Odaberi direktorij</target>
-
-<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>Ne mogu pristupiti Voulme Shadow Copy servisu.</target>
-
-<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>Molimo pokrenite 64-bitnu verziju FreeFileSync-a da bi izradili shadow kopije na ovom sustavu.</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>Ne mogu utvrditi naziv spremnika za %x.</target>
-
-<source>Volume name %x is not part of file path %y.</source>
-<target>Naziv spremnika %x nije dio putanje datotke %y.</target>
-
-<source>Unable to create time stamp for versioning:</source>
-<target>Nije moguća izrada vremenske oznake za označavanje:</target>
-
<source>Drag && drop</source>
<target>Povuci && ispusti</target>
-<source>Cannot find folder %x.</source>
-<target>Ne mogu pronaći mapu %x.</target>
-
<source>Select a folder</source>
<target>Odaberite mapu</target>
@@ -626,8 +740,8 @@ Naredba će biti pokrenuta ako se:
<source>Directory monitoring active</source>
<target>Nadzor direktorija je aktivan</target>
-<source>Waiting until all directories are available...</source>
-<target>Čekanje na dostupnost svih direktorija...</target>
+<source>Waiting until directory is available:</source>
+<target>Čekanje dok mapa bude dostupna:</target>
<source>&Restore</source>
<target>&Vrati</target>
@@ -641,114 +755,6 @@ Naredba će biti pokrenuta ako se:
<source>&Retry</source>
<target>&Ponovi</target>
-<source>File time and size</source>
-<target>Vrijeme i veličina datoteke</target>
-
-<source>File content</source>
-<target>Sadržaj datoteke</target>
-
-<source>File size</source>
-<target>Veličina datoteke</target>
-
-<source>Two way</source>
-<target>Dvosmjerno</target>
-
-<source>Mirror</source>
-<target>Zrcalno</target>
-
-<source>Update</source>
-<target>Ažuriraj</target>
-
-<source>Custom</source>
-<target>Prilagođeno</target>
-
-<source>Multiple...</source>
-<target>Mnogostruko...</target>
-
-<source>Cannot write file attributes of %x.</source>
-<target>Ne mogu zapisati svojstva od %x.</target>
-
-<source>%x and %y have different content.</source>
-<target>%x. i %y imaju različit sadržaj.</target>
-
-<source>Data verification error:</source>
-<target>Pogreška verificiranja podataka:</target>
-
-<source>Moving file %x to %y</source>
-<target>Premještanje datoteke %x u %y</target>
-
-<source>Moving folder %x to %y</source>
-<target>Premještanje mape %x u %y</target>
-
-<source>Moving symbolic link %x to %y</source>
-<target>Premještanje simboličnog linka %x u %y</target>
-
-<source>Removing old versions...</source>
-<target>Uklanjanje starije verzije...</target>
-
-<source>Updating file %x</source>
-<target>Ažuriram datoteku %x</target>
-
-<source>Updating symbolic link %x</source>
-<target>Ažuriram simboličnu poveznicu %x</target>
-
-<source>Verifying file %x</source>
-<target>Provjeravanje datoteke %x</target>
-
-<source>Updating attributes of %x</source>
-<target>Obnavljam atribute od %x</target>
-
-<source>Source item %x not found</source>
-<target>Izvorna datoteka %x nije pronađena</target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>Kreiranje Volume Shadow Copy za %x...</target>
-
-<source>Target folder %x already existing.</source>
-<target>Odredišna mapa %x već postoji.</target>
-
-<source>Target folder input field must not be empty.</source>
-<target>Odredišna mapa ne može biti prazna.</target>
-
-<source>Source folder %x not found.</source>
-<target>Izvorna mapa %x nije pronađena.</target>
-
-<source>Please enter a target folder for versioning.</source>
-<target>Molimo odaberite odredišnu mapu za označavanje.</target>
-
-<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>Slijedeće stavke imaju nerješene konflikte i zato neće biti sinkronizirane:</target>
-
-<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>Slijedeće mape su značajno različite. Molimo provjerite da su mape za sinkronizaciju ispravno odabrane.</target>
-
-<source>Not enough free disk space available in:</source>
-<target>Nedovoljno prostora na disku:</target>
-
-<source>Available:</source>
-<target>Dostupno:</target>
-
-<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>Neke datoteke će biti sinkronizirane kao dio više baznih mapa.</target>
-
-<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>Da bi izbjegli konflikt, postavite filtere za izdvajanje tako da se svaka ažurirana datoteka uzima u obzir samo kod jedne bazne mape.</target>
-
-<source>Versioning folder:</source>
-<target>Verzija mape:</target>
-
-<source>Base folder:</source>
-<target>Bazna mapa:</target>
-
-<source>The versioning folder is contained in a base folder.</source>
-<target>Usporedni folder se nalazi u baznom folderu.</target>
-
-<source>Synchronizing folder pair:</source>
-<target>Mape sinkronizacije::</target>
-
-<source>Generating database...</source>
-<target>Izrađivanje baze podataka...</target>
-
<source>Loading...</source>
<target>Učitavam...</target>
@@ -895,7 +901,7 @@ Naredba će biti pokrenuta ako se:
<target>Molimo odaberite mapu na lokalnom disku, mreži ili MTP uređaju.</target>
<source>Defined by context of use</source>
-<target></target>
+<target>Određeno kontekstom uporabe</target>
<source>Requires FreeFileSync Donation Edition</source>
<target>Zahtjeva FreeFileSync Donatorsku Verziju</target>
@@ -1068,8 +1074,8 @@ Naredba će biti pokrenuta ako se:
<source>Show examples</source>
<target>Prikaži primjere</target>
-<source>Time span:</source>
-<target>Vremenski raspon:</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>Odaberite filter pravila da biste isključili određene datoteke iz sinkronizacije. Unesite relativnu putanju datoteka prema njihovim odgovarajućim parovima mapa.</target>
<source>File size:</source>
<target>Veličina datoteke:</target>
@@ -1080,8 +1086,8 @@ Naredba će biti pokrenuta ako se:
<source>Maximum:</source>
<target>Maksimum:</target>
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target>Odaberite filter pravila da biste isključili određene datoteke iz sinkronizacije. Unesite relativnu putanju datoteka prema njihovim odgovarajućim parovima mapa.</target>
+<source>Time span:</source>
+<target>Vremenski raspon:</target>
<source>C&lear</source>
<target>O&čisti</target>
@@ -1112,9 +1118,18 @@ Naredba će biti pokrenuta ako se:
<source>&Versioning</source>
<target>&Odabir</target>
+<source>Move files to a user-defined folder</source>
+<target>Premjesti datoteke u mapu određenu od korsnika</target>
+
<source>Naming convention:</source>
<target>Naziv pravila:</target>
+<source>Limit file versions:</source>
+<target>Limitiranje verzija datoteka:</target>
+
+<source>Last x days:</source>
+<target>Zadnjih nekoliko dana:</target>
+
<source>Ignore errors</source>
<target>Zanemariti pogreške</target>
@@ -1256,11 +1271,8 @@ Naredba će biti pokrenuta ako se:
<source>Save log:</source>
<target>Spremi izvještaj:</target>
-<source>Limit:</source>
-<target>Granica:</target>
-
-<source>Limit maximum number of log files</source>
-<target>Ograniči maksimalan broj izvješća</target>
+<source>Limit number of log files:</source>
+<target>Limitiranje broja log datoteka:</target>
<source>How can I schedule a batch job?</source>
<target>Kako zakazati slijedni zadatak?</target>
@@ -1295,9 +1307,6 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<source>Transfer file and folder permissions.</source>
<target>Prenesi dopuštenja za datoteke i mape.</target>
-<source>Show hidden dialogs again</source>
-<target>Prikaži skrivene prozore ponovno</target>
-
<source>Show all permanently hidden dialogs and warning messages again</source>
<target>Prikaži sve trajno skrivene prozore i poruke upozorenja ponovno</target>
@@ -1388,9 +1397,6 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<source>Select Time Span</source>
<target>Odaberite vremenski raspon</target>
-<source>FreeFileSync Donation Edition</source>
-<target>FreeFileSync Donatorska Verzija</target>
-
<source>Highlight Configurations</source>
<target>Istakni postavke</target>
@@ -1518,6 +1524,9 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<source>Select time span...</source>
<target>Odaberite vremenski raspon...</target>
+<source>Donation Edition</source>
+<target>Donatorska Verzija</target>
+
<source>Folder Comparison and Synchronization</source>
<target>Usporedba i sinkronizacija mapa</target>
@@ -1719,6 +1728,12 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<source>Parameters for opposite side</source>
<target>Parametri za suprotnu stranu</target>
+<source>Show hidden dialogs again</source>
+<target>Prikaži skrivene prozore ponovno</target>
+
+<source>All dialogs shown</source>
+<target>Svi prozori prikazani</target>
+
<source>Downloading update...</source>
<target>Preuzimanje ažuriranja...</target>
@@ -1758,9 +1773,6 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<source>This year</source>
<target>Ove godine</target>
-<source>Last x days</source>
-<target>Zadnjih x dana</target>
-
<source>Byte</source>
<target>Bajt</target>
@@ -1776,9 +1788,6 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<source>Delete and overwrite files permanently</source>
<target>Izbrisati i prepisat datoteke trajno</target>
-<source>Move files to a user-defined folder</source>
-<target>Premjesti datoteke u mapu određenu od korsnika</target>
-
<source>Replace</source>
<target>Zamjeni</target>
@@ -1788,6 +1797,12 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<source>Time stamp</source>
<target>Vremenska oznaka</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>Premjesti datoteke u vremenski označen podfolder</target>
+
+<source>File</source>
+<target>Datoteka</target>
+
<source>Append a time stamp to each file name</source>
<target>Dodijeli vremensku oznaku za svaki naziv datoteke</target>
@@ -1809,12 +1824,12 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<source>Leave as unresolved conflict</source>
<target>Ostavi kao neriješeni konflikt</target>
-<source>File</source>
-<target>Datoteka</target>
-
<source>YYYY-MM-DD hhmmss</source>
<target>GGGG-MM-DD hhmmss</target>
+<source>Minimum version count must be smaller than maximum count.</source>
+<target>Broj minimalnih verzija treba biti manji od maksimalnog broja.</target>
+
<source>Files</source>
<target>Datoteke</target>
@@ -1964,8 +1979,8 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<source>Portable</source>
<target>Prenosivo</target>
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>Spremi postavke u "%APPDATA%\FreeFileSync"</target>
+<source>Save settings in %x</source>
+<target>Spremanje postavki u %x</target>
<source>Register FreeFileSync file extensions</source>
<target>Registriraj FreeFileSync ekstenziju</target>
diff --git a/FreeFileSync/Build/Languages/czech.lng b/FreeFileSync/Build/Languages/czech.lng
index 6c04eadc..7bf97103 100755
--- a/FreeFileSync/Build/Languages/czech.lng
+++ b/FreeFileSync/Build/Languages/czech.lng
@@ -7,9 +7,6 @@
<plural_definition>n==1 ? 0 : n>=2 && n<=4 ? 1 : 2</plural_definition>
</header>
-<source>Defined by context of use</source>
-<target></target>
-
<source>Both sides have changed since last synchronization.</source>
<target>Došlo ke změně obou stran od poslední synchronizace.</target>
@@ -118,11 +115,20 @@
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
<target>Instalace programu je poškozena. Prosím nainstalujte znovu FreeFileSync.</target>
+<source>Cannot load file %x.</source>
+<target>Nelze načíst soubor %x.</target>
+
<source>Cannot find the following folders:</source>
<target>Nelze najít následující složky:</target>
-<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>Pokud přeskočíte tuto chybu, složka bude považována za prázdnou. Chybějící složky pak budou automaticky vytvořeny.</target>
+<source>The following folders do not yet exist:</source>
+<target>Následující složky zatím neexistují:</target>
+
+<source>The folders are created automatically when needed.</source>
+<target>Složky budou v případě potřeby automaticky vytvořeny.</target>
+
+<source>Scanning:</source>
+<target>Zpracováváno:</target>
<source>Comparison finished:</source>
<target>Porovnání dokončeno:</target>
@@ -218,6 +224,64 @@
<source>Out of memory.</source>
<target>Nedostatek pracovní paměti.</target>
+<source>Database file %x is incompatible.</source>
+<target>Chybný formát databáze %x.</target>
+
+<source>Initial synchronization:</source>
+<target>Prvotní synchronizace:</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>Databázový soubor %x neexistuje.</target>
+
+<source>Database file is corrupted:</source>
+<target>Databáze je poškozená:</target>
+
+<source>Cannot write file %x.</source>
+<target>Nelze zapsat soubor %x.</target>
+
+<source>Cannot read file %x.</source>
+<target>Nelze číst soubor %x.</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>Databázový soubor ještě neobsahuje informace o poslední synchronizaci.</target>
+
+<source>Loading file %x...</source>
+<target>Načítání souboru %x...</target>
+
+<source>Saving file %x...</source>
+<target>Ukládání souboru %x...</target>
+
+<source>Searching for folder %x...</source>
+<target>Otevírání složky %x...</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>Vypršel časový limit pro nalezení adresáře %x.</target>
+
+<source>Cannot get process information.</source>
+<target>Nelze získat informace procesu.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Nelze číst vlastnosti souboru %x.</target>
+
+<source>Waiting while directory is locked:</source>
+<target>Čekání na uzamčení adresáře:</target>
+
+<source>Lock owner:</source>
+<target>Používá:</target>
+
+<source>Detecting abandoned lock...</source>
+<target>Prověřování uzamčení...</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 sekunda</pluralform>
+<pluralform>%x sekundy</pluralform>
+<pluralform>%x sekund</pluralform>
+</target>
+
<source>Item exists on left side only</source>
<target>Položky existující pouze vlevo</target>
@@ -272,8 +336,189 @@
<source>Update attributes on right</source>
<target>Nastavit vlastnosti vpravo</target>
-<source>Cannot read file %x.</source>
-<target>Nelze číst soubor %x.</target>
+<source>Items processed:</source>
+<target>Zpracováno položek:</target>
+
+<source>Items remaining:</source>
+<target>Zbývá položek:</target>
+
+<source>Total time:</source>
+<target>Celkový čas:</target>
+
+<source>Cleaning up log files:</source>
+<target>Vyčištění žurnálů:</target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>Chyba zpracování souboru %x: na řádku %y ve sloupci %z.</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>Nelze uzamčít následující adresáře:</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>1 proces</pluralform>
+<pluralform>%x procesy</pluralform>
+<pluralform>%x procesů</pluralform>
+</target>
+
+<source>Cannot read directory %x.</source>
+<target>Nelze číst adresář %x.</target>
+
+<source>/sec</source>
+<target>/s</target>
+
+<source>%x items/sec</source>
+<target>%x položek/s</target>
+
+<source>Show in Explorer</source>
+<target>Zobrazit v Průzkumníkovi</target>
+
+<source>Open with default application</source>
+<target>Otevřít výchozí aplikací</target>
+
+<source>Browse directory</source>
+<target>Procházet adresář</target>
+
+<source>Unable to connect to %x.</source>
+<target>Nepodařilo se připojit k %x.</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>Nepodařil se přístup ke službě Stínové kopie.</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>Prosím použijte 64-bitovou verzi FreeFileSync pro použití služby Stínové kopie.</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>>Nelze zjistit jméno jednotky souboru %x.</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>Název disku %x není součástí cesty souboru %y.</target>
+
+<source>File time and size</source>
+<target>Podle velikosti a data souboru</target>
+
+<source>File content</source>
+<target>Podle obsahu souboru</target>
+
+<source>File size</source>
+<target>Podle velikosti souboru</target>
+
+<source>Two way</source>
+<target>Databáze</target>
+
+<source>Mirror</source>
+<target>Zrcadlení</target>
+
+<source>Update</source>
+<target>Aktualizace</target>
+
+<source>Custom</source>
+<target>Vlastní</target>
+
+<source>Multiple...</source>
+<target>Různé...</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>Nelze zapsat vlastnosti souboru %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Nelze otevřít soubor %x.</target>
+
+<source>%x and %y have different content.</source>
+<target>%x a %y mají odlišný obsah.</target>
+
+<source>Data verification error:</source>
+<target>Chyba verifikace dat:</target>
+
+<source>Moving file %x to %y</source>
+<target>Přesouvání souboru %x do %y</target>
+
+<source>Moving folder %x to %y</source>
+<target>Přesouvání adresáře %x do %y</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>Přesouvání symbolického odkazu %x do %y</target>
+
+<source>Updating file %x</source>
+<target>Aktualizace souboru %x</target>
+
+<source>Updating symbolic link %x</source>
+<target>Aktualizace symbolického odkazu %x</target>
+
+<source>Verifying file %x</source>
+<target>Kontrola souboru %x</target>
+
+<source>Updating attributes of %x</source>
+<target>Aktualizace vlastností souboru %x</target>
+
+<source>Source item %x not found</source>
+<target>Zdrojová položka %x nenalezena.</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>Vytváření Stínové kopie pro %x...</target>
+
+<source>Searching for excess file versions:</source>
+<target>Hledání nadbytečných verzí:</target>
+
+<source>Removing excess file versions:</source>
+<target>Odstraňování nadbytečných verzí:</target>
+
+<source>Cannot find folder %x.</source>
+<target>Nelze najít složku %x.</target>
+
+<source>Target folder %x already existing.</source>
+<target>Cílová složka %x již existuje.</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>Cílová složka nesmí být prázdná.</target>
+
+<source>Source folder %x not found.</source>
+<target>Zdrojovou složku %x nelze najít.</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>Prosím zadejte cílovou složku pro verzování.</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>Následující položky jsou nevyřešené konflikty a nebudou synchronizovány:</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>Následující složky se významně liší. Zkontrolujte zda máte vybránu správnou dvojici složek pro synchronizaci.</target>
+
+<source>Not enough free disk space available in:</source>
+<target>Nedostatek místa na disku:</target>
+
+<source>Required:</source>
+<target>Požadováno:</target>
+
+<source>Available:</source>
+<target>K dispozici:</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>Některé soubory budou synchronizovány jako součást vícezdrojových složek.</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>K předejití konfliktů je potřeba nastavit filtr tak, aby každý soubor měl pouze jednu základní nadřazenou složku.</target>
+
+<source>Versioning folder:</source>
+<target>Verzovací složka:</target>
+
+<source>Base folder:</source>
+<target>Základní složka:</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>Verzovaná složka je vnořena v základní nadřazené složce.</target>
+
+<source>Synchronizing folder pair:</source>
+<target>Zpracovávání páru složek:</target>
+
+<source>Generating database...</source>
+<target>Vytváření databáze...</target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>Nelze vytvořit časové značky verzování:</target>
<source>
Unexpected size of data stream.
@@ -292,17 +537,14 @@ Aktuálně: %y b
<source>Operation not supported for different base folder types.</source>
<target>Operace není podporována pro různé typy základních adresářů.</target>
-<source>Cannot write file %x.</source>
-<target>Nelze zapsat soubor %x.</target>
-
<source>Cannot move file %x to %y.</source>
<target>Nelze přesunout soubor %x do %y.</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>Nelze kopírovat symbolický odkaz %x do %y.</target>
-<source>Unable to connect to %x.</source>
-<target>Nepodařilo se připojit k %x.</target>
+<source>Error Code %x</source>
+<target>Chybový kód %x</target>
<source>Failed to get information about server %x.</source>
<target>Nelze získat informace o serveru %x.</target>
@@ -310,12 +552,6 @@ Aktuálně: %y b
<source>Cannot open directory %x.</source>
<target>Nelze otevřít adresář %x.</target>
-<source>Cannot read directory %x.</source>
-<target>Nelze číst adresář %x.</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>Nelze číst vlastnosti souboru %x.</target>
-
<source>Cannot create directory %x.</source>
<target>Nelze vytvořit adresář %x.</target>
@@ -343,9 +579,6 @@ Aktuálně: %y b
<source>Cannot find device %x.</source>
<target>Nelze nalézt zařízení %x.</target>
-<source>Cannot open file %x.</source>
-<target>Nelze otevřít soubor %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Typ položky %x není podporován:</target>
@@ -358,15 +591,9 @@ Aktuálně: %y b
<source>Incorrect command line:</source>
<target>Neplatný příkaz:</target>
-<source>Error Code %x</source>
-<target>Chybový kód %x</target>
-
<source>The server does not support authentication via %x.</source>
<target>Server nepodporuje ověření pomocí %x.</target>
-<source>Required:</source>
-<target>Požadováno:</target>
-
<source>Unable to access %x.</source>
<target>Nepodařil se přístup k %x.</target>
@@ -415,125 +642,9 @@ Aktuálně: %y b
<source>%x GB</source>
<target>%x GB</target>
-<source>Cannot load file %x.</source>
-<target>Nelze načíst soubor %x.</target>
-
-<source>Database file %x is incompatible.</source>
-<target>Chybný formát databáze %x.</target>
-
-<source>Initial synchronization:</source>
-<target>Prvotní synchronizace:</target>
-
-<source>Database file %x does not yet exist.</source>
-<target>Databázový soubor %x neexistuje.</target>
-
-<source>Database file is corrupted:</source>
-<target>Databáze je poškozená:</target>
-
-<source>The database files do not yet contain information about the last synchronization.</source>
-<target>Databázový soubor ještě neobsahuje informace o poslední synchronizaci.</target>
-
-<source>Loading file %x...</source>
-<target>Načítání souboru %x...</target>
-
-<source>Saving file %x...</source>
-<target>Ukládání souboru %x...</target>
-
-<source>Searching for folder %x...</source>
-<target>Otevírání složky %x...</target>
-
-<source>Timeout while searching for folder %x.</source>
-<target>Vypršel časový limit pro nalezení adresáře %x.</target>
-
-<source>Cannot get process information.</source>
-<target>Nelze získat informace procesu.</target>
-
-<source>Waiting while directory is locked:</source>
-<target>Čekání na uzamčení adresáře:</target>
-
-<source>Lock owner:</source>
-<target>Používá:</target>
-
-<source>Detecting abandoned lock...</source>
-<target>Prověřování uzamčení...</target>
-
-<source>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</source>
-<target>
-<pluralform>1 sekunda</pluralform>
-<pluralform>%x sekundy</pluralform>
-<pluralform>%x sekund</pluralform>
-</target>
-
-<source>Items processed:</source>
-<target>Zpracováno položek:</target>
-
-<source>Items remaining:</source>
-<target>Zbývá položek:</target>
-
-<source>Total time:</source>
-<target>Celkový čas:</target>
-
-<source>Cleaning up old log files...</source>
-<target>Odstraňování starých žurnálů...</target>
-
-<source>Error parsing file %x, row %y, column %z.</source>
-<target>Chyba zpracování souboru %x: na řádku %y ve sloupci %z.</target>
-
-<source>Cannot set directory locks for the following folders:</source>
-<target>Nelze uzamčít následující adresáře:</target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-<pluralform>1 proces</pluralform>
-<pluralform>%x procesy</pluralform>
-<pluralform>%x procesů</pluralform>
-</target>
-
-<source>Scanning:</source>
-<target>Zpracováváno:</target>
-
-<source>/sec</source>
-<target>/s</target>
-
-<source>%x items/sec</source>
-<target>%x položek/s</target>
-
-<source>Show in Explorer</source>
-<target>Zobrazit v Průzkumníkovi</target>
-
-<source>Open with default application</source>
-<target>Otevřít výchozí aplikací</target>
-
-<source>Browse directory</source>
-<target>Procházet adresář</target>
-
-<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>Nepodařil se přístup ke službě Stínové kopie.</target>
-
-<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>Prosím použijte 64-bitovou verzi FreeFileSync pro použití služby Stínové kopie.</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>>Nelze zjistit jméno jednotky souboru %x.</target>
-
-<source>Volume name %x is not part of file path %y.</source>
-<target>Název disku %x není součástí cesty souboru %y.</target>
-
-<source>Unable to create time stamp for versioning:</source>
-<target>Nelze vytvořit časové značky verzování:</target>
-
<source>Drag && drop</source>
<target>Přetáhni sem && pusť</target>
-<source>Cannot find folder %x.</source>
-<target>Nelze najít složku %x.</target>
-
<source>Select a folder</source>
<target>Vyberte adresář</target>
@@ -629,8 +740,8 @@ Příkaz je spuštěn když:
<source>Directory monitoring active</source>
<target>Sledování adresářů je aktivní</target>
-<source>Waiting until all directories are available...</source>
-<target>Čekání na nedostupné adresáře...</target>
+<source>Waiting until directory is available:</source>
+<target>Čekání na dostupnost adresáře:</target>
<source>&Restore</source>
<target>&Obnovit</target>
@@ -644,114 +755,6 @@ Příkaz je spuštěn když:
<source>&Retry</source>
<target>&Opakovat</target>
-<source>File time and size</source>
-<target>Podle velikosti a data souboru</target>
-
-<source>File content</source>
-<target>Podle obsahu souboru</target>
-
-<source>File size</source>
-<target>Podle velikosti souboru</target>
-
-<source>Two way</source>
-<target>Databáze</target>
-
-<source>Mirror</source>
-<target>Zrcadlení</target>
-
-<source>Update</source>
-<target>Aktualizace</target>
-
-<source>Custom</source>
-<target>Vlastní</target>
-
-<source>Multiple...</source>
-<target>Různé...</target>
-
-<source>Cannot write file attributes of %x.</source>
-<target>Nelze zapsat vlastnosti souboru %x.</target>
-
-<source>%x and %y have different content.</source>
-<target>%x a %y mají odlišný obsah.</target>
-
-<source>Data verification error:</source>
-<target>Chyba verifikace dat:</target>
-
-<source>Moving file %x to %y</source>
-<target>Přesouvání souboru %x do %y</target>
-
-<source>Moving folder %x to %y</source>
-<target>Přesouvání adresáře %x do %y</target>
-
-<source>Moving symbolic link %x to %y</source>
-<target>Přesouvání symbolického odkazu %x do %y</target>
-
-<source>Removing old versions...</source>
-<target>Odstraňování starých verzí...</target>
-
-<source>Updating file %x</source>
-<target>Aktualizace souboru %x</target>
-
-<source>Updating symbolic link %x</source>
-<target>Aktualizace symbolického odkazu %x</target>
-
-<source>Verifying file %x</source>
-<target>Kontrola souboru %x</target>
-
-<source>Updating attributes of %x</source>
-<target>Aktualizace vlastností souboru %x</target>
-
-<source>Source item %x not found</source>
-<target>Zdrojová položka %x nenalezena.</target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>Vytváření Stínové kopie pro %x...</target>
-
-<source>Target folder %x already existing.</source>
-<target>Cílová složka %x již existuje.</target>
-
-<source>Target folder input field must not be empty.</source>
-<target>Cílová složka nesmí být prázdná.</target>
-
-<source>Source folder %x not found.</source>
-<target>Zdrojovou složku %x nelze najít.</target>
-
-<source>Please enter a target folder for versioning.</source>
-<target>Prosím zadejte cílovou složku pro verzování.</target>
-
-<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>Následující položky jsou nevyřešené konflikty a nebudou synchronizovány:</target>
-
-<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>Následující složky se významně liší. Zkontrolujte zda máte vybránu správnou dvojici složek pro synchronizaci.</target>
-
-<source>Not enough free disk space available in:</source>
-<target>Nedostatek místa na disku:</target>
-
-<source>Available:</source>
-<target>K dispozici:</target>
-
-<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>Některé soubory budou synchronizovány jako součást vícezdrojových složek.</target>
-
-<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>K předejití konfliktů je potřeba nastavit filtr tak, aby každý soubor měl pouze jednu základní nadřazenou složku.</target>
-
-<source>Versioning folder:</source>
-<target>Verzovací složka:</target>
-
-<source>Base folder:</source>
-<target>Základní složka:</target>
-
-<source>The versioning folder is contained in a base folder.</source>
-<target>Verzovaná složka je vnořena v základní nadřazené složce.</target>
-
-<source>Synchronizing folder pair:</source>
-<target>Zpracovávání páru složek:</target>
-
-<source>Generating database...</source>
-<target>Vytváření databáze...</target>
-
<source>Loading...</source>
<target>Načítání...</target>
@@ -897,6 +900,9 @@ Příkaz je spuštěn když:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>Prosím vyberte složku na místním souborovém systému, síti nebo multimediální zařízení.</target>
+<source>Defined by context of use</source>
+<target>počet určen použitím</target>
+
<source>Requires FreeFileSync Donation Edition</source>
<target>Je vyžadována předplacená verze FreeFileSync Donation Edition</target>
@@ -1068,20 +1074,20 @@ Příkaz je spuštěn když:
<source>Show examples</source>
<target>Ukázat příklady</target>
-<source>Time span:</source>
-<target>Časové rozmezí:</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>Nastavte pravidla filtru pro vynechání některých souborů ze synchronizace. Zadávejte cesty relativně k odpovídající složce.</target>
<source>File size:</source>
<target>Velikost soubor:</target>
<source>Minimum:</source>
-<target>Od:</target>
+<target>Od verze:</target>
<source>Maximum:</source>
-<target>Do:</target>
+<target>Do verze:</target>
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target>Nastavte pravidla filtru pro vynechání některých souborů ze synchronizace. Zadávejte cesty relativně k odpovídající složce.</target>
+<source>Time span:</source>
+<target>Časové rozmezí:</target>
<source>C&lear</source>
<target>Vy&mazat</target>
@@ -1112,9 +1118,18 @@ Příkaz je spuštěn když:
<source>&Versioning</source>
<target>&Verzování</target>
+<source>Move files to a user-defined folder</source>
+<target>Přesunout soubory do uživatelského adresáře</target>
+
<source>Naming convention:</source>
<target>Pojmenování:</target>
+<source>Limit file versions:</source>
+<target>Omezení verze souboru:</target>
+
+<source>Last x days:</source>
+<target>Posledních dní:</target>
+
<source>Ignore errors</source>
<target>Přeskočit chyby</target>
@@ -1256,11 +1271,8 @@ Příkaz je spuštěn když:
<source>Save log:</source>
<target>Uložit žurnál:</target>
-<source>Limit:</source>
-<target>Omezení:</target>
-
-<source>Limit maximum number of log files</source>
-<target>Omezení maximálního počtu žurnálů</target>
+<source>Limit number of log files:</source>
+<target>Omezit množství žurnálů:</target>
<source>How can I schedule a batch job?</source>
<target>Jak nastavit spouštění dávky?</target>
@@ -1292,9 +1304,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Transfer file and folder permissions.</source>
<target>Přenést přístupová oprávnění souborů a složek.</target>
-<source>Show hidden dialogs again</source>
-<target>Znovu zobrazit skryté dialogy</target>
-
<source>Show all permanently hidden dialogs and warning messages again</source>
<target>Zobrazit znovu všechny trvale skryté dialogy a varovná hlášení</target>
@@ -1385,9 +1394,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Select Time Span</source>
<target>Časové rozmezí</target>
-<source>FreeFileSync Donation Edition</source>
-<target>FreeFileSync Donation Edition</target>
-
<source>Highlight Configurations</source>
<target>Zvýraznění položek</target>
@@ -1515,6 +1521,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Select time span...</source>
<target>Zadejte časové rozmezí...</target>
+<source>Donation Edition</source>
+<target>Předplacená verze</target>
+
<source>Folder Comparison and Synchronization</source>
<target>porovnání a synchronizace složek</target>
@@ -1642,7 +1651,7 @@ This guarantees a consistent state even in case of a serious error.
<target>Průběh</target>
<source>Log</source>
-<target>Záznam zpracování</target>
+<target>Žurnál zpracování</target>
<source>Thank you, %x, for your donation and support!</source>
<target>Děkuji, %x, za příspěvek a podporu!</target>
@@ -1716,6 +1725,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Parameters for opposite side</source>
<target>Parametry protistrany</target>
+<source>Show hidden dialogs again</source>
+<target>Znovu zobrazit skryté dialogy</target>
+
+<source>All dialogs shown</source>
+<target>Vše zobrazováno</target>
+
<source>Downloading update...</source>
<target>Stahování aktualizace...</target>
@@ -1755,9 +1770,6 @@ This guarantees a consistent state even in case of a serious error.
<source>This year</source>
<target>Tento rok</target>
-<source>Last x days</source>
-<target>dní zpětně</target>
-
<source>Byte</source>
<target>Byte</target>
@@ -1773,9 +1785,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Delete and overwrite files permanently</source>
<target>Odstranit a přepsat soubory trvale</target>
-<source>Move files to a user-defined folder</source>
-<target>Přesunout soubory do uživatelského adresáře</target>
-
<source>Replace</source>
<target>Nahradit</target>
@@ -1785,6 +1794,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Time stamp</source>
<target>Časová značka</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>Přesunout soubory do časově označené podsložky</target>
+
+<source>File</source>
+<target>Soubor</target>
+
<source>Append a time stamp to each file name</source>
<target>Přidat časovou značku ke jménu souboru</target>
@@ -1806,12 +1821,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Leave as unresolved conflict</source>
<target>Ponechat jako nevyřešený konflikt</target>
-<source>File</source>
-<target>Soubor</target>
-
<source>YYYY-MM-DD hhmmss</source>
<target>RRRR-MM-DD hhmmss</target>
+<source>Minimum version count must be smaller than maximum count.</source>
+<target>Minimální verze musí být menší než maximum.</target>
+
<source>Files</source>
<target>Soubory</target>
@@ -1961,14 +1976,14 @@ This guarantees a consistent state even in case of a serious error.
<source>Portable</source>
<target>Přenosná</target>
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>uloží nastavení do složky "%APPDATA%\FreeFileSync"</target>
+<source>Save settings in %x</source>
+<target>uloží nastavení do %x</target>
<source>Register FreeFileSync file extensions</source>
<target>zaregistruje přípony souborů FreeFileSync</target>
<source>Create Explorer context menu entries</source>
-<target>Vytvořit položky v kontextovém menu Průzkumníka</target>
+<target>vytvoří položky v kontextovém menu Průzkumníka</target>
<source>Save settings in installation directory</source>
<target>uloží nastavení do složky určené pro instalaci</target>
diff --git a/FreeFileSync/Build/Languages/danish.lng b/FreeFileSync/Build/Languages/danish.lng
index 20764c0c..d2212c78 100755
--- a/FreeFileSync/Build/Languages/danish.lng
+++ b/FreeFileSync/Build/Languages/danish.lng
@@ -115,11 +115,20 @@
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
<target>Ødelagte installationsfiler. Geninstaller FreeFileSync.</target>
+<source>Cannot load file %x.</source>
+<target>Kan ikke indlæse filen %x.</target>
+
<source>Cannot find the following folders:</source>
<target>Kan ikke finde følgende mapper:</target>
-<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>Hvis denne fejl ignoreres, betragtes mapperne som tomme. Manglende mapper oprettes automatisk efter behov.</target>
+<source>The following folders do not yet exist:</source>
+<target>Følgende mapper findes endnu ikke:</target>
+
+<source>The folders are created automatically when needed.</source>
+<target>De oprettes automatisk efter behov.</target>
+
+<source>Scanning:</source>
+<target>Skanner:</target>
<source>Comparison finished:</source>
<target>Sammenligning gennemført:</target>
@@ -214,6 +223,63 @@
<source>Out of memory.</source>
<target>Ikke nok hukommelse.</target>
+<source>Database file %x is incompatible.</source>
+<target>Databasefilen %x er inkompatibel.</target>
+
+<source>Initial synchronization:</source>
+<target>Forbereder synkronisering:</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>Databasefilen %x findes ikke.</target>
+
+<source>Database file is corrupted:</source>
+<target>Databasefil i stykker:</target>
+
+<source>Cannot write file %x.</source>
+<target>Kan ikke oprette filen %x.</target>
+
+<source>Cannot read file %x.</source>
+<target>Kan ikke læse filen %x.</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>Databasefilen indeholder endnu ikke oplysninger om sidste synkronisering.</target>
+
+<source>Loading file %x...</source>
+<target>Indlæser filen %x...</target>
+
+<source>Saving file %x...</source>
+<target>Gemmer filen %x...</target>
+
+<source>Searching for folder %x...</source>
+<target>Søger efter mappen %x...</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>Timeout ved søgning efter mappen %x.</target>
+
+<source>Cannot get process information.</source>
+<target>Kan ikke hente procesinformation.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Kan ikke læse filattributterne på %x.</target>
+
+<source>Waiting while directory is locked:</source>
+<target>Venter mens mappe låses:</target>
+
+<source>Lock owner:</source>
+<target>Låsens ejer:</target>
+
+<source>Detecting abandoned lock...</source>
+<target>Finder efterladt lås...</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 sek</pluralform>
+<pluralform>%x sek</pluralform>
+</target>
+
<source>Item exists on left side only</source>
<target>Emnet findes kun på venstre side</target>
@@ -268,8 +334,188 @@
<source>Update attributes on right</source>
<target>Opdater attributter mod højre</target>
-<source>Cannot read file %x.</source>
-<target>Kan ikke læse filen %x.</target>
+<source>Items processed:</source>
+<target>Emner behandlet:</target>
+
+<source>Items remaining:</source>
+<target>Emner tilbage:</target>
+
+<source>Total time:</source>
+<target>Samlet tid:</target>
+
+<source>Cleaning up log files:</source>
+<target>Rydder logfiler:</target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>Behandlingsfejl i filen %x, række %y, kolonne %z.</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>Kan ikke sætte mappelåse for følgende mapper:</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>1 tråd</pluralform>
+<pluralform>%x tråde</pluralform>
+</target>
+
+<source>Cannot read directory %x.</source>
+<target>Kan ikke læse mappen %x.</target>
+
+<source>/sec</source>
+<target>/sek</target>
+
+<source>%x items/sec</source>
+<target>%x emner/sek</target>
+
+<source>Show in Explorer</source>
+<target>Åben filplacering</target>
+
+<source>Open with default application</source>
+<target>Åben med standardprogram</target>
+
+<source>Browse directory</source>
+<target>Gennemse mappe</target>
+
+<source>Unable to connect to %x.</source>
+<target>Kan ikke kontakte %x.</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>VSS tjenesten er ikke tilgængelig.</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>Brug FreeFileSync 64 bit, for at oprette VSS kopier på dette system.</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>Kan ikke bestemme volumennavn for %x.</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>Volumennavnet %x er ikke del af filstien %y.</target>
+
+<source>File time and size</source>
+<target>Størrelse og tid</target>
+
+<source>File content</source>
+<target>Indhold</target>
+
+<source>File size</source>
+<target>Størrelse</target>
+
+<source>Two way</source>
+<target>Tovejs</target>
+
+<source>Mirror</source>
+<target>Spejling</target>
+
+<source>Update</source>
+<target>Opdater</target>
+
+<source>Custom</source>
+<target>Tilpasset</target>
+
+<source>Multiple...</source>
+<target>Flere...</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>Kan ikke skrive filattributter til %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Filen %x kan ikke åbnes.</target>
+
+<source>%x and %y have different content.</source>
+<target>%x og %y har forskelligt indhold.</target>
+
+<source>Data verification error:</source>
+<target>Verifikationsfejl:</target>
+
+<source>Moving file %x to %y</source>
+<target>Flytter filen %x til %y</target>
+
+<source>Moving folder %x to %y</source>
+<target>Flytter mappen %x til %y</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>Flytter symlinket %x til %y</target>
+
+<source>Updating file %x</source>
+<target>Opdaterer filen %x</target>
+
+<source>Updating symbolic link %x</source>
+<target>Opdaterer symbolsk link %x</target>
+
+<source>Verifying file %x</source>
+<target>Verificerer filen %x</target>
+
+<source>Updating attributes of %x</source>
+<target>Opdaterer attributter for %x</target>
+
+<source>Source item %x not found</source>
+<target>Kildeemne %x ikke fundet</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>Opretter VSS kopi for %x...</target>
+
+<source>Cannot find folder %x.</source>
+<target>Kan ikke finde mappen %x.</target>
+
+<source>Target folder %x already existing.</source>
+<target>Destinationsmappen %x findes allerede.</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>Destinationsmappen skal angives.</target>
+
+<source>Source folder %x not found.</source>
+<target>Kildemappen %x blev ikke fundet.</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>Angiv mappe til versionering.</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>Følgende emner har uløste konflikter og synkroniseres ikke:</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>Følgende mapper er markant forskellige. Kontroller at du har valgt de rigtige mapper.</target>
+
+<source>Not enough free disk space available in:</source>
+<target>Ikke nok ledig diskplads på:</target>
+
+<source>Required:</source>
+<target>Krævet:</target>
+
+<source>Available:</source>
+<target>Tilgængeligt:</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>Nogle filer synkroniseres som del af flere basismapper.</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>Undgå konflikter ved at bruge filtre, så hver opdateret fil kun relateres til en basismappe.</target>
+
+<source>Versioning folder:</source>
+<target>Versioneringsmappe:</target>
+
+<source>Base folder:</source>
+<target>Basismappe:</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>Versioneringsmappen ligger i hovedmappen.</target>
+
+<source>Synchronizing folder pair:</source>
+<target>Synkroniserer mappepar:</target>
+
+<source>Generating database...</source>
+<target>Opretter database...</target>
+
+<source>Searching for excess file versions:</source>
+<target>Finder overskredne filversioner:</target>
+
+<source>Removing excess file versions:</source>
+<target>Fjerner overskredne filversioner:</target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>Kan ikke oprette tidsstempel til versionering:</target>
<source>
Unexpected size of data stream.
@@ -288,17 +534,14 @@ Aktuel: %y byte
<source>Operation not supported for different base folder types.</source>
<target>Handlingen understøtter ikke forskellige typer hovedmapper.</target>
-<source>Cannot write file %x.</source>
-<target>Kan ikke oprette filen %x.</target>
-
<source>Cannot move file %x to %y.</source>
<target>Kan ikke flytte filen %x til %y.</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>Kan ikke kopiere symlink fra %x til %y.</target>
-<source>Unable to connect to %x.</source>
-<target>Kan ikke kontakte %x.</target>
+<source>Error Code %x</source>
+<target>Fejlkode %x</target>
<source>Failed to get information about server %x.</source>
<target>Kunne ikke hente oplysninger om serveren %x.</target>
@@ -306,12 +549,6 @@ Aktuel: %y byte
<source>Cannot open directory %x.</source>
<target>Kan ikke åbne mappen %x.</target>
-<source>Cannot read directory %x.</source>
-<target>Kan ikke læse mappen %x.</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>Kan ikke læse filattributterne på %x.</target>
-
<source>Cannot create directory %x.</source>
<target>Kan ikke oprette mappen %x.</target>
@@ -339,9 +576,6 @@ Aktuel: %y byte
<source>Cannot find device %x.</source>
<target>Kan ikke finde enheden %x.</target>
-<source>Cannot open file %x.</source>
-<target>Filen %x kan ikke åbnes.</target>
-
<source>Type of item %x is not supported:</source>
<target>Filtypen %x understøttes ikke:</target>
@@ -354,15 +588,9 @@ Aktuel: %y byte
<source>Incorrect command line:</source>
<target>Ugyldig kommando:</target>
-<source>Error Code %x</source>
-<target>Fejlkode %x</target>
-
<source>The server does not support authentication via %x.</source>
<target>Serveren støtter ikke godkendelse via %x.</target>
-<source>Required:</source>
-<target>Krævet:</target>
-
<source>Unable to access %x.</source>
<target>Kan ikke tilgå %x.</target>
@@ -408,123 +636,9 @@ Aktuel: %y byte
<source>%x GB</source>
<target>%x GB</target>
-<source>Cannot load file %x.</source>
-<target>Kan ikke indlæse filen %x.</target>
-
-<source>Database file %x is incompatible.</source>
-<target>Databasefilen %x er inkompatibel.</target>
-
-<source>Initial synchronization:</source>
-<target>Forbereder synkronisering:</target>
-
-<source>Database file %x does not yet exist.</source>
-<target>Databasefilen %x findes ikke.</target>
-
-<source>Database file is corrupted:</source>
-<target>Databasefil i stykker:</target>
-
-<source>The database files do not yet contain information about the last synchronization.</source>
-<target>Databasefilen indeholder endnu ikke oplysninger om sidste synkronisering.</target>
-
-<source>Loading file %x...</source>
-<target>Indlæser filen %x...</target>
-
-<source>Saving file %x...</source>
-<target>Gemmer filen %x...</target>
-
-<source>Searching for folder %x...</source>
-<target>Søger efter mappen %x...</target>
-
-<source>Timeout while searching for folder %x.</source>
-<target>Timeout ved søgning efter mappen %x.</target>
-
-<source>Cannot get process information.</source>
-<target>Kan ikke hente procesinformation.</target>
-
-<source>Waiting while directory is locked:</source>
-<target>Venter mens mappe låses:</target>
-
-<source>Lock owner:</source>
-<target>Låsens ejer:</target>
-
-<source>Detecting abandoned lock...</source>
-<target>Finder efterladt lås...</target>
-
-<source>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</source>
-<target>
-<pluralform>1 sek</pluralform>
-<pluralform>%x sek</pluralform>
-</target>
-
-<source>Items processed:</source>
-<target>Emner behandlet:</target>
-
-<source>Items remaining:</source>
-<target>Emner tilbage:</target>
-
-<source>Total time:</source>
-<target>Samlet tid:</target>
-
-<source>Cleaning up old log files...</source>
-<target>Fjerner gamle logfiler...</target>
-
-<source>Error parsing file %x, row %y, column %z.</source>
-<target>Behandlingsfejl i filen %x, række %y, kolonne %z.</target>
-
-<source>Cannot set directory locks for the following folders:</source>
-<target>Kan ikke sætte mappelåse for følgende mapper:</target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-<pluralform>1 tråd</pluralform>
-<pluralform>%x tråde</pluralform>
-</target>
-
-<source>Scanning:</source>
-<target>Skanner:</target>
-
-<source>/sec</source>
-<target>/sek</target>
-
-<source>%x items/sec</source>
-<target>%x emner/sek</target>
-
-<source>Show in Explorer</source>
-<target>Åben filplacering</target>
-
-<source>Open with default application</source>
-<target>Åben med standardprogram</target>
-
-<source>Browse directory</source>
-<target>Gennemse mappe</target>
-
-<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>VSS tjenesten er ikke tilgængelig.</target>
-
-<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>Brug FreeFileSync 64 bit, for at oprette VSS kopier på dette system.</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>Kan ikke bestemme volumennavn for %x.</target>
-
-<source>Volume name %x is not part of file path %y.</source>
-<target>Volumennavnet %x er ikke del af filstien %y.</target>
-
-<source>Unable to create time stamp for versioning:</source>
-<target>Kan ikke oprette tidsstempel til versionering:</target>
-
<source>Drag && drop</source>
<target>Træk emner hertil</target>
-<source>Cannot find folder %x.</source>
-<target>Kan ikke finde mappen %x.</target>
-
<source>Select a folder</source>
<target>Vælg en mappe</target>
@@ -620,8 +734,8 @@ Kommandoen udføres hvis:
<source>Directory monitoring active</source>
<target>Mappeovervågning aktiv</target>
-<source>Waiting until all directories are available...</source>
-<target>Venter til alle mapper er tilgængelige...</target>
+<source>Waiting until directory is available:</source>
+<target>Venter til mappe er tilgængelig:</target>
<source>&Restore</source>
<target>&Vis vindue</target>
@@ -635,114 +749,6 @@ Kommandoen udføres hvis:
<source>&Retry</source>
<target>&Prøv igen</target>
-<source>File time and size</source>
-<target>Størrelse og tid</target>
-
-<source>File content</source>
-<target>Indhold</target>
-
-<source>File size</source>
-<target>Størrelse</target>
-
-<source>Two way</source>
-<target>Tovejs</target>
-
-<source>Mirror</source>
-<target>Spejling</target>
-
-<source>Update</source>
-<target>Opdater</target>
-
-<source>Custom</source>
-<target>Tilpasset</target>
-
-<source>Multiple...</source>
-<target>Flere...</target>
-
-<source>Cannot write file attributes of %x.</source>
-<target>Kan ikke skrive filattributter til %x.</target>
-
-<source>%x and %y have different content.</source>
-<target>%x og %y har forskelligt indhold.</target>
-
-<source>Data verification error:</source>
-<target>Verifikationsfejl:</target>
-
-<source>Moving file %x to %y</source>
-<target>Flytter filen %x til %y</target>
-
-<source>Moving folder %x to %y</source>
-<target>Flytter mappen %x til %y</target>
-
-<source>Moving symbolic link %x to %y</source>
-<target>Flytter symlinket %x til %y</target>
-
-<source>Removing old versions...</source>
-<target>Fjerner gamle udgaver...</target>
-
-<source>Updating file %x</source>
-<target>Opdaterer filen %x</target>
-
-<source>Updating symbolic link %x</source>
-<target>Opdaterer symbolsk link %x</target>
-
-<source>Verifying file %x</source>
-<target>Verificerer filen %x</target>
-
-<source>Updating attributes of %x</source>
-<target>Opdaterer attributter for %x</target>
-
-<source>Source item %x not found</source>
-<target>Kildeemne %x ikke fundet</target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>Opretter VSS kopi for %x...</target>
-
-<source>Target folder %x already existing.</source>
-<target>Destinationsmappen %x findes allerede.</target>
-
-<source>Target folder input field must not be empty.</source>
-<target>Destinationsmappen skal angives.</target>
-
-<source>Source folder %x not found.</source>
-<target>Kildemappen %x blev ikke fundet.</target>
-
-<source>Please enter a target folder for versioning.</source>
-<target>Angiv mappe til versionering.</target>
-
-<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>Følgende emner har uløste konflikter og synkroniseres ikke:</target>
-
-<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>Følgende mapper er markant forskellige. Kontroller at du har valgt de rigtige mapper.</target>
-
-<source>Not enough free disk space available in:</source>
-<target>Ikke nok ledig diskplads på:</target>
-
-<source>Available:</source>
-<target>Tilgængeligt:</target>
-
-<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>Nogle filer synkroniseres som del af flere basismapper.</target>
-
-<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>Undgå konflikter ved at bruge filtre, så hver opdateret fil kun relateres til en basismappe.</target>
-
-<source>Versioning folder:</source>
-<target>Versioneringsmappe:</target>
-
-<source>Base folder:</source>
-<target>Basismappe:</target>
-
-<source>The versioning folder is contained in a base folder.</source>
-<target>Versioneringsmappen ligger i hovedmappen.</target>
-
-<source>Synchronizing folder pair:</source>
-<target>Synkroniserer mappepar:</target>
-
-<source>Generating database...</source>
-<target>Opretter database...</target>
-
<source>Loading...</source>
<target>Indlæser...</target>
@@ -888,7 +894,7 @@ Kommandoen udføres hvis:
<target>Vælg lokal mappe, netværksmappe eller mappe på MTP enhed.</target>
<source>Defined by context of use</source>
-<target></target>
+<target>Defineres af aktuelle betingelser</target>
<source>Requires FreeFileSync Donation Edition</source>
<target>Kræver FreeFileSync donationsudgave</target>
@@ -1061,8 +1067,8 @@ Kommandoen udføres hvis:
<source>Show examples</source>
<target>Vis eksempler</target>
-<source>Time span:</source>
-<target>Interval:</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>Angiv filterregler der udelukker bestemte filer fra synkroniseringen. Filstier skal relatere til kildemapperne.</target>
<source>File size:</source>
<target>Filstørrelse:</target>
@@ -1073,8 +1079,8 @@ Kommandoen udføres hvis:
<source>Maximum:</source>
<target>Maksimum:</target>
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target>Angiv filterregler der udelukker bestemte filer fra synkroniseringen. Filstier skal relatere til kildemapperne.</target>
+<source>Time span:</source>
+<target>Interval:</target>
<source>C&lear</source>
<target>R&yd</target>
@@ -1105,9 +1111,18 @@ Kommandoen udføres hvis:
<source>&Versioning</source>
<target>&Versionering</target>
+<source>Move files to a user-defined folder</source>
+<target>Flyt filer til brugerdefineret mappe</target>
+
<source>Naming convention:</source>
<target>Navneregler:</target>
+<source>Limit file versions:</source>
+<target>Begræns filversioner:</target>
+
+<source>Last x days:</source>
+<target>Sidste x dage:</target>
+
<source>Ignore errors</source>
<target>Ignorér fejl</target>
@@ -1249,11 +1264,8 @@ Kommandoen udføres hvis:
<source>Save log:</source>
<target>Gem log:</target>
-<source>Limit:</source>
-<target>Højst:</target>
-
-<source>Limit maximum number of log files</source>
-<target>Begræns antal rapporter</target>
+<source>Limit number of log files:</source>
+<target>Begræns antal logfiler:</target>
<source>How can I schedule a batch job?</source>
<target>Hvordan oprettes en batchfil?</target>
@@ -1288,9 +1300,6 @@ Sikrer processen ved alvorlige fejl.
<source>Transfer file and folder permissions.</source>
<target>Overfør fil og mappetilladelser.</target>
-<source>Show hidden dialogs again</source>
-<target>Gendan skjulte beskeder</target>
-
<source>Show all permanently hidden dialogs and warning messages again</source>
<target>Vis skjulte advarsler og beskeder igen</target>
@@ -1381,9 +1390,6 @@ Sikrer processen ved alvorlige fejl.
<source>Select Time Span</source>
<target>Vælg tidsinterval</target>
-<source>FreeFileSync Donation Edition</source>
-<target>FreeFileSync donationsudgave</target>
-
<source>Highlight Configurations</source>
<target>Fremhæv indstillinger</target>
@@ -1507,6 +1513,9 @@ Sikrer processen ved alvorlige fejl.
<source>Select time span...</source>
<target>Vælg tidsinterval...</target>
+<source>Donation Edition</source>
+<target>Donationsudgave</target>
+
<source>Folder Comparison and Synchronization</source>
<target>Mappeanalyse og synkronisering</target>
@@ -1705,6 +1714,12 @@ Sikrer processen ved alvorlige fejl.
<source>Parameters for opposite side</source>
<target>Modsatte sides parametre</target>
+<source>Show hidden dialogs again</source>
+<target>Gendan skjulte beskeder</target>
+
+<source>All dialogs shown</source>
+<target>Alle dialoger vises</target>
+
<source>Downloading update...</source>
<target>Henter opdatering...</target>
@@ -1744,9 +1759,6 @@ Sikrer processen ved alvorlige fejl.
<source>This year</source>
<target>Dette år</target>
-<source>Last x days</source>
-<target>Sidste x dage</target>
-
<source>Byte</source>
<target>Byte</target>
@@ -1762,9 +1774,6 @@ Sikrer processen ved alvorlige fejl.
<source>Delete and overwrite files permanently</source>
<target>Slet og overskriv permanent</target>
-<source>Move files to a user-defined folder</source>
-<target>Flyt filer til brugerdefineret mappe</target>
-
<source>Replace</source>
<target>Erstat</target>
@@ -1774,6 +1783,12 @@ Sikrer processen ved alvorlige fejl.
<source>Time stamp</source>
<target>Tidsstempel</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>Flyt filer til tidsmærket undermappe</target>
+
+<source>File</source>
+<target>Fil</target>
+
<source>Append a time stamp to each file name</source>
<target>Føj tidsstempel til hvert filnavn</target>
@@ -1795,12 +1810,12 @@ Sikrer processen ved alvorlige fejl.
<source>Leave as unresolved conflict</source>
<target>Efterlad som uløst konflikt</target>
-<source>File</source>
-<target>Fil</target>
-
<source>YYYY-MM-DD hhmmss</source>
<target>YYYY-MM-DD hhmmss</target>
+<source>Minimum version count must be smaller than maximum count.</source>
+<target>Mindste antal versioner skal være mindre end det maksimale.</target>
+
<source>Files</source>
<target>Filer</target>
@@ -1948,11 +1963,11 @@ Sikrer processen ved alvorlige fejl.
<source>Portable</source>
<target>Portable</target>
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>Gemmer indstillinger i "%APPDATA%\FreeFileSync"</target>
+<source>Save settings in %x</source>
+<target>Gem indstillinger i %x</target>
<source>Register FreeFileSync file extensions</source>
-<target>Registrerer FreeFileSync filtyper</target>
+<target>Registrér FreeFileSync filtyper</target>
<source>Create Explorer context menu entries</source>
<target>Vises i Stifinders højrekliksmenu</target>
diff --git a/FreeFileSync/Build/Languages/dutch.lng b/FreeFileSync/Build/Languages/dutch.lng
index 321314c7..8828441e 100755
--- a/FreeFileSync/Build/Languages/dutch.lng
+++ b/FreeFileSync/Build/Languages/dutch.lng
@@ -115,11 +115,20 @@
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
<target>Installatiebestanden zijn beschadigd. Installeer FreeFileSync opnieuw.</target>
+<source>Cannot load file %x.</source>
+<target>Kan bestand %x niet inlezen.</target>
+
<source>Cannot find the following folders:</source>
<target>De volgende mappen konden niet worden gevonden:</target>
-<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>Indien deze fout wordt genegeerd zullen de mappen als leeg beschouwd worden. Ontbrekende mappen worden automatisch aangemaakt indien nodig.</target>
+<source>The following folders do not yet exist:</source>
+<target>De volgende mappen bestaan nog niet:</target>
+
+<source>The folders are created automatically when needed.</source>
+<target>De mappen worden automatisch gemaakt indien dit nodig is.</target>
+
+<source>Scanning:</source>
+<target>Scannen:</target>
<source>Comparison finished:</source>
<target>Vergelijking voltooid:</target>
@@ -214,6 +223,63 @@
<source>Out of memory.</source>
<target>Onvoldoende werkgeheugen.</target>
+<source>Database file %x is incompatible.</source>
+<target>Databasebestand %x is niet compatibel.</target>
+
+<source>Initial synchronization:</source>
+<target>Initiële synchronisatie:</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>Databasebestand %x bestaat nog niet.</target>
+
+<source>Database file is corrupted:</source>
+<target>Databasebestand is beschadigd:</target>
+
+<source>Cannot write file %x.</source>
+<target>Kan bestand %x niet schrijven.</target>
+
+<source>Cannot read file %x.</source>
+<target>Kan het bestand %x niet lezen.</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>De databasebestanden bevatten nog geen informatie over de laatste synchronisatie.</target>
+
+<source>Loading file %x...</source>
+<target>Laden van bestand %x...</target>
+
+<source>Saving file %x...</source>
+<target>Opslaan van bestand %x...</target>
+
+<source>Searching for folder %x...</source>
+<target>Zoeken naar map %x...</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>Time-out tijdens het zoeken naar de map %x.</target>
+
+<source>Cannot get process information.</source>
+<target>Kan geen procesinformatie krijgen.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Kan de bestandskenmerken van %x niet lezen.</target>
+
+<source>Waiting while directory is locked:</source>
+<target>Wachten terwijl de map is vergrendeld:</target>
+
+<source>Lock owner:</source>
+<target>Vergrendel eigenaar:</target>
+
+<source>Detecting abandoned lock...</source>
+<target>Opsporen van verlaten vergrendeling...</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</target>
+
<source>Item exists on left side only</source>
<target>Item bestaat alleen aan de linkerzijde</target>
@@ -268,8 +334,188 @@
<source>Update attributes on right</source>
<target>Update kenmerken aan de rechterzijde</target>
-<source>Cannot read file %x.</source>
-<target>Kan het bestand %x niet lezen.</target>
+<source>Items processed:</source>
+<target>Items verwerkt:</target>
+
+<source>Items remaining:</source>
+<target>Overgebleven items:</target>
+
+<source>Total time:</source>
+<target>Totale tijd:</target>
+
+<source>Cleaning up log files:</source>
+<target>Logbestanden opschonen:</target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>Fout bij het analyseren van bestand %x, rij %y, kolom %z.</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>Kan map vergrendelingen niet instellen voor de volgende mappen:</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</target>
+
+<source>Cannot read directory %x.</source>
+<target>Kan de map %x niet lezen.</target>
+
+<source>/sec</source>
+<target>/sec</target>
+
+<source>%x items/sec</source>
+<target>%x items/sec</target>
+
+<source>Show in Explorer</source>
+<target>In Explorer weergeven</target>
+
+<source>Open with default application</source>
+<target>Openen met standaardtoepassing</target>
+
+<source>Browse directory</source>
+<target>Blader in map</target>
+
+<source>Unable to connect to %x.</source>
+<target>Kan geen verbinding maken met %x.</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>Kan geen toegang krijgen tot de Volume Shadow Copy Service.</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>Gelieve de 64-bits versie van FreeFileSync te gebruiken om schaduwkopiën te maken op dit systeem.</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>Kan de volumenaam niet vaststellen voor %x.</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>Volumenaam %x behoort niet tot bestandspad %y.</target>
+
+<source>File time and size</source>
+<target>Datum en grootte bestand</target>
+
+<source>File content</source>
+<target>Bestandsinhoud</target>
+
+<source>File size</source>
+<target>Bestandsgrootte</target>
+
+<source>Two way</source>
+<target>Twee richtingen</target>
+
+<source>Mirror</source>
+<target>Spiegelen</target>
+
+<source>Update</source>
+<target>Bijwerken</target>
+
+<source>Custom</source>
+<target>Aangepast</target>
+
+<source>Multiple...</source>
+<target>Meerdere...</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>De bestandskenmerken voor %x kunnen niet geschreven worden.</target>
+
+<source>Cannot open file %x.</source>
+<target>Het bestand %x kan niet geopend worden.</target>
+
+<source>%x and %y have different content.</source>
+<target>%x en %y hebben verschillende inhoud.</target>
+
+<source>Data verification error:</source>
+<target>Gegevens verificatiefout:</target>
+
+<source>Moving file %x to %y</source>
+<target>Bestand %x verplaatsen naar %y</target>
+
+<source>Moving folder %x to %y</source>
+<target>Map %x verplaatsen naar %y</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>Symbolische link %x verplaatsen naar %y</target>
+
+<source>Updating file %x</source>
+<target>Bestand %x bijwerken</target>
+
+<source>Updating symbolic link %x</source>
+<target>Symbolische link %x bijwerken</target>
+
+<source>Verifying file %x</source>
+<target>Controleren van bestand %x</target>
+
+<source>Updating attributes of %x</source>
+<target>Kenmerken van %x bijwerken</target>
+
+<source>Source item %x not found</source>
+<target>Bronitem %x niet gevonden</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>Maken van een volume schaduwkopie voor %x...</target>
+
+<source>Searching for excess file versions:</source>
+<target>Zoeken naar overtollige bestandsversies:</target>
+
+<source>Removing excess file versions:</source>
+<target>Overmatige bestandsversies verwijderen:</target>
+
+<source>Cannot find folder %x.</source>
+<target>Kan de map %x niet vinden.</target>
+
+<source>Target folder %x already existing.</source>
+<target>Doelmap %x bestaat reeds.</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>Het invoerveld van de doelmap moet niet leeg zijn.</target>
+
+<source>Source folder %x not found.</source>
+<target>Bronmap %x niet gevonden.</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>Voer een doelmap in voor versiebeheer.</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>De volgende items hebben onopgeloste conflicten en zullen niet worden gesynchroniseerd:</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>De volgende mappen zijn significant verschillend. Controleer of de juiste mappen zijn geselecteerd voor synchronisatie.</target>
+
+<source>Not enough free disk space available in:</source>
+<target>Er is onvoldoende vrije schijfruimte beschikbaar in:</target>
+
+<source>Required:</source>
+<target>Vereist:</target>
+
+<source>Available:</source>
+<target>Beschikbaar:</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>Sommige bestanden worden gesynchroniseerd als onderdeel van meerdere basis mappen.</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>Om conflicten te voorkomen, filters uitsluitingen zodanig instellen dat elke bijgewerkte bestand wordt beschouwd als slechts één basismap.</target>
+
+<source>Versioning folder:</source>
+<target>Map versiebeheer:</target>
+
+<source>Base folder:</source>
+<target>Basismap:</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>De map versiebeheer bevindt zich in een basismap.</target>
+
+<source>Synchronizing folder pair:</source>
+<target>Synchroniseren van map-paar:</target>
+
+<source>Generating database...</source>
+<target>Genereren database...</target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>Kan geen tijdstempel maken voor versiebeheer:</target>
<source>
Unexpected size of data stream.
@@ -288,17 +534,14 @@ Werkelijk: %y bytes
<source>Operation not supported for different base folder types.</source>
<target>Deze bewerking wordt niet ondersteund voor verschillende basis maptypen.</target>
-<source>Cannot write file %x.</source>
-<target>Kan bestand %x niet schrijven.</target>
-
<source>Cannot move file %x to %y.</source>
<target>Het bestand %x kan niet naar %y verplaatst worden.</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>Kan de symbolische koppeling %x niet kopiëren naar %y.</target>
-<source>Unable to connect to %x.</source>
-<target>Kan geen verbinding maken met %x.</target>
+<source>Error Code %x</source>
+<target>Foutcode %x</target>
<source>Failed to get information about server %x.</source>
<target>Fout bij het ophalen van informatie over server %x.</target>
@@ -306,12 +549,6 @@ Werkelijk: %y bytes
<source>Cannot open directory %x.</source>
<target>Kan de map %x niet openen.</target>
-<source>Cannot read directory %x.</source>
-<target>Kan de map %x niet lezen.</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>Kan de bestandskenmerken van %x niet lezen.</target>
-
<source>Cannot create directory %x.</source>
<target>Kan de map %x niet maken.</target>
@@ -339,9 +576,6 @@ Werkelijk: %y bytes
<source>Cannot find device %x.</source>
<target>Kan apparaat %x niet vinden.</target>
-<source>Cannot open file %x.</source>
-<target>Het bestand %x kan niet geopend worden.</target>
-
<source>Type of item %x is not supported:</source>
<target>Dit itemtype %x wordt niet ondersteund:</target>
@@ -354,15 +588,9 @@ Werkelijk: %y bytes
<source>Incorrect command line:</source>
<target>Onjuiste opdrachtregel:</target>
-<source>Error Code %x</source>
-<target>Foutcode %x</target>
-
<source>The server does not support authentication via %x.</source>
<target>De server ondersteunt geen verificatie via %x.</target>
-<source>Required:</source>
-<target>Vereist:</target>
-
<source>Unable to access %x.</source>
<target>Geen toegang tot %x.</target>
@@ -408,123 +636,9 @@ Werkelijk: %y bytes
<source>%x GB</source>
<target>%x GB</target>
-<source>Cannot load file %x.</source>
-<target>Kan bestand %x niet inlezen.</target>
-
-<source>Database file %x is incompatible.</source>
-<target>Databasebestand %x is niet compatibel.</target>
-
-<source>Initial synchronization:</source>
-<target>Initiële synchronisatie:</target>
-
-<source>Database file %x does not yet exist.</source>
-<target>Databasebestand %x bestaat nog niet.</target>
-
-<source>Database file is corrupted:</source>
-<target>Databasebestand is beschadigd:</target>
-
-<source>The database files do not yet contain information about the last synchronization.</source>
-<target>De databasebestanden bevatten nog geen informatie over de laatste synchronisatie.</target>
-
-<source>Loading file %x...</source>
-<target>Laden van bestand %x...</target>
-
-<source>Saving file %x...</source>
-<target>Opslaan van bestand %x...</target>
-
-<source>Searching for folder %x...</source>
-<target>Zoeken naar map %x...</target>
-
-<source>Timeout while searching for folder %x.</source>
-<target>Time-out tijdens het zoeken naar de map %x.</target>
-
-<source>Cannot get process information.</source>
-<target>Kan geen procesinformatie krijgen.</target>
-
-<source>Waiting while directory is locked:</source>
-<target>Wachten terwijl de map is vergrendeld:</target>
-
-<source>Lock owner:</source>
-<target>Vergrendel eigenaar:</target>
-
-<source>Detecting abandoned lock...</source>
-<target>Opsporen van verlaten vergrendeling...</target>
-
-<source>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</source>
-<target>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</target>
-
-<source>Items processed:</source>
-<target>Items verwerkt:</target>
-
-<source>Items remaining:</source>
-<target>Overgebleven items:</target>
-
-<source>Total time:</source>
-<target>Totale tijd:</target>
-
-<source>Cleaning up old log files...</source>
-<target>Opruimen oude logboekbestanden...</target>
-
-<source>Error parsing file %x, row %y, column %z.</source>
-<target>Fout bij het analyseren van bestand %x, rij %y, kolom %z.</target>
-
-<source>Cannot set directory locks for the following folders:</source>
-<target>Kan map vergrendelingen niet instellen voor de volgende mappen:</target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</target>
-
-<source>Scanning:</source>
-<target>Scannen:</target>
-
-<source>/sec</source>
-<target>/sec</target>
-
-<source>%x items/sec</source>
-<target>%x items/sec</target>
-
-<source>Show in Explorer</source>
-<target>In Explorer weergeven</target>
-
-<source>Open with default application</source>
-<target>Openen met standaardtoepassing</target>
-
-<source>Browse directory</source>
-<target>Blader in map</target>
-
-<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>Kan geen toegang krijgen tot de Volume Shadow Copy Service.</target>
-
-<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>Gelieve de 64-bits versie van FreeFileSync te gebruiken om schaduwkopiën te maken op dit systeem.</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>Kan de volumenaam niet vaststellen voor %x.</target>
-
-<source>Volume name %x is not part of file path %y.</source>
-<target>Volumenaam %x behoort niet tot bestandspad %y.</target>
-
-<source>Unable to create time stamp for versioning:</source>
-<target>Kan geen tijdstempel maken voor versiebeheer:</target>
-
<source>Drag && drop</source>
<target>Slepen && neerzetten</target>
-<source>Cannot find folder %x.</source>
-<target>Kan de map %x niet vinden.</target>
-
<source>Select a folder</source>
<target>Selecteer een map</target>
@@ -620,8 +734,8 @@ De opdracht wordt geactiveerd als:
<source>Directory monitoring active</source>
<target>Mapcontrole actief</target>
-<source>Waiting until all directories are available...</source>
-<target>Wacht totdat alle mappen beschikbaar zijn...</target>
+<source>Waiting until directory is available:</source>
+<target>Wachten tot de map beschikbaar is:</target>
<source>&Restore</source>
<target>&Herstellen</target>
@@ -635,114 +749,6 @@ De opdracht wordt geactiveerd als:
<source>&Retry</source>
<target>&Probeer opnieuw</target>
-<source>File time and size</source>
-<target>Datum en grootte bestand</target>
-
-<source>File content</source>
-<target>Bestandsinhoud</target>
-
-<source>File size</source>
-<target>Bestandsgrootte</target>
-
-<source>Two way</source>
-<target>Twee richtingen</target>
-
-<source>Mirror</source>
-<target>Spiegelen</target>
-
-<source>Update</source>
-<target>Bijwerken</target>
-
-<source>Custom</source>
-<target>Aangepast</target>
-
-<source>Multiple...</source>
-<target>Meerdere...</target>
-
-<source>Cannot write file attributes of %x.</source>
-<target>De bestandskenmerken voor %x kunnen niet geschreven worden.</target>
-
-<source>%x and %y have different content.</source>
-<target>%x en %y hebben verschillende inhoud.</target>
-
-<source>Data verification error:</source>
-<target>Gegevens verificatiefout:</target>
-
-<source>Moving file %x to %y</source>
-<target>Bestand %x verplaatsen naar %y</target>
-
-<source>Moving folder %x to %y</source>
-<target>Map %x verplaatsen naar %y</target>
-
-<source>Moving symbolic link %x to %y</source>
-<target>Symbolische link %x verplaatsen naar %y</target>
-
-<source>Removing old versions...</source>
-<target>Verwijderen van oude versies...</target>
-
-<source>Updating file %x</source>
-<target>Bestand %x bijwerken</target>
-
-<source>Updating symbolic link %x</source>
-<target>Symbolische link %x bijwerken</target>
-
-<source>Verifying file %x</source>
-<target>Controleren van bestand %x</target>
-
-<source>Updating attributes of %x</source>
-<target>Kenmerken van %x bijwerken</target>
-
-<source>Source item %x not found</source>
-<target>Bronitem %x niet gevonden</target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>Maken van een volume schaduwkopie voor %x...</target>
-
-<source>Target folder %x already existing.</source>
-<target>Doelmap %x bestaat reeds.</target>
-
-<source>Target folder input field must not be empty.</source>
-<target>Het invoerveld van de doelmap moet niet leeg zijn.</target>
-
-<source>Source folder %x not found.</source>
-<target>Bronmap %x niet gevonden.</target>
-
-<source>Please enter a target folder for versioning.</source>
-<target>Voer een doelmap in voor versiebeheer.</target>
-
-<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>De volgende items hebben onopgeloste conflicten en zullen niet worden gesynchroniseerd:</target>
-
-<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>De volgende mappen zijn significant verschillend. Controleer of de juiste mappen zijn geselecteerd voor synchronisatie.</target>
-
-<source>Not enough free disk space available in:</source>
-<target>Er is onvoldoende vrije schijfruimte beschikbaar in:</target>
-
-<source>Available:</source>
-<target>Beschikbaar:</target>
-
-<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>Sommige bestanden worden gesynchroniseerd als onderdeel van meerdere basis mappen.</target>
-
-<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>Om conflicten te voorkomen, filters uitsluitingen zodanig instellen dat elke bijgewerkte bestand wordt beschouwd als slechts één basismap.</target>
-
-<source>Versioning folder:</source>
-<target>Map versiebeheer:</target>
-
-<source>Base folder:</source>
-<target>Basismap:</target>
-
-<source>The versioning folder is contained in a base folder.</source>
-<target>De map versiebeheer bevindt zich in een basismap.</target>
-
-<source>Synchronizing folder pair:</source>
-<target>Synchroniseren van map-paar:</target>
-
-<source>Generating database...</source>
-<target>Genereren database...</target>
-
<source>Loading...</source>
<target>Laden...</target>
@@ -888,10 +894,10 @@ De opdracht wordt geactiveerd als:
<target>Selecteer een map op een lokaal bestandssysteem, netwerk of een MTP-apparaat.</target>
<source>Defined by context of use</source>
-<target></target>
+<target>Gedefinieerd door de samenhang van het gebruik</target>
<source>Requires FreeFileSync Donation Edition</source>
-<target>Vereist FreeFileSync donatie Editie</target>
+<target>Vereist FreeFileSync Donatie Editie</target>
<source>&Save</source>
<target>&Opslaan</target>
@@ -1061,8 +1067,8 @@ De opdracht wordt geactiveerd als:
<source>Show examples</source>
<target>Toon voorbeelden</target>
-<source>Time span:</source>
-<target>Tijdsduur:</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>Selecteer filterregels om bepaalde bestanden uit te sluiten van synchronisatie. Voer bestandspaden in ten opzichte van hun bijbehorend map-paar.</target>
<source>File size:</source>
<target>Bestandsgrootte:</target>
@@ -1073,8 +1079,8 @@ De opdracht wordt geactiveerd als:
<source>Maximum:</source>
<target>Maximum:</target>
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target>Selecteer filterregels om bepaalde bestanden uit te sluiten van synchronisatie. Voer bestandspaden in ten opzichte van hun bijbehorend map-paar.</target>
+<source>Time span:</source>
+<target>Tijdsduur:</target>
<source>C&lear</source>
<target>&Wissen</target>
@@ -1105,9 +1111,18 @@ De opdracht wordt geactiveerd als:
<source>&Versioning</source>
<target>&Versiebeheer</target>
+<source>Move files to a user-defined folder</source>
+<target>Verplaats bestanden naar een door de gebruiker gedefinieerde map</target>
+
<source>Naming convention:</source>
<target>Naamgevingsconventie:</target>
+<source>Limit file versions:</source>
+<target>Beperk bestandsversies:</target>
+
+<source>Last x days:</source>
+<target>Laatste x dagen:</target>
+
<source>Ignore errors</source>
<target>Negeer fouten</target>
@@ -1249,11 +1264,8 @@ De opdracht wordt geactiveerd als:
<source>Save log:</source>
<target>Logbestand opslaan:</target>
-<source>Limit:</source>
-<target>Limiet:</target>
-
-<source>Limit maximum number of log files</source>
-<target>Maximaal aantal logboekbestanden limiteren</target>
+<source>Limit number of log files:</source>
+<target>Beperk het aantal logbestanden:</target>
<source>How can I schedule a batch job?</source>
<target>Hoe kan ik een batchverwerking plannen?</target>
@@ -1288,9 +1300,6 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Transfer file and folder permissions.</source>
<target>Overdracht van bestands- en mapmachtigingen.</target>
-<source>Show hidden dialogs again</source>
-<target>Verborgen dialoogvensters weergeven</target>
-
<source>Show all permanently hidden dialogs and warning messages again</source>
<target>Alle permanent verborgen dialogen en waarschuwingsberichten opnieuw weergeven</target>
@@ -1381,9 +1390,6 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Select Time Span</source>
<target>Selecteer tijdsduur</target>
-<source>FreeFileSync Donation Edition</source>
-<target>FreeFileSync donatie Editie</target>
-
<source>Highlight Configurations</source>
<target>Markeer Configuraties</target>
@@ -1507,6 +1513,9 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Select time span...</source>
<target>Selecteer tijdsduur...</target>
+<source>Donation Edition</source>
+<target>Donatie Editie</target>
+
<source>Folder Comparison and Synchronization</source>
<target>Map vergelijken en synchroniseren</target>
@@ -1705,6 +1714,12 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Parameters for opposite side</source>
<target>Parameters voor de andere kant</target>
+<source>Show hidden dialogs again</source>
+<target>Verborgen dialoogvensters weergeven</target>
+
+<source>All dialogs shown</source>
+<target>Alle dialoogvensters worden getoond</target>
+
<source>Downloading update...</source>
<target>Downloaden van update...</target>
@@ -1744,9 +1759,6 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>This year</source>
<target>Dit jaar</target>
-<source>Last x days</source>
-<target>Laatste x dagen</target>
-
<source>Byte</source>
<target>Byte</target>
@@ -1762,9 +1774,6 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Delete and overwrite files permanently</source>
<target>Verwijder en overschrijf bestanden permanent</target>
-<source>Move files to a user-defined folder</source>
-<target>Verplaats bestanden naar een door de gebruiker gedefinieerde map</target>
-
<source>Replace</source>
<target>Vervangen</target>
@@ -1774,6 +1783,12 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Time stamp</source>
<target>Tijdstempel</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>Verplaats bestanden naar een submap met tijdstempel</target>
+
+<source>File</source>
+<target>Bestand</target>
+
<source>Append a time stamp to each file name</source>
<target>Aan elke bestandsnaam een tijdstempel toevoegen</target>
@@ -1795,12 +1810,12 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Leave as unresolved conflict</source>
<target>Laten als onopgelost conflict</target>
-<source>File</source>
-<target>Bestand</target>
-
<source>YYYY-MM-DD hhmmss</source>
<target>JJJJ-MM-DD hhmmss</target>
+<source>Minimum version count must be smaller than maximum count.</source>
+<target>Het minimum aantal versies moet kleiner zijn dan het maximale aantal.</target>
+
<source>Files</source>
<target>Bestanden</target>
@@ -1847,7 +1862,7 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<target>Installatie was geregistreerd op een ander besturingssysteem.</target>
<source>Failed to activate FreeFileSync Donation Edition.</source>
-<target>Kan de FreeFileSync donatie editie niet activeren.</target>
+<target>Kan de FreeFileSync Donatie Editie niet activeren.</target>
<source>Incorrect activation key.</source>
<target>Onjuiste activeringssleutel.</target>
@@ -1946,10 +1961,10 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<target>Lokaal</target>
<source>Portable</source>
-<target>Draagbare</target>
+<target>Mobiele</target>
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>Instellingen opslaan in "%APPDATA%\FreeFileSync"</target>
+<source>Save settings in %x</source>
+<target>Instellingen opslaan in %x</target>
<source>Register FreeFileSync file extensions</source>
<target>Registreer FreeFileSync bestands-extensies</target>
@@ -2006,14 +2021,14 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<target>In plaats van een advertentie is hier een dier.</target>
<source>The FreeFileSync portable version cannot install into a subfolder of %x.</source>
-<target>De draagbare versie van FreeFileSync kan niet worden geïnstalleerd in een submap van %x.</target>
+<target>De mobiele versie van FreeFileSync kan niet worden geïnstalleerd in een submap van %x.</target>
<source>Please choose the local installation type or select a different folder for installation.</source>
<target>Kies voor een lokale installatie of selecteer een andere map voor de installatie.</target>
<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
-<target>De %x installatieoptie is alleen beschikbaar in de FreeFileSync Donatie-editie.</target>
+<target>De %x installatieoptie is alleen beschikbaar in de FreeFileSync Donatie Editie.</target>
<source>Get the Donation Edition with bonus features and help keep FreeFileSync ad-free.</source>
-<target>Ontvang de donatie uitgave met bonuseigenschappen en help FreeFileSync advertentie-vrij te houden.</target>
+<target>Ontvang de Donatie Editie met bonuseigenschappen en help FreeFileSync advertentie-vrij te houden.</target>
diff --git a/FreeFileSync/Build/Languages/english_uk.lng b/FreeFileSync/Build/Languages/english_uk.lng
index 07f178b9..5adc3a6d 100755
--- a/FreeFileSync/Build/Languages/english_uk.lng
+++ b/FreeFileSync/Build/Languages/english_uk.lng
@@ -115,11 +115,17 @@
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
<target>Installation files are corrupted. Please reinstall FreeFileSync.</target>
+<source>Cannot load file %x.</source>
+<target>Cannot load file %x.</target>
+
<source>Cannot find the following folders:</source>
<target>Cannot find the following folders:</target>
-<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</target>
+<source>The following folders do not yet exist:</source>
+<target>The following folders do not yet exist:</target>
+
+<source>The folders are created automatically when needed.</source>
+<target>The folders are created automatically when needed.</target>
<source>Comparison finished:</source>
<target>Comparison finished:</target>
@@ -214,6 +220,63 @@
<source>Out of memory.</source>
<target>Out of memory.</target>
+<source>Database file %x is incompatible.</source>
+<target>Database file %x is incompatible.</target>
+
+<source>Initial synchronization:</source>
+<target>Initial synchronisation:</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>Database file %x does not yet exist.</target>
+
+<source>Database file is corrupted:</source>
+<target>Database file is corrupted:</target>
+
+<source>Cannot write file %x.</source>
+<target>Cannot write file %x.</target>
+
+<source>Cannot read file %x.</source>
+<target>Cannot read file %x.</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>The database files do not yet contain information about the last synchronisation.</target>
+
+<source>Loading file %x...</source>
+<target>Loading file %x...</target>
+
+<source>Saving file %x...</source>
+<target>Saving file %x...</target>
+
+<source>Searching for folder %x...</source>
+<target>Searching for folder %x...</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>Time out while searching for folder %x.</target>
+
+<source>Cannot get process information.</source>
+<target>Cannot get process information.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Cannot read file attributes of %x.</target>
+
+<source>Waiting while directory is locked:</source>
+<target>Waiting while directory is locked:</target>
+
+<source>Lock owner:</source>
+<target>Lock owner:</target>
+
+<source>Detecting abandoned lock...</source>
+<target>Detecting abandoned lock...</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</target>
+
<source>Item exists on left side only</source>
<target>Item exists on left side only</target>
@@ -268,8 +331,191 @@
<source>Update attributes on right</source>
<target>Update attributes on right</target>
-<source>Cannot read file %x.</source>
-<target>Cannot read file %x.</target>
+<source>Items processed:</source>
+<target>Elements processed:</target>
+
+<source>Items remaining:</source>
+<target>Elements remaining:</target>
+
+<source>Total time:</source>
+<target>Total time:</target>
+
+<source>Cleaning up log files:</source>
+<target>Cleaning up log files:</target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>Error parsing file %x, row %y, column %z.</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>Cannot set directory locks for the following folders:</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</target>
+
+<source>Scanning:</source>
+<target>Scanning:</target>
+
+<source>Cannot read directory %x.</source>
+<target>Cannot read directory %x.</target>
+
+<source>/sec</source>
+<target>/sec</target>
+
+<source>%x items/sec</source>
+<target>%x items/sec</target>
+
+<source>Show in Explorer</source>
+<target>Show in Explorer</target>
+
+<source>Open with default application</source>
+<target>Open with default application</target>
+
+<source>Browse directory</source>
+<target>Browse directory</target>
+
+<source>Unable to connect to %x.</source>
+<target>Unable to connect to %x.</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>Cannot access the Volume Shadow Copy Service.</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>Cannot determine volume name for %x.</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>Volume name %x is not part of file path %y.</target>
+
+<source>File time and size</source>
+<target>File time and size</target>
+
+<source>File content</source>
+<target>File content</target>
+
+<source>File size</source>
+<target>File size</target>
+
+<source>Two way</source>
+<target>Two way</target>
+
+<source>Mirror</source>
+<target>Mirror</target>
+
+<source>Update</source>
+<target>Update</target>
+
+<source>Custom</source>
+<target>Custom</target>
+
+<source>Multiple...</source>
+<target>Multiple...</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>Cannot write file attributes of %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Cannot open file %x.</target>
+
+<source>%x and %y have different content.</source>
+<target>%x and %y have different content.</target>
+
+<source>Data verification error:</source>
+<target>Data verification error:</target>
+
+<source>Moving file %x to %y</source>
+<target>Moving file %x to %y</target>
+
+<source>Moving folder %x to %y</source>
+<target>Moving folder %x to %y</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>Moving symbolic link %x to %y</target>
+
+<source>Updating file %x</source>
+<target>Updating file %x</target>
+
+<source>Updating symbolic link %x</source>
+<target>Updating symbolic link %x</target>
+
+<source>Verifying file %x</source>
+<target>Verifying file %x</target>
+
+<source>Updating attributes of %x</source>
+<target>Updating attributes of %x</target>
+
+<source>Source item %x not found</source>
+<target>Source item %x not found</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>Creating a Volume Shadow Copy for %x...</target>
+
+<source>Cannot find folder %x.</source>
+<target>Cannot find folder %x.</target>
+
+<source>Target folder %x already existing.</source>
+<target>Target folder %x already existing.</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>Target folder input field must not be empty.</target>
+
+<source>Source folder %x not found.</source>
+<target>Source folder %x not found.</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>Please enter a target folder for versioning.</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>The following items have unresolved conflicts and will not be synchronised:</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>The following folders are significantly different. Please check that the correct folders are selected for synchronisation.</target>
+
+<source>Not enough free disk space available in:</source>
+<target>Not enough free disk space available in:</target>
+
+<source>Required:</source>
+<target>Required:</target>
+
+<source>Available:</source>
+<target>Available:</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>Some files will be synchronised as part of multiple base folders.</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</target>
+
+<source>Versioning folder:</source>
+<target>Versioning folder:</target>
+
+<source>Base folder:</source>
+<target>Base folder:</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>The versioning folder is contained in a base folder.</target>
+
+<source>Synchronizing folder pair:</source>
+<target>Synchronising folder pair:</target>
+
+<source>Generating database...</source>
+<target>Generating database...</target>
+
+<source>Searching for excess file versions:</source>
+<target>Searching for excess file versions:</target>
+
+<source>Removing excess file versions:</source>
+<target>Removing excess file versions:</target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>Unable to create time stamp for versioning:</target>
<source>
Unexpected size of data stream.
@@ -288,17 +534,14 @@ Actual: %y bytes
<source>Operation not supported for different base folder types.</source>
<target>Operation not supported for different base folder types.</target>
-<source>Cannot write file %x.</source>
-<target>Cannot write file %x.</target>
-
<source>Cannot move file %x to %y.</source>
<target>Cannot move file %x to %y.</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>Cannot copy symbolic link %x to %y.</target>
-<source>Unable to connect to %x.</source>
-<target>Unable to connect to %x.</target>
+<source>Error Code %x</source>
+<target>Error Code %x</target>
<source>Failed to get information about server %x.</source>
<target>Failed to get information about server %x.</target>
@@ -306,12 +549,6 @@ Actual: %y bytes
<source>Cannot open directory %x.</source>
<target>Cannot open directory %x.</target>
-<source>Cannot read directory %x.</source>
-<target>Cannot read directory %x.</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>Cannot read file attributes of %x.</target>
-
<source>Cannot create directory %x.</source>
<target>Cannot create directory %x.</target>
@@ -339,9 +576,6 @@ Actual: %y bytes
<source>Cannot find device %x.</source>
<target>Cannot find device %x.</target>
-<source>Cannot open file %x.</source>
-<target>Cannot open file %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Type of item %x is not supported:</target>
@@ -354,15 +588,9 @@ Actual: %y bytes
<source>Incorrect command line:</source>
<target>Incorrect command line:</target>
-<source>Error Code %x</source>
-<target>Error Code %x</target>
-
<source>The server does not support authentication via %x.</source>
<target>The server does not support authentication via %x.</target>
-<source>Required:</source>
-<target>Required:</target>
-
<source>Unable to access %x.</source>
<target>Unable to access %x.</target>
@@ -408,123 +636,9 @@ Actual: %y bytes
<source>%x GB</source>
<target>%x GB</target>
-<source>Cannot load file %x.</source>
-<target>Cannot load file %x.</target>
-
-<source>Database file %x is incompatible.</source>
-<target>Database file %x is incompatible.</target>
-
-<source>Initial synchronization:</source>
-<target>Initial synchronisation:</target>
-
-<source>Database file %x does not yet exist.</source>
-<target>Database file %x does not yet exist.</target>
-
-<source>Database file is corrupted:</source>
-<target>Database file is corrupted:</target>
-
-<source>The database files do not yet contain information about the last synchronization.</source>
-<target>The database files do not yet contain information about the last synchronisation.</target>
-
-<source>Loading file %x...</source>
-<target>Loading file %x...</target>
-
-<source>Saving file %x...</source>
-<target>Saving file %x...</target>
-
-<source>Searching for folder %x...</source>
-<target>Searching for folder %x...</target>
-
-<source>Timeout while searching for folder %x.</source>
-<target>Time out while searching for folder %x.</target>
-
-<source>Cannot get process information.</source>
-<target>Cannot get process information.</target>
-
-<source>Waiting while directory is locked:</source>
-<target>Waiting while directory is locked:</target>
-
-<source>Lock owner:</source>
-<target>Lock owner:</target>
-
-<source>Detecting abandoned lock...</source>
-<target>Detecting abandoned lock...</target>
-
-<source>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</source>
-<target>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</target>
-
-<source>Items processed:</source>
-<target>Elements processed:</target>
-
-<source>Items remaining:</source>
-<target>Elements remaining:</target>
-
-<source>Total time:</source>
-<target>Total time:</target>
-
-<source>Cleaning up old log files...</source>
-<target>Cleaning up old log files...</target>
-
-<source>Error parsing file %x, row %y, column %z.</source>
-<target>Error parsing file %x, row %y, column %z.</target>
-
-<source>Cannot set directory locks for the following folders:</source>
-<target>Cannot set directory locks for the following folders:</target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</target>
-
-<source>Scanning:</source>
-<target>Scanning:</target>
-
-<source>/sec</source>
-<target>/sec</target>
-
-<source>%x items/sec</source>
-<target>%x items/sec</target>
-
-<source>Show in Explorer</source>
-<target>Show in Explorer</target>
-
-<source>Open with default application</source>
-<target>Open with default application</target>
-
-<source>Browse directory</source>
-<target>Browse directory</target>
-
-<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>Cannot access the Volume Shadow Copy Service.</target>
-
-<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>Cannot determine volume name for %x.</target>
-
-<source>Volume name %x is not part of file path %y.</source>
-<target>Volume name %x is not part of file path %y.</target>
-
-<source>Unable to create time stamp for versioning:</source>
-<target>Unable to create time stamp for versioning:</target>
-
<source>Drag && drop</source>
<target>Drag && drop</target>
-<source>Cannot find folder %x.</source>
-<target>Cannot find folder %x.</target>
-
<source>Select a folder</source>
<target>Select a folder</target>
@@ -620,8 +734,8 @@ The command is triggered if:
<source>Directory monitoring active</source>
<target>Directory monitoring active</target>
-<source>Waiting until all directories are available...</source>
-<target>Waiting until all directories are available...</target>
+<source>Waiting until directory is available:</source>
+<target>Waiting until directory is available:</target>
<source>&Restore</source>
<target>&Restore</target>
@@ -635,114 +749,6 @@ The command is triggered if:
<source>&Retry</source>
<target>&Retry</target>
-<source>File time and size</source>
-<target>File time and size</target>
-
-<source>File content</source>
-<target>File content</target>
-
-<source>File size</source>
-<target>File size</target>
-
-<source>Two way</source>
-<target>Two way</target>
-
-<source>Mirror</source>
-<target>Mirror</target>
-
-<source>Update</source>
-<target>Update</target>
-
-<source>Custom</source>
-<target>Custom</target>
-
-<source>Multiple...</source>
-<target>Multiple...</target>
-
-<source>Cannot write file attributes of %x.</source>
-<target>Cannot write file attributes of %x.</target>
-
-<source>%x and %y have different content.</source>
-<target>%x and %y have different content.</target>
-
-<source>Data verification error:</source>
-<target>Data verification error:</target>
-
-<source>Moving file %x to %y</source>
-<target>Moving file %x to %y</target>
-
-<source>Moving folder %x to %y</source>
-<target>Moving folder %x to %y</target>
-
-<source>Moving symbolic link %x to %y</source>
-<target>Moving symbolic link %x to %y</target>
-
-<source>Removing old versions...</source>
-<target>Removing old versions...</target>
-
-<source>Updating file %x</source>
-<target>Updating file %x</target>
-
-<source>Updating symbolic link %x</source>
-<target>Updating symbolic link %x</target>
-
-<source>Verifying file %x</source>
-<target>Verifying file %x</target>
-
-<source>Updating attributes of %x</source>
-<target>Updating attributes of %x</target>
-
-<source>Source item %x not found</source>
-<target>Source item %x not found</target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>Creating a Volume Shadow Copy for %x...</target>
-
-<source>Target folder %x already existing.</source>
-<target>Target folder %x already existing.</target>
-
-<source>Target folder input field must not be empty.</source>
-<target>Target folder input field must not be empty.</target>
-
-<source>Source folder %x not found.</source>
-<target>Source folder %x not found.</target>
-
-<source>Please enter a target folder for versioning.</source>
-<target>Please enter a target folder for versioning.</target>
-
-<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>The following items have unresolved conflicts and will not be synchronised:</target>
-
-<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>The following folders are significantly different. Please check that the correct folders are selected for synchronisation.</target>
-
-<source>Not enough free disk space available in:</source>
-<target>Not enough free disk space available in:</target>
-
-<source>Available:</source>
-<target>Available:</target>
-
-<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>Some files will be synchronised as part of multiple base folders.</target>
-
-<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</target>
-
-<source>Versioning folder:</source>
-<target>Versioning folder:</target>
-
-<source>Base folder:</source>
-<target>Base folder:</target>
-
-<source>The versioning folder is contained in a base folder.</source>
-<target>The versioning folder is contained in a base folder.</target>
-
-<source>Synchronizing folder pair:</source>
-<target>Synchronising folder pair:</target>
-
-<source>Generating database...</source>
-<target>Generating database...</target>
-
<source>Loading...</source>
<target>Loading...</target>
@@ -888,7 +894,7 @@ The command is triggered if:
<target>Please select a folder on a local file system, network or an MTP device.</target>
<source>Defined by context of use</source>
-<target></target>
+<target>Defined by context of use</target>
<source>Requires FreeFileSync Donation Edition</source>
<target>Requires FreeFileSync Donation Edition</target>
@@ -1061,8 +1067,8 @@ The command is triggered if:
<source>Show examples</source>
<target>Show examples</target>
-<source>Time span:</source>
-<target>Time span:</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>Select filter rules to exclude certain files from synchronisation. Enter file paths relative to their corresponding folder pair.</target>
<source>File size:</source>
<target>File size:</target>
@@ -1073,8 +1079,8 @@ The command is triggered if:
<source>Maximum:</source>
<target>Maximum:</target>
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target>Select filter rules to exclude certain files from synchronisation. Enter file paths relative to their corresponding folder pair.</target>
+<source>Time span:</source>
+<target>Time span:</target>
<source>C&lear</source>
<target>C&lear</target>
@@ -1105,9 +1111,18 @@ The command is triggered if:
<source>&Versioning</source>
<target>&Versioning</target>
+<source>Move files to a user-defined folder</source>
+<target>Move files to a user-defined folder</target>
+
<source>Naming convention:</source>
<target>Naming convention:</target>
+<source>Limit file versions:</source>
+<target>Limit file versions:</target>
+
+<source>Last x days:</source>
+<target>Last x days:</target>
+
<source>Ignore errors</source>
<target>Ignore errors</target>
@@ -1249,11 +1264,8 @@ The command is triggered if:
<source>Save log:</source>
<target>Save log:</target>
-<source>Limit:</source>
-<target>Limit:</target>
-
-<source>Limit maximum number of log files</source>
-<target>Limit maximum number of log files</target>
+<source>Limit number of log files:</source>
+<target>Limit number of log files:</target>
<source>How can I schedule a batch job?</source>
<target>How can I schedule a batch job?</target>
@@ -1288,9 +1300,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Transfer file and folder permissions.</source>
<target>Transfer file and folder permissions.</target>
-<source>Show hidden dialogs again</source>
-<target>Show hidden dialogues again</target>
-
<source>Show all permanently hidden dialogs and warning messages again</source>
<target>Show all permanently hidden dialogues and warning messages again</target>
@@ -1381,9 +1390,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Select Time Span</source>
<target>Select Time Span</target>
-<source>FreeFileSync Donation Edition</source>
-<target>FreeFileSync Donation Edition</target>
-
<source>Highlight Configurations</source>
<target>Highlight Configurations</target>
@@ -1507,6 +1513,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Select time span...</source>
<target>Select time span...</target>
+<source>Donation Edition</source>
+<target>Donation Edition</target>
+
<source>Folder Comparison and Synchronization</source>
<target>Folder Comparison and Synchronisation</target>
@@ -1705,6 +1714,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Parameters for opposite side</source>
<target>Parameters for opposite side</target>
+<source>Show hidden dialogs again</source>
+<target>Show hidden dialogues again</target>
+
+<source>All dialogs shown</source>
+<target>All dialogues shown</target>
+
<source>Downloading update...</source>
<target>Downloading update...</target>
@@ -1744,9 +1759,6 @@ This guarantees a consistent state even in case of a serious error.
<source>This year</source>
<target>This year</target>
-<source>Last x days</source>
-<target>Last x days</target>
-
<source>Byte</source>
<target>Byte</target>
@@ -1762,9 +1774,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Delete and overwrite files permanently</source>
<target>Delete and overwrite files permanently</target>
-<source>Move files to a user-defined folder</source>
-<target>Move files to a user-defined folder</target>
-
<source>Replace</source>
<target>Replace</target>
@@ -1774,6 +1783,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Time stamp</source>
<target>Time stamp</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>Move files into a time-stamped subfolder</target>
+
+<source>File</source>
+<target>File</target>
+
<source>Append a time stamp to each file name</source>
<target>Append a time stamp to each file name</target>
@@ -1795,12 +1810,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Leave as unresolved conflict</source>
<target>Leave as unresolved conflict</target>
-<source>File</source>
-<target>File</target>
-
<source>YYYY-MM-DD hhmmss</source>
<target>YYYY-MM-DD hhmmss</target>
+<source>Minimum version count must be smaller than maximum count.</source>
+<target>Minimum version count must be smaller than maximum count.</target>
+
<source>Files</source>
<target>Files</target>
@@ -1948,8 +1963,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Portable</source>
<target>Portable</target>
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>Save settings to "%APPDATA%\FreeFileSync"</target>
+<source>Save settings in %x</source>
+<target>Save settings in %x</target>
<source>Register FreeFileSync file extensions</source>
<target>Register FreeFileSync file extensions</target>
diff --git a/FreeFileSync/Build/Languages/french.lng b/FreeFileSync/Build/Languages/french.lng
index 915bbc94..69c779fd 100755
--- a/FreeFileSync/Build/Languages/french.lng
+++ b/FreeFileSync/Build/Languages/french.lng
@@ -7,9 +7,6 @@
<plural_definition>n <= 1 ? 0 : 1</plural_definition>
</header>
-<source>Defined by context of use</source>
-<target></target>
-
<source>Both sides have changed since last synchronization.</source>
<target>Les deux côtés ont changé depuis la dernière synchronisation.</target>
@@ -118,11 +115,20 @@
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
<target>Un ou plusieurs fichiers installés sont abîmés. Veuillez réinstaller FreeFileSync.</target>
+<source>Cannot load file %x.</source>
+<target>Impossible de charger le fichier %x.</target>
+
<source>Cannot find the following folders:</source>
<target>Impossible de trouver les dossiers suivants :</target>
-<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>Si cette erreur est ignorée, les dossiers seront considérés comme vides. Les dossiers manquants seront automatiquement créés si nécessaire.</target>
+<source>The following folders do not yet exist:</source>
+<target>Les dossiers suivants n'existent plus :</target>
+
+<source>The folders are created automatically when needed.</source>
+<target>Les dossiers sont créés automatiquement quand cela est nécessaire.</target>
+
+<source>Scanning:</source>
+<target>Lecture en cours :</target>
<source>Comparison finished:</source>
<target>Comparaison terminée :</target>
@@ -217,6 +223,63 @@
<source>Out of memory.</source>
<target>Mémoire insuffisante.</target>
+<source>Database file %x is incompatible.</source>
+<target>La base de données %x n'est pas compatible.</target>
+
+<source>Initial synchronization:</source>
+<target>Première synchronisation :</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>La base de données %x n'existe plus.</target>
+
+<source>Database file is corrupted:</source>
+<target>La base de données est abîmée :</target>
+
+<source>Cannot write file %x.</source>
+<target>Impossible d'écrire le fichier %x.</target>
+
+<source>Cannot read file %x.</source>
+<target>Impossible de lire le fichier %x.</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>La base de données ne contient plus aujourd'hui d'informations sur la dernière synchronisation.</target>
+
+<source>Loading file %x...</source>
+<target>Chargement du fichier %x ...</target>
+
+<source>Saving file %x...</source>
+<target>Enregistrement du fichier %x ...</target>
+
+<source>Searching for folder %x...</source>
+<target>Recherche du dossier %x ...</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>La recherche du dossier %x a expirée.</target>
+
+<source>Cannot get process information.</source>
+<target>Impossible d'obtenir les informations du traitement.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Impossible de lire les attributs du fichier %x.</target>
+
+<source>Waiting while directory is locked:</source>
+<target>En attente tant que le répertoire est verrouillé :</target>
+
+<source>Lock owner:</source>
+<target>Propriétaire du verrou :</target>
+
+<source>Detecting abandoned lock...</source>
+<target>Détection de verrouillage abandonné ...</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>%x sec</pluralform>
+<pluralform>%x sec</pluralform>
+</target>
+
<source>Item exists on left side only</source>
<target>Cet élément existe seulement à gauche</target>
@@ -271,8 +334,188 @@
<source>Update attributes on right</source>
<target>Mise à jour des attributs à droite</target>
-<source>Cannot read file %x.</source>
-<target>Impossible de lire le fichier %x.</target>
+<source>Items processed:</source>
+<target>Élements traités :</target>
+
+<source>Items remaining:</source>
+<target>Élements restants :</target>
+
+<source>Total time:</source>
+<target>Durée totale :</target>
+
+<source>Cleaning up log files:</source>
+<target>Nettoyage des journaux :</target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>Erreur lors de l'analyse du fichier %x, ligne %y, colonne %z.</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>Impossible de verrouiller les répertoires des dossiers suivants :</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>%x tâche</pluralform>
+<pluralform>%x tâches</pluralform>
+</target>
+
+<source>Cannot read directory %x.</source>
+<target>Impossible de lire le répertoire %x.</target>
+
+<source>/sec</source>
+<target>/sec</target>
+
+<source>%x items/sec</source>
+<target>%x éléments/sec</target>
+
+<source>Show in Explorer</source>
+<target>Montrer dans l'explorateur</target>
+
+<source>Open with default application</source>
+<target>Ouvrir avec l'application par défaut</target>
+
+<source>Browse directory</source>
+<target>Parcourir le répertoire</target>
+
+<source>Unable to connect to %x.</source>
+<target>Impossible de se connecter à %x.</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>Impossible d'accéder au service Volume Shadow Copy.</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>Veuillez exécuter de préférence la version 64 bits de FreeFileSync pour utiliser le service Shadow Copy.</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>Impossible de déterminer le nom du volume de %x.</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>Le nom de volume %x ne fait pas partie du chemin %y.</target>
+
+<source>File time and size</source>
+<target>Date et taille du fichier</target>
+
+<source>File content</source>
+<target>Contenu du fichier</target>
+
+<source>File size</source>
+<target>Taille du fichier</target>
+
+<source>Two way</source>
+<target>Deux sens</target>
+
+<source>Mirror</source>
+<target>Miroir</target>
+
+<source>Update</source>
+<target>Mise à Jour</target>
+
+<source>Custom</source>
+<target>Personnaliser</target>
+
+<source>Multiple...</source>
+<target>Multiple ...</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>Impossible d'écrire les attributs de fichier de %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Impossible d'ouvrir le fichier %x.</target>
+
+<source>%x and %y have different content.</source>
+<target>%x et %y ont des contenus différents.</target>
+
+<source>Data verification error:</source>
+<target>Erreur de contrôle des données :</target>
+
+<source>Moving file %x to %y</source>
+<target>Déplacement du fichier %x vers %y</target>
+
+<source>Moving folder %x to %y</source>
+<target>Déplacement du dossier %x vers %y</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>Déplacement du lien symbolique %x vers %y</target>
+
+<source>Updating file %x</source>
+<target>Mise à jour du fichier %x</target>
+
+<source>Updating symbolic link %x</source>
+<target>Mise à jour du lien symbolique %x</target>
+
+<source>Verifying file %x</source>
+<target>Contrôle du fichier %x</target>
+
+<source>Updating attributes of %x</source>
+<target>Mise à jour des attributs de %x</target>
+
+<source>Source item %x not found</source>
+<target>L'élément source %x n'a pas été trouvé</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>Création d'un Volume Shadow Copy pour %x ...</target>
+
+<source>Searching for excess file versions:</source>
+<target>Recherche des versions de fichiers excédentaires :</target>
+
+<source>Removing excess file versions:</source>
+<target>Suppression des versions de fichiers excédentaires :</target>
+
+<source>Cannot find folder %x.</source>
+<target>Dossier %x introuvable.</target>
+
+<source>Target folder %x already existing.</source>
+<target>Le dossier destination %x existe déjà.</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>Le champ dossier de destination ne doit pas être vide.</target>
+
+<source>Source folder %x not found.</source>
+<target>Dossier source %x non trouvé.</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>Veuillez entrer le dossier destinataire pour la gestion des versions.</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>Les éléments suivants sont en conflits non résolus et ne seront pas synchronisés :</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>Les dossiers suivants sont assez différents. Veuillez contrôler que ce sont les bons dossiers qui sont sélectionnés pour la synchronisation.</target>
+
+<source>Not enough free disk space available in:</source>
+<target>Espace disque insuffisant sur :</target>
+
+<source>Required:</source>
+<target>Requis :</target>
+
+<source>Available:</source>
+<target>Disponible :</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>Certains fichiers seront synchronisés comme éléments de plusieurs dossiers de base.</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>Pour éviter les conflits, configurez les filtres d'exclusion afin que chaque fichier mis à jour ne soit traité que par un seul dossier de base.</target>
+
+<source>Versioning folder:</source>
+<target>Dossier de gestion des versions :</target>
+
+<source>Base folder:</source>
+<target>Dossier de base :</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>Le dossier de version est situé dans le dossier de base.</target>
+
+<source>Synchronizing folder pair:</source>
+<target>Synchronisation de la paire de dossiers :</target>
+
+<source>Generating database...</source>
+<target>Génération de la base de données...</target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>Impossible de générer l'horodatage pour la gestion des versions :</target>
<source>
Unexpected size of data stream.
@@ -291,17 +534,14 @@ Trouvé : %y octets
<source>Operation not supported for different base folder types.</source>
<target>Opération non prise en charge pour dee dossiers de base de types différents.</target>
-<source>Cannot write file %x.</source>
-<target>Impossible d'écrire le fichier %x.</target>
-
<source>Cannot move file %x to %y.</source>
<target>Impossible de déplacer le fichier %x vers %y.</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>Impossible de copier le lien symbolique %x vers %y.</target>
-<source>Unable to connect to %x.</source>
-<target>Impossible de se connecter à %x.</target>
+<source>Error Code %x</source>
+<target>Code Erreur %x</target>
<source>Failed to get information about server %x.</source>
<target>Impossible de trouver le serveur %x.</target>
@@ -309,12 +549,6 @@ Trouvé : %y octets
<source>Cannot open directory %x.</source>
<target>Impossible d'ouvrir le répertoire %x.</target>
-<source>Cannot read directory %x.</source>
-<target>Impossible de lire le répertoire %x.</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>Impossible de lire les attributs du fichier %x.</target>
-
<source>Cannot create directory %x.</source>
<target>Impossible de créer le répertoire %x.</target>
@@ -342,9 +576,6 @@ Trouvé : %y octets
<source>Cannot find device %x.</source>
<target>Impossible de trouver le périphérique %x.</target>
-<source>Cannot open file %x.</source>
-<target>Impossible d'ouvrir le fichier %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Le type de l'élément %x n'est pas accepté :</target>
@@ -357,15 +588,9 @@ Trouvé : %y octets
<source>Incorrect command line:</source>
<target>Ligne de commande incorrecte :</target>
-<source>Error Code %x</source>
-<target>Code Erreur %x</target>
-
<source>The server does not support authentication via %x.</source>
<target>Le serveur refuse l'authentification par %x.</target>
-<source>Required:</source>
-<target>Requis :</target>
-
<source>Unable to access %x.</source>
<target>Impossible d'accéder à %x.</target>
@@ -411,123 +636,9 @@ Trouvé : %y octets
<source>%x GB</source>
<target>%x Go</target>
-<source>Cannot load file %x.</source>
-<target>Impossible de charger le fichier %x.</target>
-
-<source>Database file %x is incompatible.</source>
-<target>La base de données %x n'est pas compatible.</target>
-
-<source>Initial synchronization:</source>
-<target>Première synchronisation :</target>
-
-<source>Database file %x does not yet exist.</source>
-<target>La base de données %x n'existe plus.</target>
-
-<source>Database file is corrupted:</source>
-<target>La base de données est abîmée :</target>
-
-<source>The database files do not yet contain information about the last synchronization.</source>
-<target>La base de données ne contient plus aujourd'hui d'informations sur la dernière synchronisation.</target>
-
-<source>Loading file %x...</source>
-<target>Chargement du fichier %x ...</target>
-
-<source>Saving file %x...</source>
-<target>Enregistrement du fichier %x ...</target>
-
-<source>Searching for folder %x...</source>
-<target>Recherche du dossier %x ...</target>
-
-<source>Timeout while searching for folder %x.</source>
-<target>La recherche du dossier %x a expirée.</target>
-
-<source>Cannot get process information.</source>
-<target>Impossible d'obtenir les informations du traitement.</target>
-
-<source>Waiting while directory is locked:</source>
-<target>En attente tant que le répertoire est verrouillé :</target>
-
-<source>Lock owner:</source>
-<target>Propriétaire du verrou :</target>
-
-<source>Detecting abandoned lock...</source>
-<target>Détection de verrouillage abandonné ...</target>
-
-<source>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</source>
-<target>
-<pluralform>%x sec</pluralform>
-<pluralform>%x sec</pluralform>
-</target>
-
-<source>Items processed:</source>
-<target>Élements traités :</target>
-
-<source>Items remaining:</source>
-<target>Élements restants :</target>
-
-<source>Total time:</source>
-<target>Durée totale :</target>
-
-<source>Cleaning up old log files...</source>
-<target>Nettoyage des anciens fichiers log ...</target>
-
-<source>Error parsing file %x, row %y, column %z.</source>
-<target>Erreur lors de l'analyse du fichier %x, ligne %y, colonne %z.</target>
-
-<source>Cannot set directory locks for the following folders:</source>
-<target>Impossible de verrouiller les répertoires des dossiers suivants :</target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-<pluralform>%x tâche</pluralform>
-<pluralform>%x tâches</pluralform>
-</target>
-
-<source>Scanning:</source>
-<target>Lecture en cours :</target>
-
-<source>/sec</source>
-<target>/sec</target>
-
-<source>%x items/sec</source>
-<target>%x éléments/sec</target>
-
-<source>Show in Explorer</source>
-<target>Montrer dans l'explorateur</target>
-
-<source>Open with default application</source>
-<target>Ouvrir avec l'application par défaut</target>
-
-<source>Browse directory</source>
-<target>Parcourir le répertoire</target>
-
-<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>Impossible d'accéder au service Volume Shadow Copy.</target>
-
-<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>Veuillez exécuter de préférence la version 64 bits de FreeFileSync pour utiliser le service Shadow Copy.</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>Impossible de déterminer le nom du volume de %x.</target>
-
-<source>Volume name %x is not part of file path %y.</source>
-<target>Le nom de volume %x ne fait pas partie du chemin %y.</target>
-
-<source>Unable to create time stamp for versioning:</source>
-<target>Impossible de générer l'horodatage pour la gestion des versions :</target>
-
<source>Drag && drop</source>
<target>Glisser && Déposer</target>
-<source>Cannot find folder %x.</source>
-<target>Dossier %x introuvable.</target>
-
<source>Select a folder</source>
<target>Choisissez un dossier</target>
@@ -623,8 +734,8 @@ La commande est déclenchée si :
<source>Directory monitoring active</source>
<target>Gestion des répertoires active</target>
-<source>Waiting until all directories are available...</source>
-<target>En attente de la disponibilité de tous les répertoires ...</target>
+<source>Waiting until directory is available:</source>
+<target>En attente de la disponibilité du répertoire :</target>
<source>&Restore</source>
<target>&Restaurer</target>
@@ -638,114 +749,6 @@ La commande est déclenchée si :
<source>&Retry</source>
<target>&Réessayer</target>
-<source>File time and size</source>
-<target>Date et taille du fichier</target>
-
-<source>File content</source>
-<target>Contenu du fichier</target>
-
-<source>File size</source>
-<target>Taille du fichier</target>
-
-<source>Two way</source>
-<target>Deux sens</target>
-
-<source>Mirror</source>
-<target>Miroir</target>
-
-<source>Update</source>
-<target>Mise à Jour</target>
-
-<source>Custom</source>
-<target>Personnaliser</target>
-
-<source>Multiple...</source>
-<target>Multiple ...</target>
-
-<source>Cannot write file attributes of %x.</source>
-<target>Impossible d'écrire les attributs de fichier de %x.</target>
-
-<source>%x and %y have different content.</source>
-<target>%x et %y ont des contenus différents.</target>
-
-<source>Data verification error:</source>
-<target>Erreur de contrôle des données :</target>
-
-<source>Moving file %x to %y</source>
-<target>Déplacement du fichier %x vers %y</target>
-
-<source>Moving folder %x to %y</source>
-<target>Déplacement du dossier %x vers %y</target>
-
-<source>Moving symbolic link %x to %y</source>
-<target>Déplacement du lien symbolique %x vers %y</target>
-
-<source>Removing old versions...</source>
-<target>Suppression des anciennes versions...</target>
-
-<source>Updating file %x</source>
-<target>Mise à jour du fichier %x</target>
-
-<source>Updating symbolic link %x</source>
-<target>Mise à jour du lien symbolique %x</target>
-
-<source>Verifying file %x</source>
-<target>Contrôle du fichier %x</target>
-
-<source>Updating attributes of %x</source>
-<target>Mise à jour des attributs de %x</target>
-
-<source>Source item %x not found</source>
-<target>L'élément source %x n'a pas été trouvé</target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>Création d'un Volume Shadow Copy pour %x ...</target>
-
-<source>Target folder %x already existing.</source>
-<target>Le dossier destination %x existe déjà.</target>
-
-<source>Target folder input field must not be empty.</source>
-<target>Le champ dossier de destination ne doit pas être vide.</target>
-
-<source>Source folder %x not found.</source>
-<target>Dossier source %x non trouvé.</target>
-
-<source>Please enter a target folder for versioning.</source>
-<target>Veuillez entrer le dossier destinataire pour la gestion des versions.</target>
-
-<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>Les éléments suivants sont en conflits non résolus et ne seront pas synchronisés :</target>
-
-<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>Les dossiers suivants sont assez différents. Veuillez contrôler que ce sont les bons dossiers qui sont sélectionnés pour la synchronisation.</target>
-
-<source>Not enough free disk space available in:</source>
-<target>Espace disque insuffisant sur :</target>
-
-<source>Available:</source>
-<target>Disponible :</target>
-
-<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>Certains fichiers seront synchronisés comme éléments de plusieurs dossiers de base.</target>
-
-<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>Pour éviter les conflits, configurez les filtres d'exclusion afin que chaque fichier mis à jour ne soit traité que par un seul dossier de base.</target>
-
-<source>Versioning folder:</source>
-<target>Dossier de gestion des versions :</target>
-
-<source>Base folder:</source>
-<target>Dossier de base :</target>
-
-<source>The versioning folder is contained in a base folder.</source>
-<target>Le dossier de version est situé dans le dossier de base.</target>
-
-<source>Synchronizing folder pair:</source>
-<target>Synchronisation de la paire de dossiers :</target>
-
-<source>Generating database...</source>
-<target>Génération de la base de données...</target>
-
<source>Loading...</source>
<target>Chargement ...</target>
@@ -756,7 +759,7 @@ La commande est déclenchée si :
<target>Système : Mise en veille</target>
<source>System: Shut down</source>
-<target>Sustème : Arrêt</target>
+<target>Système : Arrêt</target>
<source>Stopped</source>
<target>Arrêté</target>
@@ -890,6 +893,9 @@ La commande est déclenchée si :
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>Veuillez choisir un dossier local, en réseau ou un périphérique MTP.</target>
+<source>Defined by context of use</source>
+<target>Défini par le contexte de l'utilisation</target>
+
<source>Requires FreeFileSync Donation Edition</source>
<target>Nécessite FreeFileSync Donation Edition</target>
@@ -1061,8 +1067,8 @@ La commande est déclenchée si :
<source>Show examples</source>
<target>Afficher les exemples</target>
-<source>Time span:</source>
-<target>Intervalle de temps :</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>Choisissez les règles de filtrage pour exclure certains fichiers de la synchronisation. Entrez les chemins des fichiers par rapport à leur paire de dossiers.</target>
<source>File size:</source>
<target>Taille du fichier :</target>
@@ -1073,8 +1079,8 @@ La commande est déclenchée si :
<source>Maximum:</source>
<target>Maximum :</target>
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target>Choisissez les règles de filtrage pour exclure certains fichiers de la synchronisation. Entrez les chemins des fichiers par rapport à leur paire de dossiers.</target>
+<source>Time span:</source>
+<target>Intervalle de temps :</target>
<source>C&lear</source>
<target>&Effacer</target>
@@ -1105,9 +1111,18 @@ La commande est déclenchée si :
<source>&Versioning</source>
<target>Gestion des &Versions</target>
+<source>Move files to a user-defined folder</source>
+<target>Déplacer les fichiers vers un dossier utilisateur</target>
+
<source>Naming convention:</source>
<target>Convention de nommage :</target>
+<source>Limit file versions:</source>
+<target>Limiter les versions de fichiers :</target>
+
+<source>Last x days:</source>
+<target>Derniers x jours :</target>
+
<source>Ignore errors</source>
<target>Ignorer les erreurs</target>
@@ -1249,14 +1264,11 @@ La commande est déclenchée si :
<source>Save log:</source>
<target>Sauvegarde du fichier log :</target>
-<source>Limit:</source>
-<target>Limite :</target>
-
-<source>Limit maximum number of log files</source>
-<target>Nombre maximal de fichiers log</target>
+<source>Limit number of log files:</source>
+<target>Limiter le nombre de journaux :</target>
<source>How can I schedule a batch job?</source>
-<target>Comment plannifier un fichier de commandes ?</target>
+<target>Comment planifier un fichier de commandes ?</target>
<source>&Keep relative paths</source>
<target>&Conserver les chemins relatifs</target>
@@ -1288,9 +1300,6 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Transfer file and folder permissions.</source>
<target>Transfert des autorisations des fichiers et dossiers.</target>
-<source>Show hidden dialogs again</source>
-<target>Réafficher les boîtes de dialogue masquées</target>
-
<source>Show all permanently hidden dialogs and warning messages again</source>
<target>Réafficher en permanence les boîtes de dialogue et les avertissements</target>
@@ -1381,9 +1390,6 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Select Time Span</source>
<target>Choix de l'Intervalle de Temps</target>
-<source>FreeFileSync Donation Edition</source>
-<target>FreeFileSync Donation Edition</target>
-
<source>Highlight Configurations</source>
<target>Signaler les configurations</target>
@@ -1507,6 +1513,9 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Select time span...</source>
<target>Choisir un intervalle de temps ...</target>
+<source>Donation Edition</source>
+<target>Edition Donation</target>
+
<source>Folder Comparison and Synchronization</source>
<target>Comparaison de dossiers et Synchronisation</target>
@@ -1705,6 +1714,12 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Parameters for opposite side</source>
<target>Paramètres du côté opposé.</target>
+<source>Show hidden dialogs again</source>
+<target>Réafficher les boîtes de dialogue masquées</target>
+
+<source>All dialogs shown</source>
+<target>Afficher toutes les boîtes de dialogue</target>
+
<source>Downloading update...</source>
<target>Téléchargement de la mise à jour ...</target>
@@ -1744,9 +1759,6 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>This year</source>
<target>Cette année</target>
-<source>Last x days</source>
-<target>Derniers x jours</target>
-
<source>Byte</source>
<target>Octet</target>
@@ -1762,9 +1774,6 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Delete and overwrite files permanently</source>
<target>Supprimer et remplacer les fichiers de façon permanente</target>
-<source>Move files to a user-defined folder</source>
-<target>Déplacer les fichiers vers un dossier utilisateur</target>
-
<source>Replace</source>
<target>Remplacer</target>
@@ -1774,6 +1783,12 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Time stamp</source>
<target>Horodatage</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>Déplacer les fichiers dans un sous-dossier horodaté</target>
+
+<source>File</source>
+<target>Fichier</target>
+
<source>Append a time stamp to each file name</source>
<target>Ajouter un horodatage à chaque nom de fichier</target>
@@ -1795,12 +1810,12 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Leave as unresolved conflict</source>
<target>Abandonner en tant que conflit non résolu</target>
-<source>File</source>
-<target>Fichier</target>
-
<source>YYYY-MM-DD hhmmss</source>
<target>AAAA-MM-JJ hhmmss</target>
+<source>Minimum version count must be smaller than maximum count.</source>
+<target>Le compteur de versions minimum doit être plus petit que le compteur maximum.</target>
+
<source>Files</source>
<target>Fichiers</target>
@@ -1948,8 +1963,8 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Portable</source>
<target>Portable</target>
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>Enregistrer la configuration dans "%APPDATA%\FreeFileSync"</target>
+<source>Save settings in %x</source>
+<target>Sauvegarder les paramètres dans %x</target>
<source>Register FreeFileSync file extensions</source>
<target>Enregistrez les extensions de fichier FreeFileSync</target>
diff --git a/FreeFileSync/Build/Languages/german.lng b/FreeFileSync/Build/Languages/german.lng
index 31d74476..2cd75c20 100755
--- a/FreeFileSync/Build/Languages/german.lng
+++ b/FreeFileSync/Build/Languages/german.lng
@@ -7,11 +7,8 @@
<plural_definition>n == 1 ? 0 : 1</plural_definition>
</header>
-<source>Donation Edition</source>
-<target>Spendenversion</target>
-
<source>Defined by context of use</source>
-<target></target>
+<target>Durch Nutzungskontext festgelegt</target>
<source>Both sides have changed since last synchronization.</source>
<target>Beide Seiten wurden seit der letzten Synchronisation verändert.</target>
@@ -121,11 +118,17 @@
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
<target>Die Installationsdateien sind beschädigt. Bitte installieren Sie FreeFileSync neu.</target>
+<source>Cannot load file %x.</source>
+<target>Die Datei %x kann nicht geladen werden.</target>
+
<source>Cannot find the following folders:</source>
<target>Die folgenden Ordner wurden nicht gefunden:</target>
-<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>Wird dieser Fehler ignoriert, werden die Ordner als leer angesehen. Fehlende Ordner werden bei Bedarf automatisch erstellt.</target>
+<source>The following folders do not yet exist:</source>
+<target>Die folgenden Ordner existieren noch nicht:</target>
+
+<source>The folders are created automatically when needed.</source>
+<target>Die Ordner werden bei Bedarf automatisch erstellt.</target>
<source>Comparison finished:</source>
<target>Vergleich abgeschlossen:</target>
@@ -220,6 +223,63 @@
<source>Out of memory.</source>
<target>Nicht genügend Arbeitsspeicher.</target>
+<source>Database file %x is incompatible.</source>
+<target>Die Datenbankdatei %x ist nicht kompatibel.</target>
+
+<source>Initial synchronization:</source>
+<target>Erstmalige Synchronisation:</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>Die Datenbankdatei %x existiert noch nicht.</target>
+
+<source>Database file is corrupted:</source>
+<target>Die Datenbankdatei ist beschädigt:</target>
+
+<source>Cannot write file %x.</source>
+<target>Die Datei %x kann nicht geschrieben werden.</target>
+
+<source>Cannot read file %x.</source>
+<target>Die Datei %x kann nicht gelesen werden.</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>Die Datenbankdateien beinhalten noch keine Informationen zur letzten Synchronisation.</target>
+
+<source>Loading file %x...</source>
+<target>Lade Datei %x...</target>
+
+<source>Saving file %x...</source>
+<target>Speichere Datei %x...</target>
+
+<source>Searching for folder %x...</source>
+<target>Suche Ordner %x...</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>Das Zeitlimit für die Suche nach Ordner %x wurde überschritten.</target>
+
+<source>Cannot get process information.</source>
+<target>Prozessinformationen können nicht gelesen werden.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Die Dateiattribute von %x können nicht gelesen werden.</target>
+
+<source>Waiting while directory is locked:</source>
+<target>Warte während das Verzeichnis gesperrt ist:</target>
+
+<source>Lock owner:</source>
+<target>Sperreigentümer:</target>
+
+<source>Detecting abandoned lock...</source>
+<target>Ermittle aufgegebene Sperre...</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 Sek.</pluralform>
+<pluralform>%x Sek.</pluralform>
+</target>
+
<source>Item exists on left side only</source>
<target>Element existiert nur links</target>
@@ -274,8 +334,191 @@
<source>Update attributes on right</source>
<target>Aktualisiere Attribute des rechten Elements</target>
-<source>Cannot read file %x.</source>
-<target>Die Datei %x kann nicht gelesen werden.</target>
+<source>Items processed:</source>
+<target>Verarbeitete Elemente:</target>
+
+<source>Items remaining:</source>
+<target>Verbleibende Elemente:</target>
+
+<source>Total time:</source>
+<target>Gesamtzeit:</target>
+
+<source>Cleaning up log files:</source>
+<target>Bereinige Protokolldateien:</target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>Fehler beim Auswerten der Datei %x, Zeile %y, Spalte %z.</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>Die Verzeichnissperren können für die folgenden Ordner nicht gesetzt werden:</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>1 Thread</pluralform>
+<pluralform>%x Threads</pluralform>
+</target>
+
+<source>Scanning:</source>
+<target>Suche Dateien:</target>
+
+<source>Cannot read directory %x.</source>
+<target>Das Verzeichnis %x kann nicht gelesen werden.</target>
+
+<source>/sec</source>
+<target>/sek</target>
+
+<source>%x items/sec</source>
+<target>%x Elemente/sek</target>
+
+<source>Show in Explorer</source>
+<target>Im Explorer anzeigen</target>
+
+<source>Open with default application</source>
+<target>Mit Standardanwendung öffnen</target>
+
+<source>Browse directory</source>
+<target>Verzeichnis öffnen</target>
+
+<source>Unable to connect to %x.</source>
+<target>Es kann keine Verbindung zu %x aufgebaut werden.</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>Auf den Volumenschattenkopiedienst kann nicht zugegriffen werden.</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>Bitte starten Sie die FreeFileSync 64-Bit Version, um Schattenkopien auf diesem System zu erstellen.</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>Der Laufwerksname für %x kann nicht bestimmt werden.</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>Laufwerksname %x ist kein Teil des Dateipfades %y.</target>
+
+<source>File time and size</source>
+<target>Datum und Größe</target>
+
+<source>File content</source>
+<target>Dateiinhalt</target>
+
+<source>File size</source>
+<target>Dateigröße</target>
+
+<source>Two way</source>
+<target>Zwei Wege</target>
+
+<source>Mirror</source>
+<target>Spiegeln</target>
+
+<source>Update</source>
+<target>Aktualisieren</target>
+
+<source>Custom</source>
+<target>Eigene</target>
+
+<source>Multiple...</source>
+<target>Verschiedene...</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>Die Dateiattribute von %x können nicht geschrieben werden.</target>
+
+<source>Cannot open file %x.</source>
+<target>Die Datei %x kann nicht geöffnet werden.</target>
+
+<source>%x and %y have different content.</source>
+<target>%x und %y haben unterschiedlichen Inhalt.</target>
+
+<source>Data verification error:</source>
+<target>Verifizierungsfehler:</target>
+
+<source>Moving file %x to %y</source>
+<target>Verschiebe Datei %x nach %y</target>
+
+<source>Moving folder %x to %y</source>
+<target>Verschiebe Ordner %x nach %y</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>Verschiebe symbolische Verknüpfung %x nach %y</target>
+
+<source>Updating file %x</source>
+<target>Aktualisiere Datei %x</target>
+
+<source>Updating symbolic link %x</source>
+<target>Aktualisiere symbolische Verknüpfung %x</target>
+
+<source>Verifying file %x</source>
+<target>Verifiziere Datei %x</target>
+
+<source>Updating attributes of %x</source>
+<target>Aktualisiere Attribute von %x</target>
+
+<source>Source item %x not found</source>
+<target>Das Quellelement %x wurde nicht gefunden.</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>Erstelle eine Volumenschattenkopie für %x...</target>
+
+<source>Cannot find folder %x.</source>
+<target>Der Ordner %x wurde nicht gefunden.</target>
+
+<source>Target folder %x already existing.</source>
+<target>Der Zielordner %x existiert bereits.</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>Das Eingabefeld für den Zielordner darf nicht leer sein.</target>
+
+<source>Source folder %x not found.</source>
+<target>Der Quellordner %x wurde nicht gefunden.</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>Bitte geben Sie einen Zielorder für die Versionierung ein.</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>Die folgenden Elemente haben ungelöste Konflikte und werden nicht synchronisiert werden:</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>Die folgenden Ordner unterscheiden sich erheblich. Überprüfen Sie, ob die richtigen Ordner für die Synchronisation ausgewählt wurden.</target>
+
+<source>Not enough free disk space available in:</source>
+<target>Nicht genügend freier Speicher verfügbar für:</target>
+
+<source>Required:</source>
+<target>Benötigt:</target>
+
+<source>Available:</source>
+<target>Verfügbar:</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>Einige Dateien werden als Teil mehrerer Basisordner synchronisiert werden.</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>Um Konflikte zu vermeiden sollten Ausschlussfilter erstellt werden, so dass jede aktualisierte Datei nur von einem Basisordner berücksichtigt wird.</target>
+
+<source>Versioning folder:</source>
+<target>Versionierungsordner:</target>
+
+<source>Base folder:</source>
+<target>Basisordner:</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>Der Versionierungsordner ist in einem Basisordner enthalten.</target>
+
+<source>Synchronizing folder pair:</source>
+<target>Synchronisiere Ordnerpaar:</target>
+
+<source>Generating database...</source>
+<target>Erzeuge Synchronisationsdatenbank...</target>
+
+<source>Searching for excess file versions:</source>
+<target>Suche überzählige Dateiversionen:</target>
+
+<source>Removing excess file versions:</source>
+<target>Entferne überzählige Dateiversionen:</target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>Der Zeitstempel für die Versionierung kann nicht erstellt werden:</target>
<source>
Unexpected size of data stream.
@@ -294,17 +537,14 @@ Tatsächlich: %y bytes
<source>Operation not supported for different base folder types.</source>
<target>Der Vorgang wird für unterschiedliche Basisordnertypen nicht unterstützt.</target>
-<source>Cannot write file %x.</source>
-<target>Die Datei %x kann nicht geschrieben werden.</target>
-
<source>Cannot move file %x to %y.</source>
<target>Die Datei %x kann nicht nach %y verschoben werden.</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>Die symbolische Verknüpfung %x kann nicht nach %y kopiert werden.</target>
-<source>Unable to connect to %x.</source>
-<target>Es kann keine Verbindung zu %x aufgebaut werden.</target>
+<source>Error Code %x</source>
+<target>Fehlercode %x</target>
<source>Failed to get information about server %x.</source>
<target>Informationen über den Server %x konnten nicht abgerufen werden.</target>
@@ -312,12 +552,6 @@ Tatsächlich: %y bytes
<source>Cannot open directory %x.</source>
<target>Das Verzeichnis %x kann nicht geöffnet werden.</target>
-<source>Cannot read directory %x.</source>
-<target>Das Verzeichnis %x kann nicht gelesen werden.</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>Die Dateiattribute von %x können nicht gelesen werden.</target>
-
<source>Cannot create directory %x.</source>
<target>Das Verzeichnis %x kann nicht erstellt werden.</target>
@@ -345,9 +579,6 @@ Tatsächlich: %y bytes
<source>Cannot find device %x.</source>
<target>Das Gerät %x wurde nicht gefunden.</target>
-<source>Cannot open file %x.</source>
-<target>Die Datei %x kann nicht geöffnet werden.</target>
-
<source>Type of item %x is not supported:</source>
<target>Der Typ des Elements %x wird nicht unterstützt:</target>
@@ -360,15 +591,9 @@ Tatsächlich: %y bytes
<source>Incorrect command line:</source>
<target>Ungültige Befehlszeile:</target>
-<source>Error Code %x</source>
-<target>Fehlercode %x</target>
-
<source>The server does not support authentication via %x.</source>
<target>Der Server unterstützt keine Authentifizierung über %x.</target>
-<source>Required:</source>
-<target>Benötigt:</target>
-
<source>Unable to access %x.</source>
<target>Auf %x kann nicht zugegriffen werden.</target>
@@ -414,123 +639,9 @@ Tatsächlich: %y bytes
<source>%x GB</source>
<target>%x GB</target>
-<source>Cannot load file %x.</source>
-<target>Die Datei %x kann nicht geladen werden.</target>
-
-<source>Database file %x is incompatible.</source>
-<target>Die Datenbankdatei %x ist nicht kompatibel.</target>
-
-<source>Initial synchronization:</source>
-<target>Erstmalige Synchronisation:</target>
-
-<source>Database file %x does not yet exist.</source>
-<target>Die Datenbankdatei %x existiert noch nicht.</target>
-
-<source>Database file is corrupted:</source>
-<target>Die Datenbankdatei ist beschädigt:</target>
-
-<source>The database files do not yet contain information about the last synchronization.</source>
-<target>Die Datenbankdateien beinhalten noch keine Informationen zur letzten Synchronisation.</target>
-
-<source>Loading file %x...</source>
-<target>Lade Datei %x...</target>
-
-<source>Saving file %x...</source>
-<target>Speichere Datei %x...</target>
-
-<source>Searching for folder %x...</source>
-<target>Suche Ordner %x...</target>
-
-<source>Timeout while searching for folder %x.</source>
-<target>Das Zeitlimit für die Suche nach Ordner %x wurde überschritten.</target>
-
-<source>Cannot get process information.</source>
-<target>Prozessinformationen können nicht gelesen werden.</target>
-
-<source>Waiting while directory is locked:</source>
-<target>Warte während das Verzeichnis gesperrt ist:</target>
-
-<source>Lock owner:</source>
-<target>Sperreigentümer:</target>
-
-<source>Detecting abandoned lock...</source>
-<target>Ermittle aufgegebene Sperre...</target>
-
-<source>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</source>
-<target>
-<pluralform>1 Sek.</pluralform>
-<pluralform>%x Sek.</pluralform>
-</target>
-
-<source>Items processed:</source>
-<target>Verarbeitete Elemente:</target>
-
-<source>Items remaining:</source>
-<target>Verbleibende Elemente:</target>
-
-<source>Total time:</source>
-<target>Gesamtzeit:</target>
-
-<source>Cleaning up old log files...</source>
-<target>Bereinige alte Protokolldateien...</target>
-
-<source>Error parsing file %x, row %y, column %z.</source>
-<target>Fehler beim Auswerten der Datei %x, Zeile %y, Spalte %z.</target>
-
-<source>Cannot set directory locks for the following folders:</source>
-<target>Die Verzeichnissperren können für die folgenden Ordner nicht gesetzt werden:</target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-<pluralform>1 Thread</pluralform>
-<pluralform>%x Threads</pluralform>
-</target>
-
-<source>Scanning:</source>
-<target>Suche Dateien:</target>
-
-<source>/sec</source>
-<target>/sek</target>
-
-<source>%x items/sec</source>
-<target>%x Elemente/sek</target>
-
-<source>Show in Explorer</source>
-<target>Im Explorer anzeigen</target>
-
-<source>Open with default application</source>
-<target>Mit Standardanwendung öffnen</target>
-
-<source>Browse directory</source>
-<target>Verzeichnis öffnen</target>
-
-<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>Auf den Volumenschattenkopiedienst kann nicht zugegriffen werden.</target>
-
-<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>Bitte starten Sie die FreeFileSync 64-Bit Version, um Schattenkopien auf diesem System zu erstellen.</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>Der Laufwerksname für %x kann nicht bestimmt werden.</target>
-
-<source>Volume name %x is not part of file path %y.</source>
-<target>Laufwerksname %x ist kein Teil des Dateipfades %y.</target>
-
-<source>Unable to create time stamp for versioning:</source>
-<target>Der Zeitstempel für die Versionierung kann nicht erstellt werden:</target>
-
<source>Drag && drop</source>
<target>Drag && Drop</target>
-<source>Cannot find folder %x.</source>
-<target>Der Ordner %x wurde nicht gefunden.</target>
-
<source>Select a folder</source>
<target>Ordner auswählen</target>
@@ -626,8 +737,8 @@ Die Befehlszeile wird ausgelöst, wenn:
<source>Directory monitoring active</source>
<target>Verzeichnisüberwachung ist aktiv</target>
-<source>Waiting until all directories are available...</source>
-<target>Warte bis alle Verzeichnisse verfügbar sind...</target>
+<source>Waiting until directory is available:</source>
+<target>Warte bis Verzeichnis verfügbar ist:</target>
<source>&Restore</source>
<target>&Wiederherstellen</target>
@@ -641,114 +752,6 @@ Die Befehlszeile wird ausgelöst, wenn:
<source>&Retry</source>
<target>&Wiederholen</target>
-<source>File time and size</source>
-<target>Datum und Größe</target>
-
-<source>File content</source>
-<target>Dateiinhalt</target>
-
-<source>File size</source>
-<target>Dateigröße</target>
-
-<source>Two way</source>
-<target>Zwei Wege</target>
-
-<source>Mirror</source>
-<target>Spiegeln</target>
-
-<source>Update</source>
-<target>Aktualisieren</target>
-
-<source>Custom</source>
-<target>Eigene</target>
-
-<source>Multiple...</source>
-<target>Verschiedene...</target>
-
-<source>Cannot write file attributes of %x.</source>
-<target>Die Dateiattribute von %x können nicht geschrieben werden.</target>
-
-<source>%x and %y have different content.</source>
-<target>%x und %y haben unterschiedlichen Inhalt.</target>
-
-<source>Data verification error:</source>
-<target>Verifizierungsfehler:</target>
-
-<source>Moving file %x to %y</source>
-<target>Verschiebe Datei %x nach %y</target>
-
-<source>Moving folder %x to %y</source>
-<target>Verschiebe Ordner %x nach %y</target>
-
-<source>Moving symbolic link %x to %y</source>
-<target>Verschiebe symbolische Verknüpfung %x nach %y</target>
-
-<source>Removing old versions...</source>
-<target>Entferne alte Versionen...</target>
-
-<source>Updating file %x</source>
-<target>Aktualisiere Datei %x</target>
-
-<source>Updating symbolic link %x</source>
-<target>Aktualisiere symbolische Verknüpfung %x</target>
-
-<source>Verifying file %x</source>
-<target>Verifiziere Datei %x</target>
-
-<source>Updating attributes of %x</source>
-<target>Aktualisiere Attribute von %x</target>
-
-<source>Source item %x not found</source>
-<target>Das Quellelement %x wurde nicht gefunden.</target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>Erstelle eine Volumenschattenkopie für %x...</target>
-
-<source>Target folder %x already existing.</source>
-<target>Der Zielordner %x existiert bereits.</target>
-
-<source>Target folder input field must not be empty.</source>
-<target>Das Eingabefeld für den Zielordner darf nicht leer sein.</target>
-
-<source>Source folder %x not found.</source>
-<target>Der Quellordner %x wurde nicht gefunden.</target>
-
-<source>Please enter a target folder for versioning.</source>
-<target>Bitte geben Sie einen Zielorder für die Versionierung ein.</target>
-
-<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>Die folgenden Elemente haben ungelöste Konflikte und werden nicht synchronisiert werden:</target>
-
-<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>Die folgenden Ordner unterscheiden sich erheblich. Überprüfen Sie, ob die richtigen Ordner für die Synchronisation ausgewählt wurden.</target>
-
-<source>Not enough free disk space available in:</source>
-<target>Nicht genügend freier Speicher verfügbar für:</target>
-
-<source>Available:</source>
-<target>Verfügbar:</target>
-
-<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>Einige Dateien werden als Teil mehrerer Basisordner synchronisiert werden.</target>
-
-<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>Um Konflikte zu vermeiden sollten Ausschlussfilter erstellt werden, so dass jede aktualisierte Datei nur von einem Basisordner berücksichtigt wird.</target>
-
-<source>Versioning folder:</source>
-<target>Versionierungsordner:</target>
-
-<source>Base folder:</source>
-<target>Basisordner:</target>
-
-<source>The versioning folder is contained in a base folder.</source>
-<target>Der Versionierungsordner ist in einem Basisordner enthalten.</target>
-
-<source>Synchronizing folder pair:</source>
-<target>Synchronisiere Ordnerpaar:</target>
-
-<source>Generating database...</source>
-<target>Erzeuge Synchronisationsdatenbank...</target>
-
<source>Loading...</source>
<target>Lade...</target>
@@ -1108,9 +1111,18 @@ Die Befehlszeile wird ausgelöst, wenn:
<source>&Versioning</source>
<target>&Versionierung</target>
+<source>Move files to a user-defined folder</source>
+<target>Dateien in einen benutzerdefinierten Ordner verschieben</target>
+
<source>Naming convention:</source>
<target>Namenskonvention:</target>
+<source>Limit file versions:</source>
+<target>Begrenze Dateiversionen:</target>
+
+<source>Last x days:</source>
+<target>Letzte x Tage:</target>
+
<source>Ignore errors</source>
<target>Fehler ignorieren</target>
@@ -1252,11 +1264,8 @@ Die Befehlszeile wird ausgelöst, wenn:
<source>Save log:</source>
<target>Protokoll speichern:</target>
-<source>Limit:</source>
-<target>Limit:</target>
-
-<source>Limit maximum number of log files</source>
-<target>Maximale Anzahl der Protokolldateien begrenzen</target>
+<source>Limit number of log files:</source>
+<target>Anzahl der Protokolldateien begrenzen:</target>
<source>How can I schedule a batch job?</source>
<target>Wie können Batchaufträge in den Taskplaner eingetragen werden?</target>
@@ -1291,9 +1300,6 @@ Dadurch wird ein konsistenter Datenstand auch bei schweren Fehlern garantiert.
<source>Transfer file and folder permissions.</source>
<target>Übertrage Datei- und Ordnerberechtigungen.</target>
-<source>Show hidden dialogs again</source>
-<target>Versteckte Fenster wieder zeigen</target>
-
<source>Show all permanently hidden dialogs and warning messages again</source>
<target>Alle dauerhaft versteckten Fenster und Warnmeldungen wieder anzeigen</target>
@@ -1507,6 +1513,9 @@ Dadurch wird ein konsistenter Datenstand auch bei schweren Fehlern garantiert.
<source>Select time span...</source>
<target>Zeitspanne auswählen...</target>
+<source>Donation Edition</source>
+<target>Spendenversion</target>
+
<source>Folder Comparison and Synchronization</source>
<target>Ordnervergleich und Synchronisation</target>
@@ -1705,6 +1714,12 @@ Dadurch wird ein konsistenter Datenstand auch bei schweren Fehlern garantiert.
<source>Parameters for opposite side</source>
<target>Parameter für gegenüberliegende Seite</target>
+<source>Show hidden dialogs again</source>
+<target>Versteckte Fenster wieder zeigen</target>
+
+<source>All dialogs shown</source>
+<target>Alle Fenster sind sichtbar</target>
+
<source>Downloading update...</source>
<target>Lade Aktualisierung...</target>
@@ -1744,9 +1759,6 @@ Dadurch wird ein konsistenter Datenstand auch bei schweren Fehlern garantiert.
<source>This year</source>
<target>Dieses Jahr</target>
-<source>Last x days</source>
-<target>Letzte x Tage</target>
-
<source>Byte</source>
<target>Byte</target>
@@ -1762,9 +1774,6 @@ Dadurch wird ein konsistenter Datenstand auch bei schweren Fehlern garantiert.
<source>Delete and overwrite files permanently</source>
<target>Dateien endgültig löschen und überschreiben</target>
-<source>Move files to a user-defined folder</source>
-<target>Dateien in einen benutzerdefinierten Ordner verschieben</target>
-
<source>Replace</source>
<target>Ersetzen</target>
@@ -1774,6 +1783,12 @@ Dadurch wird ein konsistenter Datenstand auch bei schweren Fehlern garantiert.
<source>Time stamp</source>
<target>Zeitstempel</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>Dateien in einen Unterordner mit Zeitstempel verschieben</target>
+
+<source>File</source>
+<target>Datei</target>
+
<source>Append a time stamp to each file name</source>
<target>Einen Zeitstempel an jeden Dateinamen anhängen</target>
@@ -1795,12 +1810,12 @@ Dadurch wird ein konsistenter Datenstand auch bei schweren Fehlern garantiert.
<source>Leave as unresolved conflict</source>
<target>Als unbehandelten Konflikt belassen</target>
-<source>File</source>
-<target>Datei</target>
-
<source>YYYY-MM-DD hhmmss</source>
<target>JJJJ-MM-TT hhmmss</target>
+<source>Minimum version count must be smaller than maximum count.</source>
+<target>Die minimale Anzahl der Versionen muss kleiner als die maximale sein.</target>
+
<source>Files</source>
<target>Dateien</target>
@@ -1948,8 +1963,8 @@ Dadurch wird ein konsistenter Datenstand auch bei schweren Fehlern garantiert.
<source>Portable</source>
<target>Portabel</target>
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>Einstellungen unter "%APPDATA%\FreeFileSync" sichern</target>
+<source>Save settings in %x</source>
+<target>Einstellungen in %x sichern</target>
<source>Register FreeFileSync file extensions</source>
<target>FreeFileSync Dateiendungen registrieren</target>
diff --git a/FreeFileSync/Build/Languages/greek.lng b/FreeFileSync/Build/Languages/greek.lng
index 81494217..ffb88275 100755
--- a/FreeFileSync/Build/Languages/greek.lng
+++ b/FreeFileSync/Build/Languages/greek.lng
@@ -115,11 +115,20 @@
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
<target>Τα αρχεία εγκατάστασης είναι κατεστραμμένα. Παρακαλούμε επανεγκαταστείστε το FreeFileSync.</target>
+<source>Cannot load file %x.</source>
+<target>Το αρχείο %x δεν ήταν δυνατόν να φορτωθεί.</target>
+
<source>Cannot find the following folders:</source>
<target>Οι ακόλουθοι φάκελοι δεν ήταν δυνατό να βρεθούν:</target>
-<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>Εάν αγνοηθεί αυτό το σφάλμα, οι φάκελοι θα θεωρηθούν κενοί. Φάκελοι που λείπουν θα δημιουργηθούν αυτόματα, όταν χρειαστούν.</target>
+<source>The following folders do not yet exist:</source>
+<target>Οι ακόλουθοι φάκελοι δεν υπάρχουν προς το παρόν:</target>
+
+<source>The folders are created automatically when needed.</source>
+<target>Οι φάκελοι θα δημιουργηθούν αυτόματα όταν χρειαστούν.</target>
+
+<source>Scanning:</source>
+<target>Ανίχνευση:</target>
<source>Comparison finished:</source>
<target>Η σύγκριση ολοκληρώθηκε:</target>
@@ -214,6 +223,63 @@
<source>Out of memory.</source>
<target>Ανεπαρκής μνήμη.</target>
+<source>Database file %x is incompatible.</source>
+<target>Το αρχείο βάσης δεδομένων %x δεν είναι συμβατό.</target>
+
+<source>Initial synchronization:</source>
+<target>Αρχικός συγχρονισμός:</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>Το αρχείο βάσης δεδομένων %x δεν έχει ακόμα δημιουργηθεί.</target>
+
+<source>Database file is corrupted:</source>
+<target>Το αρχείο βάσης δεδομένων είναι κατεστραμμένο:</target>
+
+<source>Cannot write file %x.</source>
+<target>Δεν μπορεί να γίνει εγγραφή του αρχείου %x.</target>
+
+<source>Cannot read file %x.</source>
+<target>Δεν μπορεί να γίνει ανάγνωση του αρχείου %x.</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>Τα αρχεία βάσης δεδομένων δεν περιέχουν ακόμα πληροφορίες για τον τελευταίο συγχρονισμό.</target>
+
+<source>Loading file %x...</source>
+<target>Λήψη του αρχείου %x...</target>
+
+<source>Saving file %x...</source>
+<target>Αποθήκευση του αρχείου %x...</target>
+
+<source>Searching for folder %x...</source>
+<target>Αναζήτηση του φακέλου %x...</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>Λήξη χρονικού ορίου αναζήτησης του φακέλου %x.</target>
+
+<source>Cannot get process information.</source>
+<target>Δεν μπορούν να ληφθούν πληροφορίες για τις τρέχουσες διαδικασίες.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Δεν μπορεί να γίνει ανάγνωση των χαρακτηριστικών του αρχείου %x.</target>
+
+<source>Waiting while directory is locked:</source>
+<target>Αναμονή μέχρι να κλειδωθεί ο υποκατάλογος:</target>
+
+<source>Lock owner:</source>
+<target>Ιδιοκτήτης κλειδώματος:</target>
+
+<source>Detecting abandoned lock...</source>
+<target>Ανίχνευση κλειδώματος που εγκαταλείφθηκε...</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 δ/λεπτο</pluralform>
+<pluralform>%x δ/λεπτα</pluralform>
+</target>
+
<source>Item exists on left side only</source>
<target>Το στοιχείο υπάρχει μόνο στην αριστερή πλευρά</target>
@@ -268,8 +334,188 @@
<source>Update attributes on right</source>
<target>Ενημέρωση των χαρακτηριστικών στα δεξιά</target>
-<source>Cannot read file %x.</source>
-<target>Δεν μπορεί να γίνει ανάγνωση του αρχείου %x.</target>
+<source>Items processed:</source>
+<target>Επεξεργάστηκαν στοιχεία:</target>
+
+<source>Items remaining:</source>
+<target>Περισσεύουν στοιχεία:</target>
+
+<source>Total time:</source>
+<target>Συνολική διάρκεια:</target>
+
+<source>Cleaning up log files:</source>
+<target>Καθάρισμα αρχείων καταγραφής:</target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>Σφάλμα κατά την ανάλυση του αρχείου %x, γραμμή %y, στήλη %z.</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>Δεν μπορούν να κλειδωθούν οι ακόλουθοι υποκατάλογοι:</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>1 νήμα</pluralform>
+<pluralform>%x νήματα</pluralform>
+</target>
+
+<source>Cannot read directory %x.</source>
+<target>Δεν μπορεί να γίνει ανάγνωση του καταλόγου %x.</target>
+
+<source>/sec</source>
+<target>/δευτερόλεπτο</target>
+
+<source>%x items/sec</source>
+<target>%x στοιχεία/δευτερόλεπτο</target>
+
+<source>Show in Explorer</source>
+<target>Εμφάνιση στην Εξερεύνηση</target>
+
+<source>Open with default application</source>
+<target>Άνοιγμα με την προεπιλεγμένη εφαρμογή</target>
+
+<source>Browse directory</source>
+<target>Αναζήτηση υποκαταλόγου</target>
+
+<source>Unable to connect to %x.</source>
+<target>Δεν μπορεί να πραγματοποιηθεί σύνδεση με το %x.</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>Δεν είναι δυνατή η πρόσβαση στην Υπηρεσία Σκιώδους Αντίγραφου Τόμου.</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>Παρακαλούμε εκτελέστε την 64-bit έκδοση του FreeFileSync, για να δημιουργήσετε σκιώδη αντίγραφα σε αυτό το σύστημα.</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>Δεν μπορεί να προσδιοριστεί το όνομα τόμου για το %x.</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>Το όνομα τόμου %x δεν είναι μέρος της διαδρομής %y.</target>
+
+<source>File time and size</source>
+<target>Ημερομηνία και μέγεθος αρχείων</target>
+
+<source>File content</source>
+<target>Περιεχόμενο αρχείων</target>
+
+<source>File size</source>
+<target>Μέγεθος αρχείων</target>
+
+<source>Two way</source>
+<target>Διπλής κατεύθυνσης</target>
+
+<source>Mirror</source>
+<target>Κατοπτρισμός</target>
+
+<source>Update</source>
+<target>Ενημέρωση</target>
+
+<source>Custom</source>
+<target>Προσαρμογή</target>
+
+<source>Multiple...</source>
+<target>Πολλαπλές ρυθμίσεις...</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>Δεν μπορεί να γίνει εγγραφή των χαρακτηριστικών αρχείου του %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Δεν είναι δυνατό το άνοιγμα του αρχείου %x.</target>
+
+<source>%x and %y have different content.</source>
+<target>Τα %x και %y έχουν διαφορετικό περιεχόμενο.</target>
+
+<source>Data verification error:</source>
+<target>Σφάλμα επαλήθευσης δεδομένων:</target>
+
+<source>Moving file %x to %y</source>
+<target>Μεταφορά του αρχείου %x στο %y</target>
+
+<source>Moving folder %x to %y</source>
+<target>Μεταφορά του φακέλου %x στο %y</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>Μεταφορά του συμβολικού σύνδεσμου %x στο %y</target>
+
+<source>Updating file %x</source>
+<target>Ενημέρωση του αρχείου %x</target>
+
+<source>Updating symbolic link %x</source>
+<target>Ενημέρωση του συμβολικού σύνδεσμου %x</target>
+
+<source>Verifying file %x</source>
+<target>Επαλήθευση του αρχείου %x</target>
+
+<source>Updating attributes of %x</source>
+<target>Ενημέρωση των χαρακτηριστικών αρχείου του %x</target>
+
+<source>Source item %x not found</source>
+<target>Το στοιχείο προέλευσης %x δεν βρέθηκε</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>Δημιουργία Σκιώδους Αντίγραφου Τόμου για το %x...</target>
+
+<source>Cannot find folder %x.</source>
+<target>Ο φάκελος %x δεν μπορεί να βρεθεί.</target>
+
+<source>Target folder %x already existing.</source>
+<target>Ο φάκελος-στόχος %x υπάρχει ήδη.</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>Το πεδίο εισαγωγής του φακέλου-στόχου πρέπει να μην είναι κενό.</target>
+
+<source>Source folder %x not found.</source>
+<target>Ο φάκελος %x δε βρέθηκε.</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>Παρακαλούμε εισάγετε ένα φάκελο για αποθήκευση παλιών εκδόσεων.</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>Τα ακόλουθα στοιχεία έχουν ανεπίλυτες διενέξεις και δε θα συγχρονιστούν:</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>Οι ακόλουθοι φάκελοι είναι σημαντικά διαφορετικοί. Παρακαλούμε ελέγξτε εάν έχουν επιλεχθεί για συγχρονισμό οι σωστοί φάκελοι.</target>
+
+<source>Not enough free disk space available in:</source>
+<target>Δεν υπάρχει αρκετός διαθέσιμος χώρος στο δίσκο:</target>
+
+<source>Required:</source>
+<target>Απαιτείται:</target>
+
+<source>Available:</source>
+<target>Διαθέσιμος:</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>Μερικά αρχεία θα συγχρονιστούν ως μέρη πολλαπλών βασικών φακέλων.</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>Για να αποφύγετε διενέξεις, δημιουργείστε φίλτρα εξαίρεσης, ώστε κάθε ενημερωμένο αρχείο να εξετάζεται μόνο από έναν βασικό φάκελο.</target>
+
+<source>Versioning folder:</source>
+<target>Διατήρηση παλιών εκδόσεων του φακέλου:</target>
+
+<source>Base folder:</source>
+<target>Βασικός φάκελος:</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>Ο φάκελος διατήρησης παλιών εκδόσεων βρίσκεται μέσα σε κάποιον βασικό φάκελο.</target>
+
+<source>Synchronizing folder pair:</source>
+<target>Συγχρονίζεται το ζευγάρι φακέλων:</target>
+
+<source>Generating database...</source>
+<target>Δημιουργία βάσης δεδομένων...</target>
+
+<source>Searching for excess file versions:</source>
+<target>Αναζήτηση υπεράριθμων παλιών εκδόσεων:</target>
+
+<source>Removing excess file versions:</source>
+<target>Αφαίρεση υπεράριθμων παλιών εκδόσεων:</target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>Δεν ήταν δυνατή η δημιουργία χρονικής σήμανσης για τη διατήρηση παλιών εκδόσεων:</target>
<source>
Unexpected size of data stream.
@@ -288,17 +534,14 @@ Actual: %y bytes
<source>Operation not supported for different base folder types.</source>
<target>Η λειτουργία δεν υποστηρίζεται για διαφορετικούς τύπους βασικών φακέλων.</target>
-<source>Cannot write file %x.</source>
-<target>Δεν μπορεί να γίνει εγγραφή του αρχείου %x.</target>
-
<source>Cannot move file %x to %y.</source>
<target>Δεν μπορεί το αρχείο %x να μεταφερθεί στο %y.</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>Αδυναμία αντιγραφής του συμβολικού συνδέσμου %x στο %y.</target>
-<source>Unable to connect to %x.</source>
-<target>Δεν μπορεί να πραγματοποιηθεί σύνδεση με το %x.</target>
+<source>Error Code %x</source>
+<target>Κωδικός Σφάλματος %x</target>
<source>Failed to get information about server %x.</source>
<target>Αποτυχία λήψης πληροφοριών από τον διακομιστή %x.</target>
@@ -306,12 +549,6 @@ Actual: %y bytes
<source>Cannot open directory %x.</source>
<target>Δεν είναι δυνατό το άνοιγμα του υποκαταλόγου %x.</target>
-<source>Cannot read directory %x.</source>
-<target>Δεν μπορεί να γίνει ανάγνωση του καταλόγου %x.</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>Δεν μπορεί να γίνει ανάγνωση των χαρακτηριστικών του αρχείου %x.</target>
-
<source>Cannot create directory %x.</source>
<target>Δεν μπορεί να δημιουργηθεί ο υποκατάλογος %x.</target>
@@ -339,9 +576,6 @@ Actual: %y bytes
<source>Cannot find device %x.</source>
<target>Η συσκευή %x δεν μπορεί να βρεθεί.</target>
-<source>Cannot open file %x.</source>
-<target>Δεν είναι δυνατό το άνοιγμα του αρχείου %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Ο τύπος του στοιχείου %x δεν υποστηρίζεται:</target>
@@ -354,15 +588,9 @@ Actual: %y bytes
<source>Incorrect command line:</source>
<target>Εσφαλμένη γραμμή εντολών:</target>
-<source>Error Code %x</source>
-<target>Κωδικός Σφάλματος %x</target>
-
<source>The server does not support authentication via %x.</source>
<target>Ο εξυπηρετητής δεν υποστηρίζει πιστοποίηση μέσω %x.</target>
-<source>Required:</source>
-<target>Απαιτείται:</target>
-
<source>Unable to access %x.</source>
<target>Δεν είναι δυνατή η πρόσβαση στο %x.</target>
@@ -408,123 +636,9 @@ Actual: %y bytes
<source>%x GB</source>
<target>%x GB</target>
-<source>Cannot load file %x.</source>
-<target>Το αρχείο %x δεν ήταν δυνατόν να φορτωθεί.</target>
-
-<source>Database file %x is incompatible.</source>
-<target>Το αρχείο βάσης δεδομένων %x δεν είναι συμβατό.</target>
-
-<source>Initial synchronization:</source>
-<target>Αρχικός συγχρονισμός:</target>
-
-<source>Database file %x does not yet exist.</source>
-<target>Το αρχείο βάσης δεδομένων %x δεν έχει ακόμα δημιουργηθεί.</target>
-
-<source>Database file is corrupted:</source>
-<target>Το αρχείο βάσης δεδομένων είναι κατεστραμμένο:</target>
-
-<source>The database files do not yet contain information about the last synchronization.</source>
-<target>Τα αρχεία βάσης δεδομένων δεν περιέχουν ακόμα πληροφορίες για τον τελευταίο συγχρονισμό.</target>
-
-<source>Loading file %x...</source>
-<target>Λήψη του αρχείου %x...</target>
-
-<source>Saving file %x...</source>
-<target>Αποθήκευση του αρχείου %x...</target>
-
-<source>Searching for folder %x...</source>
-<target>Αναζήτηση του φακέλου %x...</target>
-
-<source>Timeout while searching for folder %x.</source>
-<target>Λήξη χρονικού ορίου αναζήτησης του φακέλου %x.</target>
-
-<source>Cannot get process information.</source>
-<target>Δεν μπορούν να ληφθούν πληροφορίες για τις τρέχουσες διαδικασίες.</target>
-
-<source>Waiting while directory is locked:</source>
-<target>Αναμονή μέχρι να κλειδωθεί ο υποκατάλογος:</target>
-
-<source>Lock owner:</source>
-<target>Ιδιοκτήτης κλειδώματος:</target>
-
-<source>Detecting abandoned lock...</source>
-<target>Ανίχνευση κλειδώματος που εγκαταλείφθηκε...</target>
-
-<source>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</source>
-<target>
-<pluralform>1 δ/λεπτο</pluralform>
-<pluralform>%x δ/λεπτα</pluralform>
-</target>
-
-<source>Items processed:</source>
-<target>Επεξεργάστηκαν στοιχεία:</target>
-
-<source>Items remaining:</source>
-<target>Περισσεύουν στοιχεία:</target>
-
-<source>Total time:</source>
-<target>Συνολική διάρκεια:</target>
-
-<source>Cleaning up old log files...</source>
-<target>Καθαρισμός των παλιών αρχείων καταγραφής...</target>
-
-<source>Error parsing file %x, row %y, column %z.</source>
-<target>Σφάλμα κατά την ανάλυση του αρχείου %x, γραμμή %y, στήλη %z.</target>
-
-<source>Cannot set directory locks for the following folders:</source>
-<target>Δεν μπορούν να κλειδωθούν οι ακόλουθοι υποκατάλογοι:</target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-<pluralform>1 νήμα</pluralform>
-<pluralform>%x νήματα</pluralform>
-</target>
-
-<source>Scanning:</source>
-<target>Ανίχνευση:</target>
-
-<source>/sec</source>
-<target>/δευτερόλεπτο</target>
-
-<source>%x items/sec</source>
-<target>%x στοιχεία/δευτερόλεπτο</target>
-
-<source>Show in Explorer</source>
-<target>Εμφάνιση στην Εξερεύνηση</target>
-
-<source>Open with default application</source>
-<target>Άνοιγμα με την προεπιλεγμένη εφαρμογή</target>
-
-<source>Browse directory</source>
-<target>Αναζήτηση υποκαταλόγου</target>
-
-<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>Δεν είναι δυνατή η πρόσβαση στην Υπηρεσία Σκιώδους Αντίγραφου Τόμου.</target>
-
-<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>Παρακαλούμε εκτελέστε την 64-bit έκδοση του FreeFileSync, για να δημιουργήσετε σκιώδη αντίγραφα σε αυτό το σύστημα.</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>Δεν μπορεί να προσδιοριστεί το όνομα τόμου για το %x.</target>
-
-<source>Volume name %x is not part of file path %y.</source>
-<target>Το όνομα τόμου %x δεν είναι μέρος της διαδρομής %y.</target>
-
-<source>Unable to create time stamp for versioning:</source>
-<target>Δεν ήταν δυνατή η δημιουργία χρονικής σήμανσης για τη διατήρηση παλιών εκδόσεων:</target>
-
<source>Drag && drop</source>
<target>Μεταφορά && Απόθεση</target>
-<source>Cannot find folder %x.</source>
-<target>Ο φάκελος %x δεν μπορεί να βρεθεί.</target>
-
<source>Select a folder</source>
<target>Επιλογή φακέλου</target>
@@ -620,8 +734,8 @@ The command is triggered if:
<source>Directory monitoring active</source>
<target>Η παρακολούθηση των υποκαταλόγων είναι ενεργή</target>
-<source>Waiting until all directories are available...</source>
-<target>Αναμονή μέχρι να είναι διαθέσιμοι όλοι οι υποκατάλογοι...</target>
+<source>Waiting until directory is available:</source>
+<target>Αναμονή μέχρι ο φάκελος να γίνει διαθέσιμος:</target>
<source>&Restore</source>
<target>&Επαναφορά</target>
@@ -635,114 +749,6 @@ The command is triggered if:
<source>&Retry</source>
<target>&Επανάληψη</target>
-<source>File time and size</source>
-<target>Ημερομηνία και μέγεθος αρχείων</target>
-
-<source>File content</source>
-<target>Περιεχόμενο αρχείων</target>
-
-<source>File size</source>
-<target>Μέγεθος αρχείων</target>
-
-<source>Two way</source>
-<target>Διπλής κατεύθυνσης</target>
-
-<source>Mirror</source>
-<target>Κατοπτρισμός</target>
-
-<source>Update</source>
-<target>Ενημέρωση</target>
-
-<source>Custom</source>
-<target>Προσαρμογή</target>
-
-<source>Multiple...</source>
-<target>Πολλαπλές ρυθμίσεις...</target>
-
-<source>Cannot write file attributes of %x.</source>
-<target>Δεν μπορεί να γίνει εγγραφή των χαρακτηριστικών αρχείου του %x.</target>
-
-<source>%x and %y have different content.</source>
-<target>Τα %x και %y έχουν διαφορετικό περιεχόμενο.</target>
-
-<source>Data verification error:</source>
-<target>Σφάλμα επαλήθευσης δεδομένων:</target>
-
-<source>Moving file %x to %y</source>
-<target>Μεταφορά του αρχείου %x στο %y</target>
-
-<source>Moving folder %x to %y</source>
-<target>Μεταφορά του φακέλου %x στο %y</target>
-
-<source>Moving symbolic link %x to %y</source>
-<target>Μεταφορά του συμβολικού σύνδεσμου %x στο %y</target>
-
-<source>Removing old versions...</source>
-<target>Διαγραφή παλιών εκδόσεων...</target>
-
-<source>Updating file %x</source>
-<target>Ενημέρωση του αρχείου %x</target>
-
-<source>Updating symbolic link %x</source>
-<target>Ενημέρωση του συμβολικού σύνδεσμου %x</target>
-
-<source>Verifying file %x</source>
-<target>Επαλήθευση του αρχείου %x</target>
-
-<source>Updating attributes of %x</source>
-<target>Ενημέρωση των χαρακτηριστικών αρχείου του %x</target>
-
-<source>Source item %x not found</source>
-<target>Το στοιχείο προέλευσης %x δεν βρέθηκε</target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>Δημιουργία Σκιώδους Αντίγραφου Τόμου για το %x...</target>
-
-<source>Target folder %x already existing.</source>
-<target>Ο φάκελος-στόχος %x υπάρχει ήδη.</target>
-
-<source>Target folder input field must not be empty.</source>
-<target>Το πεδίο εισαγωγής του φακέλου-στόχου πρέπει να μην είναι κενό.</target>
-
-<source>Source folder %x not found.</source>
-<target>Ο φάκελος %x δε βρέθηκε.</target>
-
-<source>Please enter a target folder for versioning.</source>
-<target>Παρακαλούμε εισάγετε ένα φάκελο για αποθήκευση παλιών εκδόσεων.</target>
-
-<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>Τα ακόλουθα στοιχεία έχουν ανεπίλυτες διενέξεις και δε θα συγχρονιστούν:</target>
-
-<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>Οι ακόλουθοι φάκελοι είναι σημαντικά διαφορετικοί. Παρακαλούμε ελέγξτε εάν έχουν επιλεχθεί για συγχρονισμό οι σωστοί φάκελοι.</target>
-
-<source>Not enough free disk space available in:</source>
-<target>Δεν υπάρχει αρκετός διαθέσιμος χώρος στο δίσκο:</target>
-
-<source>Available:</source>
-<target>Διαθέσιμος:</target>
-
-<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>Μερικά αρχεία θα συγχρονιστούν ως μέρη πολλαπλών βασικών φακέλων.</target>
-
-<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>Για να αποφύγετε διενέξεις, δημιουργείστε φίλτρα εξαίρεσης, ώστε κάθε ενημερωμένο αρχείο να εξετάζεται μόνο από έναν βασικό φάκελο.</target>
-
-<source>Versioning folder:</source>
-<target>Διατήρηση παλιών εκδόσεων του φακέλου:</target>
-
-<source>Base folder:</source>
-<target>Βασικός φάκελος:</target>
-
-<source>The versioning folder is contained in a base folder.</source>
-<target>Ο φάκελος διατήρησης παλιών εκδόσεων βρίσκεται μέσα σε κάποιον βασικό φάκελο.</target>
-
-<source>Synchronizing folder pair:</source>
-<target>Συγχρονίζεται το ζευγάρι φακέλων:</target>
-
-<source>Generating database...</source>
-<target>Δημιουργία βάσης δεδομένων...</target>
-
<source>Loading...</source>
<target>Φόρτωση...</target>
@@ -888,7 +894,7 @@ The command is triggered if:
<target>Παρακαλούμε επιλέξτε ένα φάκελο σε ένα τοπικό σύστημα αρχείων, σε ένα δίκτυο ή σε μια συσκευή MTP.</target>
<source>Defined by context of use</source>
-<target></target>
+<target>Εξαρτάται από τον τρόπο χρήσης</target>
<source>Requires FreeFileSync Donation Edition</source>
<target>Απαιτεί την Έκδοση Δωρητή του FreeFileSync</target>
@@ -1061,8 +1067,8 @@ The command is triggered if:
<source>Show examples</source>
<target>Εμφάνιση παραδειγμάτων</target>
-<source>Time span:</source>
-<target>Χρονικό εύρος:</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>Επιλογή κανόνων φιλτραρίσματος, ώστε να εξαιρεθούν ορισμένα αρχεία από το συγχρονισμό. Εισάγετε τις διαδρομές των αρχείων σχετικά με το αντίστοιχο ζεύγος φακέλων.</target>
<source>File size:</source>
<target>Μέγεθος αρχείου:</target>
@@ -1073,8 +1079,8 @@ The command is triggered if:
<source>Maximum:</source>
<target>Μέγιστο:</target>
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target>Επιλογή κανόνων φιλτραρίσματος, ώστε να εξαιρεθούν ορισμένα αρχεία από το συγχρονισμό. Εισάγετε τις διαδρομές των αρχείων σχετικά με το αντίστοιχο ζεύγος φακέλων.</target>
+<source>Time span:</source>
+<target>Χρονικό εύρος:</target>
<source>C&lear</source>
<target>&Καθαρισμός</target>
@@ -1105,9 +1111,18 @@ The command is triggered if:
<source>&Versioning</source>
<target>&Διατήρηση παλιών εκδόσεων</target>
+<source>Move files to a user-defined folder</source>
+<target>Μεταφορά αρχείων σε έναν υποκατάλογο που ορίζεται από το χρήστη</target>
+
<source>Naming convention:</source>
<target>Κανόνας ονοματοθεσίας:</target>
+<source>Limit file versions:</source>
+<target>Περιορισμός αριθμού παλιών εκδόσεων:</target>
+
+<source>Last x days:</source>
+<target>Τις τελευταίες x μέρες:</target>
+
<source>Ignore errors</source>
<target>Αγνόηση σφαλμάτων</target>
@@ -1249,11 +1264,8 @@ The command is triggered if:
<source>Save log:</source>
<target>Αποθήκευση αρχείου καταγραφής:</target>
-<source>Limit:</source>
-<target>Όριο:</target>
-
-<source>Limit maximum number of log files</source>
-<target>Μέγιστος αριθμός αρχείων καταγραφής</target>
+<source>Limit number of log files:</source>
+<target>Περιορισμός αριθμού αρχείων καταγραφής:</target>
<source>How can I schedule a batch job?</source>
<target>Πώς μπορώ να προγραμματίσω μια εργασία με δέσμη ενεργειών;</target>
@@ -1288,9 +1300,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Transfer file and folder permissions.</source>
<target>Μεταφορά των δικαιωμάτων πρόσβασης αρχείων και φακέλων.</target>
-<source>Show hidden dialogs again</source>
-<target>Επανεμφάνιση των κρυμμένων ειδοποιήσεων</target>
-
<source>Show all permanently hidden dialogs and warning messages again</source>
<target>Επανεμφάνιση όλων των μόνιμα κρυμμένων ειδοποιήσεων και προειδοποιητικών μηνυμάτων</target>
@@ -1381,9 +1390,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Select Time Span</source>
<target>Επιλογή Χρονικού Εύρους</target>
-<source>FreeFileSync Donation Edition</source>
-<target>Έκδοση Δωρητή του FreeFileSync</target>
-
<source>Highlight Configurations</source>
<target>Επισήμανση Παραμέτρων</target>
@@ -1507,6 +1513,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Select time span...</source>
<target>Επιλέξτε το χρονικό εύρος...</target>
+<source>Donation Edition</source>
+<target>Έκδοση Δωρητή</target>
+
<source>Folder Comparison and Synchronization</source>
<target>Σύγκριση Φακέλων και Συγχρονισμός</target>
@@ -1705,6 +1714,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Parameters for opposite side</source>
<target>Παράμετροι για την απέναντι πλευρά</target>
+<source>Show hidden dialogs again</source>
+<target>Επανεμφάνιση των κρυμμένων ειδοποιήσεων</target>
+
+<source>All dialogs shown</source>
+<target>Φαίνονται όλες οι ειδοποιήσεις</target>
+
<source>Downloading update...</source>
<target>Λήψη ενημέρωσης...</target>
@@ -1744,9 +1759,6 @@ This guarantees a consistent state even in case of a serious error.
<source>This year</source>
<target>Αυτό το έτος</target>
-<source>Last x days</source>
-<target>Τελευταίες x ημέρες</target>
-
<source>Byte</source>
<target>Byte</target>
@@ -1762,9 +1774,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Delete and overwrite files permanently</source>
<target>Μόνιμη διαγραφή και αντικατάσταση αρχείων</target>
-<source>Move files to a user-defined folder</source>
-<target>Μεταφορά αρχείων σε έναν υποκατάλογο που ορίζεται από το χρήστη</target>
-
<source>Replace</source>
<target>Αντικατάσταση προηγούμενης</target>
@@ -1774,6 +1783,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Time stamp</source>
<target>Χρονική σήμανση</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>Μεταφορά αρχείων σε έναν χρονικά σημασμένο υποφάκελο</target>
+
+<source>File</source>
+<target>Αρχείο</target>
+
<source>Append a time stamp to each file name</source>
<target>Προσάρτηση χρονικής σήμανσης στο όνομα κάθε αρχείου</target>
@@ -1795,12 +1810,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Leave as unresolved conflict</source>
<target>Παράβλεψη ως ανεπίλυτη διένεξη</target>
-<source>File</source>
-<target>Αρχείο</target>
-
<source>YYYY-MM-DD hhmmss</source>
<target>ΕΕΕΕ-ΜΜ-ΗΗ ωωλλδδ</target>
+<source>Minimum version count must be smaller than maximum count.</source>
+<target>Ο ελάχιστος αριθμός παλιών εκδόσεων πρέπει να είναι μικρότερος από τον μέγιστο αριθμό.</target>
+
<source>Files</source>
<target>Αρχεία</target>
@@ -1948,8 +1963,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Portable</source>
<target>Φορητή</target>
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>Αποθήκευση ρυθμίσεων στο "%APPDATA%\FreeFileSync"</target>
+<source>Save settings in %x</source>
+<target>Αποθήκευση των ρυθμίσεων στο %x</target>
<source>Register FreeFileSync file extensions</source>
<target>Καταχώρηση των επεκτάσεων των αρχείων του FreeFileSync</target>
diff --git a/FreeFileSync/Build/Languages/hebrew.lng b/FreeFileSync/Build/Languages/hebrew.lng
index a3a23712..261eed73 100755
--- a/FreeFileSync/Build/Languages/hebrew.lng
+++ b/FreeFileSync/Build/Languages/hebrew.lng
@@ -7,9 +7,6 @@
<plural_definition>n == 1 ? 0 : 1</plural_definition>
</header>
-<source>Defined by context of use</source>
-<target></target>
-
<source>Both sides have changed since last synchronization.</source>
<target>שני הצדדים שונו מאז הסנכרון האחרון.</target>
@@ -118,11 +115,20 @@
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
<target>קבצי ההתקנה פגומים. בבקשה התקן מחדש את FreeFileSync.</target>
+<source>Cannot load file %x.</source>
+<target>לא יכול לטעון קובץ %x.</target>
+
<source>Cannot find the following folders:</source>
<target>לא יכול למצוא את התיקיות הבאות:</target>
-<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>אם תתעלם משגיאה זו התיקיות יחשבו כריקות. תיקיות חסרות נוצרות באופן אוטומטי כאשר נדרש.</target>
+<source>The following folders do not yet exist:</source>
+<target>התיקיות הבאות אינן קיימות עדיין:</target>
+
+<source>The folders are created automatically when needed.</source>
+<target>התיקיות נוצרות באופן אוטמטי כאשר נדרש.</target>
+
+<source>Scanning:</source>
+<target>סורק:</target>
<source>Comparison finished:</source>
<target>ההשוואה הסתיימה:</target>
@@ -217,6 +223,63 @@
<source>Out of memory.</source>
<target>תם הזכרון.</target>
+<source>Database file %x is incompatible.</source>
+<target>קובץ מסד נתונים %x אינו במבנה מתאים.</target>
+
+<source>Initial synchronization:</source>
+<target>סנכרון ראשוני:</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>קובץ מסד נתונים %x אינו קיים עדיין.</target>
+
+<source>Database file is corrupted:</source>
+<target>קובץ בסיס נתונים פגום:</target>
+
+<source>Cannot write file %x.</source>
+<target>לא יכול לכתוב קובץ %x.</target>
+
+<source>Cannot read file %x.</source>
+<target>לא יכול לקרוא קובץ %x.</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>קבצי בסיס הנתונים אינם כוללים עדיין מידע על סינכרון אחרון.</target>
+
+<source>Loading file %x...</source>
+<target>טוען קובץ %x...</target>
+
+<source>Saving file %x...</source>
+<target>שומר קובץ %x...</target>
+
+<source>Searching for folder %x...</source>
+<target>מחפש את תיקייה %x...</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>פקע הזמן עבור חיפוש של תיקייה %x.</target>
+
+<source>Cannot get process information.</source>
+<target>לא יכול לקבל את נתוני התהליך.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>לא יכול לקרוא תכונות של קובץ %x.</target>
+
+<source>Waiting while directory is locked:</source>
+<target>ממתין בזמן שהמחיצה נעולה:</target>
+
+<source>Lock owner:</source>
+<target>בעלים נעול:</target>
+
+<source>Detecting abandoned lock...</source>
+<target>מגלה נעילה נטושה...</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 שנייה</pluralform>
+<pluralform>%x שניות</pluralform>
+</target>
+
<source>Item exists on left side only</source>
<target>הפריט קיים בצד ימין בלבד</target>
@@ -271,8 +334,188 @@
<source>Update attributes on right</source>
<target>עדכן תכונות בצד שמאל</target>
-<source>Cannot read file %x.</source>
-<target>לא יכול לקרוא קובץ %x.</target>
+<source>Items processed:</source>
+<target>אלמנטים עובדו:</target>
+
+<source>Items remaining:</source>
+<target>אלמנתים נותרו:</target>
+
+<source>Total time:</source>
+<target>זמן כולל:</target>
+
+<source>Cleaning up log files:</source>
+<target>מנקה קבצי יומן:</target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>שגיאה בפענוח קובץ %x, שורה %y, טור %z.</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>אין אפשרות להגדיר נעילות מחיצה עבור התיקיות הבאות:</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>תהליך 1</pluralform>
+<pluralform>%x תהליכים</pluralform>
+</target>
+
+<source>Cannot read directory %x.</source>
+<target>לא ניתן לקרוא מחיצה %x.</target>
+
+<source>/sec</source>
+<target>/שנ</target>
+
+<source>%x items/sec</source>
+<target>%x פריטים לשניה</target>
+
+<source>Show in Explorer</source>
+<target>הראה בסייר הקבצים</target>
+
+<source>Open with default application</source>
+<target>פתח באמצאות האפליקציה המתאימה</target>
+
+<source>Browse directory</source>
+<target>עיין במחיצה</target>
+
+<source>Unable to connect to %x.</source>
+<target>לא יכול להתחבר אל %x.</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>לא ניתן לגשת אל שרות Volume Shadow Copy.</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>בבקשה הרץ את גירסת 64 סיביות של FreeFileSync כדי ליצור עותקי צל של מערכת זו.</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>לא יכול לקבוע שם אמצעי אחסון %x.</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>כרך בשם %x אינו חלק של נתיב קובץ %y.</target>
+
+<source>File time and size</source>
+<target>זמן וגודל קובץ</target>
+
+<source>File content</source>
+<target>תכולת הקובץ</target>
+
+<source>File size</source>
+<target>גודל קובץ</target>
+
+<source>Two way</source>
+<target>דו כווני</target>
+
+<source>Mirror</source>
+<target>מראה</target>
+
+<source>Update</source>
+<target>שדרג</target>
+
+<source>Custom</source>
+<target>מותאם</target>
+
+<source>Multiple...</source>
+<target>הכפל...</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>לא יכול לכתוב תכונות קובץ של %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>לא יכול לפתוח קובץ %x.</target>
+
+<source>%x and %y have different content.</source>
+<target>%x ו- %y הם בעלי צוכן שונה.</target>
+
+<source>Data verification error:</source>
+<target>שגיאת בדיקת מידע:</target>
+
+<source>Moving file %x to %y</source>
+<target>מעביר קובץ %x אל %y</target>
+
+<source>Moving folder %x to %y</source>
+<target>מעביר תיקייה %x אל %y</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>מעביר קישור סימבולי %x אל %y</target>
+
+<source>Updating file %x</source>
+<target>מעדכן קובץ %x</target>
+
+<source>Updating symbolic link %x</source>
+<target>מעדכן קישור סימבולי %x</target>
+
+<source>Verifying file %x</source>
+<target>מאמת קובץ %x</target>
+
+<source>Updating attributes of %x</source>
+<target>מעדכן תכונות של %x</target>
+
+<source>Source item %x not found</source>
+<target>פריט מקור %x לא נמצא</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>מייצר Volume Shadow Copy עבור %x...</target>
+
+<source>Cannot find folder %x.</source>
+<target>לא מוצא תיקייה %x.</target>
+
+<source>Target folder %x already existing.</source>
+<target>תיקיית מטרה %x כבר קיימת.</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>קלט תיקיית מטרה אינה יכול להיות ריק.</target>
+
+<source>Source folder %x not found.</source>
+<target>תיקיית מקור %x לא נמצאת.</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>בבקשה הזן תיקיית יעד עבור גרסאות.</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>לפריטים הבאים יש קונפליקטים בלתי פתורים והם לא יסונכרנו:</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>התיקיות הבאות שונות באופן מהותי. בבקשה בדוק כי נבחרו התיקיות הנכונות לסחנכרון.</target>
+
+<source>Not enough free disk space available in:</source>
+<target>אין מספיק מקום דיסק פנוי ב:</target>
+
+<source>Required:</source>
+<target>נדרש:</target>
+
+<source>Available:</source>
+<target>זמין:</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>קבצים מסויימים יסונכרנו כחלק מתיקיות בסיס מרובות.</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>כדי למנוע התנגשויות, הגדר מסננים לאי הכללת קבצים כך שכל קובץ מעודכן ייחשב על ידי תיקיית בסיס אחת.</target>
+
+<source>Versioning folder:</source>
+<target>תיקיית גרסאות:</target>
+
+<source>Base folder:</source>
+<target>תיקיית בסיס:</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>תיקיית ניהול הגירסאות נמצאת בתיקיית בסיס.</target>
+
+<source>Synchronizing folder pair:</source>
+<target>מסנכרן זוג תיקיות:</target>
+
+<source>Generating database...</source>
+<target>מייצר מסד נתונים...</target>
+
+<source>Searching for excess file versions:</source>
+<target>מחפש גרסאות קובץ עודפות:</target>
+
+<source>Removing excess file versions:</source>
+<target>מסיר גרסאות קובץ עודפות:</target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>לא ניתן ליצור תג זמן לגרסאות:</target>
<source>
Unexpected size of data stream.
@@ -291,17 +534,14 @@ Actual: %y bytes
<source>Operation not supported for different base folder types.</source>
<target>פעולה לא נתמכת עבור סוגים אחרים של תיקית בסיס.</target>
-<source>Cannot write file %x.</source>
-<target>לא יכול לכתוב קובץ %x.</target>
-
<source>Cannot move file %x to %y.</source>
<target>לא יכול להעביר קובץ %x אל %y.</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>לא יכול להעתיק קישור סימבולי %x אל %y.</target>
-<source>Unable to connect to %x.</source>
-<target>לא יכול להתחבר אל %x.</target>
+<source>Error Code %x</source>
+<target>קוד שגיאה %x</target>
<source>Failed to get information about server %x.</source>
<target>נכשלה קבלת מידע על שרת %x.</target>
@@ -309,12 +549,6 @@ Actual: %y bytes
<source>Cannot open directory %x.</source>
<target>לא יכול לפתוח מחיצה %x.</target>
-<source>Cannot read directory %x.</source>
-<target>לא ניתן לקרוא מחיצה %x.</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>לא יכול לקרוא תכונות של קובץ %x.</target>
-
<source>Cannot create directory %x.</source>
<target>לא יכול ליצור מחיצה %x.</target>
@@ -342,9 +576,6 @@ Actual: %y bytes
<source>Cannot find device %x.</source>
<target>לא מוצא התקן %x.</target>
-<source>Cannot open file %x.</source>
-<target>לא יכול לפתוח קובץ %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>סוג של פריט %x אינו נתמך:</target>
@@ -357,15 +588,9 @@ Actual: %y bytes
<source>Incorrect command line:</source>
<target>שורת פקודה לא תקינה:</target>
-<source>Error Code %x</source>
-<target>קוד שגיאה %x</target>
-
<source>The server does not support authentication via %x.</source>
<target>השרת אינו תומך באימות באמצעות %x.</target>
-<source>Required:</source>
-<target>נדרש:</target>
-
<source>Unable to access %x.</source>
<target>לא ניתן לגשת אל %x.</target>
@@ -411,123 +636,9 @@ Actual: %y bytes
<source>%x GB</source>
<target>%x גיגה בייט</target>
-<source>Cannot load file %x.</source>
-<target>לא יכול לטעון קובץ %x.</target>
-
-<source>Database file %x is incompatible.</source>
-<target>קובץ מסד נתונים %x אינו במבנה מתאים.</target>
-
-<source>Initial synchronization:</source>
-<target>סנכרון ראשוני:</target>
-
-<source>Database file %x does not yet exist.</source>
-<target>קובץ מסד נתונים %x אינו קיים עדיין.</target>
-
-<source>Database file is corrupted:</source>
-<target>קובץ בסיס נתונים פגום:</target>
-
-<source>The database files do not yet contain information about the last synchronization.</source>
-<target>קבצי בסיס הנתונים אינם כוללים עדיין מידע על סינכרון אחרון.</target>
-
-<source>Loading file %x...</source>
-<target>טוען קובץ %x...</target>
-
-<source>Saving file %x...</source>
-<target>שומר קובץ %x...</target>
-
-<source>Searching for folder %x...</source>
-<target>מחפש את תיקייה %x...</target>
-
-<source>Timeout while searching for folder %x.</source>
-<target>פקע הזמן עבור חיפוש של תיקייה %x.</target>
-
-<source>Cannot get process information.</source>
-<target>לא יכול לקבל את נתוני התהליך.</target>
-
-<source>Waiting while directory is locked:</source>
-<target>ממתין בזמן שהמחיצה נעולה:</target>
-
-<source>Lock owner:</source>
-<target>בעלים נעול:</target>
-
-<source>Detecting abandoned lock...</source>
-<target>מגלה נעילה נטושה...</target>
-
-<source>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</source>
-<target>
-<pluralform>1 שנייה</pluralform>
-<pluralform>%x שניות</pluralform>
-</target>
-
-<source>Items processed:</source>
-<target>אלמנטים עובדו:</target>
-
-<source>Items remaining:</source>
-<target>אלמנתים נותרו:</target>
-
-<source>Total time:</source>
-<target>זמן כולל:</target>
-
-<source>Cleaning up old log files...</source>
-<target>מנקה קבצי יומן ישנים...</target>
-
-<source>Error parsing file %x, row %y, column %z.</source>
-<target>שגיאה בפענוח קובץ %x, שורה %y, טור %z.</target>
-
-<source>Cannot set directory locks for the following folders:</source>
-<target>אין אפשרות להגדיר נעילות מחיצה עבור התיקיות הבאות:</target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-<pluralform>תהליך 1</pluralform>
-<pluralform>%x תהליכים</pluralform>
-</target>
-
-<source>Scanning:</source>
-<target>סורק:</target>
-
-<source>/sec</source>
-<target>/שנ</target>
-
-<source>%x items/sec</source>
-<target>%x פריטים לשניה</target>
-
-<source>Show in Explorer</source>
-<target>הראה בסייר הקבצים</target>
-
-<source>Open with default application</source>
-<target>פתח באמצאות האפליקציה המתאימה</target>
-
-<source>Browse directory</source>
-<target>עיין במחיצה</target>
-
-<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>לא ניתן לגשת אל שרות Volume Shadow Copy.</target>
-
-<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>בבקשה הרץ את גירסת 64 סיביות של FreeFileSync כדי ליצור עותקי צל של מערכת זו.</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>לא יכול לקבוע שם אמצעי אחסון %x.</target>
-
-<source>Volume name %x is not part of file path %y.</source>
-<target>כרך בשם %x אינו חלק של נתיב קובץ %y.</target>
-
-<source>Unable to create time stamp for versioning:</source>
-<target>לא ניתן ליצור תג זמן לגרסאות:</target>
-
<source>Drag && drop</source>
<target>גרור ושחרר</target>
-<source>Cannot find folder %x.</source>
-<target>לא מוצא תיקייה %x.</target>
-
<source>Select a folder</source>
<target>בחר תיקייה</target>
@@ -623,8 +734,8 @@ The command is triggered if:
<source>Directory monitoring active</source>
<target>ניטור מחיצות פעיל</target>
-<source>Waiting until all directories are available...</source>
-<target>מחכה עד שכל המחיצות יהיו זמינות...</target>
+<source>Waiting until directory is available:</source>
+<target>מחכה עד שהמחיצה זמינה:</target>
<source>&Restore</source>
<target>&טען מחדש</target>
@@ -638,114 +749,6 @@ The command is triggered if:
<source>&Retry</source>
<target>&נסה שנית</target>
-<source>File time and size</source>
-<target>זמן וגודל קובץ</target>
-
-<source>File content</source>
-<target>תכולת הקובץ</target>
-
-<source>File size</source>
-<target>גודל קובץ</target>
-
-<source>Two way</source>
-<target>דו כווני</target>
-
-<source>Mirror</source>
-<target>מראה</target>
-
-<source>Update</source>
-<target>שדרג</target>
-
-<source>Custom</source>
-<target>מותאם</target>
-
-<source>Multiple...</source>
-<target>הכפל...</target>
-
-<source>Cannot write file attributes of %x.</source>
-<target>לא יכול לכתוב תכונות קובץ של %x.</target>
-
-<source>%x and %y have different content.</source>
-<target>%x ו- %y הם בעלי צוכן שונה.</target>
-
-<source>Data verification error:</source>
-<target>שגיאת בדיקת מידע:</target>
-
-<source>Moving file %x to %y</source>
-<target>מעביר קובץ %x אל %y</target>
-
-<source>Moving folder %x to %y</source>
-<target>מעביר תיקייה %x אל %y</target>
-
-<source>Moving symbolic link %x to %y</source>
-<target>מעביר קישור סימבולי %x אל %y</target>
-
-<source>Removing old versions...</source>
-<target>מסיר גרסאות ישנות...</target>
-
-<source>Updating file %x</source>
-<target>מעדכן קובץ %x</target>
-
-<source>Updating symbolic link %x</source>
-<target>מעדכן קישור סימבולי %x</target>
-
-<source>Verifying file %x</source>
-<target>מאמת קובץ %x</target>
-
-<source>Updating attributes of %x</source>
-<target>מעדכן תכונות של %x</target>
-
-<source>Source item %x not found</source>
-<target>פריט מקור %x לא נמצא</target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>מייצר Volume Shadow Copy עבור %x...</target>
-
-<source>Target folder %x already existing.</source>
-<target>תיקיית מטרה %x כבר קיימת.</target>
-
-<source>Target folder input field must not be empty.</source>
-<target>קלט תיקיית מטרה אינה יכול להיות ריק.</target>
-
-<source>Source folder %x not found.</source>
-<target>תיקיית מקור %x לא נמצאת.</target>
-
-<source>Please enter a target folder for versioning.</source>
-<target>בבקשה הזן תיקיית יעד עבור גרסאות.</target>
-
-<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>לפריטים הבאים יש קונפליקטים בלתי פתורים והם לא יסונכרנו:</target>
-
-<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>התיקיות הבאות שונות באופן מהותי. בבקשה בדוק כי נבחרו התיקיות הנכונות לסחנכרון.</target>
-
-<source>Not enough free disk space available in:</source>
-<target>אין מספיק מקום דיסק פנוי ב:</target>
-
-<source>Available:</source>
-<target>זמין:</target>
-
-<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>קבצים מסויימים יסונכרנו כחלק מתיקיות בסיס מרובות.</target>
-
-<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>כדי למנוע התנגשויות, הגדר מסננים לאי הכללת קבצים כך שכל קובץ מעודכן ייחשב על ידי תיקיית בסיס אחת.</target>
-
-<source>Versioning folder:</source>
-<target>תיקיית גרסאות:</target>
-
-<source>Base folder:</source>
-<target>תיקיית בסיס:</target>
-
-<source>The versioning folder is contained in a base folder.</source>
-<target>תיקיית ניהול הגירסאות נמצאת בתיקיית בסיס.</target>
-
-<source>Synchronizing folder pair:</source>
-<target>מסנכרן זוג תיקיות:</target>
-
-<source>Generating database...</source>
-<target>מייצר מסד נתונים...</target>
-
<source>Loading...</source>
<target>טוען...</target>
@@ -890,6 +893,9 @@ The command is triggered if:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>אנא בחר תיקייה במערכת הקבצים המקומית, ברשת או בהתקן MTP.</target>
+<source>Defined by context of use</source>
+<target>מוגדר בהקשר של השימוש</target>
+
<source>Requires FreeFileSync Donation Edition</source>
<target>נדרשת מהדורת התרומות של FreeFileSync</target>
@@ -1061,8 +1067,8 @@ The command is triggered if:
<source>Show examples</source>
<target>הראה דוגמאות</target>
-<source>Time span:</source>
-<target>טווח זמן:</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>בחר כללי סינון כדי לא לכלול קבצים מסוימים בסנכרון. הזן את נתיבי הקבצים ביחס לזוג התיקיות בהתאמה.</target>
<source>File size:</source>
<target>גודל קובץ:</target>
@@ -1073,8 +1079,8 @@ The command is triggered if:
<source>Maximum:</source>
<target>מקסימום:</target>
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target>בחר כללי סינון כדי לא לכלול קבצים מסוימים בסנכרון. הזן את נתיבי הקבצים ביחס לזוג התיקיות בהתאמה.</target>
+<source>Time span:</source>
+<target>טווח זמן:</target>
<source>C&lear</source>
<target>א&פס</target>
@@ -1105,9 +1111,18 @@ The command is triggered if:
<source>&Versioning</source>
<target>&גרסאות</target>
+<source>Move files to a user-defined folder</source>
+<target>העבר קבצים לתיקייה המוגדרת ע"י המפעיל</target>
+
<source>Naming convention:</source>
<target>מוסכמות לקביעת שמות:</target>
+<source>Limit file versions:</source>
+<target>הגבל גירסאות קובץ:</target>
+
+<source>Last x days:</source>
+<target>x ימים אחרונים:</target>
+
<source>Ignore errors</source>
<target>התעלם משגיאות</target>
@@ -1249,11 +1264,8 @@ The command is triggered if:
<source>Save log:</source>
<target>שמור יומן:</target>
-<source>Limit:</source>
-<target>מגבלה:</target>
-
-<source>Limit maximum number of log files</source>
-<target>הגבל מספר מכסימלי של קבצי יומן</target>
+<source>Limit number of log files:</source>
+<target>הגבל מספר של קבצי יומן:</target>
<source>How can I schedule a batch job?</source>
<target>כיצד לתזמן משימת אצווה?</target>
@@ -1288,9 +1300,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Transfer file and folder permissions.</source>
<target>הרשאות העברת קובץ ותיקייה.</target>
-<source>Show hidden dialogs again</source>
-<target>הראה שוב דיאלוגים נסתרים</target>
-
<source>Show all permanently hidden dialogs and warning messages again</source>
<target>הראה שוב את כל הדיאלוגים והודאות האזהרה המוסתרים באופן קבוע</target>
@@ -1381,9 +1390,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Select Time Span</source>
<target>בחר טווח זמן</target>
-<source>FreeFileSync Donation Edition</source>
-<target>מהדורת תרומות של FreeFileSync</target>
-
<source>Highlight Configurations</source>
<target>הדגש תצורות</target>
@@ -1507,6 +1513,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Select time span...</source>
<target>בחר תחום זמן...</target>
+<source>Donation Edition</source>
+<target>מהדורת התרומות</target>
+
<source>Folder Comparison and Synchronization</source>
<target>סנכרון קבצים ותיקיות</target>
@@ -1705,6 +1714,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Parameters for opposite side</source>
<target>פרמטרים עבור צד נגדי</target>
+<source>Show hidden dialogs again</source>
+<target>הראה שוב דיאלוגים נסתרים</target>
+
+<source>All dialogs shown</source>
+<target>כל תיבות הדו שיח מוצגות</target>
+
<source>Downloading update...</source>
<target>מוריד עדכון...</target>
@@ -1744,9 +1759,6 @@ This guarantees a consistent state even in case of a serious error.
<source>This year</source>
<target>בשנה הנוכחית</target>
-<source>Last x days</source>
-<target>x ימים אחרונים</target>
-
<source>Byte</source>
<target>בייט</target>
@@ -1762,9 +1774,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Delete and overwrite files permanently</source>
<target>מחק והחלף קבצים לצמיתות</target>
-<source>Move files to a user-defined folder</source>
-<target>העבר קבצים לתיקייה המוגדרת ע"י המפעיל</target>
-
<source>Replace</source>
<target>החלף</target>
@@ -1774,6 +1783,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Time stamp</source>
<target>תג זמן</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>העבר קבצים של תת תיקיה עם חתימת זמן</target>
+
+<source>File</source>
+<target>קובץ</target>
+
<source>Append a time stamp to each file name</source>
<target>הוסף חתימת זמן לכל שם קובץ</target>
@@ -1795,12 +1810,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Leave as unresolved conflict</source>
<target>השאר כקונפליקט לא מטופל</target>
-<source>File</source>
-<target>קובץ</target>
-
<source>YYYY-MM-DD hhmmss</source>
<target>YYYY-MM-DD hhmmss</target>
+<source>Minimum version count must be smaller than maximum count.</source>
+<target>מונה גירסה מינימלי חייב להיות קטן ממונה גירסה מקסימלי.</target>
+
<source>Files</source>
<target>קבצים</target>
@@ -1948,8 +1963,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Portable</source>
<target>נייד</target>
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>שמור נתונים ל "%APPDATA%\FreeFileSync"</target>
+<source>Save settings in %x</source>
+<target>שמור הגדרות ב%x</target>
<source>Register FreeFileSync file extensions</source>
<target>רשום את סיומות הקבצים של FreeFileSync.</target>
diff --git a/FreeFileSync/Build/Languages/hindi.lng b/FreeFileSync/Build/Languages/hindi.lng
index d575a013..43847881 100755
--- a/FreeFileSync/Build/Languages/hindi.lng
+++ b/FreeFileSync/Build/Languages/hindi.lng
@@ -115,11 +115,20 @@
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
<target>स्थापना फ़ाइलें दूषित हैं। FreeFileSync पुनर्स्थापित करें।</target>
+<source>Cannot load file %x.</source>
+<target>फ़ाइल %x लोड करने में असमर्थ।</target>
+
<source>Cannot find the following folders:</source>
<target>निम्न फ़ोलडर्स नहीं मिले:</target>
-<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>इस त्रुटि को अनदेखा कर दिया जाता है तो निर्देशिकाओं को खाली माना जाएगा। अनुपस्थित फ़ोलडर्स आवश्यकता होने पर स्वचालित रूप से बनाए जाते हैं।</target>
+<source>The following folders do not yet exist:</source>
+<target>निम्न फ़ोल्डर्स अभी तक मौजूद नहीं हैं:</target>
+
+<source>The folders are created automatically when needed.</source>
+<target>आवश्यक होने पर फ़ोल्डर्स स्वचालित रूप से बनाए जाते हैं।</target>
+
+<source>Scanning:</source>
+<target>स्कैनिंग:</target>
<source>Comparison finished:</source>
<target>तुलना पूर्ण हुई:</target>
@@ -214,6 +223,63 @@
<source>Out of memory.</source>
<target>स्मृति से बाहर।</target>
+<source>Database file %x is incompatible.</source>
+<target>डेटाबेस फ़ाइल %x विसंगत है।</target>
+
+<source>Initial synchronization:</source>
+<target>प्रारंभिक सिंक्रनाइज़ेशन:</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>डेटाबेस फ़ाइल %x अभी तक मौजूद नहीं है।</target>
+
+<source>Database file is corrupted:</source>
+<target>डेटाबेस फ़ाइल दूषित है:</target>
+
+<source>Cannot write file %x.</source>
+<target>फ़ाइल %x लिखने में असमर्थ।</target>
+
+<source>Cannot read file %x.</source>
+<target>फ़ाइल %x पढ़ने में असमर्थ।</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>डेटाबेस फ़ाइल्स में अभी तक पिछले सिंक्रनाइज़ेशन की जानकारी नहीं है।</target>
+
+<source>Loading file %x...</source>
+<target>फ़ाइल %x को लोड किया जा रहा है...</target>
+
+<source>Saving file %x...</source>
+<target>फ़ाइल %x सहेजी जा रही है...</target>
+
+<source>Searching for folder %x...</source>
+<target>निर्देशिका %x की खोज हो रही है...</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>निर्देशिका %x की खोज करते हुए काल समाप्त हआ।</target>
+
+<source>Cannot get process information.</source>
+<target>प्रक्रिया जानकारी प्राप्त करने में असमर्थ।</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>%x के फ़ाइल गुण पढ़ने में असमर्थ।</target>
+
+<source>Waiting while directory is locked:</source>
+<target>प्रतीक्षारत जब कि निर्देशिका अवरोधित है:</target>
+
+<source>Lock owner:</source>
+<target>स्वामी अवरोध करें:</target>
+
+<source>Detecting abandoned lock...</source>
+<target>अपसर्जित अवरोध पता लगाया जा रहा है...</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 सेकंड</pluralform>
+<pluralform>%x सेकंड्स</pluralform>
+</target>
+
<source>Item exists on left side only</source>
<target>आइटम केवल बाईं तरफ मौजूद है।</target>
@@ -268,8 +334,188 @@
<source>Update attributes on right</source>
<target>दाईं तरफ के गुण अद्यतन करें</target>
-<source>Cannot read file %x.</source>
-<target>फ़ाइल %x पढ़ने में असमर्थ।</target>
+<source>Items processed:</source>
+<target>संसाधित आइटम्स:</target>
+
+<source>Items remaining:</source>
+<target>शेष आइटम्स:</target>
+
+<source>Total time:</source>
+<target>कुल समय:</target>
+
+<source>Cleaning up log files:</source>
+<target>लॉग फाइलों की सफ़ाई जारी:</target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>फ़ाइल %x, पंक्ति %y, स्तंभ %z पदच्छेदन में त्रुटि।</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>निम्न निर्देशिकाओं के लिए निर्देशिका अवरोध सेट नहीं कर सकते:</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>1 थ्रेड</pluralform>
+<pluralform>%x थ्रेड्स</pluralform>
+</target>
+
+<source>Cannot read directory %x.</source>
+<target>निर्देशिका %x को पढ़ा नहीं जा सकता।</target>
+
+<source>/sec</source>
+<target>/सेकंड</target>
+
+<source>%x items/sec</source>
+<target>%x आइटम्स/सेकंड</target>
+
+<source>Show in Explorer</source>
+<target>एक्सप्लोरर में दिखाएं</target>
+
+<source>Open with default application</source>
+<target>डिफ़ॉल्ट अ‍ॅप्लिकेशन के साथ खोलें</target>
+
+<source>Browse directory</source>
+<target>निर्देशिका ब्राउज़ करें</target>
+
+<source>Unable to connect to %x.</source>
+<target>%x से कनेक्ट करने में असमर्थ।</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>वॉल्यूम शॅडो प्रतिलिपि सर्व्हिस पहुँच प्राप्त नहीं है।</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>इस सिस्टम में शॅडो प्रतिलिपियाँ बनाने के लिए कृपया FreeFileSync का 64-बिट संस्करण चलाएँ।</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>%x के लिए वॉल्यूम नाम निर्धारण नहीं किया जा सकता।</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>%x वॉल्यूम नाम %y फ़ाइल पथ का हिस्सा नहीं है।</target>
+
+<source>File time and size</source>
+<target>फ़ाइल समय और आकार</target>
+
+<source>File content</source>
+<target>फ़ाइल सामग्री</target>
+
+<source>File size</source>
+<target>फ़ाइल आकार</target>
+
+<source>Two way</source>
+<target>दुतरफा</target>
+
+<source>Mirror</source>
+<target>प्रतिबिंबित करें</target>
+
+<source>Update</source>
+<target>अद्यतन करें</target>
+
+<source>Custom</source>
+<target>अनुकूल</target>
+
+<source>Multiple...</source>
+<target>एकाधिक...</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>%x के फ़ाइल गुण लिख नहीं सकते।</target>
+
+<source>Cannot open file %x.</source>
+<target>%x फ़ाइल को खोलने में असमर्थ।</target>
+
+<source>%x and %y have different content.</source>
+<target>%x और %y की सामग्री भिन्न है।</target>
+
+<source>Data verification error:</source>
+<target>डेटा सत्यापन त्रुटि:</target>
+
+<source>Moving file %x to %y</source>
+<target>फ़ाइल %x को %y यहाँ ले जाया जा रहा है</target>
+
+<source>Moving folder %x to %y</source>
+<target>निर्देशिका %x को %y यहाँ ले जाया जा रहा है</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>प्रतीकात्मक कड़ी %x को %y यहाँ ले जाया जा रहा है</target>
+
+<source>Updating file %x</source>
+<target>फ़ाइल %x अद्यतित हो रही है</target>
+
+<source>Updating symbolic link %x</source>
+<target>प्रतीकात्मक कड़ी %x अद्यतित हो रही है</target>
+
+<source>Verifying file %x</source>
+<target>फ़ाइल %x सत्यापित हो रही है</target>
+
+<source>Updating attributes of %x</source>
+<target>%x के गुण अद्यतित हो रहे हैं</target>
+
+<source>Source item %x not found</source>
+<target>स्रोत आइटम %x नहीं मिला</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>%x के लिए वॉल्यूम शॅडो प्रतिलिपि बनाई जा रही है...</target>
+
+<source>Cannot find folder %x.</source>
+<target>निर्देशिका %x नहीं मिला।</target>
+
+<source>Target folder %x already existing.</source>
+<target>गंतव्य निर्देशिका %x पहले से ही विद्यमान।</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>गंतव्य निर्देशिका प्रविष्टि खाली नहीं हो सकती।</target>
+
+<source>Source folder %x not found.</source>
+<target>स्रोत निर्देशिका %x नहीं मिला।</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>कृपया संस्करण करने के लिए गंतव्य निर्देशिका प्रविष्ट करें।</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>निम्न आइटम्स में हल नहीं किये गए विरोध हैं और वे सिंक्रनाइज़ नहीं होंगे:</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>निम्न निर्देशिकाएँ उल्लेखनीय रूप से भिन्न हैं। कृपया सुनिश्चित करें की सिंक्रनाइज़ेशन के लिए चुनी निर्देशिकाएँ उचित हैं।</target>
+
+<source>Not enough free disk space available in:</source>
+<target>यहाँ पर्याप्त खाली डिस्क जगह उपलब्ध नहीं:</target>
+
+<source>Required:</source>
+<target>आवश्यक:</target>
+
+<source>Available:</source>
+<target>उपलब्ध:</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>कुछ फ़ाइल्स को एकाधिक आधार निर्देशिकाओं के भाग के रूप में सिंक्रनाइज़ किया जाएगा।</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>विरोधों से बचने के लिए अपवर्जित फ़िल्टर्स सेट करें ताकि प्रत्येक अद्यतित फ़ाइल केवल एक ही आधार निर्देशिका से मानी जाएगी।</target>
+
+<source>Versioning folder:</source>
+<target>संस्करण निर्देशिका:</target>
+
+<source>Base folder:</source>
+<target>आधार निर्देशिका:</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>संस्करण निर्देशिका आधार निर्देशिका में निहित है।</target>
+
+<source>Synchronizing folder pair:</source>
+<target>यह निर्देशिका जोडा सिंक्रनाइज़ हो रहा है:</target>
+
+<source>Generating database...</source>
+<target>डेटाबेस बनाया जा रहा है...</target>
+
+<source>Searching for excess file versions:</source>
+<target>अतिरिक्त फ़ाइल संस्करणों की खोज हो रही है:</target>
+
+<source>Removing excess file versions:</source>
+<target>अतिरिक्त फ़ाइल संस्करणों को हटाया जा रहा है:</target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>संस्करण के लिए समय मोहर बनाने में असमर्थ:</target>
<source>
Unexpected size of data stream.
@@ -288,17 +534,14 @@ Actual: %y bytes
<source>Operation not supported for different base folder types.</source>
<target>भिन्न आधार निर्देशिका प्रकारों के लिए कार्यवाई समर्थित नहीं।</target>
-<source>Cannot write file %x.</source>
-<target>फ़ाइल %x लिखने में असमर्थ।</target>
-
<source>Cannot move file %x to %y.</source>
<target>फ़ाइल %x से %y ले जा नाहीं सकते।</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>सिंबॉलिक लिंक %x से %y प्रतिलिपित नहीं कर सकते।</target>
-<source>Unable to connect to %x.</source>
-<target>%x से कनेक्ट करने में असमर्थ।</target>
+<source>Error Code %x</source>
+<target>त्रुटि कोड %x</target>
<source>Failed to get information about server %x.</source>
<target>सर्वर %x की जानकारी प्राप्त करने में विफल।</target>
@@ -306,12 +549,6 @@ Actual: %y bytes
<source>Cannot open directory %x.</source>
<target>निर्देशिका %x खोल नहीं सकते।</target>
-<source>Cannot read directory %x.</source>
-<target>निर्देशिका %x को पढ़ा नहीं जा सकता।</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>%x के फ़ाइल गुण पढ़ने में असमर्थ।</target>
-
<source>Cannot create directory %x.</source>
<target>%x निर्देशिका बना नहीं सकते।</target>
@@ -339,9 +576,6 @@ Actual: %y bytes
<source>Cannot find device %x.</source>
<target>डिवाइस %x नहीं मिला।</target>
-<source>Cannot open file %x.</source>
-<target>%x फ़ाइल को खोलने में असमर्थ।</target>
-
<source>Type of item %x is not supported:</source>
<target>%x प्रकार का आइटम समर्थित नहीं है:</target>
@@ -354,15 +588,9 @@ Actual: %y bytes
<source>Incorrect command line:</source>
<target>अनुचित आदेश-पंक्ति:</target>
-<source>Error Code %x</source>
-<target>त्रुटि कोड %x</target>
-
<source>The server does not support authentication via %x.</source>
<target>सर्वर पर %x द्वारा प्रमाणन समर्थित नहीं है।</target>
-<source>Required:</source>
-<target>आवश्यक:</target>
-
<source>Unable to access %x.</source>
<target>%x तक पहुँचने में असमर्थ।</target>
@@ -408,123 +636,9 @@ Actual: %y bytes
<source>%x GB</source>
<target>%x GB</target>
-<source>Cannot load file %x.</source>
-<target>फ़ाइल %x लोड करने में असमर्थ।</target>
-
-<source>Database file %x is incompatible.</source>
-<target>डेटाबेस फ़ाइल %x विसंगत है।</target>
-
-<source>Initial synchronization:</source>
-<target>प्रारंभिक सिंक्रनाइज़ेशन:</target>
-
-<source>Database file %x does not yet exist.</source>
-<target>डेटाबेस फ़ाइल %x अभी तक मौजूद नहीं है।</target>
-
-<source>Database file is corrupted:</source>
-<target>डेटाबेस फ़ाइल दूषित है:</target>
-
-<source>The database files do not yet contain information about the last synchronization.</source>
-<target>डेटाबेस फ़ाइल्स में अभी तक पिछले सिंक्रनाइज़ेशन की जानकारी नहीं है।</target>
-
-<source>Loading file %x...</source>
-<target>फ़ाइल %x को लोड किया जा रहा है...</target>
-
-<source>Saving file %x...</source>
-<target>फ़ाइल %x सहेजी जा रही है...</target>
-
-<source>Searching for folder %x...</source>
-<target>निर्देशिका %x की खोज हो रही है...</target>
-
-<source>Timeout while searching for folder %x.</source>
-<target>निर्देशिका %x की खोज करते हुए काल समाप्त हआ।</target>
-
-<source>Cannot get process information.</source>
-<target>प्रक्रिया जानकारी प्राप्त करने में असमर्थ।</target>
-
-<source>Waiting while directory is locked:</source>
-<target>प्रतीक्षारत जब कि निर्देशिका अवरोधित है:</target>
-
-<source>Lock owner:</source>
-<target>स्वामी अवरोध करें:</target>
-
-<source>Detecting abandoned lock...</source>
-<target>अपसर्जित अवरोध पता लगाया जा रहा है...</target>
-
-<source>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</source>
-<target>
-<pluralform>1 सेकंड</pluralform>
-<pluralform>%x सेकंड्स</pluralform>
-</target>
-
-<source>Items processed:</source>
-<target>संसाधित आइटम्स:</target>
-
-<source>Items remaining:</source>
-<target>शेष आइटम्स:</target>
-
-<source>Total time:</source>
-<target>कुल समय:</target>
-
-<source>Cleaning up old log files...</source>
-<target>पुराने लॉग फ़ाइल्स की सफाई हो रही है...</target>
-
-<source>Error parsing file %x, row %y, column %z.</source>
-<target>फ़ाइल %x, पंक्ति %y, स्तंभ %z पदच्छेदन में त्रुटि।</target>
-
-<source>Cannot set directory locks for the following folders:</source>
-<target>निम्न निर्देशिकाओं के लिए निर्देशिका अवरोध सेट नहीं कर सकते:</target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-<pluralform>1 थ्रेड</pluralform>
-<pluralform>%x थ्रेड्स</pluralform>
-</target>
-
-<source>Scanning:</source>
-<target>स्कैनिंग:</target>
-
-<source>/sec</source>
-<target>/सेकंड</target>
-
-<source>%x items/sec</source>
-<target>%x आइटम्स/सेकंड</target>
-
-<source>Show in Explorer</source>
-<target>एक्सप्लोरर में दिखाएं</target>
-
-<source>Open with default application</source>
-<target>डिफ़ॉल्ट अ‍ॅप्लिकेशन के साथ खोलें</target>
-
-<source>Browse directory</source>
-<target>निर्देशिका ब्राउज़ करें</target>
-
-<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>वॉल्यूम शॅडो प्रतिलिपि सर्व्हिस पहुँच प्राप्त नहीं है।</target>
-
-<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>इस सिस्टम में शॅडो प्रतिलिपियाँ बनाने के लिए कृपया FreeFileSync का 64-बिट संस्करण चलाएँ।</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>%x के लिए वॉल्यूम नाम निर्धारण नहीं किया जा सकता।</target>
-
-<source>Volume name %x is not part of file path %y.</source>
-<target>%x वॉल्यूम नाम %y फ़ाइल पथ का हिस्सा नहीं है।</target>
-
-<source>Unable to create time stamp for versioning:</source>
-<target>संस्करण के लिए समय मोहर बनाने में असमर्थ:</target>
-
<source>Drag && drop</source>
<target>ड्रॅग एण्ड ड्रॉप</target>
-<source>Cannot find folder %x.</source>
-<target>निर्देशिका %x नहीं मिला।</target>
-
<source>Select a folder</source>
<target>निर्देशिका चुनें</target>
@@ -620,8 +734,8 @@ The command is triggered if:
<source>Directory monitoring active</source>
<target>निर्देशिका निगरानी सक्रिय</target>
-<source>Waiting until all directories are available...</source>
-<target>सब निर्देशिकाएँ उपलब्ध होने की प्रतिक्षा में...</target>
+<source>Waiting until directory is available:</source>
+<target>प्रतीक्षारत जब कि निर्देशिका उपलब्ध हो:</target>
<source>&Restore</source>
<target>पुनर्स्थापित करें (&R)</target>
@@ -635,114 +749,6 @@ The command is triggered if:
<source>&Retry</source>
<target>पुनः प्रयास (&R)</target>
-<source>File time and size</source>
-<target>फ़ाइल समय और आकार</target>
-
-<source>File content</source>
-<target>फ़ाइल सामग्री</target>
-
-<source>File size</source>
-<target>फ़ाइल आकार</target>
-
-<source>Two way</source>
-<target>दुतरफा</target>
-
-<source>Mirror</source>
-<target>प्रतिबिंबित करें</target>
-
-<source>Update</source>
-<target>अद्यतन करें</target>
-
-<source>Custom</source>
-<target>अनुकूल</target>
-
-<source>Multiple...</source>
-<target>एकाधिक...</target>
-
-<source>Cannot write file attributes of %x.</source>
-<target>%x के फ़ाइल गुण लिख नहीं सकते।</target>
-
-<source>%x and %y have different content.</source>
-<target>%x और %y की सामग्री भिन्न है।</target>
-
-<source>Data verification error:</source>
-<target>डेटा सत्यापन त्रुटि:</target>
-
-<source>Moving file %x to %y</source>
-<target>फ़ाइल %x को %y यहाँ ले जाया जा रहा है</target>
-
-<source>Moving folder %x to %y</source>
-<target>निर्देशिका %x को %y यहाँ ले जाया जा रहा है</target>
-
-<source>Moving symbolic link %x to %y</source>
-<target>प्रतीकात्मक कड़ी %x को %y यहाँ ले जाया जा रहा है</target>
-
-<source>Removing old versions...</source>
-<target>पुराने संस्करणों को हटाया जा रहा है...</target>
-
-<source>Updating file %x</source>
-<target>फ़ाइल %x अद्यतित हो रही है</target>
-
-<source>Updating symbolic link %x</source>
-<target>प्रतीकात्मक कड़ी %x अद्यतित हो रही है</target>
-
-<source>Verifying file %x</source>
-<target>फ़ाइल %x सत्यापित हो रही है</target>
-
-<source>Updating attributes of %x</source>
-<target>%x के गुण अद्यतित हो रहे हैं</target>
-
-<source>Source item %x not found</source>
-<target>स्रोत आइटम %x नहीं मिला</target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>%x के लिए वॉल्यूम शॅडो प्रतिलिपि बनाई जा रही है...</target>
-
-<source>Target folder %x already existing.</source>
-<target>गंतव्य निर्देशिका %x पहले से ही विद्यमान।</target>
-
-<source>Target folder input field must not be empty.</source>
-<target>गंतव्य निर्देशिका प्रविष्टि खाली नहीं हो सकती।</target>
-
-<source>Source folder %x not found.</source>
-<target>स्रोत निर्देशिका %x नहीं मिला।</target>
-
-<source>Please enter a target folder for versioning.</source>
-<target>कृपया संस्करण करने के लिए गंतव्य निर्देशिका प्रविष्ट करें।</target>
-
-<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>निम्न आइटम्स में हल नहीं किये गए विरोध हैं और वे सिंक्रनाइज़ नहीं होंगे:</target>
-
-<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>निम्न निर्देशिकाएँ उल्लेखनीय रूप से भिन्न हैं। कृपया सुनिश्चित करें की सिंक्रनाइज़ेशन के लिए चुनी निर्देशिकाएँ उचित हैं।</target>
-
-<source>Not enough free disk space available in:</source>
-<target>यहाँ पर्याप्त खाली डिस्क जगह उपलब्ध नहीं:</target>
-
-<source>Available:</source>
-<target>उपलब्ध:</target>
-
-<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>कुछ फ़ाइल्स को एकाधिक आधार निर्देशिकाओं के भाग के रूप में सिंक्रनाइज़ किया जाएगा।</target>
-
-<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>विरोधों से बचने के लिए अपवर्जित फ़िल्टर्स सेट करें ताकि प्रत्येक अद्यतित फ़ाइल केवल एक ही आधार निर्देशिका से मानी जाएगी।</target>
-
-<source>Versioning folder:</source>
-<target>संस्करण निर्देशिका:</target>
-
-<source>Base folder:</source>
-<target>आधार निर्देशिका:</target>
-
-<source>The versioning folder is contained in a base folder.</source>
-<target>संस्करण निर्देशिका आधार निर्देशिका में निहित है।</target>
-
-<source>Synchronizing folder pair:</source>
-<target>यह निर्देशिका जोडा सिंक्रनाइज़ हो रहा है:</target>
-
-<source>Generating database...</source>
-<target>डेटाबेस बनाया जा रहा है...</target>
-
<source>Loading...</source>
<target>लोड हो रहा है...</target>
@@ -888,7 +894,7 @@ The command is triggered if:
<target>स्थानीय फ़ाइल सिस्टम, नेटवर्क या MTP डिव्हाइस पर कोई निर्देशिका चुनें।</target>
<source>Defined by context of use</source>
-<target></target>
+<target>उपयोग के संदर्भ से परिभाषित</target>
<source>Requires FreeFileSync Donation Edition</source>
<target>FreeFileSync दान संस्‍करण आवश्यक</target>
@@ -1061,8 +1067,8 @@ The command is triggered if:
<source>Show examples</source>
<target>उदाहरण दिखाएं</target>
-<source>Time span:</source>
-<target>समय अवधि:</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>सिंक्रनाइज़ेशन से कुछ फ़ाइल्स को वर्जित करने के लिए फ़िल्टर नियमों का चयन करें। फ़ाइल पथों को उनके तद्नुरूप निर्देशिका जोडों के सापेक्ष प्रविष्ट करें।</target>
<source>File size:</source>
<target>फ़ाइल आकार:</target>
@@ -1073,8 +1079,8 @@ The command is triggered if:
<source>Maximum:</source>
<target>अधिकतम:</target>
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target>सिंक्रनाइज़ेशन से कुछ फ़ाइल्स को वर्जित करने के लिए फ़िल्टर नियमों का चयन करें। फ़ाइल पथों को उनके तद्नुरूप निर्देशिका जोडों के सापेक्ष प्रविष्ट करें।</target>
+<source>Time span:</source>
+<target>समय अवधि:</target>
<source>C&lear</source>
<target>हटाएं (&l)</target>
@@ -1105,9 +1111,18 @@ The command is triggered if:
<source>&Versioning</source>
<target>संस्करण (&V)</target>
+<source>Move files to a user-defined folder</source>
+<target>फ़ाइल्स उपयोगकर्ता-परिभाषित निर्देशिका में ले जाएं</target>
+
<source>Naming convention:</source>
<target>नामकरण नीति:</target>
+<source>Limit file versions:</source>
+<target>फ़ाइल संस्करण सीमित करें:</target>
+
+<source>Last x days:</source>
+<target>पिछले x दिन:</target>
+
<source>Ignore errors</source>
<target>त्रुटियों को अनदेखा करें</target>
@@ -1249,11 +1264,8 @@ The command is triggered if:
<source>Save log:</source>
<target>लॉग सहेजें:</target>
-<source>Limit:</source>
-<target>सीमा:</target>
-
-<source>Limit maximum number of log files</source>
-<target>लॉग फ़ाइल्स की अधिकतम संख्या सीमित करें</target>
+<source>Limit number of log files:</source>
+<target>लॉग फ़ाइलों की संख्या सीमित करें:</target>
<source>How can I schedule a batch job?</source>
<target>मैं कोई बॅच कार्य कैसे अनुसूचित करूँ?</target>
@@ -1288,9 +1300,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Transfer file and folder permissions.</source>
<target>फ़ाइल और निर्देशिका अनुमतियाँ स्थानांतर करें।</target>
-<source>Show hidden dialogs again</source>
-<target>छिपाये संवाद बक्से फिर से देखाएं</target>
-
<source>Show all permanently hidden dialogs and warning messages again</source>
<target>स्थायी रूप से छिपाये संवाद बॉक्सेस और चेतावनी संदेश फिर से दिखाएं</target>
@@ -1381,9 +1390,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Select Time Span</source>
<target>समय अवधि चुनें</target>
-<source>FreeFileSync Donation Edition</source>
-<target>FreeFileSync दान संस्‍करण</target>
-
<source>Highlight Configurations</source>
<target>कॉन्फ़िगरेशन्स हाइलाइट करें</target>
@@ -1507,6 +1513,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Select time span...</source>
<target>समय अवधि चुनें...</target>
+<source>Donation Edition</source>
+<target>दान संस्करण</target>
+
<source>Folder Comparison and Synchronization</source>
<target>निर्देशिका तुलना और सिंक्रनाइज़ेशन</target>
@@ -1705,6 +1714,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Parameters for opposite side</source>
<target>दूसरी तरफ़ के पैरामीटर्स</target>
+<source>Show hidden dialogs again</source>
+<target>छिपाये संवाद बक्से फिर से देखाएं</target>
+
+<source>All dialogs shown</source>
+<target>सभी संवाद बक्से प्रदर्शित</target>
+
<source>Downloading update...</source>
<target>अद्यतन डाउनलोड हो रहा है...</target>
@@ -1744,9 +1759,6 @@ This guarantees a consistent state even in case of a serious error.
<source>This year</source>
<target>इस साल</target>
-<source>Last x days</source>
-<target>अंतिम x दिन</target>
-
<source>Byte</source>
<target>बाइट</target>
@@ -1762,9 +1774,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Delete and overwrite files permanently</source>
<target>फ़ाइल्स को स्थाई रूप से हटाया और आधिलेखित करें</target>
-<source>Move files to a user-defined folder</source>
-<target>फ़ाइल्स उपयोगकर्ता-परिभाषित निर्देशिका में ले जाएं</target>
-
<source>Replace</source>
<target>बदलें</target>
@@ -1774,6 +1783,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Time stamp</source>
<target>समय मोहर</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>फ़ाइलों को कोई समय-मुद्रित सबफ़ोल्डर में ले जाएं</target>
+
+<source>File</source>
+<target>फ़ाइल</target>
+
<source>Append a time stamp to each file name</source>
<target>प्रत्येक फ़ाइल नाम को समय मोहर जोडें</target>
@@ -1795,12 +1810,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Leave as unresolved conflict</source>
<target>हल नहीं किये गए विरोध के रूप में छोड़ दें</target>
-<source>File</source>
-<target>फ़ाइल</target>
-
<source>YYYY-MM-DD hhmmss</source>
<target>YYYY-MM-DD hhmmss</target>
+<source>Minimum version count must be smaller than maximum count.</source>
+<target>न्यूनतम संस्करण गणना अधिकतम गणना से छोटी होनी चाहिए।</target>
+
<source>Files</source>
<target>फ़ाइल्स</target>
@@ -1948,8 +1963,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Portable</source>
<target>पोर्टेबल</target>
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>सेटिंग्ज़ "%APPDATA%\FreeFileSync" यहाँ सहेजें</target>
+<source>Save settings in %x</source>
+<target>सेटिंग्ज़ को %x में सहेजें</target>
<source>Register FreeFileSync file extensions</source>
<target>FreeFileSync फ़ाइल ऐक्सटेंशंस पंजिकृत करें</target>
diff --git a/FreeFileSync/Build/Languages/hungarian.lng b/FreeFileSync/Build/Languages/hungarian.lng
index 7ba7daa5..acc1a85a 100755
--- a/FreeFileSync/Build/Languages/hungarian.lng
+++ b/FreeFileSync/Build/Languages/hungarian.lng
@@ -115,11 +115,20 @@
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
<target>A telepítő állományok sérültek. Installálja újra a FreeFileSync-et.</target>
+<source>Cannot load file %x.</source>
+<target>%x állomány betöltése nem sikerült.</target>
+
<source>Cannot find the following folders:</source>
<target>A következő könyvtárak nem találhatóak:</target>
-<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>Ha ezt a hibát figyelmen kívül hagyja, a könytárakat üresnek tekinti a program. A hiányzó könyvtárakat automatikusan létrehozza, amikor szükséges.</target>
+<source>The following folders do not yet exist:</source>
+<target>A következő könyvtárak jelenleg nem léteznek:</target>
+
+<source>The folders are created automatically when needed.</source>
+<target>A könyvárakat automatikusan létrehozza, amikor az szükséges.</target>
+
+<source>Scanning:</source>
+<target>Vizsgálat:</target>
<source>Comparison finished:</source>
<target>Az összehasonlítás befejeződött:</target>
@@ -214,6 +223,63 @@
<source>Out of memory.</source>
<target>Memória túlcsordulás.</target>
+<source>Database file %x is incompatible.</source>
+<target>%x adatbázis-állomány nem kompatibilis.</target>
+
+<source>Initial synchronization:</source>
+<target>Kezdeti szinkronizálás:</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>%x adatbázis-állomány még nem létezik.</target>
+
+<source>Database file is corrupted:</source>
+<target>A következő adatbázis állomány sérült:</target>
+
+<source>Cannot write file %x.</source>
+<target>%x állomány írása sikertelen.</target>
+
+<source>Cannot read file %x.</source>
+<target>%x állomány nem olvasható.</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>Az adatbázis állományok nem tartalmaznak információt a legutóbbi szinkronizálásról.</target>
+
+<source>Loading file %x...</source>
+<target>%x állomány betöltése...</target>
+
+<source>Saving file %x...</source>
+<target>%x állomány mentése...</target>
+
+<source>Searching for folder %x...</source>
+<target>%x könyvtár keresése...</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>Időtúllépés a %x könyvtár keresése folyamán.</target>
+
+<source>Cannot get process information.</source>
+<target>Nem sikerült lekérdezni a processz-információkat.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>%x állomány attribútumai nem olvashatók.</target>
+
+<source>Waiting while directory is locked:</source>
+<target>Várakozás amíg a könyvtár zárolt:</target>
+
+<source>Lock owner:</source>
+<target>Zárolás gazdája:</target>
+
+<source>Detecting abandoned lock...</source>
+<target>Elhagyott zárolást érzékel...</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 mp</pluralform>
+<pluralform>%x mp</pluralform>
+</target>
+
<source>Item exists on left side only</source>
<target>Az elem csak a bal oldalon létezik</target>
@@ -268,8 +334,188 @@
<source>Update attributes on right</source>
<target>Attribútumok frissítése a jobb oldalon</target>
-<source>Cannot read file %x.</source>
-<target>%x állomány nem olvasható.</target>
+<source>Items processed:</source>
+<target>Feldolgozott elemek száma:</target>
+
+<source>Items remaining:</source>
+<target>Hátralévő elemek száma:</target>
+
+<source>Total time:</source>
+<target>Összes időszükséglet:</target>
+
+<source>Cleaning up log files:</source>
+<target>A log állományok törlése:</target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>Hiba történt a feldolgozás közben: %x állomány, %y sor, %z oszlop.</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>Nem lehet beállítani a könyvtárak lockolását a következő könyvtárakhoz:</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>1 szál</pluralform>
+<pluralform>%x szál</pluralform>
+</target>
+
+<source>Cannot read directory %x.</source>
+<target>%x könyvtár nem olvasható.</target>
+
+<source>/sec</source>
+<target>/mp</target>
+
+<source>%x items/sec</source>
+<target>%x elem/mp</target>
+
+<source>Show in Explorer</source>
+<target>Mutassa az Intézőben</target>
+
+<source>Open with default application</source>
+<target>Nyissa meg az alapértelmezett alkalmazással</target>
+
+<source>Browse directory</source>
+<target>Tallózza a könyvtárat</target>
+
+<source>Unable to connect to %x.</source>
+<target>Nem képes %x-hez kapcsolódni.</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>Nem elérhető a Kötet Árnyék-másolat szolgáltatás.</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>Árnyék másolatok készítéséhez ezen a rendszeren futtassa a FreeFileSync 64 bites verzióját.</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>%x számára nem lehet a kötet-nevet meghatározni.</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>%x kötet-név nem része a(z) %y állomány elérési útvonalának.</target>
+
+<source>File time and size</source>
+<target>Állomány dátuma és mérete</target>
+
+<source>File content</source>
+<target>Állomány tartalma</target>
+
+<source>File size</source>
+<target>Állomány mérete</target>
+
+<source>Two way</source>
+<target>Kétirányú</target>
+
+<source>Mirror</source>
+<target>Tükröz</target>
+
+<source>Update</source>
+<target>Frissít</target>
+
+<source>Custom</source>
+<target>Egyedi</target>
+
+<source>Multiple...</source>
+<target>Sokszoroz...</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>%x állomány attribútumainak írása nem sikerült.</target>
+
+<source>Cannot open file %x.</source>
+<target>%x állomány nem nyitható meg.</target>
+
+<source>%x and %y have different content.</source>
+<target>%x és %y tartalma különböző.</target>
+
+<source>Data verification error:</source>
+<target>Adat ellenőrzési hiba:</target>
+
+<source>Moving file %x to %y</source>
+<target>%x állomány mozgatása ide: %y</target>
+
+<source>Moving folder %x to %y</source>
+<target>%x könyvtár mozgatása ide: %y</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>%x szimbolikus hivatkozás mozgatása ide: %y</target>
+
+<source>Updating file %x</source>
+<target>%x állomány frissítése</target>
+
+<source>Updating symbolic link %x</source>
+<target>%x szimbolikus hivatkozás frissítése</target>
+
+<source>Verifying file %x</source>
+<target>%x állomány ellenőrzése</target>
+
+<source>Updating attributes of %x</source>
+<target>%x attribútumainak frissítése</target>
+
+<source>Source item %x not found</source>
+<target>%x forrás állományt nem találom</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>%x számára árnyékmásolat-kötetet készítése...</target>
+
+<source>Searching for excess file versions:</source>
+<target>A felesleges fájl-verziók keresése:</target>
+
+<source>Removing excess file versions:</source>
+<target>A felesleges fájl-verziók törlése:</target>
+
+<source>Cannot find folder %x.</source>
+<target>%x könyvtárat nem találom.</target>
+
+<source>Target folder %x already existing.</source>
+<target>%x célkönyvtár már létezik.</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>A célkönyvtár beviteli mezője nem lehet üres.</target>
+
+<source>Source folder %x not found.</source>
+<target>%x forráskönyvtár nem található.</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>Adja meg a célkönyvtárat a verziókövetéshez.</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>A következő tételek feloldatlan ütközést tartalmaznak, így nem lesznek szinkronizálva:</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>Az érintett könyvtárak lényegileg különböznek. Kérem ellenőrizze, a megfelelő könyvtárakat választotta-e ki szinkronizálásra.</target>
+
+<source>Not enough free disk space available in:</source>
+<target>Nincs elég szabad lemezterület:</target>
+
+<source>Required:</source>
+<target>Szükséges:</target>
+
+<source>Available:</source>
+<target>Hozzáférhető:</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>Egyes állományokat több alapkönyvár részeként is szinkronizálni fog.</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>Az ütközések elkerülése érdekében állítsa be úgy a kizáró szűrőket, hogy minden egyes felülírt állomány csak egy alapkönyvárban szerepeljen.</target>
+
+<source>Versioning folder:</source>
+<target>Verzióképző könyvtár:</target>
+
+<source>Base folder:</source>
+<target>Alapkönyvtár:</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>A verzióképző könyvtárat az alapkönyvtár tartalmazza.</target>
+
+<source>Synchronizing folder pair:</source>
+<target>A szinkronizálódó könyvtár-pár:</target>
+
+<source>Generating database...</source>
+<target>Adatbázis generálása...</target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>Nem képes időbélyegzés létrehozására a verzióképzéshez:</target>
<source>
Unexpected size of data stream.
@@ -288,17 +534,14 @@ Tényleges: %y bájt
<source>Operation not supported for different base folder types.</source>
<target>A művelet nem támogatott különböző alapkönyvtártípusok esetén.</target>
-<source>Cannot write file %x.</source>
-<target>%x állomány írása sikertelen.</target>
-
<source>Cannot move file %x to %y.</source>
<target>%x állomány nem mozgatható %y-ba.</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>%x szimbolikus hivatkozás nem másolható %y-ba.</target>
-<source>Unable to connect to %x.</source>
-<target>Nem képes %x-hez kapcsolódni.</target>
+<source>Error Code %x</source>
+<target>Hibakód %x</target>
<source>Failed to get information about server %x.</source>
<target>%x szerverről nem sikerült információt kapni.</target>
@@ -306,12 +549,6 @@ Tényleges: %y bájt
<source>Cannot open directory %x.</source>
<target>%x könyvtár nem nyitható meg.</target>
-<source>Cannot read directory %x.</source>
-<target>%x könyvtár nem olvasható.</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>%x állomány attribútumai nem olvashatók.</target>
-
<source>Cannot create directory %x.</source>
<target>%x könyvtár nem hozható létre.</target>
@@ -339,9 +576,6 @@ Tényleges: %y bájt
<source>Cannot find device %x.</source>
<target>%x eszköz nem található.</target>
-<source>Cannot open file %x.</source>
-<target>%x állomány nem nyitható meg.</target>
-
<source>Type of item %x is not supported:</source>
<target>%x elem típusa nem támogatott:</target>
@@ -354,15 +588,9 @@ Tényleges: %y bájt
<source>Incorrect command line:</source>
<target>Hibás parancssor:</target>
-<source>Error Code %x</source>
-<target>Hibakód %x</target>
-
<source>The server does not support authentication via %x.</source>
<target>A szerver nem támogatja a %x általi autentikációt.</target>
-<source>Required:</source>
-<target>Szükséges:</target>
-
<source>Unable to access %x.</source>
<target>%x nem elérhető.</target>
@@ -408,123 +636,9 @@ Tényleges: %y bájt
<source>%x GB</source>
<target>%x GB</target>
-<source>Cannot load file %x.</source>
-<target>%x állomány betöltése nem sikerült.</target>
-
-<source>Database file %x is incompatible.</source>
-<target>%x adatbázis-állomány nem kompatibilis.</target>
-
-<source>Initial synchronization:</source>
-<target>Kezdeti szinkronizálás:</target>
-
-<source>Database file %x does not yet exist.</source>
-<target>%x adatbázis-állomány még nem létezik.</target>
-
-<source>Database file is corrupted:</source>
-<target>A következő adatbázis állomány sérült:</target>
-
-<source>The database files do not yet contain information about the last synchronization.</source>
-<target>Az adatbázis állományok nem tartalmaznak információt a legutóbbi szinkronizálásról.</target>
-
-<source>Loading file %x...</source>
-<target>%x állomány betöltése...</target>
-
-<source>Saving file %x...</source>
-<target>%x állomány mentése...</target>
-
-<source>Searching for folder %x...</source>
-<target>%x könyvtár keresése...</target>
-
-<source>Timeout while searching for folder %x.</source>
-<target>Időtúllépés a %x könyvtár keresése folyamán.</target>
-
-<source>Cannot get process information.</source>
-<target>Nem sikerült lekérdezni a processz-információkat.</target>
-
-<source>Waiting while directory is locked:</source>
-<target>Várakozás amíg a könyvtár zárolt:</target>
-
-<source>Lock owner:</source>
-<target>Zárolás gazdája:</target>
-
-<source>Detecting abandoned lock...</source>
-<target>Elhagyott zárolást érzékel...</target>
-
-<source>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</source>
-<target>
-<pluralform>1 mp</pluralform>
-<pluralform>%x mp</pluralform>
-</target>
-
-<source>Items processed:</source>
-<target>Feldolgozott elemek száma:</target>
-
-<source>Items remaining:</source>
-<target>Hátralévő elemek száma:</target>
-
-<source>Total time:</source>
-<target>Összes időszükséglet:</target>
-
-<source>Cleaning up old log files...</source>
-<target>Régi log állományok törlése...</target>
-
-<source>Error parsing file %x, row %y, column %z.</source>
-<target>Hiba történt a feldolgozás közben: %x állomány, %y sor, %z oszlop.</target>
-
-<source>Cannot set directory locks for the following folders:</source>
-<target>Nem lehet beállítani a könyvtárak lockolását a következő könyvtárakhoz:</target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-<pluralform>1 szál</pluralform>
-<pluralform>%x szál</pluralform>
-</target>
-
-<source>Scanning:</source>
-<target>Vizsgálat:</target>
-
-<source>/sec</source>
-<target>/mp</target>
-
-<source>%x items/sec</source>
-<target>%x elem/mp</target>
-
-<source>Show in Explorer</source>
-<target>Mutassa az Intézőben</target>
-
-<source>Open with default application</source>
-<target>Nyissa meg az alapértelmezett alkalmazással</target>
-
-<source>Browse directory</source>
-<target>Tallózza a könyvtárat</target>
-
-<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>Nem elérhető a Kötet Árnyék-másolat szolgáltatás.</target>
-
-<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>Árnyék másolatok készítéséhez ezen a rendszeren futtassa a FreeFileSync 64 bites verzióját.</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>%x számára nem lehet a kötet-nevet meghatározni.</target>
-
-<source>Volume name %x is not part of file path %y.</source>
-<target>%x kötet-név nem része a(z) %y állomány elérési útvonalának.</target>
-
-<source>Unable to create time stamp for versioning:</source>
-<target>Nem képes időbélyegzés létrehozására a verzióképzéshez:</target>
-
<source>Drag && drop</source>
<target>Húzd && Ejtsd</target>
-<source>Cannot find folder %x.</source>
-<target>%x könyvtárat nem találom.</target>
-
<source>Select a folder</source>
<target>Könyvtárat kiválaszt</target>
@@ -620,8 +734,8 @@ A parancs végrehajtódik, ha:
<source>Directory monitoring active</source>
<target>A könyvtár figyelés aktív</target>
-<source>Waiting until all directories are available...</source>
-<target>Várakozik, amíg az összes könyvtár elérhetővé válik...</target>
+<source>Waiting until directory is available:</source>
+<target>Várakozás, amíg a könyvtár elérhető lesz:</target>
<source>&Restore</source>
<target>&Visszaállít</target>
@@ -635,114 +749,6 @@ A parancs végrehajtódik, ha:
<source>&Retry</source>
<target>&Ismét</target>
-<source>File time and size</source>
-<target>Állomány dátuma és mérete</target>
-
-<source>File content</source>
-<target>Állomány tartalma</target>
-
-<source>File size</source>
-<target>Állomány mérete</target>
-
-<source>Two way</source>
-<target>Kétirányú</target>
-
-<source>Mirror</source>
-<target>Tükröz</target>
-
-<source>Update</source>
-<target>Frissít</target>
-
-<source>Custom</source>
-<target>Egyedi</target>
-
-<source>Multiple...</source>
-<target>Sokszoroz...</target>
-
-<source>Cannot write file attributes of %x.</source>
-<target>%x állomány attribútumainak írása nem sikerült.</target>
-
-<source>%x and %y have different content.</source>
-<target>%x és %y tartalma különböző.</target>
-
-<source>Data verification error:</source>
-<target>Adat ellenőrzési hiba:</target>
-
-<source>Moving file %x to %y</source>
-<target>%x állomány mozgatása ide: %y</target>
-
-<source>Moving folder %x to %y</source>
-<target>%x könyvtár mozgatása ide: %y</target>
-
-<source>Moving symbolic link %x to %y</source>
-<target>%x szimbolikus hivatkozás mozgatása ide: %y</target>
-
-<source>Removing old versions...</source>
-<target>Régi verziók eltávolítása...</target>
-
-<source>Updating file %x</source>
-<target>%x állomány frissítése</target>
-
-<source>Updating symbolic link %x</source>
-<target>%x szimbolikus hivatkozás frissítése</target>
-
-<source>Verifying file %x</source>
-<target>%x állomány ellenőrzése</target>
-
-<source>Updating attributes of %x</source>
-<target>%x attribútumainak frissítése</target>
-
-<source>Source item %x not found</source>
-<target>%x forrás állományt nem találom</target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>%x számára árnyékmásolat-kötetet készítése...</target>
-
-<source>Target folder %x already existing.</source>
-<target>%x célkönyvtár már létezik.</target>
-
-<source>Target folder input field must not be empty.</source>
-<target>A célkönyvtár beviteli mezője nem lehet üres.</target>
-
-<source>Source folder %x not found.</source>
-<target>%x forráskönyvtár nem található.</target>
-
-<source>Please enter a target folder for versioning.</source>
-<target>Adja meg a célkönyvtárat a verziókövetéshez.</target>
-
-<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>A következő tételek feloldatlan ütközést tartalmaznak, így nem lesznek szinkronizálva:</target>
-
-<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>Az érintett könyvtárak lényegileg különböznek. Kérem ellenőrizze, a megfelelő könyvtárakat választotta-e ki szinkronizálásra.</target>
-
-<source>Not enough free disk space available in:</source>
-<target>Nincs elég szabad lemezterület:</target>
-
-<source>Available:</source>
-<target>Hozzáférhető:</target>
-
-<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>Egyes állományokat több alapkönyvár részeként is szinkronizálni fog.</target>
-
-<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>Az ütközések elkerülése érdekében állítsa be úgy a kizáró szűrőket, hogy minden egyes felülírt állomány csak egy alapkönyvárban szerepeljen.</target>
-
-<source>Versioning folder:</source>
-<target>Verzióképző könyvtár:</target>
-
-<source>Base folder:</source>
-<target>Alapkönyvtár:</target>
-
-<source>The versioning folder is contained in a base folder.</source>
-<target>A verzióképző könyvtárat az alapkönyvtár tartalmazza.</target>
-
-<source>Synchronizing folder pair:</source>
-<target>A szinkronizálódó könyvtár-pár:</target>
-
-<source>Generating database...</source>
-<target>Adatbázis generálása...</target>
-
<source>Loading...</source>
<target>Tölti...</target>
@@ -888,7 +894,7 @@ A parancs végrehajtódik, ha:
<target>Kérem válasszon egy könyvtárat a helyi fájlrendszerben, a hálózaton vagy egy MTP eszközön.</target>
<source>Defined by context of use</source>
-<target></target>
+<target>A használati környezet által meghatározott</target>
<source>Requires FreeFileSync Donation Edition</source>
<target>A FreeFileSync támogatói kiadása szükséges</target>
@@ -1061,8 +1067,8 @@ A parancs végrehajtódik, ha:
<source>Show examples</source>
<target>Mutasson példákat</target>
-<source>Time span:</source>
-<target>Idősáv (időtartam):</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>Meghatározott állományok szinkronizálásból történő kizárásához válasszon szűrőt. Az útvonalakat a megfelelő könyvtár-párjaikhoz viszonyítva adja meg.</target>
<source>File size:</source>
<target>Állomány mérete:</target>
@@ -1073,8 +1079,8 @@ A parancs végrehajtódik, ha:
<source>Maximum:</source>
<target>Maximum:</target>
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target>Meghatározott állományok szinkronizálásból történő kizárásához válasszon szűrőt. Az útvonalakat a megfelelő könyvtár-párjaikhoz viszonyítva adja meg.</target>
+<source>Time span:</source>
+<target>Idősáv (időtartam):</target>
<source>C&lear</source>
<target>&Töröl</target>
@@ -1105,9 +1111,18 @@ A parancs végrehajtódik, ha:
<source>&Versioning</source>
<target>&Verziókezelés</target>
+<source>Move files to a user-defined folder</source>
+<target>Mozgassa az állományokat egy a felhasználó által meghatározott könyvtárba</target>
+
<source>Naming convention:</source>
<target>Elnevezési megállapodás:</target>
+<source>Limit file versions:</source>
+<target>Korlátozza az állomány-verziók számát:</target>
+
+<source>Last x days:</source>
+<target>legutóbbi x nap:</target>
+
<source>Ignore errors</source>
<target>Hagyja figyelmen kívül a hibákat</target>
@@ -1249,11 +1264,8 @@ A parancs végrehajtódik, ha:
<source>Save log:</source>
<target>Mentse a következő naplóállományt:</target>
-<source>Limit:</source>
-<target>Határérték:</target>
-
-<source>Limit maximum number of log files</source>
-<target>Korlátozza a naplóállományok maximális számát</target>
+<source>Limit number of log files:</source>
+<target>A log állományok számának korlátja:</target>
<source>How can I schedule a batch job?</source>
<target>Hogyan tudok kötegelt feldolgozást ütemezni?</target>
@@ -1288,9 +1300,6 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Transfer file and folder permissions.</source>
<target>Vigye át az állomány- és könyvtár-jogosultságokat.</target>
-<source>Show hidden dialogs again</source>
-<target>Mutassa ismét a rejtett párbeszédablakokat?</target>
-
<source>Show all permanently hidden dialogs and warning messages again</source>
<target>Mutassa újra az összes ideiglenesen rejtett párbeszédablakot és figyelmeztetést</target>
@@ -1381,9 +1390,6 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Select Time Span</source>
<target>Válassza ki az idősávot (időtartamot)</target>
-<source>FreeFileSync Donation Edition</source>
-<target>FreeFileSync Támogatói kiadás</target>
-
<source>Highlight Configurations</source>
<target>Jelölje ki a beállításokat</target>
@@ -1507,6 +1513,9 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Select time span...</source>
<target>Időintervallum kiválasztása...</target>
+<source>Donation Edition</source>
+<target>Támogatói kiadás</target>
+
<source>Folder Comparison and Synchronization</source>
<target>Könyvtár összehasonlítás és szinkronizálás</target>
@@ -1705,6 +1714,12 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Parameters for opposite side</source>
<target>Paraméterek az ellenkező oldalhoz</target>
+<source>Show hidden dialogs again</source>
+<target>Mutassa ismét a rejtett párbeszédablakokat?</target>
+
+<source>All dialogs shown</source>
+<target>Az összes párbeszédablakot mutatja</target>
+
<source>Downloading update...</source>
<target>Frissítés letöltése...</target>
@@ -1744,9 +1759,6 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>This year</source>
<target>Ez évi</target>
-<source>Last x days</source>
-<target>Utolsó x nap</target>
-
<source>Byte</source>
<target>Bájt</target>
@@ -1762,9 +1774,6 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Delete and overwrite files permanently</source>
<target>Véglegesen törli és felülírja az állományokat</target>
-<source>Move files to a user-defined folder</source>
-<target>Mozgassa az állományokat egy a felhasználó által meghatározott könyvtárba</target>
-
<source>Replace</source>
<target>Felülír</target>
@@ -1774,6 +1783,12 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Time stamp</source>
<target>Időbélyeg</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>Mozgassa az állománokat egy időbélyeggel ellátott alkönyvtárba</target>
+
+<source>File</source>
+<target>Állomány</target>
+
<source>Append a time stamp to each file name</source>
<target>Minden állománynévhez adjon egy-egy időbélyeget</target>
@@ -1795,12 +1810,12 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Leave as unresolved conflict</source>
<target>Hagyja feloldatlan ütközésként</target>
-<source>File</source>
-<target>Állomány</target>
-
<source>YYYY-MM-DD hhmmss</source>
<target>ÉÉÉÉ-HH-NN óóppmm</target>
+<source>Minimum version count must be smaller than maximum count.</source>
+<target>A minimum verziószám kisebb kell legyen a maximális verziószámnál.</target>
+
<source>Files</source>
<target>Állományok</target>
@@ -1948,8 +1963,8 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Portable</source>
<target>Hordozható</target>
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>Beállítások mentése a "%APPDATA%\FreeFileSync" mappába</target>
+<source>Save settings in %x</source>
+<target>%x állománybs mentse a beállításokat</target>
<source>Register FreeFileSync file extensions</source>
<target>A FreeFileSync állomány-kiterjesztéseinek regisztrálása</target>
diff --git a/FreeFileSync/Build/Languages/italian.lng b/FreeFileSync/Build/Languages/italian.lng
index 0a50b5e6..446fefc4 100755
--- a/FreeFileSync/Build/Languages/italian.lng
+++ b/FreeFileSync/Build/Languages/italian.lng
@@ -115,11 +115,20 @@
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
<target>I file di installazione sono danneggiati. Si prega di reinstallare FreeFileSync.</target>
+<source>Cannot load file %x.</source>
+<target>Impossibile caricare il file %x.</target>
+
<source>Cannot find the following folders:</source>
<target>Impossibile trovare le seguenti cartelle:</target>
-<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>Se questo errore viene ignorato le cartelle saranno considerate vuote. Cartelle mancanti vengono create automaticamente quando necessario.</target>
+<source>The following folders do not yet exist:</source>
+<target>Le seguenti cartelle non esistono ancora:</target>
+
+<source>The folders are created automatically when needed.</source>
+<target>Le cartelle vengono create automaticamente quando necessario.</target>
+
+<source>Scanning:</source>
+<target>Scansione di:</target>
<source>Comparison finished:</source>
<target>Confronto terminato:</target>
@@ -214,6 +223,63 @@
<source>Out of memory.</source>
<target>Memoria insufficiente.</target>
+<source>Database file %x is incompatible.</source>
+<target>Il file del database %x non è compatibile.</target>
+
+<source>Initial synchronization:</source>
+<target>Prima sincronizzazione:</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>Il file del database %x non è ancora stato creato.</target>
+
+<source>Database file is corrupted:</source>
+<target>Il file del database è danneggiato:</target>
+
+<source>Cannot write file %x.</source>
+<target>Impossibile scrivere il file %x.</target>
+
+<source>Cannot read file %x.</source>
+<target>Impossibile leggere il file %x.</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>I file del database non contengono ancora informazioni sull'ultima sincronizzazione.</target>
+
+<source>Loading file %x...</source>
+<target>Caricamento file %x...</target>
+
+<source>Saving file %x...</source>
+<target>Salvare il file %x...</target>
+
+<source>Searching for folder %x...</source>
+<target>Ricerca della cartella %x...</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>Pausa durante la ricerca per la cartella %x.</target>
+
+<source>Cannot get process information.</source>
+<target>Impossibile ottenere informazioni sul processo.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Impossibile leggere gli attributi del file %x.</target>
+
+<source>Waiting while directory is locked:</source>
+<target>In attesa mentre la cartella è bloccata:</target>
+
+<source>Lock owner:</source>
+<target>Bloccare il proprietario:</target>
+
+<source>Detecting abandoned lock...</source>
+<target>Rilevamento blocco abbandonato ...</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</target>
+
<source>Item exists on left side only</source>
<target>L'oggetto esiste solo sul lato sinistro</target>
@@ -268,8 +334,188 @@
<source>Update attributes on right</source>
<target>Aggiorna attributi a destra</target>
-<source>Cannot read file %x.</source>
-<target>Impossibile leggere il file %x.</target>
+<source>Items processed:</source>
+<target>Oggetti processati:</target>
+
+<source>Items remaining:</source>
+<target>Oggetti rimanenti:</target>
+
+<source>Total time:</source>
+<target>Tempo totale:</target>
+
+<source>Cleaning up log files:</source>
+<target>Pulizia dei file di registro:</target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>Errore nel parsing del file %x, riga %y, colonna %z.</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>Impossibile impostare i blocchi di directory per le seguenti cartelle:</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>1 thread</pluralform>
+<pluralform>%x thread</pluralform>
+</target>
+
+<source>Cannot read directory %x.</source>
+<target>Impossibile leggere la directory %x.</target>
+
+<source>/sec</source>
+<target>/sec</target>
+
+<source>%x items/sec</source>
+<target>%x oggetti/sec</target>
+
+<source>Show in Explorer</source>
+<target>Mostra in Esplora Risorse</target>
+
+<source>Open with default application</source>
+<target>Apri con applicazione predefinita</target>
+
+<source>Browse directory</source>
+<target>Sfoglia cartelle</target>
+
+<source>Unable to connect to %x.</source>
+<target>Impossibile connettersi a %x.</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>Impossibile accedere al Volume Shadow Copy Service.</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>Si prega di eseguire la versione a 64 bit di FreeFileSync per creare copie shadow su questo sistema.</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>Impossibile determinare nome del volume per %x.</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>Nome volume %x non fa parte del percorso del file %y.</target>
+
+<source>File time and size</source>
+<target>Ora e dimensione file</target>
+
+<source>File content</source>
+<target>Contenuto del file</target>
+
+<source>File size</source>
+<target>Dimensione del file</target>
+
+<source>Two way</source>
+<target>Due vie</target>
+
+<source>Mirror</source>
+<target>Specchio</target>
+
+<source>Update</source>
+<target>Aggiorna</target>
+
+<source>Custom</source>
+<target>Personalizza</target>
+
+<source>Multiple...</source>
+<target>Multiplo...</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>Impossibile scrivere gli attributi del file %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Impossibile aprire il file %x.</target>
+
+<source>%x and %y have different content.</source>
+<target>%x e %y hanno un contenuto diverso.</target>
+
+<source>Data verification error:</source>
+<target>Errore di verifica dei dati:</target>
+
+<source>Moving file %x to %y</source>
+<target>Spostamento file %x in %y</target>
+
+<source>Moving folder %x to %y</source>
+<target>Spostamento cartella %x in %y</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>Spostamento collegamento %x in %y</target>
+
+<source>Updating file %x</source>
+<target>Aggiornamento file %x</target>
+
+<source>Updating symbolic link %x</source>
+<target>Aggiornamento collegamento %x</target>
+
+<source>Verifying file %x</source>
+<target>Verifica file %x</target>
+
+<source>Updating attributes of %x</source>
+<target>Aggiornamento attributi di %x</target>
+
+<source>Source item %x not found</source>
+<target>Elemento di origine %x non trovato</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>Creazione di un Volume Shadow Copy per %x...</target>
+
+<source>Cannot find folder %x.</source>
+<target>Impossibile trovare la cartella %x.</target>
+
+<source>Target folder %x already existing.</source>
+<target>La cartella di destinazione %x è già esistente.</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>Il campo per la cartella di destinazione non può essere vuoto.</target>
+
+<source>Source folder %x not found.</source>
+<target>Cartella sorgente %x non trovata.</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>Inserisci una cartella di destinazione per il controllo delle versioni.</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>I seguenti oggetti hanno conflitti irrisolti e non saranno sincronizzati:</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>Le seguenti cartelle sono significativamente differenti. Si prega di controllare che sono selezionate le cartelle corrette per la sincronizzazione.</target>
+
+<source>Not enough free disk space available in:</source>
+<target>Spazio libero su disco insufficiente in:</target>
+
+<source>Required:</source>
+<target>Richiesto:</target>
+
+<source>Available:</source>
+<target>Disponibile:</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>Alcuni file saranno sincronizzati come parte di più cartelle base.</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>Per evitare conflitti, il set up esclude i filtri in modo che ciascun file aggiornato è considerato da una sola cartella base.</target>
+
+<source>Versioning folder:</source>
+<target>Cartella versione:</target>
+
+<source>Base folder:</source>
+<target>Cartella base:</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>La cartella delle versioni è contenuta in una cartella di base.</target>
+
+<source>Synchronizing folder pair:</source>
+<target>Sincronizzazione della coppia di cartelle:</target>
+
+<source>Generating database...</source>
+<target>Generazione database...</target>
+
+<source>Searching for excess file versions:</source>
+<target>Ricerca delle versioni di file in eccesso:</target>
+
+<source>Removing excess file versions:</source>
+<target>Rimozione delle versioni di file in eccesso:</target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>Impossibile creare l'impronta per il controllo delle versioni:</target>
<source>
Unexpected size of data stream.
@@ -288,17 +534,14 @@ Attuale: %y byte
<source>Operation not supported for different base folder types.</source>
<target>Operazione non supportata per i diversi tipi di cartelle di base.</target>
-<source>Cannot write file %x.</source>
-<target>Impossibile scrivere il file %x.</target>
-
<source>Cannot move file %x to %y.</source>
<target>Impossibile spostare il file %x in %y.</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>Impossibile copiare collegamento %x per %y.</target>
-<source>Unable to connect to %x.</source>
-<target>Impossibile connettersi a %x.</target>
+<source>Error Code %x</source>
+<target>Codice di errore %x</target>
<source>Failed to get information about server %x.</source>
<target>Impossibile ottenere informazioni sul server %x.</target>
@@ -306,12 +549,6 @@ Attuale: %y byte
<source>Cannot open directory %x.</source>
<target>Impossibile aprire la cartella %x.</target>
-<source>Cannot read directory %x.</source>
-<target>Impossibile leggere la directory %x.</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>Impossibile leggere gli attributi del file %x.</target>
-
<source>Cannot create directory %x.</source>
<target>Impossibile creare la cartella %x.</target>
@@ -339,9 +576,6 @@ Attuale: %y byte
<source>Cannot find device %x.</source>
<target>Impossibile trovare dispositivo %x.</target>
-<source>Cannot open file %x.</source>
-<target>Impossibile aprire il file %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Il tipo di oggetto %x non è supportato:</target>
@@ -354,15 +588,9 @@ Attuale: %y byte
<source>Incorrect command line:</source>
<target>Linea di comando non corretta:</target>
-<source>Error Code %x</source>
-<target>Codice di errore %x</target>
-
<source>The server does not support authentication via %x.</source>
<target>Il server non supporta l'autenticazione tramite %x.</target>
-<source>Required:</source>
-<target>Richiesto:</target>
-
<source>Unable to access %x.</source>
<target>Impossibile accedere %x.</target>
@@ -408,123 +636,9 @@ Attuale: %y byte
<source>%x GB</source>
<target>%x GB</target>
-<source>Cannot load file %x.</source>
-<target>Impossibile caricare il file %x.</target>
-
-<source>Database file %x is incompatible.</source>
-<target>Il file del database %x non è compatibile.</target>
-
-<source>Initial synchronization:</source>
-<target>Prima sincronizzazione:</target>
-
-<source>Database file %x does not yet exist.</source>
-<target>Il file del database %x non è ancora stato creato.</target>
-
-<source>Database file is corrupted:</source>
-<target>Il file del database è danneggiato:</target>
-
-<source>The database files do not yet contain information about the last synchronization.</source>
-<target>I file del database non contengono ancora informazioni sull'ultima sincronizzazione.</target>
-
-<source>Loading file %x...</source>
-<target>Caricamento file %x...</target>
-
-<source>Saving file %x...</source>
-<target>Salvare il file %x...</target>
-
-<source>Searching for folder %x...</source>
-<target>Ricerca della cartella %x...</target>
-
-<source>Timeout while searching for folder %x.</source>
-<target>Pausa durante la ricerca per la cartella %x.</target>
-
-<source>Cannot get process information.</source>
-<target>Impossibile ottenere informazioni sul processo.</target>
-
-<source>Waiting while directory is locked:</source>
-<target>In attesa mentre la cartella è bloccata:</target>
-
-<source>Lock owner:</source>
-<target>Bloccare il proprietario:</target>
-
-<source>Detecting abandoned lock...</source>
-<target>Rilevamento blocco abbandonato ...</target>
-
-<source>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</source>
-<target>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</target>
-
-<source>Items processed:</source>
-<target>Oggetti processati:</target>
-
-<source>Items remaining:</source>
-<target>Oggetti rimanenti:</target>
-
-<source>Total time:</source>
-<target>Tempo totale:</target>
-
-<source>Cleaning up old log files...</source>
-<target>Pulizia vecchi file di log ...</target>
-
-<source>Error parsing file %x, row %y, column %z.</source>
-<target>Errore nel parsing del file %x, riga %y, colonna %z.</target>
-
-<source>Cannot set directory locks for the following folders:</source>
-<target>Impossibile impostare i blocchi di directory per le seguenti cartelle:</target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-<pluralform>1 thread</pluralform>
-<pluralform>%x thread</pluralform>
-</target>
-
-<source>Scanning:</source>
-<target>Scansione di:</target>
-
-<source>/sec</source>
-<target>/sec</target>
-
-<source>%x items/sec</source>
-<target>%x oggetti/sec</target>
-
-<source>Show in Explorer</source>
-<target>Mostra in Esplora Risorse</target>
-
-<source>Open with default application</source>
-<target>Apri con applicazione predefinita</target>
-
-<source>Browse directory</source>
-<target>Sfoglia cartelle</target>
-
-<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>Impossibile accedere al Volume Shadow Copy Service.</target>
-
-<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>Si prega di eseguire la versione a 64 bit di FreeFileSync per creare copie shadow su questo sistema.</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>Impossibile determinare nome del volume per %x.</target>
-
-<source>Volume name %x is not part of file path %y.</source>
-<target>Nome volume %x non fa parte del percorso del file %y.</target>
-
-<source>Unable to create time stamp for versioning:</source>
-<target>Impossibile creare l'impronta per il controllo delle versioni:</target>
-
<source>Drag && drop</source>
<target>Trascina e rilascia</target>
-<source>Cannot find folder %x.</source>
-<target>Impossibile trovare la cartella %x.</target>
-
<source>Select a folder</source>
<target>Seleziona una cartella</target>
@@ -620,8 +734,8 @@ Il comando è attivato se:
<source>Directory monitoring active</source>
<target>Monitoraggio Cartella attivo</target>
-<source>Waiting until all directories are available...</source>
-<target>Attendere finchè tutte le cartelle diventano disponibili...</target>
+<source>Waiting until directory is available:</source>
+<target>In attesa che la directory sia disponibile:</target>
<source>&Restore</source>
<target>&Ripristina</target>
@@ -635,114 +749,6 @@ Il comando è attivato se:
<source>&Retry</source>
<target>&Riprova</target>
-<source>File time and size</source>
-<target>Ora e dimensione file</target>
-
-<source>File content</source>
-<target>Contenuto del file</target>
-
-<source>File size</source>
-<target>Dimensione del file</target>
-
-<source>Two way</source>
-<target>Due vie</target>
-
-<source>Mirror</source>
-<target>Specchio</target>
-
-<source>Update</source>
-<target>Aggiorna</target>
-
-<source>Custom</source>
-<target>Personalizza</target>
-
-<source>Multiple...</source>
-<target>Multiplo...</target>
-
-<source>Cannot write file attributes of %x.</source>
-<target>Impossibile scrivere gli attributi del file %x.</target>
-
-<source>%x and %y have different content.</source>
-<target>%x e %y hanno un contenuto diverso.</target>
-
-<source>Data verification error:</source>
-<target>Errore di verifica dei dati:</target>
-
-<source>Moving file %x to %y</source>
-<target>Spostamento file %x in %y</target>
-
-<source>Moving folder %x to %y</source>
-<target>Spostamento cartella %x in %y</target>
-
-<source>Moving symbolic link %x to %y</source>
-<target>Spostamento collegamento %x in %y</target>
-
-<source>Removing old versions...</source>
-<target>Rimozione di vecchie versioni...</target>
-
-<source>Updating file %x</source>
-<target>Aggiornamento file %x</target>
-
-<source>Updating symbolic link %x</source>
-<target>Aggiornamento collegamento %x</target>
-
-<source>Verifying file %x</source>
-<target>Verifica file %x</target>
-
-<source>Updating attributes of %x</source>
-<target>Aggiornamento attributi di %x</target>
-
-<source>Source item %x not found</source>
-<target>Elemento di origine %x non trovato</target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>Creazione di un Volume Shadow Copy per %x...</target>
-
-<source>Target folder %x already existing.</source>
-<target>La cartella di destinazione %x è già esistente.</target>
-
-<source>Target folder input field must not be empty.</source>
-<target>Il campo per la cartella di destinazione non può essere vuoto.</target>
-
-<source>Source folder %x not found.</source>
-<target>Cartella sorgente %x non trovata.</target>
-
-<source>Please enter a target folder for versioning.</source>
-<target>Inserisci una cartella di destinazione per il controllo delle versioni.</target>
-
-<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>I seguenti oggetti hanno conflitti irrisolti e non saranno sincronizzati:</target>
-
-<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>Le seguenti cartelle sono significativamente differenti. Si prega di controllare che sono selezionate le cartelle corrette per la sincronizzazione.</target>
-
-<source>Not enough free disk space available in:</source>
-<target>Spazio libero su disco insufficiente in:</target>
-
-<source>Available:</source>
-<target>Disponibile:</target>
-
-<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>Alcuni file saranno sincronizzati come parte di più cartelle base.</target>
-
-<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>Per evitare conflitti, il set up esclude i filtri in modo che ciascun file aggiornato è considerato da una sola cartella base.</target>
-
-<source>Versioning folder:</source>
-<target>Cartella versione:</target>
-
-<source>Base folder:</source>
-<target>Cartella base:</target>
-
-<source>The versioning folder is contained in a base folder.</source>
-<target>La cartella delle versioni è contenuta in una cartella di base.</target>
-
-<source>Synchronizing folder pair:</source>
-<target>Sincronizzazione della coppia di cartelle:</target>
-
-<source>Generating database...</source>
-<target>Generazione database...</target>
-
<source>Loading...</source>
<target>Caricamento...</target>
@@ -888,7 +894,7 @@ Il comando è attivato se:
<target>Si prega di selezionare una cartella su un file system locale, di rete o un dispositivo MTP.</target>
<source>Defined by context of use</source>
-<target></target>
+<target>Definito dal contesto di utilizzo</target>
<source>Requires FreeFileSync Donation Edition</source>
<target>Richiede FreeFileSync Donation Edition</target>
@@ -1061,8 +1067,8 @@ Il comando è attivato se:
<source>Show examples</source>
<target>Mostra esempi</target>
-<source>Time span:</source>
-<target>Intervallo di tempo:</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>Selezionare le regole del filtro per escludere alcuni file dalla sincronizzazione. Immettere i percorsi dei file relativi alla loro corrispondente coppia di cartelle.</target>
<source>File size:</source>
<target>Dimensione del file:</target>
@@ -1073,8 +1079,8 @@ Il comando è attivato se:
<source>Maximum:</source>
<target>Massimo:</target>
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target>Selezionare le regole del filtro per escludere alcuni file dalla sincronizzazione. Immettere i percorsi dei file relativi alla loro corrispondente coppia di cartelle.</target>
+<source>Time span:</source>
+<target>Intervallo di tempo:</target>
<source>C&lear</source>
<target>Cance&lla</target>
@@ -1105,9 +1111,18 @@ Il comando è attivato se:
<source>&Versioning</source>
<target>&Versione</target>
+<source>Move files to a user-defined folder</source>
+<target>Spostare i file in una cartella definita dall'utente</target>
+
<source>Naming convention:</source>
<target>Modalità di rinomina:</target>
+<source>Limit file versions:</source>
+<target>Limitare le versioni dei file:</target>
+
+<source>Last x days:</source>
+<target>Ultimi x giorni:</target>
+
<source>Ignore errors</source>
<target>Ignora errori</target>
@@ -1249,11 +1264,8 @@ Il comando è attivato se:
<source>Save log:</source>
<target>Salva log:</target>
-<source>Limit:</source>
-<target>Limite:</target>
-
-<source>Limit maximum number of log files</source>
-<target>Limita il numero massimo di file log</target>
+<source>Limit number of log files:</source>
+<target>Limita il numero di file di registro:</target>
<source>How can I schedule a batch job?</source>
<target>Come posso programmare un lavoro batch?</target>
@@ -1288,9 +1300,6 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Transfer file and folder permissions.</source>
<target>Trasferimento autorizzazioni di file e cartelle.</target>
-<source>Show hidden dialogs again</source>
-<target>Mostra di nuovo le finestre di dialogo nascoste</target>
-
<source>Show all permanently hidden dialogs and warning messages again</source>
<target>Mostra di nuovo tutti i dialoghi nascosti in modo permanente e i messaggi di allarme</target>
@@ -1381,9 +1390,6 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Select Time Span</source>
<target>Selezionare Intervallo di Tempo</target>
-<source>FreeFileSync Donation Edition</source>
-<target>FreeFileSync Donation Edition</target>
-
<source>Highlight Configurations</source>
<target>Evidenzia le configurazioni</target>
@@ -1507,6 +1513,9 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Select time span...</source>
<target>Seleziona intervallo di tempo...</target>
+<source>Donation Edition</source>
+<target>Edizione di donazione</target>
+
<source>Folder Comparison and Synchronization</source>
<target>Comparazione delle Cartelle e Sincronizzazione</target>
@@ -1705,6 +1714,12 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Parameters for opposite side</source>
<target>Parametri per lato opposto</target>
+<source>Show hidden dialogs again</source>
+<target>Mostra di nuovo le finestre di dialogo nascoste</target>
+
+<source>All dialogs shown</source>
+<target>Tutte le finestre di dialogo mostrate</target>
+
<source>Downloading update...</source>
<target>Download aggiornamento...</target>
@@ -1744,9 +1759,6 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>This year</source>
<target>Quest'anno</target>
-<source>Last x days</source>
-<target>Ultimi x giorni</target>
-
<source>Byte</source>
<target>Byte</target>
@@ -1762,9 +1774,6 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Delete and overwrite files permanently</source>
<target>Elimina e sovrascrivi i file in modo permanente</target>
-<source>Move files to a user-defined folder</source>
-<target>Spostare i file in una cartella definita dall'utente</target>
-
<source>Replace</source>
<target>Sostituisci</target>
@@ -1774,6 +1783,12 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Time stamp</source>
<target>Data e ora</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>Sposta i file in una sottocartella temporanea di stampa</target>
+
+<source>File</source>
+<target>File</target>
+
<source>Append a time stamp to each file name</source>
<target>Aggiunge un'impronta per ogni nome di file</target>
@@ -1795,12 +1810,12 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Leave as unresolved conflict</source>
<target>Lascia come conflitti irrisolti</target>
-<source>File</source>
-<target>File</target>
-
<source>YYYY-MM-DD hhmmss</source>
<target>AAAA-MM-GG hhmmss</target>
+<source>Minimum version count must be smaller than maximum count.</source>
+<target>Il numero minimo della versione deve essere inferiore al conteggio massimo.</target>
+
<source>Files</source>
<target>File</target>
@@ -1948,8 +1963,8 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Portable</source>
<target>Portatile</target>
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>Salva impostazioni in "%APPDATA%\FreeFileSync"</target>
+<source>Save settings in %x</source>
+<target>Salva le impostazioni in %x</target>
<source>Register FreeFileSync file extensions</source>
<target>Registra estensioni file di FreeFileSync</target>
diff --git a/FreeFileSync/Build/Languages/japanese.lng b/FreeFileSync/Build/Languages/japanese.lng
index 0776af38..b63b0a12 100755
--- a/FreeFileSync/Build/Languages/japanese.lng
+++ b/FreeFileSync/Build/Languages/japanese.lng
@@ -115,11 +115,20 @@
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
<target>インストール ファイルが破損しています、FreeFileSync を再インストールしてください.</target>
+<source>Cannot load file %x.</source>
+<target>ファイル %x を読み込めません.</target>
+
<source>Cannot find the following folders:</source>
-<target>以下のフォルダがみつかりません:</target>
+<target>次のフォルダがみつかりません:</target>
-<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>このエラーを無視した場合、空のフォルダが考慮され、必要に応じて不足しているフォルダが自動的に生成されます.</target>
+<source>The following folders do not yet exist:</source>
+<target>次のフォルダは存在しません:</target>
+
+<source>The folders are created automatically when needed.</source>
+<target>フォルダは必要に応じて自動的に生成されます.</target>
+
+<source>Scanning:</source>
+<target>スキャン:</target>
<source>Comparison finished:</source>
<target>比較が完了:</target>
@@ -213,6 +222,62 @@
<source>Out of memory.</source>
<target>メモリが足りません.</target>
+<source>Database file %x is incompatible.</source>
+<target>データベース %x とは互換性がありません.</target>
+
+<source>Initial synchronization:</source>
+<target>同期処理の初期化:</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>データベース %x は存在しません.</target>
+
+<source>Database file is corrupted:</source>
+<target>データベースが破損しています:</target>
+
+<source>Cannot write file %x.</source>
+<target>ファイル %x に書き込めません.</target>
+
+<source>Cannot read file %x.</source>
+<target>ファイル %x を読み込めません.</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>このデータベース ファイルには前回の同期に関する情報がまだ含まれていません.</target>
+
+<source>Loading file %x...</source>
+<target>ファイル %x を読み込み中...</target>
+
+<source>Saving file %x...</source>
+<target>ファイル %x を保存中...</target>
+
+<source>Searching for folder %x...</source>
+<target>フォルダ %x を検索中...</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>フォルダ %x 検索中にタイムアウト.</target>
+
+<source>Cannot get process information.</source>
+<target>プロセス情報を取得できません.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>%x のファイル属性を読み込めません.</target>
+
+<source>Waiting while directory is locked:</source>
+<target>ディレクトリのロックを待機中:</target>
+
+<source>Lock owner:</source>
+<target>ロック所有者:</target>
+
+<source>Detecting abandoned lock...</source>
+<target>放棄されたロックを検出中...</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>%x 秒</pluralform>
+</target>
+
<source>Item exists on left side only</source>
<target>左側のみに存在する項目</target>
@@ -267,8 +332,187 @@
<source>Update attributes on right</source>
<target>右の属性を更新</target>
-<source>Cannot read file %x.</source>
-<target>ファイル %x を読み込めません.</target>
+<source>Items processed:</source>
+<target>処理された要素:</target>
+
+<source>Items remaining:</source>
+<target>残りの要素:</target>
+
+<source>Total time:</source>
+<target>合計時間:</target>
+
+<source>Cleaning up log files:</source>
+<target>ログファイルのクリーン:</target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>ファイル %x の構文解析エラー, 行 %y, 列 %z.</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>次のフォルダにあるディレクトリはロックできません:</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>%x スレッド</pluralform>
+</target>
+
+<source>Cannot read directory %x.</source>
+<target>ディレクトリ %x を読み取れません.</target>
+
+<source>/sec</source>
+<target>/秒</target>
+
+<source>%x items/sec</source>
+<target>%x 項目/秒</target>
+
+<source>Show in Explorer</source>
+<target>エクスプローラで表示</target>
+
+<source>Open with default application</source>
+<target>既定アプリケーションで開く</target>
+
+<source>Browse directory</source>
+<target>ディレクトリを参照</target>
+
+<source>Unable to connect to %x.</source>
+<target>%x に接続できません.</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>ボリュームシャドウコピーサービスにアクセス出来ません.</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>現システムでシャドゥ コピーを作成するには 64-bit 版の FreeFileSync を使用してください.</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>%x のボリューム名が決定されていません.</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>ボリューム名 %x は、ファイルパス %y の一部ではありません.</target>
+
+<source>File time and size</source>
+<target>ファイル時刻とサイズ</target>
+
+<source>File content</source>
+<target>ファイルの内容</target>
+
+<source>File size</source>
+<target>ファイルサイズ</target>
+
+<source>Two way</source>
+<target>両方向</target>
+
+<source>Mirror</source>
+<target>ミラー</target>
+
+<source>Update</source>
+<target>更新</target>
+
+<source>Custom</source>
+<target>カスタム</target>
+
+<source>Multiple...</source>
+<target>複数処理...</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>%x のファイル属性を書き込めません.</target>
+
+<source>Cannot open file %x.</source>
+<target>ファイル %x を開けません.</target>
+
+<source>%x and %y have different content.</source>
+<target>%x と %y の内容は異なります.</target>
+
+<source>Data verification error:</source>
+<target>データ検証エラー:</target>
+
+<source>Moving file %x to %y</source>
+<target>ファイル %x を %y に移動中</target>
+
+<source>Moving folder %x to %y</source>
+<target>フォルダ %x を %y に移動中</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>シンボリックリンク %x を %y に移動中</target>
+
+<source>Updating file %x</source>
+<target>ファイル %x を更新中</target>
+
+<source>Updating symbolic link %x</source>
+<target>シンボリックリンク %x を更新中</target>
+
+<source>Verifying file %x</source>
+<target>ファイル %x の検証中</target>
+
+<source>Updating attributes of %x</source>
+<target>%x の属性を更新</target>
+
+<source>Source item %x not found</source>
+<target>ソース項目 %x が見つかりません</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>ボリュームシャドウコピーを作成中 %x...</target>
+
+<source>Cannot find folder %x.</source>
+<target>%x フォルダがみつかりません.</target>
+
+<source>Target folder %x already existing.</source>
+<target>対象フォルダ %x は既に存在します.</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>対象フォルダ入力欄が空白になっています.</target>
+
+<source>Source folder %x not found.</source>
+<target>ソース フォルダ %x がみつかりません.</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>バージョン付けをする対象フォルダを入力.</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>以下の項目は、未解決の競合が存在するため同期処理を実行できませんでした:</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>以下ののフォルダは内容が大幅に異なっています。同期フォルダの設定に誤りがないかどうかをご確認ください.</target>
+
+<source>Not enough free disk space available in:</source>
+<target>利用可能なディスク空き容量が足りません:</target>
+
+<source>Required:</source>
+<target>必須:</target>
+
+<source>Available:</source>
+<target>利用可能:</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>いくつかのファイルは複数の基準フォルダの一部として同期されます.</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>競合を避けたい場合は、各ファイルがひとつの基準フォルダで更新されるように除外フィルターをセットします.</target>
+
+<source>Versioning folder:</source>
+<target>バージョン管理フォルダ:</target>
+
+<source>Base folder:</source>
+<target>基準フォルダ:</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>バージョン管理フォルダは、基準フォルダ内に含まれています.</target>
+
+<source>Synchronizing folder pair:</source>
+<target>フォルダペアを同期処理:</target>
+
+<source>Generating database...</source>
+<target>データベースを作成中...</target>
+
+<source>Searching for excess file versions:</source>
+<target>ファイルの余剰なバージョンを検索:</target>
+
+<source>Removing excess file versions:</source>
+<target>ファイルの余剰なバージョンを除去:</target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>バージョン管理のタイムスタンプを作成できません:</target>
<source>
Unexpected size of data stream.
@@ -287,17 +531,14 @@ Actual: %y bytes
<source>Operation not supported for different base folder types.</source>
<target>別の基準フォルダタイプでは対応していない操作.</target>
-<source>Cannot write file %x.</source>
-<target>ファイル %x に書き込めません.</target>
-
<source>Cannot move file %x to %y.</source>
<target>ファイル %x を %y に移動できません.</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>シンボリックリンク %x を %y にコピーできません.</target>
-<source>Unable to connect to %x.</source>
-<target>%x に接続できません.</target>
+<source>Error Code %x</source>
+<target>エラーコード %x.</target>
<source>Failed to get information about server %x.</source>
<target>%x サーバからの情報取得に失敗しました.</target>
@@ -305,12 +546,6 @@ Actual: %y bytes
<source>Cannot open directory %x.</source>
<target>ディレクトリ %x を開けません.</target>
-<source>Cannot read directory %x.</source>
-<target>ディレクトリ %x を読み取れません.</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>%x のファイル属性を読み込めません.</target>
-
<source>Cannot create directory %x.</source>
<target>ディレクトリ %x を作成できません.</target>
@@ -338,9 +573,6 @@ Actual: %y bytes
<source>Cannot find device %x.</source>
<target>デバイス %x がみつかりません.</target>
-<source>Cannot open file %x.</source>
-<target>ファイル %x を開けません.</target>
-
<source>Type of item %x is not supported:</source>
<target>項目 %x には対応していません:</target>
@@ -353,15 +585,9 @@ Actual: %y bytes
<source>Incorrect command line:</source>
<target>不正なコマンドライン:</target>
-<source>Error Code %x</source>
-<target>エラーコード %x.</target>
-
<source>The server does not support authentication via %x.</source>
<target>このサーバは %x による認証に対応していません.</target>
-<source>Required:</source>
-<target>必須:</target>
-
<source>Unable to access %x.</source>
<target>%x にアクセスできません.</target>
@@ -404,121 +630,9 @@ Actual: %y bytes
<source>%x GB</source>
<target>%x GB</target>
-<source>Cannot load file %x.</source>
-<target>ファイル %x を読み込めません.</target>
-
-<source>Database file %x is incompatible.</source>
-<target>データベース %x とは互換性がありません.</target>
-
-<source>Initial synchronization:</source>
-<target>同期処理の初期化:</target>
-
-<source>Database file %x does not yet exist.</source>
-<target>データベース %x は存在しません.</target>
-
-<source>Database file is corrupted:</source>
-<target>データベースが破損しています:</target>
-
-<source>The database files do not yet contain information about the last synchronization.</source>
-<target>このデータベース ファイルには前回の同期に関する情報がまだ含まれていません.</target>
-
-<source>Loading file %x...</source>
-<target>ファイル %x を読み込み中...</target>
-
-<source>Saving file %x...</source>
-<target>ファイル %x を保存中...</target>
-
-<source>Searching for folder %x...</source>
-<target>フォルダ %x を検索中...</target>
-
-<source>Timeout while searching for folder %x.</source>
-<target>フォルダ %x 検索中にタイムアウト.</target>
-
-<source>Cannot get process information.</source>
-<target>プロセス情報を取得できません.</target>
-
-<source>Waiting while directory is locked:</source>
-<target>ディレクトリのロックを待機中:</target>
-
-<source>Lock owner:</source>
-<target>ロック所有者:</target>
-
-<source>Detecting abandoned lock...</source>
-<target>放棄されたロックを検出中...</target>
-
-<source>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</source>
-<target>
-<pluralform>%x 秒</pluralform>
-</target>
-
-<source>Items processed:</source>
-<target>処理された要素:</target>
-
-<source>Items remaining:</source>
-<target>残りの要素:</target>
-
-<source>Total time:</source>
-<target>合計時間:</target>
-
-<source>Cleaning up old log files...</source>
-<target>古いログファイルをクリーン...</target>
-
-<source>Error parsing file %x, row %y, column %z.</source>
-<target>ファイル %x の構文解析エラー, 行 %y, 列 %z.</target>
-
-<source>Cannot set directory locks for the following folders:</source>
-<target>次のフォルダにあるディレクトリはロックできません:</target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-<pluralform>%x スレッド</pluralform>
-</target>
-
-<source>Scanning:</source>
-<target>スキャン:</target>
-
-<source>/sec</source>
-<target>/秒</target>
-
-<source>%x items/sec</source>
-<target>%x 項目/秒</target>
-
-<source>Show in Explorer</source>
-<target>エクスプローラで表示</target>
-
-<source>Open with default application</source>
-<target>既定アプリケーションで開く</target>
-
-<source>Browse directory</source>
-<target>ディレクトリを参照</target>
-
-<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>ボリュームシャドウコピーサービスにアクセス出来ません.</target>
-
-<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>現システムでシャドゥ コピーを作成するには 64-bit 版の FreeFileSync を使用してください.</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>%x のボリューム名が決定されていません.</target>
-
-<source>Volume name %x is not part of file path %y.</source>
-<target>ボリューム名 %x は、ファイルパス %y の一部ではありません.</target>
-
-<source>Unable to create time stamp for versioning:</source>
-<target>バージョン管理のタイムスタンプを作成できません:</target>
-
<source>Drag && drop</source>
<target>ドラッグ && ドロップ</target>
-<source>Cannot find folder %x.</source>
-<target>%x フォルダがみつかりません.</target>
-
<source>Select a folder</source>
<target>フォルダを選択</target>
@@ -614,8 +728,8 @@ The command is triggered if:
<source>Directory monitoring active</source>
<target>ディレクトリの監視アクティブ</target>
-<source>Waiting until all directories are available...</source>
-<target>全ディレクトリが利用可能になるまで待機中...</target>
+<source>Waiting until directory is available:</source>
+<target>ディレクトリが利用可能になるまで待機:</target>
<source>&Restore</source>
<target>修復(&R)</target>
@@ -629,114 +743,6 @@ The command is triggered if:
<source>&Retry</source>
<target>再試行(&R)</target>
-<source>File time and size</source>
-<target>ファイル時刻とサイズ</target>
-
-<source>File content</source>
-<target>ファイルの内容</target>
-
-<source>File size</source>
-<target>ファイルサイズ</target>
-
-<source>Two way</source>
-<target>両方向</target>
-
-<source>Mirror</source>
-<target>ミラー</target>
-
-<source>Update</source>
-<target>更新</target>
-
-<source>Custom</source>
-<target>カスタム</target>
-
-<source>Multiple...</source>
-<target>複数処理...</target>
-
-<source>Cannot write file attributes of %x.</source>
-<target>%x のファイル属性を書き込めません.</target>
-
-<source>%x and %y have different content.</source>
-<target>%x と %y の内容は異なります.</target>
-
-<source>Data verification error:</source>
-<target>データ検証エラー:</target>
-
-<source>Moving file %x to %y</source>
-<target>ファイル %x を %y に移動中</target>
-
-<source>Moving folder %x to %y</source>
-<target>フォルダ %x を %y に移動中</target>
-
-<source>Moving symbolic link %x to %y</source>
-<target>シンボリックリンク %x を %y に移動中</target>
-
-<source>Removing old versions...</source>
-<target>旧バージョンを除去中...</target>
-
-<source>Updating file %x</source>
-<target>ファイル %x を更新中</target>
-
-<source>Updating symbolic link %x</source>
-<target>シンボリックリンク %x を更新中</target>
-
-<source>Verifying file %x</source>
-<target>ファイル %x の検証中</target>
-
-<source>Updating attributes of %x</source>
-<target>%x の属性を更新</target>
-
-<source>Source item %x not found</source>
-<target>ソース項目 %x が見つかりません</target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>ボリュームシャドウコピーを作成中 %x...</target>
-
-<source>Target folder %x already existing.</source>
-<target>対象フォルダ %x は既に存在します.</target>
-
-<source>Target folder input field must not be empty.</source>
-<target>対象フォルダ入力欄が空白になっています.</target>
-
-<source>Source folder %x not found.</source>
-<target>ソース フォルダ %x がみつかりません.</target>
-
-<source>Please enter a target folder for versioning.</source>
-<target>バージョン付けをする対象フォルダを入力.</target>
-
-<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>以下の項目は、未解決の競合が存在するため同期処理を実行できませんでした:</target>
-
-<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>以下ののフォルダは内容が大幅に異なっています。同期フォルダの設定に誤りがないかどうかをご確認ください.</target>
-
-<source>Not enough free disk space available in:</source>
-<target>利用可能なディスク空き容量が足りません:</target>
-
-<source>Available:</source>
-<target>利用可能:</target>
-
-<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>いくつかのファイルは複数の基準フォルダの一部として同期されます.</target>
-
-<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>競合を避けたい場合は、各ファイルがひとつの基準フォルダで更新されるように除外フィルターをセットします.</target>
-
-<source>Versioning folder:</source>
-<target>バージョン管理フォルダ:</target>
-
-<source>Base folder:</source>
-<target>基準フォルダ:</target>
-
-<source>The versioning folder is contained in a base folder.</source>
-<target>バージョン管理フォルダは、基準フォルダ内に含まれています.</target>
-
-<source>Synchronizing folder pair:</source>
-<target>フォルダペアを同期処理:</target>
-
-<source>Generating database...</source>
-<target>データベースを作成中...</target>
-
<source>Loading...</source>
<target>読み込み中...</target>
@@ -881,7 +887,7 @@ The command is triggered if:
<target>ローカルファイルシステム、ネットワークまたは MTP デバイス上のフォルダを選択.</target>
<source>Defined by context of use</source>
-<target></target>
+<target>使用状況による定義</target>
<source>Requires FreeFileSync Donation Edition</source>
<target>FreeFileSync 寄付版が必要です</target>
@@ -1054,8 +1060,8 @@ The command is triggered if:
<source>Show examples</source>
<target>入力例を表示</target>
-<source>Time span:</source>
-<target>タイムスパン:</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>同期処理から特定のファイルを除外するためのフィルター規則を選択、 対応するそれらフォルダ ペアを基準にしたファイルパスを入力します.</target>
<source>File size:</source>
<target>ファイルサイズ:</target>
@@ -1066,8 +1072,8 @@ The command is triggered if:
<source>Maximum:</source>
<target>最大:</target>
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target>同期処理から特定のファイルを除外するためのフィルター規則を選択、 対応するそれらフォルダ ペアを基準にしたファイルパスを入力します.</target>
+<source>Time span:</source>
+<target>タイムスパン:</target>
<source>C&lear</source>
<target>クリア(&L)</target>
@@ -1096,11 +1102,20 @@ The command is triggered if:
<target>完全消去(&P)</target>
<source>&Versioning</source>
-<target>バージョン管理(&V)</target>
+<target>バージョン管理(&V)</target>
+
+<source>Move files to a user-defined folder</source>
+<target>ユーザ定義のフォルダにファイルを移動</target>
<source>Naming convention:</source>
<target>命名規則:</target>
+<source>Limit file versions:</source>
+<target>ファイルバージョン制限:</target>
+
+<source>Last x days:</source>
+<target>x 日以降:</target>
+
<source>Ignore errors</source>
<target>エラーを無視</target>
@@ -1242,11 +1257,8 @@ The command is triggered if:
<source>Save log:</source>
<target>ログ保存:</target>
-<source>Limit:</source>
-<target>制限:</target>
-
-<source>Limit maximum number of log files</source>
-<target>ログファイルの最大数を制限</target>
+<source>Limit number of log files:</source>
+<target>ログファイル数の制限:</target>
<source>How can I schedule a batch job?</source>
<target>一括ジョブ スケジュールの作成方法</target>
@@ -1281,9 +1293,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Transfer file and folder permissions.</source>
<target>ファイルとフォルダのパーミッションを転送します.</target>
-<source>Show hidden dialogs again</source>
-<target>非表示のダイアログを再表示</target>
-
<source>Show all permanently hidden dialogs and warning messages again</source>
<target>非表示にしたすべてのダイアログと警告メッセージを再表示</target>
@@ -1374,9 +1383,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Select Time Span</source>
<target>タイムスパンを選択</target>
-<source>FreeFileSync Donation Edition</source>
-<target>FreeFileSync 寄付版</target>
-
<source>Highlight Configurations</source>
<target>構成の強調表示</target>
@@ -1496,6 +1502,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Select time span...</source>
<target>タイムスパンを選択...</target>
+<source>Donation Edition</source>
+<target>寄付版</target>
+
<source>Folder Comparison and Synchronization</source>
<target>フォルダの比較と同期</target>
@@ -1691,6 +1700,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Parameters for opposite side</source>
<target>反対側のパラメータ</target>
+<source>Show hidden dialogs again</source>
+<target>非表示のダイアログを再表示</target>
+
+<source>All dialogs shown</source>
+<target>すべてのダイアログを表示</target>
+
<source>Downloading update...</source>
<target>アップデートをダウンロード中...</target>
@@ -1730,9 +1745,6 @@ This guarantees a consistent state even in case of a serious error.
<source>This year</source>
<target>今年</target>
-<source>Last x days</source>
-<target>最後の x 日</target>
-
<source>Byte</source>
<target>バイト</target>
@@ -1748,9 +1760,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Delete and overwrite files permanently</source>
<target>ファイルを完全に削除、または上書きする</target>
-<source>Move files to a user-defined folder</source>
-<target>ユーザ定義のフォルダにファイルを移動</target>
-
<source>Replace</source>
<target>置換</target>
@@ -1760,6 +1769,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Time stamp</source>
<target>タイムスタンプ</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>ファイルをタイムスタンプ付きサブフォルダに移動</target>
+
+<source>File</source>
+<target>ファイル</target>
+
<source>Append a time stamp to each file name</source>
<target>各ファイル名にタイムスタンプを付加</target>
@@ -1781,12 +1796,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Leave as unresolved conflict</source>
<target>未解決の競合はそのまま残す</target>
-<source>File</source>
-<target>ファイル</target>
-
<source>YYYY-MM-DD hhmmss</source>
<target>YYYY-MM-DD hhmmss</target>
+<source>Minimum version count must be smaller than maximum count.</source>
+<target>最小バージョン数は最大値より小さくする必要があります.</target>
+
<source>Files</source>
<target>ファイル</target>
@@ -1932,8 +1947,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Portable</source>
<target>ポータブル</target>
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>設定の保存先 "%APPDATA%\FreeFileSync"</target>
+<source>Save settings in %x</source>
+<target>設定を %x に保存</target>
<source>Register FreeFileSync file extensions</source>
<target>FreeFileSync 拡張子の関連付け</target>
diff --git a/FreeFileSync/Build/Languages/korean.lng b/FreeFileSync/Build/Languages/korean.lng
index 1225d556..0a46b70d 100755
--- a/FreeFileSync/Build/Languages/korean.lng
+++ b/FreeFileSync/Build/Languages/korean.lng
@@ -7,9 +7,6 @@
<plural_definition>0</plural_definition>
</header>
-<source>Defined by context of use</source>
-<target></target>
-
<source>Both sides have changed since last synchronization.</source>
<target>마지막 동기화 작업 이후, 양측 모두 변경 되었습니다.</target>
@@ -118,11 +115,17 @@
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
<target>설치 파일이 손상되었습니다. FreeFileSync를 다시 설치하십시오.</target>
+<source>Cannot load file %x.</source>
+<target>파일 %x을(를) 로드할 수 없습니다.</target>
+
<source>Cannot find the following folders:</source>
<target>다음 폴더를 찾을 수 없습니다:</target>
-<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>이 오류를 무시하면 폴더는 비어 있는 것으로 간주됩니다. 없는 폴더는 필요한 경우 자동 생성됩니다.</target>
+<source>The following folders do not yet exist:</source>
+<target></target>
+
+<source>The folders are created automatically when needed.</source>
+<target></target>
<source>Comparison finished:</source>
<target>비교 완료:</target>
@@ -216,6 +219,62 @@
<source>Out of memory.</source>
<target>메모리 부족.</target>
+<source>Database file %x is incompatible.</source>
+<target>데이터베이스 파일 %x 은(는) 호환 불가능합니다.</target>
+
+<source>Initial synchronization:</source>
+<target>초기 동기화:</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>데이터베이스 파일 %x 은(는) 아직 존재하지 않습니다.</target>
+
+<source>Database file is corrupted:</source>
+<target>데이터베이스 파일 손상:</target>
+
+<source>Cannot write file %x.</source>
+<target>파일 %x을(를) 쓸 수 없습니다.</target>
+
+<source>Cannot read file %x.</source>
+<target>파일 %x을(를) 읽을 수 없습니다.</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>데이터베이스 파일에 아직 마지막 동기화에 대한 정보가 없습니다.</target>
+
+<source>Loading file %x...</source>
+<target>파일 %x 로딩 중...</target>
+
+<source>Saving file %x...</source>
+<target>파일 %x 저장 중...</target>
+
+<source>Searching for folder %x...</source>
+<target>폴더 %x 검색 중...</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>폴더 %x을(를) 검색하는 동안 타임아웃 됨.</target>
+
+<source>Cannot get process information.</source>
+<target>프로세스 정보를 얻을 수 없습니다.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>%x의 파일 속성을 읽을 수 없습니다.</target>
+
+<source>Waiting while directory is locked:</source>
+<target>디렉터리 잠금 대기 중:</target>
+
+<source>Lock owner:</source>
+<target>잠금 권한자:</target>
+
+<source>Detecting abandoned lock...</source>
+<target>방치된 잠금 탐색 중...</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>%x초</pluralform>
+</target>
+
<source>Item exists on left side only</source>
<target>항목이 좌측에만 존재합니다.</target>
@@ -270,8 +329,190 @@
<source>Update attributes on right</source>
<target>우측 속성 업데이트</target>
-<source>Cannot read file %x.</source>
-<target>파일 %x을(를) 읽을 수 없습니다.</target>
+<source>Items processed:</source>
+<target>처리된 항목:</target>
+
+<source>Items remaining:</source>
+<target>남은 항목:</target>
+
+<source>Total time:</source>
+<target>전체 시간:</target>
+
+<source>Cleaning up log files:</source>
+<target></target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>분석 오류 - 파일: %x; 행: %y; 열: %z.</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>다음 폴더의 디렉터리 잠금을 설정할 수 없습니다:</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>%x 스레드</pluralform>
+</target>
+
+<source>Scanning:</source>
+<target>스캔 중:</target>
+
+<source>Cannot read directory %x.</source>
+<target>디렉터리 %x을(를) 읽을 수 없습니다.</target>
+
+<source>/sec</source>
+<target>/초</target>
+
+<source>%x items/sec</source>
+<target>%x 항목</target>
+
+<source>Show in Explorer</source>
+<target>탐색기에 표시</target>
+
+<source>Open with default application</source>
+<target>기본값 응용 프로그램으로 열기</target>
+
+<source>Browse directory</source>
+<target>디렉터리 찾아보기</target>
+
+<source>Unable to connect to %x.</source>
+<target>%x에 연결할 수 없습니다.</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>볼륨 섀도 복사본 서비스에 접근할 수 없습니다.</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>본 운영체제에서의 Shadow Copy 생성은 FreeFileSync 64-비트 버전을 사용하시기 바랍니다.</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>%x 에 대한 볼륨 이름을 결정할 수 없습니다.</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>볼륨 이름 %x은(는) 파일 경로 %y의 일부가 아닙니다.</target>
+
+<source>File time and size</source>
+<target>파일 시간 및 크기</target>
+
+<source>File content</source>
+<target>파일 내용</target>
+
+<source>File size</source>
+<target>파일 크기</target>
+
+<source>Two way</source>
+<target>양측 방향 (Two Way)</target>
+
+<source>Mirror</source>
+<target>미러</target>
+
+<source>Update</source>
+<target>업데이트</target>
+
+<source>Custom</source>
+<target>개인 설정</target>
+
+<source>Multiple...</source>
+<target>다중처리 (멀티플) 작업...</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>%x의 파일 속성을 쓸 수 없습니다.</target>
+
+<source>Cannot open file %x.</source>
+<target>파일 %x을(를) 열 수 없습니다.</target>
+
+<source>%x and %y have different content.</source>
+<target>%x와(과) %y의 콘텐츠가 다릅니다.</target>
+
+<source>Data verification error:</source>
+<target>데이터 확인 오류:</target>
+
+<source>Moving file %x to %y</source>
+<target>파일 %x을(를) %y(으)로 이동 중</target>
+
+<source>Moving folder %x to %y</source>
+<target>폴더 %x을(를) %y(으)로 이동 중</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>심볼릭 링크 %x을(를) %y(으)로 이동 중</target>
+
+<source>Updating file %x</source>
+<target>파일 %x 업데이트 중</target>
+
+<source>Updating symbolic link %x</source>
+<target>심볼릭 링크 %x 업데이트 중</target>
+
+<source>Verifying file %x</source>
+<target>파일 %x 확인 중</target>
+
+<source>Updating attributes of %x</source>
+<target>%x 속성 업데이트 중</target>
+
+<source>Source item %x not found</source>
+<target>원본 항목 %x을(를) 찾을 수 없음</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>%x을(를) 위한 Volume Shadow Copy 생성 중...</target>
+
+<source>Cannot find folder %x.</source>
+<target>%x 폴더를 찾을 수 없습니다.</target>
+
+<source>Target folder %x already existing.</source>
+<target>대상 폴더 %x이(가) 이미 존재함.</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>대상 폴더 입력 필드가 비어 있어서는 안 됩니다.</target>
+
+<source>Source folder %x not found.</source>
+<target>소스 폴더 %x을(를) 찾을 수 없음.</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>버저닝을 위한 대상 폴더를 입력하세요.</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>아래의 항목들은 해결치 못 한 충돌로 인해 동기화할 수 없습니다:</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>다음 폴더들은 서로 간의 차이가 상당합니다. 동기화를 위해 올바른 폴더들이 매치되었는지 확인해 보십시오.</target>
+
+<source>Not enough free disk space available in:</source>
+<target>사용 가능한 디스크 여유 공간이 부족합니다:</target>
+
+<source>Required:</source>
+<target>필요 공간(크기):</target>
+
+<source>Available:</source>
+<target>여유 공간(크기):</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>일부 파일들은 여러 기본 폴더의 일부로써 동기화됩니다.</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>충돌 방지를 위해 제외 필터를 설정하여 업데이트 된 각 파일이 하나의 기본 폴더만으로 간주되도록 하십시오.</target>
+
+<source>Versioning folder:</source>
+<target>버전 관리 폴더:</target>
+
+<source>Base folder:</source>
+<target>기본 폴더:</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>버전 관리 폴더는 기본 폴더에 포함돼 있습니다.</target>
+
+<source>Synchronizing folder pair:</source>
+<target>폴더 페어 동기화 진행 중:</target>
+
+<source>Generating database...</source>
+<target>데이터베이스 생성 중...</target>
+
+<source>Searching for excess file versions:</source>
+<target></target>
+
+<source>Removing excess file versions:</source>
+<target></target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>버전 관리를 위한 타임 스탬프 생성 불가:</target>
<source>
Unexpected size of data stream.
@@ -290,17 +531,14 @@ Actual: %y bytes
<source>Operation not supported for different base folder types.</source>
<target>다른 기본 폴더 유형에 대해 지원되지 않는 동작입니다.</target>
-<source>Cannot write file %x.</source>
-<target>파일 %x을(를) 쓸 수 없습니다.</target>
-
<source>Cannot move file %x to %y.</source>
<target>파일 %x을(를) %y(으)로 이동할 수 없습니다.</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>심볼릭 링크 %x을(를) %y(으)로 복사할 수 없습니다.</target>
-<source>Unable to connect to %x.</source>
-<target>%x에 연결할 수 없습니다.</target>
+<source>Error Code %x</source>
+<target>오류 코드 %x</target>
<source>Failed to get information about server %x.</source>
<target>서버 %x에 대한 정보를 가져 오는데 실패했습니다.</target>
@@ -308,12 +546,6 @@ Actual: %y bytes
<source>Cannot open directory %x.</source>
<target>디렉터리 %x을(를) 열 수 없습니다.</target>
-<source>Cannot read directory %x.</source>
-<target>디렉터리 %x을(를) 읽을 수 없습니다.</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>%x의 파일 속성을 읽을 수 없습니다.</target>
-
<source>Cannot create directory %x.</source>
<target>디렉터리 %x을(를) 생성할 수 없습니다.</target>
@@ -341,9 +573,6 @@ Actual: %y bytes
<source>Cannot find device %x.</source>
<target>장치 %x을(를) 찾을 수 없습니다.</target>
-<source>Cannot open file %x.</source>
-<target>파일 %x을(를) 열 수 없습니다.</target>
-
<source>Type of item %x is not supported:</source>
<target>항목 %x의 형식은 지원되지 않습니다:</target>
@@ -356,15 +585,9 @@ Actual: %y bytes
<source>Incorrect command line:</source>
<target>부정확한 명령줄:</target>
-<source>Error Code %x</source>
-<target>오류 코드 %x</target>
-
<source>The server does not support authentication via %x.</source>
<target>서버가 %x을(를) 통한 인증을 지원하지 않습니다.</target>
-<source>Required:</source>
-<target>필요 공간(크기):</target>
-
<source>Unable to access %x.</source>
<target>%x에 접근할 수 없습니다.</target>
@@ -407,121 +630,9 @@ Actual: %y bytes
<source>%x GB</source>
<target>%x GB</target>
-<source>Cannot load file %x.</source>
-<target>파일 %x을(를) 로드할 수 없습니다.</target>
-
-<source>Database file %x is incompatible.</source>
-<target>데이터베이스 파일 %x 은(는) 호환 불가능합니다.</target>
-
-<source>Initial synchronization:</source>
-<target>초기 동기화:</target>
-
-<source>Database file %x does not yet exist.</source>
-<target>데이터베이스 파일 %x 은(는) 아직 존재하지 않습니다.</target>
-
-<source>Database file is corrupted:</source>
-<target>데이터베이스 파일 손상:</target>
-
-<source>The database files do not yet contain information about the last synchronization.</source>
-<target>데이터베이스 파일에 아직 마지막 동기화에 대한 정보가 없습니다.</target>
-
-<source>Loading file %x...</source>
-<target>파일 %x 로딩 중...</target>
-
-<source>Saving file %x...</source>
-<target>파일 %x 저장 중...</target>
-
-<source>Searching for folder %x...</source>
-<target>폴더 %x 검색 중...</target>
-
-<source>Timeout while searching for folder %x.</source>
-<target>폴더 %x을(를) 검색하는 동안 타임아웃 됨.</target>
-
-<source>Cannot get process information.</source>
-<target>프로세스 정보를 얻을 수 없습니다.</target>
-
-<source>Waiting while directory is locked:</source>
-<target>디렉터리 잠금 대기 중:</target>
-
-<source>Lock owner:</source>
-<target>잠금 권한자:</target>
-
-<source>Detecting abandoned lock...</source>
-<target>방치된 잠금 탐색 중...</target>
-
-<source>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</source>
-<target>
-<pluralform>%x초</pluralform>
-</target>
-
-<source>Items processed:</source>
-<target>처리된 항목:</target>
-
-<source>Items remaining:</source>
-<target>남은 항목:</target>
-
-<source>Total time:</source>
-<target>전체 시간:</target>
-
-<source>Cleaning up old log files...</source>
-<target>이전 로그 파일 정리 중...</target>
-
-<source>Error parsing file %x, row %y, column %z.</source>
-<target>분석 오류 - 파일: %x; 행: %y; 열: %z.</target>
-
-<source>Cannot set directory locks for the following folders:</source>
-<target>다음 폴더의 디렉터리 잠금을 설정할 수 없습니다:</target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-<pluralform>%x 스레드</pluralform>
-</target>
-
-<source>Scanning:</source>
-<target>스캔 중:</target>
-
-<source>/sec</source>
-<target>/초</target>
-
-<source>%x items/sec</source>
-<target>%x 항목</target>
-
-<source>Show in Explorer</source>
-<target>탐색기에 표시</target>
-
-<source>Open with default application</source>
-<target>기본값 응용 프로그램으로 열기</target>
-
-<source>Browse directory</source>
-<target>디렉터리 찾아보기</target>
-
-<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>볼륨 섀도 복사본 서비스에 접근할 수 없습니다.</target>
-
-<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>본 운영체제에서의 Shadow Copy 생성은 FreeFileSync 64-비트 버전을 사용하시기 바랍니다.</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>%x 에 대한 볼륨 이름을 결정할 수 없습니다.</target>
-
-<source>Volume name %x is not part of file path %y.</source>
-<target>볼륨 이름 %x은(는) 파일 경로 %y의 일부가 아닙니다.</target>
-
-<source>Unable to create time stamp for versioning:</source>
-<target>버전 관리를 위한 타임 스탬프 생성 불가:</target>
-
<source>Drag && drop</source>
<target>끌어서 놓기(&&) [드래그-앤-드랍]</target>
-<source>Cannot find folder %x.</source>
-<target>%x 폴더를 찾을 수 없습니다.</target>
-
<source>Select a folder</source>
<target>폴더 선택</target>
@@ -617,8 +728,8 @@ The command is triggered if:
<source>Directory monitoring active</source>
<target>디렉터리 모니터링 활성화</target>
-<source>Waiting until all directories are available...</source>
-<target>모든 디렉터리가 사용 가능할 때까지 대기 중...</target>
+<source>Waiting until directory is available:</source>
+<target></target>
<source>&Restore</source>
<target>복원(&R)</target>
@@ -632,114 +743,6 @@ The command is triggered if:
<source>&Retry</source>
<target>다시 시도(&R)</target>
-<source>File time and size</source>
-<target>파일 시간 및 크기</target>
-
-<source>File content</source>
-<target>파일 내용</target>
-
-<source>File size</source>
-<target>파일 크기</target>
-
-<source>Two way</source>
-<target>양측 방향 (Two Way)</target>
-
-<source>Mirror</source>
-<target>미러</target>
-
-<source>Update</source>
-<target>업데이트</target>
-
-<source>Custom</source>
-<target>개인 설정</target>
-
-<source>Multiple...</source>
-<target>다중처리 (멀티플) 작업...</target>
-
-<source>Cannot write file attributes of %x.</source>
-<target>%x의 파일 속성을 쓸 수 없습니다.</target>
-
-<source>%x and %y have different content.</source>
-<target>%x와(과) %y의 콘텐츠가 다릅니다.</target>
-
-<source>Data verification error:</source>
-<target>데이터 확인 오류:</target>
-
-<source>Moving file %x to %y</source>
-<target>파일 %x을(를) %y(으)로 이동 중</target>
-
-<source>Moving folder %x to %y</source>
-<target>폴더 %x을(를) %y(으)로 이동 중</target>
-
-<source>Moving symbolic link %x to %y</source>
-<target>심볼릭 링크 %x을(를) %y(으)로 이동 중</target>
-
-<source>Removing old versions...</source>
-<target>구 버전 삭제 중...</target>
-
-<source>Updating file %x</source>
-<target>파일 %x 업데이트 중</target>
-
-<source>Updating symbolic link %x</source>
-<target>심볼릭 링크 %x 업데이트 중</target>
-
-<source>Verifying file %x</source>
-<target>파일 %x 확인 중</target>
-
-<source>Updating attributes of %x</source>
-<target>%x 속성 업데이트 중</target>
-
-<source>Source item %x not found</source>
-<target>원본 항목 %x을(를) 찾을 수 없음</target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>%x을(를) 위한 Volume Shadow Copy 생성 중...</target>
-
-<source>Target folder %x already existing.</source>
-<target>대상 폴더 %x이(가) 이미 존재함.</target>
-
-<source>Target folder input field must not be empty.</source>
-<target>대상 폴더 입력 필드가 비어 있어서는 안 됩니다.</target>
-
-<source>Source folder %x not found.</source>
-<target>소스 폴더 %x을(를) 찾을 수 없음.</target>
-
-<source>Please enter a target folder for versioning.</source>
-<target>버저닝을 위한 대상 폴더를 입력하세요.</target>
-
-<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>아래의 항목들은 해결치 못 한 충돌로 인해 동기화할 수 없습니다:</target>
-
-<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>다음 폴더들은 서로 간의 차이가 상당합니다. 동기화를 위해 올바른 폴더들이 매치되었는지 확인해 보십시오.</target>
-
-<source>Not enough free disk space available in:</source>
-<target>사용 가능한 디스크 여유 공간이 부족합니다:</target>
-
-<source>Available:</source>
-<target>여유 공간(크기):</target>
-
-<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>일부 파일들은 여러 기본 폴더의 일부로써 동기화됩니다.</target>
-
-<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>충돌 방지를 위해 제외 필터를 설정하여 업데이트 된 각 파일이 하나의 기본 폴더만으로 간주되도록 하십시오.</target>
-
-<source>Versioning folder:</source>
-<target>버전 관리 폴더:</target>
-
-<source>Base folder:</source>
-<target>기본 폴더:</target>
-
-<source>The versioning folder is contained in a base folder.</source>
-<target>버전 관리 폴더는 기본 폴더에 포함돼 있습니다.</target>
-
-<source>Synchronizing folder pair:</source>
-<target>폴더 페어 동기화 진행 중:</target>
-
-<source>Generating database...</source>
-<target>데이터베이스 생성 중...</target>
-
<source>Loading...</source>
<target>로드 중...</target>
@@ -883,6 +886,9 @@ The command is triggered if:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>로컬 파일 시스템, 네트워크 또는 MTP 장치에서의 폴더 하나를 선택하십시오.</target>
+<source>Defined by context of use</source>
+<target></target>
+
<source>Requires FreeFileSync Donation Edition</source>
<target>FreeFileSync 기부자 에디션이 필요합니다.</target>
@@ -1054,8 +1060,8 @@ The command is triggered if:
<source>Show examples</source>
<target>예시 보이기</target>
-<source>Time span:</source>
-<target>시간 간격:</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>동기화에서 특정 파일을 제외시키는 필터 규칙을 선택합니다. 해당 폴더 페어에 대한 상대 파일 경로를 입력하세요.</target>
<source>File size:</source>
<target>파일 크기:</target>
@@ -1066,8 +1072,8 @@ The command is triggered if:
<source>Maximum:</source>
<target>최대:</target>
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target>동기화에서 특정 파일을 제외시키는 필터 규칙을 선택합니다. 해당 폴더 페어에 대한 상대 파일 경로를 입력하세요.</target>
+<source>Time span:</source>
+<target>시간 간격:</target>
<source>C&lear</source>
<target>제거(&l)</target>
@@ -1098,9 +1104,18 @@ The command is triggered if:
<source>&Versioning</source>
<target>버전 관리(&V)</target>
+<source>Move files to a user-defined folder</source>
+<target>사용자 정의 폴더로 파일 이동</target>
+
<source>Naming convention:</source>
<target>이름 지정:</target>
+<source>Limit file versions:</source>
+<target></target>
+
+<source>Last x days:</source>
+<target></target>
+
<source>Ignore errors</source>
<target>오류 무시</target>
@@ -1242,11 +1257,8 @@ The command is triggered if:
<source>Save log:</source>
<target>로그 저장:</target>
-<source>Limit:</source>
-<target>제한:</target>
-
-<source>Limit maximum number of log files</source>
-<target>로그 파일의 최대 개수 제한</target>
+<source>Limit number of log files:</source>
+<target></target>
<source>How can I schedule a batch job?</source>
<target>일괄 작업 예약 방법은?</target>
@@ -1281,9 +1293,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Transfer file and folder permissions.</source>
<target>파일 및 폴더 권한 전송.</target>
-<source>Show hidden dialogs again</source>
-<target>숨겨진 대화창 다시 보이기</target>
-
<source>Show all permanently hidden dialogs and warning messages again</source>
<target>영구적으로 숨겨진 모든 대화창 및 경고 메세지 다시 보이기</target>
@@ -1374,9 +1383,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Select Time Span</source>
<target>시간간격(타임스팬) 선택</target>
-<source>FreeFileSync Donation Edition</source>
-<target>FreeFileSync 기부자 에디션</target>
-
<source>Highlight Configurations</source>
<target>강조 표시 구성</target>
@@ -1496,6 +1502,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Select time span...</source>
<target>시간간격(타임스팬) 선택...</target>
+<source>Donation Edition</source>
+<target></target>
+
<source>Folder Comparison and Synchronization</source>
<target>폴더 비교 및 동기화</target>
@@ -1691,6 +1700,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Parameters for opposite side</source>
<target>반대 측에 대한 매개 변수</target>
+<source>Show hidden dialogs again</source>
+<target>숨겨진 대화창 다시 보이기</target>
+
+<source>All dialogs shown</source>
+<target></target>
+
<source>Downloading update...</source>
<target>업데이트 다운로드 중...</target>
@@ -1730,9 +1745,6 @@ This guarantees a consistent state even in case of a serious error.
<source>This year</source>
<target>올해</target>
-<source>Last x days</source>
-<target>최근 x일</target>
-
<source>Byte</source>
<target>바이트</target>
@@ -1748,9 +1760,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Delete and overwrite files permanently</source>
<target>영구적으로 파일 삭제 및 덮어 쓰기</target>
-<source>Move files to a user-defined folder</source>
-<target>사용자 정의 폴더로 파일 이동</target>
-
<source>Replace</source>
<target>대체</target>
@@ -1760,6 +1769,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Time stamp</source>
<target>타임 스탬프</target>
+<source>Move files into a time-stamped subfolder</source>
+<target></target>
+
+<source>File</source>
+<target>파일</target>
+
<source>Append a time stamp to each file name</source>
<target>각 파일 이름마다 타임 스탬프 추가</target>
@@ -1781,12 +1796,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Leave as unresolved conflict</source>
<target>미해결 충돌로 놔두기</target>
-<source>File</source>
-<target>파일</target>
-
<source>YYYY-MM-DD hhmmss</source>
<target>YYYY-MM-DD hhmmss</target>
+<source>Minimum version count must be smaller than maximum count.</source>
+<target></target>
+
<source>Files</source>
<target>파일</target>
@@ -1932,8 +1947,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Portable</source>
<target>포터블</target>
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>"%APPDATA%\FreeFileSync"에 설정 저장</target>
+<source>Save settings in %x</source>
+<target></target>
<source>Register FreeFileSync file extensions</source>
<target>FreeFileSync 파일 확장자 등록</target>
diff --git a/FreeFileSync/Build/Languages/lithuanian.lng b/FreeFileSync/Build/Languages/lithuanian.lng
index beceddd9..14b24d25 100755
--- a/FreeFileSync/Build/Languages/lithuanian.lng
+++ b/FreeFileSync/Build/Languages/lithuanian.lng
@@ -7,9 +7,6 @@
<plural_definition>n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2</plural_definition>
</header>
-<source>Defined by context of use</source>
-<target></target>
-
<source>Both sides have changed since last synchronization.</source>
<target>Abi pusės buvo pakeistos nuo paskutinio suvienodinimo.</target>
@@ -118,11 +115,20 @@
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
<target>Įdiegimo failai yra pažeisti. Prašome įdiegti iš naujo FreeFileSync.</target>
+<source>Cannot load file %x.</source>
+<target>Nepavyksta įkelti failo %x.</target>
+
<source>Cannot find the following folders:</source>
<target>Nepavyksta rasti šių aplankų:</target>
-<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>Jei nebus paisoma šios klaidos, aplankams bus laikomas tusčiu. Trūkstami aplankai sukuriami automatiškai.</target>
+<source>The following folders do not yet exist:</source>
+<target>Šis aplankas dar neegzistuoja:</target>
+
+<source>The folders are created automatically when needed.</source>
+<target>Kai reikia, šie aplankai automatiškai sukuriami.</target>
+
+<source>Scanning:</source>
+<target>Nuskaitoma:</target>
<source>Comparison finished:</source>
<target>Palyginimas pabaigtas:</target>
@@ -218,6 +224,64 @@
<source>Out of memory.</source>
<target>Trūksta atminties.</target>
+<source>Database file %x is incompatible.</source>
+<target>Duomenų bazė %x yra netinkama.</target>
+
+<source>Initial synchronization:</source>
+<target>Pirminis suvienodinimas:</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>Duomenų bazės failo %x dar nėra.</target>
+
+<source>Database file is corrupted:</source>
+<target>Duomenų bazės failas yra sugadintas:</target>
+
+<source>Cannot write file %x.</source>
+<target>Nepavyksta įrašyti failo %x.</target>
+
+<source>Cannot read file %x.</source>
+<target>Nepavyksta nuskaityti failo %x.</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>Duomenų bazės failas dar neturi informacijos apie paskutinį suvienodinimą.</target>
+
+<source>Loading file %x...</source>
+<target>Įkraunamas failas %x...</target>
+
+<source>Saving file %x...</source>
+<target>Išsaugomas failas %x...</target>
+
+<source>Searching for folder %x...</source>
+<target>Ieškoma aplanko %x...</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>Laikas baigėsi ieškant %x aplanko.</target>
+
+<source>Cannot get process information.</source>
+<target>Nepavyksta gauti eigos informacijos.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Nepavyko perskaityti failo %x atributų.</target>
+
+<source>Waiting while directory is locked:</source>
+<target>Laukiama kol katalogas yra užrakintas:</target>
+
+<source>Lock owner:</source>
+<target>Užrakto savininkas:</target>
+
+<source>Detecting abandoned lock...</source>
+<target>Aptiktas paliktas užraktas...</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>%x sekundė</pluralform>
+<pluralform>%x sekundės</pluralform>
+<pluralform>%x sekundžių</pluralform>
+</target>
+
<source>Item exists on left side only</source>
<target>Elementas egzistuoja tik kairėje pusėje</target>
@@ -272,8 +336,189 @@
<source>Update attributes on right</source>
<target>Atnaujinti atributus dešinėje</target>
-<source>Cannot read file %x.</source>
-<target>Nepavyksta nuskaityti failo %x.</target>
+<source>Items processed:</source>
+<target>Elementų apdorota:</target>
+
+<source>Items remaining:</source>
+<target>Likę elementai:</target>
+
+<source>Total time:</source>
+<target>Visas laikas:</target>
+
+<source>Cleaning up log files:</source>
+<target>Žurnalinių failų valymas:</target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>Klaida trinant failą %x, eilė %y, stulpelis %z.</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>Negalima užrakinti šiuos aplankus kataloge:</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>%x srautas</pluralform>
+<pluralform>%x srautai</pluralform>
+<pluralform>%x srautų</pluralform>
+</target>
+
+<source>Cannot read directory %x.</source>
+<target>Negalima nuskaityti katalogo %x.</target>
+
+<source>/sec</source>
+<target>/sek.</target>
+
+<source>%x items/sec</source>
+<target>%x elementų/sek.</target>
+
+<source>Show in Explorer</source>
+<target>Rodyti naršyklėje</target>
+
+<source>Open with default application</source>
+<target>Atversti su numatyta programa</target>
+
+<source>Browse directory</source>
+<target>Naršyti katalogą</target>
+
+<source>Unable to connect to %x.</source>
+<target>Nepavyko prisijungti prie %x.</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>Duomenų Šešėlinės Kopijos Paslauga nepasiekiama.</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>Norėdami sukurti sistemos šešėlinę kopiją, prašome baudoti 64-bitų FreeFileSync versiją.</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>Vietos vardo %x nustatyti nepavyko.</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>Vietos vardas %x nėra failo kelio %y dalis.</target>
+
+<source>File time and size</source>
+<target>Failo laiką ir dydį</target>
+
+<source>File content</source>
+<target>Failo turinį</target>
+
+<source>File size</source>
+<target>Failo dydis</target>
+
+<source>Two way</source>
+<target>Dvipusis</target>
+
+<source>Mirror</source>
+<target>Identiškas</target>
+
+<source>Update</source>
+<target>Atnaujinti</target>
+
+<source>Custom</source>
+<target>Savitas</target>
+
+<source>Multiple...</source>
+<target>Keletas...</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>Nepavyksta įrašyti atributų failui %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>%x failo nepavyko atidaryti.</target>
+
+<source>%x and %y have different content.</source>
+<target>%x ir %y turi skirtingą turinį.</target>
+
+<source>Data verification error:</source>
+<target>Duomenų tikrinimo klaida:</target>
+
+<source>Moving file %x to %y</source>
+<target>Perkeliamas failas %x į %y</target>
+
+<source>Moving folder %x to %y</source>
+<target>Perkeliamas aplankas %x į %y</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>Perkeliama simbolinė nuoroda %x į %y</target>
+
+<source>Updating file %x</source>
+<target>Atnaujinamas failas %x</target>
+
+<source>Updating symbolic link %x</source>
+<target>Atnaujinama virtuali nuoroda %x</target>
+
+<source>Verifying file %x</source>
+<target>Tikrinamas failas %x</target>
+
+<source>Updating attributes of %x</source>
+<target>Atnaujinami atributai %x</target>
+
+<source>Source item %x not found</source>
+<target>Šaltinio elementas %x nerastas:</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>%x kuriamas Duomenų Šešėlinė Kopija...</target>
+
+<source>Cannot find folder %x.</source>
+<target>Negalima rasti aplanko %x.</target>
+
+<source>Target folder %x already existing.</source>
+<target>Tikslo aplankas %x jau yra.</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>Tikslo aplanko įvesties laukas negali būti tuščias.</target>
+
+<source>Source folder %x not found.</source>
+<target>Šaltinio aplankas %x nerastas.</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>Prašome nurodyti aplanką kitoms versijoms.</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>Šie elementai turi neišspręstų konfliktų ir nebus suvienodinti:</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>Sekantys aplankai turi ryškius skirtumus. Prašome patikrinti, ar tikrai teisingi aplankai yra pasirinkti suvienodinimui.</target>
+
+<source>Not enough free disk space available in:</source>
+<target>Nepakanka laisvos disko vietos:</target>
+
+<source>Required:</source>
+<target>Reikia:</target>
+
+<source>Available:</source>
+<target>Pasiekiama:</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>Kai kurie failai bus suvienodinti, keliuse pagrindiniuose aplankuose.</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>Norint išvengti konflikto, reiktų sukurti išskyrimo filtrus, kad kiekvienas atnaujintas failas, būtų priskiriamas tik vienam pagrindiniam aplankui.</target>
+
+<source>Versioning folder:</source>
+<target>Versijų valdymo aplankas:</target>
+
+<source>Base folder:</source>
+<target>Pagrindinis aplankas:</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>Versijų aplankas yra pagrindiniame aplanke.</target>
+
+<source>Synchronizing folder pair:</source>
+<target>Suvienodinama aplankų pora:</target>
+
+<source>Generating database...</source>
+<target>Sukuriama duomenų bazė...</target>
+
+<source>Searching for excess file versions:</source>
+<target>Perviršio failų versijos paieška:</target>
+
+<source>Removing excess file versions:</source>
+<target>Perviršio failų versijos pašąlinimas:</target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>Nepavyko sukurti versijos laiko žymą:</target>
<source>
Unexpected size of data stream.
@@ -292,17 +537,14 @@ Esamas: %y baitai
<source>Operation not supported for different base folder types.</source>
<target>Veiksmas yra nesuderinamas dėl skirtingų aplankų savybių.</target>
-<source>Cannot write file %x.</source>
-<target>Nepavyksta įrašyti failo %x.</target>
-
<source>Cannot move file %x to %y.</source>
<target>Nepavyksta perkelti failo %x į %y.</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>Nepavyko nukopijuoti simbolinės nuorodos %x į %y.</target>
-<source>Unable to connect to %x.</source>
-<target>Nepavyko prisijungti prie %x.</target>
+<source>Error Code %x</source>
+<target>Klaidos kodas %x</target>
<source>Failed to get information about server %x.</source>
<target>Nepavyko gauti informaciją apie serverį %x.</target>
@@ -310,12 +552,6 @@ Esamas: %y baitai
<source>Cannot open directory %x.</source>
<target>Nepavyksta atversti direktorijos %x.</target>
-<source>Cannot read directory %x.</source>
-<target>Negalima nuskaityti katalogo %x.</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>Nepavyko perskaityti failo %x atributų.</target>
-
<source>Cannot create directory %x.</source>
<target>Nepavyksta sukurti katalogo %x.</target>
@@ -343,9 +579,6 @@ Esamas: %y baitai
<source>Cannot find device %x.</source>
<target>Negalima surasti įrenginio %x.</target>
-<source>Cannot open file %x.</source>
-<target>%x failo nepavyko atidaryti.</target>
-
<source>Type of item %x is not supported:</source>
<target>Elemento tipas %x nepalaikomas:</target>
@@ -358,15 +591,9 @@ Esamas: %y baitai
<source>Incorrect command line:</source>
<target>Netaisyklinga Komandinė eilutė:</target>
-<source>Error Code %x</source>
-<target>Klaidos kodas %x</target>
-
<source>The server does not support authentication via %x.</source>
<target>Serveris nepalaiko %x autentifikavimo.</target>
-<source>Required:</source>
-<target>Reikia:</target>
-
<source>Unable to access %x.</source>
<target>Nepavyko prisijungti %x.</target>
@@ -415,125 +642,9 @@ Esamas: %y baitai
<source>%x GB</source>
<target>%x GB</target>
-<source>Cannot load file %x.</source>
-<target>Nepavyksta įkelti failo %x.</target>
-
-<source>Database file %x is incompatible.</source>
-<target>Duomenų bazė %x yra netinkama.</target>
-
-<source>Initial synchronization:</source>
-<target>Pirminis suvienodinimas:</target>
-
-<source>Database file %x does not yet exist.</source>
-<target>Duomenų bazės failo %x dar nėra.</target>
-
-<source>Database file is corrupted:</source>
-<target>Duomenų bazės failas yra sugadintas:</target>
-
-<source>The database files do not yet contain information about the last synchronization.</source>
-<target>Duomenų bazės failas dar neturi informacijos apie paskutinį suvienodinimą.</target>
-
-<source>Loading file %x...</source>
-<target>Įkraunamas failas %x...</target>
-
-<source>Saving file %x...</source>
-<target>Išsaugomas failas %x...</target>
-
-<source>Searching for folder %x...</source>
-<target>Ieškoma aplanko %x...</target>
-
-<source>Timeout while searching for folder %x.</source>
-<target>Laikas baigėsi ieškant %x aplanko.</target>
-
-<source>Cannot get process information.</source>
-<target>Nepavyksta gauti eigos informacijos.</target>
-
-<source>Waiting while directory is locked:</source>
-<target>Laukiama kol katalogas yra užrakintas:</target>
-
-<source>Lock owner:</source>
-<target>Užrakto savininkas:</target>
-
-<source>Detecting abandoned lock...</source>
-<target>Aptiktas paliktas užraktas...</target>
-
-<source>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</source>
-<target>
-<pluralform>%x sekundė</pluralform>
-<pluralform>%x sekundės</pluralform>
-<pluralform>%x sekundžių</pluralform>
-</target>
-
-<source>Items processed:</source>
-<target>Elementų apdorota:</target>
-
-<source>Items remaining:</source>
-<target>Likę elementai:</target>
-
-<source>Total time:</source>
-<target>Visas laikas:</target>
-
-<source>Cleaning up old log files...</source>
-<target>Išvalomi seni žurnalo įrašai...</target>
-
-<source>Error parsing file %x, row %y, column %z.</source>
-<target>Klaida trinant failą %x, eilė %y, stulpelis %z.</target>
-
-<source>Cannot set directory locks for the following folders:</source>
-<target>Negalima užrakinti šiuos aplankus kataloge:</target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-<pluralform>%x srautas</pluralform>
-<pluralform>%x srautai</pluralform>
-<pluralform>%x srautų</pluralform>
-</target>
-
-<source>Scanning:</source>
-<target>Nuskaitoma:</target>
-
-<source>/sec</source>
-<target>/sek.</target>
-
-<source>%x items/sec</source>
-<target>%x elementų/sek.</target>
-
-<source>Show in Explorer</source>
-<target>Rodyti naršyklėje</target>
-
-<source>Open with default application</source>
-<target>Atversti su numatyta programa</target>
-
-<source>Browse directory</source>
-<target>Naršyti katalogą</target>
-
-<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>Duomenų Šešėlinės Kopijos Paslauga nepasiekiama.</target>
-
-<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>Norėdami sukurti sistemos šešėlinę kopiją, prašome baudoti 64-bitų FreeFileSync versiją.</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>Vietos vardo %x nustatyti nepavyko.</target>
-
-<source>Volume name %x is not part of file path %y.</source>
-<target>Vietos vardas %x nėra failo kelio %y dalis.</target>
-
-<source>Unable to create time stamp for versioning:</source>
-<target>Nepavyko sukurti versijos laiko žymą:</target>
-
<source>Drag && drop</source>
<target>Vilkti && Numesti</target>
-<source>Cannot find folder %x.</source>
-<target>Negalima rasti aplanko %x.</target>
-
<source>Select a folder</source>
<target>Pažymėti aplanką</target>
@@ -629,8 +740,8 @@ Komanda inicijuojama jei:
<source>Directory monitoring active</source>
<target>Katalogų stebėjimas yra aktyvus</target>
-<source>Waiting until all directories are available...</source>
-<target>Laukiama kol katalogai bus prieinami...</target>
+<source>Waiting until directory is available:</source>
+<target>Laukiama kol katalogas bus prieinamas:</target>
<source>&Restore</source>
<target>&Atstatyti</target>
@@ -644,114 +755,6 @@ Komanda inicijuojama jei:
<source>&Retry</source>
<target>&Bandyti vėl</target>
-<source>File time and size</source>
-<target>Failo laiką ir dydį</target>
-
-<source>File content</source>
-<target>Failo turinį</target>
-
-<source>File size</source>
-<target>Failo dydis</target>
-
-<source>Two way</source>
-<target>Dvipusis</target>
-
-<source>Mirror</source>
-<target>Identiškas</target>
-
-<source>Update</source>
-<target>Atnaujinti</target>
-
-<source>Custom</source>
-<target>Savitas</target>
-
-<source>Multiple...</source>
-<target>Keletas...</target>
-
-<source>Cannot write file attributes of %x.</source>
-<target>Nepavyksta įrašyti atributų failui %x.</target>
-
-<source>%x and %y have different content.</source>
-<target>%x ir %y turi skirtingą turinį.</target>
-
-<source>Data verification error:</source>
-<target>Duomenų tikrinimo klaida:</target>
-
-<source>Moving file %x to %y</source>
-<target>Perkeliamas failas %x į %y</target>
-
-<source>Moving folder %x to %y</source>
-<target>Perkeliamas aplankas %x į %y</target>
-
-<source>Moving symbolic link %x to %y</source>
-<target>Perkeliama simbolinė nuoroda %x į %y</target>
-
-<source>Removing old versions...</source>
-<target>Šalinamos senos versijos...</target>
-
-<source>Updating file %x</source>
-<target>Atnaujinamas failas %x</target>
-
-<source>Updating symbolic link %x</source>
-<target>Atnaujinama virtuali nuoroda %x</target>
-
-<source>Verifying file %x</source>
-<target>Tikrinamas failas %x</target>
-
-<source>Updating attributes of %x</source>
-<target>Atnaujinami atributai %x</target>
-
-<source>Source item %x not found</source>
-<target>Šaltinio elementas %x nerastas:</target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>%x kuriamas Duomenų Šešėlinė Kopija...</target>
-
-<source>Target folder %x already existing.</source>
-<target>Tikslo aplankas %x jau yra.</target>
-
-<source>Target folder input field must not be empty.</source>
-<target>Tikslo aplanko įvesties laukas negali būti tuščias.</target>
-
-<source>Source folder %x not found.</source>
-<target>Šaltinio aplankas %x nerastas.</target>
-
-<source>Please enter a target folder for versioning.</source>
-<target>Prašome nurodyti aplanką kitoms versijoms.</target>
-
-<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>Šie elementai turi neišspręstų konfliktų ir nebus suvienodinti:</target>
-
-<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>Sekantys aplankai turi ryškius skirtumus. Prašome patikrinti, ar tikrai teisingi aplankai yra pasirinkti suvienodinimui.</target>
-
-<source>Not enough free disk space available in:</source>
-<target>Nepakanka laisvos disko vietos:</target>
-
-<source>Available:</source>
-<target>Pasiekiama:</target>
-
-<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>Kai kurie failai bus suvienodinti, keliuse pagrindiniuose aplankuose.</target>
-
-<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>Norint išvengti konflikto, reiktų sukurti išskyrimo filtrus, kad kiekvienas atnaujintas failas, būtų priskiriamas tik vienam pagrindiniam aplankui.</target>
-
-<source>Versioning folder:</source>
-<target>Versijų valdymo aplankas:</target>
-
-<source>Base folder:</source>
-<target>Pagrindinis aplankas:</target>
-
-<source>The versioning folder is contained in a base folder.</source>
-<target>Versijų aplankas yra pagrindiniame aplanke.</target>
-
-<source>Synchronizing folder pair:</source>
-<target>Suvienodinama aplankų pora:</target>
-
-<source>Generating database...</source>
-<target>Sukuriama duomenų bazė...</target>
-
<source>Loading...</source>
<target>Įkraunama...</target>
@@ -897,6 +900,9 @@ Komanda inicijuojama jei:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>Prašome pasirinkti aplanką vietinėje failų sistemoje, tinkle arba MTP įrenginyje.</target>
+<source>Defined by context of use</source>
+<target>Apibūdintas pagal naudojamą kontekstą</target>
+
<source>Requires FreeFileSync Donation Edition</source>
<target>Reikalinga FreeFileSync Donoro Versija</target>
@@ -1068,8 +1074,8 @@ Komanda inicijuojama jei:
<source>Show examples</source>
<target>Rodyti pavyzdžius</target>
-<source>Time span:</source>
-<target>Laiko atkarpa:</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>Pasirinkti filtro taisykles norint išskirti pasirinktus failus iš Suvienodinimo. Įveskite failo kelią, kuris atitinka aplanką.</target>
<source>File size:</source>
<target>Failo dydis:</target>
@@ -1080,8 +1086,8 @@ Komanda inicijuojama jei:
<source>Maximum:</source>
<target>Didžiausias:</target>
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target>Pasirinkti filtro taisykles norint išskirti pasirinktus failus iš Suvienodinimo. Įveskite failo kelią, kuris atitinka aplanką.</target>
+<source>Time span:</source>
+<target>Laiko atkarpa:</target>
<source>C&lear</source>
<target>&Išvalyti</target>
@@ -1112,9 +1118,18 @@ Komanda inicijuojama jei:
<source>&Versioning</source>
<target>&Atsarginės versijos kūrimas</target>
+<source>Move files to a user-defined folder</source>
+<target>Perkelti failus į vartotojo nustatytą katalogą</target>
+
<source>Naming convention:</source>
<target>Pavadinimų taisyklės:</target>
+<source>Limit file versions:</source>
+<target>Failų versijos riba:</target>
+
+<source>Last x days:</source>
+<target>Paskutinių x dienų:</target>
+
<source>Ignore errors</source>
<target>Ignoruoti klaidas</target>
@@ -1256,11 +1271,8 @@ Komanda inicijuojama jei:
<source>Save log:</source>
<target>Išsaugoti žurnalą:</target>
-<source>Limit:</source>
-<target>Ribos:</target>
-
-<source>Limit maximum number of log files</source>
-<target>Apriboti ataskaitų failų skaičių</target>
+<source>Limit number of log files:</source>
+<target>Žurnalinių failų riba:</target>
<source>How can I schedule a batch job?</source>
<target>Kaip aš galiu užduočių paketą įtraukti į tvarkaraštį?</target>
@@ -1295,9 +1307,6 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Transfer file and folder permissions.</source>
<target>Failų ir aplankų perkėlimo leidimai.</target>
-<source>Show hidden dialogs again</source>
-<target>Vėl rodyti paslėptus dialogo langus</target>
-
<source>Show all permanently hidden dialogs and warning messages again</source>
<target>Vėl rodyti visus paslėptus dialogo langus ir įspėjamuosius pranešimus</target>
@@ -1388,9 +1397,6 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Select Time Span</source>
<target>Pasirinkti laiko atkarpą</target>
-<source>FreeFileSync Donation Edition</source>
-<target>FreeFileSync Donoro Versija</target>
-
<source>Highlight Configurations</source>
<target>Pažymėti Nustatymus</target>
@@ -1518,6 +1524,9 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Select time span...</source>
<target>Pasirinkti laiko tarpą...</target>
+<source>Donation Edition</source>
+<target>Donoro Versija</target>
+
<source>Folder Comparison and Synchronization</source>
<target>Aplankų Palyginimas ir Suvienodinimas</target>
@@ -1719,6 +1728,12 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Parameters for opposite side</source>
<target>Parametrai priešingai pusei</target>
+<source>Show hidden dialogs again</source>
+<target>Vėl rodyti paslėptus dialogo langus</target>
+
+<source>All dialogs shown</source>
+<target>Rodomi visi dialogai</target>
+
<source>Downloading update...</source>
<target>Siunčiamas atanujinimas...</target>
@@ -1758,9 +1773,6 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>This year</source>
<target>Šie metai</target>
-<source>Last x days</source>
-<target>Paskutinės x dienos</target>
-
<source>Byte</source>
<target>Baitai</target>
@@ -1776,9 +1788,6 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Delete and overwrite files permanently</source>
<target>Ištrinti ir perrašyti failus negrįžtamai</target>
-<source>Move files to a user-defined folder</source>
-<target>Perkelti failus į vartotojo nustatytą katalogą</target>
-
<source>Replace</source>
<target>Pakeisti</target>
@@ -1788,6 +1797,12 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Time stamp</source>
<target>Laiko žymė</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>Perkelti failus į poaplankį su laiko žyme</target>
+
+<source>File</source>
+<target>Failas</target>
+
<source>Append a time stamp to each file name</source>
<target>Pridėti laiko žymę prie kiekvieno failo pavadinimo</target>
@@ -1809,12 +1824,12 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Leave as unresolved conflict</source>
<target>Palikti kaip neišpręstą konfliktą</target>
-<source>File</source>
-<target>Failas</target>
-
<source>YYYY-MM-DD hhmmss</source>
<target>YYYY-MM-DD hhmmss</target>
+<source>Minimum version count must be smaller than maximum count.</source>
+<target>Minimalus versijų skaičius turi būti mažesnis, nei maksimalus skaičius.</target>
+
<source>Files</source>
<target>Failai</target>
@@ -1964,8 +1979,8 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Portable</source>
<target>Nešiojamas</target>
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>Išsaugoti nustatymus į "%APPDATA%\FreeFileSync"</target>
+<source>Save settings in %x</source>
+<target>Išsaugoti parametrus %x</target>
<source>Register FreeFileSync file extensions</source>
<target>Įrašyti FreeFileSync failų plėtinius</target>
diff --git a/FreeFileSync/Build/Languages/norwegian.lng b/FreeFileSync/Build/Languages/norwegian.lng
index 5f806a08..1a82aa13 100755
--- a/FreeFileSync/Build/Languages/norwegian.lng
+++ b/FreeFileSync/Build/Languages/norwegian.lng
@@ -7,9 +7,6 @@
<plural_definition>n == 1 ? 0 : 1</plural_definition>
</header>
-<source>Defined by context of use</source>
-<target></target>
-
<source>Both sides have changed since last synchronization.</source>
<target>Begge sider er endret siden siste synkronisering.</target>
@@ -118,11 +115,20 @@
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
<target>Installasjonsfilene er ødelagte. Installer FreeFileSync på nytt.</target>
+<source>Cannot load file %x.</source>
+<target>Kan ikke lese filen %x.</target>
+
<source>Cannot find the following folders:</source>
<target>Kan ikke finne følgende mapper:</target>
-<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>Hvis denne feilen blir ignorert vil mappene bli vurdert som tomme. Manglende mapper opprettes automatisk ved behov.</target>
+<source>The following folders do not yet exist:</source>
+<target>Følgende mapper eksisterer ikke:</target>
+
+<source>The folders are created automatically when needed.</source>
+<target>Mappene blir opprettet automatisk når det trengs.</target>
+
+<source>Scanning:</source>
+<target>Skanner:</target>
<source>Comparison finished:</source>
<target>Sammenligning ferdig:</target>
@@ -217,6 +223,63 @@
<source>Out of memory.</source>
<target>Ikke nok minne.</target>
+<source>Database file %x is incompatible.</source>
+<target>Databasefilen %x er inkompatibel.</target>
+
+<source>Initial synchronization:</source>
+<target>Første synkronisering:</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>Databasefilen %x finnes ikke ennå.</target>
+
+<source>Database file is corrupted:</source>
+<target>Databasefilen er skadet:</target>
+
+<source>Cannot write file %x.</source>
+<target>Kan ikke opprette filen %x.</target>
+
+<source>Cannot read file %x.</source>
+<target>Kan ikke lese filen %x.</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>Databasefilene inneholder ennå ikke informasjon om siste synkronisering.</target>
+
+<source>Loading file %x...</source>
+<target>Laster fil %x ...</target>
+
+<source>Saving file %x...</source>
+<target>Lagrer filen %x...</target>
+
+<source>Searching for folder %x...</source>
+<target>Søker etter mappen %x...</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>Timeout mens du søker etter mappe %x.</target>
+
+<source>Cannot get process information.</source>
+<target>Kan ikke hente bearbeidings-informasjon.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Kan ikke lese filattributterne på %x.</target>
+
+<source>Waiting while directory is locked:</source>
+<target>Venter mens katalogen låses:</target>
+
+<source>Lock owner:</source>
+<target>Lås eier:</target>
+
+<source>Detecting abandoned lock...</source>
+<target>Finner etterlatt lås...</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 sek</pluralform>
+<pluralform>%x sek</pluralform>
+</target>
+
<source>Item exists on left side only</source>
<target>Elementet finnes kun på venstre side</target>
@@ -271,8 +334,188 @@
<source>Update attributes on right</source>
<target>Oppdater attributter til høyre</target>
-<source>Cannot read file %x.</source>
-<target>Kan ikke lese filen %x.</target>
+<source>Items processed:</source>
+<target>Elementer behandlet:</target>
+
+<source>Items remaining:</source>
+<target>Gjenstående elementer:</target>
+
+<source>Total time:</source>
+<target>Samlet tid:</target>
+
+<source>Cleaning up log files:</source>
+<target>Sletter loggfiler:</target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>Behandlingsfeil i filen %x, rad %y, kolonne %z.</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>Kan ikke angi kataloglås for følgende mapper:</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>1 tråd</pluralform>
+<pluralform>%x tråder</pluralform>
+</target>
+
+<source>Cannot read directory %x.</source>
+<target>Kan ikke lese katalogen %x.</target>
+
+<source>/sec</source>
+<target>/sek</target>
+
+<source>%x items/sec</source>
+<target>%x elementer/sek</target>
+
+<source>Show in Explorer</source>
+<target>Vis i Explorer</target>
+
+<source>Open with default application</source>
+<target>Åpne med standardprogrammet</target>
+
+<source>Browse directory</source>
+<target>Bla i katalogen</target>
+
+<source>Unable to connect to %x.</source>
+<target>Kan ikke koble til %x.</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>Volume Shadow Copy-tjenesten er ikke tilgjengelig.</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>Kjør 64-bits versjonen av FreeFileSync for å lage skyggekopier på dette systemet.</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>Kan ikke bestemme volumnavn til %x.</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>Volumnavnet %x er ikke en del av filstien %y.</target>
+
+<source>File time and size</source>
+<target>Størrelse og tid</target>
+
+<source>File content</source>
+<target>Fil-innhold</target>
+
+<source>File size</source>
+<target>Filstørrelse</target>
+
+<source>Two way</source>
+<target>Toveis</target>
+
+<source>Mirror</source>
+<target>Speiling</target>
+
+<source>Update</source>
+<target>Oppdater</target>
+
+<source>Custom</source>
+<target>Tilpasset</target>
+
+<source>Multiple...</source>
+<target>Flere...</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>Kan ikke skrive filattributter til %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Kan ikke åpne filen %x.</target>
+
+<source>%x and %y have different content.</source>
+<target>%x og %y har forskjellig innhold.</target>
+
+<source>Data verification error:</source>
+<target>Data verifikasjons-feil:</target>
+
+<source>Moving file %x to %y</source>
+<target>Flytter filen %x til %y</target>
+
+<source>Moving folder %x to %y</source>
+<target>Flytter mappen %x til %y</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>Flytter symbolsk forbindelsen %x til %y</target>
+
+<source>Updating file %x</source>
+<target>Oppdaterer fil %x</target>
+
+<source>Updating symbolic link %x</source>
+<target>Oppdaterer symbolsk forbindelse %x</target>
+
+<source>Verifying file %x</source>
+<target>Verifiserer filen %x</target>
+
+<source>Updating attributes of %x</source>
+<target>Oppdaterer attributter for %x</target>
+
+<source>Source item %x not found</source>
+<target>Kildeelementet %x ikke funnet</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>Oppretter en Volume Shadow-kopi for %x...</target>
+
+<source>Cannot find folder %x.</source>
+<target>Finner ikke mappen %x.</target>
+
+<source>Target folder %x already existing.</source>
+<target>Målmappen %x finnes allerede.</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>Målmappens datafelt må ikke være tomt.</target>
+
+<source>Source folder %x not found.</source>
+<target>Kildemappen %x ble ikke funnet.</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>Angi en målmappe til versjonen.</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>Følgende elementer har uløste konflikter og vil ikke bli synkroniserete:</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>Følgende mapper er vesentlig forskjellige. Kontroller at de riktige mappene er valgt for synkronisering.</target>
+
+<source>Not enough free disk space available in:</source>
+<target>Ikke nok ledig diskplass på:</target>
+
+<source>Required:</source>
+<target>Krav:</target>
+
+<source>Available:</source>
+<target>Tilgjengelig:</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>Noen filer vil bli synkronisert som en del av flere basemapper.</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>For å unngå konflikter, sett opp utelukkelsesfiltre, slik at hver oppdaterte fil regnes av bare én basemappe.</target>
+
+<source>Versioning folder:</source>
+<target>Versjonsmappe:</target>
+
+<source>Base folder:</source>
+<target>Basemappe:</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>Versjonsmappen er plassert i en basismappe.</target>
+
+<source>Synchronizing folder pair:</source>
+<target>Synkroniserer mappepar:</target>
+
+<source>Generating database...</source>
+<target>Lager database...</target>
+
+<source>Searching for excess file versions:</source>
+<target>Søker etter overskytende filversjoner:</target>
+
+<source>Removing excess file versions:</source>
+<target>Fjerne overskytende filversjoner:</target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>Kan ikke opprette tidsstempel til versjonen:</target>
<source>
Unexpected size of data stream.
@@ -291,17 +534,14 @@ Faktisk: %y bytes
<source>Operation not supported for different base folder types.</source>
<target>Operasjonen støttes ikke for ulike typer basismapper.</target>
-<source>Cannot write file %x.</source>
-<target>Kan ikke opprette filen %x.</target>
-
<source>Cannot move file %x to %y.</source>
<target>Kan ikke flytte filen %x til %y.</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>Kan ikke kopiere symbolsk forbindelse %x til %y.</target>
-<source>Unable to connect to %x.</source>
-<target>Kan ikke koble til %x.</target>
+<source>Error Code %x</source>
+<target>Feilkode %x</target>
<source>Failed to get information about server %x.</source>
<target>Kunne ikke få informasjon om server %x.</target>
@@ -309,12 +549,6 @@ Faktisk: %y bytes
<source>Cannot open directory %x.</source>
<target>Kan ikke åpne katalog %x.</target>
-<source>Cannot read directory %x.</source>
-<target>Kan ikke lese katalogen %x.</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>Kan ikke lese filattributterne på %x.</target>
-
<source>Cannot create directory %x.</source>
<target>Kan ikke lage katalog %x.</target>
@@ -342,9 +576,6 @@ Faktisk: %y bytes
<source>Cannot find device %x.</source>
<target>Kan ikke finne enhet %x.</target>
-<source>Cannot open file %x.</source>
-<target>Kan ikke åpne filen %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Elementtypen %x støttes ikke:</target>
@@ -357,15 +588,9 @@ Faktisk: %y bytes
<source>Incorrect command line:</source>
<target>Ugyldig kommando:</target>
-<source>Error Code %x</source>
-<target>Feilkode %x</target>
-
<source>The server does not support authentication via %x.</source>
<target>Tjeneren støtter ikke autentisering via %x.</target>
-<source>Required:</source>
-<target>Krav:</target>
-
<source>Unable to access %x.</source>
<target>Får ikke tilgang til %x.</target>
@@ -411,123 +636,9 @@ Faktisk: %y bytes
<source>%x GB</source>
<target>%x GB</target>
-<source>Cannot load file %x.</source>
-<target>Kan ikke lese filen %x.</target>
-
-<source>Database file %x is incompatible.</source>
-<target>Databasefilen %x er inkompatibel.</target>
-
-<source>Initial synchronization:</source>
-<target>Første synkronisering:</target>
-
-<source>Database file %x does not yet exist.</source>
-<target>Databasefilen %x finnes ikke ennå.</target>
-
-<source>Database file is corrupted:</source>
-<target>Databasefilen er skadet:</target>
-
-<source>The database files do not yet contain information about the last synchronization.</source>
-<target>Databasefilene inneholder ennå ikke informasjon om siste synkronisering.</target>
-
-<source>Loading file %x...</source>
-<target>Laster fil %x ...</target>
-
-<source>Saving file %x...</source>
-<target>Lagrer filen %x...</target>
-
-<source>Searching for folder %x...</source>
-<target>Søker etter mappen %x...</target>
-
-<source>Timeout while searching for folder %x.</source>
-<target>Timeout mens du søker etter mappe %x.</target>
-
-<source>Cannot get process information.</source>
-<target>Kan ikke hente bearbeidings-informasjon.</target>
-
-<source>Waiting while directory is locked:</source>
-<target>Venter mens katalogen låses:</target>
-
-<source>Lock owner:</source>
-<target>Lås eier:</target>
-
-<source>Detecting abandoned lock...</source>
-<target>Finner etterlatt lås...</target>
-
-<source>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</source>
-<target>
-<pluralform>1 sek</pluralform>
-<pluralform>%x sek</pluralform>
-</target>
-
-<source>Items processed:</source>
-<target>Elementer behandlet:</target>
-
-<source>Items remaining:</source>
-<target>Gjenstående elementer:</target>
-
-<source>Total time:</source>
-<target>Samlet tid:</target>
-
-<source>Cleaning up old log files...</source>
-<target>Fjerner gamle loggfiler...</target>
-
-<source>Error parsing file %x, row %y, column %z.</source>
-<target>Behandlingsfeil i filen %x, rad %y, kolonne %z.</target>
-
-<source>Cannot set directory locks for the following folders:</source>
-<target>Kan ikke angi kataloglås for følgende mapper:</target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-<pluralform>1 tråd</pluralform>
-<pluralform>%x tråder</pluralform>
-</target>
-
-<source>Scanning:</source>
-<target>Skanner:</target>
-
-<source>/sec</source>
-<target>/sek</target>
-
-<source>%x items/sec</source>
-<target>%x elementer/sek</target>
-
-<source>Show in Explorer</source>
-<target>Vis i Explorer</target>
-
-<source>Open with default application</source>
-<target>Åpne med standardprogrammet</target>
-
-<source>Browse directory</source>
-<target>Bla i katalogen</target>
-
-<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>Volume Shadow Copy-tjenesten er ikke tilgjengelig.</target>
-
-<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>Kjør 64-bits versjonen av FreeFileSync for å lage skyggekopier på dette systemet.</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>Kan ikke bestemme volumnavn til %x.</target>
-
-<source>Volume name %x is not part of file path %y.</source>
-<target>Volumnavnet %x er ikke en del av filstien %y.</target>
-
-<source>Unable to create time stamp for versioning:</source>
-<target>Kan ikke opprette tidsstempel til versjonen:</target>
-
<source>Drag && drop</source>
<target>Dra && slipp</target>
-<source>Cannot find folder %x.</source>
-<target>Finner ikke mappen %x.</target>
-
<source>Select a folder</source>
<target>Velg en mappe</target>
@@ -623,8 +734,8 @@ Kommandoen utføres hvis:
<source>Directory monitoring active</source>
<target>Katalog-overvåkning er aktiv</target>
-<source>Waiting until all directories are available...</source>
-<target>Venter til alle mapper er tilgjengelige...</target>
+<source>Waiting until directory is available:</source>
+<target>Venter til katalogen er tilgjengelig:</target>
<source>&Restore</source>
<target>&Gjenopprett</target>
@@ -638,114 +749,6 @@ Kommandoen utføres hvis:
<source>&Retry</source>
<target>&Prøv igjen</target>
-<source>File time and size</source>
-<target>Størrelse og tid</target>
-
-<source>File content</source>
-<target>Fil-innhold</target>
-
-<source>File size</source>
-<target>Filstørrelse</target>
-
-<source>Two way</source>
-<target>Toveis</target>
-
-<source>Mirror</source>
-<target>Speiling</target>
-
-<source>Update</source>
-<target>Oppdater</target>
-
-<source>Custom</source>
-<target>Tilpasset</target>
-
-<source>Multiple...</source>
-<target>Flere...</target>
-
-<source>Cannot write file attributes of %x.</source>
-<target>Kan ikke skrive filattributter til %x.</target>
-
-<source>%x and %y have different content.</source>
-<target>%x og %y har forskjellig innhold.</target>
-
-<source>Data verification error:</source>
-<target>Data verifikasjons-feil:</target>
-
-<source>Moving file %x to %y</source>
-<target>Flytter filen %x til %y</target>
-
-<source>Moving folder %x to %y</source>
-<target>Flytter mappen %x til %y</target>
-
-<source>Moving symbolic link %x to %y</source>
-<target>Flytter symbolsk forbindelsen %x til %y</target>
-
-<source>Removing old versions...</source>
-<target>Fjerner gamle versjoner...</target>
-
-<source>Updating file %x</source>
-<target>Oppdaterer fil %x</target>
-
-<source>Updating symbolic link %x</source>
-<target>Oppdaterer symbolsk forbindelse %x</target>
-
-<source>Verifying file %x</source>
-<target>Verifiserer filen %x</target>
-
-<source>Updating attributes of %x</source>
-<target>Oppdaterer attributter for %x</target>
-
-<source>Source item %x not found</source>
-<target>Kildeelementet %x ikke funnet</target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>Oppretter en Volume Shadow-kopi for %x...</target>
-
-<source>Target folder %x already existing.</source>
-<target>Målmappen %x finnes allerede.</target>
-
-<source>Target folder input field must not be empty.</source>
-<target>Målmappens datafelt må ikke være tomt.</target>
-
-<source>Source folder %x not found.</source>
-<target>Kildemappen %x ble ikke funnet.</target>
-
-<source>Please enter a target folder for versioning.</source>
-<target>Angi en målmappe til versjonen.</target>
-
-<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>Følgende elementer har uløste konflikter og vil ikke bli synkroniserete:</target>
-
-<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>Følgende mapper er vesentlig forskjellige. Kontroller at de riktige mappene er valgt for synkronisering.</target>
-
-<source>Not enough free disk space available in:</source>
-<target>Ikke nok ledig diskplass på:</target>
-
-<source>Available:</source>
-<target>Tilgjengelig:</target>
-
-<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>Noen filer vil bli synkronisert som en del av flere basemapper.</target>
-
-<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>For å unngå konflikter, sett opp utelukkelsesfiltre, slik at hver oppdaterte fil regnes av bare én basemappe.</target>
-
-<source>Versioning folder:</source>
-<target>Versjonsmappe:</target>
-
-<source>Base folder:</source>
-<target>Basemappe:</target>
-
-<source>The versioning folder is contained in a base folder.</source>
-<target>Versjonsmappen er plassert i en basismappe.</target>
-
-<source>Synchronizing folder pair:</source>
-<target>Synkroniserer mappepar:</target>
-
-<source>Generating database...</source>
-<target>Lager database...</target>
-
<source>Loading...</source>
<target>Laster...</target>
@@ -890,6 +893,9 @@ Kommandoen utføres hvis:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>Velg en mappe på lokalt filsystem, nettverk eller på en MTP-enhet.</target>
+<source>Defined by context of use</source>
+<target>Definert etter brukskontekst</target>
+
<source>Requires FreeFileSync Donation Edition</source>
<target>Behøver FreeFileSync Donation Edition</target>
@@ -1061,8 +1067,8 @@ Kommandoen utføres hvis:
<source>Show examples</source>
<target>Vis eksempler</target>
-<source>Time span:</source>
-<target>Intervall:</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>Velg filter-regler for å utelate bestemte filer fra synkroniseringen. Skriv inn filstier tilknyttet de tilhørende mappeparene.</target>
<source>File size:</source>
<target>Filstørrelse:</target>
@@ -1073,8 +1079,8 @@ Kommandoen utføres hvis:
<source>Maximum:</source>
<target>Maksimum:</target>
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target>Velg filter-regler for å utelate bestemte filer fra synkroniseringen. Skriv inn filstier tilknyttet de tilhørende mappeparene.</target>
+<source>Time span:</source>
+<target>Intervall:</target>
<source>C&lear</source>
<target>F&jern</target>
@@ -1105,9 +1111,18 @@ Kommandoen utføres hvis:
<source>&Versioning</source>
<target>&Versjons</target>
+<source>Move files to a user-defined folder</source>
+<target>Flytt filer til en brukerdefinert mappe</target>
+
<source>Naming convention:</source>
<target>Navne-regler:</target>
+<source>Limit file versions:</source>
+<target>Begrens filversjoner:</target>
+
+<source>Last x days:</source>
+<target>Siste x dager:</target>
+
<source>Ignore errors</source>
<target>Ignorér feil</target>
@@ -1249,11 +1264,8 @@ Kommandoen utføres hvis:
<source>Save log:</source>
<target>Lagre logg:</target>
-<source>Limit:</source>
-<target>Grense:</target>
-
-<source>Limit maximum number of log files</source>
-<target>Begrens antall rapporter</target>
+<source>Limit number of log files:</source>
+<target>Begrens antall loggfiler:</target>
<source>How can I schedule a batch job?</source>
<target>Hvordan kan jeg lage en batchfil ?</target>
@@ -1288,9 +1300,6 @@ Sikrer prosessen ved alvorlige feil.
<source>Transfer file and folder permissions.</source>
<target>Overfør fil- og mappe-tillatelser.</target>
-<source>Show hidden dialogs again</source>
-<target>Vis skjulte vinduer igjen</target>
-
<source>Show all permanently hidden dialogs and warning messages again</source>
<target>Vis alle skjulte vinduer og advarsler igjen</target>
@@ -1381,9 +1390,6 @@ Sikrer prosessen ved alvorlige feil.
<source>Select Time Span</source>
<target>Velg tids-intervall</target>
-<source>FreeFileSync Donation Edition</source>
-<target>FreeFileSync Donation Edition</target>
-
<source>Highlight Configurations</source>
<target>Uthev konfigurasjoner</target>
@@ -1507,6 +1513,9 @@ Sikrer prosessen ved alvorlige feil.
<source>Select time span...</source>
<target>Velg tidsinterval...</target>
+<source>Donation Edition</source>
+<target>Donasjon-utgave</target>
+
<source>Folder Comparison and Synchronization</source>
<target>Mappe-sammenligning og synkronisering</target>
@@ -1705,6 +1714,12 @@ Sikrer prosessen ved alvorlige feil.
<source>Parameters for opposite side</source>
<target>Parametere for motsatt side</target>
+<source>Show hidden dialogs again</source>
+<target>Vis skjulte vinduer igjen</target>
+
+<source>All dialogs shown</source>
+<target>Alle dialoger vises</target>
+
<source>Downloading update...</source>
<target>Laster ned oppdatering...</target>
@@ -1744,9 +1759,6 @@ Sikrer prosessen ved alvorlige feil.
<source>This year</source>
<target>Dette år</target>
-<source>Last x days</source>
-<target>Siste x dager</target>
-
<source>Byte</source>
<target>Byte</target>
@@ -1762,9 +1774,6 @@ Sikrer prosessen ved alvorlige feil.
<source>Delete and overwrite files permanently</source>
<target>Slett og overskriv filer permanent</target>
-<source>Move files to a user-defined folder</source>
-<target>Flytt filer til en brukerdefinert mappe</target>
-
<source>Replace</source>
<target>Erstatt</target>
@@ -1774,6 +1783,12 @@ Sikrer prosessen ved alvorlige feil.
<source>Time stamp</source>
<target>Tidsstempel</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>Flytt filer til en tidsstemplet undermappe</target>
+
+<source>File</source>
+<target>Fil</target>
+
<source>Append a time stamp to each file name</source>
<target>Legg til tidsstempel til hvert filnavn</target>
@@ -1795,12 +1810,12 @@ Sikrer prosessen ved alvorlige feil.
<source>Leave as unresolved conflict</source>
<target>Etterlat som uløst konflikt</target>
-<source>File</source>
-<target>Fil</target>
-
<source>YYYY-MM-DD hhmmss</source>
<target>ÅÅÅÅ-MM-DD ttmmss</target>
+<source>Minimum version count must be smaller than maximum count.</source>
+<target>Minimumversjons-tellingen må være mindre enn maksimumstellingen.</target>
+
<source>Files</source>
<target>Filer</target>
@@ -1948,8 +1963,8 @@ Sikrer prosessen ved alvorlige feil.
<source>Portable</source>
<target>Portabel</target>
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>Lagre innstillinger til "%APPDATA%\FreeFileSync"</target>
+<source>Save settings in %x</source>
+<target>Lagre innstillinger i %x</target>
<source>Register FreeFileSync file extensions</source>
<target>Registrér FreeFileSync's filendelser</target>
diff --git a/FreeFileSync/Build/Languages/polish.lng b/FreeFileSync/Build/Languages/polish.lng
index e31c349d..72e1a41a 100755
--- a/FreeFileSync/Build/Languages/polish.lng
+++ b/FreeFileSync/Build/Languages/polish.lng
@@ -115,11 +115,20 @@
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
<target>Pliki instalacyjne są uszkodzone. Przeinstaluj program FreeFileSync.</target>
+<source>Cannot load file %x.</source>
+<target>Nie można wczytać pliku %x.</target>
+
<source>Cannot find the following folders:</source>
<target>Nie można znaleźć następujących katalogów:</target>
-<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>Jeżeli ten błąd zostanie zignorowany, katalogi zostaną uznane za puste. Brakujące katalogi będą w razie potrzeby utworzone automatycznie.</target>
+<source>The following folders do not yet exist:</source>
+<target>Następujące katalogi jeszcze nie istnieją:</target>
+
+<source>The folders are created automatically when needed.</source>
+<target>Katalogi są tworzone automatycznie w razie potrzeby.</target>
+
+<source>Scanning:</source>
+<target>Skanowanie:</target>
<source>Comparison finished:</source>
<target>Porównywanie zakończone:</target>
@@ -215,6 +224,64 @@
<source>Out of memory.</source>
<target>Brak wolnej pamięci.</target>
+<source>Database file %x is incompatible.</source>
+<target>Plik bazy danych %x nie jest kompatybilny.</target>
+
+<source>Initial synchronization:</source>
+<target>Wstępna synchronizacja:</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>Plik bazy danych %x nie istnieje.</target>
+
+<source>Database file is corrupted:</source>
+<target>Plik bazy danych jest uszkodzony:</target>
+
+<source>Cannot write file %x.</source>
+<target>Nie można zapisać pliku %x.</target>
+
+<source>Cannot read file %x.</source>
+<target>Nie można odczytać pliku %x.</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>Pliki bazy danych nie posiadają żadnych informacji o ostatniej synchronizacji.</target>
+
+<source>Loading file %x...</source>
+<target>Wczytywanie pliku %x...</target>
+
+<source>Saving file %x...</source>
+<target>Zapisywanie pliku %x...</target>
+
+<source>Searching for folder %x...</source>
+<target>Wyszukiwanie katalogu %x...</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>Przekroczono czas oczekiwania podczas szukania katalogu %x.</target>
+
+<source>Cannot get process information.</source>
+<target>Nie można uzyskać informacji dla procesu.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Nie można odczytać atrybutów pliku %x.</target>
+
+<source>Waiting while directory is locked:</source>
+<target>Oczekiwanie przez blokadę katalogu:</target>
+
+<source>Lock owner:</source>
+<target>Właściciel blokady:</target>
+
+<source>Detecting abandoned lock...</source>
+<target>Wykrywanie nieaktywnej blokady...</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 sekunda</pluralform>
+<pluralform>%x sekundy</pluralform>
+<pluralform>%x sekund</pluralform>
+</target>
+
<source>Item exists on left side only</source>
<target>Element istnieje tylko po lewej stronie</target>
@@ -269,8 +336,189 @@
<source>Update attributes on right</source>
<target>Aktualizuj atrybuty po prawej stronie</target>
-<source>Cannot read file %x.</source>
-<target>Nie można odczytać pliku %x.</target>
+<source>Items processed:</source>
+<target>Przetworzone elementy:</target>
+
+<source>Items remaining:</source>
+<target>Pozostałe elementy:</target>
+
+<source>Total time:</source>
+<target>Całkowity czas:</target>
+
+<source>Cleaning up log files:</source>
+<target>Czyszczenie plików logów:</target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>Błąd podczas parsowania pliku %x, rząd %y, kolumna %z.</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>Nie można zablokować katalogów dla poniższych folderów:</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>1 wątek</pluralform>
+<pluralform>%x wątki</pluralform>
+<pluralform>%x wątków</pluralform>
+</target>
+
+<source>Cannot read directory %x.</source>
+<target>Nie można odczytać katalogu %x.</target>
+
+<source>/sec</source>
+<target>/sekundę</target>
+
+<source>%x items/sec</source>
+<target>%x elementów/sek</target>
+
+<source>Show in Explorer</source>
+<target>Wyświetl w Eksploratorze</target>
+
+<source>Open with default application</source>
+<target>Otwórz za pomocą domyślnej aplikacji</target>
+
+<source>Browse directory</source>
+<target>Przeglądaj katalog</target>
+
+<source>Unable to connect to %x.</source>
+<target>Błąd połączenia do %x.</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>Nie można uzyskać dostępu do usługi Volume Shadow Copy.</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>Uruchom 64-bitową wersję FreeFileSync aby utworzyć Shadow Copies w tym systemie.</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>Nie można określić nazwy dysku dla %x.</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>Nazwa wolumenu %x nie jest częścią ścieżki %y.</target>
+
+<source>File time and size</source>
+<target>Czas modyfikacji i rozmiar</target>
+
+<source>File content</source>
+<target>Zawartość pliku</target>
+
+<source>File size</source>
+<target>Rozmiar pliku</target>
+
+<source>Two way</source>
+<target>Obustronna</target>
+
+<source>Mirror</source>
+<target>Lustrzana</target>
+
+<source>Update</source>
+<target>Uaktualnij</target>
+
+<source>Custom</source>
+<target>Własne</target>
+
+<source>Multiple...</source>
+<target>Wiele...</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>Nie można zapisać atrybutów %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Nie można otworzyć pliku %x.</target>
+
+<source>%x and %y have different content.</source>
+<target>%x i %y mają różną zawartość.</target>
+
+<source>Data verification error:</source>
+<target>Błąd weryfikacji danych:</target>
+
+<source>Moving file %x to %y</source>
+<target>Przenoszenie pliku %x do %y</target>
+
+<source>Moving folder %x to %y</source>
+<target>Przenoszenie katalogu %x do %y</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>Przenoszenie dowiązania symbolicznego %x do %y</target>
+
+<source>Updating file %x</source>
+<target>Aktualizowanie pliku %x</target>
+
+<source>Updating symbolic link %x</source>
+<target>Aktualizowanie dowiązania symbolicznego %x</target>
+
+<source>Verifying file %x</source>
+<target>Weryfikowanie pliku %x</target>
+
+<source>Updating attributes of %x</source>
+<target>Aktualizowanie atrybutów %x</target>
+
+<source>Source item %x not found</source>
+<target>Nie znaleziono elementu źródłowego %x</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>Tworzenie Volume Shadow Copy dla %x...</target>
+
+<source>Cannot find folder %x.</source>
+<target>Nie można znaleźć katalogu %x.</target>
+
+<source>Target folder %x already existing.</source>
+<target>Katalog docelowy %x już istnieje.</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>Pole katalogu docelowego nie może być puste.</target>
+
+<source>Source folder %x not found.</source>
+<target>Nie znaleziono katalogu źródłowego %x.</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>Określ katalog docelowy do wersjonowania.</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>Te elementy znajdują się w konflikcie, którego nie można rozwiązać. Pliki nie zostaną zsynchronizowane:</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>Poniższe katalogi znacząco się różnią. Zweryfikuj czy do synchronizacji zostały określone prawidłowe katalogi.</target>
+
+<source>Not enough free disk space available in:</source>
+<target>Brak wystarczającej przestrzeni dyskowej na:</target>
+
+<source>Required:</source>
+<target>Wymagane:</target>
+
+<source>Available:</source>
+<target>Dostępne:</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>Niektóre pliki będą zsynchronizowane jako część kilku katalogów źródłowych.</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>Aby uniknąć konfliktów ustaw filtry tak aby wykluczyć przynależność pliku do wielu katalogów źródłowych.</target>
+
+<source>Versioning folder:</source>
+<target>Wersjonowanie katalogów:</target>
+
+<source>Base folder:</source>
+<target>Katalog źródłowy:</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>Katalog wersjonowania znajduje się w katalogu bazowym.</target>
+
+<source>Synchronizing folder pair:</source>
+<target>Synchronizacja katalogów parami:</target>
+
+<source>Generating database...</source>
+<target>Generowanie bazy danych...</target>
+
+<source>Searching for excess file versions:</source>
+<target>Wyszukiwanie nadmiarowych wersji plików:</target>
+
+<source>Removing excess file versions:</source>
+<target>Usuwanie nadmiarowych wersji plików:</target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>Nie można utworzyć znacznika czasu dla wersjonowania:</target>
<source>
Unexpected size of data stream.
@@ -289,17 +537,14 @@ Przesłany: %y bajtów
<source>Operation not supported for different base folder types.</source>
<target>Operacja nie jest wspierana dla różnych typów katalogów.</target>
-<source>Cannot write file %x.</source>
-<target>Nie można zapisać pliku %x.</target>
-
<source>Cannot move file %x to %y.</source>
<target>Nie można przenieść pliku %x do %y.</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>Nie można skopiować linku symbolicznego %x do %y.</target>
-<source>Unable to connect to %x.</source>
-<target>Błąd połączenia do %x.</target>
+<source>Error Code %x</source>
+<target>Kod błędu %x</target>
<source>Failed to get information about server %x.</source>
<target>Nie można uzyskać informacji o serwerze %x.</target>
@@ -307,12 +552,6 @@ Przesłany: %y bajtów
<source>Cannot open directory %x.</source>
<target>Nie można otworzyć katalogu %x.</target>
-<source>Cannot read directory %x.</source>
-<target>Nie można odczytać katalogu %x.</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>Nie można odczytać atrybutów pliku %x.</target>
-
<source>Cannot create directory %x.</source>
<target>Nie można utworzyć katalogu %x.</target>
@@ -340,9 +579,6 @@ Przesłany: %y bajtów
<source>Cannot find device %x.</source>
<target>Nie można odnaleźć urządzenia %x.</target>
-<source>Cannot open file %x.</source>
-<target>Nie można otworzyć pliku %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Element typu %x nie jest wspierany:</target>
@@ -355,15 +591,9 @@ Przesłany: %y bajtów
<source>Incorrect command line:</source>
<target>Niepoprawne polecenie:</target>
-<source>Error Code %x</source>
-<target>Kod błędu %x</target>
-
<source>The server does not support authentication via %x.</source>
<target>Serwer nie wspiera uwierzytelniania przez %x.</target>
-<source>Required:</source>
-<target>Wymagane:</target>
-
<source>Unable to access %x.</source>
<target>Brak dostępu do %x.</target>
@@ -412,125 +642,9 @@ Przesłany: %y bajtów
<source>%x GB</source>
<target>%x GB</target>
-<source>Cannot load file %x.</source>
-<target>Nie można wczytać pliku %x.</target>
-
-<source>Database file %x is incompatible.</source>
-<target>Plik bazy danych %x nie jest kompatybilny.</target>
-
-<source>Initial synchronization:</source>
-<target>Wstępna synchronizacja:</target>
-
-<source>Database file %x does not yet exist.</source>
-<target>Plik bazy danych %x nie istnieje.</target>
-
-<source>Database file is corrupted:</source>
-<target>Plik bazy danych jest uszkodzony:</target>
-
-<source>The database files do not yet contain information about the last synchronization.</source>
-<target>Pliki bazy danych nie posiadają żadnych informacji o ostatniej synchronizacji.</target>
-
-<source>Loading file %x...</source>
-<target>Wczytywanie pliku %x...</target>
-
-<source>Saving file %x...</source>
-<target>Zapisywanie pliku %x...</target>
-
-<source>Searching for folder %x...</source>
-<target>Wyszukiwanie katalogu %x...</target>
-
-<source>Timeout while searching for folder %x.</source>
-<target>Przekroczono czas oczekiwania podczas szukania katalogu %x.</target>
-
-<source>Cannot get process information.</source>
-<target>Nie można uzyskać informacji dla procesu.</target>
-
-<source>Waiting while directory is locked:</source>
-<target>Oczekiwanie przez blokadę katalogu:</target>
-
-<source>Lock owner:</source>
-<target>Właściciel blokady:</target>
-
-<source>Detecting abandoned lock...</source>
-<target>Wykrywanie nieaktywnej blokady...</target>
-
-<source>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</source>
-<target>
-<pluralform>1 sekunda</pluralform>
-<pluralform>%x sekundy</pluralform>
-<pluralform>%x sekund</pluralform>
-</target>
-
-<source>Items processed:</source>
-<target>Przetworzone elementy:</target>
-
-<source>Items remaining:</source>
-<target>Pozostałe elementy:</target>
-
-<source>Total time:</source>
-<target>Całkowity czas:</target>
-
-<source>Cleaning up old log files...</source>
-<target>Usuwanie starych plików logów...</target>
-
-<source>Error parsing file %x, row %y, column %z.</source>
-<target>Błąd podczas parsowania pliku %x, rząd %y, kolumna %z.</target>
-
-<source>Cannot set directory locks for the following folders:</source>
-<target>Nie można zablokować katalogów dla poniższych folderów:</target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-<pluralform>1 wątek</pluralform>
-<pluralform>%x wątki</pluralform>
-<pluralform>%x wątków</pluralform>
-</target>
-
-<source>Scanning:</source>
-<target>Skanowanie:</target>
-
-<source>/sec</source>
-<target>/sekundę</target>
-
-<source>%x items/sec</source>
-<target>%x elementów/sek</target>
-
-<source>Show in Explorer</source>
-<target>Wyświetl w Eksploratorze</target>
-
-<source>Open with default application</source>
-<target>Otwórz za pomocą domyślnej aplikacji</target>
-
-<source>Browse directory</source>
-<target>Przeglądaj katalog</target>
-
-<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>Nie można uzyskać dostępu do usługi Volume Shadow Copy.</target>
-
-<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>Uruchom 64-bitową wersję FreeFileSync aby utworzyć Shadow Copies w tym systemie.</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>Nie można określić nazwy dysku dla %x.</target>
-
-<source>Volume name %x is not part of file path %y.</source>
-<target>Nazwa wolumenu %x nie jest częścią ścieżki %y.</target>
-
-<source>Unable to create time stamp for versioning:</source>
-<target>Nie można utworzyć znacznika czasu dla wersjonowania:</target>
-
<source>Drag && drop</source>
<target>Drag && Drop</target>
-<source>Cannot find folder %x.</source>
-<target>Nie można znaleźć katalogu %x.</target>
-
<source>Select a folder</source>
<target>Wybierz katalog</target>
@@ -626,8 +740,8 @@ Komenda jest wykonywana gdy:
<source>Directory monitoring active</source>
<target>Monitorowanie katalogów aktywne</target>
-<source>Waiting until all directories are available...</source>
-<target>Oczekiwanie na dostępność wszystkich katalogów...</target>
+<source>Waiting until directory is available:</source>
+<target>Oczekiwanie, aż katalog będzie dostępny:</target>
<source>&Restore</source>
<target>&Przywróć</target>
@@ -641,114 +755,6 @@ Komenda jest wykonywana gdy:
<source>&Retry</source>
<target>&Powtórz</target>
-<source>File time and size</source>
-<target>Czas modyfikacji i rozmiar</target>
-
-<source>File content</source>
-<target>Zawartość pliku</target>
-
-<source>File size</source>
-<target>Rozmiar pliku</target>
-
-<source>Two way</source>
-<target>Obustronna</target>
-
-<source>Mirror</source>
-<target>Lustrzana</target>
-
-<source>Update</source>
-<target>Uaktualnij</target>
-
-<source>Custom</source>
-<target>Własne</target>
-
-<source>Multiple...</source>
-<target>Wiele...</target>
-
-<source>Cannot write file attributes of %x.</source>
-<target>Nie można zapisać atrybutów %x.</target>
-
-<source>%x and %y have different content.</source>
-<target>%x i %y mają różną zawartość.</target>
-
-<source>Data verification error:</source>
-<target>Błąd weryfikacji danych:</target>
-
-<source>Moving file %x to %y</source>
-<target>Przenoszenie pliku %x do %y</target>
-
-<source>Moving folder %x to %y</source>
-<target>Przenoszenie katalogu %x do %y</target>
-
-<source>Moving symbolic link %x to %y</source>
-<target>Przenoszenie dowiązania symbolicznego %x do %y</target>
-
-<source>Removing old versions...</source>
-<target>Usuwanie starszych wersji...</target>
-
-<source>Updating file %x</source>
-<target>Aktualizowanie pliku %x</target>
-
-<source>Updating symbolic link %x</source>
-<target>Aktualizowanie dowiązania symbolicznego %x</target>
-
-<source>Verifying file %x</source>
-<target>Weryfikowanie pliku %x</target>
-
-<source>Updating attributes of %x</source>
-<target>Aktualizowanie atrybutów %x</target>
-
-<source>Source item %x not found</source>
-<target>Nie znaleziono elementu źródłowego %x</target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>Tworzenie Volume Shadow Copy dla %x...</target>
-
-<source>Target folder %x already existing.</source>
-<target>Katalog docelowy %x już istnieje.</target>
-
-<source>Target folder input field must not be empty.</source>
-<target>Pole katalogu docelowego nie może być puste.</target>
-
-<source>Source folder %x not found.</source>
-<target>Nie znaleziono katalogu źródłowego %x.</target>
-
-<source>Please enter a target folder for versioning.</source>
-<target>Określ katalog docelowy do wersjonowania.</target>
-
-<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>Te elementy znajdują się w konflikcie, którego nie można rozwiązać. Pliki nie zostaną zsynchronizowane:</target>
-
-<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>Poniższe katalogi znacząco się różnią. Zweryfikuj czy do synchronizacji zostały określone prawidłowe katalogi.</target>
-
-<source>Not enough free disk space available in:</source>
-<target>Brak wystarczającej przestrzeni dyskowej na:</target>
-
-<source>Available:</source>
-<target>Dostępne:</target>
-
-<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>Niektóre pliki będą zsynchronizowane jako część kilku katalogów źródłowych.</target>
-
-<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>Aby uniknąć konfliktów ustaw filtry tak aby wykluczyć przynależność pliku do wielu katalogów źródłowych.</target>
-
-<source>Versioning folder:</source>
-<target>Wersjonowanie katalogów:</target>
-
-<source>Base folder:</source>
-<target>Katalog źródłowy:</target>
-
-<source>The versioning folder is contained in a base folder.</source>
-<target>Katalog wersjonowania znajduje się w katalogu bazowym.</target>
-
-<source>Synchronizing folder pair:</source>
-<target>Synchronizacja katalogów parami:</target>
-
-<source>Generating database...</source>
-<target>Generowanie bazy danych...</target>
-
<source>Loading...</source>
<target>Wczytywanie...</target>
@@ -895,7 +901,7 @@ Komenda jest wykonywana gdy:
<target>Okreś katalog lokalny, sieciowy bądź urządzenie MTP.</target>
<source>Defined by context of use</source>
-<target></target>
+<target>Zdefiniowany przez kontekst użycia</target>
<source>Requires FreeFileSync Donation Edition</source>
<target>Wymaga FreeFileSync Donation Edition</target>
@@ -1068,8 +1074,8 @@ Komenda jest wykonywana gdy:
<source>Show examples</source>
<target>Pokaż przykłady</target>
-<source>Time span:</source>
-<target>Przedział czasu:</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>Określ reguły filtrowania w celu wykluczenia niektórych plików z synchronizacji. Ścieżki plików muszą być relatywne do podanych par katalogów.</target>
<source>File size:</source>
<target>Rozmiar pliku:</target>
@@ -1080,8 +1086,8 @@ Komenda jest wykonywana gdy:
<source>Maximum:</source>
<target>Maksymalny:</target>
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target>Określ reguły filtrowania w celu wykluczenia niektórych plików z synchronizacji. Ścieżki plików muszą być relatywne do podanych par katalogów.</target>
+<source>Time span:</source>
+<target>Przedział czasu:</target>
<source>C&lear</source>
<target>&Wyczyść</target>
@@ -1112,9 +1118,18 @@ Komenda jest wykonywana gdy:
<source>&Versioning</source>
<target>&Wersjonowanie</target>
+<source>Move files to a user-defined folder</source>
+<target>Przenieś pliki do katalogu zdefiniowanego przez użytkownika</target>
+
<source>Naming convention:</source>
<target>Konwencja nazewnictwa:</target>
+<source>Limit file versions:</source>
+<target>Ogranicz wersje plików:</target>
+
+<source>Last x days:</source>
+<target>Ostatnie x dni:</target>
+
<source>Ignore errors</source>
<target>Ignoruj błędy</target>
@@ -1256,11 +1271,8 @@ Komenda jest wykonywana gdy:
<source>Save log:</source>
<target>Zapisz logi:</target>
-<source>Limit:</source>
-<target>Limit:</target>
-
-<source>Limit maximum number of log files</source>
-<target>Określ maksymalną liczbę plików z logami</target>
+<source>Limit number of log files:</source>
+<target>Ogranicz liczbę plików logów:</target>
<source>How can I schedule a batch job?</source>
<target>Jak zaplanować zadanie w trybie wsadowym?</target>
@@ -1295,9 +1307,6 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Transfer file and folder permissions.</source>
<target>kopiuj uprawnienia plików i katalogów.</target>
-<source>Show hidden dialogs again</source>
-<target>Przywróć ukryte dialogi</target>
-
<source>Show all permanently hidden dialogs and warning messages again</source>
<target>Przywróć wszystkie, stale ukryte dialogi i powiadomienia</target>
@@ -1388,9 +1397,6 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Select Time Span</source>
<target>Określ przedział czasu</target>
-<source>FreeFileSync Donation Edition</source>
-<target>FreeFileSync Donation Edition</target>
-
<source>Highlight Configurations</source>
<target>Pokaż konfiguracje</target>
@@ -1518,6 +1524,9 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Select time span...</source>
<target>Określ przedział czasowy...</target>
+<source>Donation Edition</source>
+<target>Donation Edition</target>
+
<source>Folder Comparison and Synchronization</source>
<target>Porównywanie i Synchronizacja folderów</target>
@@ -1719,6 +1728,12 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Parameters for opposite side</source>
<target>Parametry dla strony przeciwnej</target>
+<source>Show hidden dialogs again</source>
+<target>Przywróć ukryte dialogi</target>
+
+<source>All dialogs shown</source>
+<target>Wszystkie wyświetlone okna dialogowe</target>
+
<source>Downloading update...</source>
<target>Pobieranie aktualizacji...</target>
@@ -1758,9 +1773,6 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>This year</source>
<target>W tym roku</target>
-<source>Last x days</source>
-<target>Ostatnie x dni</target>
-
<source>Byte</source>
<target>Bajtów</target>
@@ -1776,9 +1788,6 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Delete and overwrite files permanently</source>
<target>Usuwaj i nadpisuj pliki permanentnie</target>
-<source>Move files to a user-defined folder</source>
-<target>Przenieś pliki do katalogu zdefiniowanego przez użytkownika</target>
-
<source>Replace</source>
<target>Zamień</target>
@@ -1788,6 +1797,12 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Time stamp</source>
<target>Znacznik czasu</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>Przenieś pliki do podkatalogu z oznaczeniem czasu</target>
+
+<source>File</source>
+<target>Plik</target>
+
<source>Append a time stamp to each file name</source>
<target>Dołącz datę do nazwy każdego pliku</target>
@@ -1809,12 +1824,12 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Leave as unresolved conflict</source>
<target>Zostaw jako nierozwiązany konflikt</target>
-<source>File</source>
-<target>Plik</target>
-
<source>YYYY-MM-DD hhmmss</source>
<target>YYYY-MM-DD hhmmss</target>
+<source>Minimum version count must be smaller than maximum count.</source>
+<target>Minimalna liczba wersji musi być mniejsza od maksymalnej.</target>
+
<source>Files</source>
<target>Pliki</target>
@@ -1964,8 +1979,8 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Portable</source>
<target>Przenośna</target>
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>Zapisuje ustawienia do "%APPDATA%\FreeFileSync"</target>
+<source>Save settings in %x</source>
+<target>Zapisz ustawienia w %x</target>
<source>Register FreeFileSync file extensions</source>
<target>Tworzy powiązania plików z programem FreeFileSync</target>
diff --git a/FreeFileSync/Build/Languages/portuguese.lng b/FreeFileSync/Build/Languages/portuguese.lng
index 77bd1d3b..7479c61a 100755
--- a/FreeFileSync/Build/Languages/portuguese.lng
+++ b/FreeFileSync/Build/Languages/portuguese.lng
@@ -115,11 +115,20 @@
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
<target>Os ficheiros de instalação estão corrompidos. Por favor, reinstale o FreeFileSync.</target>
+<source>Cannot load file %x.</source>
+<target>Não é possível carregar o ficheiro %x.</target>
+
<source>Cannot find the following folders:</source>
<target>Não é possível encontrar as seguintes pastas:</target>
-<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>Se este erro é ignorado as pastas serão consideradas vazias. Pastas ausentes são criados automaticamente quando necessário.</target>
+<source>The following folders do not yet exist:</source>
+<target>As seguintes pastas não existem ainda:</target>
+
+<source>The folders are created automatically when needed.</source>
+<target>As pastas são criadas automaticamente se necessário.</target>
+
+<source>Scanning:</source>
+<target>A pesquisar:</target>
<source>Comparison finished:</source>
<target>Comparação terminada:</target>
@@ -214,6 +223,63 @@
<source>Out of memory.</source>
<target>Sem memória disponível.</target>
+<source>Database file %x is incompatible.</source>
+<target>Base de dados %x não é compatível.</target>
+
+<source>Initial synchronization:</source>
+<target>Sincronização inicial:</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>Base de dados %x não existe.</target>
+
+<source>Database file is corrupted:</source>
+<target>O ficheiro da base de dados está corrompido:</target>
+
+<source>Cannot write file %x.</source>
+<target>Não é possível escrever o ficheiro %x.</target>
+
+<source>Cannot read file %x.</source>
+<target>Não é possível ler o ficheiro %x.</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>Os ficheiros da base de dados ainda não contém informações sobre a última sincronização.</target>
+
+<source>Loading file %x...</source>
+<target>A carregar arquivo %x...</target>
+
+<source>Saving file %x...</source>
+<target>A guardar ficheiro %x...</target>
+
+<source>Searching for folder %x...</source>
+<target>À procura da pasta %x...</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>Tempo limite na procura da pasta %x.</target>
+
+<source>Cannot get process information.</source>
+<target>Não é possível obter informação sobre o processo.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Não é possível ler os atributos do ficheiro %x.</target>
+
+<source>Waiting while directory is locked:</source>
+<target>À espera do bloqueio do directório:</target>
+
+<source>Lock owner:</source>
+<target>Dono do bloqueio:</target>
+
+<source>Detecting abandoned lock...</source>
+<target>Detectado bloqueio abandonado...</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 seg</pluralform>
+<pluralform>%x segs</pluralform>
+</target>
+
<source>Item exists on left side only</source>
<target>Item existe apenas à esquerda</target>
@@ -268,8 +334,188 @@
<source>Update attributes on right</source>
<target>Actualizar atributos à direita</target>
-<source>Cannot read file %x.</source>
-<target>Não é possível ler o ficheiro %x.</target>
+<source>Items processed:</source>
+<target>Elementos processados:</target>
+
+<source>Items remaining:</source>
+<target>Elementos restantes:</target>
+
+<source>Total time:</source>
+<target>Tempo total:</target>
+
+<source>Cleaning up log files:</source>
+<target>A limpar ficheiros de registo:</target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>Erro ao analisar ficheiro %x, linha %y, coluna %z.</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>Incapaz de definir bloqueios de directórios para as seguintes pastas:</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</target>
+
+<source>Cannot read directory %x.</source>
+<target>Não é possível ler o directório %x.</target>
+
+<source>/sec</source>
+<target>/seg</target>
+
+<source>%x items/sec</source>
+<target>%x itens/seg</target>
+
+<source>Show in Explorer</source>
+<target>Mostrar no Explorer</target>
+
+<source>Open with default application</source>
+<target>Abrir com a aplicação associada</target>
+
+<source>Browse directory</source>
+<target>Procurar directório</target>
+
+<source>Unable to connect to %x.</source>
+<target>Não é possível conectar-se em %x.</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>Não é possível aceder ao serviço Volume Shadow Copy.</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>Por favor, executar a versão do FreeFileSync de 64 bits para criar cópias de sombra neste sistema.</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>Não é possível determinar o nome do volume para %x.</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>Nome de volume %x não faz parte do caminho do ficheiro %y.</target>
+
+<source>File time and size</source>
+<target>Data e tamanho do ficheiro</target>
+
+<source>File content</source>
+<target>Conteúdo do ficheiro</target>
+
+<source>File size</source>
+<target>Tamanho do ficheiro</target>
+
+<source>Two way</source>
+<target>Duas vias</target>
+
+<source>Mirror</source>
+<target>Espelhar</target>
+
+<source>Update</source>
+<target>Actualizar</target>
+
+<source>Custom</source>
+<target>Personalizado</target>
+
+<source>Multiple...</source>
+<target>Múltiplo...</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>Não é possível escrever os atributos de %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Não é possível abrir o ficheiro %x.</target>
+
+<source>%x and %y have different content.</source>
+<target>%x e %y tem conteúdos distintos.</target>
+
+<source>Data verification error:</source>
+<target>Erro de verificação dos dados:</target>
+
+<source>Moving file %x to %y</source>
+<target>A mover ficheiro %x para %y</target>
+
+<source>Moving folder %x to %y</source>
+<target>A mover pasta %x para %y</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>A mover link simbólico %x para %y</target>
+
+<source>Updating file %x</source>
+<target>A actualizar ficheiro %x</target>
+
+<source>Updating symbolic link %x</source>
+<target>A actualizar link simbólico %x</target>
+
+<source>Verifying file %x</source>
+<target>A verificar ficheiro %x</target>
+
+<source>Updating attributes of %x</source>
+<target>A actualizar atributos de %x</target>
+
+<source>Source item %x not found</source>
+<target>Item de origem %x não encontrado</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>A criar Volume Shadow Copy para %x...</target>
+
+<source>Cannot find folder %x.</source>
+<target>Não é possível encontrar a pasta %x.</target>
+
+<source>Target folder %x already existing.</source>
+<target>Directório de destino %x já existe.</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>Campo de directório de destino não deve estar vazio.</target>
+
+<source>Source folder %x not found.</source>
+<target>Directório %x não encontrado.</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>Introduza uma pasta de destino para o controlo de versões.</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>Os seguintes itens têm conflitos não resolvidos, e não serão sincronizados:</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>As seguintes pastas são significativamente diferentes. Por favor, verifique se as pastas corretas estão seleccionadas para a sincronização.</target>
+
+<source>Not enough free disk space available in:</source>
+<target>Não há espaço livre suficiente em:</target>
+
+<source>Required:</source>
+<target>Requirido:</target>
+
+<source>Available:</source>
+<target>Disponível:</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>Alguns ficheiros serão sincronizados como parte de múltiplas pastas base.</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>A fim de evitar conflitos, configure os filtros de exclusão para que cada ficheiro actualizado seja considerado por somente uma pasta base.</target>
+
+<source>Versioning folder:</source>
+<target>Pasta de versão:</target>
+
+<source>Base folder:</source>
+<target>Pasta base:</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>A pasta de versão está contida em uma pasta base.</target>
+
+<source>Synchronizing folder pair:</source>
+<target>A sincronizar o par de pastas:</target>
+
+<source>Generating database...</source>
+<target>A gerar base de dados...</target>
+
+<source>Searching for excess file versions:</source>
+<target>A pesquisar por versões em excesso de ficheiro:</target>
+
+<source>Removing excess file versions:</source>
+<target>A remover versões em excesso de ficheiro:</target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>Não é possível criar data/hora para controlo de versões:</target>
<source>
Unexpected size of data stream.
@@ -288,17 +534,14 @@ Actual: %y bytes
<source>Operation not supported for different base folder types.</source>
<target>Operação sem suporte para tipos de pastas base distintas.</target>
-<source>Cannot write file %x.</source>
-<target>Não é possível escrever o ficheiro %x.</target>
-
<source>Cannot move file %x to %y.</source>
<target>Não é possível mover o ficheiro %x para %y.</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>Não é possível criar o link simbólico de %x para %y.</target>
-<source>Unable to connect to %x.</source>
-<target>Não é possível conectar-se em %x.</target>
+<source>Error Code %x</source>
+<target>Código de Erro %x</target>
<source>Failed to get information about server %x.</source>
<target>Falha ao obter informações do servidor %x.</target>
@@ -306,12 +549,6 @@ Actual: %y bytes
<source>Cannot open directory %x.</source>
<target>Não é possível abrir o directório %x.</target>
-<source>Cannot read directory %x.</source>
-<target>Não é possível ler o directório %x.</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>Não é possível ler os atributos do ficheiro %x.</target>
-
<source>Cannot create directory %x.</source>
<target>Não é possível criar o directório %x.</target>
@@ -339,9 +576,6 @@ Actual: %y bytes
<source>Cannot find device %x.</source>
<target>Não é possível encontrar o dispositivo %x.</target>
-<source>Cannot open file %x.</source>
-<target>Não é possível abrir o ficheiro %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Tipo de item %x não é suportado:</target>
@@ -354,15 +588,9 @@ Actual: %y bytes
<source>Incorrect command line:</source>
<target>Linha de comandos incorrecta:</target>
-<source>Error Code %x</source>
-<target>Código de Erro %x</target>
-
<source>The server does not support authentication via %x.</source>
<target>O servidor não suporta autenticação via %x.</target>
-<source>Required:</source>
-<target>Requirido:</target>
-
<source>Unable to access %x.</source>
<target>Incapaz de aceder %x.</target>
@@ -408,123 +636,9 @@ Actual: %y bytes
<source>%x GB</source>
<target>%x GB</target>
-<source>Cannot load file %x.</source>
-<target>Não é possível carregar o ficheiro %x.</target>
-
-<source>Database file %x is incompatible.</source>
-<target>Base de dados %x não é compatível.</target>
-
-<source>Initial synchronization:</source>
-<target>Sincronização inicial:</target>
-
-<source>Database file %x does not yet exist.</source>
-<target>Base de dados %x não existe.</target>
-
-<source>Database file is corrupted:</source>
-<target>O ficheiro da base de dados está corrompido:</target>
-
-<source>The database files do not yet contain information about the last synchronization.</source>
-<target>Os ficheiros da base de dados ainda não contém informações sobre a última sincronização.</target>
-
-<source>Loading file %x...</source>
-<target>A carregar arquivo %x...</target>
-
-<source>Saving file %x...</source>
-<target>A guardar ficheiro %x...</target>
-
-<source>Searching for folder %x...</source>
-<target>À procura da pasta %x...</target>
-
-<source>Timeout while searching for folder %x.</source>
-<target>Tempo limite na procura da pasta %x.</target>
-
-<source>Cannot get process information.</source>
-<target>Não é possível obter informação sobre o processo.</target>
-
-<source>Waiting while directory is locked:</source>
-<target>À espera do bloqueio do directório:</target>
-
-<source>Lock owner:</source>
-<target>Dono do bloqueio:</target>
-
-<source>Detecting abandoned lock...</source>
-<target>Detectado bloqueio abandonado...</target>
-
-<source>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</source>
-<target>
-<pluralform>1 seg</pluralform>
-<pluralform>%x segs</pluralform>
-</target>
-
-<source>Items processed:</source>
-<target>Elementos processados:</target>
-
-<source>Items remaining:</source>
-<target>Elementos restantes:</target>
-
-<source>Total time:</source>
-<target>Tempo total:</target>
-
-<source>Cleaning up old log files...</source>
-<target>A limpar ficheiros de log antigos...</target>
-
-<source>Error parsing file %x, row %y, column %z.</source>
-<target>Erro ao analisar ficheiro %x, linha %y, coluna %z.</target>
-
-<source>Cannot set directory locks for the following folders:</source>
-<target>Incapaz de definir bloqueios de directórios para as seguintes pastas:</target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</target>
-
-<source>Scanning:</source>
-<target>A pesquisar:</target>
-
-<source>/sec</source>
-<target>/seg</target>
-
-<source>%x items/sec</source>
-<target>%x itens/seg</target>
-
-<source>Show in Explorer</source>
-<target>Mostrar no Explorer</target>
-
-<source>Open with default application</source>
-<target>Abrir com a aplicação associada</target>
-
-<source>Browse directory</source>
-<target>Procurar directório</target>
-
-<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>Não é possível aceder ao serviço Volume Shadow Copy.</target>
-
-<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>Por favor, executar a versão do FreeFileSync de 64 bits para criar cópias de sombra neste sistema.</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>Não é possível determinar o nome do volume para %x.</target>
-
-<source>Volume name %x is not part of file path %y.</source>
-<target>Nome de volume %x não faz parte do caminho do ficheiro %y.</target>
-
-<source>Unable to create time stamp for versioning:</source>
-<target>Não é possível criar data/hora para controlo de versões:</target>
-
<source>Drag && drop</source>
<target>Arrastar && Largar</target>
-<source>Cannot find folder %x.</source>
-<target>Não é possível encontrar a pasta %x.</target>
-
<source>Select a folder</source>
<target>Seleccione uma pasta</target>
@@ -620,8 +734,8 @@ O comando é executado se:
<source>Directory monitoring active</source>
<target>Monitorização de directório activa</target>
-<source>Waiting until all directories are available...</source>
-<target>A aguardar que todos os directórios fiquem disponíveis...</target>
+<source>Waiting until directory is available:</source>
+<target>A aguardar até o directório ficar disponível:</target>
<source>&Restore</source>
<target>&Restaurar</target>
@@ -635,114 +749,6 @@ O comando é executado se:
<source>&Retry</source>
<target>&Tentar de Novo</target>
-<source>File time and size</source>
-<target>Data e tamanho do ficheiro</target>
-
-<source>File content</source>
-<target>Conteúdo do ficheiro</target>
-
-<source>File size</source>
-<target>Tamanho do ficheiro</target>
-
-<source>Two way</source>
-<target>Duas vias</target>
-
-<source>Mirror</source>
-<target>Espelhar</target>
-
-<source>Update</source>
-<target>Actualizar</target>
-
-<source>Custom</source>
-<target>Personalizado</target>
-
-<source>Multiple...</source>
-<target>Múltiplo...</target>
-
-<source>Cannot write file attributes of %x.</source>
-<target>Não é possível escrever os atributos de %x.</target>
-
-<source>%x and %y have different content.</source>
-<target>%x e %y tem conteúdos distintos.</target>
-
-<source>Data verification error:</source>
-<target>Erro de verificação dos dados:</target>
-
-<source>Moving file %x to %y</source>
-<target>A mover ficheiro %x para %y</target>
-
-<source>Moving folder %x to %y</source>
-<target>A mover pasta %x para %y</target>
-
-<source>Moving symbolic link %x to %y</source>
-<target>A mover link simbólico %x para %y</target>
-
-<source>Removing old versions...</source>
-<target>A remover versões antigas...</target>
-
-<source>Updating file %x</source>
-<target>A actualizar ficheiro %x</target>
-
-<source>Updating symbolic link %x</source>
-<target>A actualizar link simbólico %x</target>
-
-<source>Verifying file %x</source>
-<target>A verificar ficheiro %x</target>
-
-<source>Updating attributes of %x</source>
-<target>A actualizar atributos de %x</target>
-
-<source>Source item %x not found</source>
-<target>Item de origem %x não encontrado</target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>A criar Volume Shadow Copy para %x...</target>
-
-<source>Target folder %x already existing.</source>
-<target>Directório de destino %x já existe.</target>
-
-<source>Target folder input field must not be empty.</source>
-<target>Campo de directório de destino não deve estar vazio.</target>
-
-<source>Source folder %x not found.</source>
-<target>Directório %x não encontrado.</target>
-
-<source>Please enter a target folder for versioning.</source>
-<target>Introduza uma pasta de destino para o controlo de versões.</target>
-
-<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>Os seguintes itens têm conflitos não resolvidos, e não serão sincronizados:</target>
-
-<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>As seguintes pastas são significativamente diferentes. Por favor, verifique se as pastas corretas estão seleccionadas para a sincronização.</target>
-
-<source>Not enough free disk space available in:</source>
-<target>Não há espaço livre suficiente em:</target>
-
-<source>Available:</source>
-<target>Disponível:</target>
-
-<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>Alguns ficheiros serão sincronizados como parte de múltiplas pastas base.</target>
-
-<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>A fim de evitar conflitos, configure os filtros de exclusão para que cada ficheiro actualizado seja considerado por somente uma pasta base.</target>
-
-<source>Versioning folder:</source>
-<target>Pasta de versão:</target>
-
-<source>Base folder:</source>
-<target>Pasta base:</target>
-
-<source>The versioning folder is contained in a base folder.</source>
-<target>A pasta de versão está contida em uma pasta base.</target>
-
-<source>Synchronizing folder pair:</source>
-<target>A sincronizar o par de pastas:</target>
-
-<source>Generating database...</source>
-<target>A gerar base de dados...</target>
-
<source>Loading...</source>
<target>A carregar...</target>
@@ -888,7 +894,7 @@ O comando é executado se:
<target>Seleccione a pasta no sistema de ficheiros local, rede ou dispositivo MTP.</target>
<source>Defined by context of use</source>
-<target></target>
+<target>Definido pelo contexto de uso</target>
<source>Requires FreeFileSync Donation Edition</source>
<target>Requer o FreeFileSync Donation Edition</target>
@@ -1061,8 +1067,8 @@ O comando é executado se:
<source>Show examples</source>
<target>Mostrar exemplos</target>
-<source>Time span:</source>
-<target>Intervalo de tempo:</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>Seleccionar regras de filtro para excluir certos ficheiros da sincronização. Insira os caminhos relativos ao par de directórios correspondente.</target>
<source>File size:</source>
<target>Tamanho ficheiro:</target>
@@ -1073,8 +1079,8 @@ O comando é executado se:
<source>Maximum:</source>
<target>Máximo:</target>
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target>Seleccionar regras de filtro para excluir certos ficheiros da sincronização. Insira os caminhos relativos ao par de directórios correspondente.</target>
+<source>Time span:</source>
+<target>Intervalo de tempo:</target>
<source>C&lear</source>
<target>&Limpar</target>
@@ -1105,9 +1111,18 @@ O comando é executado se:
<source>&Versioning</source>
<target>Controlo &Versões</target>
+<source>Move files to a user-defined folder</source>
+<target>Mover ficheiros para uma pasta definida pelo utilizador</target>
+
<source>Naming convention:</source>
<target>Convenção de nomes:</target>
+<source>Limit file versions:</source>
+<target>Limitar versões de ficheiro:</target>
+
+<source>Last x days:</source>
+<target>Últimos x dias:</target>
+
<source>Ignore errors</source>
<target>Ignorar erros</target>
@@ -1249,11 +1264,8 @@ O comando é executado se:
<source>Save log:</source>
<target>Guardar registo:</target>
-<source>Limit:</source>
-<target>Limitar:</target>
-
-<source>Limit maximum number of log files</source>
-<target>Limitar o número máximo de ficheiros log</target>
+<source>Limit number of log files:</source>
+<target>Limitar número de ficheiros de registo:</target>
<source>How can I schedule a batch job?</source>
<target>Como posso agendar um trabalho batch?</target>
@@ -1288,9 +1300,6 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Transfer file and folder permissions.</source>
<target>Transferir permissões de pasta e ficheiro.</target>
-<source>Show hidden dialogs again</source>
-<target>Mostrar diálogos ocultos novamente</target>
-
<source>Show all permanently hidden dialogs and warning messages again</source>
<target>Mostrar todos os diálogos escondidos permanentemente e mensagens de aviso novamente</target>
@@ -1381,9 +1390,6 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Select Time Span</source>
<target>Seleccionar Intervalo de Tempo</target>
-<source>FreeFileSync Donation Edition</source>
-<target>FreeFileSync Donation Edition</target>
-
<source>Highlight Configurations</source>
<target>Realçar Configurações</target>
@@ -1507,6 +1513,9 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Select time span...</source>
<target>Seleccione o intervalo de tempo...</target>
+<source>Donation Edition</source>
+<target>Donation Edition</target>
+
<source>Folder Comparison and Synchronization</source>
<target>Comparação e Sincronização de Pastas</target>
@@ -1705,6 +1714,12 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Parameters for opposite side</source>
<target>Parâmetros do lado oposto</target>
+<source>Show hidden dialogs again</source>
+<target>Mostrar diálogos ocultos novamente</target>
+
+<source>All dialogs shown</source>
+<target>Todos os diálogos mostrados</target>
+
<source>Downloading update...</source>
<target>A descarregar actualização...</target>
@@ -1744,9 +1759,6 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>This year</source>
<target>Este ano</target>
-<source>Last x days</source>
-<target>Últimos x dias</target>
-
<source>Byte</source>
<target>Byte</target>
@@ -1762,9 +1774,6 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Delete and overwrite files permanently</source>
<target>Apagar e substituir ficheiros permanentemente</target>
-<source>Move files to a user-defined folder</source>
-<target>Mover ficheiros para uma pasta definida pelo utilizador</target>
-
<source>Replace</source>
<target>Substituir</target>
@@ -1774,6 +1783,12 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Time stamp</source>
<target>Selo temporal</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>Mover ficheiros para uma subpasta com marca de tempo</target>
+
+<source>File</source>
+<target>Ficheiro</target>
+
<source>Append a time stamp to each file name</source>
<target>Adicione data/hora ao nome de cada ficheiro</target>
@@ -1795,12 +1810,12 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Leave as unresolved conflict</source>
<target>Deixar como conflito</target>
-<source>File</source>
-<target>Ficheiro</target>
-
<source>YYYY-MM-DD hhmmss</source>
<target>AAAA-MM-DD hhmmss</target>
+<source>Minimum version count must be smaller than maximum count.</source>
+<target>A contagem da versão mínima deve ser menor que a contagem máxima.</target>
+
<source>Files</source>
<target>Ficheiros</target>
@@ -1948,8 +1963,8 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Portable</source>
<target>Portátil</target>
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>Guardar as definições em "%APPDATA%\FreeFileSync"</target>
+<source>Save settings in %x</source>
+<target>Salvar definições em %x</target>
<source>Register FreeFileSync file extensions</source>
<target>Registar as extensões do FreeFileSync</target>
diff --git a/FreeFileSync/Build/Languages/portuguese_br.lng b/FreeFileSync/Build/Languages/portuguese_br.lng
index 393d94eb..3d02293d 100755
--- a/FreeFileSync/Build/Languages/portuguese_br.lng
+++ b/FreeFileSync/Build/Languages/portuguese_br.lng
@@ -115,11 +115,20 @@
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
<target>Os arquivos de instalação estão corrompidos. Por favor, reinstale o FreeFileSync.</target>
+<source>Cannot load file %x.</source>
+<target>Não é possível carregar o aquivo %x.</target>
+
<source>Cannot find the following folders:</source>
<target>Não é possível localizar as seguintes pastas:</target>
-<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>Se o erro for ignorado, as pastas serão consideradas vazias. Pastas não encontradas serão criadas automaticamentes quando necessário.</target>
+<source>The following folders do not yet exist:</source>
+<target>As seguintes pastas ainda não existem:</target>
+
+<source>The folders are created automatically when needed.</source>
+<target>As pastas são criadas automaticamente quando necessárias.</target>
+
+<source>Scanning:</source>
+<target>Pesquisando:</target>
<source>Comparison finished:</source>
<target>Comparação finalizada:</target>
@@ -214,6 +223,63 @@
<source>Out of memory.</source>
<target>Memória insuficiente.</target>
+<source>Database file %x is incompatible.</source>
+<target>Arquivo de banco de dados %x incompatível.</target>
+
+<source>Initial synchronization:</source>
+<target>Sincronização inicial:</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>O arquivo de banco de dados %x ainda não existe.</target>
+
+<source>Database file is corrupted:</source>
+<target>O arquivo de banco de dados está corrompido:</target>
+
+<source>Cannot write file %x.</source>
+<target>Não é possível escrever o arquivo %x.</target>
+
+<source>Cannot read file %x.</source>
+<target>Não é possível ler o arquivo %x.</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>Os arquivos de banco de dados ainda não contêm informação sobre a última sincronização.</target>
+
+<source>Loading file %x...</source>
+<target>Carregando arquivo %x...</target>
+
+<source>Saving file %x...</source>
+<target>Salvando arquivo %x...</target>
+
+<source>Searching for folder %x...</source>
+<target>Localizando pasta %x...</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>Tempo esgotado na localização da pasta %x.</target>
+
+<source>Cannot get process information.</source>
+<target>Não é possível obter as informações do processo.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Não é possível ler os atributos do arquivo %x.</target>
+
+<source>Waiting while directory is locked:</source>
+<target>Aguardando enquanto o diretório é bloqueado:</target>
+
+<source>Lock owner:</source>
+<target>Proprietário de bloqueio:</target>
+
+<source>Detecting abandoned lock...</source>
+<target>Detectando bloqueamento abandonado...</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 s</pluralform>
+<pluralform>%x s</pluralform>
+</target>
+
<source>Item exists on left side only</source>
<target>Item existe apenas no lado esquerdo</target>
@@ -268,8 +334,188 @@
<source>Update attributes on right</source>
<target>Atualizar atributos à direita</target>
-<source>Cannot read file %x.</source>
-<target>Não é possível ler o arquivo %x.</target>
+<source>Items processed:</source>
+<target>Elementos processados:</target>
+
+<source>Items remaining:</source>
+<target>Elementos restantes:</target>
+
+<source>Total time:</source>
+<target>Tempo total:</target>
+
+<source>Cleaning up log files:</source>
+<target>Limpando arquivos de log:</target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>Erro analisando o arquivo %x, linha %y, coluna %z.</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>Não é possível estabelecer bloqueio de diretório para as seguintes pastas:</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</target>
+
+<source>Cannot read directory %x.</source>
+<target>Não é possível ler o diretório %x.</target>
+
+<source>/sec</source>
+<target>/s</target>
+
+<source>%x items/sec</source>
+<target>%x itens/s</target>
+
+<source>Show in Explorer</source>
+<target>Mostrar no Explorer</target>
+
+<source>Open with default application</source>
+<target>Abrir com aplicativo padrão</target>
+
+<source>Browse directory</source>
+<target>Procurar diretório</target>
+
+<source>Unable to connect to %x.</source>
+<target>Não foi possível conectar a %x.</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>Não é possível acessar o Serviço de Cópias de Sombra de Volume.</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>Execute a versão 64-bits do FreeFileSync para criar cópias de sombra neste sistema.</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>Não é possível determinar o nome do volume para %x.</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>O nome do volume %x não faz parte do caminho do arquivo %y.</target>
+
+<source>File time and size</source>
+<target>Data e tamanho do arquivo</target>
+
+<source>File content</source>
+<target>Conteúdo do arquivo</target>
+
+<source>File size</source>
+<target>Tamanho do arquivo</target>
+
+<source>Two way</source>
+<target>Dois sentidos</target>
+
+<source>Mirror</source>
+<target>Espelhar</target>
+
+<source>Update</source>
+<target>Atualizar</target>
+
+<source>Custom</source>
+<target>Personalizado</target>
+
+<source>Multiple...</source>
+<target>Múltiplo...</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>Não é possível escrever os atributos de arquivo de %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Não é possível abrir o arquivo %x.</target>
+
+<source>%x and %y have different content.</source>
+<target>%x e %y têm conteúdos diferentes.</target>
+
+<source>Data verification error:</source>
+<target>Erro na verificação dos dados:</target>
+
+<source>Moving file %x to %y</source>
+<target>Movendo arquivo %x para %y</target>
+
+<source>Moving folder %x to %y</source>
+<target>Movendo pasta %x para %y</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>Movendo link simbólico %x para %y</target>
+
+<source>Updating file %x</source>
+<target>Atualizando arquivo %x...</target>
+
+<source>Updating symbolic link %x</source>
+<target>Atualizando link simbólico %x</target>
+
+<source>Verifying file %x</source>
+<target>Verificando arquivo %x</target>
+
+<source>Updating attributes of %x</source>
+<target>Atualizando atributos de %x</target>
+
+<source>Source item %x not found</source>
+<target>Item de origem %x não encontrado</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>Criando uma Cópia de Sombra de Volume para %x...</target>
+
+<source>Cannot find folder %x.</source>
+<target>Não é possível encontrar a pasta %x.</target>
+
+<source>Target folder %x already existing.</source>
+<target>Pasta de destino %x já existe.</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>Campo de entrada da pasta de destino não pode ficar vazio.</target>
+
+<source>Source folder %x not found.</source>
+<target>Pasta de origem %x não encontrada.</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>Insira uma pasta de destino para controle de versões.</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>Os seguintes itens possuem conflitos não resolvidos e não serão sincronizados:</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>As seguintes pastas são muito diferentes. Verifique se as pastas corretas estão selecionadas.</target>
+
+<source>Not enough free disk space available in:</source>
+<target>Espaço em disco insuficiente em:</target>
+
+<source>Required:</source>
+<target>Necessário:</target>
+
+<source>Available:</source>
+<target>Disponível:</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>Alguns arquivos serão sincronizados como parte de várias pastas base.</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>Para evitar conflitos, configure filtros de exclusão para que cada arquivo atualizado seja considerado por apenas uma pasta base.</target>
+
+<source>Versioning folder:</source>
+<target>Pasta de controle de versões:</target>
+
+<source>Base folder:</source>
+<target>Pasta base:</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>A pasta de controle de versões está dentro de uma pasta base.</target>
+
+<source>Synchronizing folder pair:</source>
+<target>Sincronizando par de pastas:</target>
+
+<source>Generating database...</source>
+<target>Gerando banco de dados...</target>
+
+<source>Searching for excess file versions:</source>
+<target>Procurando por versões de arquivos em excesso:</target>
+
+<source>Removing excess file versions:</source>
+<target>Removendo versões de arquivos em excesso:</target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>Não é possível criar a estampa de tempo para o controle de versões:</target>
<source>
Unexpected size of data stream.
@@ -288,17 +534,14 @@ Atual: %y bytes
<source>Operation not supported for different base folder types.</source>
<target>Operação não suportada para tipos de pastas base diferentes.</target>
-<source>Cannot write file %x.</source>
-<target>Não é possível escrever o arquivo %x.</target>
-
<source>Cannot move file %x to %y.</source>
<target>Não é possível mover o arquivo %x para %y.</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>Não é possível copiar o link simbólico %x para %y.</target>
-<source>Unable to connect to %x.</source>
-<target>Não foi possível conectar a %x.</target>
+<source>Error Code %x</source>
+<target>Código do Erro %x.</target>
<source>Failed to get information about server %x.</source>
<target>Falha na obteção da informação sobre o servidor %x.</target>
@@ -306,12 +549,6 @@ Atual: %y bytes
<source>Cannot open directory %x.</source>
<target>Não é possível abrir o diretório %x.</target>
-<source>Cannot read directory %x.</source>
-<target>Não é possível ler o diretório %x.</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>Não é possível ler os atributos do arquivo %x.</target>
-
<source>Cannot create directory %x.</source>
<target>Não é possível criar o diretório %x.</target>
@@ -339,9 +576,6 @@ Atual: %y bytes
<source>Cannot find device %x.</source>
<target>Não é possível encontrar o dispositivo %x.</target>
-<source>Cannot open file %x.</source>
-<target>Não é possível abrir o arquivo %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Tipo de item %x não é suportado:</target>
@@ -354,15 +588,9 @@ Atual: %y bytes
<source>Incorrect command line:</source>
<target>Linha de comando incorreta:</target>
-<source>Error Code %x</source>
-<target>Código do Erro %x.</target>
-
<source>The server does not support authentication via %x.</source>
<target>O servidor não suporta autenticação via %x.</target>
-<source>Required:</source>
-<target>Necessário:</target>
-
<source>Unable to access %x.</source>
<target>Não foi possível acessar %x.</target>
@@ -408,123 +636,9 @@ Atual: %y bytes
<source>%x GB</source>
<target>%x GB</target>
-<source>Cannot load file %x.</source>
-<target>Não é possível carregar o aquivo %x.</target>
-
-<source>Database file %x is incompatible.</source>
-<target>Arquivo de banco de dados %x incompatível.</target>
-
-<source>Initial synchronization:</source>
-<target>Sincronização inicial:</target>
-
-<source>Database file %x does not yet exist.</source>
-<target>O arquivo de banco de dados %x ainda não existe.</target>
-
-<source>Database file is corrupted:</source>
-<target>O arquivo de banco de dados está corrompido:</target>
-
-<source>The database files do not yet contain information about the last synchronization.</source>
-<target>Os arquivos de banco de dados ainda não contêm informação sobre a última sincronização.</target>
-
-<source>Loading file %x...</source>
-<target>Carregando arquivo %x...</target>
-
-<source>Saving file %x...</source>
-<target>Salvando arquivo %x...</target>
-
-<source>Searching for folder %x...</source>
-<target>Localizando pasta %x...</target>
-
-<source>Timeout while searching for folder %x.</source>
-<target>Tempo esgotado na localização da pasta %x.</target>
-
-<source>Cannot get process information.</source>
-<target>Não é possível obter as informações do processo.</target>
-
-<source>Waiting while directory is locked:</source>
-<target>Aguardando enquanto o diretório é bloqueado:</target>
-
-<source>Lock owner:</source>
-<target>Proprietário de bloqueio:</target>
-
-<source>Detecting abandoned lock...</source>
-<target>Detectando bloqueamento abandonado...</target>
-
-<source>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</source>
-<target>
-<pluralform>1 s</pluralform>
-<pluralform>%x s</pluralform>
-</target>
-
-<source>Items processed:</source>
-<target>Elementos processados:</target>
-
-<source>Items remaining:</source>
-<target>Elementos restantes:</target>
-
-<source>Total time:</source>
-<target>Tempo total:</target>
-
-<source>Cleaning up old log files...</source>
-<target>Limpando arquivo de log antigo...</target>
-
-<source>Error parsing file %x, row %y, column %z.</source>
-<target>Erro analisando o arquivo %x, linha %y, coluna %z.</target>
-
-<source>Cannot set directory locks for the following folders:</source>
-<target>Não é possível estabelecer bloqueio de diretório para as seguintes pastas:</target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</target>
-
-<source>Scanning:</source>
-<target>Pesquisando:</target>
-
-<source>/sec</source>
-<target>/s</target>
-
-<source>%x items/sec</source>
-<target>%x itens/s</target>
-
-<source>Show in Explorer</source>
-<target>Mostrar no Explorer</target>
-
-<source>Open with default application</source>
-<target>Abrir com aplicativo padrão</target>
-
-<source>Browse directory</source>
-<target>Procurar diretório</target>
-
-<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>Não é possível acessar o Serviço de Cópias de Sombra de Volume.</target>
-
-<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>Execute a versão 64-bits do FreeFileSync para criar cópias de sombra neste sistema.</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>Não é possível determinar o nome do volume para %x.</target>
-
-<source>Volume name %x is not part of file path %y.</source>
-<target>O nome do volume %x não faz parte do caminho do arquivo %y.</target>
-
-<source>Unable to create time stamp for versioning:</source>
-<target>Não é possível criar a estampa de tempo para o controle de versões:</target>
-
<source>Drag && drop</source>
<target>Arrastar && Soltar</target>
-<source>Cannot find folder %x.</source>
-<target>Não é possível encontrar a pasta %x.</target>
-
<source>Select a folder</source>
<target>Selecionar uma pasta</target>
@@ -620,8 +734,8 @@ O comando é disparado se:
<source>Directory monitoring active</source>
<target>Monitoramento de diretórios ativado</target>
-<source>Waiting until all directories are available...</source>
-<target>Aguardando até todos os diretórios estarem disponíveis...</target>
+<source>Waiting until directory is available:</source>
+<target>Aguardando até o diretório ficar disponível:</target>
<source>&Restore</source>
<target>&Restaurar</target>
@@ -635,114 +749,6 @@ O comando é disparado se:
<source>&Retry</source>
<target>&Tentar Novamente</target>
-<source>File time and size</source>
-<target>Data e tamanho do arquivo</target>
-
-<source>File content</source>
-<target>Conteúdo do arquivo</target>
-
-<source>File size</source>
-<target>Tamanho do arquivo</target>
-
-<source>Two way</source>
-<target>Dois sentidos</target>
-
-<source>Mirror</source>
-<target>Espelhar</target>
-
-<source>Update</source>
-<target>Atualizar</target>
-
-<source>Custom</source>
-<target>Personalizado</target>
-
-<source>Multiple...</source>
-<target>Múltiplo...</target>
-
-<source>Cannot write file attributes of %x.</source>
-<target>Não é possível escrever os atributos de arquivo de %x.</target>
-
-<source>%x and %y have different content.</source>
-<target>%x e %y têm conteúdos diferentes.</target>
-
-<source>Data verification error:</source>
-<target>Erro na verificação dos dados:</target>
-
-<source>Moving file %x to %y</source>
-<target>Movendo arquivo %x para %y</target>
-
-<source>Moving folder %x to %y</source>
-<target>Movendo pasta %x para %y</target>
-
-<source>Moving symbolic link %x to %y</source>
-<target>Movendo link simbólico %x para %y</target>
-
-<source>Removing old versions...</source>
-<target>Removendo versões antigas...</target>
-
-<source>Updating file %x</source>
-<target>Atualizando arquivo %x...</target>
-
-<source>Updating symbolic link %x</source>
-<target>Atualizando link simbólico %x</target>
-
-<source>Verifying file %x</source>
-<target>Verificando arquivo %x</target>
-
-<source>Updating attributes of %x</source>
-<target>Atualizando atributos de %x</target>
-
-<source>Source item %x not found</source>
-<target>Item de origem %x não encontrado</target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>Criando uma Cópia de Sombra de Volume para %x...</target>
-
-<source>Target folder %x already existing.</source>
-<target>Pasta de destino %x já existe.</target>
-
-<source>Target folder input field must not be empty.</source>
-<target>Campo de entrada da pasta de destino não pode ficar vazio.</target>
-
-<source>Source folder %x not found.</source>
-<target>Pasta de origem %x não encontrada.</target>
-
-<source>Please enter a target folder for versioning.</source>
-<target>Insira uma pasta de destino para controle de versões.</target>
-
-<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>Os seguintes itens possuem conflitos não resolvidos e não serão sincronizados:</target>
-
-<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>As seguintes pastas são muito diferentes. Verifique se as pastas corretas estão selecionadas.</target>
-
-<source>Not enough free disk space available in:</source>
-<target>Espaço em disco insuficiente em:</target>
-
-<source>Available:</source>
-<target>Disponível:</target>
-
-<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>Alguns arquivos serão sincronizados como parte de várias pastas base.</target>
-
-<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>Para evitar conflitos, configure filtros de exclusão para que cada arquivo atualizado seja considerado por apenas uma pasta base.</target>
-
-<source>Versioning folder:</source>
-<target>Pasta de controle de versões:</target>
-
-<source>Base folder:</source>
-<target>Pasta base:</target>
-
-<source>The versioning folder is contained in a base folder.</source>
-<target>A pasta de controle de versões está dentro de uma pasta base.</target>
-
-<source>Synchronizing folder pair:</source>
-<target>Sincronizando par de pastas:</target>
-
-<source>Generating database...</source>
-<target>Gerando banco de dados...</target>
-
<source>Loading...</source>
<target>Carregando...</target>
@@ -888,7 +894,7 @@ O comando é disparado se:
<target>Selecione uma pasta em um sistema de arquivos local, de rede ou de um dispositivo MTP.</target>
<source>Defined by context of use</source>
-<target></target>
+<target>Definido pelo contexto de uso</target>
<source>Requires FreeFileSync Donation Edition</source>
<target>Requer FreeFileSync Edição do Doador</target>
@@ -1061,8 +1067,8 @@ O comando é disparado se:
<source>Show examples</source>
<target>Mostrar exemplos</target>
-<source>Time span:</source>
-<target>Intervalo de tempo:</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>Selecione regras de filtro para excluir certos arquivos da sincronização. Insira os caminhos relativos dos pares de pastas correspondentes.</target>
<source>File size:</source>
<target>Tamanho do arquivo:</target>
@@ -1073,8 +1079,8 @@ O comando é disparado se:
<source>Maximum:</source>
<target>Máximo:</target>
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target>Selecione regras de filtro para excluir certos arquivos da sincronização. Insira os caminhos relativos dos pares de pastas correspondentes.</target>
+<source>Time span:</source>
+<target>Intervalo de tempo:</target>
<source>C&lear</source>
<target>&Limpar</target>
@@ -1105,9 +1111,18 @@ O comando é disparado se:
<source>&Versioning</source>
<target>Controle de &versões</target>
+<source>Move files to a user-defined folder</source>
+<target>Mover os arquivos para uma pasta definida pelo usuário</target>
+
<source>Naming convention:</source>
<target>Convenção de nomenclatura:</target>
+<source>Limit file versions:</source>
+<target>Limitar versões de arquivos:</target>
+
+<source>Last x days:</source>
+<target>Últimos x dias:</target>
+
<source>Ignore errors</source>
<target>Ignorar erros</target>
@@ -1249,11 +1264,8 @@ O comando é disparado se:
<source>Save log:</source>
<target>Salvar arquivo de log:</target>
-<source>Limit:</source>
-<target>Limite:</target>
-
-<source>Limit maximum number of log files</source>
-<target>Limitar número máximo de arquivos de log</target>
+<source>Limit number of log files:</source>
+<target>Limitar número de arquivos de log:</target>
<source>How can I schedule a batch job?</source>
<target>Como posso agendar uma tarefa em lotes?</target>
@@ -1288,11 +1300,8 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Transfer file and folder permissions.</source>
<target>Transferir permissões de arquivos e pastas.</target>
-<source>Show hidden dialogs again</source>
-<target>Mostrar caixas de diálogo ocultadas</target>
-
<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>Mostrar todos as caixas de diálogo e mensagens de aviso permanentemente ocultadas</target>
+<target>Mostrar todas as caixas de diálogo e as mensagens de aviso permanentemente ocultadas</target>
<source>Customize context menu:</source>
<target>Personalizar menu de contexto:</target>
@@ -1381,9 +1390,6 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Select Time Span</source>
<target>Selecionar Intervalo de Tempo</target>
-<source>FreeFileSync Donation Edition</source>
-<target>FreeFileSync Edição do Doador</target>
-
<source>Highlight Configurations</source>
<target>Realçar Configurações</target>
@@ -1400,7 +1406,7 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<target>Localizar</target>
<source>View Settings</source>
-<target>Ver configurações</target>
+<target>Ver Configurações</target>
<source>Configuration</source>
<target>Configuração</target>
@@ -1507,6 +1513,9 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Select time span...</source>
<target>Selecionar intervalo de tempo...</target>
+<source>Donation Edition</source>
+<target>Edição do Doador</target>
+
<source>Folder Comparison and Synchronization</source>
<target>Comparação e Sincronização de Pastas</target>
@@ -1705,6 +1714,12 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Parameters for opposite side</source>
<target>Parâmetros para o lado oposto</target>
+<source>Show hidden dialogs again</source>
+<target>Mostrar caixas de diálogo ocultadas</target>
+
+<source>All dialogs shown</source>
+<target>Todas caixas de diálogo visíveis</target>
+
<source>Downloading update...</source>
<target>Baixando atualização...</target>
@@ -1744,9 +1759,6 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>This year</source>
<target>Este ano</target>
-<source>Last x days</source>
-<target>Últimos x dias</target>
-
<source>Byte</source>
<target>Byte</target>
@@ -1762,9 +1774,6 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Delete and overwrite files permanently</source>
<target>Excluir e substituir arquivos permanentemente</target>
-<source>Move files to a user-defined folder</source>
-<target>Mover os arquivos para uma pasta definida pelo usuário</target>
-
<source>Replace</source>
<target>Substituir</target>
@@ -1774,6 +1783,12 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Time stamp</source>
<target>Estampa de tempo</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>Mover arquivos para uma subpasta com estampa de tempo</target>
+
+<source>File</source>
+<target>Arquivo</target>
+
<source>Append a time stamp to each file name</source>
<target>Colocar uma estampa de tempo para cada nome de arquivo</target>
@@ -1795,12 +1810,12 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Leave as unresolved conflict</source>
<target>Deixar como conflito não resolvido</target>
-<source>File</source>
-<target>Arquivo</target>
-
<source>YYYY-MM-DD hhmmss</source>
<target>AAAA-MM-DD hhmmss</target>
+<source>Minimum version count must be smaller than maximum count.</source>
+<target>A contagem mínima de versões deve ser menor do que a contagem máxima.</target>
+
<source>Files</source>
<target>Arquivos</target>
@@ -1948,8 +1963,8 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Portable</source>
<target>Portátil</target>
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>Salvar as configurações em "%APPDATA%\FreeFileSync"</target>
+<source>Save settings in %x</source>
+<target>Salvar configurações em %x</target>
<source>Register FreeFileSync file extensions</source>
<target>Registrar as extensões de arquivos do FreeFileSync</target>
diff --git a/FreeFileSync/Build/Languages/romanian.lng b/FreeFileSync/Build/Languages/romanian.lng
index f36eea79..f9de2796 100755
--- a/FreeFileSync/Build/Languages/romanian.lng
+++ b/FreeFileSync/Build/Languages/romanian.lng
@@ -7,9 +7,6 @@
<plural_definition>n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2</plural_definition>
</header>
-<source>Defined by context of use</source>
-<target></target>
-
<source>Both sides have changed since last synchronization.</source>
<target>Ambele părți s-au modificat de la ultima sincronizare.</target>
@@ -118,11 +115,20 @@
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
<target>Filele de instalare sînt stricate (corupte). Reinstalează FreeFileSync.</target>
+<source>Cannot load file %x.</source>
+<target>Nu pot deschide fila %x.</target>
+
<source>Cannot find the following folders:</source>
<target>Nu pot găsi dosarele următoare:</target>
-<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>Dacă această eroare este ignorată, dosarele lipsă vor fi considerate goale. Dosarele lipsă vor fi create automat la nevoie.</target>
+<source>The following folders do not yet exist:</source>
+<target>Dosarele următoare nu există încă:</target>
+
+<source>The folders are created automatically when needed.</source>
+<target>Dosarele sînt create automat la nevoie.</target>
+
+<source>Scanning:</source>
+<target>Scanez:</target>
<source>Comparison finished:</source>
<target>Comparare terminată:</target>
@@ -218,6 +224,64 @@
<source>Out of memory.</source>
<target>Memorie epuizată.</target>
+<source>Database file %x is incompatible.</source>
+<target>Fila cu baza de date %x este incompatibilă.</target>
+
+<source>Initial synchronization:</source>
+<target>Sincronizare inițială:</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>Fila cu baza de date %x nu există încă.</target>
+
+<source>Database file is corrupted:</source>
+<target>Fila bazei de date este stricată (coruptă):</target>
+
+<source>Cannot write file %x.</source>
+<target>Nu pot scrie fila %x.</target>
+
+<source>Cannot read file %x.</source>
+<target>Nu pot citi fila %x.</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>Filele cu baze de date nu conțin încă informații despre ultima sincornizare.</target>
+
+<source>Loading file %x...</source>
+<target>Deschid fila %x...</target>
+
+<source>Saving file %x...</source>
+<target>Salvez fila %x...</target>
+
+<source>Searching for folder %x...</source>
+<target>Caut dosarul %x...</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>Timp expirat la căutarea dosarului %x.</target>
+
+<source>Cannot get process information.</source>
+<target>Nu pot obține informații despre proces.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Nu pot citi atributele filei %x.</target>
+
+<source>Waiting while directory is locked:</source>
+<target>Aștept ca dosarul să fie zăvorît [locked]:</target>
+
+<source>Lock owner:</source>
+<target>Zăvorăște proprietarul:</target>
+
+<source>Detecting abandoned lock...</source>
+<target>Detectez zăvorîrea [lock] abandonată...</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+<pluralform>%x de sec</pluralform>
+</target>
+
<source>Item exists on left side only</source>
<target>Elementul există doar în partea stîngă</target>
@@ -272,8 +336,189 @@
<source>Update attributes on right</source>
<target>Actualizează atributele în partea dreaptă</target>
-<source>Cannot read file %x.</source>
-<target>Nu pot citi fila %x.</target>
+<source>Items processed:</source>
+<target>Elemente Procesate:</target>
+
+<source>Items remaining:</source>
+<target>Elemente Rămase:</target>
+
+<source>Total time:</source>
+<target>Timp Total:</target>
+
+<source>Cleaning up log files:</source>
+<target>Curăț filele de jurnalizare:</target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>Eroare la parsarea filei %x, rîndul %y, coloana %z.</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>Nu pot seta zăvorîrea [lock] pentru dosarele următoare:</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>1 fir</pluralform>
+<pluralform>%x fire</pluralform>
+<pluralform>%x de fire</pluralform>
+</target>
+
+<source>Cannot read directory %x.</source>
+<target>Nu pot citi dosarul %x.</target>
+
+<source>/sec</source>
+<target>/sec</target>
+
+<source>%x items/sec</source>
+<target>%x elemente/sec</target>
+
+<source>Show in Explorer</source>
+<target>Arată în Exploratorul de File</target>
+
+<source>Open with default application</source>
+<target>Deschide cu Aplicația Implicită</target>
+
+<source>Browse directory</source>
+<target>Explorează Dosarul</target>
+
+<source>Unable to connect to %x.</source>
+<target>Nu mă pot conecta la %x.</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>Nu pot accesa Serviciul de Conservare a Volumelor [Volume Shadow Copy].</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>Folosește versiunea pe 64-biți a FreeFileSync pentru a crea conservări (copii de rezervă) pe acest sistem.</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>Nu pot determina numele volumului pentru %x.</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>Numele volumului %x nu face parte din calea filei %y.</target>
+
+<source>File time and size</source>
+<target>Timpul și Mărimea Filelor</target>
+
+<source>File content</source>
+<target>Conținutul Filelor</target>
+
+<source>File size</source>
+<target>Mărimea Filelor</target>
+
+<source>Two way</source>
+<target>Ambele Direcții</target>
+
+<source>Mirror</source>
+<target>Clonare</target>
+
+<source>Update</source>
+<target>Actualizare</target>
+
+<source>Custom</source>
+<target>Personalizat</target>
+
+<source>Multiple...</source>
+<target>Multiplu...</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>Nu pot scrie atributele de filă ale lui %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Nu pot deschide fila %x.</target>
+
+<source>%x and %y have different content.</source>
+<target>%x și %y au conținut diferit.</target>
+
+<source>Data verification error:</source>
+<target>Eroare de verificare a datei:</target>
+
+<source>Moving file %x to %y</source>
+<target>Mut fila %x în %y</target>
+
+<source>Moving folder %x to %y</source>
+<target>Mut dosarul %x în %y</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>Mut legătura simbolică %x în %y</target>
+
+<source>Updating file %x</source>
+<target>Actualizez fila %x</target>
+
+<source>Updating symbolic link %x</source>
+<target>Actualizez legătura simbolică %x</target>
+
+<source>Verifying file %x</source>
+<target>Verific fila %x</target>
+
+<source>Updating attributes of %x</source>
+<target>Actualizez atributele lui %x</target>
+
+<source>Source item %x not found</source>
+<target>Itemul sursă %x n-a fost găsit</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>Creez o Conservare a Volumului [Volume Shadow Copy] pentru %x...</target>
+
+<source>Cannot find folder %x.</source>
+<target>Nu pot găsi dosarul %x.</target>
+
+<source>Target folder %x already existing.</source>
+<target>Dosarul țintă %x există deja.</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>Cîmpul de introducere a dosarului țintă nu trebuie să fie gol.</target>
+
+<source>Source folder %x not found.</source>
+<target>Dosarul sursă %x nu a fost găsit.</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>Introdu dosarul țintă pentru versionare.</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>Există conflicte nerezolvate la elementele listate mai jos, deci ele nu vor fi sincronizate:</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>Dosarele următoare au diferențe semnificative. Asigură-te că ai selectat dosarele corecte pentru sincronizare.</target>
+
+<source>Not enough free disk space available in:</source>
+<target>Spațiu de stocare insuficient pe:</target>
+
+<source>Required:</source>
+<target>Necesar:</target>
+
+<source>Available:</source>
+<target>Disponibil:</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>Anumite file vor fi sincronizate ca parte din dosare de bază multiple.</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>Pentru a evita conflictele, setează filtrele de excludere astfel ca fiecare filă actualizată e considerată ca aparținînd unui singur dosar de bază.</target>
+
+<source>Versioning folder:</source>
+<target>Dosar de Versionare:</target>
+
+<source>Base folder:</source>
+<target>Dosar de Bază:</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>Dosarul de versionare este conținut într-un dosar de bază.</target>
+
+<source>Synchronizing folder pair:</source>
+<target>Sincronizez perechea de dosare:</target>
+
+<source>Generating database...</source>
+<target>Generez baza de date...</target>
+
+<source>Searching for excess file versions:</source>
+<target>Caut versiunile în exces ale filelor:</target>
+
+<source>Removing excess file versions:</source>
+<target>Înlătur versiunile în exces ale filelor:</target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>Nu pot crea marcajul de timp pentru versionare:</target>
<source>
Unexpected size of data stream.
@@ -292,17 +537,14 @@ Actuală: %y baiți
<source>Operation not supported for different base folder types.</source>
<target>Operație nesuportată pentru tipuri diferite de dosare bază (rădăcină).</target>
-<source>Cannot write file %x.</source>
-<target>Nu pot scrie fila %x.</target>
-
<source>Cannot move file %x to %y.</source>
<target>Nu pot muta fila %x în %y.</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>Nu pot copia legătura simbolică %x în %y.</target>
-<source>Unable to connect to %x.</source>
-<target>Nu mă pot conecta la %x.</target>
+<source>Error Code %x</source>
+<target>Cod de Eroare %x.</target>
<source>Failed to get information about server %x.</source>
<target>N-am putut obține informații despre serverul %x.</target>
@@ -310,12 +552,6 @@ Actuală: %y baiți
<source>Cannot open directory %x.</source>
<target>Nu pot deschide dosarul %x.</target>
-<source>Cannot read directory %x.</source>
-<target>Nu pot citi dosarul %x.</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>Nu pot citi atributele filei %x.</target>
-
<source>Cannot create directory %x.</source>
<target>Nu pot crea dosarul %x.</target>
@@ -343,9 +579,6 @@ Actuală: %y baiți
<source>Cannot find device %x.</source>
<target>Nu pot găsi dispozitivul %x.</target>
-<source>Cannot open file %x.</source>
-<target>Nu pot deschide fila %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Tipul de element %x nu e suportat:</target>
@@ -358,15 +591,9 @@ Actuală: %y baiți
<source>Incorrect command line:</source>
<target>Linie de comandă incorectă:</target>
-<source>Error Code %x</source>
-<target>Cod de Eroare %x.</target>
-
<source>The server does not support authentication via %x.</source>
<target>Serverul nu suportă autentificarea prin %x.</target>
-<source>Required:</source>
-<target>Necesar:</target>
-
<source>Unable to access %x.</source>
<target>Nu pot accesa %x.</target>
@@ -415,125 +642,9 @@ Actuală: %y baiți
<source>%x GB</source>
<target>%x GB</target>
-<source>Cannot load file %x.</source>
-<target>Nu pot deschide fila %x.</target>
-
-<source>Database file %x is incompatible.</source>
-<target>Fila cu baza de date %x este incompatibilă.</target>
-
-<source>Initial synchronization:</source>
-<target>Sincronizare inițială:</target>
-
-<source>Database file %x does not yet exist.</source>
-<target>Fila cu baza de date %x nu există încă.</target>
-
-<source>Database file is corrupted:</source>
-<target>Fila bazei de date este stricată (coruptă):</target>
-
-<source>The database files do not yet contain information about the last synchronization.</source>
-<target>Filele cu baze de date nu conțin încă informații despre ultima sincornizare.</target>
-
-<source>Loading file %x...</source>
-<target>Deschid fila %x...</target>
-
-<source>Saving file %x...</source>
-<target>Salvez fila %x...</target>
-
-<source>Searching for folder %x...</source>
-<target>Caut dosarul %x...</target>
-
-<source>Timeout while searching for folder %x.</source>
-<target>Timp expirat la căutarea dosarului %x.</target>
-
-<source>Cannot get process information.</source>
-<target>Nu pot obține informații despre proces.</target>
-
-<source>Waiting while directory is locked:</source>
-<target>Aștept ca dosarul să fie zăvorît [locked]:</target>
-
-<source>Lock owner:</source>
-<target>Zăvorăște proprietarul:</target>
-
-<source>Detecting abandoned lock...</source>
-<target>Detectez zăvorîrea [lock] abandonată...</target>
-
-<source>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</source>
-<target>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-<pluralform>%x de sec</pluralform>
-</target>
-
-<source>Items processed:</source>
-<target>Elemente Procesate:</target>
-
-<source>Items remaining:</source>
-<target>Elemente Rămase:</target>
-
-<source>Total time:</source>
-<target>Timp Total:</target>
-
-<source>Cleaning up old log files...</source>
-<target>Curăț filele de jurnalizare vechi...</target>
-
-<source>Error parsing file %x, row %y, column %z.</source>
-<target>Eroare la parsarea filei %x, rîndul %y, coloana %z.</target>
-
-<source>Cannot set directory locks for the following folders:</source>
-<target>Nu pot seta zăvorîrea [lock] pentru dosarele următoare:</target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-<pluralform>1 fir</pluralform>
-<pluralform>%x fire</pluralform>
-<pluralform>%x de fire</pluralform>
-</target>
-
-<source>Scanning:</source>
-<target>Scanez:</target>
-
-<source>/sec</source>
-<target>/sec</target>
-
-<source>%x items/sec</source>
-<target>%x elemente/sec</target>
-
-<source>Show in Explorer</source>
-<target>Arată în Exploratorul de File</target>
-
-<source>Open with default application</source>
-<target>Deschide cu Aplicația Implicită</target>
-
-<source>Browse directory</source>
-<target>Explorează Dosarul</target>
-
-<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>Nu pot accesa Serviciul de Conservare a Volumelor [Volume Shadow Copy].</target>
-
-<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>Folosește versiunea pe 64-biți a FreeFileSync pentru a crea conservări (copii de rezervă) pe acest sistem.</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>Nu pot determina numele volumului pentru %x.</target>
-
-<source>Volume name %x is not part of file path %y.</source>
-<target>Numele volumului %x nu face parte din calea filei %y.</target>
-
-<source>Unable to create time stamp for versioning:</source>
-<target>Nu pot crea marcajul de timp pentru versionare:</target>
-
<source>Drag && drop</source>
<target>Trage și pune un dosar mai jos sau explorează către el</target>
-<source>Cannot find folder %x.</source>
-<target>Nu pot găsi dosarul %x.</target>
-
<source>Select a folder</source>
<target>Selectează un Dosar</target>
@@ -629,8 +740,8 @@ Comanda este declanșată dacă:
<source>Directory monitoring active</source>
<target>Monitorizarea dosarelor este activă</target>
-<source>Waiting until all directories are available...</source>
-<target>Aștept pînă cînd toate dosarele vor fi disponibile...</target>
+<source>Waiting until directory is available:</source>
+<target>Aștept pînă cînd dosarul va fi disponibil:</target>
<source>&Restore</source>
<target>&Restaurează</target>
@@ -644,114 +755,6 @@ Comanda este declanșată dacă:
<source>&Retry</source>
<target>&Reîncearcă</target>
-<source>File time and size</source>
-<target>Timpul și Mărimea Filelor</target>
-
-<source>File content</source>
-<target>Conținutul Filelor</target>
-
-<source>File size</source>
-<target>Mărimea Filelor</target>
-
-<source>Two way</source>
-<target>Ambele Direcții</target>
-
-<source>Mirror</source>
-<target>Clonare</target>
-
-<source>Update</source>
-<target>Actualizare</target>
-
-<source>Custom</source>
-<target>Personalizat</target>
-
-<source>Multiple...</source>
-<target>Multiplu...</target>
-
-<source>Cannot write file attributes of %x.</source>
-<target>Nu pot scrie atributele de filă ale lui %x.</target>
-
-<source>%x and %y have different content.</source>
-<target>%x și %y au conținut diferit.</target>
-
-<source>Data verification error:</source>
-<target>Eroare de verificare a datei:</target>
-
-<source>Moving file %x to %y</source>
-<target>Mut fila %x în %y</target>
-
-<source>Moving folder %x to %y</source>
-<target>Mut dosarul %x în %y</target>
-
-<source>Moving symbolic link %x to %y</source>
-<target>Mut legătura simbolică %x în %y</target>
-
-<source>Removing old versions...</source>
-<target>Înlătur versiunile vechi...</target>
-
-<source>Updating file %x</source>
-<target>Actualizez fila %x</target>
-
-<source>Updating symbolic link %x</source>
-<target>Actualizez legătura simbolică %x</target>
-
-<source>Verifying file %x</source>
-<target>Verific fila %x</target>
-
-<source>Updating attributes of %x</source>
-<target>Actualizez atributele lui %x</target>
-
-<source>Source item %x not found</source>
-<target>Itemul sursă %x n-a fost găsit</target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>Creez o Conservare a Volumului [Volume Shadow Copy] pentru %x...</target>
-
-<source>Target folder %x already existing.</source>
-<target>Dosarul țintă %x există deja.</target>
-
-<source>Target folder input field must not be empty.</source>
-<target>Cîmpul de introducere a dosarului țintă nu trebuie să fie gol.</target>
-
-<source>Source folder %x not found.</source>
-<target>Dosarul sursă %x nu a fost găsit.</target>
-
-<source>Please enter a target folder for versioning.</source>
-<target>Introdu dosarul țintă pentru versionare.</target>
-
-<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>Există conflicte nerezolvate la elementele listate mai jos, deci ele nu vor fi sincronizate:</target>
-
-<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>Dosarele următoare au diferențe semnificative. Asigură-te că ai selectat dosarele corecte pentru sincronizare.</target>
-
-<source>Not enough free disk space available in:</source>
-<target>Spațiu de stocare insuficient pe:</target>
-
-<source>Available:</source>
-<target>Disponibil:</target>
-
-<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>Anumite file vor fi sincronizate ca parte din dosare de bază multiple.</target>
-
-<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>Pentru a evita conflictele, setează filtrele de excludere astfel ca fiecare filă actualizată e considerată ca aparținînd unui singur dosar de bază.</target>
-
-<source>Versioning folder:</source>
-<target>Dosar de Versionare:</target>
-
-<source>Base folder:</source>
-<target>Dosar de Bază:</target>
-
-<source>The versioning folder is contained in a base folder.</source>
-<target>Dosarul de versionare este conținut într-un dosar de bază.</target>
-
-<source>Synchronizing folder pair:</source>
-<target>Sincronizez perechea de dosare:</target>
-
-<source>Generating database...</source>
-<target>Generez baza de date...</target>
-
<source>Loading...</source>
<target>Deschid...</target>
@@ -897,6 +900,9 @@ Comanda este declanșată dacă:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>Selectează un dosar de pe un sistem de file local, din rețea sau de pe un dispozitiv MTP (dispozitiv media portabil).</target>
+<source>Defined by context of use</source>
+<target>Definit de contextul utilizării</target>
+
<source>Requires FreeFileSync Donation Edition</source>
<target>Necesită FreeFileSync Ediția pentru Donatori</target>
@@ -1068,8 +1074,8 @@ Comanda este declanșată dacă:
<source>Show examples</source>
<target>Arată exemple</target>
-<source>Time span:</source>
-<target>Intervalul de Timp:</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>Selectează regulile filtrului pentru a exclude anumite file de la sincronizare. Introdu căile filelor relative la perechea lor de dosare corespondentă.</target>
<source>File size:</source>
<target>Mărimea Filei:</target>
@@ -1080,8 +1086,8 @@ Comanda este declanșată dacă:
<source>Maximum:</source>
<target>Maxim:</target>
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target>Selectează regulile filtrului pentru a exclude anumite file de la sincronizare. Introdu căile filelor relative la perechea lor de dosare corespondentă.</target>
+<source>Time span:</source>
+<target>Intervalul de Timp:</target>
<source>C&lear</source>
<target>C&urăță</target>
@@ -1112,9 +1118,18 @@ Comanda este declanșată dacă:
<source>&Versioning</source>
<target>&Versionare</target>
+<source>Move files to a user-defined folder</source>
+<target>Mută filele într-un dosar stabilit de utilizator</target>
+
<source>Naming convention:</source>
<target>Convenție de numire:</target>
+<source>Limit file versions:</source>
+<target>Limitează versiunile filelor:</target>
+
+<source>Last x days:</source>
+<target>Ultimele x zile:</target>
+
<source>Ignore errors</source>
<target>Ignoră erorile</target>
@@ -1256,11 +1271,8 @@ Comanda este declanșată dacă:
<source>Save log:</source>
<target>Salvează jurnalul:</target>
-<source>Limit:</source>
-<target>Limită:</target>
-
-<source>Limit maximum number of log files</source>
-<target>Limitează numărul maxim de file jurnal</target>
+<source>Limit number of log files:</source>
+<target>Limitează numărul filelor de jurnalizare:</target>
<source>How can I schedule a batch job?</source>
<target>Cum pot planifica o sarcină set?</target>
@@ -1295,9 +1307,6 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Transfer file and folder permissions.</source>
<target>Sînt transferate și permisiunile de accesare NTFS ale filelor și dosarelor (Atenție: doar pentru utilizatorii avansați!).</target>
-<source>Show hidden dialogs again</source>
-<target>Arată din nou dialogurile ascunse</target>
-
<source>Show all permanently hidden dialogs and warning messages again</source>
<target>Sînt arătate din nou dialogurile și mesajele de eroare care au fost ascunse permanent</target>
@@ -1388,9 +1397,6 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Select Time Span</source>
<target>Selectează Intervalul de Timp</target>
-<source>FreeFileSync Donation Edition</source>
-<target>FreeFileSync Ediție pentru Donatori</target>
-
<source>Highlight Configurations</source>
<target>Evidențiază Configurațiile</target>
@@ -1518,6 +1524,9 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Select time span...</source>
<target>Selectează Intervalul de Timp...</target>
+<source>Donation Edition</source>
+<target>Ediția pentru Donatori</target>
+
<source>Folder Comparison and Synchronization</source>
<target>Comparare și Sincronizare de Dosare</target>
@@ -1719,6 +1728,12 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Parameters for opposite side</source>
<target>Parametrii pentru partea opusă</target>
+<source>Show hidden dialogs again</source>
+<target>Arată din nou dialogurile ascunse</target>
+
+<source>All dialogs shown</source>
+<target>Toate dialogurile arătate</target>
+
<source>Downloading update...</source>
<target>Descarc actualizarea...</target>
@@ -1758,9 +1773,6 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>This year</source>
<target>Anul ăsta</target>
-<source>Last x days</source>
-<target>Ultimele x zile</target>
-
<source>Byte</source>
<target>Baiți</target>
@@ -1776,9 +1788,6 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Delete and overwrite files permanently</source>
<target>Șterge și suprascrie filele în mod definitiv</target>
-<source>Move files to a user-defined folder</source>
-<target>Mută filele într-un dosar stabilit de utilizator</target>
-
<source>Replace</source>
<target>Înlocuiește</target>
@@ -1788,6 +1797,12 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Time stamp</source>
<target>Marcaj Temporal</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>Mută filele într-un dosar cu marcaj temporal</target>
+
+<source>File</source>
+<target>Filă</target>
+
<source>Append a time stamp to each file name</source>
<target>Adaugă un marcaj temporal la numele fiecărei file</target>
@@ -1809,12 +1824,12 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Leave as unresolved conflict</source>
<target>Lasă ca conflict nerezolvat</target>
-<source>File</source>
-<target>Filă</target>
-
<source>YYYY-MM-DD hhmmss</source>
<target>AAAA-LL-ZZ hhmmss</target>
+<source>Minimum version count must be smaller than maximum count.</source>
+<target>Numărul minim al versiunii trebuie să fie mai mic decît numărul maxim.</target>
+
<source>Files</source>
<target>File</target>
@@ -1964,8 +1979,8 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Portable</source>
<target>Portabilă</target>
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>Salvează setările în "%APPDATA%\FreeFileSync"</target>
+<source>Save settings in %x</source>
+<target>Salvează setările în %x</target>
<source>Register FreeFileSync file extensions</source>
<target>Înregistrează extensiile de file FreeFileSync</target>
diff --git a/FreeFileSync/Build/Languages/russian.lng b/FreeFileSync/Build/Languages/russian.lng
index 67606f38..643c49a5 100755
--- a/FreeFileSync/Build/Languages/russian.lng
+++ b/FreeFileSync/Build/Languages/russian.lng
@@ -115,11 +115,20 @@
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
<target>Установочные файлы повреждены. Переустановите FreeFileSync.</target>
+<source>Cannot load file %x.</source>
+<target>Невозможно загрузить файл %x.</target>
+
<source>Cannot find the following folders:</source>
<target>Невозможно найти следующие папки:</target>
-<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>Если эта ошибка будет проигнорирована, то папки выше будут рассматриваться как пустые. Недостающие папки создаются автоматически, когда это необходимо.</target>
+<source>The following folders do not yet exist:</source>
+<target>Следующих папок еще не существует:</target>
+
+<source>The folders are created automatically when needed.</source>
+<target>Папки создаются автоматически, когда это необходимо.</target>
+
+<source>Scanning:</source>
+<target>Сканирую:</target>
<source>Comparison finished:</source>
<target>Сравнение окончено:</target>
@@ -215,6 +224,64 @@
<source>Out of memory.</source>
<target>Недостаточно памяти.</target>
+<source>Database file %x is incompatible.</source>
+<target>Файл базы данных %x несовместим.</target>
+
+<source>Initial synchronization:</source>
+<target>Первоначальная синхронизация:</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>Файл базы данных %x еще не существует.</target>
+
+<source>Database file is corrupted:</source>
+<target>Файл базы данных поврежден:</target>
+
+<source>Cannot write file %x.</source>
+<target>Невозможно записать файл %x.</target>
+
+<source>Cannot read file %x.</source>
+<target>Невозможно прочитать файл %x.</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>Файлы базы данных еще не содержат информацию о последней синхронизации.</target>
+
+<source>Loading file %x...</source>
+<target>Загрузка файла %x...</target>
+
+<source>Saving file %x...</source>
+<target>Сохранение файла %x...</target>
+
+<source>Searching for folder %x...</source>
+<target>Поиск папки %x...</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>Тайм-аут при поиске папки %x.</target>
+
+<source>Cannot get process information.</source>
+<target>Невозможно получить информацию о процессе.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Невозможно прочитать атрибуты файла %x.</target>
+
+<source>Waiting while directory is locked:</source>
+<target>Ожидание снятия блокировки с папки:</target>
+
+<source>Lock owner:</source>
+<target>Источник блокировки:</target>
+
+<source>Detecting abandoned lock...</source>
+<target>Обнаружение заброшенной блокировки...</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>%x секунда</pluralform>
+<pluralform>%x секунды</pluralform>
+<pluralform>%x секунд</pluralform>
+</target>
+
<source>Item exists on left side only</source>
<target>Элемент существует только на левой стороне</target>
@@ -269,8 +336,189 @@
<source>Update attributes on right</source>
<target>Обновление атрибутов справа</target>
-<source>Cannot read file %x.</source>
-<target>Невозможно прочитать файл %x.</target>
+<source>Items processed:</source>
+<target>Элементов обработано:</target>
+
+<source>Items remaining:</source>
+<target>Элементов осталось:</target>
+
+<source>Total time:</source>
+<target>Общее время:</target>
+
+<source>Cleaning up log files:</source>
+<target>Очистка лог-файлов (журналов):</target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>Ошибка при разборе файла %x, строка %y, колонка %z.</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>Невозможно установить блокировки для следующих папок:</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>%x поток</pluralform>
+<pluralform>%x потока</pluralform>
+<pluralform>%x потоков</pluralform>
+</target>
+
+<source>Cannot read directory %x.</source>
+<target>Невозможно прочитать папку %x.</target>
+
+<source>/sec</source>
+<target>/с</target>
+
+<source>%x items/sec</source>
+<target>%x элементов/с</target>
+
+<source>Show in Explorer</source>
+<target>Показать в Проводнике</target>
+
+<source>Open with default application</source>
+<target>Открыть с помощью приложения по умолчанию</target>
+
+<source>Browse directory</source>
+<target>Обзор папок</target>
+
+<source>Unable to connect to %x.</source>
+<target>Невозможно соединиться с %x.</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>Невозможно получить доступ к службе Теневого Копирования Тома.</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>Пожалуйста, запустите 64-битную версию FreeFileSync, чтобы создать теневые копии на этой системе.</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>Невозможно определить имя тома для %x.</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>Имя тома %x не является частью имени файла %y.</target>
+
+<source>File time and size</source>
+<target>Дата и размер файла</target>
+
+<source>File content</source>
+<target>Содержимое файла</target>
+
+<source>File size</source>
+<target>Размер файла</target>
+
+<source>Two way</source>
+<target>В обе стороны</target>
+
+<source>Mirror</source>
+<target>Зеркало</target>
+
+<source>Update</source>
+<target>Обновить</target>
+
+<source>Custom</source>
+<target>Выборочно</target>
+
+<source>Multiple...</source>
+<target>Различные варианты синхронизации...</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>Невозможно записать атрибуты файла %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Невозможно открыть файл %x.</target>
+
+<source>%x and %y have different content.</source>
+<target>%x и %y имеют разное содержание.</target>
+
+<source>Data verification error:</source>
+<target>Ошибка верификации данных:</target>
+
+<source>Moving file %x to %y</source>
+<target>Перемещение файла %x в %y</target>
+
+<source>Moving folder %x to %y</source>
+<target>Перемещение папки %x в %y</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>Перемещение символьной ссылки %x в %y</target>
+
+<source>Updating file %x</source>
+<target>Обновление файла %x</target>
+
+<source>Updating symbolic link %x</source>
+<target>Обновление символьной ссылки %x</target>
+
+<source>Verifying file %x</source>
+<target>Проверка файла %x</target>
+
+<source>Updating attributes of %x</source>
+<target>Обновление атрибутов %x</target>
+
+<source>Source item %x not found</source>
+<target>Исходный элемент %x не найден</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>Создание Тома Теневого Копирования для %x...</target>
+
+<source>Cannot find folder %x.</source>
+<target>Невозможно найти папку %x.</target>
+
+<source>Target folder %x already existing.</source>
+<target>Целевая папка %x уже существует.</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>Поле ввода целевой папки не должно быть пустым.</target>
+
+<source>Source folder %x not found.</source>
+<target>Исходная папка %x не найдена.</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>Пожалуйста, введите целевую папку для архивирования файлов.</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>Следующие элементы имеют неурегулированные конфликты и не будут синхронизированы:</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>Следующие папки значительно отличаются. Пожалуйста, проверьте, что выбраны правильные папки для синхронизации.</target>
+
+<source>Not enough free disk space available in:</source>
+<target>Не достаточно свободного места в:</target>
+
+<source>Required:</source>
+<target>Требуется:</target>
+
+<source>Available:</source>
+<target>Доступно:</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>Некоторые файлы будут синхронизированы как часть нескольких базовых папок.</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>Чтобы избежать конфликтов, настройте фильтры исключения так, чтобы каждый обновленный файл учитывался только одной базовой папкой.</target>
+
+<source>Versioning folder:</source>
+<target>Папка для архивирования файлов:</target>
+
+<source>Base folder:</source>
+<target>Базовая папка:</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>Папка для архивирования файлов находится в базовой папке.</target>
+
+<source>Synchronizing folder pair:</source>
+<target>Синхронизация пары папок:</target>
+
+<source>Generating database...</source>
+<target>Создание базы данных...</target>
+
+<source>Searching for excess file versions:</source>
+<target>Поиск лишних версий файлов:</target>
+
+<source>Removing excess file versions:</source>
+<target>Удаление лишних версий файлов:</target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>Невозможно создать метку времени для архивирования файлов:</target>
<source>
Unexpected size of data stream.
@@ -289,17 +537,14 @@ Actual: %y bytes
<source>Operation not supported for different base folder types.</source>
<target>Операция не поддерживается для разных базовых типов папок.</target>
-<source>Cannot write file %x.</source>
-<target>Невозможно записать файл %x.</target>
-
<source>Cannot move file %x to %y.</source>
<target>Невозможно перенести файл %x в %y.</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>Невозможно скопировать символьную ссылку %x в %y.</target>
-<source>Unable to connect to %x.</source>
-<target>Невозможно соединиться с %x.</target>
+<source>Error Code %x</source>
+<target>Код ошибки %x</target>
<source>Failed to get information about server %x.</source>
<target>Не удалось получить информацию о сервере %x.</target>
@@ -307,12 +552,6 @@ Actual: %y bytes
<source>Cannot open directory %x.</source>
<target>Невозможно открыть папку %x.</target>
-<source>Cannot read directory %x.</source>
-<target>Невозможно прочитать папку %x.</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>Невозможно прочитать атрибуты файла %x.</target>
-
<source>Cannot create directory %x.</source>
<target>Невозможно создать папку %x.</target>
@@ -340,9 +579,6 @@ Actual: %y bytes
<source>Cannot find device %x.</source>
<target>Невозможно найти устройство %x.</target>
-<source>Cannot open file %x.</source>
-<target>Невозможно открыть файл %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Тип элемента %x не поддерживается:</target>
@@ -355,15 +591,9 @@ Actual: %y bytes
<source>Incorrect command line:</source>
<target>Неверная командная строка:</target>
-<source>Error Code %x</source>
-<target>Код ошибки %x</target>
-
<source>The server does not support authentication via %x.</source>
<target>Сервер не поддерживает аутентификацию с помощью %x.</target>
-<source>Required:</source>
-<target>Требуется:</target>
-
<source>Unable to access %x.</source>
<target>Невозможно получить доступ к %x.</target>
@@ -412,125 +642,9 @@ Actual: %y bytes
<source>%x GB</source>
<target>%x ГБ</target>
-<source>Cannot load file %x.</source>
-<target>Невозможно загрузить файл %x.</target>
-
-<source>Database file %x is incompatible.</source>
-<target>Файл базы данных %x несовместим.</target>
-
-<source>Initial synchronization:</source>
-<target>Первоначальная синхронизация:</target>
-
-<source>Database file %x does not yet exist.</source>
-<target>Файл базы данных %x еще не существует.</target>
-
-<source>Database file is corrupted:</source>
-<target>Файл базы данных поврежден:</target>
-
-<source>The database files do not yet contain information about the last synchronization.</source>
-<target>Файлы базы данных еще не содержат информацию о последней синхронизации.</target>
-
-<source>Loading file %x...</source>
-<target>Загрузка файла %x...</target>
-
-<source>Saving file %x...</source>
-<target>Сохранение файла %x...</target>
-
-<source>Searching for folder %x...</source>
-<target>Поиск папки %x...</target>
-
-<source>Timeout while searching for folder %x.</source>
-<target>Тайм-аут при поиске папки %x.</target>
-
-<source>Cannot get process information.</source>
-<target>Невозможно получить информацию о процессе.</target>
-
-<source>Waiting while directory is locked:</source>
-<target>Ожидание снятия блокировки с папки:</target>
-
-<source>Lock owner:</source>
-<target>Источник блокировки:</target>
-
-<source>Detecting abandoned lock...</source>
-<target>Обнаружение заброшенной блокировки...</target>
-
-<source>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</source>
-<target>
-<pluralform>%x секунда</pluralform>
-<pluralform>%x секунды</pluralform>
-<pluralform>%x секунд</pluralform>
-</target>
-
-<source>Items processed:</source>
-<target>Элементов обработано:</target>
-
-<source>Items remaining:</source>
-<target>Элементов осталось:</target>
-
-<source>Total time:</source>
-<target>Общее время:</target>
-
-<source>Cleaning up old log files...</source>
-<target>Очистка старых лог-файлов (журналов)...</target>
-
-<source>Error parsing file %x, row %y, column %z.</source>
-<target>Ошибка при разборе файла %x, строка %y, колонка %z.</target>
-
-<source>Cannot set directory locks for the following folders:</source>
-<target>Невозможно установить блокировки для следующих папок:</target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-<pluralform>%x поток</pluralform>
-<pluralform>%x потока</pluralform>
-<pluralform>%x потоков</pluralform>
-</target>
-
-<source>Scanning:</source>
-<target>Сканирую:</target>
-
-<source>/sec</source>
-<target>/с</target>
-
-<source>%x items/sec</source>
-<target>%x элементов/с</target>
-
-<source>Show in Explorer</source>
-<target>Показать в Проводнике</target>
-
-<source>Open with default application</source>
-<target>Открыть с помощью приложения по умолчанию</target>
-
-<source>Browse directory</source>
-<target>Обзор папок</target>
-
-<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>Невозможно получить доступ к службе Теневого Копирования Тома.</target>
-
-<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>Пожалуйста, запустите 64-битную версию FreeFileSync, чтобы создать теневые копии на этой системе.</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>Невозможно определить имя тома для %x.</target>
-
-<source>Volume name %x is not part of file path %y.</source>
-<target>Имя тома %x не является частью имени файла %y.</target>
-
-<source>Unable to create time stamp for versioning:</source>
-<target>Невозможно создать отметку времени для архивирования файлов:</target>
-
<source>Drag && drop</source>
<target>Drag && drop</target>
-<source>Cannot find folder %x.</source>
-<target>Невозможно найти папку %x.</target>
-
<source>Select a folder</source>
<target>Выбрать папку</target>
@@ -626,8 +740,8 @@ The command is triggered if:
<source>Directory monitoring active</source>
<target>Слежение за папками активировано</target>
-<source>Waiting until all directories are available...</source>
-<target>Ожидать, пока все папки станут доступны...</target>
+<source>Waiting until directory is available:</source>
+<target>Ожидание доступа к папке:</target>
<source>&Restore</source>
<target>&Восстановить</target>
@@ -641,114 +755,6 @@ The command is triggered if:
<source>&Retry</source>
<target>&Повторить</target>
-<source>File time and size</source>
-<target>Дата и размер файла</target>
-
-<source>File content</source>
-<target>Содержимое файла</target>
-
-<source>File size</source>
-<target>Размер файла</target>
-
-<source>Two way</source>
-<target>В обе стороны</target>
-
-<source>Mirror</source>
-<target>Зеркало</target>
-
-<source>Update</source>
-<target>Обновить</target>
-
-<source>Custom</source>
-<target>Выборочно</target>
-
-<source>Multiple...</source>
-<target>Различные варианты синхронизации...</target>
-
-<source>Cannot write file attributes of %x.</source>
-<target>Невозможно записать атрибуты файла %x.</target>
-
-<source>%x and %y have different content.</source>
-<target>%x и %y имеют разное содержание.</target>
-
-<source>Data verification error:</source>
-<target>Ошибка верификации данных:</target>
-
-<source>Moving file %x to %y</source>
-<target>Перемещение файла %x в %y</target>
-
-<source>Moving folder %x to %y</source>
-<target>Перемещение папки %x в %y</target>
-
-<source>Moving symbolic link %x to %y</source>
-<target>Перемещение символьной ссылки %x в %y</target>
-
-<source>Removing old versions...</source>
-<target>Удаление старых версий...</target>
-
-<source>Updating file %x</source>
-<target>Обновление файла %x</target>
-
-<source>Updating symbolic link %x</source>
-<target>Обновление символьной ссылки %x</target>
-
-<source>Verifying file %x</source>
-<target>Проверка файла %x</target>
-
-<source>Updating attributes of %x</source>
-<target>Обновление атрибутов %x</target>
-
-<source>Source item %x not found</source>
-<target>Исходный элемент %x не найден</target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>Создание Тома Теневого Копирования для %x...</target>
-
-<source>Target folder %x already existing.</source>
-<target>Целевая папка %x уже существует.</target>
-
-<source>Target folder input field must not be empty.</source>
-<target>Поле ввода целевой папки не должно быть пустым.</target>
-
-<source>Source folder %x not found.</source>
-<target>Исходная папка %x не найдена.</target>
-
-<source>Please enter a target folder for versioning.</source>
-<target>Пожалуйста, введите целевую папку для архивирования файлов.</target>
-
-<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>Следующие элементы имеют неурегулированные конфликты и не будут синхронизированы:</target>
-
-<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>Следующие папки значительно отличаются. Пожалуйста, проверьте, что выбраны правильные папки для синхронизации.</target>
-
-<source>Not enough free disk space available in:</source>
-<target>Не достаточно свободного места в:</target>
-
-<source>Available:</source>
-<target>Доступно:</target>
-
-<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>Некоторые файлы будут синхронизированы как часть нескольких базовых папок.</target>
-
-<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>Чтобы избежать конфликтов, настройте фильтры исключения так, чтобы каждый обновленный файл учитывался только одной базовой папкой.</target>
-
-<source>Versioning folder:</source>
-<target>Папка для архивирования файлов:</target>
-
-<source>Base folder:</source>
-<target>Базовая папка:</target>
-
-<source>The versioning folder is contained in a base folder.</source>
-<target>Папка для архивирования файлов находится в базовой папке.</target>
-
-<source>Synchronizing folder pair:</source>
-<target>Синхронизация пары папок:</target>
-
-<source>Generating database...</source>
-<target>Создание базы данных...</target>
-
<source>Loading...</source>
<target>Загрузка...</target>
@@ -895,7 +901,7 @@ The command is triggered if:
<target>Пожалуйста, выберите папку в локальной файловой системе, сети или MTP устройстве.</target>
<source>Defined by context of use</source>
-<target></target>
+<target>Определеяется контекстом использования</target>
<source>Requires FreeFileSync Donation Edition</source>
<target>Требуется платная версия FreeFileSync</target>
@@ -1068,20 +1074,20 @@ The command is triggered if:
<source>Show examples</source>
<target>Показать примеры</target>
-<source>Time span:</source>
-<target>Промежуток времени:</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>Выберите правила фильтрации для исключения определенных файлов из синхронизации. Введите пути файлов относящиеся к соответствующим парам папок.</target>
<source>File size:</source>
<target>Размер файла:</target>
<source>Minimum:</source>
-<target>минимум:</target>
+<target>Минимум:</target>
<source>Maximum:</source>
-<target>максимум:</target>
+<target>Максимум:</target>
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target>Выберите правила фильтрации для исключения определенных файлов из синхронизации. Введите пути файлов относящиеся к соответствующим парам папок.</target>
+<source>Time span:</source>
+<target>Промежуток времени:</target>
<source>C&lear</source>
<target>&Очистить</target>
@@ -1112,9 +1118,18 @@ The command is triggered if:
<source>&Versioning</source>
<target>&Архивировать</target>
+<source>Move files to a user-defined folder</source>
+<target>Перемещать файлы в пользовательскую папку</target>
+
<source>Naming convention:</source>
<target>Условие переименования:</target>
+<source>Limit file versions:</source>
+<target>Ограничить версию файла:</target>
+
+<source>Last x days:</source>
+<target>Последние x дней:</target>
+
<source>Ignore errors</source>
<target>Игнорировать ошибки</target>
@@ -1256,11 +1271,8 @@ The command is triggered if:
<source>Save log:</source>
<target>Сохранять лог-файлы (журналы):</target>
-<source>Limit:</source>
-<target>Ограничение:</target>
-
-<source>Limit maximum number of log files</source>
-<target>Ограничить максимальное количество лог-файлов (журналов)</target>
+<source>Limit number of log files:</source>
+<target>Ограничить количество лог-файлов (журналов):</target>
<source>How can I schedule a batch job?</source>
<target>Как запланировать пакетное задание?</target>
@@ -1295,9 +1307,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Transfer file and folder permissions.</source>
<target>Передача прав доступа к файлам/папкам.</target>
-<source>Show hidden dialogs again</source>
-<target>Показать скрытые окна снова</target>
-
<source>Show all permanently hidden dialogs and warning messages again</source>
<target>Показать все скрытые окна и сообщения с предупреждениями снова</target>
@@ -1388,9 +1397,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Select Time Span</source>
<target>Выбор промежутка времени</target>
-<source>FreeFileSync Donation Edition</source>
-<target>Платная версия FreeFileSync</target>
-
<source>Highlight Configurations</source>
<target>Выделение конфигураций</target>
@@ -1518,6 +1524,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Select time span...</source>
<target>Выберите промежуток времени...</target>
+<source>Donation Edition</source>
+<target>Платная версия</target>
+
<source>Folder Comparison and Synchronization</source>
<target>Сравнение и синхронизация</target>
@@ -1719,6 +1728,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Parameters for opposite side</source>
<target>Параметры для противоположной стороны</target>
+<source>Show hidden dialogs again</source>
+<target>Показать скрытые окна снова</target>
+
+<source>All dialogs shown</source>
+<target>Все окна отображаются</target>
+
<source>Downloading update...</source>
<target>Загрузка обновления...</target>
@@ -1758,9 +1773,6 @@ This guarantees a consistent state even in case of a serious error.
<source>This year</source>
<target>последний год</target>
-<source>Last x days</source>
-<target>последние X дня(ей)</target>
-
<source>Byte</source>
<target>Байт</target>
@@ -1776,9 +1788,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Delete and overwrite files permanently</source>
<target>Удалять или перезаписывать файлы безвозвратно</target>
-<source>Move files to a user-defined folder</source>
-<target>Перемещать файлы в пользовательскую папку</target>
-
<source>Replace</source>
<target>Без переименования</target>
@@ -1786,10 +1795,16 @@ This guarantees a consistent state even in case of a serious error.
<target>Переместить файлы и заменить, если существуют</target>
<source>Time stamp</source>
-<target>Добавить отметку времени</target>
+<target>Добавить метку времени</target>
+
+<source>Move files into a time-stamped subfolder</source>
+<target>Переместить файлы в подпапку с меткой времени</target>
+
+<source>File</source>
+<target>Файл</target>
<source>Append a time stamp to each file name</source>
-<target>Добавить отметку времени для каждого имени файла</target>
+<target>Добавить метку времени для каждого имени файла</target>
<source>On completion:</source>
<target>По завершению:</target>
@@ -1809,12 +1824,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Leave as unresolved conflict</source>
<target>Оставить как нерешенный конфликт</target>
-<source>File</source>
-<target>Файл</target>
-
<source>YYYY-MM-DD hhmmss</source>
<target>ГГГГ-ММ-ДД ччммсс</target>
+<source>Minimum version count must be smaller than maximum count.</source>
+<target>Минимальное количество версий должно быть меньше максимального количества версий.</target>
+
<source>Files</source>
<target>Файлы</target>
@@ -1964,8 +1979,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Portable</source>
<target>Портативная</target>
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>Сохраняет настройки в "%APPDATA%\FreeFileSync"</target>
+<source>Save settings in %x</source>
+<target>Сохранять настройки в %x</target>
<source>Register FreeFileSync file extensions</source>
<target>Регистрирует расширения файлов FreeFileSync</target>
diff --git a/FreeFileSync/Build/Languages/slovak.lng b/FreeFileSync/Build/Languages/slovak.lng
index 769d28dc..82d56212 100755
--- a/FreeFileSync/Build/Languages/slovak.lng
+++ b/FreeFileSync/Build/Languages/slovak.lng
@@ -115,11 +115,20 @@
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
<target>Inštalačný súbor je poškodený. Prosím preinštalujte FreeFileSync.</target>
+<source>Cannot load file %x.</source>
+<target>Nie je možné načítať súbor %x.</target>
+
<source>Cannot find the following folders:</source>
<target>Nie je možné nájsť následujúce priečinky:</target>
-<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>Ak bude táto chyba ignorovaná, budú tieto priečinky považované za prázdne.</target>
+<source>The following folders do not yet exist:</source>
+<target>Nasledujúce priečinky ešte neexistujú:</target>
+
+<source>The folders are created automatically when needed.</source>
+<target>V prípade potrewby sa priečinky vytvoria automaticky.</target>
+
+<source>Scanning:</source>
+<target>Vyhľadávanie:</target>
<source>Comparison finished:</source>
<target>Dokončilo sa porovnávanie:</target>
@@ -215,6 +224,64 @@
<source>Out of memory.</source>
<target>Nedostatok pracovnej pamäti.</target>
+<source>Database file %x is incompatible.</source>
+<target>Databázy súbor %x je nekompatibilný.</target>
+
+<source>Initial synchronization:</source>
+<target>Prvá synchronizácia:</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>Databázový súbor %x neexistuje.</target>
+
+<source>Database file is corrupted:</source>
+<target>Databázový súbor je poškodený:</target>
+
+<source>Cannot write file %x.</source>
+<target>Nie je možné zapísať súbor %x.</target>
+
+<source>Cannot read file %x.</source>
+<target>Nie je možné načítať súbor %x.</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>Databázový súbor ešte neobsahuje informácie o poslednej synchronizácií.</target>
+
+<source>Loading file %x...</source>
+<target>Načítavanie súboru %x...</target>
+
+<source>Saving file %x...</source>
+<target>Ukládanie súboru %x...</target>
+
+<source>Searching for folder %x...</source>
+<target>Vyhľadávanie priečinka %x...</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>Vypršal časový limit pre nájdenie priečinka %x.</target>
+
+<source>Cannot get process information.</source>
+<target>Nie je možné získať informácie procesu.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Nie je možné načítať atribúty súboru %x.</target>
+
+<source>Waiting while directory is locked:</source>
+<target>Čakanie na uzamknutie adresára:</target>
+
+<source>Lock owner:</source>
+<target>Vlastník uzamknutia:</target>
+
+<source>Detecting abandoned lock...</source>
+<target>Preverovanie uzamknutia...</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 sekunda</pluralform>
+<pluralform>%x sekundy</pluralform>
+<pluralform>%x sekúnd</pluralform>
+</target>
+
<source>Item exists on left side only</source>
<target>Položky existujúce iba vľavo</target>
@@ -269,8 +336,189 @@
<source>Update attributes on right</source>
<target>Aktualizovať atribúty napravo</target>
-<source>Cannot read file %x.</source>
-<target>Nie je možné načítať súbor %x.</target>
+<source>Items processed:</source>
+<target>Spracovaných položiek:</target>
+
+<source>Items remaining:</source>
+<target>Ostáva položiek:</target>
+
+<source>Total time:</source>
+<target>Celkový čas:</target>
+
+<source>Cleaning up log files:</source>
+<target>Odstránenie log súborov:</target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>Chyba spracovania súboru %x: na riadku %y v stĺpci %z.</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>Nie je možné nastaviť uzamknutie adresárov pre nasledujúce priečinky:</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>1 proces</pluralform>
+<pluralform>%x procesy</pluralform>
+<pluralform>%x procesov</pluralform>
+</target>
+
+<source>Cannot read directory %x.</source>
+<target>Nie je možné načítať adresár %x.</target>
+
+<source>/sec</source>
+<target>/s</target>
+
+<source>%x items/sec</source>
+<target>%x položiek/s</target>
+
+<source>Show in Explorer</source>
+<target>Zobraziť v Prieskumníkovi</target>
+
+<source>Open with default application</source>
+<target>Otvoriť predvolenou aplikáciou</target>
+
+<source>Browse directory</source>
+<target>Prechádzať adresár</target>
+
+<source>Unable to connect to %x.</source>
+<target>Nie je možné vytvoriť pripojenie k %x.</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>Nie je prístup k službe Tieňové kópie.</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>Prosím spustite 64-bitovú verziu FreeFileSync, pre vytvorenie Tieň. kópie v tomto systéme.</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>>Nie je možné zistiť názov jednotky pre %x.</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>Názov disku %x nie je súčásťou cesty súboru %y.</target>
+
+<source>File time and size</source>
+<target>Podľa času a veľkosti súboru</target>
+
+<source>File content</source>
+<target>Podľa obsahu súboru</target>
+
+<source>File size</source>
+<target>Podľa veľkosti súboru</target>
+
+<source>Two way</source>
+<target>Obidve strany</target>
+
+<source>Mirror</source>
+<target>Zrkadlenie</target>
+
+<source>Update</source>
+<target>Aktualizácia</target>
+
+<source>Custom</source>
+<target>Vlastné</target>
+
+<source>Multiple...</source>
+<target>Rôzne...</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>Nie je možné zapísať atribúty súboru %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Nie je možné otvoriť súbor %x.</target>
+
+<source>%x and %y have different content.</source>
+<target>%x a %y majú odlišný obsah.</target>
+
+<source>Data verification error:</source>
+<target>Chyba verifikácie údajov:</target>
+
+<source>Moving file %x to %y</source>
+<target>Presúvanie súboru %x do %y</target>
+
+<source>Moving folder %x to %y</source>
+<target>Presúvanie priečinka %x do %y</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>Presúvanie symbolického odkazu %x do %y</target>
+
+<source>Updating file %x</source>
+<target>Aktualizácia súboru %x</target>
+
+<source>Updating symbolic link %x</source>
+<target>Aktualizácia symbolického odkazu %x</target>
+
+<source>Verifying file %x</source>
+<target>Verifikácia súboru %x</target>
+
+<source>Updating attributes of %x</source>
+<target>Aktualizácia atribútov súboru %x</target>
+
+<source>Source item %x not found</source>
+<target>Zdrojová položka %x sa nenašla</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>Vytváranie Tieňovej kópie zväzkov pre %x...</target>
+
+<source>Cannot find folder %x.</source>
+<target>Nie je možné nájsť priečinok %x.</target>
+
+<source>Target folder %x already existing.</source>
+<target>Cieľový priečinok %x už existuje.</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>Cieľový priečinok nesmie byť prázdny.</target>
+
+<source>Source folder %x not found.</source>
+<target>Zdrojový priečinok %x nie je možné nájsť.</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>Prosím zadajte cieľový priečinok pre verzovanie.</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>Následujúce položky majú nevyriešené konflikty a nebudú synchronizované:</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>Nasledujúce priečinky sa signifikantne líšia. Prosím overte, či sú vybrané správne priečinky pre synchronizáciu.</target>
+
+<source>Not enough free disk space available in:</source>
+<target>Nedostatok miesta na disku:</target>
+
+<source>Required:</source>
+<target>Požadované:</target>
+
+<source>Available:</source>
+<target>K dispozícií:</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>Niektoré súbory budú synchronizované ako súčasť viacerých základných priečinkov.</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>Aby nedošlo ku konfliktom, je potrebné nastaviť filter tak, aby každý aktualiz. súbor mal iba jeden základný priečinok.</target>
+
+<source>Versioning folder:</source>
+<target>Priečinok verzovania:</target>
+
+<source>Base folder:</source>
+<target>Základný priečinok:</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>Priečinok pre verzovanie je obsiahnutý v základnom priečinku.</target>
+
+<source>Synchronizing folder pair:</source>
+<target>Synchronizácia dvojice priečinkov:</target>
+
+<source>Generating database...</source>
+<target>Vytváranie databázy...</target>
+
+<source>Searching for excess file versions:</source>
+<target>Hľadanie prebytočných verzií súborov:</target>
+
+<source>Removing excess file versions:</source>
+<target>Odstránenie prebytočných verzií súborov:</target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>Nie je možné vytvoriť časovú značku verzovania:</target>
<source>
Unexpected size of data stream.
@@ -289,17 +537,14 @@ Aktuálne: %y b
<source>Operation not supported for different base folder types.</source>
<target>Operácia nie je podporovaná pre rozdielne typy základných priečinkov.</target>
-<source>Cannot write file %x.</source>
-<target>Nie je možné zapísať súbor %x.</target>
-
<source>Cannot move file %x to %y.</source>
<target>Nie je možné presunúť súbor %x do %y.</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>Nie je možné kopírovať symbolický odkaz %x do %y.</target>
-<source>Unable to connect to %x.</source>
-<target>Nie je možné vytvoriť pripojenie k %x.</target>
+<source>Error Code %x</source>
+<target>Chybový kód %x</target>
<source>Failed to get information about server %x.</source>
<target>Získanie informácií o servere %x bolo neúspešné.</target>
@@ -307,12 +552,6 @@ Aktuálne: %y b
<source>Cannot open directory %x.</source>
<target>Nie je možné otvoriť adresár %x.</target>
-<source>Cannot read directory %x.</source>
-<target>Nie je možné načítať adresár %x.</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>Nie je možné načítať atribúty súboru %x.</target>
-
<source>Cannot create directory %x.</source>
<target>Nie je možné vytvoriť adresár %x.</target>
@@ -340,9 +579,6 @@ Aktuálne: %y b
<source>Cannot find device %x.</source>
<target>Nie je možné nájsť zariadenie %x.</target>
-<source>Cannot open file %x.</source>
-<target>Nie je možné otvoriť súbor %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Typ položky %x nie je podporovaný:</target>
@@ -355,15 +591,9 @@ Aktuálne: %y b
<source>Incorrect command line:</source>
<target>Neplatný príkaz:</target>
-<source>Error Code %x</source>
-<target>Chybový kód %x</target>
-
<source>The server does not support authentication via %x.</source>
<target>Server nepodporuje overenie pomocou %x.</target>
-<source>Required:</source>
-<target>Požadované:</target>
-
<source>Unable to access %x.</source>
<target>Nie je možný prístup k %x.</target>
@@ -412,125 +642,9 @@ Aktuálne: %y b
<source>%x GB</source>
<target>%x GB</target>
-<source>Cannot load file %x.</source>
-<target>Nie je možné načítať súbor %x.</target>
-
-<source>Database file %x is incompatible.</source>
-<target>Databázy súbor %x je nekompatibilný.</target>
-
-<source>Initial synchronization:</source>
-<target>Prvá synchronizácia:</target>
-
-<source>Database file %x does not yet exist.</source>
-<target>Databázový súbor %x neexistuje.</target>
-
-<source>Database file is corrupted:</source>
-<target>Databázový súbor je poškodený:</target>
-
-<source>The database files do not yet contain information about the last synchronization.</source>
-<target>Databázový súbor ešte neobsahuje informácie o poslednej synchronizácií.</target>
-
-<source>Loading file %x...</source>
-<target>Načítavanie súboru %x...</target>
-
-<source>Saving file %x...</source>
-<target>Ukládanie súboru %x...</target>
-
-<source>Searching for folder %x...</source>
-<target>Vyhľadávanie priečinka %x...</target>
-
-<source>Timeout while searching for folder %x.</source>
-<target>Vypršal časový limit pre nájdenie priečinka %x.</target>
-
-<source>Cannot get process information.</source>
-<target>Nie je možné získať informácie procesu.</target>
-
-<source>Waiting while directory is locked:</source>
-<target>Čakanie na uzamknutie adresára:</target>
-
-<source>Lock owner:</source>
-<target>Vlastník uzamknutia:</target>
-
-<source>Detecting abandoned lock...</source>
-<target>Preverovanie uzamknutia...</target>
-
-<source>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</source>
-<target>
-<pluralform>1 sekunda</pluralform>
-<pluralform>%x sekundy</pluralform>
-<pluralform>%x sekúnd</pluralform>
-</target>
-
-<source>Items processed:</source>
-<target>Spracovaných položiek:</target>
-
-<source>Items remaining:</source>
-<target>Ostáva položiek:</target>
-
-<source>Total time:</source>
-<target>Celkový čas:</target>
-
-<source>Cleaning up old log files...</source>
-<target>Odstráňovanie starých log súborov...</target>
-
-<source>Error parsing file %x, row %y, column %z.</source>
-<target>Chyba spracovania súboru %x: na riadku %y v stĺpci %z.</target>
-
-<source>Cannot set directory locks for the following folders:</source>
-<target>Nie je možné nastaviť uzamknutie adresárov pre nasledujúce priečinky:</target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-<pluralform>1 proces</pluralform>
-<pluralform>%x procesy</pluralform>
-<pluralform>%x procesov</pluralform>
-</target>
-
-<source>Scanning:</source>
-<target>Vyhľadávanie:</target>
-
-<source>/sec</source>
-<target>/s</target>
-
-<source>%x items/sec</source>
-<target>%x položiek/s</target>
-
-<source>Show in Explorer</source>
-<target>Zobraziť v Prieskumníkovi</target>
-
-<source>Open with default application</source>
-<target>Otvoriť predvolenou aplikáciou</target>
-
-<source>Browse directory</source>
-<target>Prechádzať adresár</target>
-
-<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>Nie je prístup k službe Tieňové kópie.</target>
-
-<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>Prosím spustite 64-bitovú verziu FreeFileSync, pre vytvorenie Tieň. kópie v tomto systéme.</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>>Nie je možné zistiť názov jednotky pre %x.</target>
-
-<source>Volume name %x is not part of file path %y.</source>
-<target>Názov disku %x nie je súčásťou cesty súboru %y.</target>
-
-<source>Unable to create time stamp for versioning:</source>
-<target>Nie je možné vytvoriť časovú značku verzovania:</target>
-
<source>Drag && drop</source>
<target>Pretiahni sem && pusť</target>
-<source>Cannot find folder %x.</source>
-<target>Nie je možné nájsť priečinok %x.</target>
-
<source>Select a folder</source>
<target>Vyberte priečinok</target>
@@ -626,8 +740,8 @@ Príkaz bude spustení ak:
<source>Directory monitoring active</source>
<target>Sledovanie adresárov je aktivne</target>
-<source>Waiting until all directories are available...</source>
-<target>Čakanie na nedostupné adresáre...</target>
+<source>Waiting until directory is available:</source>
+<target>Čaká sa, kým nie je k dispozícii adresár:</target>
<source>&Restore</source>
<target>&Obnoviť</target>
@@ -641,114 +755,6 @@ Príkaz bude spustení ak:
<source>&Retry</source>
<target>&Opakovať</target>
-<source>File time and size</source>
-<target>Podľa času a veľkosti súboru</target>
-
-<source>File content</source>
-<target>Podľa obsahu súboru</target>
-
-<source>File size</source>
-<target>Podľa veľkosti súboru</target>
-
-<source>Two way</source>
-<target>Obidve strany</target>
-
-<source>Mirror</source>
-<target>Zrkadlenie</target>
-
-<source>Update</source>
-<target>Aktualizácia</target>
-
-<source>Custom</source>
-<target>Vlastné</target>
-
-<source>Multiple...</source>
-<target>Rôzne...</target>
-
-<source>Cannot write file attributes of %x.</source>
-<target>Nie je možné zapísať atribúty súboru %x.</target>
-
-<source>%x and %y have different content.</source>
-<target>%x a %y majú odlišný obsah.</target>
-
-<source>Data verification error:</source>
-<target>Chyba verifikácie údajov:</target>
-
-<source>Moving file %x to %y</source>
-<target>Presúvanie súboru %x do %y</target>
-
-<source>Moving folder %x to %y</source>
-<target>Presúvanie priečinka %x do %y</target>
-
-<source>Moving symbolic link %x to %y</source>
-<target>Presúvanie symbolického odkazu %x do %y</target>
-
-<source>Removing old versions...</source>
-<target>Odstráňovanie starých verzií...</target>
-
-<source>Updating file %x</source>
-<target>Aktualizácia súboru %x</target>
-
-<source>Updating symbolic link %x</source>
-<target>Aktualizácia symbolického odkazu %x</target>
-
-<source>Verifying file %x</source>
-<target>Verifikácia súboru %x</target>
-
-<source>Updating attributes of %x</source>
-<target>Aktualizácia atribútov súboru %x</target>
-
-<source>Source item %x not found</source>
-<target>Zdrojová položka %x sa nenašla</target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>Vytváranie Tieňovej kópie zväzkov pre %x...</target>
-
-<source>Target folder %x already existing.</source>
-<target>Cieľový priečinok %x už existuje.</target>
-
-<source>Target folder input field must not be empty.</source>
-<target>Cieľový priečinok nesmie byť prázdny.</target>
-
-<source>Source folder %x not found.</source>
-<target>Zdrojový priečinok %x nie je možné nájsť.</target>
-
-<source>Please enter a target folder for versioning.</source>
-<target>Prosím zadajte cieľový priečinok pre archívovanie.</target>
-
-<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>Následujúce položky majú nevyriešené konflikty a nebudú synchronizované:</target>
-
-<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>Nasledujúce priečinky sa signifikantne líšia. Prosím overte, či sú vybrané správne priečinky pre synchronizáciu.</target>
-
-<source>Not enough free disk space available in:</source>
-<target>Nedostatok miesta na disku:</target>
-
-<source>Available:</source>
-<target>K dispozícií:</target>
-
-<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>Niektoré súbory budú synchronizované ako súčasť viacerých základných priečinkov.</target>
-
-<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>Aby nedošlo ku konfliktom, je potrebné nastaviť filter tak, aby každý aktualiz. súbor mal iba jeden základný priečinok.</target>
-
-<source>Versioning folder:</source>
-<target>Priečinok verzovania:</target>
-
-<source>Base folder:</source>
-<target>Základný priečinok:</target>
-
-<source>The versioning folder is contained in a base folder.</source>
-<target>Priečinok pre archívovanie je obsiahnutý v základnom priečinku.</target>
-
-<source>Synchronizing folder pair:</source>
-<target>Synchronizácia dvojice priečinkov:</target>
-
-<source>Generating database...</source>
-<target>Vytváranie databázy...</target>
-
<source>Loading...</source>
<target>Načítanie...</target>
@@ -895,7 +901,7 @@ Príkaz bude spustení ak:
<target>Prosím vyberte priečinok v lokálnom súborovom systéme, sieti alebo multimediálnom zariadení.</target>
<source>Defined by context of use</source>
-<target></target>
+<target>Definované podľa kontextu používania</target>
<source>Requires FreeFileSync Donation Edition</source>
<target>Je potrebná FreeFileSync Donation Edition</target>
@@ -1068,8 +1074,8 @@ Príkaz bude spustení ak:
<source>Show examples</source>
<target>Ukázať príklady</target>
-<source>Time span:</source>
-<target>Časová doba:</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>Nastavte pravidlá filtra pre vynechanie niekterých súborov zo synchronizácie. Zadávajte cesty súborov relativne k odpovedajúcej dvojici priečinkov.</target>
<source>File size:</source>
<target>Veľkosť súboru:</target>
@@ -1080,8 +1086,8 @@ Príkaz bude spustení ak:
<source>Maximum:</source>
<target>Do:</target>
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target>Nastavte pravidlá filtra pre vynechanie niekterých súborov zo synchronizácie. Zadávajte cesty súborov relativne k odpovedajúcej dvojici priečinkov.</target>
+<source>Time span:</source>
+<target>Časová doba:</target>
<source>C&lear</source>
<target>Vy&mazať</target>
@@ -1110,11 +1116,20 @@ Príkaz bude spustení ak:
<target>&Trvale</target>
<source>&Versioning</source>
-<target>&Archívovanie</target>
+<target>&Verzovanie</target>
+
+<source>Move files to a user-defined folder</source>
+<target>Presunúť súbory do uživateľom zadaného priečinka</target>
<source>Naming convention:</source>
<target>Pomenovanie:</target>
+<source>Limit file versions:</source>
+<target>Limit súborových verzií:</target>
+
+<source>Last x days:</source>
+<target>Posledných x dní:</target>
+
<source>Ignore errors</source>
<target>Ignorovať chyby</target>
@@ -1256,11 +1271,8 @@ Príkaz bude spustení ak:
<source>Save log:</source>
<target>Uložiť log:</target>
-<source>Limit:</source>
-<target>Obmedzenie:</target>
-
-<source>Limit maximum number of log files</source>
-<target>Obmedzenie maximálneho počtu log súborov</target>
+<source>Limit number of log files:</source>
+<target>Limit počtu log súborov:</target>
<source>How can I schedule a batch job?</source>
<target>Ako nastaviť spustenie dávky v Plánovači?</target>
@@ -1292,9 +1304,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Transfer file and folder permissions.</source>
<target>Preniesť prístupové oprávnenie súborov a priečinkov.</target>
-<source>Show hidden dialogs again</source>
-<target>Znovu zobraziť skryté dialógy</target>
-
<source>Show all permanently hidden dialogs and warning messages again</source>
<target>Zobraziť znovu všetky trvale skryté dialógy a varovné hlásenia</target>
@@ -1385,9 +1394,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Select Time Span</source>
<target>Zadať časové rozmedzie</target>
-<source>FreeFileSync Donation Edition</source>
-<target>FreeFileSync Donation Edition</target>
-
<source>Highlight Configurations</source>
<target>Zvýrazniť konfigurácie</target>
@@ -1515,6 +1521,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Select time span...</source>
<target>Zadajte časové rozmedzie...</target>
+<source>Donation Edition</source>
+<target>Donation Edition</target>
+
<source>Folder Comparison and Synchronization</source>
<target>Porovnanie a synchronizácia priečinkov</target>
@@ -1716,6 +1725,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Parameters for opposite side</source>
<target>Parametre pre protiľahlú stranu</target>
+<source>Show hidden dialogs again</source>
+<target>Znovu zobraziť skryté dialógy</target>
+
+<source>All dialogs shown</source>
+<target>Zobrazenie všetkých dialógov</target>
+
<source>Downloading update...</source>
<target>Sťahovanie aktualizácie...</target>
@@ -1755,9 +1770,6 @@ This guarantees a consistent state even in case of a serious error.
<source>This year</source>
<target>Tento rok</target>
-<source>Last x days</source>
-<target>Posledných x dní</target>
-
<source>Byte</source>
<target>Byte</target>
@@ -1773,9 +1785,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Delete and overwrite files permanently</source>
<target>Zmazať a prepísať súbory natrvalo</target>
-<source>Move files to a user-defined folder</source>
-<target>Presunúť súbory do uživateľom zadaného priečinka</target>
-
<source>Replace</source>
<target>Nahradiť</target>
@@ -1785,6 +1794,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Time stamp</source>
<target>Časová značka</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>Presunúť súbory do podpriečinka s časovou značkou</target>
+
+<source>File</source>
+<target>Súbor</target>
+
<source>Append a time stamp to each file name</source>
<target>Pridať časovú značku ku každému názvu súboru</target>
@@ -1806,12 +1821,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Leave as unresolved conflict</source>
<target>Ponechať ako nevyriešený konflikt</target>
-<source>File</source>
-<target>Súbor</target>
-
<source>YYYY-MM-DD hhmmss</source>
<target>RRRR-MM-DD hhmmss</target>
+<source>Minimum version count must be smaller than maximum count.</source>
+<target>Minimálny počet verzií musí byť menší ako maximálny počet.</target>
+
<source>Files</source>
<target>Súbory</target>
@@ -1961,8 +1976,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Portable</source>
<target>Prenosná</target>
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>Uložiť nastavenia do zložky "%APPDATA%\FreeFileSync"</target>
+<source>Save settings in %x</source>
+<target>Uložiť nastavenia do %x</target>
<source>Register FreeFileSync file extensions</source>
<target>Zaregistruje prípony súborov FreeFileSync</target>
diff --git a/FreeFileSync/Build/Languages/slovenian.lng b/FreeFileSync/Build/Languages/slovenian.lng
index 63121a80..161410d4 100755
--- a/FreeFileSync/Build/Languages/slovenian.lng
+++ b/FreeFileSync/Build/Languages/slovenian.lng
@@ -115,11 +115,20 @@
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
<target>Namestitvena datoteka je poškodovana. Prosim ponovno naložite FreeFileSync.</target>
+<source>Cannot load file %x.</source>
+<target>Ne morem naložiti datoteko %x.</target>
+
<source>Cannot find the following folders:</source>
<target>Ne najdem naslednjih map:</target>
-<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>V primeru prezrtja te napake bo mapa smatrana kot prazna. Manjkajoče mape se po potrebi ustvarijo samodejno.</target>
+<source>The following folders do not yet exist:</source>
+<target>Naslednje mape še ne obstajajo:</target>
+
+<source>The folders are created automatically when needed.</source>
+<target>Mape se samodejno ustvarijo po potrebi.</target>
+
+<source>Scanning:</source>
+<target>Skeniranje:</target>
<source>Comparison finished:</source>
<target>Primerjava je končana:</target>
@@ -216,6 +225,65 @@
<source>Out of memory.</source>
<target>Ni dovolj pomnilnika.</target>
+<source>Database file %x is incompatible.</source>
+<target>Datoteka podatkovne baze %x je nekompatibilna.</target>
+
+<source>Initial synchronization:</source>
+<target>Začetna sinhronizacija:</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>Datoteka podatkovne baze %x še ne obstaja.</target>
+
+<source>Database file is corrupted:</source>
+<target>Datoteka v bazi podatkov je poškodovana:</target>
+
+<source>Cannot write file %x.</source>
+<target>Ne morem zapisati datoteke %x.</target>
+
+<source>Cannot read file %x.</source>
+<target>Ne morem prebrati datoteke %x.</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>Datoteke v bazi podatkov še ne vsebujejo informacije o zadnji sinhronizaciji.</target>
+
+<source>Loading file %x...</source>
+<target>Nalagam datoteko %x...</target>
+
+<source>Saving file %x...</source>
+<target>Shranjevanje datoteke %x...</target>
+
+<source>Searching for folder %x...</source>
+<target>Iskanje mape %x...</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>Čas je potekel med iskanjem datoteke %x.</target>
+
+<source>Cannot get process information.</source>
+<target>Ne morem pridobiti informacij o procesu.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Ne morem brati datotečnih atributov od %x.</target>
+
+<source>Waiting while directory is locked:</source>
+<target>Čakam dokler je imenik zaklenjen:</target>
+
+<source>Lock owner:</source>
+<target>Lastnik zaklepa:</target>
+
+<source>Detecting abandoned lock...</source>
+<target>Zaznavanje opuščenega zaklepa...</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>%x sek</pluralform>
+<pluralform>%x sek</pluralform>
+<pluralform>%x sek</pluralform>
+<pluralform>%x sek</pluralform>
+</target>
+
<source>Item exists on left side only</source>
<target>Postavka obstaja samo na levi strani</target>
@@ -270,8 +338,190 @@
<source>Update attributes on right</source>
<target>Posodobi atribute na desni strani</target>
-<source>Cannot read file %x.</source>
-<target>Ne morem prebrati datoteke %x.</target>
+<source>Items processed:</source>
+<target>Obdelanih postavk:</target>
+
+<source>Items remaining:</source>
+<target>Preostalih postavk:</target>
+
+<source>Total time:</source>
+<target>Celoten čas:</target>
+
+<source>Cleaning up log files:</source>
+<target>Čiščenje datotek dnevnika:</target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>Napaka pri razčlenjevanju datoteke %x, vrstica %y, stolpec %z.</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>Ne morem nastaviti zaklepanje imenika za naslednje mape:</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>%x nit</pluralform>
+<pluralform>%x niti</pluralform>
+<pluralform>%x niti</pluralform>
+<pluralform>%x niti</pluralform>
+</target>
+
+<source>Cannot read directory %x.</source>
+<target>Ne morem prebrati direktorija %x.</target>
+
+<source>/sec</source>
+<target>/sek</target>
+
+<source>%x items/sec</source>
+<target>%x postavk/sek</target>
+
+<source>Show in Explorer</source>
+<target>Prikaži v Raziskovalcu</target>
+
+<source>Open with default application</source>
+<target>Odpri s privzeto aplikacijo</target>
+
+<source>Browse directory</source>
+<target>Brskaj po imeniku</target>
+
+<source>Unable to connect to %x.</source>
+<target>Ne morem povezati na %x.</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>Ne morem dostopati do Volume Shadov Copy storitve.</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>Prosimo, zaženite 64-bitno različico FreeFileSync za ustvarjanje senčnih kopij v tem sistemu.</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>Ne morem določiti ime nosilca za %x.</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>Ime nosilca %x ni del poti datoteke %y.</target>
+
+<source>File time and size</source>
+<target>Čas in velikost datoteke</target>
+
+<source>File content</source>
+<target>Vsebina datoteke</target>
+
+<source>File size</source>
+<target>Velikost datoteke</target>
+
+<source>Two way</source>
+<target>Dvosmerno</target>
+
+<source>Mirror</source>
+<target>Zrcalno</target>
+
+<source>Update</source>
+<target>Posodobi</target>
+
+<source>Custom</source>
+<target>Po meri</target>
+
+<source>Multiple...</source>
+<target>Večkratno...</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>Ne morem zapisati datotečnih atributov od %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Ne morem odpreti datoteke %x.</target>
+
+<source>%x and %y have different content.</source>
+<target>%x in %y imata različno vsebino.</target>
+
+<source>Data verification error:</source>
+<target>Napaka pri preverjanju podatkov:</target>
+
+<source>Moving file %x to %y</source>
+<target>Premikam datoteko %x v %y</target>
+
+<source>Moving folder %x to %y</source>
+<target>Premikam mapo %x v %y</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>Premikam simbolično povezavo %x v %y</target>
+
+<source>Updating file %x</source>
+<target>Posodabljanje datoteke %x</target>
+
+<source>Updating symbolic link %x</source>
+<target>Posodabljanje simbolične povezave %x</target>
+
+<source>Verifying file %x</source>
+<target>Preverjam datoteko %x</target>
+
+<source>Updating attributes of %x</source>
+<target>Posodabljam atribute od %x</target>
+
+<source>Source item %x not found</source>
+<target>Izvorna postavka %x ni bila najdena</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>Ustvarjam Volume Shadow Copy za %x...</target>
+
+<source>Cannot find folder %x.</source>
+<target>Ne najdem mape %x.</target>
+
+<source>Target folder %x already existing.</source>
+<target>Ciljna mapa %x že obstaja.</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>Vnosno polje ciljnë mape ne sme biti prazno.</target>
+
+<source>Source folder %x not found.</source>
+<target>Izvorne mape %x ni moč najti.</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>Prosim vnesite ciljno mapo za označitev.</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>Naslednje postavke imajo nerešene konflikte in ne bodo sinhronizirane:</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>Naslednje mape so bistveno različne. Prosimo preverite, ali so izbrane pravilne mape za sinhroniziranje.</target>
+
+<source>Not enough free disk space available in:</source>
+<target>Na voljo ni dovolj prostega prostora na disku v:</target>
+
+<source>Required:</source>
+<target>Zahtevano:</target>
+
+<source>Available:</source>
+<target>Na voljo:</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>Nekatere datoteke bodo sinhronizirane kot del večih osnovnih map.</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>Da bi se izognili sporom, nastavite izključno filtre tako, da je vsaka posodobljena datoteka upoštevana samo v eni osnovni mapi.</target>
+
+<source>Versioning folder:</source>
+<target>Označitev mape:</target>
+
+<source>Base folder:</source>
+<target>Osnovna mapa:</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>Mapa različic je vsebovana v osnovni mapi.</target>
+
+<source>Synchronizing folder pair:</source>
+<target>Sinhroniziram parne mape:</target>
+
+<source>Generating database...</source>
+<target>Ustvarjam podatkovno bazo...</target>
+
+<source>Searching for excess file versions:</source>
+<target>Iskanje presežnih različic datotek:</target>
+
+<source>Removing excess file versions:</source>
+<target>Odstranjevanje presežnih različic datotek:</target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>Časovnega žiga za oznčitev ni bilo mogoče ustvariti:</target>
<source>
Unexpected size of data stream.
@@ -290,17 +540,14 @@ Dejansko: %y bajtov
<source>Operation not supported for different base folder types.</source>
<target>Operacija ni podprta za različne vrste osnovnih map.</target>
-<source>Cannot write file %x.</source>
-<target>Ne morem zapisati datoteke %x.</target>
-
<source>Cannot move file %x to %y.</source>
<target>Ne morem premakniti datoteko %x v %y.</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>Ne morem kopirati simbolične povezave %x v %y.</target>
-<source>Unable to connect to %x.</source>
-<target>Ne morem povezati na %x.</target>
+<source>Error Code %x</source>
+<target>Napačna koda %x.</target>
<source>Failed to get information about server %x.</source>
<target>Ne morem pridobiti informacije o strežniku %x.</target>
@@ -308,12 +555,6 @@ Dejansko: %y bajtov
<source>Cannot open directory %x.</source>
<target>Ne morem odpreti imenika %x.</target>
-<source>Cannot read directory %x.</source>
-<target>Ne morem prebrati direktorija %x.</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>Ne morem brati datotečnih atributov od %x.</target>
-
<source>Cannot create directory %x.</source>
<target>Ne morem ustvariti imenika %x.</target>
@@ -341,9 +582,6 @@ Dejansko: %y bajtov
<source>Cannot find device %x.</source>
<target>Ne najdem naprave %x.</target>
-<source>Cannot open file %x.</source>
-<target>Ne morem odpreti datoteke %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Vrsta postavke %x ni podprta:</target>
@@ -356,15 +594,9 @@ Dejansko: %y bajtov
<source>Incorrect command line:</source>
<target>Napačna ukazna vrstica:</target>
-<source>Error Code %x</source>
-<target>Napačna koda %x.</target>
-
<source>The server does not support authentication via %x.</source>
<target>Strežnik ne podpira preverjanja pristnosti preko %x.</target>
-<source>Required:</source>
-<target>Zahtevano:</target>
-
<source>Unable to access %x.</source>
<target>Ne morem dostopati do %x.</target>
@@ -416,127 +648,9 @@ Dejansko: %y bajtov
<source>%x GB</source>
<target>%x GB</target>
-<source>Cannot load file %x.</source>
-<target>Ne morem naložiti datoteko %x.</target>
-
-<source>Database file %x is incompatible.</source>
-<target>Datoteka podatkovne baze %x je nekompatibilna.</target>
-
-<source>Initial synchronization:</source>
-<target>Začetna sinhronizacija:</target>
-
-<source>Database file %x does not yet exist.</source>
-<target>Datoteka podatkovne baze %x še ne obstaja.</target>
-
-<source>Database file is corrupted:</source>
-<target>Datoteka v bazi podatkov je poškodovana:</target>
-
-<source>The database files do not yet contain information about the last synchronization.</source>
-<target>Datoteke v bazi podatkov še ne vsebujejo informacije o zadnji sinhronizaciji.</target>
-
-<source>Loading file %x...</source>
-<target>Nalagam datoteko %x...</target>
-
-<source>Saving file %x...</source>
-<target>Shranjevanje datoteke %x...</target>
-
-<source>Searching for folder %x...</source>
-<target>Iskanje mape %x...</target>
-
-<source>Timeout while searching for folder %x.</source>
-<target>Čas je potekel med iskanjem datoteke %x.</target>
-
-<source>Cannot get process information.</source>
-<target>Ne morem pridobiti informacij o procesu.</target>
-
-<source>Waiting while directory is locked:</source>
-<target>Čakam dokler je imenik zaklenjen:</target>
-
-<source>Lock owner:</source>
-<target>Lastnik zaklepa:</target>
-
-<source>Detecting abandoned lock...</source>
-<target>Zaznavanje opuščenega zaklepa...</target>
-
-<source>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</source>
-<target>
-<pluralform>%x sek</pluralform>
-<pluralform>%x sek</pluralform>
-<pluralform>%x sek</pluralform>
-<pluralform>%x sek</pluralform>
-</target>
-
-<source>Items processed:</source>
-<target>Obdelanih postavk:</target>
-
-<source>Items remaining:</source>
-<target>Preostalih postavk:</target>
-
-<source>Total time:</source>
-<target>Celoten čas:</target>
-
-<source>Cleaning up old log files...</source>
-<target>Čiščenje starih datotek dnevnika...</target>
-
-<source>Error parsing file %x, row %y, column %z.</source>
-<target>Napaka pri razčlenjevanju datoteke %x, vrstica %y, stolpec %z.</target>
-
-<source>Cannot set directory locks for the following folders:</source>
-<target>Ne morem nastaviti zaklepanje imenika za naslednje mape:</target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-<pluralform>%x nit</pluralform>
-<pluralform>%x niti</pluralform>
-<pluralform>%x niti</pluralform>
-<pluralform>%x niti</pluralform>
-</target>
-
-<source>Scanning:</source>
-<target>Skeniranje:</target>
-
-<source>/sec</source>
-<target>/sek</target>
-
-<source>%x items/sec</source>
-<target>%x postavk/sek</target>
-
-<source>Show in Explorer</source>
-<target>Prikaži v Raziskovalcu</target>
-
-<source>Open with default application</source>
-<target>Odpri s privzeto aplikacijo</target>
-
-<source>Browse directory</source>
-<target>Brskaj po imeniku</target>
-
-<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>Ne morem dostopati do Volume Shadov Copy storitve.</target>
-
-<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>Prosimo, zaženite 64-bitno različico FreeFileSync za ustvarjanje senčnih kopij v tem sistemu.</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>Ne morem določiti ime nosilca za %x.</target>
-
-<source>Volume name %x is not part of file path %y.</source>
-<target>Ime nosilca %x ni del poti datoteke %y.</target>
-
-<source>Unable to create time stamp for versioning:</source>
-<target>Časovnega žiga za oznčitev ni bilo mogoče ustvariti:</target>
-
<source>Drag && drop</source>
<target>Povleci && spusti</target>
-<source>Cannot find folder %x.</source>
-<target>Ne najdem mape %x.</target>
-
<source>Select a folder</source>
<target>Izberite imenik</target>
@@ -632,8 +746,8 @@ Ukaz se sproži če:
<source>Directory monitoring active</source>
<target>Nadzor imenikov je aktiven</target>
-<source>Waiting until all directories are available...</source>
-<target>Čakam, dokler ne bodo na voljo vsi imeniki...</target>
+<source>Waiting until directory is available:</source>
+<target>Čakanje, da je imenik na voljo:</target>
<source>&Restore</source>
<target>&Obnovi</target>
@@ -647,114 +761,6 @@ Ukaz se sproži če:
<source>&Retry</source>
<target>&Ponovi</target>
-<source>File time and size</source>
-<target>Čas in velikost datoteke</target>
-
-<source>File content</source>
-<target>Vsebina datoteke</target>
-
-<source>File size</source>
-<target>Velikost datoteke</target>
-
-<source>Two way</source>
-<target>Dvosmerno</target>
-
-<source>Mirror</source>
-<target>Zrcalno</target>
-
-<source>Update</source>
-<target>Posodobi</target>
-
-<source>Custom</source>
-<target>Po meri</target>
-
-<source>Multiple...</source>
-<target>Večkratno...</target>
-
-<source>Cannot write file attributes of %x.</source>
-<target>Ne morem zapisati datotečnih atributov od %x.</target>
-
-<source>%x and %y have different content.</source>
-<target>%x in %y imata različno vsebino.</target>
-
-<source>Data verification error:</source>
-<target>Napaka pri preverjanju podatkov:</target>
-
-<source>Moving file %x to %y</source>
-<target>Premikam datoteko %x v %y</target>
-
-<source>Moving folder %x to %y</source>
-<target>Premikam mapo %x v %y</target>
-
-<source>Moving symbolic link %x to %y</source>
-<target>Premikam simbolično povezavo %x v %y</target>
-
-<source>Removing old versions...</source>
-<target>Odstranjujem stare različice...</target>
-
-<source>Updating file %x</source>
-<target>Posodabljanje datoteke %x</target>
-
-<source>Updating symbolic link %x</source>
-<target>Posodabljanje simbolične povezave %x</target>
-
-<source>Verifying file %x</source>
-<target>Preverjam datoteko %x</target>
-
-<source>Updating attributes of %x</source>
-<target>Posodabljam atribute od %x</target>
-
-<source>Source item %x not found</source>
-<target>Izvorna postavka %x ni bila najdena</target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>Ustvarjam Volume Shadow Copy za %x...</target>
-
-<source>Target folder %x already existing.</source>
-<target>Ciljna mapa %x že obstaja.</target>
-
-<source>Target folder input field must not be empty.</source>
-<target>Vnosno polje ciljnë mape ne sme biti prazno.</target>
-
-<source>Source folder %x not found.</source>
-<target>Izvorne mape %x ni moč najti.</target>
-
-<source>Please enter a target folder for versioning.</source>
-<target>Prosim vnesite ciljno mapo za označitev.</target>
-
-<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>Naslednje postavke imajo nerešene konflikte in ne bodo sinhronizirane:</target>
-
-<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>Naslednje mape so bistveno različne. Prosimo preverite, ali so izbrane pravilne mape za sinhroniziranje.</target>
-
-<source>Not enough free disk space available in:</source>
-<target>Na voljo ni dovolj prostega prostora na disku v:</target>
-
-<source>Available:</source>
-<target>Na voljo:</target>
-
-<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>Nekatere datoteke bodo sinhronizirane kot del večih osnovnih map.</target>
-
-<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>Da bi se izognili sporom, nastavite izključno filtre tako, da je vsaka posodobljena datoteka upoštevana samo v eni osnovni mapi.</target>
-
-<source>Versioning folder:</source>
-<target>Označitev mape:</target>
-
-<source>Base folder:</source>
-<target>Osnovna mapa:</target>
-
-<source>The versioning folder is contained in a base folder.</source>
-<target>Mapa različic je vsebovana v osnovni mapi.</target>
-
-<source>Synchronizing folder pair:</source>
-<target>Sinhroniziram parne mape:</target>
-
-<source>Generating database...</source>
-<target>Ustvarjam podatkovno bazo...</target>
-
<source>Loading...</source>
<target>Nalagam...</target>
@@ -902,7 +908,7 @@ Ukaz se sproži če:
<target>Prosim izberite mapo na lokalnem datotečnem sistemu, mreži ali na MTP napravi.</target>
<source>Defined by context of use</source>
-<target></target>
+<target>Določeno s kontekstom uporabe</target>
<source>Requires FreeFileSync Donation Edition</source>
<target>Zahteva FreeFileSync Donation Edition</target>
@@ -1075,8 +1081,8 @@ Ukaz se sproži če:
<source>Show examples</source>
<target>Pokaži primere</target>
-<source>Time span:</source>
-<target>Časovno obdobje:</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>Izberi filtrirna pravila za izključitev določenih datotek iz sinhnorizacije. Vpiši pot datotek relativno na imenik v obdelavi.</target>
<source>File size:</source>
<target>Velikost datoteke:</target>
@@ -1087,8 +1093,8 @@ Ukaz se sproži če:
<source>Maximum:</source>
<target>Maksimum:</target>
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target>Izberi filtrirna pravila za izključitev določenih datotek iz sinhnorizacije. Vpiši pot datotek relativno na imenik v obdelavi.</target>
+<source>Time span:</source>
+<target>Časovno obdobje:</target>
<source>C&lear</source>
<target>&Počisti</target>
@@ -1119,9 +1125,18 @@ Ukaz se sproži če:
<source>&Versioning</source>
<target>&Označitev</target>
+<source>Move files to a user-defined folder</source>
+<target>Premakni datoteke v uporabniško določeno mapo</target>
+
<source>Naming convention:</source>
<target>Imenovanje konvencije:</target>
+<source>Limit file versions:</source>
+<target>Omejitve različic datotek:</target>
+
+<source>Last x days:</source>
+<target>Zadnji x dnevi:</target>
+
<source>Ignore errors</source>
<target>Prezri napake</target>
@@ -1263,11 +1278,8 @@ Ukaz se sproži če:
<source>Save log:</source>
<target>Shrani dnevnik:</target>
-<source>Limit:</source>
-<target>Omejitev:</target>
-
-<source>Limit maximum number of log files</source>
-<target>Omeji največje število dnevnikov</target>
+<source>Limit number of log files:</source>
+<target>Omejitve števila datotek dnevnika:</target>
<source>How can I schedule a batch job?</source>
<target>Kako lahko načrtujem opravilo v paketu?</target>
@@ -1302,9 +1314,6 @@ To zagotavlja dosledno stanje tudi v primeru resne napake.
<source>Transfer file and folder permissions.</source>
<target>Prenesi dovoljenja za datoteke in mape.</target>
-<source>Show hidden dialogs again</source>
-<target>Ponovno prikaži skrita pogovorna okna</target>
-
<source>Show all permanently hidden dialogs and warning messages again</source>
<target>Prikaži vsa trajno skrita pogovorna okna in opozorilna sporočila</target>
@@ -1395,9 +1404,6 @@ To zagotavlja dosledno stanje tudi v primeru resne napake.
<source>Select Time Span</source>
<target>Izberi časovno obdobje</target>
-<source>FreeFileSync Donation Edition</source>
-<target>FreeFileSync Donation Edition</target>
-
<source>Highlight Configurations</source>
<target>Označite konfiguracije</target>
@@ -1529,6 +1535,9 @@ To zagotavlja dosledno stanje tudi v primeru resne napake.
<source>Select time span...</source>
<target>Izberite časovni razpon...</target>
+<source>Donation Edition</source>
+<target>Donacijska izdaja</target>
+
<source>Folder Comparison and Synchronization</source>
<target>Primerjava in sinhronizacija mape</target>
@@ -1733,6 +1742,12 @@ To zagotavlja dosledno stanje tudi v primeru resne napake.
<source>Parameters for opposite side</source>
<target>Parametri za nasprotno stran</target>
+<source>Show hidden dialogs again</source>
+<target>Ponovno prikaži skrita pogovorna okna</target>
+
+<source>All dialogs shown</source>
+<target>Prikaži vsa pogovorna okna</target>
+
<source>Downloading update...</source>
<target>Prenašam posodobitve...</target>
@@ -1772,9 +1787,6 @@ To zagotavlja dosledno stanje tudi v primeru resne napake.
<source>This year</source>
<target>To leto</target>
-<source>Last x days</source>
-<target>Zadnjih x dni</target>
-
<source>Byte</source>
<target>Bajt</target>
@@ -1790,9 +1802,6 @@ To zagotavlja dosledno stanje tudi v primeru resne napake.
<source>Delete and overwrite files permanently</source>
<target>Trajni izbris in prepis datotek</target>
-<source>Move files to a user-defined folder</source>
-<target>Premakni datoteke v uporabniško določeno mapo</target>
-
<source>Replace</source>
<target>Zamenjaj</target>
@@ -1802,6 +1811,12 @@ To zagotavlja dosledno stanje tudi v primeru resne napake.
<source>Time stamp</source>
<target>Časovna oznaka</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>Datoteke premakni v podmape s časovno oznako</target>
+
+<source>File</source>
+<target>Datoteka</target>
+
<source>Append a time stamp to each file name</source>
<target>Imenu vsake datoteke pripni časovno oznako</target>
@@ -1823,12 +1838,12 @@ To zagotavlja dosledno stanje tudi v primeru resne napake.
<source>Leave as unresolved conflict</source>
<target>Pusti kot nerešeni konflikt</target>
-<source>File</source>
-<target>Datoteka</target>
-
<source>YYYY-MM-DD hhmmss</source>
<target>LLLL-MM-DD hhmmss</target>
+<source>Minimum version count must be smaller than maximum count.</source>
+<target>Najmanjše število različic mora biti manjše od največjega števila.</target>
+
<source>Files</source>
<target>Datoteke</target>
@@ -1980,8 +1995,8 @@ To zagotavlja dosledno stanje tudi v primeru resne napake.
<source>Portable</source>
<target>Prenosna</target>
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>Shrani nastavitve v "%APPDATA%\FreeFileSync"</target>
+<source>Save settings in %x</source>
+<target>Shrani nastavitve v %x</target>
<source>Register FreeFileSync file extensions</source>
<target>Registriraj FreeFileSync datoteče pripone</target>
diff --git a/FreeFileSync/Build/Languages/spanish.lng b/FreeFileSync/Build/Languages/spanish.lng
index dea4aaac..4389baa6 100755
--- a/FreeFileSync/Build/Languages/spanish.lng
+++ b/FreeFileSync/Build/Languages/spanish.lng
@@ -115,11 +115,20 @@
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
<target>Los archivos de instalación están dañados. Reinstale FreeFileSync.</target>
+<source>Cannot load file %x.</source>
+<target>No se puede cargar el archivo %x.</target>
+
<source>Cannot find the following folders:</source>
<target>No se pudieron encontrar las siguiente carpetas:</target>
-<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>Si ignora este error, las carpetas se consideran vacías. Las carpetas que faltan son creadas automáticamente si es necesario.</target>
+<source>The following folders do not yet exist:</source>
+<target>Las carpetas siguientes aún no existen:</target>
+
+<source>The folders are created automatically when needed.</source>
+<target>Las carpetas son creadas automáticamente si es necesario.</target>
+
+<source>Scanning:</source>
+<target>Escanear:</target>
<source>Comparison finished:</source>
<target>Comparación finalizada:</target>
@@ -214,6 +223,63 @@
<source>Out of memory.</source>
<target>Sin memoria.</target>
+<source>Database file %x is incompatible.</source>
+<target>El archivo de base de datos %x es incompatible.</target>
+
+<source>Initial synchronization:</source>
+<target>Sincronización inicial:</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>El archivo de base de datos %x aún no existe.</target>
+
+<source>Database file is corrupted:</source>
+<target>El archivo de base de datos está dañado:</target>
+
+<source>Cannot write file %x.</source>
+<target>No se puede escribir el archivo %x.</target>
+
+<source>Cannot read file %x.</source>
+<target>No se puede leer el archivo %x.</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>Los archivos de datos aún no contienen información acerca de una sincronización anterior.</target>
+
+<source>Loading file %x...</source>
+<target>Cargando el archivo %x...</target>
+
+<source>Saving file %x...</source>
+<target>Guardando archivo %x...</target>
+
+<source>Searching for folder %x...</source>
+<target>Buscando carpeta %x...</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>Tiempo de espera agotado al buscar por la carpeta %x.</target>
+
+<source>Cannot get process information.</source>
+<target>No se puede obtener información del proceso.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>No se puede leer archivo de atributos de %x.</target>
+
+<source>Waiting while directory is locked:</source>
+<target>Esperando mientras el directorio está bloqueado:</target>
+
+<source>Lock owner:</source>
+<target>Bloquear propietario:</target>
+
+<source>Detecting abandoned lock...</source>
+<target>Detección de bloqueo abandonado...</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 seg.</pluralform>
+<pluralform>%x seg.</pluralform>
+</target>
+
<source>Item exists on left side only</source>
<target>El elemento existe sólo en el lado izquierdo</target>
@@ -268,8 +334,188 @@
<source>Update attributes on right</source>
<target>Actualizar atributos en la derecha</target>
-<source>Cannot read file %x.</source>
-<target>No se puede leer el archivo %x.</target>
+<source>Items processed:</source>
+<target>Elementos procesados:</target>
+
+<source>Items remaining:</source>
+<target>Elementos restantes:</target>
+
+<source>Total time:</source>
+<target>Tiempo total:</target>
+
+<source>Cleaning up log files:</source>
+<target>Limpiando archivos de registro:</target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>Error analizando archivo %x, fila %y, columna %z.</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>No se pudieron bloquear directorios para las carpetas siguientes:</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>1 subproceso</pluralform>
+<pluralform>%x subprocesos</pluralform>
+</target>
+
+<source>Cannot read directory %x.</source>
+<target>No se puede leer el directorio %x.</target>
+
+<source>/sec</source>
+<target>/seg</target>
+
+<source>%x items/sec</source>
+<target>%x elementos/seg</target>
+
+<source>Show in Explorer</source>
+<target>Mostrar en el Explorador</target>
+
+<source>Open with default application</source>
+<target>Abrir con la aplicación predeterminada</target>
+
+<source>Browse directory</source>
+<target>Examinar directorio</target>
+
+<source>Unable to connect to %x.</source>
+<target>No se puede conectar a %x.</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>No se puede acceder al servicio de Instantánea de volumen.</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>Por favor, use la versión de 64 bits de FreeFileSync para instantáneas en el sistema.</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>No se puede determinar nombre del volumen de %x.</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>El nombre de volumen %x no es parte de la ruta de archivo %y.</target>
+
+<source>File time and size</source>
+<target>Fecha y tamaño del archivo</target>
+
+<source>File content</source>
+<target>Contenido del archivo</target>
+
+<source>File size</source>
+<target>Tamaño de archivo</target>
+
+<source>Two way</source>
+<target>Bidireccional</target>
+
+<source>Mirror</source>
+<target>Espejo</target>
+
+<source>Update</source>
+<target>Actualizar</target>
+
+<source>Custom</source>
+<target>Personalizado</target>
+
+<source>Multiple...</source>
+<target>Múltiple...</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>No se pueden escribir los atributos de archivo de %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>No se puede abrir el archivo %x.</target>
+
+<source>%x and %y have different content.</source>
+<target>%x y %y tienen contenidos diferentes.</target>
+
+<source>Data verification error:</source>
+<target>Error de verificación de datos:</target>
+
+<source>Moving file %x to %y</source>
+<target>Mover archivo de %x a %y</target>
+
+<source>Moving folder %x to %y</source>
+<target>Mover carpeta de %x a %y</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>Mover vínculo simbólico de %x a %y</target>
+
+<source>Updating file %x</source>
+<target>Actualizando archivo %x</target>
+
+<source>Updating symbolic link %x</source>
+<target>Actualizando vínculo simbólico %x</target>
+
+<source>Verifying file %x</source>
+<target>Verificación del archivo %x</target>
+
+<source>Updating attributes of %x</source>
+<target>Actualizar atributos de %x</target>
+
+<source>Source item %x not found</source>
+<target>No se encontró el archivo de origen %x</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>Creando una Instantánea de volumen para %x...</target>
+
+<source>Cannot find folder %x.</source>
+<target>No se puede encontrar la carpeta %x.</target>
+
+<source>Target folder %x already existing.</source>
+<target>La carpeta de destino %x ya existe.</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>El campo de entrada de la carpeta de destino no debe estar vacío.</target>
+
+<source>Source folder %x not found.</source>
+<target>No se encontró la carpeta de origen %x.</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>Indique una carpeta de destino para la versión.</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>Los siguientes elementos tienen conflictos sin resolver y no serán sincronizados:</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>Las carpetas siguientes presentan diferencias significativas. Asegúrese de seleccionar las carpetas correctas para su sincronización.</target>
+
+<source>Not enough free disk space available in:</source>
+<target>Espacio en disco insuficiente en:</target>
+
+<source>Required:</source>
+<target>Requerido:</target>
+
+<source>Available:</source>
+<target>Disponible:</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>Se van a sincronizar algunos archivos como partes de varias carpetas base.</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>Para evitar conflictos, defina filtros de exclusión de forma que cada archivo actualizado sea procesado desde una única carpeta base.</target>
+
+<source>Versioning folder:</source>
+<target>Carpeta de versionado:</target>
+
+<source>Base folder:</source>
+<target>Carpeta base:</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>La carpeta de versionado está incluida en una carpeta base.</target>
+
+<source>Synchronizing folder pair:</source>
+<target>Sincronizando par de carpetas:</target>
+
+<source>Generating database...</source>
+<target>Generando base de datos...</target>
+
+<source>Searching for excess file versions:</source>
+<target>Buscando versiones antiguas de archivos:</target>
+
+<source>Removing excess file versions:</source>
+<target>Eliminando versiones antiguas de archivos:</target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>No es posible crear la fecha y hora para el versionado:</target>
<source>
Unexpected size of data stream.
@@ -288,17 +534,14 @@ Reales: %y bytes
<source>Operation not supported for different base folder types.</source>
<target>No se admite esta operación para tipos de carpetas base diferentes.</target>
-<source>Cannot write file %x.</source>
-<target>No se puede escribir el archivo %x.</target>
-
<source>Cannot move file %x to %y.</source>
<target>No se puede mover el archivo %x a %y.</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>No se puede copiar el vínculo simbólico %x a %y.</target>
-<source>Unable to connect to %x.</source>
-<target>No se puede conectar a %x.</target>
+<source>Error Code %x</source>
+<target>Código de error %x</target>
<source>Failed to get information about server %x.</source>
<target>Fallo al obtener información del servidor %x.</target>
@@ -306,12 +549,6 @@ Reales: %y bytes
<source>Cannot open directory %x.</source>
<target>No se puede abrir el directorio %x.</target>
-<source>Cannot read directory %x.</source>
-<target>No se puede leer el directorio %x.</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>No se puede leer archivo de atributos de %x.</target>
-
<source>Cannot create directory %x.</source>
<target>No se puede crear el directorio %x.</target>
@@ -339,9 +576,6 @@ Reales: %y bytes
<source>Cannot find device %x.</source>
<target>No se encuentra el dispositivo %x.</target>
-<source>Cannot open file %x.</source>
-<target>No se puede abrir el archivo %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>El tipo de objeto %x no esta soportado:</target>
@@ -354,15 +588,9 @@ Reales: %y bytes
<source>Incorrect command line:</source>
<target>Línea de comandos incorrecta:</target>
-<source>Error Code %x</source>
-<target>Código de error %x</target>
-
<source>The server does not support authentication via %x.</source>
<target>El servidor no admite autenticación via %x.</target>
-<source>Required:</source>
-<target>Requerido:</target>
-
<source>Unable to access %x.</source>
<target>No se puede acceder a %x.</target>
@@ -408,123 +636,9 @@ Reales: %y bytes
<source>%x GB</source>
<target>%x Gb</target>
-<source>Cannot load file %x.</source>
-<target>No se puede cargar el archivo %x.</target>
-
-<source>Database file %x is incompatible.</source>
-<target>El archivo de base de datos %x es incompatible.</target>
-
-<source>Initial synchronization:</source>
-<target>Sincronización inicial:</target>
-
-<source>Database file %x does not yet exist.</source>
-<target>El archivo de base de datos %x aún no existe.</target>
-
-<source>Database file is corrupted:</source>
-<target>El archivo de base de datos está dañado:</target>
-
-<source>The database files do not yet contain information about the last synchronization.</source>
-<target>Los archivos de datos aún no contienen información acerca de una sincronización anterior.</target>
-
-<source>Loading file %x...</source>
-<target>Cargando el archivo %x...</target>
-
-<source>Saving file %x...</source>
-<target>Guardando archivo %x...</target>
-
-<source>Searching for folder %x...</source>
-<target>Buscando carpeta %x...</target>
-
-<source>Timeout while searching for folder %x.</source>
-<target>Tiempo de espera agotado al buscar por la carpeta %x.</target>
-
-<source>Cannot get process information.</source>
-<target>No se puede obtener información del proceso.</target>
-
-<source>Waiting while directory is locked:</source>
-<target>Esperando mientras el directorio está bloqueado:</target>
-
-<source>Lock owner:</source>
-<target>Bloquear propietario:</target>
-
-<source>Detecting abandoned lock...</source>
-<target>Detección de bloqueo abandonado...</target>
-
-<source>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</source>
-<target>
-<pluralform>1 seg.</pluralform>
-<pluralform>%x seg.</pluralform>
-</target>
-
-<source>Items processed:</source>
-<target>Elementos procesados:</target>
-
-<source>Items remaining:</source>
-<target>Elementos restantes:</target>
-
-<source>Total time:</source>
-<target>Tiempo total:</target>
-
-<source>Cleaning up old log files...</source>
-<target>Limpiando antiguos archivos de registro...</target>
-
-<source>Error parsing file %x, row %y, column %z.</source>
-<target>Error analizando archivo %x, fila %y, columna %z.</target>
-
-<source>Cannot set directory locks for the following folders:</source>
-<target>No se pudieron bloquear directorios para las carpetas siguientes:</target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-<pluralform>1 subproceso</pluralform>
-<pluralform>%x subprocesos</pluralform>
-</target>
-
-<source>Scanning:</source>
-<target>Escanear:</target>
-
-<source>/sec</source>
-<target>/seg</target>
-
-<source>%x items/sec</source>
-<target>%x elementos/seg</target>
-
-<source>Show in Explorer</source>
-<target>Mostrar en el Explorador</target>
-
-<source>Open with default application</source>
-<target>Abrir con la aplicación predeterminada</target>
-
-<source>Browse directory</source>
-<target>Examinar directorio</target>
-
-<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>No se puede acceder al servicio de Instantánea de volumen.</target>
-
-<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>Por favor, use la versión de 64 bits de FreeFileSync para instantáneas en el sistema.</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>No se puede determinar nombre del volumen de %x.</target>
-
-<source>Volume name %x is not part of file path %y.</source>
-<target>El nombre de volumen %x no es parte de la ruta de archivo %y.</target>
-
-<source>Unable to create time stamp for versioning:</source>
-<target>No es posible crear la fecha y hora para el versionado:</target>
-
<source>Drag && drop</source>
<target>Arrastrar y soltar</target>
-<source>Cannot find folder %x.</source>
-<target>No se puede encontrar la carpeta %x.</target>
-
<source>Select a folder</source>
<target>Seleccione una carpeta</target>
@@ -620,8 +734,8 @@ El comando es disparado si:
<source>Directory monitoring active</source>
<target>Supervisión de directorios activada</target>
-<source>Waiting until all directories are available...</source>
-<target>Esperando que todos los directorios estén disponibles...</target>
+<source>Waiting until directory is available:</source>
+<target>Esperando que el directorio esté disponible:</target>
<source>&Restore</source>
<target>&Restaurar</target>
@@ -635,114 +749,6 @@ El comando es disparado si:
<source>&Retry</source>
<target>&Reintentar</target>
-<source>File time and size</source>
-<target>Fecha y tamaño del archivo</target>
-
-<source>File content</source>
-<target>Contenido del archivo</target>
-
-<source>File size</source>
-<target>Tamaño de archivo</target>
-
-<source>Two way</source>
-<target>Bidireccional</target>
-
-<source>Mirror</source>
-<target>Espejo</target>
-
-<source>Update</source>
-<target>Actualizar</target>
-
-<source>Custom</source>
-<target>Personalizado</target>
-
-<source>Multiple...</source>
-<target>Múltiple...</target>
-
-<source>Cannot write file attributes of %x.</source>
-<target>No se pueden escribir los atributos de archivo de %x.</target>
-
-<source>%x and %y have different content.</source>
-<target>%x y %y tienen contenidos diferentes.</target>
-
-<source>Data verification error:</source>
-<target>Error de verificación de datos:</target>
-
-<source>Moving file %x to %y</source>
-<target>Mover archivo de %x a %y</target>
-
-<source>Moving folder %x to %y</source>
-<target>Mover carpeta de %x a %y</target>
-
-<source>Moving symbolic link %x to %y</source>
-<target>Mover vínculo simbólico de %x a %y</target>
-
-<source>Removing old versions...</source>
-<target>Eliminando versiones antiguas...</target>
-
-<source>Updating file %x</source>
-<target>Actualizando archivo %x</target>
-
-<source>Updating symbolic link %x</source>
-<target>Actualizando vínculo simbólico %x</target>
-
-<source>Verifying file %x</source>
-<target>Verificación del archivo %x</target>
-
-<source>Updating attributes of %x</source>
-<target>Actualizar atributos de %x</target>
-
-<source>Source item %x not found</source>
-<target>No se encontró el archivo de origen %x</target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>Creando una Instantánea de volumen para %x...</target>
-
-<source>Target folder %x already existing.</source>
-<target>La carpeta de destino %x ya existe.</target>
-
-<source>Target folder input field must not be empty.</source>
-<target>El campo de entrada de la carpeta de destino no debe estar vacío.</target>
-
-<source>Source folder %x not found.</source>
-<target>No se encontró la carpeta de origen %x.</target>
-
-<source>Please enter a target folder for versioning.</source>
-<target>Indique una carpeta de destino para la versión.</target>
-
-<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>Los siguientes elementos tienen conflictos sin resolver y no serán sincronizados:</target>
-
-<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>Las carpetas siguientes presentan diferencias significativas. Asegúrese de seleccionar las carpetas correctas para su sincronización.</target>
-
-<source>Not enough free disk space available in:</source>
-<target>Espacio en disco insuficiente en:</target>
-
-<source>Available:</source>
-<target>Disponible:</target>
-
-<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>Se van a sincronizar algunos archivos como partes de varias carpetas base.</target>
-
-<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>Para evitar conflictos, defina filtros de exclusión de forma que cada archivo actualizado sea procesado desde una única carpeta base.</target>
-
-<source>Versioning folder:</source>
-<target>Carpeta de versionado:</target>
-
-<source>Base folder:</source>
-<target>Carpeta base:</target>
-
-<source>The versioning folder is contained in a base folder.</source>
-<target>La carpeta de versionado está incluida en una carpeta base.</target>
-
-<source>Synchronizing folder pair:</source>
-<target>Sincronizando par de carpetas:</target>
-
-<source>Generating database...</source>
-<target>Generando base de datos...</target>
-
<source>Loading...</source>
<target>Cargando...</target>
@@ -888,7 +894,7 @@ El comando es disparado si:
<target>Seleccione otra carpeta del systema de archivos local, en red o en un dispositivo MTP.</target>
<source>Defined by context of use</source>
-<target></target>
+<target>Definido por contexto de utilización</target>
<source>Requires FreeFileSync Donation Edition</source>
<target>Requiere FreeFileSync Donation Edition</target>
@@ -1061,8 +1067,8 @@ El comando es disparado si:
<source>Show examples</source>
<target>Mostrar ejemplos</target>
-<source>Time span:</source>
-<target>Espacio de tiempo:</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>Elija reglas de filtrado para excluir archivos de la sincronización. Indique rutas relativas correspondientes a la carpeta emparejada.</target>
<source>File size:</source>
<target>Tamaño de archivo:</target>
@@ -1073,8 +1079,8 @@ El comando es disparado si:
<source>Maximum:</source>
<target>Máximo:</target>
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target>Elija reglas de filtrado para excluir archivos de la sincronización. Indique rutas relativas correspondientes a la carpeta emparejada.</target>
+<source>Time span:</source>
+<target>Espacio de tiempo:</target>
<source>C&lear</source>
<target>B&orrar</target>
@@ -1105,8 +1111,17 @@ El comando es disparado si:
<source>&Versioning</source>
<target>&Versionado</target>
+<source>Move files to a user-defined folder</source>
+<target>Mover los archivos a una carpeta del usuario</target>
+
<source>Naming convention:</source>
-<target>Convención de nombre:</target>
+<target>Convención de nombres:</target>
+
+<source>Limit file versions:</source>
+<target>Limitar las versiones de archivos:</target>
+
+<source>Last x days:</source>
+<target>Últimos x días:</target>
<source>Ignore errors</source>
<target>Ignorar errores</target>
@@ -1249,14 +1264,11 @@ El comando es disparado si:
<source>Save log:</source>
<target>Guardar registro:</target>
-<source>Limit:</source>
-<target>Limite:</target>
-
-<source>Limit maximum number of log files</source>
-<target>Limitar el número máximo de archivos de registro</target>
+<source>Limit number of log files:</source>
+<target>Limitar el número de archivos de registro:</target>
<source>How can I schedule a batch job?</source>
-<target>Cómo puedo programar una tarea por lotes?</target>
+<target>¿Cómo puedo programar una tarea por lotes?</target>
<source>&Keep relative paths</source>
<target>Conservar &rutas relativas</target>
@@ -1288,9 +1300,6 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<source>Transfer file and folder permissions.</source>
<target>Transferir permisos de archivos y carpetas.</target>
-<source>Show hidden dialogs again</source>
-<target>Volver a mostrar los diálogos ocultos</target>
-
<source>Show all permanently hidden dialogs and warning messages again</source>
<target>Volver a mostrar todos los diálogos y mensajes de advertencia que fueron permanentemente ocultados</target>
@@ -1381,9 +1390,6 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<source>Select Time Span</source>
<target>Seleccionar duración</target>
-<source>FreeFileSync Donation Edition</source>
-<target>FreeFileSync Donation Edition</target>
-
<source>Highlight Configurations</source>
<target>Resaltar configuraciones</target>
@@ -1458,8 +1464,8 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<pluralform>Showing %y of %x rows</pluralform>
</source>
<target>
-<pluralform>Mostrando %y de 1 fila</pluralform>
-<pluralform>Mostrando %y de %x filas</pluralform>
+<pluralform>Mostrando %y de 1 línea</pluralform>
+<pluralform>Mostrando %y de %x líneas</pluralform>
</target>
<source>Set direction:</source>
@@ -1507,6 +1513,9 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<source>Select time span...</source>
<target>Seleccionar duración...</target>
+<source>Donation Edition</source>
+<target>Donation Edition</target>
+
<source>Folder Comparison and Synchronization</source>
<target>Comparación y sincronización de carpetas</target>
@@ -1705,6 +1714,12 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<source>Parameters for opposite side</source>
<target>Parámetros del lado opuesto</target>
+<source>Show hidden dialogs again</source>
+<target>Volver a mostrar los diálogos ocultos</target>
+
+<source>All dialogs shown</source>
+<target>Todos los diálogos mostrados</target>
+
<source>Downloading update...</source>
<target>Descargando actualización...</target>
@@ -1744,9 +1759,6 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<source>This year</source>
<target>Este año</target>
-<source>Last x days</source>
-<target>Últimos x días</target>
-
<source>Byte</source>
<target>Byte</target>
@@ -1762,9 +1774,6 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<source>Delete and overwrite files permanently</source>
<target>Borrar y reemplazar los archivos permanentemente</target>
-<source>Move files to a user-defined folder</source>
-<target>Mover los archivos a una carpeta del usuario</target>
-
<source>Replace</source>
<target>Reemplazar</target>
@@ -1774,6 +1783,12 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<source>Time stamp</source>
<target>Marca horaria</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>Mover archivos a una subcarpeta con marca horaria</target>
+
+<source>File</source>
+<target>Archivo</target>
+
<source>Append a time stamp to each file name</source>
<target>Incluir marca horaria en cada nombre de archivo</target>
@@ -1795,12 +1810,12 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<source>Leave as unresolved conflict</source>
<target>Dejar como conflicto sin resolver</target>
-<source>File</source>
-<target>Archivo</target>
-
<source>YYYY-MM-DD hhmmss</source>
<target>YYYY-MM-DD hhmmss</target>
+<source>Minimum version count must be smaller than maximum count.</source>
+<target>El contador mínimo de versión debe ser inferior al contador máximo.</target>
+
<source>Files</source>
<target>Archivos</target>
@@ -1948,8 +1963,8 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<source>Portable</source>
<target>Portable</target>
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>Guardar cambios en "%APPDATA%\FreeFileSync"</target>
+<source>Save settings in %x</source>
+<target>Guardar parámetros en %x</target>
<source>Register FreeFileSync file extensions</source>
<target>Registrar las extensiones de archivos de FreeFileSync</target>
diff --git a/FreeFileSync/Build/Languages/swedish.lng b/FreeFileSync/Build/Languages/swedish.lng
index e7879ed7..10151ff7 100755
--- a/FreeFileSync/Build/Languages/swedish.lng
+++ b/FreeFileSync/Build/Languages/swedish.lng
@@ -115,11 +115,20 @@
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
<target>Installationsfilerna är skadade. Installera om FreeFileSync.</target>
+<source>Cannot load file %x.</source>
+<target>Kan inte läsa in %x.</target>
+
<source>Cannot find the following folders:</source>
<target>Kan inte hitta följande mappar:</target>
-<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>Om detta fel ignoreras, kommer mapparna att betraktas som tomma. Saknade mappar skapas automatiskt vid behov.</target>
+<source>The following folders do not yet exist:</source>
+<target>Följande mappar finns ännu inte:</target>
+
+<source>The folders are created automatically when needed.</source>
+<target>Mapparna skapas automatiskt när de behövs.</target>
+
+<source>Scanning:</source>
+<target>Skannar:</target>
<source>Comparison finished:</source>
<target>Jämförelse slutförd:</target>
@@ -214,6 +223,63 @@
<source>Out of memory.</source>
<target>Minnesbrist.</target>
+<source>Database file %x is incompatible.</source>
+<target>Databasfilen %x är inkompatibel.</target>
+
+<source>Initial synchronization:</source>
+<target>Initial synkronisering:</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>Databasfilen %x finns ännu inte.</target>
+
+<source>Database file is corrupted:</source>
+<target>Databasfilen är skadad:</target>
+
+<source>Cannot write file %x.</source>
+<target>Filen %x kan inte skrivas.</target>
+
+<source>Cannot read file %x.</source>
+<target>Filen %x kan inte läsas in.</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>Datapasfilen innehåller ännu ingen information om senaste synkronisering.</target>
+
+<source>Loading file %x...</source>
+<target>Läser in filen %x...</target>
+
+<source>Saving file %x...</source>
+<target>Sparar %x...</target>
+
+<source>Searching for folder %x...</source>
+<target>Söker efter mappen %x...</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>Timeout vid sökning efter mappen %x.</target>
+
+<source>Cannot get process information.</source>
+<target>Processinformation kan inte inhämtas.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Kan inte läsa filattribut för %x.</target>
+
+<source>Waiting while directory is locked:</source>
+<target>Väntar medan mappen låses:</target>
+
+<source>Lock owner:</source>
+<target>Låsägare:</target>
+
+<source>Detecting abandoned lock...</source>
+<target>Söker övergivna lås...</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 sek</pluralform>
+<pluralform>%x sek</pluralform>
+</target>
+
<source>Item exists on left side only</source>
<target>Objektet finns bara på vänster sida</target>
@@ -268,8 +334,188 @@
<source>Update attributes on right</source>
<target>Uppdatera attribut på höger sida</target>
-<source>Cannot read file %x.</source>
-<target>Filen %x kan inte läsas in.</target>
+<source>Items processed:</source>
+<target>Processade poster:</target>
+
+<source>Items remaining:</source>
+<target>Återstående poster:</target>
+
+<source>Total time:</source>
+<target>Total tid:</target>
+
+<source>Cleaning up log files:</source>
+<target>Städar upp loggfiler:</target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>Tolkningsfel på filen %x, rad %y, kolumn %z.</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>Kan inte ange mapplås för följanda mappar:</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>1 tråd</pluralform>
+<pluralform>%x trådar</pluralform>
+</target>
+
+<source>Cannot read directory %x.</source>
+<target>Kan inte läsa mappen %x.</target>
+
+<source>/sec</source>
+<target>/s</target>
+
+<source>%x items/sec</source>
+<target>%x objekt/sek.</target>
+
+<source>Show in Explorer</source>
+<target>Visa i Utforskaren</target>
+
+<source>Open with default application</source>
+<target>Öppna med standardprogram</target>
+
+<source>Browse directory</source>
+<target>Sök upp mapp</target>
+
+<source>Unable to connect to %x.</source>
+<target>Kan inte ansluta till %x.</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>Kan inte komma åt tjänsten 'Volume Shadow Copy'.</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>Använd 64-bitarsversionen av FreeFileSync för att skapa skuggkopior på detta system.</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>Kan inte utläsa volymnamn för %x.</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>Volymnamnet %x är inte en del av sökvägen %y.</target>
+
+<source>File time and size</source>
+<target>Tidsstämpling och storlek</target>
+
+<source>File content</source>
+<target>Filinnehåll</target>
+
+<source>File size</source>
+<target>Filstorlek</target>
+
+<source>Two way</source>
+<target>Tvåvägs</target>
+
+<source>Mirror</source>
+<target>Spegla</target>
+
+<source>Update</source>
+<target>Uppdatera</target>
+
+<source>Custom</source>
+<target>Anpassat</target>
+
+<source>Multiple...</source>
+<target>Flera...</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>Kan inte skriva filattribut för %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Kan inte öppna %x.</target>
+
+<source>%x and %y have different content.</source>
+<target>%x och %y har olika innehåll.</target>
+
+<source>Data verification error:</source>
+<target>Dataverifieringsfel:</target>
+
+<source>Moving file %x to %y</source>
+<target>Flyttar filen %x till %y</target>
+
+<source>Moving folder %x to %y</source>
+<target>Flyttar mappen %x till %y</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>Flyttar den symboliska länken %x till %y</target>
+
+<source>Updating file %x</source>
+<target>Uppdaterar %x</target>
+
+<source>Updating symbolic link %x</source>
+<target>Uppdaterar symbolisk länk för %x</target>
+
+<source>Verifying file %x</source>
+<target>Verifierar %x</target>
+
+<source>Updating attributes of %x</source>
+<target>Uppdaterar attribut för %x</target>
+
+<source>Source item %x not found</source>
+<target>Källobjektet %x hittades inte</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>Skapar en 'Volume Shadow Copy' för %x...</target>
+
+<source>Cannot find folder %x.</source>
+<target>Kan inte hitta mappen %x.</target>
+
+<source>Target folder %x already existing.</source>
+<target>Målmappen %x finns redan.</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>Indatafältet för målmapp får inte vara tomt.</target>
+
+<source>Source folder %x not found.</source>
+<target>Källmappen %x kan inte hittas.</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>Ange en målmapp för versionshantering.</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>Följande objekt har olösta konflikter, och kommer inte att synkroniseras:</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>Följande mappar är påtagligt olika. Tillse att rätt mappar är valda för synkronisering.</target>
+
+<source>Not enough free disk space available in:</source>
+<target>Ej tillräckligt ledigt diskutrymme på:</target>
+
+<source>Required:</source>
+<target>Utrymmeskrav:</target>
+
+<source>Available:</source>
+<target>Tillgängligt:</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>Vissa filer kommer att synkroniseras som en del av flera basmappar.</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>För att undvika konflikter kan du använda ett undantagsfilter, så att varje uppdaterad fil behandlas i endast en basmapp.</target>
+
+<source>Versioning folder:</source>
+<target>Versionshanteringsmapp:</target>
+
+<source>Base folder:</source>
+<target>Basmapp:</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>Versionshanteringsmappen lagras i en basmapp.</target>
+
+<source>Synchronizing folder pair:</source>
+<target>Synkroniserar katalogpar:</target>
+
+<source>Generating database...</source>
+<target>Skapar databas...</target>
+
+<source>Searching for excess file versions:</source>
+<target>Söker efter överflödiga filversioner:</target>
+
+<source>Removing excess file versions:</source>
+<target>Tar bort överflödiga filversioner:</target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>Kunde inte skapa tidsstämpel för versionshantering:</target>
<source>
Unexpected size of data stream.
@@ -288,17 +534,14 @@ Aktuell: %y byte
<source>Operation not supported for different base folder types.</source>
<target>Åtgärden stöder inte olika basmapptyper.</target>
-<source>Cannot write file %x.</source>
-<target>Filen %x kan inte skrivas.</target>
-
<source>Cannot move file %x to %y.</source>
<target>Kan inte flytta filen %x till %y.</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>Kan inte kopiera den symboliska länken %x till %y.</target>
-<source>Unable to connect to %x.</source>
-<target>Kan inte ansluta till %x.</target>
+<source>Error Code %x</source>
+<target>Felkod %x</target>
<source>Failed to get information about server %x.</source>
<target>Kunde inte hämta information om server %x.</target>
@@ -306,12 +549,6 @@ Aktuell: %y byte
<source>Cannot open directory %x.</source>
<target>Kan inte öppna %x.</target>
-<source>Cannot read directory %x.</source>
-<target>Kan inte läsa mappen %x.</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>Kan inte läsa filattribut för %x.</target>
-
<source>Cannot create directory %x.</source>
<target>Kan inte skapa mappen %x.</target>
@@ -339,9 +576,6 @@ Aktuell: %y byte
<source>Cannot find device %x.</source>
<target>Kan inte hitta enheten %x.</target>
-<source>Cannot open file %x.</source>
-<target>Kan inte öppna %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Objekttyp %x stöds ej:</target>
@@ -354,15 +588,9 @@ Aktuell: %y byte
<source>Incorrect command line:</source>
<target>Felaktig kommandorad:</target>
-<source>Error Code %x</source>
-<target>Felkod %x</target>
-
<source>The server does not support authentication via %x.</source>
<target>Servern stödjer inte autentisering via %x.</target>
-<source>Required:</source>
-<target>Utrymmeskrav:</target>
-
<source>Unable to access %x.</source>
<target>Kan inte komma åt %x.</target>
@@ -408,123 +636,9 @@ Aktuell: %y byte
<source>%x GB</source>
<target>%x GB</target>
-<source>Cannot load file %x.</source>
-<target>Kan inte läsa in %x.</target>
-
-<source>Database file %x is incompatible.</source>
-<target>Databasfilen %x är inkompatibel.</target>
-
-<source>Initial synchronization:</source>
-<target>Initial synkronisering:</target>
-
-<source>Database file %x does not yet exist.</source>
-<target>Databasfilen %x finns ännu inte.</target>
-
-<source>Database file is corrupted:</source>
-<target>Databasfilen är skadad:</target>
-
-<source>The database files do not yet contain information about the last synchronization.</source>
-<target>Datapasfilen innehåller ännu ingen information om senaste synkronisering.</target>
-
-<source>Loading file %x...</source>
-<target>Läser in filen %x...</target>
-
-<source>Saving file %x...</source>
-<target>Sparar %x...</target>
-
-<source>Searching for folder %x...</source>
-<target>Söker efter mappen %x...</target>
-
-<source>Timeout while searching for folder %x.</source>
-<target>Timeout vid sökning efter mappen %x.</target>
-
-<source>Cannot get process information.</source>
-<target>Processinformation kan inte inhämtas.</target>
-
-<source>Waiting while directory is locked:</source>
-<target>Väntar medan mappen låses:</target>
-
-<source>Lock owner:</source>
-<target>Låsägare:</target>
-
-<source>Detecting abandoned lock...</source>
-<target>Söker övergivna lås...</target>
-
-<source>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</source>
-<target>
-<pluralform>1 sek</pluralform>
-<pluralform>%x sek</pluralform>
-</target>
-
-<source>Items processed:</source>
-<target>Processade poster:</target>
-
-<source>Items remaining:</source>
-<target>Återstående poster:</target>
-
-<source>Total time:</source>
-<target>Total tid:</target>
-
-<source>Cleaning up old log files...</source>
-<target>Rensar ut gamla loggfiler...</target>
-
-<source>Error parsing file %x, row %y, column %z.</source>
-<target>Tolkningsfel på filen %x, rad %y, kolumn %z.</target>
-
-<source>Cannot set directory locks for the following folders:</source>
-<target>Kan inte ange mapplås för följanda mappar:</target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-<pluralform>1 tråd</pluralform>
-<pluralform>%x trådar</pluralform>
-</target>
-
-<source>Scanning:</source>
-<target>Skannar:</target>
-
-<source>/sec</source>
-<target>/s</target>
-
-<source>%x items/sec</source>
-<target>%x objekt/sek.</target>
-
-<source>Show in Explorer</source>
-<target>Visa i Utforskaren</target>
-
-<source>Open with default application</source>
-<target>Öppna med standardprogram</target>
-
-<source>Browse directory</source>
-<target>Sök upp mapp</target>
-
-<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>Kan inte komma åt tjänsten 'Volume Shadow Copy'.</target>
-
-<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>Använd 64-bitarsversionen av FreeFileSync för att skapa skuggkopior på detta system.</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>Kan inte utläsa volymnamn för %x.</target>
-
-<source>Volume name %x is not part of file path %y.</source>
-<target>Volymnamnet %x är inte en del av sökvägen %y.</target>
-
-<source>Unable to create time stamp for versioning:</source>
-<target>Kunde inte skapa tidsstämpel för versionshantering:</target>
-
<source>Drag && drop</source>
<target>Dra && släpp</target>
-<source>Cannot find folder %x.</source>
-<target>Kan inte hitta mappen %x.</target>
-
<source>Select a folder</source>
<target>Välj en mapp</target>
@@ -620,8 +734,8 @@ Kommandot triggas om:
<source>Directory monitoring active</source>
<target>Mappövervakning aktiv</target>
-<source>Waiting until all directories are available...</source>
-<target>Väntar på att samtliga mappar skall bli tillgängliga...</target>
+<source>Waiting until directory is available:</source>
+<target>Väntar på att mappen skall bli tillgänglig:</target>
<source>&Restore</source>
<target>&Återställ</target>
@@ -635,114 +749,6 @@ Kommandot triggas om:
<source>&Retry</source>
<target>&Försök igen</target>
-<source>File time and size</source>
-<target>Tidsstämpling och storlek</target>
-
-<source>File content</source>
-<target>Filinnehåll</target>
-
-<source>File size</source>
-<target>Filstorlek</target>
-
-<source>Two way</source>
-<target>Tvåvägs</target>
-
-<source>Mirror</source>
-<target>Spegla</target>
-
-<source>Update</source>
-<target>Uppdatera</target>
-
-<source>Custom</source>
-<target>Anpassat</target>
-
-<source>Multiple...</source>
-<target>Flera...</target>
-
-<source>Cannot write file attributes of %x.</source>
-<target>Kan inte skriva filattribut för %x.</target>
-
-<source>%x and %y have different content.</source>
-<target>%x och %y har olika innehåll.</target>
-
-<source>Data verification error:</source>
-<target>Dataverifieringsfel:</target>
-
-<source>Moving file %x to %y</source>
-<target>Flyttar filen %x till %y</target>
-
-<source>Moving folder %x to %y</source>
-<target>Flyttar mappen %x till %y</target>
-
-<source>Moving symbolic link %x to %y</source>
-<target>Flyttar den symboliska länken %x till %y</target>
-
-<source>Removing old versions...</source>
-<target>Tar bort gamla versioner...</target>
-
-<source>Updating file %x</source>
-<target>Uppdaterar %x</target>
-
-<source>Updating symbolic link %x</source>
-<target>Uppdaterar symbolisk länk för %x</target>
-
-<source>Verifying file %x</source>
-<target>Verifierar %x</target>
-
-<source>Updating attributes of %x</source>
-<target>Uppdaterar attribut för %x</target>
-
-<source>Source item %x not found</source>
-<target>Källobjektet %x hittades inte</target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>Skapar en 'Volume Shadow Copy' för %x...</target>
-
-<source>Target folder %x already existing.</source>
-<target>Målmappen %x finns redan.</target>
-
-<source>Target folder input field must not be empty.</source>
-<target>Indatafältet för målmapp får inte vara tomt.</target>
-
-<source>Source folder %x not found.</source>
-<target>Källmappen %x kan inte hittas.</target>
-
-<source>Please enter a target folder for versioning.</source>
-<target>Ange en målmapp för versionshantering.</target>
-
-<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>Följande objekt har olösta konflikter, och kommer inte att synkroniseras:</target>
-
-<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>Följande mappar är påtagligt olika. Tillse att rätt mappar är valda för synkronisering.</target>
-
-<source>Not enough free disk space available in:</source>
-<target>Ej tillräckligt ledigt diskutrymme på:</target>
-
-<source>Available:</source>
-<target>Tillgängligt:</target>
-
-<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>Vissa filer kommer att synkroniseras som en del av flera basmappar.</target>
-
-<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>För att undvika konflikter kan du använda ett undantagsfilter, så att varje uppdaterad fil behandlas i endast en basmapp.</target>
-
-<source>Versioning folder:</source>
-<target>Versionshanteringsmapp:</target>
-
-<source>Base folder:</source>
-<target>Basmapp:</target>
-
-<source>The versioning folder is contained in a base folder.</source>
-<target>Versionshanteringsmappen lagras i en basmapp.</target>
-
-<source>Synchronizing folder pair:</source>
-<target>Synkroniserar katalogpar:</target>
-
-<source>Generating database...</source>
-<target>Skapar databas...</target>
-
<source>Loading...</source>
<target>Läser in...</target>
@@ -888,7 +894,7 @@ Kommandot triggas om:
<target>Välj en mapp på i ett lokalt filsystem, nätverk eller en MTP-enhet.</target>
<source>Defined by context of use</source>
-<target></target>
+<target>Definierad av användningsförhållande</target>
<source>Requires FreeFileSync Donation Edition</source>
<target>Kräver FreeFileSync Donation Edition</target>
@@ -1061,8 +1067,8 @@ Kommandot triggas om:
<source>Show examples</source>
<target>Visa exempel</target>
-<source>Time span:</source>
-<target>Tidsrymd:</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>Skapa filtreringsregler för att undanta vissa filer från synkronisering. Sökvägar relateras till motsvarande katalogpar.</target>
<source>File size:</source>
<target>Filstorlek:</target>
@@ -1073,8 +1079,8 @@ Kommandot triggas om:
<source>Maximum:</source>
<target>Max:</target>
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target>Skapa filtreringsregler för att undanta vissa filer från synkronisering. Sökvägar relateras till motsvarande katalogpar.</target>
+<source>Time span:</source>
+<target>Tidsrymd:</target>
<source>C&lear</source>
<target>&Rensa</target>
@@ -1105,9 +1111,18 @@ Kommandot triggas om:
<source>&Versioning</source>
<target>&Versionshantering</target>
+<source>Move files to a user-defined folder</source>
+<target>Flytta filer till en fördefinierad mapp</target>
+
<source>Naming convention:</source>
<target>Regler för namngivning:</target>
+<source>Limit file versions:</source>
+<target>Begränsa filversioner:</target>
+
+<source>Last x days:</source>
+<target>Senaste x dagarna:</target>
+
<source>Ignore errors</source>
<target>Ignorera fel</target>
@@ -1249,11 +1264,8 @@ Kommandot triggas om:
<source>Save log:</source>
<target>Spara logg:</target>
-<source>Limit:</source>
-<target>Gräns:</target>
-
-<source>Limit maximum number of log files</source>
-<target>Begränsa antalet loggfiler</target>
+<source>Limit number of log files:</source>
+<target>Begränsa antalet loggfiler:</target>
<source>How can I schedule a batch job?</source>
<target>Hur schemalägger jag en batch-fil?</target>
@@ -1288,9 +1300,6 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Transfer file and folder permissions.</source>
<target>Överför behörighetsinställningar.</target>
-<source>Show hidden dialogs again</source>
-<target>Visa dolda dialoger igen</target>
-
<source>Show all permanently hidden dialogs and warning messages again</source>
<target>Visa alla permanent dolda dialoger och varningsmeddelanden igen</target>
@@ -1381,9 +1390,6 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Select Time Span</source>
<target>Välj tidsrymd</target>
-<source>FreeFileSync Donation Edition</source>
-<target>FreeFileSync Donation Edition</target>
-
<source>Highlight Configurations</source>
<target>Färgmarkera konfigurationer</target>
@@ -1507,6 +1513,9 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Select time span...</source>
<target>Välj tidsintervall...</target>
+<source>Donation Edition</source>
+<target>Donationsutgåva</target>
+
<source>Folder Comparison and Synchronization</source>
<target>Mappjämförelse och synkronisering</target>
@@ -1705,6 +1714,12 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Parameters for opposite side</source>
<target>Parametrar för motstående sida</target>
+<source>Show hidden dialogs again</source>
+<target>Visa dolda dialoger igen</target>
+
+<source>All dialogs shown</source>
+<target>Alla dialoger visade</target>
+
<source>Downloading update...</source>
<target>Laddar ner uppdatering...</target>
@@ -1744,9 +1759,6 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>This year</source>
<target>I år</target>
-<source>Last x days</source>
-<target>Senaste x dagarna</target>
-
<source>Byte</source>
<target>Byte</target>
@@ -1762,9 +1774,6 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Delete and overwrite files permanently</source>
<target>Ta bort och skriv över filer permanent</target>
-<source>Move files to a user-defined folder</source>
-<target>Flytta filer till en fördefinierad mapp</target>
-
<source>Replace</source>
<target>Byt ut</target>
@@ -1774,6 +1783,12 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Time stamp</source>
<target>Tidsstämpel</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>Flytta filer till en tidsstämplad undermapp</target>
+
+<source>File</source>
+<target>Fil</target>
+
<source>Append a time stamp to each file name</source>
<target>Lägg till en tidsstämpel till varje filnamn</target>
@@ -1795,12 +1810,12 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Leave as unresolved conflict</source>
<target>Ignorera konflikt</target>
-<source>File</source>
-<target>Fil</target>
-
<source>YYYY-MM-DD hhmmss</source>
<target>YYYY-MM-DD hhmmss</target>
+<source>Minimum version count must be smaller than maximum count.</source>
+<target>Minsta antal versioner måste vara mindre än maximalt antal.</target>
+
<source>Files</source>
<target>Filer</target>
@@ -1948,8 +1963,8 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Portable</source>
<target>Portabel</target>
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>Sparar inställningar i "%APPDATA%\FreeFileSync"</target>
+<source>Save settings in %x</source>
+<target>Spara inställningar i %x</target>
<source>Register FreeFileSync file extensions</source>
<target>Registrerar filformat för FreeFileSync</target>
diff --git a/FreeFileSync/Build/Languages/turkish.lng b/FreeFileSync/Build/Languages/turkish.lng
index 1bdbf530..a61cd83b 100755
--- a/FreeFileSync/Build/Languages/turkish.lng
+++ b/FreeFileSync/Build/Languages/turkish.lng
@@ -115,11 +115,20 @@
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
<target>Kurulum dosyaları bozulmuş. Lütfen FreeFileSync uygulamasını yeniden kurun.</target>
+<source>Cannot load file %x.</source>
+<target>%x dosyası yüklenemedi.</target>
+
<source>Cannot find the following folders:</source>
<target>Aşağıdaki klasörler bulunamadı:</target>
-<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>Bu sorun yok sayılırsa klasörler boş olarak kabul edilir. Eksik klasörler gerek duyulduğunda otomatik olarak oluşturulur.</target>
+<source>The following folders do not yet exist:</source>
+<target>Şu klasörler bulunamadı:</target>
+
+<source>The folders are created automatically when needed.</source>
+<target>Klasörler gerektiğinde otomatik olarak oluşturulur.</target>
+
+<source>Scanning:</source>
+<target>Taranıyor:</target>
<source>Comparison finished:</source>
<target>Karşılaştırma tamamlandı:</target>
@@ -214,6 +223,63 @@
<source>Out of memory.</source>
<target>Bellek yetersiz.</target>
+<source>Database file %x is incompatible.</source>
+<target>%x veritabanı dosyası uyumsuz.</target>
+
+<source>Initial synchronization:</source>
+<target>Başlangıç eşitlemesi:</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>%x veritabanı dosyası henüz yok.</target>
+
+<source>Database file is corrupted:</source>
+<target>Veritabanı dosyası bozulmuş:</target>
+
+<source>Cannot write file %x.</source>
+<target>%x dosyası yazılamadı.</target>
+
+<source>Cannot read file %x.</source>
+<target>%x dosyası okunamadı.</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>Veritabanı dosyalarında henüz son eşitleme bilgileri yok.</target>
+
+<source>Loading file %x...</source>
+<target>%x dosyaları yükleniyor...</target>
+
+<source>Saving file %x...</source>
+<target>%x dosyası kaydediliyor...</target>
+
+<source>Searching for folder %x...</source>
+<target>%x klasörü aranıyor...</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>%x klasöründeki arama işlemi zaman aşımına uğradı.</target>
+
+<source>Cannot get process information.</source>
+<target>İşlem bilgisi alınamadı.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>%x dosyasının öznitelikleri okunamadı.</target>
+
+<source>Waiting while directory is locked:</source>
+<target>Klasör kilitli olduğundan bekleniyor:</target>
+
+<source>Lock owner:</source>
+<target>Kilitleyen:</target>
+
+<source>Detecting abandoned lock...</source>
+<target>Kaldırılmış kilit algılanıyor...</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>1 saniye</pluralform>
+<pluralform>%x saniye</pluralform>
+</target>
+
<source>Item exists on left side only</source>
<target>Yalnız solda bulunan ögeler</target>
@@ -268,8 +334,188 @@
<source>Update attributes on right</source>
<target>Sağdaki öznitelikler güncellensin</target>
-<source>Cannot read file %x.</source>
-<target>%x dosyası okunamadı.</target>
+<source>Items processed:</source>
+<target>İşlenen öge:</target>
+
+<source>Items remaining:</source>
+<target>Kalan öge:</target>
+
+<source>Total time:</source>
+<target>Toplam süre:</target>
+
+<source>Cleaning up log files:</source>
+<target>Günlük dosyaları temizleniyor:</target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>%x dosyası işlenirken sorun çıktı, satır %y, sütun %z.</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>Şu klasörler kilitlenemedi:</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>1 iş parçacığı</pluralform>
+<pluralform>%x iş parçacığı</pluralform>
+</target>
+
+<source>Cannot read directory %x.</source>
+<target>%x klasörü okunamadı.</target>
+
+<source>/sec</source>
+<target>/saniye</target>
+
+<source>%x items/sec</source>
+<target>%x öge/saniye</target>
+
+<source>Show in Explorer</source>
+<target>Tarayıcıda Görüntüle</target>
+
+<source>Open with default application</source>
+<target>Varsayılan Uygulama ile Aç</target>
+
+<source>Browse directory</source>
+<target>Klasöre Gözat</target>
+
+<source>Unable to connect to %x.</source>
+<target>%x üzerine bağlanılamadı.</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>Birim Gölge Hizmetine erişilemiyor.</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>Lütfen bu sistemde gölge kopyalar oluşturmak için FreeFileSync uygulamasının 64 bit sürümünü kullanın.</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>%x için birim adı belirlenemedi.</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>%x birim adı %y dosya yolunun bir parçası değil.</target>
+
+<source>File time and size</source>
+<target>Tarih ve Saate Göre</target>
+
+<source>File content</source>
+<target>İçeriğe Göre</target>
+
+<source>File size</source>
+<target>Boyuta Göre</target>
+
+<source>Two way</source>
+<target>Çift Yönlü</target>
+
+<source>Mirror</source>
+<target>Yansıtma</target>
+
+<source>Update</source>
+<target>Güncelleme</target>
+
+<source>Custom</source>
+<target>Özel</target>
+
+<source>Multiple...</source>
+<target>Çoklu...</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>%x dosya öznitelikleri yazılamadı.</target>
+
+<source>Cannot open file %x.</source>
+<target>%x dosyası açılamadı.</target>
+
+<source>%x and %y have different content.</source>
+<target>%x ve %y farklı içeriklere sahip.</target>
+
+<source>Data verification error:</source>
+<target>Veri doğrulama sorunu:</target>
+
+<source>Moving file %x to %y</source>
+<target>%x dosyası %y içine taşınıyor</target>
+
+<source>Moving folder %x to %y</source>
+<target>%x klasörü %y içine taşınıyor</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>%x sembolik bağlantısı %y içine taşınıyor</target>
+
+<source>Updating file %x</source>
+<target>%x dosyası güncelleniyor</target>
+
+<source>Updating symbolic link %x</source>
+<target>%x sembolik bağlantısı güncelleniyor</target>
+
+<source>Verifying file %x</source>
+<target>%x dosyası doğrulanıyor</target>
+
+<source>Updating attributes of %x</source>
+<target>%x öznitelikleri güncelleniyor</target>
+
+<source>Source item %x not found</source>
+<target>%x kaynak ögesi bulunamadı</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>%x için Birim Gölge Hizmeti oluşturuluyor...</target>
+
+<source>Cannot find folder %x.</source>
+<target>%x klasörü bulunamadı.</target>
+
+<source>Target folder %x already existing.</source>
+<target>%x hedef klasörü zaten var.</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>Hedef klasör giriş alanı boş olmamalı.</target>
+
+<source>Source folder %x not found.</source>
+<target>%x kaynak klasörü bulunamadı.</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>Sürüm izlemesinde kullanılacak bir hedef klasör yazın.</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>Uyuşmazlığı çözümlenmemiş şu ögeler eşitlenmeyecek:</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>Şu klasörler birbirinden çok farklı. Lütfen eşitleme için doğru klasörleri seçtiğinizden emin olun.</target>
+
+<source>Not enough free disk space available in:</source>
+<target>Şurada yeterli disk alanı yok :</target>
+
+<source>Required:</source>
+<target>Zorunlu:</target>
+
+<source>Available:</source>
+<target>Kullanılabilir:</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>Bazı dosyalar çoklu temel klasörlerin bir parçası olarak eşitlenecek.</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>Çakışmaları engellemek için katmama süzgeçleri ayarlayarak güncellenen her dosyanın yalnız bir temel klasör olarak değerlendirilmesini sağlayın.</target>
+
+<source>Versioning folder:</source>
+<target>Sürüm klasörü:</target>
+
+<source>Base folder:</source>
+<target>Temel klasör:</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>Sürümlendirme klasörü bir temel klasör içinde bulunuyor.</target>
+
+<source>Synchronizing folder pair:</source>
+<target>Eşitlenen klasör çifti:</target>
+
+<source>Generating database...</source>
+<target>Veritabanı oluşturuluyor...</target>
+
+<source>Searching for excess file versions:</source>
+<target>Fazla dosya sürümleri aranıyor:</target>
+
+<source>Removing excess file versions:</source>
+<target>Fazla dosya sürümleri siliniyor:</target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>Sürümlendirme için zaman damgası oluşturulamadı:</target>
<source>
Unexpected size of data stream.
@@ -288,17 +534,14 @@ Gerçekleşen: %y bayt
<source>Operation not supported for different base folder types.</source>
<target>Farklı temel klasör türleri üzerindeki işlemler desteklenmiyor.</target>
-<source>Cannot write file %x.</source>
-<target>%x dosyası yazılamadı.</target>
-
<source>Cannot move file %x to %y.</source>
<target>%x dosyası %y hedefine taşınamadı.</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>%x sembolik bağlantısı %y hedefine kopyalanamadı.</target>
-<source>Unable to connect to %x.</source>
-<target>%x üzerine bağlanılamadı.</target>
+<source>Error Code %x</source>
+<target>Hata Kodu %x</target>
<source>Failed to get information about server %x.</source>
<target>%x sunucusu hakkında bilgi alınamadı.</target>
@@ -306,12 +549,6 @@ Gerçekleşen: %y bayt
<source>Cannot open directory %x.</source>
<target>%x klasörü açılamadı.</target>
-<source>Cannot read directory %x.</source>
-<target>%x klasörü okunamadı.</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>%x dosyasının öznitelikleri okunamadı.</target>
-
<source>Cannot create directory %x.</source>
<target>%x klasörü oluşturulamadı.</target>
@@ -339,9 +576,6 @@ Gerçekleşen: %y bayt
<source>Cannot find device %x.</source>
<target>%x aygıtı bulunamadı.</target>
-<source>Cannot open file %x.</source>
-<target>%x dosyası açılamadı.</target>
-
<source>Type of item %x is not supported:</source>
<target>%x ögesi türü desteklenmiyor:</target>
@@ -354,15 +588,9 @@ Gerçekleşen: %y bayt
<source>Incorrect command line:</source>
<target>Satırdaki komut geçersiz:</target>
-<source>Error Code %x</source>
-<target>Hata Kodu %x</target>
-
<source>The server does not support authentication via %x.</source>
<target>Sunucu %x üzerinden kimlik doğrulamasını desteklemiyor.</target>
-<source>Required:</source>
-<target>Zorunlu:</target>
-
<source>Unable to access %x.</source>
<target>%x üzerine erişilemedi.</target>
@@ -408,123 +636,9 @@ Gerçekleşen: %y bayt
<source>%x GB</source>
<target>%x GB</target>
-<source>Cannot load file %x.</source>
-<target>%x dosyası yüklenemedi.</target>
-
-<source>Database file %x is incompatible.</source>
-<target>%x veritabanı dosyası uyumsuz.</target>
-
-<source>Initial synchronization:</source>
-<target>Başlangıç eşitlemesi:</target>
-
-<source>Database file %x does not yet exist.</source>
-<target>%x veritabanı dosyası henüz yok.</target>
-
-<source>Database file is corrupted:</source>
-<target>Veritabanı dosyası bozulmuş:</target>
-
-<source>The database files do not yet contain information about the last synchronization.</source>
-<target>Veritabanı dosyalarında henüz son eşitleme bilgileri yok.</target>
-
-<source>Loading file %x...</source>
-<target>%x dosyaları yükleniyor...</target>
-
-<source>Saving file %x...</source>
-<target>%x dosyası kaydediliyor...</target>
-
-<source>Searching for folder %x...</source>
-<target>%x klasörü aranıyor...</target>
-
-<source>Timeout while searching for folder %x.</source>
-<target>%x klasöründeki arama işlemi zaman aşımına uğradı.</target>
-
-<source>Cannot get process information.</source>
-<target>İşlem bilgisi alınamadı.</target>
-
-<source>Waiting while directory is locked:</source>
-<target>Klasör kilitli olduğundan bekleniyor:</target>
-
-<source>Lock owner:</source>
-<target>Kilitleyen:</target>
-
-<source>Detecting abandoned lock...</source>
-<target>Kaldırılmış kilit algılanıyor...</target>
-
-<source>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</source>
-<target>
-<pluralform>1 saniye</pluralform>
-<pluralform>%x saniye</pluralform>
-</target>
-
-<source>Items processed:</source>
-<target>İşlenen öge:</target>
-
-<source>Items remaining:</source>
-<target>Kalan öge:</target>
-
-<source>Total time:</source>
-<target>Toplam süre:</target>
-
-<source>Cleaning up old log files...</source>
-<target>Eski günlük dosyaları temizleniyor...</target>
-
-<source>Error parsing file %x, row %y, column %z.</source>
-<target>%x dosyası işlenirken sorun çıktı, satır %y, sütun %z.</target>
-
-<source>Cannot set directory locks for the following folders:</source>
-<target>Şu klasörler kilitlenemedi:</target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-<pluralform>1 iş parçacığı</pluralform>
-<pluralform>%x iş parçacığı</pluralform>
-</target>
-
-<source>Scanning:</source>
-<target>Taranıyor:</target>
-
-<source>/sec</source>
-<target>/saniye</target>
-
-<source>%x items/sec</source>
-<target>%x öge/saniye</target>
-
-<source>Show in Explorer</source>
-<target>Tarayıcıda Görüntüle</target>
-
-<source>Open with default application</source>
-<target>Varsayılan Uygulama ile Aç</target>
-
-<source>Browse directory</source>
-<target>Klasöre Gözat</target>
-
-<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>Birim Gölge Hizmetine erişilemiyor.</target>
-
-<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>Lütfen bu sistemde gölge kopyalar oluşturmak için FreeFileSync uygulamasının 64 bit sürümünü kullanın.</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>%x için birim adı belirlenemedi.</target>
-
-<source>Volume name %x is not part of file path %y.</source>
-<target>%x birim adı %y dosya yolunun bir parçası değil.</target>
-
-<source>Unable to create time stamp for versioning:</source>
-<target>Sürümlendirme için zaman damgası oluşturulamadı:</target>
-
<source>Drag && drop</source>
<target>Dosyaları sürükleyip buraya bırakın</target>
-<source>Cannot find folder %x.</source>
-<target>%x klasörü bulunamadı.</target>
-
<source>Select a folder</source>
<target>Bir klasör seçin</target>
@@ -620,8 +734,8 @@ Komut şu durumlarda yürütülür:
<source>Directory monitoring active</source>
<target>Klasör izlemesi yapılıyor</target>
-<source>Waiting until all directories are available...</source>
-<target>Tüm klasörlerin uygun olması bekleniyor...</target>
+<source>Waiting until directory is available:</source>
+<target>Klasörün kullanılabilir olması bekleniyor:</target>
<source>&Restore</source>
<target>Gö&rüntülensin</target>
@@ -635,114 +749,6 @@ Komut şu durumlarda yürütülür:
<source>&Retry</source>
<target>&Yeniden Dene</target>
-<source>File time and size</source>
-<target>Tarih ve Saate Göre</target>
-
-<source>File content</source>
-<target>İçeriğe Göre</target>
-
-<source>File size</source>
-<target>Boyuta Göre</target>
-
-<source>Two way</source>
-<target>Çift Yönlü</target>
-
-<source>Mirror</source>
-<target>Yansıtma</target>
-
-<source>Update</source>
-<target>Güncelleme</target>
-
-<source>Custom</source>
-<target>Özel</target>
-
-<source>Multiple...</source>
-<target>Çoklu...</target>
-
-<source>Cannot write file attributes of %x.</source>
-<target>%x dosya öznitelikleri yazılamadı.</target>
-
-<source>%x and %y have different content.</source>
-<target>%x ve %y farklı içeriklere sahip.</target>
-
-<source>Data verification error:</source>
-<target>Veri doğrulama sorunu:</target>
-
-<source>Moving file %x to %y</source>
-<target>%x dosyası %y içine taşınıyor</target>
-
-<source>Moving folder %x to %y</source>
-<target>%x klasörü %y içine taşınıyor</target>
-
-<source>Moving symbolic link %x to %y</source>
-<target>%x sembolik bağlantısı %y içine taşınıyor</target>
-
-<source>Removing old versions...</source>
-<target>Eski sürümler siliniyor...</target>
-
-<source>Updating file %x</source>
-<target>%x dosyası güncelleniyor</target>
-
-<source>Updating symbolic link %x</source>
-<target>%x sembolik bağlantısı güncelleniyor</target>
-
-<source>Verifying file %x</source>
-<target>%x dosyası doğrulanıyor</target>
-
-<source>Updating attributes of %x</source>
-<target>%x öznitelikleri güncelleniyor</target>
-
-<source>Source item %x not found</source>
-<target>%x kaynak ögesi bulunamadı</target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>%x için Birim Gölge Hizmeti oluşturuluyor...</target>
-
-<source>Target folder %x already existing.</source>
-<target>%x hedef klasörü zaten var.</target>
-
-<source>Target folder input field must not be empty.</source>
-<target>Hedef klasör giriş alanı boş olmamalı.</target>
-
-<source>Source folder %x not found.</source>
-<target>%x kaynak klasörü bulunamadı.</target>
-
-<source>Please enter a target folder for versioning.</source>
-<target>Sürüm izlemesinde kullanılacak bir hedef klasör yazın.</target>
-
-<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>Uyuşmazlığı çözümlenmemiş şu ögeler eşitlenmeyecek:</target>
-
-<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>Şu klasörler birbirinden çok farklı. Lütfen eşitleme için doğru klasörleri seçtiğinizden emin olun.</target>
-
-<source>Not enough free disk space available in:</source>
-<target>Şurada yeterli disk alanı yok :</target>
-
-<source>Available:</source>
-<target>Kullanılabilir:</target>
-
-<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>Bazı dosyalar çoklu temel klasörlerin bir parçası olarak eşitlenecek.</target>
-
-<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>Çakışmaları engellemek için katmama süzgeçleri ayarlayarak güncellenen her dosyanın yalnız bir temel klasör olarak değerlendirilmesini sağlayın.</target>
-
-<source>Versioning folder:</source>
-<target>Sürüm klasörü:</target>
-
-<source>Base folder:</source>
-<target>Temel klasör:</target>
-
-<source>The versioning folder is contained in a base folder.</source>
-<target>Sürümlendirme klasörü bir temel klasör içinde bulunuyor.</target>
-
-<source>Synchronizing folder pair:</source>
-<target>Eşitlenen klasör çifti:</target>
-
-<source>Generating database...</source>
-<target>Veritabanı oluşturuluyor...</target>
-
<source>Loading...</source>
<target>Yükleniyor...</target>
@@ -888,7 +894,7 @@ Komut şu durumlarda yürütülür:
<target>Lütfen yerel dosya sistemi, ağ ya da MTP aygıtı üzerinde bulunan bir klasör seçin.</target>
<source>Defined by context of use</source>
-<target></target>
+<target>Kullanım bağlamına göre tanımlı</target>
<source>Requires FreeFileSync Donation Edition</source>
<target>FreeFileSync Donation Edition gereklidir</target>
@@ -1029,7 +1035,7 @@ Komut şu durumlarda yürütülür:
<target>&Yönlendirilsin</target>
<source>More information</source>
-<target>Ayrıntılı Bilgiler</target>
+<target>Ayrıntılı bilgiler</target>
<source>&Ignore time shift [hh:mm]</source>
<target>&Yok Sayılacak Zaman Farkı [ss:dd]</target>
@@ -1041,16 +1047,16 @@ Komut şu durumlarda yürütülür:
<target>Örnek:</target>
<source>Handle daylight saving time</source>
-<target>Yaz Saati Hakkında Bilgiler</target>
+<target>Yaz saati hakkında bilgiler</target>
<source>Performance improvements:</source>
<target>Başarım İyileştirmeleri:</target>
<source>Parallel file operations:</source>
-<target>Paralel dosya işlemleri:</target>
+<target>Eş Zamanlı İşlenecek Dosya Sayısı:</target>
<source>How to get best performance?</source>
-<target>En iyi başarım nasıl elde edilir?</target>
+<target>En iyi başarım nasıl sağlanır?</target>
<source>Local settings:</source>
<target>Yerel ayarlar:</target>
@@ -1061,8 +1067,8 @@ Komut şu durumlarda yürütülür:
<source>Show examples</source>
<target>Örneklere Bakın</target>
-<source>Time span:</source>
-<target>Zaman Aralığı:</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>Eşitlenmeyecek dosyaların süzülme kurallarını belirleyin. Dosya yollarını bulundukları klasör çiftine göre yazın.</target>
<source>File size:</source>
<target>Dosya Boyutu:</target>
@@ -1073,8 +1079,8 @@ Komut şu durumlarda yürütülür:
<source>Maximum:</source>
<target>En Büyük:</target>
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target>Eşitlenmeyecek dosyaların süzülme kurallarını belirleyin. Dosya yollarını bulundukları klasör çiftine göre yazın.</target>
+<source>Time span:</source>
+<target>Zaman Aralığı:</target>
<source>C&lear</source>
<target>&Temizle</target>
@@ -1105,9 +1111,18 @@ Komut şu durumlarda yürütülür:
<source>&Versioning</source>
<target>Eski &Sürüm Olarak Saklansın</target>
+<source>Move files to a user-defined folder</source>
+<target>Dosyalar kullanıcının belirteceği şu klasöre taşınsın</target>
+
<source>Naming convention:</source>
<target>Adlandırma Kuralı:</target>
+<source>Limit file versions:</source>
+<target>Dosya Sürümü Sayısı Sınırlaması:</target>
+
+<source>Last x days:</source>
+<target>Son x Gün:</target>
+
<source>Ignore errors</source>
<target>Sorunlar yok sayılsın</target>
@@ -1124,7 +1139,7 @@ Komut şu durumlarda yürütülür:
<target>Tamam</target>
<source>Enter your login details:</source>
-<target>Oturum açma ayrıntılarınızı yazın:</target>
+<target>Oturum açma bilgilerinizi yazın:</target>
<source>Connection type:</source>
<target>Bağlantı Türü:</target>
@@ -1249,11 +1264,8 @@ Komut şu durumlarda yürütülür:
<source>Save log:</source>
<target>İşlem Günlüğü Kaydedilsin:</target>
-<source>Limit:</source>
-<target>Sınır:</target>
-
-<source>Limit maximum number of log files</source>
-<target>Tutulacak en fazla günlük dosyası sayısı</target>
+<source>Limit number of log files:</source>
+<target>Günlük dosyaları sayısı sınırlaması:</target>
<source>How can I schedule a batch job?</source>
<target>Toplu İşlem Zamanlaması Hakkında Bilgiler</target>
@@ -1288,9 +1300,6 @@ Bu yöntem, ciddi bir sorun çıkması durumunda bile işlemin tutarlı olarak y
<source>Transfer file and folder permissions.</source>
<target>Dosya ve klasör izinleri de aktarılır.</target>
-<source>Show hidden dialogs again</source>
-<target>Gizlenmiş Pencereleri Yeniden Görüntüle</target>
-
<source>Show all permanently hidden dialogs and warning messages again</source>
<target>Kalıcı olarak gizlenmiş tüm ileti ve uyarılar yeniden görüntülenir</target>
@@ -1381,9 +1390,6 @@ Bu yöntem, ciddi bir sorun çıkması durumunda bile işlemin tutarlı olarak y
<source>Select Time Span</source>
<target>Zaman Aralığı</target>
-<source>FreeFileSync Donation Edition</source>
-<target>FreeFileSync Donation Edition</target>
-
<source>Highlight Configurations</source>
<target>Yapılandırmalar Vurgulansın</target>
@@ -1507,6 +1513,9 @@ Bu yöntem, ciddi bir sorun çıkması durumunda bile işlemin tutarlı olarak y
<source>Select time span...</source>
<target>Zaman aralığını seçin...</target>
+<source>Donation Edition</source>
+<target>Bağış Sürümü</target>
+
<source>Folder Comparison and Synchronization</source>
<target>Klasör Karşılaştırma ve Eşitleme</target>
@@ -1705,6 +1714,12 @@ Bu yöntem, ciddi bir sorun çıkması durumunda bile işlemin tutarlı olarak y
<source>Parameters for opposite side</source>
<target>Diğer tarafın parametreleri</target>
+<source>Show hidden dialogs again</source>
+<target>Gizlenmiş Pencereleri Yeniden Görüntüle</target>
+
+<source>All dialogs shown</source>
+<target>Tüm İletiler Görüntüleniyor</target>
+
<source>Downloading update...</source>
<target>Güncelleme indiriliyor...</target>
@@ -1718,7 +1733,7 @@ Bu yöntem, ciddi bir sorun çıkması durumunda bile işlemin tutarlı olarak y
<target>Dosyaların eşit olup olmadığı boyutlarına göre belirlenir.</target>
<source>Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database.</source>
-<target>İki taraftaki değişiklikler de belirlenir ve kopyalanır. Silinme, taşınma ve çakışmalar, veritabanı kullanılarak otomatik olarak algılanır.</target>
+<target>İki taraftaki değişiklikler de belirlenir ve kopyalanır. Silinme, taşınma ve çakışmalar, veritabanı kullanılarak otomatik olarak belirlenir.</target>
<source>Create a mirror backup of the left folder by adapting the right folder to match.</source>
<target>Sağ klasör, sola uyacak şekilde değiştirilerek, sol klasörün yansı yedeği oluşturulur.</target>
@@ -1744,9 +1759,6 @@ Bu yöntem, ciddi bir sorun çıkması durumunda bile işlemin tutarlı olarak y
<source>This year</source>
<target>Bu yıl</target>
-<source>Last x days</source>
-<target>Son x günde</target>
-
<source>Byte</source>
<target>Bayt</target>
@@ -1762,9 +1774,6 @@ Bu yöntem, ciddi bir sorun çıkması durumunda bile işlemin tutarlı olarak y
<source>Delete and overwrite files permanently</source>
<target>Dosyalar silinsin ve kalıcı olarak üzerine yazılsın</target>
-<source>Move files to a user-defined folder</source>
-<target>Dosyalar kullanıcı tarafından belirtilen bir klasöre taşınır</target>
-
<source>Replace</source>
<target>Ad Değiştirme</target>
@@ -1774,8 +1783,14 @@ Bu yöntem, ciddi bir sorun çıkması durumunda bile işlemin tutarlı olarak y
<source>Time stamp</source>
<target>Zaman Damgalama</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>Dosyalar zaman damgalı bir alt klasöre taşınır</target>
+
+<source>File</source>
+<target>Dosya</target>
+
<source>Append a time stamp to each file name</source>
-<target>Dosya adlarına zaman damgası eklensin</target>
+<target>Dosya adlarına zaman damgası eklenir</target>
<source>On completion:</source>
<target>Tamamlandığında:</target>
@@ -1795,12 +1810,12 @@ Bu yöntem, ciddi bir sorun çıkması durumunda bile işlemin tutarlı olarak y
<source>Leave as unresolved conflict</source>
<target>Uyuşmazlık çözümlenmeden bırakılsın</target>
-<source>File</source>
-<target>Dosya</target>
-
<source>YYYY-MM-DD hhmmss</source>
<target>YYYY-AA-GG SSddss</target>
+<source>Minimum version count must be smaller than maximum count.</source>
+<target>En az sürüm sayısı en çok sürüm sayısı değerinden küçük olmalıdır.</target>
+
<source>Files</source>
<target>Dosyalar</target>
@@ -1948,8 +1963,8 @@ Bu yöntem, ciddi bir sorun çıkması durumunda bile işlemin tutarlı olarak y
<source>Portable</source>
<target>Taşınabilir</target>
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>Ayarlar "%APPDATA%\FreeFileSync" Klasörüne Kaydedilsin</target>
+<source>Save settings in %x</source>
+<target>Ayarlar %x üzerine kaydedilsin</target>
<source>Register FreeFileSync file extensions</source>
<target>FreeFileSync Dosya Uzantıları İlişkilendirilsin</target>
diff --git a/FreeFileSync/Build/Languages/ukrainian.lng b/FreeFileSync/Build/Languages/ukrainian.lng
index 215d0ef7..46342c15 100755
--- a/FreeFileSync/Build/Languages/ukrainian.lng
+++ b/FreeFileSync/Build/Languages/ukrainian.lng
@@ -7,9 +7,6 @@
<plural_definition>n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2</plural_definition>
</header>
-<source>Defined by context of use</source>
-<target></target>
-
<source>Both sides have changed since last synchronization.</source>
<target>З моменту останньої синхронізації з обох сторін відбулися зміни.</target>
@@ -118,11 +115,20 @@
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
<target>Файли встановлення пошкоджені. Будь ласка, перевстановіть FreeFileSync.</target>
+<source>Cannot load file %x.</source>
+<target>Не вдається завантажити файл %x.</target>
+
<source>Cannot find the following folders:</source>
<target>Не вдається знайти такі папки:</target>
-<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>Якщо цю помилку буде проігноровано папки будуть вважатися порожніми. Відсутні папки створюються автоматично, коли це необхідно.</target>
+<source>The following folders do not yet exist:</source>
+<target>Наступні папки ще не існують:</target>
+
+<source>The folders are created automatically when needed.</source>
+<target>Папки створюються автоматично, коли це потрібно.</target>
+
+<source>Scanning:</source>
+<target>Сканування:</target>
<source>Comparison finished:</source>
<target>Порівняння завершено:</target>
@@ -218,6 +224,64 @@
<source>Out of memory.</source>
<target>Недостатньо пам'яті.</target>
+<source>Database file %x is incompatible.</source>
+<target>Несумісний файл бази даних %x.</target>
+
+<source>Initial synchronization:</source>
+<target>Початкова синхронізація:</target>
+
+<source>Database file %x does not yet exist.</source>
+<target>Файл бази даних %x ще не існує.</target>
+
+<source>Database file is corrupted:</source>
+<target>Файл бази даних пошкоджений:</target>
+
+<source>Cannot write file %x.</source>
+<target>Не вдається записати файл %x.</target>
+
+<source>Cannot read file %x.</source>
+<target>Не вдається прочитати файл %x.</target>
+
+<source>The database files do not yet contain information about the last synchronization.</source>
+<target>Файли бази даних не містять інформації про останню синхронізацію.</target>
+
+<source>Loading file %x...</source>
+<target>Завантажується файл %x...</target>
+
+<source>Saving file %x...</source>
+<target>Збереження файлу %x...</target>
+
+<source>Searching for folder %x...</source>
+<target>Пошук папки %x...</target>
+
+<source>Timeout while searching for folder %x.</source>
+<target>Вичерпався час пошуку папки %x.</target>
+
+<source>Cannot get process information.</source>
+<target>Не вдається отримати інформацію про процес.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Не вдається прочитати атрибути файлу %x.</target>
+
+<source>Waiting while directory is locked:</source>
+<target>Очікування поки папка заблокована:</target>
+
+<source>Lock owner:</source>
+<target>Власник блокування:</target>
+
+<source>Detecting abandoned lock...</source>
+<target>Виявлено покинуте блокування...</target>
+
+<source>
+<pluralform>1 sec</pluralform>
+<pluralform>%x sec</pluralform>
+</source>
+<target>
+<pluralform>%x сек</pluralform>
+<pluralform>%x сек</pluralform>
+<pluralform>%x сек</pluralform>
+</target>
+
<source>Item exists on left side only</source>
<target>Елемент існує тільки ліворуч</target>
@@ -272,8 +336,189 @@
<source>Update attributes on right</source>
<target>Оновити атрибути праворуч</target>
-<source>Cannot read file %x.</source>
-<target>Не вдається прочитати файл %x.</target>
+<source>Items processed:</source>
+<target>Елементів оброблено:</target>
+
+<source>Items remaining:</source>
+<target>Елементів залишилось:</target>
+
+<source>Total time:</source>
+<target>Загальний час:</target>
+
+<source>Cleaning up log files:</source>
+<target>Очищення файлів журналу:</target>
+
+<source>Error parsing file %x, row %y, column %z.</source>
+<target>Помилка розбору файлу %x, рядок %y, колонка %z.</target>
+
+<source>Cannot set directory locks for the following folders:</source>
+<target>Неможливо встановити блокування каталогів для таких папок:</target>
+
+<source>
+<pluralform>1 thread</pluralform>
+<pluralform>%x threads</pluralform>
+</source>
+<target>
+<pluralform>%x потік виконання</pluralform>
+<pluralform>%x потоки виконання</pluralform>
+<pluralform>%x потоків виконання</pluralform>
+</target>
+
+<source>Cannot read directory %x.</source>
+<target>Не вдається прочитати папку %x.</target>
+
+<source>/sec</source>
+<target>/сек</target>
+
+<source>%x items/sec</source>
+<target>%x елемента/сек</target>
+
+<source>Show in Explorer</source>
+<target>Показати у Провіднику</target>
+
+<source>Open with default application</source>
+<target>Відкрити за допомогою програми за замовчуванням</target>
+
+<source>Browse directory</source>
+<target>Переглянути папку</target>
+
+<source>Unable to connect to %x.</source>
+<target>Не вдається з'єднатися з %x.</target>
+
+<source>Cannot access the Volume Shadow Copy Service.</source>
+<target>Не вдається отримати доступ до послуги Тіньового Копіювання Тому.</target>
+
+<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
+<target>Будь ласка, використовуйте 64-розрядну версію FreeFileSync для створення тіньових копій у цій системі.</target>
+
+<source>Cannot determine volume name for %x.</source>
+<target>Не вдалося встановити ім'я тому для %x.</target>
+
+<source>Volume name %x is not part of file path %y.</source>
+<target>Ім'я тому %x не є частиною шляху до файлу %y.</target>
+
+<source>File time and size</source>
+<target>Дата та розмір файлу</target>
+
+<source>File content</source>
+<target>Вміст файлу</target>
+
+<source>File size</source>
+<target>Розмір файлу</target>
+
+<source>Two way</source>
+<target>Обидва напрямки</target>
+
+<source>Mirror</source>
+<target>Дзеркало</target>
+
+<source>Update</source>
+<target>Оновити</target>
+
+<source>Custom</source>
+<target>Вибірково</target>
+
+<source>Multiple...</source>
+<target>Різні варіанти...</target>
+
+<source>Cannot write file attributes of %x.</source>
+<target>Не вдається записати атрибути файлу %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Не вдається відкрити файл %x.</target>
+
+<source>%x and %y have different content.</source>
+<target>%x і %y мають різний вміст.</target>
+
+<source>Data verification error:</source>
+<target>Помилка перевірки даних:</target>
+
+<source>Moving file %x to %y</source>
+<target>Переміщення файлу %x до %y</target>
+
+<source>Moving folder %x to %y</source>
+<target>Переміщення папки %x до %y</target>
+
+<source>Moving symbolic link %x to %y</source>
+<target>Переміщення символьного посилання %x до %y</target>
+
+<source>Updating file %x</source>
+<target>Оновлення файлу %x</target>
+
+<source>Updating symbolic link %x</source>
+<target>Оновлення символьних посилань %x</target>
+
+<source>Verifying file %x</source>
+<target>Перевірка файлу %x</target>
+
+<source>Updating attributes of %x</source>
+<target>Оновлення атрибутів %x</target>
+
+<source>Source item %x not found</source>
+<target>Вихідний елемент %x не знайдено</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>Створення Тіньової Копії для %x...</target>
+
+<source>Cannot find folder %x.</source>
+<target>Неможливо знайти папку %x.</target>
+
+<source>Target folder %x already existing.</source>
+<target>Цільова папка %x вже існує.</target>
+
+<source>Target folder input field must not be empty.</source>
+<target>Поле цільової папки не повинно бути порожнім.</target>
+
+<source>Source folder %x not found.</source>
+<target>Вихідну папку %x не знайдено.</target>
+
+<source>Please enter a target folder for versioning.</source>
+<target>Будь ласка, введіть цільову папку для версій.</target>
+
+<source>The following items have unresolved conflicts and will not be synchronized:</source>
+<target>Наступні елементи мають невирішені конфлікти і не будуть синхронізовані:</target>
+
+<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
+<target>Наступні папки значно відрізняються. Будь ласка, перевірте що вибрані правильні папки для синхронізації.</target>
+
+<source>Not enough free disk space available in:</source>
+<target>Не достатньо вільного місця на:</target>
+
+<source>Required:</source>
+<target>Потрібно:</target>
+
+<source>Available:</source>
+<target>Доступно:</target>
+
+<source>Some files will be synchronized as part of multiple base folders.</source>
+<target>Деякі файли були синхронізовані як частина декількох основних папок.</target>
+
+<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
+<target>Для уникнення конфліктів, встановлюйте фільтри для виключення так щоб кожен оновлений файл розглядався тільки однією основною папкою.</target>
+
+<source>Versioning folder:</source>
+<target>Папка з версіями:</target>
+
+<source>Base folder:</source>
+<target>Основна папка:</target>
+
+<source>The versioning folder is contained in a base folder.</source>
+<target>Папка з версіями містить основну папку.</target>
+
+<source>Synchronizing folder pair:</source>
+<target>Синхронізація пари папок:</target>
+
+<source>Generating database...</source>
+<target>Створення бази даних...</target>
+
+<source>Searching for excess file versions:</source>
+<target>Пошук надлишкових версій файлів:</target>
+
+<source>Removing excess file versions:</source>
+<target>Видалення надлишкових версій файлів:</target>
+
+<source>Unable to create time stamp for versioning:</source>
+<target>Не вдається створити часової мітки для версій:</target>
<source>
Unexpected size of data stream.
@@ -292,17 +537,14 @@ Actual: %y bytes
<source>Operation not supported for different base folder types.</source>
<target>Операція не підтримується для різних типів базових папок.</target>
-<source>Cannot write file %x.</source>
-<target>Не вдається записати файл %x.</target>
-
<source>Cannot move file %x to %y.</source>
<target>Не вдається перемістити файл %x до %y.</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>Не вдається скопіювати символьне посилання %x до %y.</target>
-<source>Unable to connect to %x.</source>
-<target>Не вдається з'єднатися з %x.</target>
+<source>Error Code %x</source>
+<target>Код помилки %x</target>
<source>Failed to get information about server %x.</source>
<target>Не вдається отримати інформацію про сервер %x.</target>
@@ -310,12 +552,6 @@ Actual: %y bytes
<source>Cannot open directory %x.</source>
<target>Не вдається відкрити папку %x.</target>
-<source>Cannot read directory %x.</source>
-<target>Не вдається прочитати папку %x.</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>Не вдається прочитати атрибути файлу %x.</target>
-
<source>Cannot create directory %x.</source>
<target>Не вдається створити папку %x.</target>
@@ -343,9 +579,6 @@ Actual: %y bytes
<source>Cannot find device %x.</source>
<target>Не вдається знайти пристрій %x.</target>
-<source>Cannot open file %x.</source>
-<target>Не вдається відкрити файл %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Тип елемента %x не підтримується:</target>
@@ -358,15 +591,9 @@ Actual: %y bytes
<source>Incorrect command line:</source>
<target>Неправильний командний рядок:</target>
-<source>Error Code %x</source>
-<target>Код помилки %x</target>
-
<source>The server does not support authentication via %x.</source>
<target>Сервер не підтримує аутентифікацію за допомогою %x.</target>
-<source>Required:</source>
-<target>Потрібно:</target>
-
<source>Unable to access %x.</source>
<target>Не вдалося отримати доступ до %x.</target>
@@ -415,125 +642,9 @@ Actual: %y bytes
<source>%x GB</source>
<target>%x ГБ</target>
-<source>Cannot load file %x.</source>
-<target>Не вдається завантажити файл %x.</target>
-
-<source>Database file %x is incompatible.</source>
-<target>Несумісний файл бази даних %x.</target>
-
-<source>Initial synchronization:</source>
-<target>Початкова синхронізація:</target>
-
-<source>Database file %x does not yet exist.</source>
-<target>Файл бази даних %x ще не існує.</target>
-
-<source>Database file is corrupted:</source>
-<target>Файл бази даних пошкоджений:</target>
-
-<source>The database files do not yet contain information about the last synchronization.</source>
-<target>Файли бази даних не містять інформації про останню синхронізацію.</target>
-
-<source>Loading file %x...</source>
-<target>Завантажується файл %x...</target>
-
-<source>Saving file %x...</source>
-<target>Збереження файлу %x...</target>
-
-<source>Searching for folder %x...</source>
-<target>Пошук папки %x...</target>
-
-<source>Timeout while searching for folder %x.</source>
-<target>Вичерпався час пошуку папки %x.</target>
-
-<source>Cannot get process information.</source>
-<target>Не вдається отримати інформацію про процес.</target>
-
-<source>Waiting while directory is locked:</source>
-<target>Очікування поки папка заблокована:</target>
-
-<source>Lock owner:</source>
-<target>Власник блокування:</target>
-
-<source>Detecting abandoned lock...</source>
-<target>Виявлено покинуте блокування...</target>
-
-<source>
-<pluralform>1 sec</pluralform>
-<pluralform>%x sec</pluralform>
-</source>
-<target>
-<pluralform>%x сек</pluralform>
-<pluralform>%x сек</pluralform>
-<pluralform>%x сек</pluralform>
-</target>
-
-<source>Items processed:</source>
-<target>Елементів оброблено:</target>
-
-<source>Items remaining:</source>
-<target>Елементів залишилось:</target>
-
-<source>Total time:</source>
-<target>Загальний час:</target>
-
-<source>Cleaning up old log files...</source>
-<target>Очистка старих журналів...</target>
-
-<source>Error parsing file %x, row %y, column %z.</source>
-<target>Помилка розбору файлу %x, рядок %y, колонка %z.</target>
-
-<source>Cannot set directory locks for the following folders:</source>
-<target>Неможливо встановити блокування каталогів для таких папок:</target>
-
-<source>
-<pluralform>1 thread</pluralform>
-<pluralform>%x threads</pluralform>
-</source>
-<target>
-<pluralform>%x потік виконання</pluralform>
-<pluralform>%x потоки виконання</pluralform>
-<pluralform>%x потоків виконання</pluralform>
-</target>
-
-<source>Scanning:</source>
-<target>Сканування:</target>
-
-<source>/sec</source>
-<target>/сек</target>
-
-<source>%x items/sec</source>
-<target>%x елемента/сек</target>
-
-<source>Show in Explorer</source>
-<target>Показати у Провіднику</target>
-
-<source>Open with default application</source>
-<target>Відкрити за допомогою програми за замовчуванням</target>
-
-<source>Browse directory</source>
-<target>Переглянути папку</target>
-
-<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>Не вдається отримати доступ до послуги Тіньового Копіювання Тому.</target>
-
-<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>Будь ласка, використовуйте 64-розрядну версію FreeFileSync для створення тіньових копій у цій системі.</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>Не вдалося встановити ім'я тому для %x.</target>
-
-<source>Volume name %x is not part of file path %y.</source>
-<target>Ім'я тому %x не є частиною шляху до файлу %y.</target>
-
-<source>Unable to create time stamp for versioning:</source>
-<target>Не вдається створити часової мітки для версій:</target>
-
<source>Drag && drop</source>
<target>Drag && drop</target>
-<source>Cannot find folder %x.</source>
-<target>Неможливо знайти папку %x.</target>
-
<source>Select a folder</source>
<target>Вибрати папку</target>
@@ -629,8 +740,8 @@ The command is triggered if:
<source>Directory monitoring active</source>
<target>Моніторинг папок активний</target>
-<source>Waiting until all directories are available...</source>
-<target>Очікування доступності всіх папок...</target>
+<source>Waiting until directory is available:</source>
+<target>Очікування поки каталог не стане доступним:</target>
<source>&Restore</source>
<target>Від&новити</target>
@@ -644,114 +755,6 @@ The command is triggered if:
<source>&Retry</source>
<target>&Повторити</target>
-<source>File time and size</source>
-<target>Дата та розмір файлу</target>
-
-<source>File content</source>
-<target>Вміст файлу</target>
-
-<source>File size</source>
-<target>Розмір файлу</target>
-
-<source>Two way</source>
-<target>Обидва напрямки</target>
-
-<source>Mirror</source>
-<target>Дзеркало</target>
-
-<source>Update</source>
-<target>Оновити</target>
-
-<source>Custom</source>
-<target>Вибірково</target>
-
-<source>Multiple...</source>
-<target>Різні варіанти...</target>
-
-<source>Cannot write file attributes of %x.</source>
-<target>Не вдається записати атрибути файлу %x.</target>
-
-<source>%x and %y have different content.</source>
-<target>%x і %y мають різний вміст.</target>
-
-<source>Data verification error:</source>
-<target>Помилка перевірки даних:</target>
-
-<source>Moving file %x to %y</source>
-<target>Переміщення файлу %x до %y</target>
-
-<source>Moving folder %x to %y</source>
-<target>Переміщення папки %x до %y</target>
-
-<source>Moving symbolic link %x to %y</source>
-<target>Переміщення символьного посилання %x до %y</target>
-
-<source>Removing old versions...</source>
-<target>Видалення старих версій...</target>
-
-<source>Updating file %x</source>
-<target>Оновлення файлу %x</target>
-
-<source>Updating symbolic link %x</source>
-<target>Оновлення символьних посилань %x</target>
-
-<source>Verifying file %x</source>
-<target>Перевірка файлу %x</target>
-
-<source>Updating attributes of %x</source>
-<target>Оновлення атрибутів %x</target>
-
-<source>Source item %x not found</source>
-<target>Вихідний елемент %x не знайдено</target>
-
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>Створення Тіньової Копії для %x...</target>
-
-<source>Target folder %x already existing.</source>
-<target>Цільова папка %x вже існує.</target>
-
-<source>Target folder input field must not be empty.</source>
-<target>Поле цільової папки не повинно бути порожнім.</target>
-
-<source>Source folder %x not found.</source>
-<target>Вихідну папку %x не знайдено.</target>
-
-<source>Please enter a target folder for versioning.</source>
-<target>Будь ласка, введіть цільову папку для версій.</target>
-
-<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>Наступні елементи мають невирішені конфлікти і не будуть синхронізовані:</target>
-
-<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>Наступні папки значно відрізняються. Будь ласка, перевірте що вибрані правильні папки для синхронізації.</target>
-
-<source>Not enough free disk space available in:</source>
-<target>Не достатньо вільного місця на:</target>
-
-<source>Available:</source>
-<target>Доступно:</target>
-
-<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>Деякі файли були синхронізовані як частина декількох основних папок.</target>
-
-<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>Для уникнення конфліктів, встановлюйте фільтри для виключення так щоб кожен оновлений файл розглядався тільки однією основною папкою.</target>
-
-<source>Versioning folder:</source>
-<target>Папка з версіями:</target>
-
-<source>Base folder:</source>
-<target>Основна папка:</target>
-
-<source>The versioning folder is contained in a base folder.</source>
-<target>Папка з версіями містить основну папку.</target>
-
-<source>Synchronizing folder pair:</source>
-<target>Синхронізація пари папок:</target>
-
-<source>Generating database...</source>
-<target>Створення бази даних...</target>
-
<source>Loading...</source>
<target>Завантаження...</target>
@@ -897,6 +900,9 @@ The command is triggered if:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>Будь ласка, виберіть папку на локальній файловій системі, в мережі чи на MTP пристрої.</target>
+<source>Defined by context of use</source>
+<target>Визначено контекстом використання</target>
+
<source>Requires FreeFileSync Donation Edition</source>
<target>Потрібна FreeFileSync Donation Edition</target>
@@ -1068,8 +1074,8 @@ The command is triggered if:
<source>Show examples</source>
<target>Показати приклади</target>
-<source>Time span:</source>
-<target>Відрізок часу:</target>
+<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
+<target>Виберіть правила фільтрації для виключення деяких файлів із синхронізації. Введіть шляхи до файлів відносно відповідної пари папок.</target>
<source>File size:</source>
<target>Розмір файлу:</target>
@@ -1080,8 +1086,8 @@ The command is triggered if:
<source>Maximum:</source>
<target>Максимум:</target>
-<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target>Виберіть правила фільтрації для виключення деяких файлів із синхронізації. Введіть шляхи до файлів відносно відповідної пари папок.</target>
+<source>Time span:</source>
+<target>Відрізок часу:</target>
<source>C&lear</source>
<target>О&чистити</target>
@@ -1112,9 +1118,18 @@ The command is triggered if:
<source>&Versioning</source>
<target>&Управління версіями</target>
+<source>Move files to a user-defined folder</source>
+<target>Перемістити файли у визначену користувачем папку</target>
+
<source>Naming convention:</source>
<target>Метод іменування:</target>
+<source>Limit file versions:</source>
+<target>Обмежити версії файлів:</target>
+
+<source>Last x days:</source>
+<target>Останні x днів:</target>
+
<source>Ignore errors</source>
<target>Ігнорувати помилки</target>
@@ -1256,11 +1271,8 @@ The command is triggered if:
<source>Save log:</source>
<target>Зберегти журнал:</target>
-<source>Limit:</source>
-<target>Обмеження:</target>
-
-<source>Limit maximum number of log files</source>
-<target>Обмежити максимальну кількість файлів журналу</target>
+<source>Limit number of log files:</source>
+<target>Обмеження кількості файлів журналу:</target>
<source>How can I schedule a batch job?</source>
<target>Як можна запланувати пакетне завдання?</target>
@@ -1295,9 +1307,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Transfer file and folder permissions.</source>
<target>Перенести права доступу файлів і папок.</target>
-<source>Show hidden dialogs again</source>
-<target>Показати сховані діалоги знову</target>
-
<source>Show all permanently hidden dialogs and warning messages again</source>
<target>Показати всі сховані діалоги і повідомлення з попередженнями знову</target>
@@ -1388,9 +1397,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Select Time Span</source>
<target>Виберіть Інтервал Часу</target>
-<source>FreeFileSync Donation Edition</source>
-<target>FreeFileSync Donation Edition</target>
-
<source>Highlight Configurations</source>
<target>Налаштування виділення</target>
@@ -1518,6 +1524,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Select time span...</source>
<target>Виберіть інтервал часу...</target>
+<source>Donation Edition</source>
+<target>Donation Edition</target>
+
<source>Folder Comparison and Synchronization</source>
<target>Порівнювання та Синхронізація папок</target>
@@ -1719,6 +1728,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Parameters for opposite side</source>
<target>Параметри для протилежної сторони:</target>
+<source>Show hidden dialogs again</source>
+<target>Показати сховані діалоги знову</target>
+
+<source>All dialogs shown</source>
+<target>Показано всі діалоги</target>
+
<source>Downloading update...</source>
<target>Завантажується оновлення...</target>
@@ -1758,9 +1773,6 @@ This guarantees a consistent state even in case of a serious error.
<source>This year</source>
<target>Цього року</target>
-<source>Last x days</source>
-<target>Останні x днів</target>
-
<source>Byte</source>
<target>Байт</target>
@@ -1776,9 +1788,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Delete and overwrite files permanently</source>
<target>Видалити і перезаписати файли назавжди</target>
-<source>Move files to a user-defined folder</source>
-<target>Перемістити файли у визначену користувачем папку</target>
-
<source>Replace</source>
<target>Замінити</target>
@@ -1788,6 +1797,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Time stamp</source>
<target>Відмітка часу</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>Перемістити файли в підпапку з часовим шаблоном</target>
+
+<source>File</source>
+<target>Файл</target>
+
<source>Append a time stamp to each file name</source>
<target>Приєднати відмітку часу до кожної назви файлу</target>
@@ -1809,12 +1824,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Leave as unresolved conflict</source>
<target>Залишити як невирішений конфлікт</target>
-<source>File</source>
-<target>Файл</target>
-
<source>YYYY-MM-DD hhmmss</source>
<target>YYYY-MM-DD hhmmss</target>
+<source>Minimum version count must be smaller than maximum count.</source>
+<target>Мінімальна кількість версій повинна бути меншою, ніж максимальна кількість.</target>
+
<source>Files</source>
<target>Файли</target>
@@ -1964,8 +1979,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Portable</source>
<target>Портативна</target>
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>Зберегти налаштування в "%APPDATA%\FreeFileSync"</target>
+<source>Save settings in %x</source>
+<target>Зберегти налаштування в %x</target>
<source>Register FreeFileSync file extensions</source>
<target>Зареєструвати розширення файлів FreeFileSync</target>
diff --git a/FreeFileSync/Build/Resources.zip b/FreeFileSync/Build/Resources.zip
index d020de7c..fda17b61 100755
--- a/FreeFileSync/Build/Resources.zip
+++ b/FreeFileSync/Build/Resources.zip
Binary files differ
diff --git a/FreeFileSync/Build/ding.wav b/FreeFileSync/Build/ding.wav
index cd592656..9a24acc4 100755
--- a/FreeFileSync/Build/ding.wav
+++ b/FreeFileSync/Build/ding.wav
Binary files differ
diff --git a/FreeFileSync/Source/Makefile b/FreeFileSync/Source/Makefile
index 89983ac8..9693f756 100755
--- a/FreeFileSync/Source/Makefile
+++ b/FreeFileSync/Source/Makefile
@@ -5,9 +5,9 @@ SHAREDIR = $(DESTDIR)$(prefix)/share
APPSHAREDIR = $(SHAREDIR)/$(APPNAME)
DOCSHAREDIR = $(SHAREDIR)/doc/$(APPNAME)
-CXXFLAGS = -std=c++17 -pipe -DWXINTL_NO_GETTEXT_MACRO -I../.. -I../../zenXml -isystem../../boost -include "zen/i18n.h" -include "zen/warn_static.h" \
--Wall -Wfatal-errors -Wmissing-include-dirs -Wswitch-enum -Wcast-align -Wshadow -Wnon-virtual-dtor \
--O3 -DNDEBUG `wx-config --cxxflags --debug=no` -pthread
+CXXFLAGS = -std=c++17 -pipe -DWXINTL_NO_GETTEXT_MACRO -I../.. -I../../zenXml -include "zen/i18n.h" -include "zen/warn_static.h" \
+ -Wall -Wfatal-errors -Wmissing-include-dirs -Wswitch-enum -Wcast-align -Wshadow -Wnon-virtual-dtor \
+ -O3 -DNDEBUG `wx-config --cxxflags --debug=no` -pthread
LINKFLAGS = -s -no-pie `wx-config --libs std, aui --debug=no` -pthread
@@ -125,5 +125,5 @@ install:
$(APPSHAREDIR)
mkdir -p $(DOCSHAREDIR)
- cp ../Build/Changelog.txt $(DOCSHAREDIR)/changelog
- gzip $(DOCSHAREDIR)/changelog
+ cp ../../Changelog.txt $(DOCSHAREDIR)/CHANGELOG
+ gzip $(DOCSHAREDIR)/CHANGELOG
diff --git a/FreeFileSync/Source/RealTimeSync/Makefile b/FreeFileSync/Source/RealTimeSync/Makefile
index 161055f4..61aee2cb 100755
--- a/FreeFileSync/Source/RealTimeSync/Makefile
+++ b/FreeFileSync/Source/RealTimeSync/Makefile
@@ -2,9 +2,9 @@ APPNAME = RealTimeSync
prefix = /usr
BINDIR = $(DESTDIR)$(prefix)/bin
-CXXFLAGS = -std=c++17 -pipe -DWXINTL_NO_GETTEXT_MACRO -I../../.. -I../../../zenXml -isystem../../../boost -include "zen/i18n.h" -include "zen/warn_static.h" \
--Wall -Wfatal-errors -Wmissing-include-dirs -Wswitch-enum -Wcast-align -Wshadow -Wnon-virtual-dtor \
--O3 -DNDEBUG `wx-config --cxxflags --debug=no` -pthread
+CXXFLAGS = -std=c++17 -pipe -DWXINTL_NO_GETTEXT_MACRO -I../../.. -I../../../zenXml -include "zen/i18n.h" -include "zen/warn_static.h" \
+ -Wall -Wfatal-errors -Wmissing-include-dirs -Wswitch-enum -Wcast-align -Wshadow -Wnon-virtual-dtor \
+ -O3 -DNDEBUG `wx-config --cxxflags --debug=no` -pthread
LINKFLAGS = -s -no-pie `wx-config --libs std, aui --debug=no` -pthread
diff --git a/FreeFileSync/Source/RealTimeSync/main_dlg.cpp b/FreeFileSync/Source/RealTimeSync/main_dlg.cpp
index 3fb69547..89678ba2 100755
--- a/FreeFileSync/Source/RealTimeSync/main_dlg.cpp
+++ b/FreeFileSync/Source/RealTimeSync/main_dlg.cpp
@@ -166,7 +166,7 @@ MainDialog::~MainDialog()
void MainDialog::onQueryEndSession()
{
try { writeConfig(getConfiguration(), lastRunConfigPath_); } //throw FileError
- catch (const FileError&) {} //we try our best do to something useful in this extreme situation - no reason to notify or even log errors here!
+ catch (FileError&) {} //we try our best do to something useful in this extreme situation - no reason to notify or even log errors here!
}
diff --git a/FreeFileSync/Source/RealTimeSync/tray_menu.cpp b/FreeFileSync/Source/RealTimeSync/tray_menu.cpp
index fb152755..4e01f2ea 100755
--- a/FreeFileSync/Source/RealTimeSync/tray_menu.cpp
+++ b/FreeFileSync/Source/RealTimeSync/tray_menu.cpp
@@ -89,7 +89,8 @@ public:
break;
case TRAY_MODE_WAITING:
- setTrayIcon(greyScale(trayBmp), _("Waiting until all directories are available..."));
+ setTrayIcon(greyScale(trayBmp), replaceCpy(_("Waiting until directory is available:"), L":", L""));
+ warn_static("TODO: which one? => show on UI!")
break;
case TRAY_MODE_ERROR:
diff --git a/FreeFileSync/Source/base/algorithm.cpp b/FreeFileSync/Source/base/algorithm.cpp
index 8b017923..7821f2c2 100755
--- a/FreeFileSync/Source/base/algorithm.cpp
+++ b/FreeFileSync/Source/base/algorithm.cpp
@@ -1128,14 +1128,15 @@ Opt<PathDependency> fff::getPathDependency(const AbstractPath& basePathL, const
{
if (!AFS::isNullPath(basePathL) && !AFS::isNullPath(basePathR))
{
- const AFS::PathComponents compL = AFS::getPathComponents(basePathL);
- const AFS::PathComponents compR = AFS::getPathComponents(basePathR);
- if (compL.rootPath == compR.rootPath)
+ if (AFS::getRootPath(basePathL) == AFS::getRootPath(basePathR))
{
- const bool leftParent = compL.relPath.size() <= compR.relPath.size();
+ const std::vector<Zstring> relPathL = split(AFS::getRootRelativePath(basePathL), FILE_NAME_SEPARATOR, SplitType::SKIP_EMPTY);
+ const std::vector<Zstring> relPathR = split(AFS::getRootRelativePath(basePathR), FILE_NAME_SEPARATOR, SplitType::SKIP_EMPTY);
- const auto& relPathP = leftParent ? compL.relPath : compR.relPath;
- const auto& relPathC = leftParent ? compR.relPath : compL.relPath;
+ const bool leftParent = relPathL.size() <= relPathR.size();
+
+ const auto& relPathP = leftParent ? relPathL : relPathR;
+ const auto& relPathC = leftParent ? relPathR : relPathL;
if (std::equal(relPathP.begin(), relPathP.end(), relPathC.begin(), [](const Zstring& lhs, const Zstring& rhs) { return equalFilePath(lhs, rhs); }))
{
@@ -1689,8 +1690,8 @@ void TempFileBuffer::createTempFiles(const std::set<FileDescriptor>& workLoad, P
const Zstring fileName = AFS::getItemName(descr.path);
- auto it = find_last(fileName.begin(), fileName.end(), Zchar('.')); //gracefully handle case of missing "."
- const Zstring tempFileName = Zstring(fileName.begin(), it) + Zchar('-') + descrHash + Zstring(it, fileName.end());
+ auto it = find_last(fileName.begin(), fileName.end(), Zstr('.')); //gracefully handle case of missing "."
+ const Zstring tempFileName = Zstring(fileName.begin(), it) + Zstr('-') + descrHash + Zstring(it, fileName.end());
const Zstring tempFilePath = appendSeparator(tempFolderPath_) + tempFileName;
const AFS::StreamAttributes sourceAttr{ descr.attr.modTime, descr.attr.fileSize, descr.attr.fileId };
diff --git a/FreeFileSync/Source/base/application.cpp b/FreeFileSync/Source/base/application.cpp
index 6169031d..96aac50d 100755
--- a/FreeFileSync/Source/base/application.cpp
+++ b/FreeFileSync/Source/base/application.cpp
@@ -70,7 +70,7 @@ bool Application::OnInit()
//tentatively set program language to OS default until GlobalSettings.xml is read later
setLanguage(XmlGlobalSettings().programLanguage); //throw FileError
}
- catch (const FileError&) { assert(false); }
+ catch (FileError&) { assert(false); }
Connect(wxEVT_QUERY_END_SESSION, wxEventHandler(Application::onQueryEndSession), nullptr, this);
@@ -174,7 +174,7 @@ void Application::launch(const std::vector<Zstring>& commandArgs)
auto syntaxHelpRequested = [&](const Zstring& arg)
{
- auto it = std::find_if(arg.begin(), arg.end(), [](Zchar c) { return c != Zchar('/') && c != Zchar('-'); });
+ auto it = std::find_if(arg.begin(), arg.end(), [](Zchar c) { return c != Zstr('/') && c != Zstr('-'); });
if (it == arg.begin()) return false; //require at least one prefix character
const Zstring argTmp(it, arg.end());
diff --git a/FreeFileSync/Source/base/comparison.cpp b/FreeFileSync/Source/base/comparison.cpp
index 75aaee7f..4d530c90 100755
--- a/FreeFileSync/Source/base/comparison.cpp
+++ b/FreeFileSync/Source/base/comparison.cpp
@@ -10,6 +10,7 @@
#include "algorithm.h"
#include "parallel_scan.h"
#include "dir_exist_async.h"
+#include "db_file.h"
#include "binary.h"
#include "cmp_filetime.h"
#include "status_handler_impl.h"
@@ -31,6 +32,11 @@ std::vector<FolderPairCfg> fff::extractCompareCfg(const MainConfiguration& mainC
{
const CompConfig cmpCfg = lpc.localCmpCfg ? *lpc.localCmpCfg : mainCfg.cmpCfg;
const SyncConfig syncCfg = lpc.localSyncCfg ? *lpc.localSyncCfg : mainCfg.syncCfg;
+ NormalizedFilter filter = normalizeFilters(mainCfg.globalFilter, lpc.localFilter);
+
+ //exclude the database file(s) sync.ffs_db, sync.x64.ffs_db, etc. and lock files
+ //=> can't put inside fff::parallelDeviceTraversal() which is also used by versioning
+ filter.nameFilter = filter.nameFilter->copyFilterAddingExclusion(Zstring(Zstr("*")) + SYNC_DB_FILE_ENDING + Zstr("\n*") + LOCK_FILE_ENDING);
output.push_back(
{
@@ -38,7 +44,7 @@ std::vector<FolderPairCfg> fff::extractCompareCfg(const MainConfiguration& mainC
cmpCfg.compareVar,
cmpCfg.handleSymlinks,
cmpCfg.ignoreTimeShiftMinutes,
- normalizeFilters(mainCfg.globalFilter, lpc.localFilter),
+ filter,
syncCfg.directionCfg
});
}
@@ -65,9 +71,11 @@ struct ResolvedBaseFolders
ResolvedBaseFolders initializeBaseFolders(const std::vector<FolderPairCfg>& fpCfgList, const std::map<AbstractPath, size_t>& deviceParallelOps,
int folderAccessTimeout,
bool allowUserInteraction,
- ProcessCallback& callback)
+ bool& warnFolderNotExisting,
+ ProcessCallback& callback /*throw X*/)
{
ResolvedBaseFolders output;
+ std::set<AbstractPath> notExisting;
tryReportingError([&]
{
@@ -86,34 +94,38 @@ ResolvedBaseFolders initializeBaseFolders(const std::vector<FolderPairCfg>& fpCf
output.resolvedPairs.push_back({ folderPathLeft, folderPathRight });
}
- const FolderStatus status = getFolderStatusNonBlocking(uniqueBaseFolders, deviceParallelOps,
- folderAccessTimeout, allowUserInteraction, callback); //re-check *all* directories on each try!
+ const FolderStatus status = getFolderStatusNonBlocking(uniqueBaseFolders, deviceParallelOps, //re-check *all* directories on each try!
+ folderAccessTimeout, allowUserInteraction, callback); //throw X
output.existingBaseFolders = status.existing;
-
- if (!status.notExisting.empty() || !status.failedChecks.empty())
+ notExisting = status.notExisting;
+ if (!status.failedChecks.empty())
{
std::wstring msg = _("Cannot find the following folders:") + L"\n";
- for (const AbstractPath& folderPath : status.notExisting)
- msg += L"\n" + AFS::getDisplayPath(folderPath);
-
for (const auto& fc : status.failedChecks)
msg += L"\n" + AFS::getDisplayPath(fc.first);
- msg += L"\n\n";
- msg += _("If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.");
-
- if (!status.failedChecks.empty())
- {
- msg += L"\n___________________________________________";
- for (const auto& fc : status.failedChecks)
- msg += L"\n\n" + replaceCpy(fc.second.toString(), L"\n\n", L"\n");
- }
+ msg += L"\n___________________________________________";
+ for (const auto& fc : status.failedChecks)
+ msg += L"\n\n" + replaceCpy(fc.second.toString(), L"\n\n", L"\n");
throw FileError(msg);
}
}, callback); //throw X
+
+ if (!notExisting.empty())
+ {
+ std::wstring msg = _("The following folders do not yet exist:") + L"\n";
+
+ for (const AbstractPath& folderPath : notExisting)
+ msg += L"\n" + AFS::getDisplayPath(folderPath);
+
+ msg += L"\n\n";
+ msg += _("The folders are created automatically when needed.");
+
+ callback.reportWarning(msg, warnFolderNotExisting); //throw X
+ }
return output;
}
@@ -154,48 +166,38 @@ ComparisonBuffer::ComparisonBuffer(const std::set<DirectoryKey>& foldersToRead,
ProcessCallback& callback) :
fileTimeTolerance_(fileTimeTolerance), cb_(callback), deviceParallelOps_(deviceParallelOps)
{
- class CbImpl : public FillBufferCallback
+ auto onError = [&](const std::wstring& msg, size_t retryNumber)
{
- public:
- CbImpl(ProcessCallback& pcb) : cb_(pcb) {}
-
- void reportStatus(const std::wstring& statusMsg, int itemsTotal) override //throw X
+ switch (callback.reportError(msg, retryNumber))
{
- cb_.updateDataProcessed(itemsTotal - itemsReported_, 0); //processed bytes are reported in subfunctions!
- itemsReported_ = itemsTotal;
+ case ProcessCallback::IGNORE_ERROR:
+ return AFS::TraverserCallback::ON_ERROR_CONTINUE;
- cb_.reportStatus(statusMsg); //throw X
+ case ProcessCallback::RETRY:
+ return AFS::TraverserCallback::ON_ERROR_RETRY;
}
+ assert(false);
+ return AFS::TraverserCallback::ON_ERROR_CONTINUE;
+ };
- HandleError reportError(const std::wstring& msg, size_t retryNumber) override
- {
- switch (cb_.reportError(msg, retryNumber))
- {
- case ProcessCallback::IGNORE_ERROR:
- return ON_ERROR_CONTINUE;
-
- case ProcessCallback::RETRY:
- return ON_ERROR_RETRY;
- }
-
- assert(false);
- return ON_ERROR_CONTINUE;
- }
+ const std::wstring textScanning = _("Scanning:") + L" ";
+ int itemsReported = 0;
- int getItemsTotal() const { return itemsReported_; }
+ auto onStatusUpdate = [&](const std::wstring& statusLine, int itemsTotal)
+ {
+ callback.updateDataProcessed(itemsTotal - itemsReported, 0);
+ itemsReported = itemsTotal;
- private:
- ProcessCallback& cb_;
- int itemsReported_ = 0;
- } cb(callback);
+ callback.reportStatus(textScanning + statusLine); //throw X
+ };
- fillBuffer(foldersToRead, //in
- directoryBuffer_, //out
- deviceParallelOps,
- cb, //throw X
- UI_UPDATE_INTERVAL / 2); //every ~50 ms
+ parallelDeviceTraversal(foldersToRead, //in
+ directoryBuffer_, //out
+ deviceParallelOps,
+ onError, onStatusUpdate, //throw X
+ UI_UPDATE_INTERVAL / 2); //every ~50 ms
- callback.reportInfo(_("Comparison finished:") + L" " + _P("1 item found", "%x items found", cb.getItemsTotal())); //throw X
+ callback.reportInfo(_("Comparison finished:") + L" " + _P("1 item found", "%x items found", itemsReported)); //throw X
}
@@ -225,7 +227,7 @@ Zstringw getConflictSameDateDiffSize(const FilePair& file)
}
-Zstringw getConflictSkippedBinaryComparison(const FilePair& file)
+Zstringw getConflictSkippedBinaryComparison()
{
return copyStringTo<Zstringw>(_("Content comparison was skipped for excluded files."));
}
@@ -426,6 +428,7 @@ bool filesHaveSameContent(const AbstractPath& filePath1, const AbstractPath& fil
{ return parallelScope([=] { return filesHaveSameContent(filePath1, filePath2, notifyUnbufferedIO); /*throw FileError*/ }, singleThread); }
}
+
namespace
{
void categorizeFileByContent(FilePair& file, const std::wstring& txtComparingContentOfFiles, AsyncCallback& acb, std::mutex& singleThread) //throw ThreadInterruption
@@ -494,20 +497,14 @@ std::list<std::shared_ptr<BaseFolderPair>> ComparisonBuffer::compareByContent(co
};
std::vector<BinaryWorkload> fpWorkload;
- auto getDefaultParallelOps = [&](const AbstractPath& rootPath)
- {
- auto itParOps = deviceParallelOps_.find(rootPath);
- return std::max<size_t>(itParOps != deviceParallelOps_.end() ? itParOps->second : 1, 1); //sanitize early for correct status display
- };
-
auto addToBinaryWorkload = [&](const AbstractPath& basePathL, const AbstractPath& basePathR, RingBuffer<FilePair*>&& filesToCompareBytewise)
{
- const AbstractPath rootPathL = AFS::getPathComponents(basePathL).rootPath;
- const AbstractPath rootPathR = AFS::getPathComponents(basePathR).rootPath;
+ const AbstractPath rootPathL = AFS::getRootPath(basePathL);
+ const AbstractPath rootPathR = AFS::getRootPath(basePathR);
//calculate effective max parallelOps that devices must support
- const size_t parallelOpsFp = std::max(getDefaultParallelOps(rootPathL),
- getDefaultParallelOps(rootPathR));
+ const size_t parallelOpsFp = std::max(getDeviceParallelOps(deviceParallelOps_, rootPathL),
+ getDeviceParallelOps(deviceParallelOps_, rootPathR));
ParallelOps& posL = parallelOpsStatus[rootPathL];
ParallelOps& posR = parallelOpsStatus[rootPathR];
@@ -521,19 +518,20 @@ std::list<std::shared_ptr<BaseFolderPair>> ComparisonBuffer::compareByContent(co
//PERF_START;
std::list<std::shared_ptr<BaseFolderPair>> output;
+ const Zstringw txtConflictSkippedBinaryComparison = getConflictSkippedBinaryComparison(); //avoid premature pess.: save memory via ref-counted string
+
for (const auto& w : workLoad)
{
std::vector<FilePair*> undefinedFiles;
std::vector<SymlinkPair*> uncategorizedLinks;
- //do basis scan and retrieve candidates for binary comparison (files existing on both sides)
-
+ //run basis scan and retrieve candidates for binary comparison (files existing on both sides)
output.push_back(performComparison(w.first, w.second, undefinedFiles, uncategorizedLinks));
+ RingBuffer<FilePair*> filesToCompareBytewise;
//content comparison of file content happens AFTER finding corresponding files and AFTER filtering
//in order to separate into two processes (scanning and comparing)
- RingBuffer<FilePair*> filesToCompareBytewise;
for (FilePair* file : undefinedFiles)
- //pre-check: files have different content if they have a different filesize (must not be FILE_EQUAL: see InSyncFile)
+ //pre-check: files have different content if they have a different file size (must not be FILE_EQUAL: see InSyncFile)
if (file->getFileSize<LEFT_SIDE>() != file->getFileSize<RIGHT_SIDE>())
file->setCategory<FILE_DIFFERENT_CONTENT>();
else
@@ -541,7 +539,7 @@ std::list<std::shared_ptr<BaseFolderPair>> ComparisonBuffer::compareByContent(co
//perf: skip binary comparison for excluded rows (e.g. via time span and size filter)!
//both soft and hard filter were already applied in ComparisonBuffer::performComparison()!
if (!file->isActive())
- file->setCategoryConflict(getConflictSkippedBinaryComparison(*file));
+ file->setCategoryConflict(txtConflictSkippedBinaryComparison);
else
filesToCompareBytewise.push_back(file);
}
@@ -570,8 +568,6 @@ std::list<std::shared_ptr<BaseFolderPair>> ComparisonBuffer::compareByContent(co
//PERF_START;
- warn_static("review")
-
std::mutex singleThread; //only a single worker thread may run at a time, except for parallel file I/O
AsyncCallback acb; //
@@ -827,7 +823,7 @@ void MergeSides::mergeTwoSides(const FolderContainer& lhs, const FolderContainer
//-----------------------------------------------------------------------------------------------
-//uncheck excluded directories (see fillBuffer()) + remove superfluous excluded subdirectories
+//uncheck excluded directories (see parallelDeviceTraversal()) + remove superfluous excluded subdirectories
void stripExcludedDirectories(ContainerObject& hierObj, const HardFilter& filterProc)
{
for (FolderPair& folder : hierObj.refSubFolders())
@@ -915,7 +911,7 @@ std::shared_ptr<BaseFolderPair> ComparisonBuffer::performComparison(const Resolv
//attention: some excluded directories are still in the comparison result! (see include filter handling!)
if (!fpCfg.filter.nameFilter->isNull())
- stripExcludedDirectories(*output, *fpCfg.filter.nameFilter); //mark excluded directories (see fillBuffer()) + remove superfluous excluded subdirectories
+ stripExcludedDirectories(*output, *fpCfg.filter.nameFilter); //mark excluded directories (see parallelDeviceTraversal()) + remove superfluous excluded subdirectories
//apply soft filtering (hard filter already applied during traversal!)
addSoftFiltering(*output, fpCfg.filter.timeSizeFilter);
@@ -1003,7 +999,7 @@ FolderComparison fff::compare(WarningDialogs& warnings,
callback.reportInfo(e.toString()); //throw X
}
- const ResolvedBaseFolders& resInfo = initializeBaseFolders(fpCfgList, deviceParallelOps, folderAccessTimeout, allowUserInteraction, callback);
+ const ResolvedBaseFolders& resInfo = initializeBaseFolders(fpCfgList, deviceParallelOps, folderAccessTimeout, allowUserInteraction, warnings.warnFolderNotExisting, callback); //throw X
//directory existence only checked *once* to avoid race conditions!
if (resInfo.resolvedPairs.size() != fpCfgList.size())
throw std::logic_error("Contract violation! " + std::string(__FILE__) + ":" + numberTo<std::string>(__LINE__));
@@ -1029,7 +1025,7 @@ FolderComparison fff::compare(WarningDialogs& warnings,
haveFullPair = true;
if (havePartialPair == haveFullPair) //error if: all empty or exist both full and partial pairs -> support single-folder comparison scenario
- callback.reportWarning(_("A folder input field is empty.") + L" \n\n" +
+ callback.reportWarning(_("A folder input field is empty.") + L" \n\n" + //throw X
_("The corresponding folder will be considered as empty."), warnings.warnInputFieldEmpty);
}
@@ -1050,7 +1046,7 @@ FolderComparison fff::compare(WarningDialogs& warnings,
}
if (!msg.empty())
- callback.reportWarning(_("One base folder of a folder pair is contained in the other one.") + L"\n" +
+ callback.reportWarning(_("One base folder of a folder pair is contained in the other one.") + L"\n" + //throw X
_("The folder should be excluded from synchronization via filter.") + msg, warnings.warnDependentFolderPair);
}
@@ -1075,7 +1071,7 @@ FolderComparison fff::compare(WarningDialogs& warnings,
for (const auto& w : workLoad)
{
if (basefolderExisting(w.first.folderPathLeft)) //only traverse *currently existing* folders: at this point user is aware that non-ex + empty string are seen as empty folder!
- foldersToRead.emplace(DirectoryKey({ w.first.folderPathLeft, w.second.filter.nameFilter, w.second.handleSymlinks }));
+ foldersToRead.emplace(DirectoryKey({ w.first.folderPathLeft, w.second.filter.nameFilter, w.second.handleSymlinks }));
if (basefolderExisting(w.first.folderPathRight))
foldersToRead.emplace(DirectoryKey({ w.first.folderPathRight, w.second.filter.nameFilter, w.second.handleSymlinks }));
}
diff --git a/FreeFileSync/Source/base/db_file.cpp b/FreeFileSync/Source/base/db_file.cpp
index 5a134e29..5945918c 100755
--- a/FreeFileSync/Source/base/db_file.cpp
+++ b/FreeFileSync/Source/base/db_file.cpp
@@ -48,7 +48,7 @@ AbstractPath getDatabaseFilePath(const BaseFolderPair& baseFolder, bool tempfile
if (tempfile) //generate (hopefully) unique file name to avoid clashing with some remnant ffs_tmp file
{
const Zstring shortGuid = printNumber<Zstring>(Zstr("%04x"), static_cast<unsigned int>(getCrc16(generateGUID())));
- dbFileName = dbName + Zchar('.') + shortGuid + AFS::TEMP_FILE_ENDING;
+ dbFileName = dbName + Zstr('.') + shortGuid + AFS::TEMP_FILE_ENDING;
}
else
dbFileName = dbName + SYNC_DB_FILE_ENDING;
@@ -130,8 +130,8 @@ DbStreams loadStreams(const AbstractPath& dbPath, const IOCallback& notifyUnbuff
}
else
{
- sessionData.isLeadStream = readNumber<int8_t>(*fileStreamIn) != 0; //throw FileError, ErrorFileLocked, X, UnexpectedEndOfStreamError
- sessionData.rawStream = readContainer<ByteArray>(*fileStreamIn); //throw FileError, ErrorFileLocked, X, UnexpectedEndOfStreamError
+ sessionData.isLeadStream = readNumber <int8_t >(*fileStreamIn) != 0; //throw FileError, ErrorFileLocked, X, UnexpectedEndOfStreamError
+ sessionData.rawStream = readContainer<ByteArray>(*fileStreamIn); //
}
output[sessionID] = std::move(sessionData);
@@ -315,7 +315,7 @@ public:
MemoryStreamIn<ByteArray> streamInR(streamR);
const int streamVersion = readNumber<int32_t>(streamInL); //throw UnexpectedEndOfStreamError
- const int streamVersionR = readNumber<int32_t>(streamInR); //throw UnexpectedEndOfStreamError
+ const int streamVersionR = readNumber<int32_t>(streamInR); //
if (streamVersion != streamVersionR)
throw FileError(_("Database file is corrupted:") + L"\n" + fmtPath(displayFilePathL) + L"\n" + fmtPath(displayFilePathR), L"Different stream formats");
diff --git a/FreeFileSync/Source/base/dir_exist_async.h b/FreeFileSync/Source/base/dir_exist_async.h
index cc5aa479..b6183578 100755
--- a/FreeFileSync/Source/base/dir_exist_async.h
+++ b/FreeFileSync/Source/base/dir_exist_async.h
@@ -31,7 +31,7 @@ struct FolderStatus
FolderStatus getFolderStatusNonBlocking(const std::set<AbstractPath>& folderPaths, const std::map<AbstractPath, size_t>& deviceParallelOps,
int folderAccessTimeout, bool allowUserInteraction,
- ProcessCallback& procCallback) //throw X
+ ProcessCallback& procCallback /*throw X*/)
{
using namespace zen;
@@ -40,7 +40,7 @@ FolderStatus getFolderStatusNonBlocking(const std::set<AbstractPath>& folderPath
for (const AbstractPath& folderPath : folderPaths)
if (!AFS::isNullPath(folderPath)) //skip empty dirs
- perDevicePaths[AFS::getPathComponents(folderPath).rootPath].insert(folderPath);
+ perDevicePaths[AFS::getRootPath(folderPath)].insert(folderPath);
std::vector<std::pair<AbstractPath, std::future<bool>>> futureInfo;
@@ -48,9 +48,7 @@ FolderStatus getFolderStatusNonBlocking(const std::set<AbstractPath>& folderPath
for (const auto& item : perDevicePaths)
{
const AbstractPath& rootPath = item.first;
-
- auto itParOps = deviceParallelOps.find(rootPath);
- const size_t parallelOps = std::max<size_t>(itParOps != deviceParallelOps.end() ? itParOps->second : 1, 1);
+ const size_t parallelOps = getDeviceParallelOps(deviceParallelOps, rootPath);
perDeviceThreads.emplace_back(parallelOps, "DirExist: " + utfTo<std::string>(AFS::getDisplayPath(rootPath)));
auto& threadGroup = perDeviceThreads.back();
diff --git a/FreeFileSync/Source/base/dir_lock.cpp b/FreeFileSync/Source/base/dir_lock.cpp
index b2e30e40..cb574ab3 100755
--- a/FreeFileSync/Source/base/dir_lock.cpp
+++ b/FreeFileSync/Source/base/dir_lock.cpp
@@ -60,7 +60,7 @@ private:
//try to append one byte...
void emitLifeSign() const //noexcept
{
- const int fileHandle = ::open(lockFilePath_.c_str(), O_WRONLY | O_APPEND);
+ const int fileHandle = ::open(lockFilePath_.c_str(), O_WRONLY | O_APPEND | O_CLOEXEC);
if (fileHandle == -1)
return;
ZEN_ON_SCOPE_EXIT(::close(fileHandle));
@@ -243,6 +243,19 @@ ProcessStatus getProcessStatus(const LockInformation& lockInfo) //throw FileErro
}
+DEFINE_NEW_FILE_ERROR(ErrorFileNotExisting);
+uint64_t getLockFileSize(const Zstring& filePath) //throw FileError, ErrorFileNotExisting
+{
+ struct ::stat fileInfo = {};
+ if (::stat(filePath.c_str(), &fileInfo) == 0)
+ return fileInfo.st_size;
+
+ if (errno == ENOENT)
+ throw ErrorFileNotExisting(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(filePath)), formatSystemError(L"stat", errno));
+ THROW_LAST_FILE_ERROR(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(filePath)), L"stat");
+}
+
+
void waitOnDirLock(const Zstring& lockFilePath, const DirLockCallback& notifyStatus /*throw X*/, std::chrono::milliseconds cbInterval) //throw FileError
{
std::wstring infoMsg = _("Waiting while directory is locked:") + L' ' + fmtPath(lockFilePath);
@@ -272,69 +285,69 @@ void waitOnDirLock(const Zstring& lockFilePath, const DirLockCallback& notifySta
}
catch (FileError&) {} //logfile may be only partly written -> this is no error!
//------------------------------------------------------------------------------
- try
- {
- uint64_t fileSizeOld = 0;
- auto lastLifeSign = std::chrono::steady_clock::now();
- for (;;)
+ uint64_t fileSizeOld = 0;
+ auto lastLifeSign = std::chrono::steady_clock::now();
+
+ for (;;)
+ {
+ uint64_t fileSizeNew = 0;
+ try
{
- const uint64_t fileSizeNew = getFileSize(lockFilePath); //throw FileError
- const auto lastCheckTime = std::chrono::steady_clock::now();
+ fileSizeNew = getLockFileSize(lockFilePath); //throw FileError, ErrorFileNotExisting
+ }
+ catch (ErrorFileNotExisting&) { return; } //what we are waiting for...
- if (fileSizeNew != fileSizeOld) //received life sign from lock
- {
- fileSizeOld = fileSizeNew;
- lastLifeSign = lastCheckTime;
- }
+ const auto lastCheckTime = std::chrono::steady_clock::now();
- if (lockOwnderDead || //no need to wait any longer...
- lastCheckTime >= lastLifeSign + DETECT_ABANDONED_INTERVAL)
- {
- DirLock guardDeletion(abandonedLockDeletionName(lockFilePath), notifyStatus, cbInterval); //throw FileError
+ if (fileSizeNew != fileSizeOld) //received life sign from lock
+ {
+ fileSizeOld = fileSizeNew;
+ lastLifeSign = lastCheckTime;
+ }
- //now that the lock is in place check existence again: meanwhile another process may have deleted and created a new lock!
- std::string currentLockId;
- try { currentLockId = retrieveLockId(lockFilePath); /*throw FileError*/ }
- catch (FileError&) {}
+ if (lockOwnderDead || //no need to wait any longer...
+ lastCheckTime >= lastLifeSign + DETECT_ABANDONED_INTERVAL)
+ {
+ DirLock guardDeletion(abandonedLockDeletionName(lockFilePath), notifyStatus, cbInterval); //throw FileError
- if (currentLockId != originalLockId) //throw FileError
- return; //another process has placed a new lock, leave scope: the wait for the old lock is technically over...
+ //now that the lock is in place check existence again: meanwhile another process may have deleted and created a new lock!
+ std::string currentLockId;
+ try { currentLockId = retrieveLockId(lockFilePath); /*throw FileError*/ }
+ catch (FileError&) {}
- if (getFileSize(lockFilePath) != fileSizeOld) //throw FileError
- continue; //late life sign
+ if (currentLockId != originalLockId)
+ return; //another process has placed a new lock, leave scope: the wait for the old lock is technically over...
- removeFilePlain(lockFilePath); //throw FileError
- return;
+ try
+ {
+ if (getLockFileSize(lockFilePath) != fileSizeOld) //throw FileError, ErrorFileNotExisting
+ return; //late life sign (or maybe even a different lock if retrieveLockId() failed!)
}
+ catch (ErrorFileNotExisting&) { return; } //what we are waiting for...
+
+ removeFilePlain(lockFilePath); //throw FileError
+ return;
+ }
- //wait some time...
- const auto delayUntil = std::chrono::steady_clock::now() + POLL_LIFE_SIGN_INTERVAL;
- for (auto now = std::chrono::steady_clock::now(); now < delayUntil; now = std::chrono::steady_clock::now())
+ //wait some time...
+ const auto delayUntil = std::chrono::steady_clock::now() + POLL_LIFE_SIGN_INTERVAL;
+ for (auto now = std::chrono::steady_clock::now(); now < delayUntil; now = std::chrono::steady_clock::now())
+ {
+ if (notifyStatus)
{
- if (notifyStatus)
+ //one signal missed: it's likely this is an abandoned lock => show countdown
+ if (lastCheckTime >= lastLifeSign + EMIT_LIFE_SIGN_INTERVAL + std::chrono::seconds(1))
{
- //one signal missed: it's likely this is an abandoned lock => show countdown
- if (lastCheckTime >= lastLifeSign + EMIT_LIFE_SIGN_INTERVAL + std::chrono::seconds(1))
- {
- const int remainingSeconds = std::max(0, static_cast<int>(std::chrono::duration_cast<std::chrono::seconds>(DETECT_ABANDONED_INTERVAL - (now - lastLifeSign)).count()));
- notifyStatus(infoMsg + L" | " + _("Detecting abandoned lock...") + L' ' + _P("1 sec", "%x sec", remainingSeconds)); //throw X
- }
- else
- notifyStatus(infoMsg); //throw X; emit a message in any case (might clear other one)
+ const int remainingSeconds = std::max(0, static_cast<int>(std::chrono::duration_cast<std::chrono::seconds>(DETECT_ABANDONED_INTERVAL - (now - lastLifeSign)).count()));
+ notifyStatus(infoMsg + L" | " + _("Detecting abandoned lock...") + L' ' + _P("1 sec", "%x sec", remainingSeconds)); //throw X
}
- std::this_thread::sleep_for(cbInterval);
+ else
+ notifyStatus(infoMsg); //throw X; emit a message in any case (might clear other one)
}
+ std::this_thread::sleep_for(cbInterval);
}
}
- catch (FileError&)
- {
- warn_static("race condition: above calls, e.g. getFileSize() might fail for not existing file, but another one might have been created at this point")
-
- if (itemNotExisting(lockFilePath))
- return; //what we are waiting for...
- throw;
- }
}
@@ -354,22 +367,22 @@ bool tryLock(const Zstring& lockFilePath) //throw FileError
ZEN_ON_SCOPE_EXIT(::umask(oldMask));
//O_EXCL contains a race condition on NFS file systems: http://linux.die.net/man/2/open
- const int fileHandle = ::open(lockFilePath.c_str(), O_CREAT | O_EXCL | O_WRONLY,
- S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); //0666
- if (fileHandle == -1)
+ const int hFile = ::open(lockFilePath.c_str(), O_CREAT | O_EXCL | O_WRONLY | O_CLOEXEC,
+ S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); //0666
+ if (hFile == -1)
{
if (errno == EEXIST)
return false;
- else
- THROW_LAST_FILE_ERROR(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(lockFilePath)), L"open");
+
+ THROW_LAST_FILE_ERROR(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(lockFilePath)), L"open");
}
ZEN_ON_SCOPE_FAIL(try { removeFilePlain(lockFilePath); }
catch (FileError&) {});
- FileOutput fileOut(fileHandle, lockFilePath, nullptr /*notifyUnbufferedIO*/); //pass handle ownership
+ FileOutput fileOut(hFile, lockFilePath, nullptr /*notifyUnbufferedIO*/); //pass handle ownership
//write housekeeping info: user, process info, lock GUID
MemoryStreamOut<ByteArray> streamOut;
- serialize(getLockInfoFromCurrentProcess(), streamOut);
+ serialize(getLockInfoFromCurrentProcess(), streamOut); //throw FileError
fileOut.write(&*streamOut.ref().begin(), streamOut.ref().size()); //throw FileError, (X)
fileOut.finalize(); //
@@ -386,8 +399,10 @@ public:
{
if (notifyStatus) notifyStatus(replaceCpy(_("Creating file %x"), L"%x", fmtPath(lockFilePath))); //throw X
- while (!::tryLock(lockFilePath)) //throw FileError
- ::waitOnDirLock(lockFilePath, notifyStatus, cbInterval); //
+ while (!::tryLock(lockFilePath)) //throw FileError
+ {
+ ::waitOnDirLock(lockFilePath, notifyStatus, cbInterval); //throw FileError
+ }
lifeSignthread_ = InterruptibleThread(LifeSigns(lockFilePath));
}
@@ -397,7 +412,7 @@ public:
lifeSignthread_.interrupt(); //thread lifetime is subset of this instances's life
lifeSignthread_.join();
- ::releaseLock(lockFilePath_); //throw ()
+ ::releaseLock(lockFilePath_); //noexcept
}
private:
diff --git a/FreeFileSync/Source/base/error_log.h b/FreeFileSync/Source/base/error_log.h
index 022bf836..a27e423b 100755
--- a/FreeFileSync/Source/base/error_log.h
+++ b/FreeFileSync/Source/base/error_log.h
@@ -38,7 +38,7 @@ void logFatalError(const std::string& msg) //noexcept
{
saveBinContainer(getConfigDirPathPf() + Zstr("LastError.log"), logEntry, nullptr /*notifyUnbufferedIO*/); //throw FileError
}
- catch (const FileError&) {}
+ catch (FileError&) {}
}
}
diff --git a/FreeFileSync/Source/base/ffs_paths.cpp b/FreeFileSync/Source/base/ffs_paths.cpp
index a9c43d36..3668f059 100755
--- a/FreeFileSync/Source/base/ffs_paths.cpp
+++ b/FreeFileSync/Source/base/ffs_paths.cpp
@@ -62,7 +62,7 @@ Zstring fff::getConfigDirPathPf()
{
createDirectoryIfMissingRecursion(configDirPath); //throw FileError
}
- catch (const FileError&) { assert(false); }
+ catch (FileError&) { assert(false); }
return appendSeparator(configDirPath);
}
diff --git a/FreeFileSync/Source/base/file_hierarchy.h b/FreeFileSync/Source/base/file_hierarchy.h
index f0a61f99..1bae389f 100755
--- a/FreeFileSync/Source/base/file_hierarchy.h
+++ b/FreeFileSync/Source/base/file_hierarchy.h
@@ -338,7 +338,7 @@ class DerefIter
public:
using iterator_category = std::bidirectional_iterator_tag;
using value_type = T;
- using difference_type = std::ptrdiff_t;
+ using difference_type = ptrdiff_t;
using pointer = T*;
using reference = T&;
@@ -383,7 +383,7 @@ template <class T>
class ObjectMgr
{
public:
- using ObjectId = ObjectMgr* ;
+ using ObjectId = ObjectMgr* ;
using ObjectIdConst = const ObjectMgr*;
ObjectIdConst getId() const { return this; }
@@ -864,7 +864,7 @@ void FileSystemObject::setCategoryConflict(const Zstringw& description)
{
assert(!description.empty());
cmpResult_ = FILE_CONFLICT;
- cmpResultDescr_ = zen::copyStringTo<Zstringw>(description);
+ cmpResultDescr_ = description;
}
inline
@@ -872,7 +872,7 @@ void FileSystemObject::setCategoryDiffMetadata(const Zstringw& description)
{
assert(!description.empty());
cmpResult_ = FILE_DIFFERENT_METADATA;
- cmpResultDescr_ = zen::copyStringTo<Zstringw>(description);
+ cmpResultDescr_ = description;
}
inline
diff --git a/FreeFileSync/Source/base/generate_logfile.cpp b/FreeFileSync/Source/base/generate_logfile.cpp
index 293bedb7..ecd34f0c 100755
--- a/FreeFileSync/Source/base/generate_logfile.cpp
+++ b/FreeFileSync/Source/base/generate_logfile.cpp
@@ -170,57 +170,26 @@ void fff::saveToLastSyncsLog(const LogSummary& summary, //throw FileError
}
-namespace
-{
-struct LogTraverserCallback: public AFS::TraverserCallback
-{
- LogTraverserCallback(const Zstring& prefix, const std::function<void()>& onUpdateStatus) :
- prefix_(prefix),
- onUpdateStatus_(onUpdateStatus) {}
-
- void onFile(const FileInfo& fi) override
- {
- if (startsWith(fi.itemName, prefix_, CmpFilePath() /*even on Linux!*/) && endsWith(fi.itemName, Zstr(".log"), CmpFilePath()))
- logFileNames_.push_back(fi.itemName);
-
- if (onUpdateStatus_) onUpdateStatus_();
- }
- std::shared_ptr<TraverserCallback> onFolder (const FolderInfo& fi) override { return nullptr; }
- HandleLink onSymlink(const SymlinkInfo& si) override { return TraverserCallback::LINK_SKIP; }
-
- HandleError reportDirError (const std::wstring& msg, size_t retryNumber ) override { setError(msg); return ON_ERROR_CONTINUE; }
- HandleError reportItemError(const std::wstring& msg, size_t retryNumber, const Zstring& itemName) override { setError(msg); return ON_ERROR_CONTINUE; }
-
- const std::vector<Zstring>& refFileNames() const { return logFileNames_; }
- const Opt<FileError>& getLastError() const { return lastError_; }
-
-private:
- void setError(const std::wstring& msg) //implement late failure
- {
- if (!lastError_)
- lastError_ = FileError(msg);
- }
-
- const Zstring prefix_;
- const std::function<void()> onUpdateStatus_;
- std::vector<Zstring> logFileNames_; //out
- Opt<FileError> lastError_;
-};
-}
-
-
void fff::limitLogfileCount(const AbstractPath& logFolderPath, const std::wstring& jobname, size_t maxCount, //throw FileError
const std::function<void(const std::wstring& msg)>& notifyStatus)
{
+ const std::wstring cleaningMsg = _("Cleaning up log files:");
const Zstring prefix = utfTo<Zstring>(jobname);
- const std::wstring cleaningMsg = _("Cleaning up old log files...");;
//traverse source directory one level deep
- auto lt = std::make_shared<LogTraverserCallback>(prefix, [&] { if (notifyStatus) notifyStatus(cleaningMsg); });
- AFS::traverseFolderParallel(logFolderPath, {{ {}, lt }}, 1 /*parallelOps*/); //throw FileError
+ if (notifyStatus) notifyStatus(cleaningMsg + L" " + fmtPath(AFS::getDisplayPath(logFolderPath)));
+
+ std::vector<Zstring> logFileNames;
+
+ AFS::traverseFolderFlat(logFolderPath, [&](const AFS::FileInfo& fi) //throw FileError
+ {
+ if (startsWith(fi.itemName, prefix, CmpFilePath() /*even on Linux!*/) && endsWith(fi.itemName, Zstr(".log"), CmpFilePath()))
+ logFileNames.push_back(fi.itemName);
+ },
+ nullptr /*onFolder*/,
+ nullptr /*onSymlink*/);
- std::vector<Zstring> logFileNames = lt->refFileNames();
- Opt<FileError> lastError = lt->getLastError();
+ Opt<FileError> lastError;
if (logFileNames.size() > maxCount)
{
diff --git a/FreeFileSync/Source/base/hard_filter.cpp b/FreeFileSync/Source/base/hard_filter.cpp
index d4085f84..1c735c85 100755
--- a/FreeFileSync/Source/base/hard_filter.cpp
+++ b/FreeFileSync/Source/base/hard_filter.cpp
@@ -224,7 +224,7 @@ std::vector<Zstring> fff::splitByDelimiter(const Zstring& filterString)
std::vector<Zstring> output;
for (const Zstring& str : split(filterString, FILTER_ITEM_SEPARATOR, SplitType::SKIP_EMPTY)) //split by less common delimiter first (create few, large strings)
- for (Zstring entry : split(str, Zchar('\n'), SplitType::SKIP_EMPTY))
+ for (Zstring entry : split(str, Zstr('\n'), SplitType::SKIP_EMPTY))
{
trim(entry);
if (!entry.empty())
diff --git a/FreeFileSync/Source/base/hard_filter.h b/FreeFileSync/Source/base/hard_filter.h
index f829761e..5e1f1702 100755
--- a/FreeFileSync/Source/base/hard_filter.h
+++ b/FreeFileSync/Source/base/hard_filter.h
@@ -217,22 +217,21 @@ HardFilter::FilterRef constructFilter(const Zstring& includePhrase,
const Zstring& includePhrase2,
const Zstring& excludePhrase2)
{
- std::shared_ptr<HardFilter> filterTmp;
-
if (NameFilter::isNull(includePhrase, Zstring()))
- filterTmp = std::make_shared<NameFilter>(includePhrase2, excludePhrase + Zstr("\n") + excludePhrase2);
+ {
+ std::shared_ptr<HardFilter> filterTmp = std::make_shared<NameFilter>(includePhrase2, excludePhrase + Zstr("\n") + excludePhrase2);
+ if (filterTmp->isNull())
+ return std::make_shared<NullFilter>();
+
+ return filterTmp;
+ }
else
{
if (NameFilter::isNull(includePhrase2, Zstring()))
- filterTmp = std::make_shared<NameFilter>(includePhrase, excludePhrase + Zstr("\n") + excludePhrase2);
+ return std::make_shared<NameFilter>(includePhrase, excludePhrase + Zstr("\n") + excludePhrase2);
else
return std::make_shared<CombinedFilter>(NameFilter(includePhrase, excludePhrase + Zstr("\n") + excludePhrase2), NameFilter(includePhrase2, Zstring()));
}
-
- if (filterTmp->isNull())
- return std::make_shared<NullFilter>();
-
- return filterTmp;
}
diff --git a/FreeFileSync/Source/base/parallel_scan.cpp b/FreeFileSync/Source/base/parallel_scan.cpp
index 7f356ee7..11f2993b 100755
--- a/FreeFileSync/Source/base/parallel_scan.cpp
+++ b/FreeFileSync/Source/base/parallel_scan.cpp
@@ -10,8 +10,8 @@
#include <zen/basic_math.h>
#include <zen/thread.h>
#include <zen/scope_guard.h>
-#include "db_file.h"
-#include "lock_holder.h"
+//#include "db_file.h"
+//#include "lock_holder.h"
using namespace zen;
using namespace fff;
@@ -159,7 +159,7 @@ public:
AsyncCallback(size_t threadsToFinish, std::chrono::milliseconds cbInterval) : threadsToFinish_(threadsToFinish), cbInterval_(cbInterval) {}
//blocking call: context of worker thread
- FillBufferCallback::HandleError reportError(const std::wstring& msg, size_t retryNumber) //throw ThreadInterruption
+ AFS::TraverserCallback::HandleError reportError(const std::wstring& msg, size_t retryNumber) //throw ThreadInterruption
{
assert(!runningMainThread());
std::unique_lock<std::mutex> dummy(lockRequest_);
@@ -170,7 +170,7 @@ public:
interruptibleWait(conditionHaveResponse_, dummy, [this] { return static_cast<bool>(errorResponse_); }); //throw ThreadInterruption
- FillBufferCallback::HandleError rv = *errorResponse_;
+ AFS::TraverserCallback::HandleError rv = *errorResponse_;
errorRequest_ = NoValue();
errorResponse_ = NoValue();
@@ -182,7 +182,7 @@ public:
}
//context of main thread
- void waitUntilDone(std::chrono::milliseconds duration, FillBufferCallback& callback) //throw X
+ void waitUntilDone(std::chrono::milliseconds duration, const TravErrorCb& onError, const TravStatusCb& onStatusUpdate) //throw X
{
assert(runningMainThread());
for (;;)
@@ -198,19 +198,19 @@ public:
if (errorRequest_ && !errorResponse_)
{
assert(threadsToFinish_ != 0);
- errorResponse_ = callback.reportError(errorRequest_->first, errorRequest_->second); //throw X
+ errorResponse_ = onError(errorRequest_->first, errorRequest_->second); //throw X
conditionHaveResponse_.notify_all(); //instead of notify_one(); workaround bug: https://svn.boost.org/trac/boost/ticket/7796
}
if (threadsToFinish_ == 0)
{
dummy.unlock();
- callback.reportStatus(getCurrentStatus(), itemsScanned_); //throw X; one last call for accurate stat-reporting!
+ onStatusUpdate(getStatusLine(), itemsScanned_); //throw X; one last call for accurate stat-reporting!
return;
}
}
//call member functions outside of mutex scope:
- callback.reportStatus(getCurrentStatus(), itemsScanned_); //throw X
+ onStatusUpdate(getStatusLine(), itemsScanned_); //throw X
}
}
@@ -271,7 +271,7 @@ public:
}
private:
- std::wstring getCurrentStatus() //context of main thread, call repreatedly
+ std::wstring getStatusLine() //context of main thread, call repreatedly
{
assert(runningMainThread());
@@ -286,9 +286,9 @@ private:
filePath = currentFile_;
}
if (parallelOpsTotal >= 2)
- return textScanning_ + L"[" + _P("1 thread", "%x threads", parallelOpsTotal) + L"] " + filePath;
+ return L"[" + _P("1 thread", "%x threads", parallelOpsTotal) + L"] " + filePath;
else
- return textScanning_ + filePath;
+ return filePath;
}
//---- main <-> worker communication channel ----
@@ -296,8 +296,8 @@ private:
std::condition_variable conditionReadyForNewRequest_;
std::condition_variable conditionNewRequest;
std::condition_variable conditionHaveResponse_;
- Opt<std::pair<std::wstring, size_t>> errorRequest_; //error message + retry number
- Opt<FillBufferCallback::HandleError> errorResponse_;
+ Opt<std::pair<std::wstring, size_t>> errorRequest_; //error message + retry number
+ Opt<AFS::TraverserCallback::HandleError> errorResponse_;
size_t threadsToFinish_; //can't use activeThreadIdxs_.size() which is locked by different mutex!
//also note: activeThreadIdxs_.size() may be 0 during worker thread construction!
@@ -308,7 +308,6 @@ private:
std::atomic<int> notifyingThreadIdx_ { 0 }; //CAVEAT: do NOT use boost::thread::id: https://svn.boost.org/trac/boost/ticket/5754
const std::chrono::milliseconds cbInterval_;
- const std::wstring textScanning_ = _("Scanning:") + L" "; //this one is (currently) not shared
//---- status updates II (lock-free) ----
std::atomic<int> itemsScanned_{ 0 }; //std:atomic is uninitialized by default!
@@ -343,9 +342,9 @@ public:
output_(output),
level_(level) {} //MUST NOT use cfg_ during construction! see BaseDirCallback()
- virtual void onFile (const FileInfo& fi) override; //
- virtual std::shared_ptr<TraverserCallback> onFolder (const FolderInfo& fi) override; //throw ThreadInterruption
- virtual HandleLink onSymlink(const SymlinkInfo& li) override; //
+ virtual void onFile (const AFS::FileInfo& fi) override; //
+ virtual std::shared_ptr<TraverserCallback> onFolder (const AFS::FolderInfo& fi) override; //throw ThreadInterruption
+ virtual HandleLink onSymlink(const AFS::SymlinkInfo& li) override; //
HandleError reportDirError (const std::wstring& msg, size_t retryNumber) override { return reportError(msg, retryNumber, Zstring()); } //throw ThreadInterruption
HandleError reportItemError(const std::wstring& msg, size_t retryNumber, const Zstring& itemName) override { return reportError(msg, retryNumber, itemName); } //
@@ -387,17 +386,14 @@ private:
};
-void DirCallback::onFile(const FileInfo& fi) //throw ThreadInterruption
+void DirCallback::onFile(const AFS::FileInfo& fi) //throw ThreadInterruption
{
interruptionPoint(); //throw ThreadInterruption
- //do not list the database file(s) sync.ffs_db, sync.x64.ffs_db, etc. or lock files
- if (endsWith(fi.itemName, SYNC_DB_FILE_ENDING) ||
- endsWith(fi.itemName, LOCK_FILE_ENDING))
- return;
-
const Zstring fileRelPath = parentRelPathPf_ + fi.itemName;
+ warn_static("why call reportCurrentFile() per file at all? should be sufficient to do per folder only!")
+
//update status information no matter whether item is excluded or not!
if (cfg_.acb.mayReportCurrentFile(cfg_.threadIdx, cfg_.lastReportTime))
cfg_.acb.reportCurrentFile(AFS::getDisplayPath(AFS::appendRelPath(cfg_.baseFolderPath, fileRelPath)));
@@ -407,6 +403,8 @@ void DirCallback::onFile(const FileInfo& fi) //throw ThreadInterruption
if (!cfg_.filter->passFileFilter(fileRelPath))
return;
+ //sync.ffs_db database and lock files are excluded via filter!
+
// std::string fileId = details.fileSize >= 1024 * 1024U ? util::retrieveFileID(filepath) : std::string();
/*
Perf test Windows 7, SSD, 350k files, 50k dirs, files > 1MB: 7000
@@ -424,7 +422,7 @@ void DirCallback::onFile(const FileInfo& fi) //throw ThreadInterruption
}
-std::shared_ptr<AFS::TraverserCallback> DirCallback::onFolder(const FolderInfo& fi) //throw ThreadInterruption
+std::shared_ptr<AFS::TraverserCallback> DirCallback::onFolder(const AFS::FolderInfo& fi) //throw ThreadInterruption
{
interruptionPoint(); //throw ThreadInterruption
@@ -463,7 +461,7 @@ std::shared_ptr<AFS::TraverserCallback> DirCallback::onFolder(const FolderInfo&
}
-DirCallback::HandleLink DirCallback::onSymlink(const SymlinkInfo& si) //throw ThreadInterruption
+DirCallback::HandleLink DirCallback::onSymlink(const AFS::SymlinkInfo& si) //throw ThreadInterruption
{
interruptionPoint(); //throw ThreadInterruption
@@ -504,18 +502,18 @@ DirCallback::HandleLink DirCallback::onSymlink(const SymlinkInfo& si) //throw Th
}
-DirCallback::HandleError DirCallback::reportError(const std::wstring& msg, size_t retryNumber, const Zstring& itemName) //throw ThreadInterruption
+DirCallback::HandleError DirCallback::reportError(const std::wstring& msg, size_t retryNumber, const Zstring& itemName /*optional*/) //throw ThreadInterruption
{
switch (cfg_.acb.reportError(msg, retryNumber)) //throw ThreadInterruption
{
- case FillBufferCallback::ON_ERROR_CONTINUE:
+ case ON_ERROR_CONTINUE:
if (itemName.empty())
cfg_.failedDirReads.emplace(beforeLast(parentRelPathPf_, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE), msg);
else
cfg_.failedItemReads.emplace(parentRelPathPf_ + itemName, msg);
return ON_ERROR_CONTINUE;
- case FillBufferCallback::ON_ERROR_RETRY:
+ case ON_ERROR_RETRY:
return ON_ERROR_RETRY;
}
assert(false);
@@ -524,13 +522,13 @@ DirCallback::HandleError DirCallback::reportError(const std::wstring& msg, size_
}
-void fff::fillBuffer(const std::set<DirectoryKey>& foldersToRead, //in
- std::map<DirectoryKey, DirectoryValue>& buf, //out
- const std::map<AbstractPath, size_t>& deviceParallelOps,
- FillBufferCallback& callback,
- std::chrono::milliseconds cbInterval)
+void fff::parallelDeviceTraversal(const std::set<DirectoryKey>& foldersToRead,
+ std::map<DirectoryKey, DirectoryValue>& output,
+ const std::map<AbstractPath, size_t>& deviceParallelOps,
+ const TravErrorCb& onError, const TravStatusCb& onStatusUpdate,
+ std::chrono::milliseconds cbInterval)
{
- buf.clear();
+ output.clear();
//aggregate folder paths that are on the same root device:
// => one worker thread *per device*: avoid excessive parallelism
@@ -539,13 +537,13 @@ void fff::fillBuffer(const std::set<DirectoryKey>& foldersToRead, //in
std::map<AbstractPath, std::set<DirectoryKey>> perDeviceFolders;
for (const DirectoryKey& key : foldersToRead)
- perDeviceFolders[AFS::getPathComponents(key.folderPath).rootPath].insert(key);
+ perDeviceFolders[AFS::getRootPath(key.folderPath)].insert(key);
//communication channel used by threads
AsyncCallback acb(perDeviceFolders.size() /*threadsToFinish*/, cbInterval); //manage life time: enclose InterruptibleThread's!!!
std::vector<InterruptibleThread> worker;
- ZEN_ON_SCOPE_EXIT( for (InterruptibleThread& wt : worker) wt.join(); );
+ ZEN_ON_SCOPE_EXIT( for (InterruptibleThread& wt : worker) wt.join (); );
ZEN_ON_SCOPE_FAIL( for (InterruptibleThread& wt : worker) wt.interrupt(); ); //interrupt all first, then join
//init worker threads
@@ -553,14 +551,12 @@ void fff::fillBuffer(const std::set<DirectoryKey>& foldersToRead, //in
{
const AbstractPath& rootPath = item.first;
const int threadIdx = static_cast<int>(worker.size());
-
- auto itParOps = deviceParallelOps.find(rootPath);
- const size_t parallelOps = std::max<size_t>(itParOps != deviceParallelOps.end() ? itParOps->second : 1, 1); //sanitize early for correct status display
+ const size_t parallelOps = getDeviceParallelOps(deviceParallelOps, rootPath);
std::map<DirectoryKey, DirectoryValue*> workload;
for (const DirectoryKey& key : item.second)
- workload.emplace(key, &buf[key]); //=> DirectoryValue* unshared for lock-free worker-thread access
+ workload.emplace(key, &output[key]); //=> DirectoryValue* unshared for lock-free worker-thread access
worker.emplace_back([rootPath, workload, threadIdx, &acb, parallelOps]() mutable
{
@@ -569,19 +565,19 @@ void fff::fillBuffer(const std::set<DirectoryKey>& foldersToRead, //in
acb.notifyWorkBegin(threadIdx, parallelOps);
ZEN_ON_SCOPE_EXIT(acb.notifyWorkEnd(threadIdx));
- std::chrono::steady_clock::time_point lastReportTime; //keep at thread-level!
+ std::chrono::steady_clock::time_point lastReportTime; //keep thread-local!
AFS::TraverserWorkload travWorkload;
for (auto& wl : workload)
{
- const AFS::PathComponents pc = AFS::getPathComponents(wl.first.folderPath);
- assert(pc.rootPath == rootPath);
- travWorkload.emplace_back(pc.relPath, std::make_shared<BaseDirCallback>(wl.first, *wl.second, acb, threadIdx, lastReportTime));
+ const std::vector<Zstring> relPath = split(AFS::getRootRelativePath(wl.first.folderPath), FILE_NAME_SEPARATOR, SplitType::SKIP_EMPTY);
+ assert(AFS::getRootPath(wl.first.folderPath) == rootPath);
+ travWorkload.emplace_back(relPath, std::make_shared<BaseDirCallback>(wl.first, *wl.second, acb, threadIdx, lastReportTime));
}
- AFS::traverseFolderParallel(rootPath, travWorkload, parallelOps); //throw ThreadInterruption
+ AFS::traverseFolderRecursive(rootPath, travWorkload, parallelOps); //throw ThreadInterruption
});
}
- acb.waitUntilDone(cbInterval, callback); //throw X
+ acb.waitUntilDone(cbInterval, onError, onStatusUpdate); //throw X
}
diff --git a/FreeFileSync/Source/base/parallel_scan.h b/FreeFileSync/Source/base/parallel_scan.h
index f3f3e597..fd9bc242 100755
--- a/FreeFileSync/Source/base/parallel_scan.h
+++ b/FreeFileSync/Source/base/parallel_scan.h
@@ -43,34 +43,25 @@ struct DirectoryValue
{
FolderContainer folderCont;
- //relative names (or empty string for root) for directories that could not be read (completely), e.g. access denied, or temporal network drop
+ //relative paths (or empty string for root) for directories that could not be read (completely), e.g. access denied, or temporal network drop
std::map<Zstring, std::wstring, LessFilePath> failedFolderReads; //with corresponding error message
- //relative names (never empty) for failure to read single file/dir/symlink with corresponding error message
+ //relative paths (never empty) for failure to read single file/dir/symlink with corresponding error message
std::map<Zstring, std::wstring, LessFilePath> failedItemReads;
};
-struct FillBufferCallback
-{
- virtual ~FillBufferCallback() {}
-
- enum HandleError
- {
- ON_ERROR_RETRY,
- ON_ERROR_CONTINUE
- };
- virtual HandleError reportError (const std::wstring& msg, size_t retryNumber) = 0; //throw X
- virtual void reportStatus(const std::wstring& msg, int itemsTotal ) = 0; //
-};
-
//attention: ensure directory filtering is applied later to exclude filtered folders which have been kept as parent folders
-void fillBuffer(const std::set<DirectoryKey>& foldersToRead, //in
- std::map<DirectoryKey, DirectoryValue>& buf, //out
- const std::map<AbstractPath, size_t>& deviceParallelOps,
- FillBufferCallback& callback,
- std::chrono::milliseconds cbInterval);
+
+using TravErrorCb = std::function<AFS::TraverserCallback::HandleError(const std::wstring& msg, size_t retryNumber)>;
+using TravStatusCb = std::function< void (const std::wstring& statusLine, int itemsTotal)>;
+
+void parallelDeviceTraversal(const std::set<DirectoryKey>& foldersToRead,
+ std::map<DirectoryKey, DirectoryValue>& output,
+ const std::map<AbstractPath, size_t>& deviceParallelOps,
+ const TravErrorCb& onError, const TravStatusCb& onStatusUpdate, //NOT optional
+ std::chrono::milliseconds cbInterval);
}
#endif //PARALLEL_SCAN_H_924588904275284572857
diff --git a/FreeFileSync/Source/base/parse_lng.h b/FreeFileSync/Source/base/parse_lng.h
index b6d486e2..0ddc86c0 100755
--- a/FreeFileSync/Source/base/parse_lng.h
+++ b/FreeFileSync/Source/base/parse_lng.h
@@ -13,7 +13,7 @@
#include <memory>
#include <map>
#include <set>
-#include <sstream>
+//#include <sstream>
#include <stdexcept>
#include <string>
#include <vector>
diff --git a/FreeFileSync/Source/base/process_xml.cpp b/FreeFileSync/Source/base/process_xml.cpp
index 95cac76e..4aa7ebcf 100755
--- a/FreeFileSync/Source/base/process_xml.cpp
+++ b/FreeFileSync/Source/base/process_xml.cpp
@@ -12,7 +12,7 @@
#include <zen/optional.h>
#include <wx/intl.h>
#include "ffs_paths.h"
-#include "../fs/concrete.h"
+//#include "../fs/concrete.h"
using namespace zen;
@@ -23,7 +23,7 @@ namespace
{
//-------------------------------------------------------------------------------------------------------------------------------
const int XML_FORMAT_VER_GLOBAL = 9; //2018-03-14
-const int XML_FORMAT_VER_FFS_CFG = 11; //2018-04-14
+const int XML_FORMAT_VER_FFS_CFG = 12; //2018-06-21
//-------------------------------------------------------------------------------------------------------------------------------
}
@@ -627,8 +627,11 @@ void writeText(const VersioningStyle& value, std::string& output)
case VersioningStyle::REPLACE:
output = "Replace";
break;
- case VersioningStyle::ADD_TIMESTAMP:
- output = "TimeStamp";
+ case VersioningStyle::TIMESTAMP_FOLDER:
+ output = "TimeStamp-Folder";
+ break;
+ case VersioningStyle::TIMESTAMP_FILE:
+ output = "TimeStamp-File";
break;
}
}
@@ -639,8 +642,10 @@ bool readText(const std::string& input, VersioningStyle& value)
const std::string tmp = trimCpy(input);
if (tmp == "Replace")
value = VersioningStyle::REPLACE;
- else if (tmp == "TimeStamp")
- value = VersioningStyle::ADD_TIMESTAMP;
+ else if (tmp == "TimeStamp-Folder")
+ value = VersioningStyle::TIMESTAMP_FOLDER;
+ else if (tmp == "TimeStamp-File")
+ value = VersioningStyle::TIMESTAMP_FILE;
else
return false;
return true;
@@ -914,20 +919,62 @@ void readConfig(const XmlIn& in, DirectionConfig& dirCfg)
inCustDir["Different" ](dirCfg.custom.different);
inCustDir["Conflict" ](dirCfg.custom.conflict);
}
- else
- dirCfg.custom = DirectionSet();
+ //else
+ // dirCfg.custom = DirectionSet();
in["DetectMovedFiles"](dirCfg.detectMovedFiles);
}
-void readConfig(const XmlIn& in, SyncConfig& syncCfg)
+void readConfig(const XmlIn& in, SyncConfig& syncCfg, std::map<AbstractPath, size_t>& deviceParallelOps, int formatVer)
{
readConfig(in, syncCfg.directionCfg);
in["DeletionPolicy" ](syncCfg.handleDeletion);
in["VersioningFolder"](syncCfg.versioningFolderPhrase);
- in["VersioningFolder"].attribute("Style", syncCfg.versioningStyle);
+
+ if (formatVer < 12) //TODO: remove if parameter migration after some time! 2018-06-21
+ {
+ std::string tmp;
+ in["VersioningFolder"].attribute("Style", tmp);
+
+ trim(tmp);
+ if (tmp == "Replace")
+ syncCfg.versioningStyle = VersioningStyle::REPLACE;
+ else if (tmp == "TimeStamp")
+ syncCfg.versioningStyle = VersioningStyle::TIMESTAMP_FILE;
+
+ if (syncCfg.versioningStyle == VersioningStyle::REPLACE)
+ {
+ if (endsWith(syncCfg.versioningFolderPhrase, Zstr("/%timestamp%"), CmpAsciiNoCase()) ||
+ endsWith(syncCfg.versioningFolderPhrase, Zstr("\\%timestamp%"), CmpAsciiNoCase()))
+ {
+ syncCfg.versioningFolderPhrase.resize(syncCfg.versioningFolderPhrase.size() - strLength(Zstr("/%timestamp%")));
+ syncCfg.versioningStyle = VersioningStyle::TIMESTAMP_FOLDER;
+
+ if (syncCfg.versioningFolderPhrase.size() == 2 && isAsciiAlpha(syncCfg.versioningFolderPhrase[0]) && syncCfg.versioningFolderPhrase[1] == Zstr(':'))
+ syncCfg.versioningFolderPhrase += Zstr('\\');
+ }
+ }
+ }
+ else
+ {
+ size_t parallelOps = 1;
+ if (const XmlElement* e = in["VersioningFolder"].get()) e->getAttribute("Threads", parallelOps); //try to get attribute
+
+ const size_t parallelOpsPrev = getDeviceParallelOps(deviceParallelOps, syncCfg.versioningFolderPhrase);
+ /**/ setDeviceParallelOps(deviceParallelOps, syncCfg.versioningFolderPhrase, std::max(parallelOps, parallelOpsPrev));
+
+ in["VersioningFolder"].attribute("Style", syncCfg.versioningStyle);
+
+ if (syncCfg.versioningStyle != VersioningStyle::REPLACE)
+ if (const XmlElement* e = in["VersioningFolder"].get())
+ {
+ e->getAttribute("MaxAge", syncCfg.versionMaxAgeDays); //try to get attributes if available
+ e->getAttribute("CountMin", syncCfg.versionCountMin); // => *no error* if not available
+ e->getAttribute("CountMax", syncCfg.versionCountMax); //
+ }
+ }
}
@@ -962,8 +1009,8 @@ void readConfig(const XmlIn& in, LocalPairConfig& lpc, std::map<AbstractPath, si
in["Left" ](lpc.folderPathPhraseLeft);
in["Right"](lpc.folderPathPhraseRight);
- size_t parallelOpsL = 0;
- size_t parallelOpsR = 0;
+ size_t parallelOpsL = 1;
+ size_t parallelOpsR = 1;
//TODO: remove old parameter after migration! 2018-04-14
if (formatVer < 11)
@@ -978,7 +1025,7 @@ void readConfig(const XmlIn& in, LocalPairConfig& lpc, std::map<AbstractPath, si
parallelOps = stringTo<int>(afterFirst(optPhrase, Zstr("con="), IF_MISSING_RETURN_NONE));
}
};
- getParallelOps(lpc.folderPathPhraseLeft, parallelOpsL);
+ getParallelOps(lpc.folderPathPhraseLeft, parallelOpsL);
getParallelOps(lpc.folderPathPhraseRight, parallelOpsR);
}
else
@@ -991,11 +1038,8 @@ void readConfig(const XmlIn& in, LocalPairConfig& lpc, std::map<AbstractPath, si
auto setParallelOps = [&](const Zstring& folderPathPhrase, size_t parallelOps)
{
- if (parallelOps > 1)
- {
- const AbstractPath& rootPath = AFS::getPathComponents(createAbstractPath(folderPathPhrase)).rootPath;
- deviceParallelOps[rootPath] = std::max(deviceParallelOps[rootPath], parallelOps);
- }
+ const size_t parallelOpsPrev = getDeviceParallelOps(deviceParallelOps, folderPathPhrase);
+ /**/ setDeviceParallelOps(deviceParallelOps, folderPathPhrase, std::max(parallelOps, parallelOpsPrev));
};
setParallelOps(lpc.folderPathPhraseLeft, parallelOpsL);
setParallelOps(lpc.folderPathPhraseRight, parallelOpsR);
@@ -1045,7 +1089,7 @@ void readConfig(const XmlIn& in, LocalPairConfig& lpc, std::map<AbstractPath, si
if (XmlIn inLocalSync = in[formatVer < 10 ? "SyncConfig" : "Synchronize"]) //TODO: remove if parameter migration after some time! 2018-02-25
{
SyncConfig syncCfg;
- readConfig(inLocalSync, syncCfg);
+ readConfig(inLocalSync, syncCfg, deviceParallelOps, formatVer);
lpc.localSyncCfg = syncCfg;
}
@@ -1069,9 +1113,9 @@ void readConfig(const XmlIn& in, MainConfiguration& mainCfg, int formatVer)
//read sync configuration
if (formatVer < 10) //TODO: remove if parameter migration after some time! 2018-02-25
- readConfig(inMain["SyncConfig"], mainCfg.syncCfg);
+ readConfig(inMain["SyncConfig"], mainCfg.syncCfg, mainCfg.deviceParallelOps, formatVer);
else
- readConfig(inMain["Synchronize"], mainCfg.syncCfg);
+ readConfig(inMain["Synchronize"], mainCfg.syncCfg, mainCfg.deviceParallelOps, formatVer);
//###########################################################
@@ -1287,6 +1331,7 @@ void readConfig(const XmlIn& in, XmlGlobalSettings& cfg, int formatVer)
inOpt["ConfirmStartSync" ].attribute("Show", cfg.confirmDlgs.confirmSyncStart);
inOpt["ConfirmSaveConfig" ].attribute("Show", cfg.confirmDlgs.popupOnConfigChange);
inOpt["ConfirmExternalCommandMassInvoke"].attribute("Show", cfg.confirmDlgs.confirmExternalCommandMassInvoke);
+ inOpt["WarnFolderNotExisting" ].attribute("Show", cfg.warnDlgs.warnFolderNotExisting);
inOpt["WarnUnresolvedConflicts" ].attribute("Show", cfg.warnDlgs.warnUnresolvedConflicts);
inOpt["WarnNotEnoughDiskSpace" ].attribute("Show", cfg.warnDlgs.warnNotEnoughDiskSpace);
inOpt["WarnSignificantDifference" ].attribute("Show", cfg.warnDlgs.warnSignificantDifference);
@@ -1682,13 +1727,24 @@ void writeConfig(const DirectionConfig& dirCfg, XmlOut& out)
}
-void writeConfig(const SyncConfig& syncCfg, XmlOut& out)
+void writeConfig(const SyncConfig& syncCfg, const std::map<AbstractPath, size_t>& deviceParallelOps, XmlOut& out)
{
writeConfig(syncCfg.directionCfg, out);
out["DeletionPolicy" ](syncCfg.handleDeletion);
out["VersioningFolder"](syncCfg.versioningFolderPhrase);
+
+ const size_t parallelOps = getDeviceParallelOps(deviceParallelOps, syncCfg.versioningFolderPhrase);
+ if (parallelOps > 1) out["VersioningFolder"].attribute("Threads", parallelOps);
+
out["VersioningFolder"].attribute("Style", syncCfg.versioningStyle);
+
+ if (syncCfg.versioningStyle != VersioningStyle::REPLACE)
+ {
+ if (syncCfg.versionMaxAgeDays > 0) out["VersioningFolder"].attribute("MaxAge", syncCfg.versionMaxAgeDays);
+ if (syncCfg.versionCountMin > 0) out["VersioningFolder"].attribute("CountMin", syncCfg.versionCountMin);
+ if (syncCfg.versionCountMax > 0) out["VersioningFolder"].attribute("CountMax", syncCfg.versionCountMax);
+ }
}
@@ -1716,14 +1772,8 @@ void writeConfig(const LocalPairConfig& lpc, const std::map<AbstractPath, size_t
outPair["Left" ](lpc.folderPathPhraseLeft);
outPair["Right"](lpc.folderPathPhraseRight);
- auto getParallelOps = [&](const Zstring& folderPathPhrase)
- {
- const AbstractPath& rootPath = AFS::getPathComponents(createAbstractPath(folderPathPhrase)).rootPath;
- auto itParOps = deviceParallelOps.find(rootPath);
- return std::max<size_t>(itParOps != deviceParallelOps.end() ? itParOps->second : 1, 1);
- };
- const size_t parallelOpsL = getParallelOps(lpc.folderPathPhraseLeft);
- const size_t parallelOpsR = getParallelOps(lpc.folderPathPhraseRight);
+ const size_t parallelOpsL = getDeviceParallelOps(deviceParallelOps, lpc.folderPathPhraseLeft);
+ const size_t parallelOpsR = getDeviceParallelOps(deviceParallelOps, lpc.folderPathPhraseRight);
if (parallelOpsL > 1) outPair["Left" ].attribute("Threads", parallelOpsL);
if (parallelOpsR > 1) outPair["Right"].attribute("Threads", parallelOpsR);
@@ -1743,7 +1793,7 @@ void writeConfig(const LocalPairConfig& lpc, const std::map<AbstractPath, size_t
if (lpc.localSyncCfg)
{
XmlOut outLocalSync = outPair["Synchronize"];
- writeConfig(*lpc.localSyncCfg, outLocalSync);
+ writeConfig(*lpc.localSyncCfg, deviceParallelOps, outLocalSync);
}
//###########################################################
@@ -1767,7 +1817,7 @@ void writeConfig(const MainConfiguration& mainCfg, XmlOut& out)
XmlOut outSync = outMain["Synchronize"];
- writeConfig(mainCfg.syncCfg, outSync);
+ writeConfig(mainCfg.syncCfg, mainCfg.deviceParallelOps, outSync);
//###########################################################
XmlOut outFilter = outMain["Filter"];
@@ -1845,6 +1895,7 @@ void writeConfig(const XmlGlobalSettings& cfg, XmlOut& out)
outOpt["ConfirmStartSync" ].attribute("Show", cfg.confirmDlgs.confirmSyncStart);
outOpt["ConfirmSaveConfig" ].attribute("Show", cfg.confirmDlgs.popupOnConfigChange);
outOpt["ConfirmExternalCommandMassInvoke"].attribute("Show", cfg.confirmDlgs.confirmExternalCommandMassInvoke);
+ outOpt["WarnFolderNotExisting" ].attribute("Show", cfg.warnDlgs.warnFolderNotExisting);
outOpt["WarnUnresolvedConflicts" ].attribute("Show", cfg.warnDlgs.warnUnresolvedConflicts);
outOpt["WarnNotEnoughDiskSpace" ].attribute("Show", cfg.warnDlgs.warnNotEnoughDiskSpace);
outOpt["WarnSignificantDifference" ].attribute("Show", cfg.warnDlgs.warnSignificantDifference);
diff --git a/FreeFileSync/Source/base/process_xml.h b/FreeFileSync/Source/base/process_xml.h
index 1c9a3d72..c9f42e08 100755
--- a/FreeFileSync/Source/base/process_xml.h
+++ b/FreeFileSync/Source/base/process_xml.h
@@ -101,6 +101,7 @@ inline bool operator!=(const ConfirmationDialogs& lhs, const ConfirmationDialogs
struct WarningDialogs
{
+ bool warnFolderNotExisting = true;
bool warnDependentFolderPair = true;
bool warnDependentBaseFolders = true;
bool warnSignificantDifference = true;
@@ -114,7 +115,8 @@ struct WarningDialogs
};
inline bool operator==(const WarningDialogs& lhs, const WarningDialogs& rhs)
{
- return lhs.warnDependentFolderPair == rhs.warnDependentFolderPair &&
+ return lhs.warnFolderNotExisting == rhs.warnFolderNotExisting &&
+ lhs.warnDependentFolderPair == rhs.warnDependentFolderPair &&
lhs.warnDependentBaseFolders == rhs.warnDependentBaseFolders &&
lhs.warnSignificantDifference == rhs.warnSignificantDifference &&
lhs.warnNotEnoughDiskSpace == rhs.warnNotEnoughDiskSpace &&
diff --git a/FreeFileSync/Source/base/status_handler_impl.h b/FreeFileSync/Source/base/status_handler_impl.h
index 02b190c8..d152149f 100755
--- a/FreeFileSync/Source/base/status_handler_impl.h
+++ b/FreeFileSync/Source/base/status_handler_impl.h
@@ -196,7 +196,7 @@ private:
const uint64_t threadId = zen::getThreadId();
for (auto& sbp : statusByPriority_)
- for (ThreadStatus& ts : sbp)
+ for (ThreadStatus& ts : sbp) //thread cound is (hopefully) small enough so that linear search won't hurt perf
if (ts.threadId == threadId)
return &ts;
assert(false);
@@ -372,6 +372,126 @@ std::wstring tryReportingError(Function cmd /*throw FileError*/, Callback& cb /*
}
//=====================================================================================================================
+struct ParallelContext;
+using ParallelWorkItem = std::function<void(ParallelContext& ctx)> /*throw ThreadInterruption*/;
+
+struct ParallelContext
+{
+ const AbstractPath& itemPath;
+ AsyncCallback& acb;
+
+ using AddTaskCallback = std::function<void(const AfsPath& afsPath, const ParallelWorkItem& task)>;
+ //disallow extra tasks regarding a different device until *needed* => avoids complex logic:
+ //- create extra thread groups for new devices in callback - handle tasks for thread groups that already signalled completion
+ const AddTaskCallback& scheduleExtraTask; //throw ThreadInterruption
+};
+
+#ifdef __GNUC__ //ugly, but we won't put the function into a cpp nor make it inline
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wunused-function"
+#endif
+namespace
+{
+void massParallelExecute(const std::vector<std::pair<AbstractPath, ParallelWorkItem>>& workload,
+ const std::map<AbstractPath, size_t>& deviceParallelOps,
+ const std::string& threadGroupName,
+ ProcessCallback& callback /*throw X*/)
+{
+ using namespace zen;
+
+ std::map<AbstractPath, std::vector<const std::pair<AbstractPath, ParallelWorkItem>*>> perDeviceWorkload;
+ for (const auto& item : workload)
+ perDeviceWorkload[AFS::getRootPath(item.first)].push_back(&item);
+
+ struct ThreadGroupContext
+ {
+ ThreadGroupContext(size_t parallelOps, const std::string& groupName, size_t prio, const ParallelContext::AddTaskCallback& scheduleTask) :
+ threadGroup(parallelOps, groupName), statusPrio(prio), scheduleExtraTask(scheduleTask) {}
+
+ ThreadGroup<std::function<void()>> threadGroup;
+ const size_t statusPrio = 0;
+ ParallelContext::AddTaskCallback scheduleExtraTask;
+ };
+
+ AsyncCallback acb; //manage life time: enclose ThreadGroup's!!!
+ std::atomic<int> activeDeviceCount(perDeviceWorkload.size()); //
+ Protected<std::map<AbstractPath, ThreadGroupContext>*> deviceThreadGroupsShared; //
+
+ //---------------------------------------------------------------------------------------------------------
+
+ std::map<AbstractPath, ThreadGroupContext> deviceThreadGroups; //worker threads live here...
+
+ //---------------------------------------------------------------------------------------------------------
+ //Attention: carefully orchestrate access to deviceThreadGroups and its contained worker threads! e.g. synchronize potential access during ~DeviceThreadGroup!
+ for (const auto& devItems : perDeviceWorkload)
+ {
+ const AbstractPath& rootPath = devItems.first;
+ const size_t parallelOps = getDeviceParallelOps(deviceParallelOps, rootPath);
+ const size_t statusPrio = deviceThreadGroups.size();
+
+ auto scheduleExtraTask = [&acb, &deviceThreadGroupsShared, rootPath](const AfsPath& afsPath, const ParallelWorkItem& task)
+ {
+ const AbstractPath& itemPath = AFS::appendRelPath(rootPath, afsPath.value);
+
+ deviceThreadGroupsShared.access([&](auto* deviceThreadGroupsPtr)
+ {
+ if (!deviceThreadGroupsPtr)
+ throw ThreadInterruption();
+
+ ThreadGroupContext& ctx = deviceThreadGroupsPtr->find(rootPath)->second; //exists after construction above!
+
+ ctx.threadGroup.run([&acb, statusPrio = ctx.statusPrio, itemPath, task, &scheduleExtraTask = ctx.scheduleExtraTask]
+ {
+ acb.notifyTaskBegin(statusPrio);
+ ZEN_ON_SCOPE_EXIT(acb.notifyTaskEnd());
+
+ ParallelContext pctx{ itemPath, acb, scheduleExtraTask };
+ task(pctx); //throw ThreadInterruption
+ });
+ });
+ };
+ deviceThreadGroups.emplace(rootPath, ThreadGroupContext(parallelOps,
+ threadGroupName + " " + utfTo<std::string>(AFS::getDisplayPath(rootPath)),
+ statusPrio,
+ scheduleExtraTask));
+ }
+ deviceThreadGroupsShared.access([&](auto*& deviceThreadGroupsPtr) { deviceThreadGroupsPtr = &deviceThreadGroups; });
+ //[!] deviceThreadGroups is shared with worker threads from here on!
+ ZEN_ON_SCOPE_EXIT(deviceThreadGroupsShared.access([&](auto*& deviceThreadGroupsPtr) { deviceThreadGroupsPtr = nullptr; }));
+
+ for (const auto& devItems : perDeviceWorkload)
+ {
+ const AbstractPath& rootPath = devItems.first;
+ ThreadGroupContext& ctx = deviceThreadGroups.find(rootPath)->second; //exists after construction above!
+
+ for (const std::pair<AbstractPath, ParallelWorkItem>* item : devItems.second)
+ ctx.threadGroup.run([&acb, statusPrio = ctx.statusPrio, &itemPath = item->first, &task = item->second, &scheduleExtraTask = ctx.scheduleExtraTask]
+ {
+ acb.notifyTaskBegin(statusPrio);
+ ZEN_ON_SCOPE_EXIT(acb.notifyTaskEnd());
+
+ ParallelContext pctx{ itemPath, acb, scheduleExtraTask };
+ task(pctx); //throw ThreadInterruption
+ });
+
+ ctx.threadGroup.notifyWhenDone([&acb, &activeDeviceCount] /*noexcept! runs on worker thread!*/
+ {
+ if (--activeDeviceCount == 0)
+ acb.notifyAllDone(); //noexcept
+ });
+ }
+
+ if (activeDeviceCount == 0) //if perDeviceWorkload.empty()!
+ acb.notifyAllDone(); //noexcept
+
+ acb.waitUntilDone(UI_UPDATE_INTERVAL / 2 /*every ~50 ms*/, callback); //throw X
+}
+}
+#ifdef __GNUC__
+ #pragma GCC diagnostic pop
+#endif
+
+//=====================================================================================================================
template <class Function> inline
auto parallelScope(Function&& fun, std::mutex& singleThread) //throw X
diff --git a/FreeFileSync/Source/base/structures.cpp b/FreeFileSync/Source/base/structures.cpp
index eff069ce..bc9699f9 100755
--- a/FreeFileSync/Source/base/structures.cpp
+++ b/FreeFileSync/Source/base/structures.cpp
@@ -11,6 +11,7 @@
#include <zen/i18n.h>
#include <zen/time.h>
#include "hard_filter.h"
+#include "../fs/concrete.h"
using namespace zen;
using namespace fff;
@@ -225,6 +226,40 @@ std::wstring fff::getSyncVariantName(const MainConfiguration& mainCfg)
}
+size_t fff::getDeviceParallelOps(const std::map<AbstractPath, size_t>& deviceParallelOps, const AbstractPath& ap)
+{
+ const AbstractPath& rootPath = AFS::getRootPath(ap);
+ auto it = deviceParallelOps.find(rootPath);
+ return std::max<size_t>(it != deviceParallelOps.end() ? it->second : 1, 1);
+}
+
+
+void fff::setDeviceParallelOps(std::map<AbstractPath, size_t>& deviceParallelOps, const AbstractPath& ap, size_t parallelOps)
+{
+ assert(parallelOps > 0);
+ const AbstractPath rootPath = AFS::getRootPath(ap);
+ if (!AFS::isNullPath(rootPath))
+ {
+ if (parallelOps > 1)
+ deviceParallelOps[rootPath] = parallelOps;
+ else
+ deviceParallelOps.erase(rootPath);
+ }
+}
+
+
+size_t fff::getDeviceParallelOps(const std::map<AbstractPath, size_t>& deviceParallelOps, const Zstring& folderPathPhrase)
+{
+ return getDeviceParallelOps(deviceParallelOps, createAbstractPath(folderPathPhrase));
+}
+
+
+void fff::setDeviceParallelOps(std::map<AbstractPath, size_t>& deviceParallelOps, const Zstring& folderPathPhrase, size_t parallelOps)
+{
+ setDeviceParallelOps(deviceParallelOps, createAbstractPath(folderPathPhrase), parallelOps);
+}
+
+
std::wstring fff::getSymbol(CompareFilesResult cmpRes)
{
switch (cmpRes)
diff --git a/FreeFileSync/Source/base/structures.h b/FreeFileSync/Source/base/structures.h
index 90e565b6..7f0ad9e1 100755
--- a/FreeFileSync/Source/base/structures.h
+++ b/FreeFileSync/Source/base/structures.h
@@ -205,7 +205,8 @@ enum class DeletionPolicy
enum class VersioningStyle
{
REPLACE,
- ADD_TIMESTAMP,
+ TIMESTAMP_FOLDER,
+ TIMESTAMP_FILE,
};
struct SyncConfig
@@ -214,20 +215,32 @@ struct SyncConfig
DirectionConfig directionCfg;
DeletionPolicy handleDeletion = DeletionPolicy::RECYCLER; //use Recycle, delete permanently or move to user-defined location
+
//versioning options
- VersioningStyle versioningStyle = VersioningStyle::REPLACE;
Zstring versioningFolderPhrase;
- //int versionCountLimit; //max versions per file (DeletionPolicy::VERSIONING); < 0 := no limit
+ VersioningStyle versioningStyle = VersioningStyle::REPLACE;
+
+ //limit number of versions per file: (if versioningStyle != REPLACE)
+ int versionMaxAgeDays = 0; //<= 0 := no limit
+ int versionCountMin = 0; //only used if versionMaxAgeDays > 0 => < versionCountMax (if versionCountMax > 0)
+ int versionCountMax = 0; //<= 0 := no limit
};
inline
bool operator==(const SyncConfig& lhs, const SyncConfig& rhs)
{
- return lhs.directionCfg == rhs.directionCfg &&
- lhs.handleDeletion == rhs.handleDeletion &&
- lhs.versioningStyle == rhs.versioningStyle &&
- lhs.versioningFolderPhrase == rhs.versioningFolderPhrase;
+ return lhs.directionCfg == rhs.directionCfg &&
+ lhs.handleDeletion == rhs.handleDeletion && //!= DeletionPolicy::VERSIONING => still consider versioningFolderPhrase: e.g. user temporarily
+ lhs.versioningFolderPhrase == rhs.versioningFolderPhrase && //switched to "permanent" deletion and accidentally saved cfg => versioning folder is easily restored
+ lhs.versioningStyle == rhs.versioningStyle &&
+ (lhs.versioningStyle == VersioningStyle::REPLACE ||
+ (
+ lhs.versionMaxAgeDays == rhs.versionMaxAgeDays &&
+ (lhs.versionMaxAgeDays <= 0 ||
+ lhs.versionCountMin == rhs.versionCountMin) &&
+ lhs.versionCountMax == rhs.versionCountMax
+ ));
//adapt effectivelyEqual() on changes, too!
}
inline bool operator!=(const SyncConfig& lhs, const SyncConfig& rhs) { return !(lhs == rhs); }
@@ -238,9 +251,18 @@ bool effectivelyEqual(const SyncConfig& lhs, const SyncConfig& rhs)
{
return effectivelyEqual(lhs.directionCfg, rhs.directionCfg) &&
lhs.handleDeletion == rhs.handleDeletion &&
- (lhs.handleDeletion != DeletionPolicy::VERSIONING || //only compare deletion directory if required!
- (lhs.versioningStyle == rhs.versioningStyle &&
- lhs.versioningFolderPhrase == rhs.versioningFolderPhrase));
+ (lhs.handleDeletion != DeletionPolicy::VERSIONING || //only evaluate versioning folder if required!
+ (
+ lhs.versioningFolderPhrase == rhs.versioningFolderPhrase &&
+ lhs.versioningStyle == rhs.versioningStyle &&
+ (lhs.versioningStyle == VersioningStyle::REPLACE ||
+ (
+ lhs.versionMaxAgeDays == rhs.versionMaxAgeDays &&
+ (lhs.versionMaxAgeDays <= 0 ||
+ lhs.versionCountMin == rhs.versionCountMin) &&
+ lhs.versionCountMax == rhs.versionCountMax
+ ))
+ ));
}
@@ -394,6 +416,11 @@ struct MainConfiguration
std::wstring getCompVariantName(const MainConfiguration& mainCfg);
std::wstring getSyncVariantName(const MainConfiguration& mainCfg);
+size_t getDeviceParallelOps(const std::map<AbstractPath, size_t>& deviceParallelOps, const AbstractPath& ap);
+void setDeviceParallelOps( std::map<AbstractPath, size_t>& deviceParallelOps, const AbstractPath& ap, size_t parallelOps);
+size_t getDeviceParallelOps(const std::map<AbstractPath, size_t>& deviceParallelOps, const Zstring& folderPathPhrase);
+void setDeviceParallelOps( std::map<AbstractPath, size_t>& deviceParallelOps, const Zstring& folderPathPhrase, size_t parallelOps);
+
inline
bool operator==(const MainConfiguration& lhs, const MainConfiguration& rhs)
diff --git a/FreeFileSync/Source/base/synchronization.cpp b/FreeFileSync/Source/base/synchronization.cpp
index 273ffb9b..1e46b4fd 100755
--- a/FreeFileSync/Source/base/synchronization.cpp
+++ b/FreeFileSync/Source/base/synchronization.cpp
@@ -243,6 +243,114 @@ void SyncStatistics::processFolder(const FolderPair& folder)
recurse(folder); //since we model logical stats, we recurse, even if deletion variant is "recycler" or "versioning + same volume", which is a single physical operation!
}
+
+/*
+ DeletionPolicy::PERMANENT: deletion frees space
+ DeletionPolicy::RECYCLER: won't free space until recycler is full, but then frees space
+ DeletionPolicy::VERSIONING: depends on whether versioning folder is on a different volume
+-> if deleted item is a followed symlink, no space is freed
+-> created/updated/deleted item may be on a different volume than base directory: consider symlinks, junctions!
+
+=> generally assume deletion frees space; may avoid false-positive disk space warnings for recycler and versioning
+*/
+class MinimumDiskSpaceNeeded
+{
+public:
+ static std::pair<int64_t, int64_t> calculate(const BaseFolderPair& baseFolder)
+ {
+ MinimumDiskSpaceNeeded inst;
+ inst.recurse(baseFolder);
+ return { inst.spaceNeededLeft_, inst.spaceNeededRight_ };
+ }
+
+private:
+ void recurse(const ContainerObject& hierObj)
+ {
+ //process files
+ for (const FilePair& file : hierObj.refSubFiles())
+ switch (file.getSyncOperation()) //evaluate comparison result and sync direction
+ {
+ case SO_CREATE_NEW_LEFT:
+ spaceNeededLeft_ += static_cast<int64_t>(file.getFileSize<RIGHT_SIDE>());
+ break;
+
+ case SO_CREATE_NEW_RIGHT:
+ spaceNeededRight_ += static_cast<int64_t>(file.getFileSize<LEFT_SIDE>());
+ break;
+
+ case SO_DELETE_LEFT:
+ if (!file.isFollowedSymlink<LEFT_SIDE>())
+ spaceNeededLeft_ -= static_cast<int64_t>(file.getFileSize<LEFT_SIDE>());
+ break;
+
+ case SO_DELETE_RIGHT:
+ if (!file.isFollowedSymlink<RIGHT_SIDE>())
+ spaceNeededRight_ -= static_cast<int64_t>(file.getFileSize<RIGHT_SIDE>());
+ break;
+
+ case SO_OVERWRITE_LEFT:
+ if (!file.isFollowedSymlink<LEFT_SIDE>())
+ spaceNeededLeft_ -= static_cast<int64_t>(file.getFileSize<LEFT_SIDE>());
+ spaceNeededLeft_ += static_cast<int64_t>(file.getFileSize<RIGHT_SIDE>());
+ break;
+
+ case SO_OVERWRITE_RIGHT:
+ if (!file.isFollowedSymlink<RIGHT_SIDE>())
+ spaceNeededRight_ -= static_cast<int64_t>(file.getFileSize<RIGHT_SIDE>());
+ spaceNeededRight_ += static_cast<int64_t>(file.getFileSize<LEFT_SIDE>());
+ break;
+
+ case SO_DO_NOTHING:
+ case SO_EQUAL:
+ case SO_UNRESOLVED_CONFLICT:
+ case SO_COPY_METADATA_TO_LEFT:
+ case SO_COPY_METADATA_TO_RIGHT:
+ case SO_MOVE_LEFT_FROM:
+ case SO_MOVE_RIGHT_FROM:
+ case SO_MOVE_LEFT_TO:
+ case SO_MOVE_RIGHT_TO:
+ break;
+ }
+
+ //symbolic links
+ //[...]
+
+ //recurse into sub-dirs
+ for (const FolderPair& folder : hierObj.refSubFolders())
+ switch (folder.getSyncOperation())
+ {
+ case SO_DELETE_LEFT:
+ if (!folder.isFollowedSymlink<LEFT_SIDE>())
+ recurse(folder); //not 100% correct: in fact more that what our model contains may be deleted (consider file filter!)
+ break;
+ case SO_DELETE_RIGHT:
+ if (!folder.isFollowedSymlink<RIGHT_SIDE>())
+ recurse(folder);
+ break;
+
+ case SO_MOVE_LEFT_FROM:
+ case SO_MOVE_RIGHT_FROM:
+ case SO_MOVE_LEFT_TO:
+ case SO_MOVE_RIGHT_TO:
+ assert(false);
+ case SO_CREATE_NEW_LEFT:
+ case SO_CREATE_NEW_RIGHT:
+ case SO_OVERWRITE_LEFT:
+ case SO_OVERWRITE_RIGHT:
+ case SO_COPY_METADATA_TO_LEFT:
+ case SO_COPY_METADATA_TO_RIGHT:
+ case SO_DO_NOTHING:
+ case SO_EQUAL:
+ case SO_UNRESOLVED_CONFLICT:
+ recurse(folder); //not 100% correct: what if left or right folder is symlink!? => file operations may happen on different volume!
+ break;
+ }
+ }
+
+ int64_t spaceNeededLeft_ = 0;
+ int64_t spaceNeededRight_ = 0;
+};
+
//-----------------------------------------------------------------------------------------------------------
std::vector<FolderPairSyncCfg> fff::extractSyncCfg(const MainConfiguration& mainCfg)
@@ -260,11 +368,15 @@ std::vector<FolderPairSyncCfg> fff::extractSyncCfg(const MainConfiguration& main
output.push_back(
{
+ syncCfg.directionCfg.var,
syncCfg.directionCfg.var == DirectionConfig::TWO_WAY || detectMovedFilesEnabled(syncCfg.directionCfg),
+
syncCfg.handleDeletion,
- syncCfg.versioningStyle,
syncCfg.versioningFolderPhrase,
- syncCfg.directionCfg.var
+ syncCfg.versioningStyle,
+ syncCfg.versionMaxAgeDays,
+ syncCfg.versionCountMin,
+ syncCfg.versionCountMax
});
}
return output;
@@ -328,7 +440,7 @@ bool significantDifferenceDetected(const SyncStatistics& folderPairStat)
//--------------------- data verification -------------------------
void flushFileBuffers(const Zstring& nativeFilePath) //throw FileError
{
- const int fileHandle = ::open(nativeFilePath.c_str(), O_WRONLY | O_APPEND);
+ const int fileHandle = ::open(nativeFilePath.c_str(), O_WRONLY | O_APPEND | O_CLOEXEC);
if (fileHandle == -1)
THROW_LAST_FILE_ERROR(replaceCpy(_("Cannot open file %x."), L"%x", fmtPath(nativeFilePath)), L"open");
ZEN_ON_SCOPE_EXIT(::close(fileHandle));
@@ -435,12 +547,12 @@ bool recycleItem(AFS::RecycleSession& recyclerSession, const AbstractPath& ap, c
{ return parallelScope([=, &recyclerSession] { return recyclerSession.recycleItem(ap, logicalRelPath); /*throw FileError*/ }, singleThread); }
inline //FileVersioner::revisionFile() is internally synchronized!
-bool revisionFile(FileVersioner& versioner, const FileDescriptor& fileDescr, const Zstring& relativePath, const IOCallback& notifyUnbufferedIO, std::mutex& singleThread) //throw FileError
-{ return parallelScope([=, &versioner] { return versioner.revisionFile(fileDescr, relativePath, notifyUnbufferedIO); /*throw FileError*/ }, singleThread); }
+void revisionFile(FileVersioner& versioner, const FileDescriptor& fileDescr, const Zstring& relativePath, const IOCallback& notifyUnbufferedIO, std::mutex& singleThread) //throw FileError
+{ parallelScope([=, &versioner] { return versioner.revisionFile(fileDescr, relativePath, notifyUnbufferedIO); /*throw FileError*/ }, singleThread); }
inline //FileVersioner::revisionSymlink() is internally synchronized!
-bool revisionSymlink(FileVersioner& versioner, const AbstractPath& linkPath, const Zstring& relativePath, std::mutex& singleThread) //throw FileError
-{ return parallelScope([=, &versioner] { return versioner.revisionSymlink(linkPath, relativePath); /*throw FileError*/ }, singleThread); }
+void revisionSymlink(FileVersioner& versioner, const AbstractPath& linkPath, const Zstring& relativePath, std::mutex& singleThread) //throw FileError
+{ parallelScope([=, &versioner] { return versioner.revisionSymlink(linkPath, relativePath); /*throw FileError*/ }, singleThread); }
inline //FileVersioner::revisionFolder() is internally synchronized!
void revisionFolder(FileVersioner& versioner,
@@ -465,9 +577,9 @@ class DeletionHandling //abstract deletion variants: permanently, recycle bin, u
public:
DeletionHandling(const AbstractPath& baseFolderPath,
DeletionPolicy handleDel, //nothrow!
- const Zstring& versioningFolderPhrase,
+ const AbstractPath& versioningFolderPath,
VersioningStyle versioningStyle,
- const TimeComp& timeStamp);
+ time_t syncStartTime);
//clean-up temporary directory (recycle bin optimization)
void tryCleanup(ProcessCallback& cb /*throw X*/, bool allowCallbackException); //throw FileError -> call this in non-exceptional code path, i.e. somewhere after sync!
@@ -496,7 +608,7 @@ private:
{
assert(deletionPolicy_ == DeletionPolicy::VERSIONING);
if (!versioner_)
- versioner_ = std::make_unique<FileVersioner>(versioningFolderPath_, versioningStyle_, timeStamp_); //throw FileError
+ versioner_ = std::make_unique<FileVersioner>(versioningFolderPath_, versioningStyle_, syncStartTime_); //throw FileError
return *versioner_;
}
@@ -508,7 +620,7 @@ private:
//used only for DeletionPolicy::VERSIONING:
const AbstractPath versioningFolderPath_;
const VersioningStyle versioningStyle_;
- const TimeComp timeStamp_;
+ const time_t syncStartTime_;
std::unique_ptr<FileVersioner> versioner_; //throw FileError in constructor => create on demand!
//buffer status texts:
@@ -522,14 +634,14 @@ private:
DeletionHandling::DeletionHandling(const AbstractPath& baseFolderPath, //nothrow!
DeletionPolicy handleDel,
- const Zstring& versioningFolderPhrase,
+ const AbstractPath& versioningFolderPath,
VersioningStyle versioningStyle,
- const TimeComp& timeStamp) :
+ time_t syncStartTime) :
deletionPolicy_(handleDel),
baseFolderPath_(baseFolderPath),
- versioningFolderPath_(createAbstractPath(versioningFolderPhrase)),
+ versioningFolderPath_(versioningFolderPath),
versioningStyle_(versioningStyle),
- timeStamp_(timeStamp),
+ syncStartTime_(syncStartTime),
txtRemovingFile_([&]
{
switch (handleDel)
@@ -606,13 +718,8 @@ void DeletionHandling::tryCleanup(ProcessCallback& cb /*throw X*/, bool allowCal
case DeletionPolicy::VERSIONING:
//if (versioner_)
//{
- // if (allowUserCallback)
- // {
- // cb_.reportStatus(_("Removing old versions...")); //throw X
- // versioner->limitVersions([&] { cb_.requestUiRefresh(); /*throw X */ }); //throw FileError
- // }
- // else
- // versioner->limitVersions([] {}); //throw FileError
+ // cb_.reportStatus(Removing old versions...")); //throw X
+ // versioner->limitVersions([&] { cb_.requestUiRefresh(); /*throw X */ }); //throw FileError
//}
break;
}
@@ -721,94 +828,97 @@ void DeletionHandling::removeLinkWithCallback(const AbstractPath& linkPath, //th
statReporter.reportDelta(1, 0);
}
-//------------------------------------------------------------------------------------------------------------
-
-/*
- DeletionPolicy::PERMANENT: deletion frees space
- DeletionPolicy::RECYCLER: won't free space until recycler is full, but then frees space
- DeletionPolicy::VERSIONING: depends on whether versioning folder is on a different volume
--> if deleted item is a followed symlink, no space is freed
--> created/updated/deleted item may be on a different volume than base directory: consider symlinks, junctions!
+//===================================================================================================
+//===================================================================================================
-=> generally assume deletion frees space; may avoid false positive disk space warnings for recycler and versioning
-*/
-class MinimumDiskSpaceNeeded
+class Workload
{
public:
- static std::pair<int64_t, int64_t> calculate(const BaseFolderPair& baseFolder)
- {
- MinimumDiskSpaceNeeded inst;
- inst.recurse(baseFolder);
- return { inst.spaceNeededLeft_, inst.spaceNeededRight_ };
- }
+ Workload(size_t threadCount, AsyncCallback& acb) : acb_(acb), workload_(threadCount) { assert(threadCount > 0); }
-private:
- void recurse(const ContainerObject& hierObj)
+ using WorkItem = std::function<void() /*throw ThreadInterruption*/>;
+ using WorkItems = RingBuffer<WorkItem>; //FIFO!
+
+ //blocking call: context of worker thread
+ WorkItem getNext(size_t threadIdx) //throw ThreadInterruption
{
- //don't process directories
+ interruptionPoint(); //throw ThreadInterruption
- //process files
- for (const FilePair& file : hierObj.refSubFiles())
- switch (file.getSyncOperation()) //evaluate comparison result and sync direction
+ std::unique_lock<std::mutex> dummy(lockWork_);
+ for (;;)
+ {
+ if (!workload_[threadIdx].empty())
{
- case SO_CREATE_NEW_LEFT:
- spaceNeededLeft_ += static_cast<int64_t>(file.getFileSize<RIGHT_SIDE>());
- break;
-
- case SO_CREATE_NEW_RIGHT:
- spaceNeededRight_ += static_cast<int64_t>(file.getFileSize<LEFT_SIDE>());
- break;
+ auto wi = std::move(workload_[threadIdx]. front());
+ /**/ workload_[threadIdx].pop_front();
+ return wi;
+ }
+ if (!pendingWorkload_.empty())
+ {
+ workload_[threadIdx] = std::move(pendingWorkload_. front());
+ /**/ pendingWorkload_.pop_front();
+ assert(!workload_[threadIdx].empty());
+ }
+ else
+ {
+ WorkItems& items = *std::max_element(workload_.begin(), workload_.end(), [](const WorkItems& lhs, const WorkItems& rhs) { return lhs.size() < rhs.size(); });
+ if (!items.empty()) //=> != workload_[threadIdx]
+ {
+ //steal half of largest workload from other thread
+ const size_t sz = items.size(); //[!] variable during loop!
+ for (size_t i = 0; i < sz; ++i)
+ {
+ auto wi = std::move(items. front());
+ /**/ items.pop_front();
+ if (i % 2 == 0)
+ workload_[threadIdx].push_back(std::move(wi));
+ else
+ items.push_back(std::move(wi));
+ }
+ }
+ else //wait...
+ {
+ if (++idleThreads_ == workload_.size())
+ acb_.notifyAllDone(); //noexcept
+ ZEN_ON_SCOPE_EXIT(--idleThreads_);
- case SO_DELETE_LEFT:
- //if (freeSpaceDelLeft_)
- spaceNeededLeft_ -= static_cast<int64_t>(file.getFileSize<LEFT_SIDE>());
- break;
+ auto haveNewWork = [&] { return !pendingWorkload_.empty() || std::any_of(workload_.begin(), workload_.end(), [](const WorkItems& wi) { return !wi.empty(); }); };
- case SO_DELETE_RIGHT:
- //if (freeSpaceDelRight_)
- spaceNeededRight_ -= static_cast<int64_t>(file.getFileSize<RIGHT_SIDE>());
- break;
+ interruptibleWait(conditionNewWork_, dummy, [&] { return haveNewWork(); }); //throw ThreadInterruption
+ //it's sufficient to notify condition in addWorkItems() only (as long as we use std::condition_variable::notify_all())
+ }
+ }
+ }
+ }
- case SO_OVERWRITE_LEFT:
- //if (freeSpaceDelLeft_)
- spaceNeededLeft_ -= static_cast<int64_t>(file.getFileSize<LEFT_SIDE>());
- spaceNeededLeft_ += static_cast<int64_t>(file.getFileSize<RIGHT_SIDE>());
- break;
+ void addWorkItems(RingBuffer<WorkItems>&& buckets)
+ {
+ {
+ std::lock_guard<std::mutex> dummy(lockWork_);
+ while (!buckets.empty())
+ {
+ pendingWorkload_.push_back(std::move(buckets. front()));
+ /**/ buckets.pop_front();
+ }
+ }
+ conditionNewWork_.notify_all();
+ }
- case SO_OVERWRITE_RIGHT:
- //if (freeSpaceDelRight_)
- spaceNeededRight_ -= static_cast<int64_t>(file.getFileSize<RIGHT_SIDE>());
- spaceNeededRight_ += static_cast<int64_t>(file.getFileSize<LEFT_SIDE>());
- break;
+private:
+ Workload (const Workload&) = delete;
+ Workload& operator=(const Workload&) = delete;
- case SO_DO_NOTHING:
- case SO_EQUAL:
- case SO_UNRESOLVED_CONFLICT:
- case SO_COPY_METADATA_TO_LEFT:
- case SO_COPY_METADATA_TO_RIGHT:
- case SO_MOVE_LEFT_FROM:
- case SO_MOVE_RIGHT_FROM:
- case SO_MOVE_LEFT_TO:
- case SO_MOVE_RIGHT_TO:
- break;
- }
+ AsyncCallback& acb_;
- //symbolic links
- //[...]
+ std::mutex lockWork_;
+ std::condition_variable conditionNewWork_;
- //recurse into sub-dirs
- for (const FolderPair& folder : hierObj.refSubFolders())
- recurse(folder);
- }
+ size_t idleThreads_ = 0;
- int64_t spaceNeededLeft_ = 0;
- int64_t spaceNeededRight_ = 0;
+ std::vector<WorkItems> workload_; //thread-specific buckets
+ RingBuffer<WorkItems> pendingWorkload_; //FIFO: buckets of work items for use by any thread
};
-//===================================================================================================
-//===================================================================================================
-
-class Workload;
class FolderPairSyncer
{
@@ -854,13 +964,11 @@ private:
static PassNo getPass(const FilePair& file);
static PassNo getPass(const SymlinkPair& link);
static PassNo getPass(const FolderPair& folder);
+ static bool needZeroPass(const FilePair& file);
static void runPass(PassNo pass, SyncCtx& syncCtx, BaseFolderPair& baseFolder, ProcessCallback& cb); //throw X
- void appendFolderLevelWorkItems(PassNo pass, ContainerObject& hierObj, //in
- Workload& workload,
- RingBuffer<std::function<void()>>& workItems, //out
- RingBuffer<ContainerObject*>& foldersToProcess); //
+ RingBuffer<Workload::WorkItems> getFolderLevelWorkItems(PassNo pass, ContainerObject& parentFolder, Workload& workload);
template <SelectedSide side>
void setup2StepMove(FilePair& sourceObj, FilePair& targetObj); //throw FileError, ThreadInterruption
@@ -885,7 +993,7 @@ private:
}
//target existing after onDeleteTargetFile(): undefined behavior! (fail/overwrite/auto-rename)
- AFS::FileCopyResult copyFileWithCallback(const FileDescriptor& sourceDescr, //throw FileError
+ AFS::FileCopyResult copyFileWithCallback(const FileDescriptor& sourceDescr, //throw FileError, ThreadInterruption
const AbstractPath& targetPath,
const std::function<void()>& onDeleteTargetFile, //optional!
AsyncItemStatReporter& statReporter);
@@ -927,114 +1035,16 @@ private:
| =================
============= | ... |
GUI <-- |Main Thread| \|/ \|/
-Callback ============= -------------------------------
- |Workload | folders to process|
- -------------------------------
+Callback ============= -------------------
+ | Workload |
+ -------------------
Notes: - All threads share a single mutex, unlocked only during file I/O => do NOT require file_hierarchy.cpp classes to be thread-safe (i.e. internally synchronized)!
- Workload holds (folder-level-) items in buckets associated with each worker thread (FTP scenario: avoid CWDs)
- - If a worker is idle, its Workload bucket is empty and no more folders to anaylze: steal from other buckets (=> take half of largest bucket)
+ - If a worker is idle, its Workload bucket is empty and no more pending buckets available: steal from other threads (=> take half of largest bucket)
- Maximize opportunity for parallelization ASAP: Workload buckets serve folder-items *before* files/symlinks => reduce risk of work-stealing
- - Memory consumption: "Folders to process" may grow indefinitely; however: test case "C:\", 100.000 folders => worst case only ~ 800kB on x64
+ - Memory consumption: work items may grow indefinitely; however: test case "C:\" ~80MB per 1 million work items
*/
-class Workload
-{
-public:
- Workload(FolderPairSyncer& fps, FolderPairSyncer::PassNo pass, BaseFolderPair& baseFolder, size_t threadCount, AsyncCallback& acb) :
- fps_(fps), pass_(pass), acb_(acb), workload_(threadCount)
- {
- foldersToProcess_.push_back(&baseFolder);
- assert(threadCount > 0);
- }
-
- //blocking call: context of worker thread
- std::function<void()> getNext(size_t threadIdx) //throw ThreadInterruption
- {
- std::unique_lock<std::mutex> dummy(lockWork_);
- for (;;)
- {
- for (;;)
- {
- if (!workload_[threadIdx].empty())
- {
- auto workItem = workload_[threadIdx]. front(); //yes, no strong exception guarantee (std::bad_alloc)
- /**/ workload_[threadIdx].pop_front(); //
- return workItem;
- }
- if (!foldersToProcess_.empty())
- {
- ContainerObject& hierObj = *foldersToProcess_. front();
- /**/ foldersToProcess_.pop_front();
-
- //thread-safe thanks to std::mutex singleThread:
- fps_.appendFolderLevelWorkItems(pass_, hierObj, *this, //in
- workload_[threadIdx], //out, appending
- foldersToProcess_); //
- }
- else
- break;
- }
-
- //steal half of largest workload from other thread
- WorkItems& items = *std::max_element(workload_.begin(), workload_.end(), [](const WorkItems& lhs, const WorkItems& rhs) { return lhs.size() < rhs.size(); });
- if (!items.empty()) //=> != workload_[threadIdx]
- {
- const size_t sz = items.size(); //[!] variable during loop!
- for (size_t i = 0; i < sz; ++i)
- {
- auto wi = std::move(items. front());
- /**/ items.pop_front();
- if (i % 2 == 0)
- workload_[threadIdx].push_back(std::move(wi));
- else
- items.push_back(std::move(wi));
- }
-
- auto workItem = workload_[threadIdx]. front(); //yes, no strong exception guarantee (std::bad_alloc)
- /**/ workload_[threadIdx].pop_front(); //
- return workItem;
- }
-
- if (++idleThreads_ == workload_.size())
- acb_.notifyAllDone(); //noexcept
- ZEN_ON_SCOPE_EXIT(--idleThreads_);
-
- auto haveNewWork = [&] { return !foldersToProcess_.empty() || std::any_of(workload_.begin(), workload_.end(), [](const WorkItems& wi) { return !wi.empty(); }); };
-
- interruptibleWait(conditionNewWork_, dummy, [&] { return haveNewWork(); }); //throw ThreadInterruption
- //it's sufficient to notify condition in addFolderToProcess() only (as long as we use std::condition_variable::notify_all())
- }
- }
-
- void addFolderToProcess(ContainerObject& folder)
- {
- {
- std::lock_guard<std::mutex> dummy(lockWork_);
- foldersToProcess_.push_back(&folder);
- }
- conditionNewWork_.notify_all();
- }
-
-private:
- Workload (const Workload&) = delete;
- Workload& operator=(const Workload&) = delete;
-
- using WorkItem = std::function<void() /*throw ThreadInterruption*/>;
- using WorkItems = RingBuffer<WorkItem>; //FIFO!
-
- FolderPairSyncer& fps_;
- const FolderPairSyncer::PassNo pass_;
- AsyncCallback& acb_;
-
- std::mutex lockWork_;
- std::condition_variable conditionNewWork_;
-
- size_t idleThreads_ = 0;
-
- std::vector<WorkItems> workload_; //thread-specific buckets
- RingBuffer<ContainerObject*> foldersToProcess_; //FIFO!
-};
-
void FolderPairSyncer::runPass(PassNo pass, SyncCtx& syncCtx, BaseFolderPair& baseFolder, ProcessCallback& cb) //throw X
{
@@ -1042,12 +1052,13 @@ void FolderPairSyncer::runPass(PassNo pass, SyncCtx& syncCtx, BaseFolderPair& ba
std::mutex singleThread; //only a single worker thread may run at a time, except for parallel file I/O
- AsyncCallback acb; //
- FolderPairSyncer fps(syncCtx, singleThread, acb); //manage life time: enclose InterruptibleThread's!!!
- Workload workload(fps, pass, baseFolder, threadCount, acb); //
+ AsyncCallback acb; //
+ FolderPairSyncer fps(syncCtx, singleThread, acb); //manage life time: enclose InterruptibleThread's!!!
+ Workload workload(threadCount, acb); //
+ workload.addWorkItems(fps.getFolderLevelWorkItems(pass, baseFolder, workload)); //initial workload: set *before* threads get access!
std::vector<InterruptibleThread> worker;
- ZEN_ON_SCOPE_EXIT( for (InterruptibleThread& wt : worker) wt.join(); );
+ ZEN_ON_SCOPE_EXIT( for (InterruptibleThread& wt : worker) wt.join (); );
ZEN_ON_SCOPE_EXIT( for (InterruptibleThread& wt : worker) wt.interrupt(); ); //interrupt all first, then join
for (size_t threadIdx = 0; threadIdx < threadCount; ++threadIdx)
@@ -1069,39 +1080,59 @@ void FolderPairSyncer::runPass(PassNo pass, SyncCtx& syncCtx, BaseFolderPair& ba
}
-void FolderPairSyncer::appendFolderLevelWorkItems(PassNo pass, ContainerObject& hierObj, Workload& workload, //in
- RingBuffer<std::function<void()>>& workItems, //out
- RingBuffer<ContainerObject* >& foldersToProcess) //
+//thread-safe thanks to std::mutex singleThread
+RingBuffer<Workload::WorkItems> FolderPairSyncer::getFolderLevelWorkItems(PassNo pass, ContainerObject& parentFolder, Workload& workload)
{
- //synchronize folders:
- for (FolderPair& folder : hierObj.refSubFolders())
- if (pass == getPass(folder))
- workItems.push_back([this, &folder, &workload]
- {
- tryReportingError([&] { synchronizeFolder(folder); }, acb_); //throw ThreadInterruption
+ RingBuffer<Workload::WorkItems> buckets;
- workload.addFolderToProcess(folder);
- });
- else
- foldersToProcess.push_back(&folder);
-
- //synchronize files:
- for (FilePair& file : hierObj.refSubFiles())
- if (pass == PASS_ZERO)
- workItems.push_back([this, &file] { prepareFileMove(file); /*throw ThreadInterruption*/ });
- else if (pass == getPass(file))
- workItems.push_back([this, &file]
- {
- tryReportingError([&] { synchronizeFile(file); }, acb_); //throw ThreadInterruption
- });
+ RingBuffer<ContainerObject*> foldersToInspect;
+ foldersToInspect.push_back(&parentFolder);
- //synchronize symbolic links:
- for (SymlinkPair& symlink : hierObj.refSubLinks())
- if (pass == getPass(symlink))
- workItems.push_back([this, &symlink]
- {
- tryReportingError([&] { synchronizeLink(symlink); }, acb_); //throw ThreadInterruption
- });
+ while (!foldersToInspect.empty())
+ {
+ ContainerObject& hierObj = *foldersToInspect. front();
+ /**/ foldersToInspect.pop_front();
+
+ RingBuffer<std::function<void()>> workItems;
+
+ //synchronize folders:
+ for (FolderPair& folder : hierObj.refSubFolders())
+ if (pass == getPass(folder))
+ workItems.push_back([this, &folder, &workload, pass]
+ {
+ tryReportingError([&] { synchronizeFolder(folder); }, acb_); //throw ThreadInterruption
+
+ workload.addWorkItems(getFolderLevelWorkItems(pass, folder, workload));
+ });
+ else
+ foldersToInspect.push_back(&folder);
+
+ //synchronize files:
+ for (FilePair& file : hierObj.refSubFiles())
+ if (pass == PASS_ZERO)
+ {
+ if (needZeroPass(file))
+ workItems.push_back([this, &file] { prepareFileMove(file); /*throw ThreadInterruption*/ });
+ }
+ else if (pass == getPass(file))
+ workItems.push_back([this, &file]
+ {
+ tryReportingError([&] { synchronizeFile(file); }, acb_); //throw ThreadInterruption
+ });
+
+ //synchronize symbolic links:
+ for (SymlinkPair& symlink : hierObj.refSubLinks())
+ if (pass == getPass(symlink))
+ workItems.push_back([this, &symlink]
+ {
+ tryReportingError([&] { synchronizeLink(symlink); }, acb_); //throw ThreadInterruption
+ });
+
+ if (!workItems.empty())
+ buckets.push_back(std::move(workItems));
+ }
+
+ return buckets;
}
@@ -1149,9 +1180,9 @@ void FolderPairSyncer::setup2StepMove(FilePair& sourceObj, //throw FileError, Th
//generate (hopefully) unique file name to avoid clashing with some remnant ffs_tmp file
const Zstring shortGuid = printNumber<Zstring>(Zstr("%04x"), static_cast<unsigned int>(getCrc16(generateGUID())));
const Zstring fileName = sourceObj.getItemName<side>();
- auto it = find_last(fileName.begin(), fileName.end(), Zchar('.')); //gracefully handle case of missing "."
+ auto it = find_last(fileName.begin(), fileName.end(), Zstr('.')); //gracefully handle case of missing "."
- const Zstring sourceRelPathTmp = Zstring(fileName.begin(), it) + Zchar('.') + shortGuid + AFS::TEMP_FILE_ENDING;
+ const Zstring sourceRelPathTmp = Zstring(fileName.begin(), it) + Zstr('.') + shortGuid + AFS::TEMP_FILE_ENDING;
//-------------------------------------------------------------------------------------------
//this could still lead to a name-clash in obscure cases, if some file exists on the other side with
//the very same (.ffs_tmp) name and is copied before the second step of the move is executed
@@ -1181,7 +1212,6 @@ void FolderPairSyncer::setup2StepMove(FilePair& sourceObj, //throw FileError, Th
tempFile .setMoveRef(targetObj.getId());
//NO statistics update!
- interruptionPoint(); //throw ThreadInterruption
}
@@ -1329,6 +1359,33 @@ void FolderPairSyncer::prepareFileMove(FilePair& file) //throw ThreadInterruptio
//---------------------------------------------------------------------------------------------------------------
+inline
+bool FolderPairSyncer::needZeroPass(const FilePair& file)
+{
+ switch (file.getSyncOperation())
+ {
+ case SO_MOVE_LEFT_FROM:
+ case SO_MOVE_RIGHT_FROM:
+ return true;
+
+ case SO_MOVE_LEFT_TO: //it's enough to try each move-pair *once*
+ case SO_MOVE_RIGHT_TO: //
+ case SO_DELETE_LEFT:
+ case SO_DELETE_RIGHT:
+ case SO_OVERWRITE_LEFT:
+ case SO_OVERWRITE_RIGHT:
+ case SO_CREATE_NEW_LEFT:
+ case SO_CREATE_NEW_RIGHT:
+ case SO_DO_NOTHING:
+ case SO_EQUAL:
+ case SO_UNRESOLVED_CONFLICT:
+ case SO_COPY_METADATA_TO_LEFT:
+ case SO_COPY_METADATA_TO_RIGHT:
+ break;
+ }
+ return false;
+}
+
//1st, 2nd pass requirements:
// - avoid disk space shortage: 1. delete files, 2. overwrite big with small files first
// - support change in type: overwrite file by directory, symlink by file, ect.
@@ -1476,7 +1533,7 @@ void FolderPairSyncer::synchronizeFileInt(FilePair& file, SyncOperation syncOp)
const AFS::FileCopyResult result = copyFileWithCallback({ file.getAbstractPath<sideSrc>(), file.getAttributes<sideSrc>() },
targetPath,
nullptr, //onDeleteTargetFile: nothing to delete; if existing: undefined behavior! (fail/overwrite/auto-rename)
- statReporter); //throw FileError
+ statReporter); //throw FileError, ThreadInterruption
if (result.errorModTime)
errorsModTime_.push_back(*result.errorModTime); //show all warnings later as a single message
@@ -1490,11 +1547,11 @@ void FolderPairSyncer::synchronizeFileInt(FilePair& file, SyncOperation syncOp)
result.sourceFileId,
false, file.isFollowedSymlink<sideSrc>());
}
- catch (FileError&)
+ catch (const FileError& e)
{
bool sourceWasDeleted = false;
try { sourceWasDeleted = !parallel::getItemTypeIfExists(file.getAbstractPath<sideSrc>(), singleThread_); /*throw FileError*/ }
- catch (FileError&) {} //previous exception is more relevant
+ catch (const FileError& e2) { throw FileError(e.toString(), e2.toString()); } //unclear which exception is more relevant
//do not check on type (symlink, file, folder) -> if there is a type change, FFS should not be quiet about it!
if (sourceWasDeleted)
@@ -1599,7 +1656,7 @@ void FolderPairSyncer::synchronizeFileInt(FilePair& file, SyncOperation syncOp)
const AFS::FileCopyResult result = copyFileWithCallback({ file.getAbstractPath<sideSrc>(), file.getAttributes<sideSrc>() },
targetPathResolvedNew,
onDeleteTargetFile,
- statReporter); //throw FileError
+ statReporter); //throw FileError, ThreadInterruption
if (result.errorModTime)
errorsModTime_.push_back(*result.errorModTime); //show all warnings later as a single message
@@ -1657,8 +1714,6 @@ void FolderPairSyncer::synchronizeFileInt(FilePair& file, SyncOperation syncOp)
assert(false); //should have been filtered out by FolderPairSyncer::getPass()
return; //no update on processed data!
}
-
- interruptionPoint(); //throw ThreadInterruption
}
@@ -1708,11 +1763,11 @@ void FolderPairSyncer::synchronizeLinkInt(SymlinkPair& symlink, SyncOperation sy
symlink.getLastWriteTime<sideSrc>());
}
- catch (FileError&)
+ catch (const FileError& e)
{
bool sourceWasDeleted = false;
try { sourceWasDeleted = !parallel::getItemTypeIfExists(symlink.getAbstractPath<sideSrc>(), singleThread_); /*throw FileError*/ }
- catch (FileError&) {} //previous exception is more relevant
+ catch (const FileError& e2) { throw FileError(e.toString(), e2.toString()); } //unclear which exception is more relevant
//do not check on type (symlink, file, folder) -> if there is a type change, FFS should not be quiet about it!
if (sourceWasDeleted)
@@ -1803,8 +1858,6 @@ void FolderPairSyncer::synchronizeLinkInt(SymlinkPair& symlink, SyncOperation sy
assert(false); //should have been filtered out by FolderPairSyncer::getPass()
return; //no update on processed data!
}
-
- interruptionPoint(); //throw ThreadInterruption
}
@@ -1854,7 +1907,7 @@ void FolderPairSyncer::synchronizeFolderInt(FolderPair& folder, SyncOperation sy
{
bool folderAlreadyExists = false;
try { folderAlreadyExists = parallel::getItemType(targetPath, singleThread_) == AFS::ItemType::FOLDER; } /*throw FileError*/ catch (FileError&) {}
- //previous exception is more relevant
+ //previous exception is more relevant; good enough? https://freefilesync.org/forum/viewtopic.php?t=5266
if (!folderAlreadyExists)
throw;
@@ -1895,7 +1948,7 @@ void FolderPairSyncer::synchronizeFolderInt(FolderPair& folder, SyncOperation sy
delHandlingTrg.removeDirWithCallback(folder.getAbstractPath<sideTrg>(), folder.getPairRelativePath(), statReporter, singleThread_); //throw FileError, X
- warn_static("perf => not parallel!")
+ //TODO: implement parallel folder deletion
folder.refSubFiles ().clear(); //
folder.refSubLinks ().clear(); //update FolderPair
@@ -1937,14 +1990,12 @@ void FolderPairSyncer::synchronizeFolderInt(FolderPair& folder, SyncOperation sy
assert(false); //should have been filtered out by FolderPairSyncer::getPass()
return; //no update on processed data!
}
-
- interruptionPoint(); //throw ThreadInterruption
}
//###########################################################################################
//returns current attributes of source file
-AFS::FileCopyResult FolderPairSyncer::copyFileWithCallback(const FileDescriptor& sourceDescr, //throw FileError
+AFS::FileCopyResult FolderPairSyncer::copyFileWithCallback(const FileDescriptor& sourceDescr, //throw FileError, ThreadInterruption
const AbstractPath& targetPath,
const std::function<void()>& onDeleteTargetFile, //optional!
AsyncItemStatReporter& statReporter)
@@ -1983,7 +2034,7 @@ AFS::FileCopyResult FolderPairSyncer::copyFileWithCallback(const FileDescriptor&
reportInfo(txtVerifyingFile_, AFS::getDisplayPath(targetPath)); //throw ThreadInterruption
//callback runs *outside* singleThread_ lock! => fine
- auto verifyCallback = [&](int64_t bytesDelta) { interruptionPoint(); /*throw ThreadInterruption*/ };
+ auto verifyCallback = [&](int64_t bytesDelta) { interruptionPoint(); }; //throw ThreadInterruption
parallel::verifyFiles(sourcePathTmp, targetPath, verifyCallback, singleThread_); //throw FileError
}
@@ -1992,7 +2043,7 @@ AFS::FileCopyResult FolderPairSyncer::copyFileWithCallback(const FileDescriptor&
return result;
};
- return copyOperation(sourcePath);
+ return copyOperation(sourcePath); //throw FileError, (ErrorFileLocked), ThreadInterruption
}
//###########################################################################################
@@ -2264,7 +2315,7 @@ void fff::synchronize(const std::chrono::system_clock::time_point& syncStartTime
//===============================================================================================
//prepare: check if versioning path itself will be synchronized (and was not excluded via filter)
- verCheckVersioningPaths.insert(versioningFolderPath);;
+ verCheckVersioningPaths.insert(versioningFolderPath);
verCheckBaseFolderPaths.emplace_back(baseFolder.getAbstractPath<LEFT_SIDE >(), &baseFolder.getFilter());
verCheckBaseFolderPaths.emplace_back(baseFolder.getAbstractPath<RIGHT_SIDE>(), &baseFolder.getFilter());
}
@@ -2292,7 +2343,10 @@ void fff::synchronize(const std::chrono::system_clock::time_point& syncStartTime
freeSpace < minSpaceNeeded)
diskSpaceMissing.push_back({ baseFolderPath, { minSpaceNeeded, freeSpace } });
}
- catch (FileError&) {} //for warning only => no need for tryReportingError()
+ catch (const FileError& e) //for warning only => no need for tryReportingError(), but at least log it!
+ {
+ callback.reportInfo(e.toString()); //throw X
+ }
};
const std::pair<int64_t, int64_t> spaceNeeded = MinimumDiskSpaceNeeded::calculate(baseFolder);
checkSpace(baseFolder.getAbstractPath< LEFT_SIDE>(), spaceNeeded.first);
@@ -2432,12 +2486,10 @@ void fff::synchronize(const std::chrono::system_clock::time_point& syncStartTime
std::vector<FileError> errorsModTime; //show all warnings as a single message
+ std::set<VersioningLimitFolder> versionLimitFolders;
+
try
{
- const TimeComp timeStamp = getLocalTime(std::chrono::system_clock::to_time_t(syncStartTime));
- if (timeStamp == TimeComp())
- throw std::runtime_error("Failed to determine current time: " + numberTo<std::string>(syncStartTime.time_since_epoch().count()));
-
//loop through all directory pairs
for (auto itBase = begin(folderCmp); itBase != end(folderCmp); ++itBase)
{
@@ -2508,18 +2560,19 @@ void fff::synchronize(const std::chrono::system_clock::time_point& syncStartTime
}
return folderPairCfg.handleDeletion;
};
+ const AbstractPath versioningFolderPath = createAbstractPath(folderPairCfg.versioningFolderPhrase);
DeletionHandling delHandlerL(baseFolder.getAbstractPath<LEFT_SIDE>(),
getEffectiveDeletionPolicy(baseFolder.getAbstractPath<LEFT_SIDE>()),
- folderPairCfg.versioningFolderPhrase,
+ versioningFolderPath,
folderPairCfg.versioningStyle,
- timeStamp);
+ std::chrono::system_clock::to_time_t(syncStartTime));
DeletionHandling delHandlerR(baseFolder.getAbstractPath<RIGHT_SIDE>(),
getEffectiveDeletionPolicy(baseFolder.getAbstractPath<RIGHT_SIDE>()),
- folderPairCfg.versioningFolderPhrase,
+ versioningFolderPath,
folderPairCfg.versioningStyle,
- timeStamp);
+ std::chrono::system_clock::to_time_t(syncStartTime));
//always (try to) clean up, even if synchronization is aborted!
ZEN_ON_SCOPE_EXIT(
@@ -2539,18 +2592,10 @@ void fff::synchronize(const std::chrono::system_clock::time_point& syncStartTime
catch (...) { assert(false); } //what is this?
);
- auto getParallelOps = [&](const AbstractPath& ap)
- {
- auto itParOps = deviceParallelOps.find(AFS::getPathComponents(ap).rootPath);
- return std::max<size_t>(itParOps != deviceParallelOps.end() ? itParOps->second : 1, 1); //sanitize early for correct status display
- };
- const size_t parallelOps = std::max(getParallelOps(baseFolder.getAbstractPath<LEFT_SIDE >()),
- getParallelOps(baseFolder.getAbstractPath<RIGHT_SIDE>()));
- //harmonize with sync_cfg.cpp: parallelOps used for versioning shown == number used for folder pair!
-
- warn_static("TODO: warn if parallelOps is > than what versioningFolderPhrase can handle (S)FTP!")
- //const AbstractPath versioningFolderPath = createAbstractPath(folderPairCfg.versioningFolderPhrase)
- //getParallelOps(versioningFolderPath)
+ size_t parallelOps = std::max(getDeviceParallelOps(deviceParallelOps, baseFolder.getAbstractPath<LEFT_SIDE >()),
+ getDeviceParallelOps(deviceParallelOps, baseFolder.getAbstractPath<RIGHT_SIDE>()));
+ if (folderPairCfg.handleDeletion == DeletionPolicy::VERSIONING)
+ parallelOps = std::max(parallelOps, getDeviceParallelOps(deviceParallelOps, versioningFolderPath));
FolderPairSyncer::SyncCtx syncCtx =
{
@@ -2564,6 +2609,17 @@ void fff::synchronize(const std::chrono::system_clock::time_point& syncStartTime
//(try to gracefully) cleanup temporary Recycle bin folders and versioning -> will be done in ~DeletionHandling anyway...
tryReportingError([&] { delHandlerL.tryCleanup(callback, true /*allowCallbackException*/); /*throw FileError*/}, callback); //throw X
tryReportingError([&] { delHandlerR.tryCleanup(callback, true ); /*throw FileError*/}, callback); //throw X
+
+
+ if (folderPairCfg.handleDeletion == DeletionPolicy::VERSIONING &&
+ folderPairCfg.versioningStyle != VersioningStyle::REPLACE)
+ versionLimitFolders.insert(
+ {
+ versioningFolderPath,
+ folderPairCfg.versionMaxAgeDays,
+ folderPairCfg.versionCountMin,
+ folderPairCfg.versionCountMax
+ });
}
//(try to gracefully) write database file
@@ -2582,6 +2638,10 @@ void fff::synchronize(const std::chrono::system_clock::time_point& syncStartTime
}
}
+ //-----------------------------------------------------------------------------------------------------
+
+ applyVersioningLimit(versionLimitFolders, deviceParallelOps, callback);
+
//------------------- show warnings after end of synchronization --------------------------------------
//TODO: mod time warnings are not shown if user cancelled sync before batch-reporting the warnings: problem?
diff --git a/FreeFileSync/Source/base/synchronization.h b/FreeFileSync/Source/base/synchronization.h
index 4e5173c5..dcfc0114 100755
--- a/FreeFileSync/Source/base/synchronization.h
+++ b/FreeFileSync/Source/base/synchronization.h
@@ -73,11 +73,14 @@ private:
struct FolderPairSyncCfg
{
+ DirectionConfig::Variant syncVariant;
bool saveSyncDB; //save database if in automatic mode or dection of moved files is active
DeletionPolicy handleDeletion;
- VersioningStyle versioningStyle;
Zstring versioningFolderPhrase; //unresolved directory names as entered by user!
- DirectionConfig::Variant syncVariant;
+ VersioningStyle versioningStyle;
+ int versionMaxAgeDays;
+ int versionCountMin;
+ int versionCountMax;
};
std::vector<FolderPairSyncCfg> extractSyncCfg(const MainConfiguration& mainCfg);
diff --git a/FreeFileSync/Source/base/versioning.cpp b/FreeFileSync/Source/base/versioning.cpp
index e3972d9f..cdb203f4 100755
--- a/FreeFileSync/Source/base/versioning.cpp
+++ b/FreeFileSync/Source/base/versioning.cpp
@@ -1,5 +1,6 @@
#include "versioning.h"
-//#include <cstddef> //required by GCC 4.8.1 to find ptrdiff_t
+#include "parallel_scan.h"
+#include "status_handler_impl.h"
using namespace zen;
using namespace fff;
@@ -8,66 +9,64 @@ using namespace fff;
namespace
{
inline
-Zstring getDotExtension(const Zstring& relativePath) //including "." if extension is existing, returns empty string otherwise
+Zstring getDotExtension(const Zstring& filePath) //including "." if extension is existing, returns empty string otherwise
{
- const Zstring& extension = getFileExtension(relativePath);
- return extension.empty() ? extension : Zstr('.') + extension;
+ //const Zstring& extension = getFileExtension(filePath);
+ //return extension.empty() ? extension : Zstr('.') + extension;
+
+ auto it = find_last(filePath.begin(), filePath.end(), FILE_NAME_SEPARATOR);
+ if (it == filePath.end())
+ it = filePath.begin();
+ else
+ ++it;
+
+ return Zstring(find_last(it, filePath.end(), Zstr('.')), filePath.end());
};
}
-bool fff::impl::isMatchingVersion(const Zstring& shortname, const Zstring& shortnameVersioned) //e.g. ("Sample.txt", "Sample.txt 2012-05-15 131513.txt")
+//e.g. "Sample.txt 2012-05-15 131513.txt"
+//or "Sample 2012-05-15 131513"
+std::pair<time_t, Zstring> fff::impl::parseVersionedFileName(const Zstring& fileName)
{
- auto it = shortnameVersioned.begin();
- auto itLast = shortnameVersioned.end();
+ const StringRef<const Zchar> ext(find_last(fileName.begin(), fileName.end(), Zstr('.')), fileName.end());
+
+ if (fileName.size() < 2 * ext.length() + 18)
+ return {};
+
+ const auto itExt1 = fileName.end() - (2 * ext.length() + 18);
+ const auto itTs = itExt1 + ext.length();
+ if (!strEqual(ext, StringRef<const Zchar>(itExt1, itTs), CmpFilePath()))
+ return {};
+
+ const TimeComp tc = parseTime(Zstr(" %Y-%m-%d %H%M%S"), StringRef<const Zchar>(itTs, itTs + 18)); //returns TimeComp() on error
+ const time_t t = localToTimeT(tc); //returns -1 on error
+ if (t == -1)
+ return {};
+
+ Zstring fileNameOrig(fileName.begin(), itTs);
+ if (fileNameOrig.empty())
+ return {};
+
+ return { t, std::move(fileNameOrig) };
+}
- auto nextDigit = [&]()
- {
- if (it == itLast || !isDigit(*it))
- return false;
- ++it;
- return true;
- };
- auto nextDigits = [&](size_t count)
- {
- while (count-- > 0)
- if (!nextDigit())
- return false;
- return true;
- };
- auto nextChar = [&](Zchar c)
- {
- if (it == itLast || *it != c)
- return false;
- ++it;
- return true;
- };
- auto nextStringI = [&](const Zstring& str) //windows: ignore case!
- {
- if (itLast - it < static_cast<ptrdiff_t>(str.size()) || !equalFilePath(str, Zstring(&*it, str.size())))
- return false;
- it += str.size();
- return true;
- };
- return nextStringI(shortname) && //versioned file starts with original name
- nextChar(Zstr(' ')) && //validate timestamp: e.g. "2012-05-15 131513"; Regex: \d{4}-\d{2}-\d{2} \d{6}
- nextDigits(4) && //YYYY
- nextChar(Zstr('-')) && //
- nextDigits(2) && //MM
- nextChar(Zstr('-')) && //
- nextDigits(2) && //DD
- nextChar(Zstr(' ')) && //
- nextDigits(6) && //HHMMSS
- nextStringI(getDotExtension(shortname)) &&
- it == itLast;
+//e.g. "2012-05-15 131513"
+time_t fff::impl::parseVersionedFolderName(const Zstring& fileName)
+{
+ const TimeComp tc = parseTime(Zstr("%Y-%m-%d %H%M%S"), fileName); //returns TimeComp() on error
+ const time_t t = localToTimeT(tc); //returns -1 on error
+ if (t == -1)
+ return 0;
+
+ return t;
}
AbstractPath FileVersioner::generateVersionedPath(const Zstring& relativePath) const
{
- assert(!startsWith(relativePath, FILE_NAME_SEPARATOR));
- assert(!endsWith (relativePath, FILE_NAME_SEPARATOR));
+ assert(isValidRelPath(relativePath));
assert(!relativePath.empty());
Zstring versionedRelPath;
@@ -76,13 +75,14 @@ AbstractPath FileVersioner::generateVersionedPath(const Zstring& relativePath) c
case VersioningStyle::REPLACE:
versionedRelPath = relativePath;
break;
- case VersioningStyle::ADD_TIMESTAMP: //assemble time-stamped version name
+ case VersioningStyle::TIMESTAMP_FOLDER:
+ versionedRelPath = timeStamp_ + FILE_NAME_SEPARATOR + relativePath;
+ break;
+ case VersioningStyle::TIMESTAMP_FILE: //assemble time-stamped version name
versionedRelPath = relativePath + Zstr(' ') + timeStamp_ + getDotExtension(relativePath);
- assert(impl::isMatchingVersion(afterLast(relativePath, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_ALL),
- afterLast(versionedRelPath, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_ALL))); //paranoid? no!
+ assert(impl::parseVersionedFileName(versionedRelPath) == std::pair(syncStartTime_, relativePath));
break;
}
-
return AFS::appendRelPath(versioningFolderPath_, versionedRelPath);
}
@@ -180,70 +180,64 @@ void moveExistingItemToVersioning(const AbstractPath& sourcePath, const Abstract
}
}
}
+}
-struct FlatTraverserCallback: public AFS::TraverserCallback
+void FileVersioner::revisionFile(const FileDescriptor& fileDescr, const Zstring& relativePath, const IOCallback& notifyUnbufferedIO) const //throw FileError
{
- FlatTraverserCallback(const AbstractPath& folderPath) : folderPath_(folderPath) {}
-
- const std::vector<FileInfo>& refFiles () const { return files_; }
- const std::vector<FolderInfo>& refFolders () const { return folders_; }
- const std::vector<SymlinkInfo>& refSymlinks() const { return symlinks_; }
-
-private:
- void onFile (const FileInfo& fi) override { files_ .push_back(fi); }
- std::shared_ptr<TraverserCallback> onFolder (const FolderInfo& fi) override { folders_ .push_back(fi); return nullptr; }
- HandleLink onSymlink(const SymlinkInfo& si) override { symlinks_.push_back(si); return TraverserCallback::LINK_SKIP; }
-
- HandleError reportDirError (const std::wstring& msg, size_t retryNumber) override { throw FileError(msg); }
- HandleError reportItemError(const std::wstring& msg, size_t retryNumber, const Zstring& itemName) override { throw FileError(msg); }
-
- const AbstractPath folderPath_;
- std::vector<FileInfo> files_;
- std::vector<FolderInfo> folders_;
- std::vector<SymlinkInfo> symlinks_;
-};
+ if (Opt<AFS::ItemType> type = AFS::getItemTypeIfExists(fileDescr.path)) //throw FileError
+ {
+ if (*type == AFS::ItemType::SYMLINK)
+ revisionSymlinkImpl(fileDescr.path, relativePath, nullptr /*onBeforeMove*/); //throw FileError
+ else
+ revisionFileImpl(fileDescr, relativePath, nullptr /*onBeforeMove*/, notifyUnbufferedIO); //throw FileError
+ }
+ //else -> missing source item is not an error => check BEFORE deleting target
}
-bool FileVersioner::revisionFile(const FileDescriptor& fileDescr, const Zstring& relativePath, const IOCallback& notifyUnbufferedIO) const //throw FileError
+void FileVersioner::revisionFileImpl(const FileDescriptor& fileDescr, const Zstring& relativePath, //throw FileError
+ const std::function<void(const std::wstring& displayPathFrom, const std::wstring& displayPathTo)>& onBeforeMove,
+ const IOCallback& notifyUnbufferedIO) const
{
const AbstractPath& filePath = fileDescr.path;
+
+ const AbstractPath targetPath = generateVersionedPath(relativePath);
const AFS::StreamAttributes fileAttr{ fileDescr.attr.modTime, fileDescr.attr.fileSize, fileDescr.attr.fileId };
- if (Opt<AFS::ItemType> type = AFS::getItemTypeIfExists(filePath)) //throw FileError
- {
- const AbstractPath targetPath = generateVersionedPath(relativePath);
+ if (onBeforeMove)
+ onBeforeMove(AFS::getDisplayPath(filePath), AFS::getDisplayPath(targetPath));
- if (*type == AFS::ItemType::SYMLINK)
- moveExistingItemToVersioning(filePath, targetPath, [&] { AFS::copySymlink(filePath, targetPath, false /*copy filesystem permissions*/); }); //throw FileError
- else
- moveExistingItemToVersioning(filePath, targetPath, [&] //throw FileError
- {
- //target existing: copyFileTransactional() undefined behavior! (fail/overwrite/auto-rename) => not expected, but possible if target deletion failed
- /*const AFS::FileCopyResult result =*/ AFS::copyFileTransactional(filePath, fileAttr, targetPath, //throw FileError, ErrorFileLocked
- false, //copyFilePermissions
- false, //transactionalCopy: not needed for versioning! partial copy will be overwritten next time
- nullptr /*onDeleteTargetFile*/, notifyUnbufferedIO);
- //result.errorModTime? => irrelevant for versioning!
- });
- return true;
- }
- else
- return false; //missing source item is not an error => check BEFORE overwriting target
+ moveExistingItemToVersioning(filePath, targetPath, [&] //throw FileError
+ {
+ //target existing: copyFileTransactional() undefined behavior! (fail/overwrite/auto-rename) => not expected, but possible if target deletion failed
+ /*const AFS::FileCopyResult result =*/ AFS::copyFileTransactional(filePath, fileAttr, targetPath, //throw FileError, ErrorFileLocked
+ false, //copyFilePermissions
+ false, //transactionalCopy: not needed for versioning! partial copy will be overwritten next time
+ nullptr /*onDeleteTargetFile*/, notifyUnbufferedIO);
+ //result.errorModTime? => irrelevant for versioning!
+ });
}
-bool FileVersioner::revisionSymlink(const AbstractPath& linkPath, const Zstring& relativePath) const //throw FileError
+void FileVersioner::revisionSymlink(const AbstractPath& linkPath, const Zstring& relativePath) const //throw FileError
{
if (AFS::getItemTypeIfExists(linkPath)) //throw FileError
- {
- const AbstractPath targetPath = generateVersionedPath(relativePath);
- moveExistingItemToVersioning(linkPath, targetPath, [&] { AFS::copySymlink(linkPath, targetPath, false /*copy filesystem permissions*/); }); //throw FileError
- return true;
- }
- else
- return false;
+ revisionSymlinkImpl(linkPath, relativePath, nullptr /*onBeforeMove*/); //throw FileError
+ //else -> missing source item is not an error => check BEFORE deleting target
+}
+
+
+void FileVersioner::revisionSymlinkImpl(const AbstractPath& linkPath, const Zstring& relativePath, //throw FileError
+ const std::function<void(const std::wstring& displayPathFrom, const std::wstring& displayPathTo)>& onBeforeMove) const
+{
+
+ const AbstractPath targetPath = generateVersionedPath(relativePath);
+
+ if (onBeforeMove)
+ onBeforeMove(AFS::getDisplayPath(linkPath), AFS::getDisplayPath(targetPath));
+
+ moveExistingItemToVersioning(linkPath, targetPath, [&] { AFS::copySymlink(linkPath, targetPath, false /*copy filesystem permissions*/); }); //throw FileError
}
@@ -256,13 +250,7 @@ void FileVersioner::revisionFolder(const AbstractPath& folderPath, const Zstring
if (Opt<AFS::ItemType> type = AFS::getItemTypeIfExists(folderPath)) //throw FileError
{
if (*type == AFS::ItemType::SYMLINK) //on Linux there is just one type of symlink, and since we do revision file symlinks, we should revision dir symlinks as well!
- {
- const AbstractPath targetPath = generateVersionedPath(relativePath);
- if (onBeforeFileMove)
- onBeforeFileMove(AFS::getDisplayPath(folderPath), AFS::getDisplayPath(targetPath));
-
- moveExistingItemToVersioning(folderPath, targetPath, [&] { AFS::copySymlink(folderPath, targetPath, false /*copy filesystem permissions*/); }); //throw FileError
- }
+ revisionSymlinkImpl(folderPath, relativePath, onBeforeFileMove); //throw FileError
else
revisionFolderImpl(folderPath, relativePath, onBeforeFileMove, onBeforeFolderMove, notifyUnbufferedIO); //throw FileError
}
@@ -278,45 +266,31 @@ void FileVersioner::revisionFolderImpl(const AbstractPath& folderPath, const Zst
{
//create target directories only when needed in moveFileToVersioning(): avoid empty directories!
+ std::vector<AFS::FileInfo> files;
+ std::vector<AFS::FolderInfo> folders;
+ std::vector<AFS::SymlinkInfo> symlinks;
- auto ft = std::make_shared<FlatTraverserCallback>(folderPath); //traverse source directory one level deep
- AFS::traverseFolderParallel(folderPath, {{ {}, ft }}, 1 /*parallelOps*/); //throw FileError
+ AFS::traverseFolderFlat(folderPath, //throw FileError
+ [&](const AFS::FileInfo& fi) { files .push_back(fi); assert(!files.back().symlinkInfo); },
+ [&](const AFS::FolderInfo& fi) { folders .push_back(fi); },
+ [&](const AFS::SymlinkInfo& si) { symlinks.push_back(si); });
const Zstring relPathPf = appendSeparator(relativePath);
- for (const auto& fileInfo: ft->refFiles())
+ for (const auto& fileInfo : files)
{
- const AbstractPath sourcePath = AFS::appendRelPath(folderPath, fileInfo.itemName);
- const AbstractPath targetPath = generateVersionedPath(relPathPf + fileInfo.itemName);
- const AFS::StreamAttributes sourceAttr{ fileInfo.modTime, fileInfo.fileSize, fileInfo.fileId };
-
- if (onBeforeFileMove)
- onBeforeFileMove(AFS::getDisplayPath(sourcePath), AFS::getDisplayPath(targetPath));
+ const FileDescriptor fileDescr{ AFS::appendRelPath(folderPath, fileInfo.itemName),
+ FileAttributes(fileInfo.modTime, fileInfo.fileSize, fileInfo.fileId, false /*isSymlink*/)};
- moveExistingItemToVersioning(sourcePath, targetPath, [&] //throw FileError
- {
- //target existing: copyFileTransactional() undefined behavior! (fail/overwrite/auto-rename) => not expected here:
- /*const AFS::FileCopyResult result =*/ AFS::copyFileTransactional(sourcePath, sourceAttr, targetPath, //throw FileError, ErrorFileLocked
- false, //copyFilePermissions
- false, //transactionalCopy: not needed for versioning! partial copy will be overwritten next time
- nullptr /*onDeleteTargetFile*/, notifyUnbufferedIO);
- //result.errorModTime? => irrelevant for versioning!
- });
+ revisionFileImpl(fileDescr, relPathPf + fileInfo.itemName, onBeforeFileMove, notifyUnbufferedIO); //throw FileError
}
- for (const auto& linkInfo: ft->refSymlinks())
- {
- const AbstractPath sourcePath = AFS::appendRelPath(folderPath, linkInfo.itemName);
- const AbstractPath targetPath = generateVersionedPath(relPathPf + linkInfo.itemName);
-
- if (onBeforeFileMove)
- onBeforeFileMove(AFS::getDisplayPath(sourcePath), AFS::getDisplayPath(targetPath));
-
- moveExistingItemToVersioning(sourcePath, targetPath, [&] { AFS::copySymlink(sourcePath, targetPath, false /*copy filesystem permissions*/); }); //throw FileError
- }
+ for (const auto& linkInfo : symlinks)
+ revisionSymlinkImpl(AFS::appendRelPath(folderPath, linkInfo.itemName),
+ relPathPf + linkInfo.itemName, onBeforeFileMove); //throw FileError
//move folders recursively
- for (const auto& folderInfo : ft->refFolders())
+ for (const auto& folderInfo : folders)
revisionFolderImpl(AFS::appendRelPath(folderPath, folderInfo.itemName), //throw FileError
relPathPf + folderInfo.itemName,
onBeforeFileMove, onBeforeFolderMove, notifyUnbufferedIO);
@@ -327,72 +301,273 @@ void FileVersioner::revisionFolderImpl(const AbstractPath& folderPath, const Zst
AFS::removeFolderPlain(folderPath); //throw FileError
}
+//###########################################################################################
-/*
-void FileVersioner::limitVersions(const std::function<void()>& updateUI) //throw FileError
+namespace
+{
+struct VersionInfo
+{
+ time_t versionTime;
+ AbstractPath filePath;
+ bool isSymlink;
+};
+using VersionInfoMap = std::map<Zstring, std::vector<VersionInfo>, LessFilePath>; //relPathOrig => <version infos>
+
+//subfolder\Sample.txt 2012-05-15 131513.txt => subfolder\Sample.txt version:2012-05-15 131513
+//2012-05-15 131513\subfolder\Sample.txt => " "
+
+void findFileVersions(VersionInfoMap& versions,
+ const FolderContainer& folderCont,
+ const AbstractPath& parentFolderPath,
+ const Zstring& relPathOrigParent,
+ const time_t* versionTimeParent)
+{
+ auto addVersion = [&](const Zstring& fileName, const Zstring& fileNameOrig, time_t versionTime, bool isSymlink)
+ {
+ const Zstring& relPathOrig = AFS::appendPaths(relPathOrigParent, fileNameOrig, FILE_NAME_SEPARATOR);
+ const AbstractPath& filePath = AFS::appendRelPath(parentFolderPath, fileName);
+
+ versions[relPathOrig].push_back(VersionInfo{ versionTime, filePath, isSymlink });
+ };
+
+ auto extractFileVersion = [&](const Zstring& fileName, bool isSymlink)
+ {
+ if (versionTimeParent) //VersioningStyle::TIMESTAMP_FOLDER
+ addVersion(fileName, fileName, *versionTimeParent, isSymlink);
+ else
+ {
+ const std::pair<time_t, Zstring> vfn = fff::impl::parseVersionedFileName(fileName);
+ if (vfn.first != 0) //VersioningStyle::TIMESTAMP_FILE
+ addVersion(fileName, vfn.second, vfn.first, isSymlink);
+ }
+ };
+
+ for (const auto& item : folderCont.files)
+ extractFileVersion(item.first, false /*isSymlink*/);
+
+ for (const auto& item : folderCont.symlinks)
+ extractFileVersion(item.first, true /*isSymlink*/);
+
+ for (const auto& item : folderCont.folders)
+ {
+ const Zstring& folderName = item.first;
+
+ if (relPathOrigParent.empty() && !versionTimeParent) //VersioningStyle::TIMESTAMP_FOLDER?
+ {
+ assert(!versionTimeParent);
+ const time_t versionTime = fff::impl::parseVersionedFolderName(folderName);
+ if (versionTime != 0)
+ {
+ findFileVersions(versions, item.second.second,
+ AFS::appendRelPath(parentFolderPath, folderName),
+ Zstring(), //[!] skip time-stamped folder
+ &versionTime);
+ continue;
+ }
+ }
+
+ findFileVersions(versions, item.second.second,
+ AFS::appendRelPath(parentFolderPath, folderName),
+ AFS::appendPaths(relPathOrigParent, folderName, FILE_NAME_SEPARATOR),
+ versionTimeParent);
+ }
+}
+
+
+void getFolderItemCount(std::map<AbstractPath, size_t>& folderItemCount, const FolderContainer& folderCont, const AbstractPath& parentFolderPath)
+{
+ size_t& itemCount = folderItemCount[parentFolderPath];
+ itemCount = std::max(itemCount, folderCont.files.size() + folderCont.symlinks.size() + folderCont.folders.size());
+ //theoretically possible that the same folder is found in one case with items, in another case empty (due to an error)
+ //e.g. "subfolder" for versioning folders c:\folder and c:\folder\subfolder
+
+ for (const auto& item : folderCont.folders)
+ getFolderItemCount(folderItemCount, item.second.second, AFS::appendRelPath(parentFolderPath, item.first));
+}
+}
+
+
+bool fff::operator<(const VersioningLimitFolder& lhs, const VersioningLimitFolder& rhs)
{
- if (versionCountLimit_ < 0) //no limit!
- return;
+ const int cmp = AFS::compareAbstractPath(lhs.versioningFolderPath, rhs.versioningFolderPath);
+ if (cmp != 0)
+ return cmp < 0;
- //buffer map "directory |-> list of immediate child file and symlink short names"
- std::map<Zstring, std::vector<Zstring>, LessFilePath> dirBuffer;
+ if (lhs.versionMaxAgeDays != rhs.versionMaxAgeDays)
+ return lhs.versionMaxAgeDays < rhs.versionMaxAgeDays;
- auto getVersionsBuffered = [&](const Zstring& dirpath) -> const std::vector<Zstring>&
+ if (lhs.versionMaxAgeDays > 0)
{
- auto it = dirBuffer.find(dirpath);
- if (it != dirBuffer.end())
- return it->second;
+ if (lhs.versionCountMin != rhs.versionCountMin)
+ return lhs.versionCountMin < rhs.versionCountMin;
+ }
- std::vector<Zstring> fileShortNames;
- TraverseVersionsOneLevel tol(fileShortNames, updateUI); //throw FileError
- traverseFolder(dirpath, tol);
+ return lhs.versionCountMax < rhs.versionCountMax;
+}
- auto& newEntry = dirBuffer[dirpath]; //transactional behavior!!!
- newEntry.swap(fileShortNames); //-> until C++11 emplace is available
- return newEntry;
+void fff::applyVersioningLimit(const std::set<VersioningLimitFolder>& limitFolders,
+ const std::map<AbstractPath, size_t>& deviceParallelOps,
+ ProcessCallback& callback)
+{
+ //--------- traverse all versioning folders ---------
+ std::set<DirectoryKey> foldersToRead;
+ for (const VersioningLimitFolder& vlf : limitFolders)
+ if (vlf.versionMaxAgeDays > 0 || vlf.versionCountMax > 0) //only analyze versioning folders when needed!
+ foldersToRead.emplace(DirectoryKey({ vlf.versioningFolderPath, std::make_shared<NullFilter>(), SymLinkHandling::DIRECT }));
+
+ auto onError = [&](const std::wstring& msg, size_t retryNumber)
+ {
+ switch (callback.reportError(msg, retryNumber))
+ {
+ case ProcessCallback::IGNORE_ERROR:
+ return AFS::TraverserCallback::ON_ERROR_CONTINUE;
+
+ case ProcessCallback::RETRY:
+ return AFS::TraverserCallback::ON_ERROR_RETRY;
+ }
+ assert(false);
+ return AFS::TraverserCallback::ON_ERROR_CONTINUE;
};
- std::for_each(fileRelNames.begin(), fileRelNames.end(),
- [&](const Zstring& relativePath) //e.g. "subdir\Sample.txt"
+ const std::wstring textScanning = _("Searching for excess file versions:") + L" ";
+
+ auto onStatusUpdate = [&](const std::wstring& statusLine, int itemsTotal)
{
- const Zstring filepath = appendSeparator(versioningDirectory_) + relativePath; //e.g. "D:\Revisions\subdir\Sample.txt"
- const Zstring parentDir = beforeLast(filepath, FILE_NAME_SEPARATOR); //e.g. "D:\Revisions\subdir"
- const Zstring shortname = afterLast(relativePath, FILE_NAME_SEPARATOR); //e.g. "Sample.txt"; returns the whole string if seperator not found
+ callback.reportStatus(textScanning + statusLine); //throw X
+ };
+
+ std::map<DirectoryKey, DirectoryValue> folderBuf;
+
+ parallelDeviceTraversal(foldersToRead, folderBuf,
+ deviceParallelOps,
+ onError, onStatusUpdate,
+ UI_UPDATE_INTERVAL / 2); //every ~50 ms
+
+ //--------- group versions per (original) relative path ---------
+ std::map<AbstractPath, VersionInfoMap> versionDetails; //versioningFolderPath => <version details>
+ std::map<AbstractPath, size_t> folderItemCount; //<folder path> => <item count> for determination of empty folders
+
+ for (const auto& item : folderBuf)
+ {
+ const AbstractPath versioningFolderPath = item.first.folderPath;
+ const DirectoryValue& dirVal = item.second;
+
+ assert(versionDetails.find(versioningFolderPath) == versionDetails.end());
+
+ findFileVersions(versionDetails[versioningFolderPath],
+ dirVal.folderCont,
+ versioningFolderPath,
+ Zstring() /*relPathOrigParent*/,
+ nullptr /*versionTimeParent*/);
- const std::vector<Zstring>& allVersions = getVersionsBuffered(parentDir);
+ //determine item count per folder for later detection and removal of empty folders:
+ getFolderItemCount(folderItemCount, dirVal.folderCont, versioningFolderPath);
- //filter out only those versions that match the given relative name
- std::vector<Zstring> matches; //e.g. "Sample.txt 2012-05-15 131513.txt"
+ //make sure the versioning folder is never found empty and is not deleted:
+ ++folderItemCount[versioningFolderPath];
- std::copy_if(allVersions.begin(), allVersions.end(), std::back_inserter(matches),
- [&](const Zstring& shortnameVer) { return impl::isMatchingVersion(shortname, shortnameVer); });
+ //similarly, failed folder traversal should not make folders look empty:
+ for (const auto& item2 : dirVal.failedFolderReads) ++folderItemCount[AFS::appendRelPath(versioningFolderPath, item2.first)];
+ for (const auto& item2 : dirVal.failedItemReads ) ++folderItemCount[AFS::appendRelPath(versioningFolderPath, beforeLast(item2.first, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE))];
+ }
+
+ //--------- calculate excess file versions ---------
+ std::map<AbstractPath, bool /*isSymlink*/> itemsToDelete;
+
+ const time_t lastMidnightTime = []
+ {
+ TimeComp tc = getLocalTime(); //returns TimeComp() on error
+ tc.second = 0;
+ tc.minute = 0;
+ tc.hour = 0;
+ return localToTimeT(tc); //returns -1 on error => swallow => no versions trimmed by versionMaxAgeDays
+ }();
+
+ for (const VersioningLimitFolder& vlf : limitFolders)
+ if (vlf.versionMaxAgeDays > 0 || vlf.versionCountMax > 0) //NOT redundant regarding the same check above
+ for (auto& item : versionDetails.find(vlf.versioningFolderPath)->second) //exists after construction above!
+ {
+ std::vector<VersionInfo>& versions = item.second;
- //take advantage of version naming convention to find oldest versions
- if (matches.size() <= static_cast<size_t>(versionCountLimit_))
- return;
- std::nth_element(matches.begin(), matches.end() - versionCountLimit_, matches.end(), LessFilePath()); //windows: ignore case!
+ size_t versionsToKeep = versions.size();
+ if (vlf.versionMaxAgeDays > 0)
+ {
+ const time_t cutOffTime = lastMidnightTime - vlf.versionMaxAgeDays * 24 * 3600;
+
+ versionsToKeep = std::count_if(versions.begin(), versions.end(), [cutOffTime](const VersionInfo& vi) { return vi.versionTime >= cutOffTime; });
+
+ if (vlf.versionCountMin > 0)
+ versionsToKeep = std::max<size_t>(versionsToKeep, vlf.versionCountMin);
+ }
+ if (vlf.versionCountMax > 0)
+ versionsToKeep = std::min<size_t>(versionsToKeep, vlf.versionCountMax);
- //delete obsolete versions
- std::for_each(matches.begin(), matches.end() - versionCountLimit_,
- [&](const Zstring& shortnameVer)
+ if (versionsToKeep < versions.size())
+ {
+ std::nth_element(versions.begin(), versions.end() - versionsToKeep, versions.end(),
+ [](const VersionInfo& lhs, const VersionInfo& rhs) { return lhs.versionTime < rhs.versionTime; });
+ //oldest versions sorted to the front
+
+ std::for_each(versions.begin(), versions.end() - versionsToKeep, [&](const VersionInfo& vi)
+ {
+ itemsToDelete.emplace(vi.filePath, vi.isSymlink);
+ });
+ }
+ }
+
+ //--------- remove excess file versions ---------
+ Protected<std::map<AbstractPath, size_t>&> folderItemCountShared(folderItemCount);
+ const std::wstring textRemoving = _("Removing excess file versions:") + L" ";
+ const std::wstring textDeletingFolder = _("Deleting folder %x");
+
+ ParallelWorkItem deleteEmptyFolderTask;
+ deleteEmptyFolderTask = [&textDeletingFolder, &folderItemCountShared, &deleteEmptyFolderTask](ParallelContext& ctx) /*throw ThreadInterruption*/
+ {
+ const std::wstring errMsg = tryReportingError([&] //throw ThreadInterruption
{
- updateUI();
- const Zstring fullnameVer = parentDir + FILE_NAME_SEPARATOR + shortnameVer;
- try
+ ctx.acb.reportStatus(replaceCpy(textDeletingFolder, L"%x", fmtPath(AFS::getDisplayPath(ctx.itemPath)))); //throw ThreadInterruption
+ AFS::removeEmptyFolderfExists(ctx.itemPath); //throw FileError
+ }, ctx.acb);
+
+ if (errMsg.empty())
+ if (Opt<AbstractPath> parentPath = AFS::getParentFolderPath(ctx.itemPath))
{
- removeFile(fullnameVer); //throw FileError
+ bool scheduleDelete = false;
+ folderItemCountShared.access([&](auto& folderItemCount2) { scheduleDelete = --folderItemCount2[*parentPath] == 0; });
+ if (scheduleDelete)
+ ctx.scheduleExtraTask(AfsPath(AFS::getRootRelativePath(*parentPath)), deleteEmptyFolderTask); //throw ThreadInterruption
}
- catch (FileError&)
+ };
+
+ std::vector<std::pair<AbstractPath, ParallelWorkItem>> parallelWorkload;
+
+ for (const auto& item : folderItemCount)
+ if (item.second == 0)
+ parallelWorkload.emplace_back(item.first, deleteEmptyFolderTask);
+
+ for (const auto& item : itemsToDelete)
+ parallelWorkload.emplace_back(item.first, [isSymlink = item.second, &textRemoving, &folderItemCountShared, &deleteEmptyFolderTask](ParallelContext& ctx) /*throw ThreadInterruption*/
+ {
+ const std::wstring errMsg = tryReportingError([&] //throw ThreadInterruption
+ {
+ ctx.acb.reportInfo(textRemoving + AFS::getDisplayPath(ctx.itemPath)); //throw ThreadInterruption
+ if (isSymlink)
+ AFS::removeSymlinkIfExists(ctx.itemPath); //throw FileError
+ else
+ AFS::removeFileIfExists(ctx.itemPath); //throw FileError
+ }, ctx.acb);
+
+ if (errMsg.empty())
+ if (Opt<AbstractPath> parentPath = AFS::getParentFolderPath(ctx.itemPath))
{
-#ifdef ZEN_WIN //if it's a directory symlink:
- if (symlinkExists(fullnameVer) && dirExists(fullnameVer))
- removeDirectory(fullnameVer); //throw FileError
- else
-#endif
- throw;
+ bool scheduleDelete = false;
+ folderItemCountShared.access([&](auto& folderItemCount2) { scheduleDelete = --folderItemCount2[*parentPath] == 0; });
+ if (scheduleDelete)
+ ctx.scheduleExtraTask(AfsPath(AFS::getRootRelativePath(*parentPath)), deleteEmptyFolderTask); //throw ThreadInterruption
+ assert(AFS::getRootPath(*parentPath) == AFS::getRootPath(ctx.itemPath));
}
- });
});
+
+ massParallelExecute(parallelWorkload, deviceParallelOps, "Versioning Limit", callback /*throw X*/);
}
-*/
diff --git a/FreeFileSync/Source/base/versioning.h b/FreeFileSync/Source/base/versioning.h
index ca0e4869..84f4627e 100755
--- a/FreeFileSync/Source/base/versioning.h
+++ b/FreeFileSync/Source/base/versioning.h
@@ -35,10 +35,11 @@ class FileVersioner
public:
FileVersioner(const AbstractPath& versioningFolderPath, //throw FileError
VersioningStyle versioningStyle,
- const zen::TimeComp& timeStamp) :
+ time_t syncStartTime) :
versioningFolderPath_(versioningFolderPath),
versioningStyle_(versioningStyle),
- timeStamp_(zen::formatTime<Zstring>(Zstr("%Y-%m-%d %H%M%S"), timeStamp)) //e.g. "2012-05-15 131513"
+ syncStartTime_(syncStartTime),
+ timeStamp_(zen::formatTime<Zstring>(Zstr("%Y-%m-%d %H%M%S"), zen::getLocalTime(syncStartTime))) //e.g. "2012-05-15 131513"
{
using namespace zen;
@@ -50,12 +51,12 @@ public:
}
//multi-threaded access: internally synchronized!
- bool revisionFile(const FileDescriptor& fileDescr, //throw FileError; return "false" if file is not existing
+ void revisionFile(const FileDescriptor& fileDescr, //throw FileError; return "false" if file is not existing
const Zstring& relativePath,
//called frequently if move has to revert to copy + delete => see zen::copyFile for limitations when throwing exceptions!
- const zen::IOCallback& notifyUnbufferedIO) const; //may be nullptr
+ const zen::IOCallback& notifyUnbufferedIO /*optional*/) const;
- bool revisionSymlink(const AbstractPath& linkPath, const Zstring& relativePath) const; //throw FileError; return "false" if file is not existing
+ void revisionSymlink(const AbstractPath& linkPath, const Zstring& relativePath) const; //throw FileError; return "false" if file is not existing
void revisionFolder(const AbstractPath& folderPath, const Zstring& relativePath, //throw FileError
@@ -65,13 +66,17 @@ public:
//called frequently if move has to revert to copy + delete => see zen::copyFile for limitations when throwing exceptions!
const zen::IOCallback& notifyUnbufferedIO) const;
- //multi-threaded access: ?
- //void limitVersions(std::function<void()> updateUI); //throw FileError; call when done revisioning!
-
private:
FileVersioner (const FileVersioner&) = delete;
FileVersioner& operator=(const FileVersioner&) = delete;
+ void revisionFileImpl(const FileDescriptor& fileDescr, const Zstring& relativePath, //throw FileError
+ const std::function<void(const std::wstring& displayPathFrom, const std::wstring& displayPathTo)>& onBeforeMove,
+ const zen::IOCallback& notifyUnbufferedIO /*optional*/) const;
+
+ void revisionSymlinkImpl(const AbstractPath& linkPath, const Zstring& relativePath, //throw FileError
+ const std::function<void(const std::wstring& displayPathFrom, const std::wstring& displayPathTo)>& onBeforeMove) const;
+
void revisionFolderImpl(const AbstractPath& folderPath, const Zstring& relativePath,
const std::function<void(const std::wstring& displayPathFrom, const std::wstring& displayPathTo)>& onBeforeFileMove,
const std::function<void(const std::wstring& displayPathFrom, const std::wstring& displayPathTo)>& onBeforeFolderMove,
@@ -81,14 +86,31 @@ private:
const AbstractPath versioningFolderPath_;
const VersioningStyle versioningStyle_;
+ const time_t syncStartTime_;
const Zstring timeStamp_;
+};
+
+//--------------------------------------------------------------------------------
- //Protected<std::vector<Zstring>> fileRelNames_; //list of revisioned file and symlink relative names for limitVersions()
+struct VersioningLimitFolder
+{
+ AbstractPath versioningFolderPath;
+ int versionMaxAgeDays = 0; //<= 0 := no limit
+ int versionCountMin = 0; //only used if versionMaxAgeDays > 0 => < versionCountMax (if versionCountMax > 0)
+ int versionCountMax = 0; //<= 0 := no limit
};
+bool operator<(const VersioningLimitFolder& lhs, const VersioningLimitFolder& rhs);
+
+
+void applyVersioningLimit(const std::set<VersioningLimitFolder>& limitFolders,
+ const std::map<AbstractPath, size_t>& deviceParallelOps,
+ ProcessCallback& callback);
+
namespace impl //declare for unit tests:
{
-bool isMatchingVersion(const Zstring& shortname, const Zstring& shortnameVersion);
+std::pair<time_t, Zstring> parseVersionedFileName (const Zstring& fileName);
+time_t parseVersionedFolderName(const Zstring& fileName);
}
}
diff --git a/FreeFileSync/Source/fs/abstract.cpp b/FreeFileSync/Source/fs/abstract.cpp
index 34404fca..3b74fab5 100755
--- a/FreeFileSync/Source/fs/abstract.cpp
+++ b/FreeFileSync/Source/fs/abstract.cpp
@@ -19,10 +19,9 @@ const Zchar* AFS::TEMP_FILE_ENDING = Zstr(".ffs_tmp");
bool fff::isValidRelPath(const Zstring& relPath)
{
- const bool check1 = !contains(relPath, '\\');
- const bool check2 = !startsWith(relPath, FILE_NAME_SEPARATOR) && !endsWith(relPath, FILE_NAME_SEPARATOR);
- const bool check3 = !contains(relPath, Zstring() + FILE_NAME_SEPARATOR + FILE_NAME_SEPARATOR);
- return check1 && check2 && check3;
+ return !contains(relPath, '\\') &&
+ !startsWith(relPath, FILE_NAME_SEPARATOR) && !endsWith(relPath, FILE_NAME_SEPARATOR) &&
+ !contains(relPath, Zstring() + FILE_NAME_SEPARATOR + FILE_NAME_SEPARATOR);
}
@@ -45,12 +44,6 @@ int AFS::compareAbstractPath(const AbstractPath& lhs, const AbstractPath& rhs)
}
-AFS::PathComponents AFS::getPathComponents(const AbstractPath& ap)
-{
- return { AbstractPath(ap.afs, AfsPath()), split(ap.afsPath.value, FILE_NAME_SEPARATOR, SplitType::SKIP_EMPTY) };
-}
-
-
Opt<AbstractPath> AFS::getParentFolderPath(const AbstractPath& ap)
{
if (const Opt<AfsPath> parentAfsPath = getParentAfsPath(ap.afsPath))
@@ -69,7 +62,7 @@ Opt<AfsPath> AFS::getParentAfsPath(const AfsPath& afsPath)
}
-void AFS::traverseFolderParallel(const AbstractPath& basePath, const AFS::TraverserWorkload& workload, size_t parallelOps)
+void AFS::traverseFolderRecursive(const AbstractPath& basePath, const AFS::TraverserWorkload& workload, size_t parallelOps)
{
TraverserWorkloadImpl wlImpl;
for (const auto& item : workload)
@@ -84,7 +77,43 @@ void AFS::traverseFolderParallel(const AbstractPath& basePath, const AFS::Traver
}
wlImpl.emplace_back(afsPath, item.second);
}
- basePath.afs->traverseFolderParallel(wlImpl, parallelOps); //throw
+ basePath.afs->traverseFolderRecursive(wlImpl, parallelOps); //throw
+}
+
+
+namespace
+{
+struct FlatTraverserCallback : public AFS::TraverserCallback
+{
+ FlatTraverserCallback(const std::function<void (const AFS::FileInfo& fi)>& onFile,
+ const std::function<void (const AFS::FolderInfo& fi)>& onFolder,
+ const std::function<void (const AFS::SymlinkInfo& si)>& onSymlink) :
+ onFile_ (onFile),
+ onFolder_ (onFolder),
+ onSymlink_(onSymlink) {}
+
+private:
+ void onFile (const AFS::FileInfo& fi) override { if (onFile_) onFile_ (fi); }
+ std::shared_ptr<TraverserCallback> onFolder (const AFS::FolderInfo& fi) override { if (onFolder_) onFolder_ (fi); return nullptr; }
+ HandleLink onSymlink(const AFS::SymlinkInfo& si) override { if (onSymlink_) onSymlink_(si); return TraverserCallback::LINK_SKIP; }
+
+ HandleError reportDirError (const std::wstring& msg, size_t retryNumber) override { throw FileError(msg); }
+ HandleError reportItemError(const std::wstring& msg, size_t retryNumber, const Zstring& itemName) override { throw FileError(msg); }
+
+ const std::function<void (const AFS::FileInfo& fi)> onFile_;
+ const std::function<void (const AFS::FolderInfo& fi)> onFolder_;
+ const std::function<void (const AFS::SymlinkInfo& si)> onSymlink_;
+};
+}
+
+
+void AFS::traverseFolderFlat(const AfsPath& afsPath, //throw FileError
+ const std::function<void (const FileInfo& fi)>& onFile,
+ const std::function<void (const FolderInfo& fi)>& onFolder,
+ const std::function<void (const SymlinkInfo& si)>& onSymlink) const
+{
+ auto ft = std::make_shared<FlatTraverserCallback>(onFile, onFolder, onSymlink); //throw FileError
+ traverseFolderRecursive({{ afsPath, ft }}, 1 /*parallelOps*/); //throw FileError
}
@@ -189,8 +218,8 @@ AFS::FileCopyResult AFS::copyFileTransactional(const AbstractPath& apSource, con
//- generate (hopefully) unique file name to avoid clashing with some remnant ffs_tmp file
//- do not loop and avoid pathological cases, e.g. https://freefilesync.org/forum/viewtopic.php?t=1592
const Zstring shortGuid = printNumber<Zstring>(Zstr("%04x"), static_cast<unsigned int>(getCrc16(generateGUID())));
- auto it = find_last(fileName.begin(), fileName.end(), Zchar('.')); //gracefully handle case of missing "."
- const Zstring fileNameTmp = Zstring(fileName.begin(), it) + Zchar('.') + shortGuid + TEMP_FILE_ENDING;
+ auto it = find_last(fileName.begin(), fileName.end(), Zstr('.')); //gracefully handle case of missing "."
+ const Zstring fileNameTmp = Zstring(fileName.begin(), it) + Zstr('.') + shortGuid + TEMP_FILE_ENDING;
const AbstractPath apTargetTmp = AFS::appendRelPath(*parentPath, fileNameTmp);
//AbstractPath apTargetTmp(apTarget.afs, AfsPath(apTarget.afsPath.value + TEMP_FILE_ENDING));
@@ -273,24 +302,6 @@ void AFS::createFolderIfMissingRecursion(const AbstractPath& ap) //throw FileErr
}
-namespace
-{
-struct ItemSearchCallback: public AFS::TraverserCallback
-{
- ItemSearchCallback(const Zstring& itemName) : itemName_(itemName) {}
-
- void onFile (const FileInfo& fi) override { if (equalFilePath(fi.itemName, itemName_)) throw AFS::ItemType::FILE; }
- std::shared_ptr<TraverserCallback> onFolder (const FolderInfo& fi) override { if (equalFilePath(fi.itemName, itemName_)) throw AFS::ItemType::FOLDER; return nullptr; }
- HandleLink onSymlink(const SymlinkInfo& si) override { if (equalFilePath(si.itemName, itemName_)) throw AFS::ItemType::SYMLINK; return TraverserCallback::LINK_SKIP; }
- HandleError reportDirError (const std::wstring& msg, size_t retryNumber) override { throw FileError(msg); }
- HandleError reportItemError(const std::wstring& msg, size_t retryNumber, const Zstring& itemName) override { throw FileError(msg); }
-
-private:
- const Zstring itemName_;
-};
-}
-
-
//essentially a(n abstract) duplicate of zen::getPathStatus()
AFS::PathStatusImpl AFS::getPathStatusViaFolderTraversal(const AfsPath& afsPath) const //throw FileError
{
@@ -315,8 +326,10 @@ AFS::PathStatusImpl AFS::getPathStatusViaFolderTraversal(const AfsPath& afsPath)
ps.existingType != ItemType::FILE) //obscure, but possible (and not an error)
try
{
- auto iscb = std::make_shared<ItemSearchCallback>(itemName);
- traverseFolderParallel({{ *parentAfsPath, iscb }}, 1 /*parallelOps*/); //throw FileError, ItemType
+ traverseFolderFlat(*parentAfsPath, //throw FileError
+ [&](const FileInfo& fi) { if (equalFilePath(fi.itemName, itemName)) throw ItemType::FILE; },
+ [&](const FolderInfo& fi) { if (equalFilePath(fi.itemName, itemName)) throw ItemType::FOLDER; },
+ [&](const SymlinkInfo& si) { if (equalFilePath(si.itemName, itemName)) throw ItemType::SYMLINK; });
}
catch (const ItemType& type) { return { type, afsPath, {} }; } //yes, exceptions for control-flow are bad design... but, but...
//we're not CPU-bound here and finding the item after getItemType() previously failed is exceptional (even C:\pagefile.sys should be found)
@@ -344,38 +357,23 @@ AFS::PathStatus AFS::getPathStatus(const AbstractPath& ap) //throw FileError
namespace
{
-struct FlatTraverserCallback: public AFS::TraverserCallback
-{
- FlatTraverserCallback(const AbstractPath& folderPath) : folderPath_(folderPath) {}
-
- void onFile (const FileInfo& fi) override { fileNames_ .push_back(fi.itemName); }
- std::shared_ptr<TraverserCallback> onFolder (const FolderInfo& fi) override { folderNames_ .push_back(fi.itemName); return nullptr; }
- HandleLink onSymlink(const SymlinkInfo& si) override { symlinkNames_.push_back(si.itemName); return TraverserCallback::LINK_SKIP; }
- HandleError reportDirError (const std::wstring& msg, size_t retryNumber) override { throw FileError(msg); }
- HandleError reportItemError(const std::wstring& msg, size_t retryNumber, const Zstring& itemName) override { throw FileError(msg); }
-
- const std::vector<Zstring>& refFileNames () const { return fileNames_; }
- const std::vector<Zstring>& refFolderNames () const { return folderNames_; }
- const std::vector<Zstring>& refSymlinkNames() const { return symlinkNames_; }
-
-private:
- const AbstractPath folderPath_;
- std::vector<Zstring> fileNames_;
- std::vector<Zstring> folderNames_;
- std::vector<Zstring> symlinkNames_;
-};
-
-
void removeFolderIfExistsRecursionImpl(const AbstractPath& folderPath, //throw FileError
const std::function<void (const std::wstring& displayPath)>& onBeforeFileDeletion, //optional
const std::function<void (const std::wstring& displayPath)>& onBeforeFolderDeletion) //one call for each *existing* object!
{
//deferred recursion => save stack space and allow deletion of extremely deep hierarchies!
- auto ft = std::make_shared<FlatTraverserCallback>(folderPath);
- AFS::traverseFolderParallel(folderPath, {{ {}, ft }}, 1 /*parallelOps*/); //throw FileError
+ std::vector<Zstring> fileNames;
+ std::vector<Zstring> folderNames;
+ std::vector<Zstring> symlinkNames;
+
+ AFS::traverseFolderFlat(folderPath, //throw FileError
+ [&](const AFS::FileInfo& fi) { fileNames .push_back(fi.itemName); },
+ [&](const AFS::FolderInfo& fi) { folderNames .push_back(fi.itemName); },
+ [&](const AFS::SymlinkInfo& si) { symlinkNames.push_back(si.itemName); });
- for (const Zstring& fileName : ft->refFileNames())
+
+ for (const Zstring& fileName : fileNames)
{
const AbstractPath filePath = AFS::appendRelPath(folderPath, fileName);
if (onBeforeFileDeletion)
@@ -384,7 +382,7 @@ void removeFolderIfExistsRecursionImpl(const AbstractPath& folderPath, //throw F
AFS::removeFilePlain(filePath); //throw FileError
}
- for (const Zstring& symlinkName : ft->refSymlinkNames())
+ for (const Zstring& symlinkName : symlinkNames)
{
const AbstractPath linkPath = AFS::appendRelPath(folderPath, symlinkName);
if (onBeforeFileDeletion)
@@ -393,7 +391,7 @@ void removeFolderIfExistsRecursionImpl(const AbstractPath& folderPath, //throw F
AFS::removeSymlinkPlain(linkPath); //throw FileError
}
- for (const Zstring& folderName : ft->refFolderNames())
+ for (const Zstring& folderName : folderNames)
removeFolderIfExistsRecursionImpl(AFS::appendRelPath(folderPath, folderName), //throw FileError
onBeforeFileDeletion, onBeforeFolderDeletion);
@@ -409,6 +407,8 @@ void AFS::removeFolderIfExistsRecursion(const AbstractPath& ap, //throw FileErro
const std::function<void (const std::wstring& displayPath)>& onBeforeFileDeletion, //optional
const std::function<void (const std::wstring& displayPath)>& onBeforeFolderDeletion) //one call for each object!
{
+ warn_static("what about parallelOps?")
+
//no error situation if directory is not existing! manual deletion relies on it!
if (Opt<ItemType> type = AFS::getItemTypeIfExists(ap)) //throw FileError
{
@@ -434,14 +434,14 @@ bool AFS::removeFileIfExists(const AbstractPath& ap) //throw FileError
AFS::removeFilePlain(ap); //throw FileError
return true;
}
- catch (FileError&)
+ catch (const FileError& e)
{
try
{
if (!AFS::getItemTypeIfExists(ap)) //throw FileError
return false;
}
- catch (FileError&) {} //previous exception is more relevant
+ catch (const FileError& e2) { throw FileError(e.toString(), e2.toString()); } //unclear which exception is more relevant
throw;
}
@@ -455,14 +455,34 @@ bool AFS::removeSymlinkIfExists(const AbstractPath& ap) //throw FileError
AFS::removeSymlinkPlain(ap); //throw FileError
return true;
}
- catch (FileError&)
+ catch (const FileError& e)
{
try
{
if (!AFS::getItemTypeIfExists(ap)) //throw FileError
return false;
}
- catch (FileError&) {} //previous exception is more relevant
+ catch (const FileError& e2) { throw FileError(e.toString(), e2.toString()); } //unclear which exception is more relevant
+
+ throw;
+ }
+}
+
+
+void AFS::removeEmptyFolderfExists(const AbstractPath& ap) //throw FileError
+{
+ try
+ {
+ AFS::removeFolderPlain(ap); //throw FileError
+ }
+ catch (const FileError& e)
+ {
+ try
+ {
+ if (!AFS::getItemTypeIfExists(ap)) //throw FileError
+ return;
+ }
+ catch (const FileError& e2) { throw FileError(e.toString(), e2.toString()); } //unclear which exception is more relevant
throw;
}
diff --git a/FreeFileSync/Source/fs/abstract.h b/FreeFileSync/Source/fs/abstract.h
index 9ca897f7..6c05e419 100755
--- a/FreeFileSync/Source/fs/abstract.h
+++ b/FreeFileSync/Source/fs/abstract.h
@@ -66,12 +66,9 @@ struct AbstractFileSystem //THREAD-SAFETY: "const" member functions must model t
static zen::Opt<AbstractPath> getParentFolderPath(const AbstractPath& ap);
- struct PathComponents
- {
- AbstractPath rootPath; //itemPath =: rootPath + relPath
- std::vector<Zstring> relPath;
- };
- static PathComponents getPathComponents(const AbstractPath& ap);
+ static AbstractPath getRootPath (const AbstractPath& ap) { return AbstractPath(ap.afs, AfsPath()); }
+ static Zstring getRootRelativePath(const AbstractPath& ap) { return ap.afsPath.value; }
+
//----------------------------------------------------------------------------------------------------------------
enum class ItemType
{
@@ -102,6 +99,7 @@ struct AbstractFileSystem //THREAD-SAFETY: "const" member functions must model t
static bool removeFileIfExists (const AbstractPath& ap); //throw FileError; return "false" if file is not existing
static bool removeSymlinkIfExists(const AbstractPath& ap); //
+ static void removeEmptyFolderfExists(const AbstractPath& ap); //throw FileError
static void removeFolderIfExistsRecursion(const AbstractPath& ap, //throw FileError
const std::function<void (const std::wstring& displayPath)>& onBeforeFileDeletion, //optional
const std::function<void (const std::wstring& displayPath)>& onBeforeFolderDeletion); //one call for each object!
@@ -176,30 +174,30 @@ struct AbstractFileSystem //THREAD-SAFETY: "const" member functions must model t
{ return std::make_unique<OutputStream>(ap.afs->getOutputStream(ap.afsPath, streamSize, notifyUnbufferedIO), ap, streamSize); }
//----------------------------------------------------------------------------------------------------------------
- struct TraverserCallback
+ struct SymlinkInfo
{
- virtual ~TraverserCallback() {}
+ Zstring itemName;
+ time_t modTime; //number of seconds since Jan. 1st 1970 UTC
+ };
- struct SymlinkInfo
- {
- Zstring itemName;
- time_t modTime; //number of seconds since Jan. 1st 1970 UTC
- };
+ struct FileInfo
+ {
+ Zstring itemName;
+ uint64_t fileSize; //unit: bytes!
+ time_t modTime; //number of seconds since Jan. 1st 1970 UTC
+ FileId fileId; //optional: empty if not supported!
+ const SymlinkInfo* symlinkInfo; //only filled if file is a followed symlink
+ };
- struct FileInfo
- {
- Zstring itemName;
- uint64_t fileSize; //unit: bytes!
- time_t modTime; //number of seconds since Jan. 1st 1970 UTC
- FileId fileId; //optional: empty if not supported!
- const SymlinkInfo* symlinkInfo; //only filled if file is a followed symlink
- };
+ struct FolderInfo
+ {
+ Zstring itemName;
+ const SymlinkInfo* symlinkInfo; //only filled if folder is a followed symlink
+ };
- struct FolderInfo
- {
- Zstring itemName;
- const SymlinkInfo* symlinkInfo; //only filled if folder is a followed symlink
- };
+ struct TraverserCallback
+ {
+ virtual ~TraverserCallback() {}
enum HandleLink
{
@@ -225,8 +223,13 @@ struct AbstractFileSystem //THREAD-SAFETY: "const" member functions must model t
using TraverserWorkload = std::vector<std::pair<std::vector<Zstring> /*relPath*/, std::shared_ptr<TraverserCallback> /*throw X*/>>;
//- client needs to handle duplicate file reports! (FilePlusTraverser fallback, retrying to read directory contents, ...)
- static void traverseFolderParallel(const AbstractPath& basePath, const TraverserWorkload& workload, size_t parallelOps);
+ static void traverseFolderRecursive(const AbstractPath& basePath, const TraverserWorkload& workload, size_t parallelOps);
+ static void traverseFolderFlat(const AbstractPath& ap, //throw FileError
+ const std::function<void (const FileInfo& fi)>& onFile, //
+ const std::function<void (const FolderInfo& fi)>& onFolder, //optional
+ const std::function<void (const SymlinkInfo& si)>& onSymlink) //
+ { ap.afs->traverseFolderFlat(ap.afsPath, onFile, onFolder, onSymlink); }
//----------------------------------------------------------------------------------------------------------------
static bool supportPermissionCopy(const AbstractPath& apSource, const AbstractPath& apTarget); //throw FileError
@@ -309,6 +312,11 @@ protected: //grant derived classes access to AbstractPath:
};
PathStatusImpl getPathStatusViaFolderTraversal(const AfsPath& afsPath) const; //throw FileError
+ void traverseFolderFlat(const AfsPath& afsPath, //throw FileError
+ const std::function<void (const FileInfo& fi)>& onFile, //
+ const std::function<void (const FolderInfo& fi)>& onFolder, //optional
+ const std::function<void (const SymlinkInfo& si)>& onSymlink) const; //
+
//target existing: undefined behavior! (fail/overwrite/auto-rename)
FileCopyResult copyFileAsStream(const AfsPath& afsPathSource, const StreamAttributes& attrSource, //throw FileError, ErrorFileLocked
const AbstractPath& apTarget, const zen::IOCallback& notifyUnbufferedIO) const; //may be nullptr; throw X!
@@ -351,8 +359,7 @@ private:
const uint64_t* streamSize, //optional
const zen::IOCallback& notifyUnbufferedIO) const = 0; //
//----------------------------------------------------------------------------------------------------------------
- virtual void traverseFolderParallel(const TraverserWorkloadImpl& workload /*throw X*/, size_t parallelOps) const = 0;
-
+ virtual void traverseFolderRecursive(const TraverserWorkloadImpl& workload /*throw X*/, size_t parallelOps) const = 0;
//----------------------------------------------------------------------------------------------------------------
virtual bool supportsPermissions(const AfsPath& afsPath) const = 0; //throw FileError
diff --git a/FreeFileSync/Source/fs/concrete_impl.h b/FreeFileSync/Source/fs/concrete_impl.h
index 5ad9da54..03e381bc 100644..100755
--- a/FreeFileSync/Source/fs/concrete_impl.h
+++ b/FreeFileSync/Source/fs/concrete_impl.h
@@ -155,7 +155,7 @@ public:
std::tuple<std::vector<TaskResult<TravContext, Functions>>...> results; //avoid per-getNextResults() memory allocations (=> swap instead!)
while (scheduler_.getResults(results) == SchedulerStatus::HAVE_RESULT)
- std::apply([&](auto&... r) { (..., this->evalResultList(r)); }, results); //throw X
+ std::apply([&](auto&... r) { (..., this->evalResultList(r)); }, results); //throw X
}
private:
diff --git a/FreeFileSync/Source/fs/native.cpp b/FreeFileSync/Source/fs/native.cpp
index de8e0e7c..ab859d1f 100755
--- a/FreeFileSync/Source/fs/native.cpp
+++ b/FreeFileSync/Source/fs/native.cpp
@@ -198,7 +198,7 @@ private:
};
-void traverseFolderParallelNative(const std::vector<std::pair<Zstring, std::shared_ptr<AFS::TraverserCallback>>>& initialTasks, size_t parallelOps) //throw X
+void traverseFolderRecursiveNative(const std::vector<std::pair<Zstring, std::shared_ptr<AFS::TraverserCallback>>>& initialTasks, size_t parallelOps) //throw X
{
std::vector<Task<TravContext, GetDirDetails>> genItems;
@@ -257,7 +257,7 @@ void GenericDirTraverser<GetDirDetails, GetItemDetails, GetLinkTargetDetails>::e
{
assert(r.link.type == ItemType::SYMLINK && r.target.type != ItemType::SYMLINK);
- const AFS::TraverserCallback::SymlinkInfo linkInfo = { r.raw.itemName, r.link.modTime };
+ const AFS::SymlinkInfo linkInfo = { r.raw.itemName, r.link.modTime };
if (r.target.type == ItemType::FOLDER)
{
@@ -476,7 +476,7 @@ private:
}
//----------------------------------------------------------------------------------------------------------------
- void traverseFolderParallel(const TraverserWorkloadImpl& workload /*throw X*/, size_t parallelOps) const override
+ void traverseFolderRecursive(const TraverserWorkloadImpl& workload /*throw X*/, size_t parallelOps) const override
{
//initComForThread() -> done on traverser worker threads
@@ -484,7 +484,7 @@ private:
for (const auto& item : workload)
initialWorkItems.emplace_back(getNativePath(item.first), item.second);
- traverseFolderParallelNative(initialWorkItems, parallelOps); //throw X
+ traverseFolderRecursiveNative(initialWorkItems, parallelOps); //throw X
}
//----------------------------------------------------------------------------------------------------------------
diff --git a/FreeFileSync/Source/ui/cfg_grid.cpp b/FreeFileSync/Source/ui/cfg_grid.cpp
index 42d8ff45..4932969f 100755
--- a/FreeFileSync/Source/ui/cfg_grid.cpp
+++ b/FreeFileSync/Source/ui/cfg_grid.cpp
@@ -361,7 +361,7 @@ void cfggrid::addAndSelect(Grid& grid, const std::vector<Zstring>& filePaths, bo
{
auto* prov = dynamic_cast<GridDataCfg*>(grid.getDataProvider());
if (!prov)
- throw std::runtime_error(std::string(__FILE__) + "[" + numberTo<std::string>(__LINE__) + "] cfggrid was not initialized.");
+ throw std::runtime_error(std::string(__FILE__) + "[" + numberTo<std::string>(__LINE__) + "] cfggrid was not initialized.");
prov->getDataView().addCfgFiles(filePaths);
grid.Refresh(); //[!] let Grid know about changed row count *before* fiddling with selection!!!
@@ -394,7 +394,7 @@ int cfggrid::getSyncOverdueDays(Grid& grid)
{
if (auto* prov = dynamic_cast<GridDataCfg*>(grid.getDataProvider()))
return prov->getSyncOverdueDays();
-throw std::runtime_error(std::string(__FILE__) + "[" + numberTo<std::string>(__LINE__) + "] cfggrid was not initialized.");
+ throw std::runtime_error(std::string(__FILE__) + "[" + numberTo<std::string>(__LINE__) + "] cfggrid was not initialized.");
}
@@ -402,7 +402,7 @@ void cfggrid::setSyncOverdueDays(Grid& grid, int syncOverdueDays)
{
auto* prov = dynamic_cast<GridDataCfg*>(grid.getDataProvider());
if (!prov)
-throw std::runtime_error(std::string(__FILE__) + "[" + numberTo<std::string>(__LINE__) + "] cfggrid was not initialized.");
+ throw std::runtime_error(std::string(__FILE__) + "[" + numberTo<std::string>(__LINE__) + "] cfggrid was not initialized.");
prov->setSyncOverdueDays(syncOverdueDays);
grid.Refresh();
diff --git a/FreeFileSync/Source/ui/folder_selector.cpp b/FreeFileSync/Source/ui/folder_selector.cpp
index 4a311891..babef8bb 100755
--- a/FreeFileSync/Source/ui/folder_selector.cpp
+++ b/FreeFileSync/Source/ui/folder_selector.cpp
@@ -135,7 +135,7 @@ void FolderSelector::onItemPathDropped(FileDropEvent& event)
if (itemPaths.empty())
return;
- if (droppedPathsFilter_ && droppedPathsFilter_(itemPaths))
+ if (!droppedPathsFilter_ || droppedPathsFilter_(itemPaths))
{
auto fmtShellPath = [](const Zstring& shellItemPath)
{
diff --git a/FreeFileSync/Source/ui/gui_generated.cpp b/FreeFileSync/Source/ui/gui_generated.cpp
index d7775da4..6dd4222e 100755
--- a/FreeFileSync/Source/ui/gui_generated.cpp
+++ b/FreeFileSync/Source/ui/gui_generated.cpp
@@ -1633,7 +1633,7 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
m_panelFilterSettingsTab->SetSizer( bSizer278 );
m_panelFilterSettingsTab->Layout();
bSizer278->Fit( m_panelFilterSettingsTab );
- m_notebook->AddPage( m_panelFilterSettingsTab, _("dummy"), true );
+ m_notebook->AddPage( m_panelFilterSettingsTab, _("dummy"), false );
m_panelSyncSettingsTab = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
m_panelSyncSettingsTab->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
@@ -1886,12 +1886,6 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
bSizer2331->Add( m_staticTextDeletionTypeDescription, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
- bSizer2331->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_hyperlinkVersioning = new wxHyperlinkCtrl( m_panelSyncSettings, wxID_ANY, _("Show examples"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- bSizer2331->Add( m_hyperlinkVersioning, 0, wxALIGN_BOTTOM|wxTOP|wxRIGHT|wxLEFT, 5 );
-
-
bSizerVersioningHolder->Add( bSizer2331, 0, wxALL|wxEXPAND, 5 );
m_panelVersioning = new wxPanel( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
@@ -1900,6 +1894,36 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
wxBoxSizer* bSizer191;
bSizer191 = new wxBoxSizer( wxVERTICAL );
+
+ bSizer191->Add( 0, 5, 0, 0, 5 );
+
+ wxBoxSizer* bSizer252;
+ bSizer252 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapVersioning = new wxStaticBitmap( m_panelVersioning, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer252->Add( m_bitmapVersioning, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+ wxBoxSizer* bSizer253;
+ bSizer253 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer254;
+ bSizer254 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticText155 = new wxStaticText( m_panelVersioning, wxID_ANY, _("Move files to a user-defined folder"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText155->Wrap( -1 );
+ m_staticText155->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
+
+ bSizer254->Add( m_staticText155, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+
+ bSizer254->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_hyperlink243 = new wxHyperlinkCtrl( m_panelVersioning, wxID_ANY, _("Show examples"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ bSizer254->Add( m_hyperlink243, 0, wxLEFT|wxALIGN_BOTTOM, 5 );
+
+
+ bSizer253->Add( bSizer254, 0, wxEXPAND|wxBOTTOM, 5 );
+
wxBoxSizer* bSizer156;
bSizer156 = new wxBoxSizer( wxHORIZONTAL );
@@ -1917,47 +1941,109 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
bSizer156->Add( m_bpButtonSelectAltFolder, 0, wxEXPAND, 5 );
- bSizer191->Add( bSizer156, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+ bSizer253->Add( bSizer156, 0, wxEXPAND, 5 );
+
+
+ bSizer252->Add( bSizer253, 1, wxRIGHT, 5 );
+
+
+ bSizer191->Add( bSizer252, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
wxBoxSizer* bSizer198;
bSizer198 = new wxBoxSizer( wxHORIZONTAL );
+ wxBoxSizer* bSizer255;
+ bSizer255 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer256;
+ bSizer256 = new wxBoxSizer( wxHORIZONTAL );
+
m_staticText93 = new wxStaticText( m_panelVersioning, wxID_ANY, _("Naming convention:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText93->Wrap( -1 );
- bSizer198->Add( m_staticText93, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer256->Add( m_staticText93, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
wxArrayString m_choiceVersioningStyleChoices;
m_choiceVersioningStyle = new wxChoice( m_panelVersioning, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceVersioningStyleChoices, 0 );
m_choiceVersioningStyle->SetSelection( 0 );
- bSizer198->Add( m_choiceVersioningStyle, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+ bSizer256->Add( m_choiceVersioningStyle, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer255->Add( bSizer256, 0, wxALL, 5 );
+
+ wxBoxSizer* bSizer257;
+ bSizer257 = new wxBoxSizer( wxHORIZONTAL );
m_staticTextNamingCvtPart1 = new wxStaticText( m_panelVersioning, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextNamingCvtPart1->Wrap( -1 );
m_staticTextNamingCvtPart1->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
- bSizer198->Add( m_staticTextNamingCvtPart1, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer257->Add( m_staticTextNamingCvtPart1, 0, wxALIGN_CENTER_VERTICAL, 5 );
m_staticTextNamingCvtPart2Bold = new wxStaticText( m_panelVersioning, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextNamingCvtPart2Bold->Wrap( -1 );
m_staticTextNamingCvtPart2Bold->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
m_staticTextNamingCvtPart2Bold->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
- bSizer198->Add( m_staticTextNamingCvtPart2Bold, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer257->Add( m_staticTextNamingCvtPart2Bold, 0, wxALIGN_CENTER_VERTICAL, 5 );
m_staticTextNamingCvtPart3 = new wxStaticText( m_panelVersioning, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextNamingCvtPart3->Wrap( -1 );
m_staticTextNamingCvtPart3->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
- bSizer198->Add( m_staticTextNamingCvtPart3, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer257->Add( m_staticTextNamingCvtPart3, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizer255->Add( bSizer257, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
- bSizer191->Add( bSizer198, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+ bSizer198->Add( bSizer255, 0, wxALL, 5 );
+
+ m_staticline69 = new wxStaticLine( m_panelVersioning, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer198->Add( m_staticline69, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer258;
+ bSizer258 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticTextLimitVersions = new wxStaticText( m_panelVersioning, wxID_ANY, _("Limit file versions:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextLimitVersions->Wrap( -1 );
+ bSizer258->Add( m_staticTextLimitVersions, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
+
+ fgSizer15 = new wxFlexGridSizer( 0, 3, 5, 10 );
+ fgSizer15->SetFlexibleDirection( wxBOTH );
+ fgSizer15->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+ m_checkBoxVersionMaxDays = new wxCheckBox( m_panelVersioning, wxID_ANY, _("Last x days:"), wxDefaultPosition, wxDefaultSize, 0 );
+ fgSizer15->Add( m_checkBoxVersionMaxDays, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_checkBoxVersionCountMin = new wxCheckBox( m_panelVersioning, wxID_ANY, _("Minimum:"), wxDefaultPosition, wxDefaultSize, 0 );
+ fgSizer15->Add( m_checkBoxVersionCountMin, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_checkBoxVersionCountMax = new wxCheckBox( m_panelVersioning, wxID_ANY, _("Maximum:"), wxDefaultPosition, wxDefaultSize, 0 );
+ fgSizer15->Add( m_checkBoxVersionCountMax, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_spinCtrlVersionMaxDays = new wxSpinCtrl( m_panelVersioning, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 );
+ fgSizer15->Add( m_spinCtrlVersionMaxDays, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_spinCtrlVersionCountMin = new wxSpinCtrl( m_panelVersioning, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 );
+ fgSizer15->Add( m_spinCtrlVersionCountMin, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_spinCtrlVersionCountMax = new wxSpinCtrl( m_panelVersioning, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 1, 2000000000, 1 );
+ fgSizer15->Add( m_spinCtrlVersionCountMax, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer258->Add( fgSizer15, 0, wxALL, 5 );
+
+
+ bSizer198->Add( bSizer258, 0, wxALL, 5 );
+
+
+ bSizer191->Add( bSizer198, 0, wxEXPAND, 5 );
m_panelVersioning->SetSizer( bSizer191 );
m_panelVersioning->Layout();
bSizer191->Fit( m_panelVersioning );
- bSizerVersioningHolder->Add( m_panelVersioning, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 );
+ bSizerVersioningHolder->Add( m_panelVersioning, 0, wxEXPAND, 5 );
bSizerVersioningHolder->Add( 0, 0, 1, wxEXPAND, 5 );
@@ -2054,7 +2140,7 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
m_panelSyncSettingsTab->SetSizer( bSizer276 );
m_panelSyncSettingsTab->Layout();
bSizer276->Fit( m_panelSyncSettingsTab );
- m_notebook->AddPage( m_panelSyncSettingsTab, _("dummy"), false );
+ m_notebook->AddPage( m_panelSyncSettingsTab, _("dummy"), true );
bSizer190->Add( m_notebook, 1, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
@@ -2125,8 +2211,11 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
m_toggleBtnRecycler->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnDeletionRecycler ), NULL, this );
m_toggleBtnPermanent->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnDeletionPermanent ), NULL, this );
m_toggleBtnVersioning->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnDeletionVersioning ), NULL, this );
- m_hyperlinkVersioning->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( ConfigDlgGenerated::OnHelpVersioning ), NULL, this );
- m_choiceVersioningStyle->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::OnChangeSyncOption ), NULL, this );
+ m_hyperlink243->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( ConfigDlgGenerated::OnHelpVersioning ), NULL, this );
+ m_choiceVersioningStyle->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::OnChanegVersioningStyle ), NULL, this );
+ m_checkBoxVersionMaxDays->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnToggleVersioningLimit ), NULL, this );
+ m_checkBoxVersionCountMin->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnToggleVersioningLimit ), NULL, this );
+ m_checkBoxVersionCountMax->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnToggleVersioningLimit ), NULL, this );
m_checkBoxIgnoreErrors->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnToggleIgnoreErrors ), NULL, this );
m_checkBoxAutoRetry->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnToggleAutoRetry ), NULL, this );
m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnOkay ), NULL, this );
@@ -2955,15 +3044,18 @@ SyncProgressPanelGenerated::SyncProgressPanelGenerated( wxWindow* parent, wxWind
{
bSizerRoot = new wxBoxSizer( wxVERTICAL );
+ m_panel53 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panel53->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
bSizer42 = new wxBoxSizer( wxHORIZONTAL );
bSizer42->Add( 0, 0, 1, wxEXPAND, 5 );
- m_bitmapStatus = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ m_bitmapStatus = new wxStaticBitmap( m_panel53, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 );
bSizer42->Add( m_bitmapStatus, 0, wxALIGN_CENTER_VERTICAL|wxALL, 2 );
- m_staticTextPhase = new wxStaticText( this, wxID_ANY, _("Synchronizing..."), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextPhase = new wxStaticText( m_panel53, wxID_ANY, _("Synchronizing..."), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextPhase->Wrap( -1 );
m_staticTextPhase->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
@@ -2975,19 +3067,25 @@ SyncProgressPanelGenerated::SyncProgressPanelGenerated( wxWindow* parent, wxWind
bSizer247->Add( 0, 0, 1, 0, 5 );
- m_bpButtonMinimizeToTray = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonMinimizeToTray = new wxBitmapButton( m_panel53, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
m_bpButtonMinimizeToTray->SetToolTip( _("Minimize to notification area") );
- bSizer247->Add( m_bpButtonMinimizeToTray, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer247->Add( m_bpButtonMinimizeToTray, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 );
bSizer42->Add( bSizer247, 1, wxALIGN_CENTER_VERTICAL, 5 );
- bSizerRoot->Add( bSizer42, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 );
+ m_panel53->SetSizer( bSizer42 );
+ m_panel53->Layout();
+ bSizer42->Fit( m_panel53 );
+ bSizerRoot->Add( m_panel53, 0, wxEXPAND, 5 );
bSizerStatusText = new wxBoxSizer( wxVERTICAL );
+
+ bSizerStatusText->Add( 0, 5, 0, 0, 5 );
+
m_staticTextStatus = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextStatus->Wrap( -1 );
bSizerStatusText->Add( m_staticTextStatus, 0, wxEXPAND|wxLEFT, 10 );
@@ -2998,10 +3096,6 @@ SyncProgressPanelGenerated::SyncProgressPanelGenerated( wxWindow* parent, wxWind
bSizerRoot->Add( bSizerStatusText, 0, wxEXPAND, 5 );
- wxStaticLine* m_staticlineHeader;
- m_staticlineHeader = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizerRoot->Add( m_staticlineHeader, 0, wxEXPAND, 5 );
-
m_panelProgress = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
m_panelProgress->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
@@ -3256,7 +3350,7 @@ SyncProgressPanelGenerated::SyncProgressPanelGenerated( wxWindow* parent, wxWind
m_notebookResult->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- bSizerRoot->Add( m_notebookResult, 1, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
+ bSizerRoot->Add( m_notebookResult, 1, wxEXPAND, 5 );
m_staticlineFooter = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
bSizerRoot->Add( m_staticlineFooter, 0, wxEXPAND, 5 );
@@ -3483,14 +3577,10 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
bSizer238->Add( 0, 0, 1, wxEXPAND, 5 );
- m_checkBoxLogfilesLimit = new wxCheckBox( m_panel35, wxID_ANY, _("Limit:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_checkBoxLogfilesLimit->SetToolTip( _("Limit maximum number of log files") );
-
- bSizer238->Add( m_checkBoxLogfilesLimit, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+ m_checkBoxLogfilesLimit = new wxCheckBox( m_panel35, wxID_ANY, _("Limit number of log files:"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer238->Add( m_checkBoxLogfilesLimit, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_spinCtrlLogfileLimit = new wxSpinCtrl( m_panel35, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 );
- m_spinCtrlLogfileLimit->SetToolTip( _("Limit maximum number of log files") );
-
bSizer238->Add( m_spinCtrlLogfileLimit, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
@@ -4381,12 +4471,6 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
bSizer172->Add( m_hyperlink12, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
- m_hyperlink13 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Boost"), wxT("https://www.boost.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink13->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink13->SetToolTip( _("https://www.boost.org") );
-
- bSizer172->Add( m_hyperlink13, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
m_hyperlink10 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("libssh2"), wxT("https://www.libssh2.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
m_hyperlink10->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
m_hyperlink10->SetToolTip( _("https://www.libssh2.org") );
diff --git a/FreeFileSync/Source/ui/gui_generated.h b/FreeFileSync/Source/ui/gui_generated.h
index 2358df75..dbed969d 100755
--- a/FreeFileSync/Source/ui/gui_generated.h
+++ b/FreeFileSync/Source/ui/gui_generated.h
@@ -412,8 +412,10 @@ protected:
wxBoxSizer* bSizerVersioningHolder;
wxStaticBitmap* m_bitmapDeletionType;
wxStaticText* m_staticTextDeletionTypeDescription;
- wxHyperlinkCtrl* m_hyperlinkVersioning;
wxPanel* m_panelVersioning;
+ wxStaticBitmap* m_bitmapVersioning;
+ wxStaticText* m_staticText155;
+ wxHyperlinkCtrl* m_hyperlink243;
fff::FolderHistoryBox* m_versioningFolderPath;
wxButton* m_buttonSelectVersioningFolder;
wxStaticText* m_staticText93;
@@ -421,6 +423,15 @@ protected:
wxStaticText* m_staticTextNamingCvtPart1;
wxStaticText* m_staticTextNamingCvtPart2Bold;
wxStaticText* m_staticTextNamingCvtPart3;
+ wxStaticLine* m_staticline69;
+ wxStaticText* m_staticTextLimitVersions;
+ wxFlexGridSizer* fgSizer15;
+ wxCheckBox* m_checkBoxVersionMaxDays;
+ wxCheckBox* m_checkBoxVersionCountMin;
+ wxCheckBox* m_checkBoxVersionCountMax;
+ wxSpinCtrl* m_spinCtrlVersionMaxDays;
+ wxSpinCtrl* m_spinCtrlVersionCountMin;
+ wxSpinCtrl* m_spinCtrlVersionCountMax;
wxStaticLine* m_staticline582;
wxBoxSizer* bSizerMiscConfig;
wxStaticBitmap* m_bitmapIgnoreErrors;
@@ -478,7 +489,8 @@ protected:
virtual void OnDeletionPermanent( wxCommandEvent& event ) { event.Skip(); }
virtual void OnDeletionVersioning( wxCommandEvent& event ) { event.Skip(); }
virtual void OnHelpVersioning( wxHyperlinkEvent& event ) { event.Skip(); }
- virtual void OnChangeSyncOption( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnChanegVersioningStyle( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnToggleVersioningLimit( wxCommandEvent& event ) { event.Skip(); }
virtual void OnToggleIgnoreErrors( wxCommandEvent& event ) { event.Skip(); }
virtual void OnToggleAutoRetry( wxCommandEvent& event ) { event.Skip(); }
virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); }
@@ -714,6 +726,7 @@ class SyncProgressPanelGenerated : public wxPanel
private:
protected:
+ wxPanel* m_panel53;
wxBoxSizer* bSizer42;
wxStaticText* m_staticText1461;
wxStaticText* m_staticText146;
@@ -1065,7 +1078,6 @@ protected:
wxHyperlinkCtrl* m_hyperlink16;
wxHyperlinkCtrl* m_hyperlink15;
wxHyperlinkCtrl* m_hyperlink12;
- wxHyperlinkCtrl* m_hyperlink13;
wxHyperlinkCtrl* m_hyperlink10;
wxHyperlinkCtrl* m_hyperlink101;
wxHyperlinkCtrl* m_hyperlink18;
diff --git a/FreeFileSync/Source/ui/gui_status_handler.h b/FreeFileSync/Source/ui/gui_status_handler.h
index 48dbbd29..767b1a31 100755
--- a/FreeFileSync/Source/ui/gui_status_handler.h
+++ b/FreeFileSync/Source/ui/gui_status_handler.h
@@ -82,7 +82,7 @@ private:
const size_t automaticRetryCount_;
const size_t automaticRetryDelay_;
const std::wstring jobName_;
- const std::chrono::system_clock::time_point startTime_; //don't use wxStopWatch: may overflow after a few days due to ::QueryPerformanceCounter()
+ const std::chrono::system_clock::time_point startTime_;
const Zstring postSyncCommand_;
const PostSyncCondition postSyncCondition_;
bool& exitAfterSync_;
diff --git a/FreeFileSync/Source/ui/main_dlg.cpp b/FreeFileSync/Source/ui/main_dlg.cpp
index 7925034c..e0c934e3 100755
--- a/FreeFileSync/Source/ui/main_dlg.cpp
+++ b/FreeFileSync/Source/ui/main_dlg.cpp
@@ -168,27 +168,13 @@ private:
const std::function<size_t(const Zstring& folderPathPhrase)> getDeviceParallelOps_ = [&](const Zstring& folderPathPhrase)
{
- //follow deviceParallelOps editing-behavior from sync_cfg.cpp:
- const auto& deviceParallelOps = mainDlg_.currentCfg_.mainCfg.deviceParallelOps;
- const AbstractPath rootPath = AFS::getPathComponents(createAbstractPath(folderPathPhrase)).rootPath;
-
- auto itParOps = deviceParallelOps.find(rootPath);
- return std::max<size_t>(itParOps != deviceParallelOps.end() ? static_cast<int>(itParOps->second) : 1, 1);
+ return getDeviceParallelOps(mainDlg_.currentCfg_.mainCfg.deviceParallelOps, folderPathPhrase);
};
const std::function<void(const Zstring& folderPathPhrase, size_t parallelOps)> setDeviceParallelOps_ = [&](const Zstring& folderPathPhrase, size_t parallelOps)
{
- auto& deviceParallelOps = mainDlg_.currentCfg_.mainCfg.deviceParallelOps;
- const AbstractPath rootPath = AFS::getPathComponents(createAbstractPath(folderPathPhrase)).rootPath;
- if (!AFS::isNullPath(rootPath))
- {
- if (parallelOps > 1)
- deviceParallelOps[rootPath] = parallelOps;
- else
- deviceParallelOps.erase(rootPath);
-
- mainDlg_.updateUnsavedCfgStatus();
- }
+ setDeviceParallelOps(mainDlg_.currentCfg_.mainCfg.deviceParallelOps, folderPathPhrase, parallelOps);
+ mainDlg_.updateUnsavedCfgStatus();
};
MainDialog& mainDlg_;
@@ -817,10 +803,10 @@ void MainDialog::onQueryEndSession()
{
//we try our best to do something useful in this extreme situation - no reason to notify or even log errors here!
try { writeConfig(getGlobalCfgBeforeExit(), globalConfigFilePath_); }
- catch (const FileError&) {}
+ catch (FileError&) {}
try { writeConfig(getConfig(), lastRunConfigPath_); }
- catch (const FileError&) {}
+ catch (FileError&) {}
}
@@ -1092,7 +1078,7 @@ void MainDialog::copySelectionToClipboard(const std::vector<const Grid*>& gridRe
{
try
{
-//perf: wxString doesn't model exponential growth and is unsuitable for large data sets
+ //perf: wxString doesn't model exponential growth and is unsuitable for large data sets
Zstringw clipboardString;
auto addSelection = [&](const Grid& grid)
@@ -2554,7 +2540,7 @@ void MainDialog::onOpenMenuTools(wxMenuEvent& event)
if (!paneInfo.IsShown())
{
detachedMenuItems_.erase(menuItem); //pass ownership
- m_menuTools->Append(menuItem); //
+ m_menuTools->Append(menuItem); //
}
};
filterLayoutItems(m_menuItemShowMain, m_panelTopButtons);
diff --git a/FreeFileSync/Source/ui/progress_indicator.cpp b/FreeFileSync/Source/ui/progress_indicator.cpp
index d3d5cf31..10eba321 100755
--- a/FreeFileSync/Source/ui/progress_indicator.cpp
+++ b/FreeFileSync/Source/ui/progress_indicator.cpp
@@ -27,6 +27,7 @@
#include <wx+/image_resources.h>
#include <zen/file_access.h>
#include <zen/thread.h>
+#include <zen/perf.h>
#include <wx+/rtl.h>
#include <wx+/choice_enum.h>
#include <wx+/focus.h>
@@ -67,56 +68,6 @@ inline wxColor getColorBytesBackgroundRim() { return { 12, 128, 0 }; } //dark
inline wxColor getColorItemsBackgroundRim() { return { 53, 25, 255 }; } //dark blue
-//don't use wxStopWatch for long-running measurements: internally it uses ::QueryPerformanceCounter() which can overflow after only a few days:
-//https://freefilesync.org/forum/viewtopic.php?t=1426
-// std::chrono::system_clock is not a steady clock, but at least doesn't overflow! (wraps ::GetSystemTimePreciseAsFileTime())
-// std::chrono::steady_clock also wraps ::QueryPerformanceCounter() => same flaw like wxStopWatch???
-
-class StopWatch
-{
-public:
- bool isPaused() const { return paused_; }
-
- void pause()
- {
- if (!paused_)
- {
- paused_ = true;
- elapsedUntilPause_ += std::chrono::system_clock::now() - startTime_;
- }
- }
-
- void resume()
- {
- if (paused_)
- {
- paused_ = false;
- startTime_ = std::chrono::system_clock::now();
- }
- }
-
- void restart()
- {
- paused_ = false;
- startTime_ = std::chrono::system_clock::now();
- elapsedUntilPause_ = std::chrono::nanoseconds::zero();
- }
-
- std::chrono::nanoseconds elapsed() const
- {
- auto elapsedTotal = elapsedUntilPause_;
- if (!paused_)
- elapsedTotal += std::chrono::system_clock::now() - startTime_;
- return elapsedTotal;
- }
-
-private:
- bool paused_ = false;
- std::chrono::system_clock::time_point startTime_ = std::chrono::system_clock::now();
- std::chrono::nanoseconds elapsedUntilPause_{}; //std::chrono::duration is uninitialized by default! WTF! When will this stupidity end???
-};
-
-
std::wstring getDialogPhaseText(const Statistics* syncStat, bool paused, SyncProgressDialog::SyncResult finalResult)
{
if (syncStat) //sync running
@@ -824,7 +775,7 @@ private:
{
if (auto* prov = dynamic_cast<GridDataMessages*>(m_gridMessages->getDataProvider()))
return prov->getDataView();
-throw std::runtime_error(std::string(__FILE__) + "[" + numberTo<std::string>(__LINE__) + "] m_gridMessages was not initialized.");
+ throw std::runtime_error(std::string(__FILE__) + "[" + numberTo<std::string>(__LINE__) + "] m_gridMessages was not initialized.");
}
void OnErrors(wxCommandEvent& event) override
diff --git a/FreeFileSync/Source/ui/small_dlgs.cpp b/FreeFileSync/Source/ui/small_dlgs.cpp
index f332c6e5..55ac4f09 100755
--- a/FreeFileSync/Source/ui/small_dlgs.cpp
+++ b/FreeFileSync/Source/ui/small_dlgs.cpp
@@ -585,7 +585,7 @@ OptionsDlg::OptionsDlg(wxWindow* parent, XmlGlobalSettings& globalSettings) :
m_bpButtonAddRow ->SetBitmapLabel(getResourceImage(L"item_add"));
m_bpButtonRemoveRow->SetBitmapLabel(getResourceImage(L"item_remove"));
- m_staticTextResetDialogs->Wrap(std::max(fastFromDIP(200), m_buttonResetDialogs->GetMinSize().x));
+ m_staticTextResetDialogs->Wrap(std::max(fastFromDIP(250), m_buttonResetDialogs->GetMinSize().x));
m_checkBoxFailSafe ->SetValue(globalSettings.failSafeFileCopy);
m_checkBoxCopyLocked ->SetValue(globalSettings.copyLockedFiles);
@@ -649,7 +649,7 @@ void OptionsDlg::updateGui()
warnDlgs_ != defaultCfg_.warnDlgs ||
autoCloseProgressDialog_ != defaultCfg_.autoCloseProgressDialog;
- setBitmapTextLabel(*m_buttonResetDialogs, getResourceImage(L"reset_dialogs").ConvertToImage(), haveHiddenDialogs ? _("Show hidden dialogs again") : _("No hidden dialogs"));
+ setBitmapTextLabel(*m_buttonResetDialogs, getResourceImage(L"reset_dialogs").ConvertToImage(), haveHiddenDialogs ? _("Show hidden dialogs again") : _("All dialogs shown"));
Layout();
m_buttonResetDialogs->Enable(haveHiddenDialogs);
}
diff --git a/FreeFileSync/Source/ui/sorting.h b/FreeFileSync/Source/ui/sorting.h
index 8c63be1c..04bdc743 100755
--- a/FreeFileSync/Source/ui/sorting.h
+++ b/FreeFileSync/Source/ui/sorting.h
@@ -171,7 +171,7 @@ bool lessExtension(const FileSystemObject& a, const FileSystemObject& b)
auto getExtension = [](const FileSystemObject& fsObj)
{
- return afterLast(fsObj.getItemName<side>(), Zchar('.'), zen::IF_MISSING_RETURN_NONE);
+ return afterLast(fsObj.getItemName<side>(), Zstr('.'), zen::IF_MISSING_RETURN_NONE);
};
return zen::makeSortDirection(LessNaturalSort() /*even on Linux*/, std::bool_constant<ascending>())(getExtension(a), getExtension(b));
diff --git a/FreeFileSync/Source/ui/sync_cfg.cpp b/FreeFileSync/Source/ui/sync_cfg.cpp
index a1802988..84750453 100755
--- a/FreeFileSync/Source/ui/sync_cfg.cpp
+++ b/FreeFileSync/Source/ui/sync_cfg.cpp
@@ -109,7 +109,8 @@ private:
void OnToggleLocalSyncSettings(wxCommandEvent& event) override { updateSyncGui(); }
void OnToggleDetectMovedFiles (wxCommandEvent& event) override { directionCfg_.detectMovedFiles = !directionCfg_.detectMovedFiles; updateSyncGui(); } //parameter NOT owned by checkbox!
- void OnChangeSyncOption (wxCommandEvent& event) override { updateSyncGui(); }
+ void OnChanegVersioningStyle (wxCommandEvent& event) override { updateSyncGui(); }
+ void OnToggleVersioningLimit (wxCommandEvent& event) override { updateSyncGui(); }
void OnSyncTwoWayDouble(wxMouseEvent& event) override;
void OnSyncMirrorDouble(wxMouseEvent& event) override;
@@ -142,8 +143,6 @@ private:
void OnToggleIgnoreErrors(wxCommandEvent& event) override { updateMiscGui(); }
void OnToggleAutoRetry (wxCommandEvent& event) override { updateMiscGui(); }
- size_t getParallelOpsForVersioning() const;
-
MiscSyncConfig getMiscSyncOptions() const;
void setMiscSyncOptions(const MiscSyncConfig& miscCfg);
@@ -226,13 +225,32 @@ ConfigDialog::ConfigDialog(wxWindow* parent,
ConfigDlgGenerated(parent),
versioningFolder_(*m_panelVersioning, *m_buttonSelectVersioningFolder, *m_bpButtonSelectAltFolder, *m_versioningFolderPath, nullptr /*staticText*/, nullptr /*dropWindow2*/,
nullptr /*droppedPathsFilter*/,
- [this](const Zstring& /*folderPathPhrase*/) { return getParallelOpsForVersioning(); }, nullptr /*setDeviceParallelOps*/),
- globalPairCfgOut_(globalPairCfg),
- localPairCfgOut_(localPairConfig),
- globalPairCfg_(globalPairCfg),
- localPairCfg_(localPairConfig),
- showMultipleCfgs_(showMultipleCfgs),
- perfPanelActive_(true),
+ [this](const Zstring& folderPathPhrase) //getDeviceParallelOps()
+{
+ assert(selectedPairIndexToShow_ == -1 || makeUnsigned(selectedPairIndexToShow_) < localPairCfg_.size());
+ const auto& deviceParallelOps = selectedPairIndexToShow_ < 0 ? getMiscSyncOptions().deviceParallelOps : globalPairCfg_.miscCfg.deviceParallelOps; //ternary-WTF!
+
+ return getDeviceParallelOps(deviceParallelOps, folderPathPhrase);
+},
+
+[this](const Zstring& folderPathPhrase, size_t parallelOps) //setDeviceParallelOps()
+{
+ assert(selectedPairIndexToShow_ == -1 || makeUnsigned(selectedPairIndexToShow_) < localPairCfg_.size());
+ if (selectedPairIndexToShow_ < 0)
+ {
+ MiscSyncConfig miscCfg = getMiscSyncOptions();
+ setDeviceParallelOps(miscCfg.deviceParallelOps, folderPathPhrase, parallelOps);
+ setMiscSyncOptions(miscCfg);
+ }
+ else
+ setDeviceParallelOps(globalPairCfg_.miscCfg.deviceParallelOps, folderPathPhrase, parallelOps);
+}),
+globalPairCfgOut_(globalPairCfg),
+localPairCfgOut_(localPairConfig),
+globalPairCfg_(globalPairCfg),
+localPairCfg_(localPairConfig),
+showMultipleCfgs_(showMultipleCfgs),
+perfPanelActive_(true),
commandHistItemsMax_(commandHistItemsMax)
{
setStandardButtonLayout(*bSizerStdButtons, StdButtons().setAffirmative(m_buttonOkay).setCancel(m_buttonCancel));
@@ -296,7 +314,7 @@ commandHistItemsMax_(commandHistItemsMax)
//add(UnitTime::THIS_WEEK, _("This week")).
add(UnitTime::THIS_MONTH, _("This month")).
add(UnitTime::THIS_YEAR, _("This year")).
- add(UnitTime::LAST_X_DAYS, _("Last x days"));
+ add(UnitTime::LAST_X_DAYS, replaceCpy(_("Last x days:"), L":", L"")); //reuse translation
enumSizeDescr_.
add(UnitSize::NONE, L"(" + _("None") + L")"). //meta options should be enclosed in parentheses
@@ -333,13 +351,18 @@ commandHistItemsMax_(commandHistItemsMax)
m_toggleBtnPermanent ->SetToolTip(_("Delete and overwrite files permanently"));
m_toggleBtnVersioning->SetToolTip(_("Move files to a user-defined folder"));
+ enumVersioningStyle_.
+ add(VersioningStyle::REPLACE, _("Replace"), _("Move files and replace if existing")).
+ add(VersioningStyle::TIMESTAMP_FOLDER, _("Time stamp") + L" [" + _("Folder") + L"]", _("Move files into a time-stamped subfolder")).
+ add(VersioningStyle::TIMESTAMP_FILE, _("Time stamp") + L" [" + _("File") + L"]", _("Append a time stamp to each file name"));
+
+ m_spinCtrlVersionMaxDays ->SetMinSize(wxSize(fastFromDIP(60), -1)); //
+ m_spinCtrlVersionCountMin->SetMinSize(wxSize(fastFromDIP(60), -1)); //Hack: set size (why does wxWindow::Size() not work?)
+ m_spinCtrlVersionCountMax->SetMinSize(wxSize(fastFromDIP(60), -1)); //
+
m_spinCtrlAutoRetryCount->SetMinSize(wxSize(fastFromDIP(60), -1)); //Hack: set size (why does wxWindow::Size() not work?)
m_spinCtrlAutoRetryDelay->SetMinSize(wxSize(fastFromDIP(60), -1)); //
- enumVersioningStyle_.
- add(VersioningStyle::REPLACE, _("Replace"), _("Move files and replace if existing")).
- add(VersioningStyle::ADD_TIMESTAMP, _("Time stamp"), _("Append a time stamp to each file name"));
-
enumPostSyncCondition_.
add(PostSyncCondition::COMPLETION, _("On completion:")).
add(PostSyncCondition::ERRORS, _("On errors:")).
@@ -374,9 +397,11 @@ commandHistItemsMax_(commandHistItemsMax)
//temporarily set main config as reference for window height calculations:
globalPairCfg_ = GlobalPairConfig();
- globalPairCfg_.syncCfg.directionCfg.var = DirectionConfig::MIRROR; //
- globalPairCfg_.syncCfg.handleDeletion = DeletionPolicy::VERSIONING; //set tentatively for sync dir height calculation below
- globalPairCfg_.syncCfg.versioningFolderPhrase = Zstr("dummy"); //
+ globalPairCfg_.syncCfg.directionCfg.var = DirectionConfig::MIRROR; //
+ globalPairCfg_.syncCfg.handleDeletion = DeletionPolicy::VERSIONING; //set tentatively for sync dir height calculation below
+ globalPairCfg_.syncCfg.versioningFolderPhrase = Zstr("dummy"); //
+ globalPairCfg_.syncCfg.versioningStyle = VersioningStyle::TIMESTAMP_FILE; //
+ globalPairCfg_.syncCfg.versionMaxAgeDays = 30; //
selectFolderPairConfig(-1);
@@ -574,14 +599,16 @@ void ConfigDialog::setCompConfig(const CompConfig* compCfg)
void ConfigDialog::updateCompGui()
{
- m_panelComparisonSettings->Enable(m_checkBoxUseLocalCmpOptions->GetValue());
+ const bool compOptionsEnabled = m_checkBoxUseLocalCmpOptions->GetValue();
+
+ m_panelComparisonSettings->Enable(compOptionsEnabled);
m_notebook->SetPageImage(static_cast<size_t>(SyncConfigPanel::COMPARISON),
- static_cast<int>(m_checkBoxUseLocalCmpOptions->GetValue() ? ConfigTypeImage::COMPARISON : ConfigTypeImage::COMPARISON_GREY));
+ static_cast<int>(compOptionsEnabled ? ConfigTypeImage::COMPARISON : ConfigTypeImage::COMPARISON_GREY));
auto setBitmap = [&](wxStaticBitmap& bmpCtrl, const wxBitmap& bmp)
{
- if (m_checkBoxUseLocalCmpOptions->GetValue()) //help wxWidgets a little to render inactive config state (needed on Windows, NOT on Linux!)
+ if (compOptionsEnabled) //help wxWidgets a little to render inactive config state (needed on Windows, NOT on Linux!)
bmpCtrl.SetBitmap(bmp);
else
bmpCtrl.SetBitmap(greyScale(bmp));
@@ -592,7 +619,7 @@ void ConfigDialog::updateCompGui()
m_toggleBtnBySize ->SetValue(false);
m_toggleBtnByContent ->SetValue(false);
- if (m_checkBoxUseLocalCmpOptions->GetValue()) //help wxWidgets a little to render inactive config state (needed on Windows, NOT on Linux!)
+ if (compOptionsEnabled) //help wxWidgets a little to render inactive config state (needed on Windows, NOT on Linux!)
switch (localCmpVar_)
{
case CompareVariant::TIME_SIZE:
@@ -623,8 +650,8 @@ void ConfigDialog::updateCompGui()
setText(*m_staticTextCompVarDescription, getCompVariantDescription(localCmpVar_));
m_staticTextCompVarDescription->Wrap(fastFromDIP(CFG_DESCRIPTION_WIDTH_DIP)); //needs to be reapplied after SetLabel()
- m_radioBtnSymlinksDirect->Enable(m_checkBoxSymlinksInclude->GetValue());
- m_radioBtnSymlinksFollow->Enable(m_checkBoxSymlinksInclude->GetValue());
+ m_radioBtnSymlinksDirect->Enable(m_checkBoxSymlinksInclude->GetValue() && compOptionsEnabled); //help wxWidgets a little to render inactive config state (needed on Windows, NOT on Linux!)
+ m_radioBtnSymlinksFollow->Enable(m_checkBoxSymlinksInclude->GetValue() && compOptionsEnabled); //
}
@@ -768,6 +795,7 @@ void toggleCustomSyncConfig(DirectionConfig& directionCfg, SyncDirection& custSy
case DirectionConfig::CUSTOM:
break;
}
+ SyncDirection syncDirOld = custSyncDir;
toggleSyncDirection(custSyncDir);
//some config optimization: if custom settings happen to match "mirror" or "update", just switch variant
@@ -786,9 +814,15 @@ void toggleCustomSyncConfig(DirectionConfig& directionCfg, SyncDirection& custSy
}();
if (directionCfg.custom == mirrorSet)
+ {
directionCfg.var = DirectionConfig::MIRROR;
+ custSyncDir = syncDirOld;
+ }
else if (directionCfg.custom == updateSet)
+ {
directionCfg.var = DirectionConfig::UPDATE;
+ custSyncDir = syncDirOld;
+ }
else
directionCfg.var = DirectionConfig::CUSTOM;
}
@@ -907,6 +941,12 @@ Opt<SyncConfig> ConfigDialog::getSyncConfig() const
syncCfg.handleDeletion = handleDeletion_;
syncCfg.versioningFolderPhrase = versioningFolder_.getPath();
syncCfg.versioningStyle = getEnumVal(enumVersioningStyle_, *m_choiceVersioningStyle);
+ if (syncCfg.versioningStyle != VersioningStyle::REPLACE)
+ {
+ syncCfg.versionMaxAgeDays = m_checkBoxVersionMaxDays ->GetValue() ? m_spinCtrlVersionMaxDays->GetValue() : 0;
+ syncCfg.versionCountMin = m_checkBoxVersionCountMin->GetValue() && m_checkBoxVersionMaxDays->GetValue() ? m_spinCtrlVersionCountMin->GetValue() : 0;
+ syncCfg.versionCountMax = m_checkBoxVersionCountMax->GetValue() ? m_spinCtrlVersionCountMax->GetValue() : 0;
+ }
return syncCfg;
}
@@ -923,6 +963,16 @@ void ConfigDialog::setSyncConfig(const SyncConfig* syncCfg)
versioningFolder_.setPath(tmpCfg.versioningFolderPhrase);
setEnumVal(enumVersioningStyle_, *m_choiceVersioningStyle, tmpCfg.versioningStyle);
+ const bool useVersionLimits = tmpCfg.versioningStyle != VersioningStyle::REPLACE;
+
+ m_checkBoxVersionMaxDays ->SetValue(useVersionLimits && tmpCfg.versionMaxAgeDays > 0);
+ m_checkBoxVersionCountMin->SetValue(useVersionLimits && tmpCfg.versionCountMin > 0 && tmpCfg.versionMaxAgeDays > 0);
+ m_checkBoxVersionCountMax->SetValue(useVersionLimits && tmpCfg.versionCountMax > 0);
+
+ m_spinCtrlVersionMaxDays ->SetValue(m_checkBoxVersionMaxDays ->GetValue() ? tmpCfg.versionMaxAgeDays : 30);
+ m_spinCtrlVersionCountMin->SetValue(m_checkBoxVersionCountMin->GetValue() ? tmpCfg.versionCountMin : 1);
+ m_spinCtrlVersionCountMax->SetValue(m_checkBoxVersionCountMax->GetValue() ? tmpCfg.versionCountMax : 1);
+
updateSyncGui();
}
@@ -930,10 +980,12 @@ void ConfigDialog::setSyncConfig(const SyncConfig* syncCfg)
void ConfigDialog::updateSyncGui()
{
- m_panelSyncSettings->Enable(m_checkBoxUseLocalSyncOptions->GetValue());
+ const bool syncOptionsEnabled = m_checkBoxUseLocalSyncOptions->GetValue();
+
+ m_panelSyncSettings->Enable(syncOptionsEnabled);
m_notebook->SetPageImage(static_cast<size_t>(SyncConfigPanel::SYNC),
- static_cast<int>(m_checkBoxUseLocalSyncOptions->GetValue() ? ConfigTypeImage::SYNC: ConfigTypeImage::SYNC_GREY));
+ static_cast<int>(syncOptionsEnabled ? ConfigTypeImage::SYNC: ConfigTypeImage::SYNC_GREY));
updateSyncDirectionIcons(directionCfg_,
*m_bpButtonLeftOnly,
@@ -949,7 +1001,7 @@ void ConfigDialog::updateSyncGui()
auto setBitmap = [&](wxStaticBitmap& bmpCtrl, const wxBitmap& bmp)
{
- if (m_checkBoxUseLocalSyncOptions->GetValue()) //help wxWidgets a little to render inactive config state (needed on Windows, NOT on Linux!)
+ if (syncOptionsEnabled) //help wxWidgets a little to render inactive config state (needed on Windows, NOT on Linux!)
bmpCtrl.SetBitmap(bmp);
else
bmpCtrl.SetBitmap(greyScale(bmp));
@@ -984,7 +1036,7 @@ void ConfigDialog::updateSyncGui()
m_toggleBtnUpdate->SetValue(false);
m_toggleBtnCustom->SetValue(false);
- if (m_checkBoxUseLocalSyncOptions->GetValue()) //help wxWidgets a little to render inactive config state (needed on Windows, NOT on Linux!)
+ if (syncOptionsEnabled) //help wxWidgets a little to render inactive config state (needed on Windows, NOT on Linux!)
switch (directionCfg_.var)
{
case DirectionConfig::TWO_WAY:
@@ -1005,7 +1057,7 @@ void ConfigDialog::updateSyncGui()
m_toggleBtnPermanent ->SetValue(false);
m_toggleBtnVersioning->SetValue(false);
- if (m_checkBoxUseLocalSyncOptions->GetValue()) //help wxWidgets a little to render inactive config state (needed on Windows, NOT on Linux!)
+ if (syncOptionsEnabled) //help wxWidgets a little to render inactive config state (needed on Windows, NOT on Linux!)
switch (handleDeletion_) //unconditionally update image, including "local options off"
{
case DeletionPolicy::RECYCLER:
@@ -1030,22 +1082,25 @@ void ConfigDialog::updateSyncGui()
setText(*m_staticTextDeletionTypeDescription, _("Delete and overwrite files permanently"));
break;
case DeletionPolicy::VERSIONING:
- setBitmap(*m_bitmapDeletionType, getResourceImage(L"delete_versioning_small"));
- setText(*m_staticTextDeletionTypeDescription, _("Move files to a user-defined folder"));
+ setBitmap(*m_bitmapVersioning, getResourceImage(L"delete_versioning"));
break;
}
//m_staticTextDeletionTypeDescription->Wrap(fastFromDIP(200)); //needs to be reapplied after SetLabel()
const bool versioningSelected = handleDeletion_ == DeletionPolicy::VERSIONING;
- m_panelVersioning ->Show(versioningSelected);
- m_hyperlinkVersioning->Show(versioningSelected);
+
+ m_bitmapDeletionType ->Show(!versioningSelected);
+ m_staticTextDeletionTypeDescription->Show(!versioningSelected);
+ m_panelVersioning ->Show( versioningSelected);
if (versioningSelected)
{
updateTooltipEnumVal(enumVersioningStyle_, *m_choiceVersioningStyle);
+ const VersioningStyle versioningStyle = getEnumVal(enumVersioningStyle_, *m_choiceVersioningStyle);
const std::wstring pathSep = utfTo<std::wstring>(FILE_NAME_SEPARATOR);
- switch (getEnumVal(enumVersioningStyle_, *m_choiceVersioningStyle))
+
+ switch (versioningStyle)
{
case VersioningStyle::REPLACE:
setText(*m_staticTextNamingCvtPart1, pathSep + _("Folder") + pathSep + _("File") + L".doc");
@@ -1053,48 +1108,43 @@ void ConfigDialog::updateSyncGui()
setText(*m_staticTextNamingCvtPart3, L"");
break;
- case VersioningStyle::ADD_TIMESTAMP:
+ case VersioningStyle::TIMESTAMP_FOLDER:
+ setText(*m_staticTextNamingCvtPart1, pathSep);
+ setText(*m_staticTextNamingCvtPart2Bold, _("YYYY-MM-DD hhmmss"));
+ setText(*m_staticTextNamingCvtPart3, pathSep + _("Folder") + pathSep + _("File") + L".doc ");
+ break;
+
+ case VersioningStyle::TIMESTAMP_FILE:
setText(*m_staticTextNamingCvtPart1, pathSep + _("Folder") + pathSep + _("File") + L".doc ");
setText(*m_staticTextNamingCvtPart2Bold, _("YYYY-MM-DD hhmmss"));
setText(*m_staticTextNamingCvtPart3, L".doc");
break;
}
- }
- m_panelSyncSettings->Layout();
- //Refresh(); //removes a few artifacts when toggling display of versioning folder
-}
+ const bool enableLimitCtrls = syncOptionsEnabled && versioningStyle != VersioningStyle::REPLACE;
+ const bool showLimitCtrls = m_checkBoxVersionMaxDays->GetValue() || m_checkBoxVersionCountMax->GetValue();
+ //m_checkBoxVersionCountMin->GetValue() => irrelevant if !m_checkBoxVersionMaxDays->GetValue()!
+ if (!m_checkBoxVersionMaxDays->GetValue() && m_checkBoxVersionCountMin->GetValue())
+ m_checkBoxVersionCountMin->SetValue(false); //make this dependency cristal-clear (don't just disable)
-size_t ConfigDialog::getParallelOpsForVersioning() const
-{
- assert(selectedPairIndexToShow_ == -1 || makeUnsigned(selectedPairIndexToShow_) < localPairCfg_.size());
+ m_staticTextLimitVersions->Show(!showLimitCtrls);
- const auto& deviceParallelOps = selectedPairIndexToShow_ < 0 ? getMiscSyncOptions().deviceParallelOps : globalPairCfg_.miscCfg.deviceParallelOps; //ternary-WTF!
+ m_spinCtrlVersionMaxDays ->Show(showLimitCtrls);
+ m_spinCtrlVersionCountMin->Show(showLimitCtrls);
+ m_spinCtrlVersionCountMax->Show(showLimitCtrls);
- auto getParallelOps = [&](const Zstring& folderPathPhrase)
- {
- const AbstractPath rootPath = AFS::getPathComponents(createAbstractPath(folderPathPhrase)).rootPath;
- auto itParOps = deviceParallelOps.find(rootPath);
- return std::max<size_t>(itParOps != deviceParallelOps.end() ? itParOps->second : 1, 1);
- };
- //follow deviceParallelOps editing-behavior from synchronization.cpp:
- //=> parallelOps used for versioning == number used for folder pair!
- auto getParallelOpsFp = [&](const LocalPairConfig& fpCfg)
- {
- return std::max(getParallelOps(fpCfg.folderPathPhraseLeft), getParallelOps(fpCfg.folderPathPhraseRight));
- };
+ m_checkBoxVersionMaxDays ->Enable(enableLimitCtrls);
+ m_checkBoxVersionCountMin->Enable(enableLimitCtrls && m_checkBoxVersionMaxDays->GetValue());
+ m_checkBoxVersionCountMax->Enable(enableLimitCtrls);
- if (selectedPairIndexToShow_ < 0)
- {
- size_t parallelOps = 1;
- for (const LocalPairConfig& fpCfg : localPairCfg_)
- if (!fpCfg.localSyncCfg) //only consider folder pairs affected by main config's versioning folder
- parallelOps = std::max(parallelOps, getParallelOpsFp(fpCfg));
- return parallelOps;
+ m_spinCtrlVersionMaxDays ->Enable(enableLimitCtrls && m_checkBoxVersionMaxDays ->GetValue());
+ m_spinCtrlVersionCountMin->Enable(enableLimitCtrls && m_checkBoxVersionCountMin->GetValue() && m_checkBoxVersionMaxDays->GetValue());
+ m_spinCtrlVersionCountMax->Enable(enableLimitCtrls && m_checkBoxVersionCountMax->GetValue());
}
- else
- return getParallelOpsFp(localPairCfg_[selectedPairIndexToShow_]);
+
+ m_panelSyncSettings->Layout();
+ //Refresh(); //removes a few artifacts when toggling display of versioning folder
}
@@ -1112,12 +1162,7 @@ MiscSyncConfig ConfigDialog::getMiscSyncOptions() const
for (const AbstractPath& devPath : devicePathsForEdit_)
{
wxSpinCtrl* spinCtrlParallelOps = dynamic_cast<wxSpinCtrl*>(fgSizerPerf->GetItem(i * 2)->GetWindow());
- const size_t parallelOps = spinCtrlParallelOps->GetValue();
-
- if (parallelOps > 1)
- miscCfg.deviceParallelOps[devPath] = parallelOps;
- else
- miscCfg.deviceParallelOps.erase(devPath);
+ setDeviceParallelOps(miscCfg.deviceParallelOps, devPath, spinCtrlParallelOps->GetValue());
++i;
}
//----------------------------------------------------------------------------
@@ -1138,22 +1183,9 @@ void ConfigDialog::setMiscSyncOptions(const MiscSyncConfig& miscCfg)
// Avoid "fake" changed configs! =>
//- when editting, consider only the deviceParallelOps items corresponding to the currently-used folder paths
- //- show parallel ops == 1 only temporarily during edit
+ //- keep parallel ops == 1 only temporarily during edit
deviceParallelOps_ = miscCfg.deviceParallelOps;
- devicePathsForEdit_.clear();
- auto addDevicePath = [&](const Zstring& folderPathPhrase)
- {
- const AbstractPath rootPath = AFS::getPathComponents(createAbstractPath(folderPathPhrase)).rootPath;
- if (!AFS::isNullPath(rootPath))
- devicePathsForEdit_.insert(rootPath);
- };
- for (const LocalPairConfig& fpCfg : localPairCfg_)
- {
- addDevicePath(fpCfg.folderPathPhraseLeft);
- addDevicePath(fpCfg.folderPathPhraseRight);
- }
-
assert(fgSizerPerf->GetItemCount() % 2 == 0);
const int rowsToCreate = static_cast<int>(devicePathsForEdit_.size()) - static_cast<int>(fgSizerPerf->GetItemCount() / 2);
if (rowsToCreate >= 0)
@@ -1179,8 +1211,7 @@ void ConfigDialog::setMiscSyncOptions(const MiscSyncConfig& miscCfg)
wxSpinCtrl* spinCtrlParallelOps = dynamic_cast<wxSpinCtrl*> (fgSizerPerf->GetItem(i * 2 )->GetWindow());
wxStaticText* staticTextDevice = dynamic_cast<wxStaticText*>(fgSizerPerf->GetItem(i * 2 + 1)->GetWindow());
- auto itParOps = deviceParallelOps_.find(devPath);
- spinCtrlParallelOps->SetValue(std::max<int>(itParOps != deviceParallelOps_.end() ? static_cast<int>(itParOps->second) : 1, 1));
+ spinCtrlParallelOps->SetValue(static_cast<int>(getDeviceParallelOps(deviceParallelOps_, devPath)));
staticTextDevice->SetLabel(AFS::getDisplayPath(devPath));
++i;
}
@@ -1251,6 +1282,28 @@ void ConfigDialog::selectFolderPairConfig(int newPairIndexToShow)
if (mainConfigSelected)
{
+ //update the devices list for "parallel file operations" before calling setMiscSyncOptions():
+ // => should be enough to do this when selecting the main config
+ // => to be "perfect" we'd have to update already when the user drags & drops a different versioning folder
+ devicePathsForEdit_.clear();
+ auto addDevicePath = [&](const Zstring& folderPathPhrase)
+ {
+ const AbstractPath rootPath = AFS::getRootPath(createAbstractPath(folderPathPhrase));
+ if (!AFS::isNullPath(rootPath))
+ devicePathsForEdit_.insert(rootPath);
+ };
+ for (const LocalPairConfig& fpCfg : localPairCfg_)
+ {
+ addDevicePath(fpCfg.folderPathPhraseLeft);
+ addDevicePath(fpCfg.folderPathPhraseRight);
+
+ if (fpCfg.localSyncCfg && fpCfg.localSyncCfg->handleDeletion == DeletionPolicy::VERSIONING)
+ addDevicePath(fpCfg.localSyncCfg->versioningFolderPhrase);
+ }
+ if (globalPairCfg_.syncCfg.handleDeletion == DeletionPolicy::VERSIONING) //let's always add, even if *all* folder pairs use a local sync config (=> strange!)
+ addDevicePath(globalPairCfg_.syncCfg.versioningFolderPhrase);
+ //---------------------------------------------------------------------------------------------------------------
+
setCompConfig (&globalPairCfg_.cmpCfg);
setSyncConfig (&globalPairCfg_.syncCfg);
setFilterConfig (globalPairCfg_.filter);
@@ -1275,8 +1328,12 @@ bool ConfigDialog::unselectFolderPairConfig()
//------- parameter validation (BEFORE writing output!) -------
- //check if user-defined directory for deletion was specified:
+ //parameter correction: include filter must not be empty!
+ if (trimCpy(filterCfg.includeFilter).empty())
+ filterCfg.includeFilter = FilterConfig().includeFilter; //no need to show error message, just correct user input
+
if (syncCfg && syncCfg->handleDeletion == DeletionPolicy::VERSIONING)
+ {
if (trimCpy(syncCfg->versioningFolderPhrase).empty())
{
m_notebook->ChangeSelection(static_cast<size_t>(SyncConfigPanel::SYNC));
@@ -1286,10 +1343,18 @@ bool ConfigDialog::unselectFolderPairConfig()
return false;
}
- //parameter correction: include filter must not be empty!
- if (trimCpy(filterCfg.includeFilter).empty())
- filterCfg.includeFilter = FilterConfig().includeFilter; //no need to show error message, just correct user input
-
+ if (syncCfg->versioningStyle != VersioningStyle::REPLACE &&
+ syncCfg->versionMaxAgeDays > 0 &&
+ syncCfg->versionCountMin > 0 &&
+ syncCfg->versionCountMax > 0 &&
+ syncCfg->versionCountMin >= syncCfg->versionCountMax)
+ {
+ m_notebook->ChangeSelection(static_cast<size_t>(SyncConfigPanel::SYNC));
+ showNotificationDialog(this, DialogInfoType::INFO, PopupDialogCfg().setMainInstructions(_("Minimum version count must be smaller than maximum count.")));
+ m_spinCtrlVersionCountMin->SetFocus();
+ return false;
+ }
+ }
//-------------------------------------------------------------
m_comboBoxPostSyncCommand->addItemHistory(); //commit current "on completion" history item
diff --git a/FreeFileSync/Source/ui/tree_grid.cpp b/FreeFileSync/Source/ui/tree_grid.cpp
index 83a733df..09054972 100755
--- a/FreeFileSync/Source/ui/tree_grid.cpp
+++ b/FreeFileSync/Source/ui/tree_grid.cpp
@@ -1216,7 +1216,7 @@ TreeView& treegrid::getDataView(Grid& grid)
{
if (auto* prov = dynamic_cast<GridDataTree*>(grid.getDataProvider()))
return prov->getDataView();
-throw std::runtime_error(std::string(__FILE__) + "[" + numberTo<std::string>(__LINE__) + "] treegrid was not initialized.");
+ throw std::runtime_error(std::string(__FILE__) + "[" + numberTo<std::string>(__LINE__) + "] treegrid was not initialized.");
}
diff --git a/FreeFileSync/Source/version/version.h b/FreeFileSync/Source/version/version.h
index 158c2fc1..adcaf3c8 100755
--- a/FreeFileSync/Source/version/version.h
+++ b/FreeFileSync/Source/version/version.h
@@ -3,7 +3,7 @@
namespace fff
{
-const char ffsVersion[] = "10.1"; //internal linkage!
+const char ffsVersion[] = "10.2"; //internal linkage!
const char FFS_VERSION_SEPARATOR = '.';
}
diff --git a/License.txt b/License.txt
index 7124d66c..55a9c091 100755
--- a/License.txt
+++ b/License.txt
@@ -1,7 +1,7 @@
A. GNU GENERAL PUBLIC LICENSE
-B. cURL License
-C. libssh2 License
-D. OpenSSL and SSLeay License
+B. OpenSSL and SSLeay License
+C. cURL License
+D. libssh2 License
A. GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
@@ -624,82 +624,12 @@ Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
-B. cURL License
-
-COPYRIGHT AND PERMISSION NOTICE
-
-Copyright (c) 1996 - 2016, Daniel Stenberg, <daniel@haxx.se>, and many
-contributors, see the THANKS file.
-
-All rights reserved.
-
-Permission to use, copy, modify, and distribute this software for any purpose
-with or without fee is hereby granted, provided that the above copyright
-notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN
-NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
-OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of a copyright holder shall not
-be used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization of the copyright holder.
-
-
-C. libssh2 License
-
-Copyright (c) 2004-2007 Sara Golemon <sarag@libssh2.org>
-Copyright (c) 2005,2006 Mikhail Gusarov <dottedmag@dottedmag.net>
-Copyright (c) 2006-2007 The Written Word, Inc.
-Copyright (c) 2007 Eli Fant <elifantu@mail.ru>
-Copyright (c) 2009-2014 Daniel Stenberg
-Copyright (C) 2008, 2009 Simon Josefsson
-All rights reserved.
-
-Redistribution and use in source and binary forms,
-with or without modification, are permitted provided
-that the following conditions are met:
-
-Redistributions of source code must retain the above
-copyright notice, this list of conditions and the
-following disclaimer.
-
-Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following
-disclaimer in the documentation and/or other materials
-provided with the distribution.
-
-Neither the name of the copyright holder nor the names
-of any other contributors may be used to endorse or
-promote products derived from this software without
-specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
-INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
-USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
-OF SUCH DAMAGE.
-
-
-D. OpenSSL and SSLeay License
+B. OpenSSL and SSLeay License
OpenSSL License
====================================================================
-Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved.
+Copyright (c) 1998-2018 The OpenSSL Project. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
@@ -808,4 +738,74 @@ derivative of this code cannot be changed. i.e. this code cannot simply be
copied and put under another distribution licence
[including the GNU Public Licence.]
+
+C. cURL License
+
+COPYRIGHT AND PERMISSION NOTICE
+
+Copyright (c) 1996 - 2018, Daniel Stenberg, <daniel@haxx.se>, and many
+contributors, see the THANKS file.
+
+All rights reserved.
+
+Permission to use, copy, modify, and distribute this software for any purpose
+with or without fee is hereby granted, provided that the above copyright
+notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN
+NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
+OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder shall not
+be used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization of the copyright holder.
+
+
+D. libssh2 License
+
+Copyright (c) 2004-2007 Sara Golemon <sarag@libssh2.org>
+Copyright (c) 2005,2006 Mikhail Gusarov <dottedmag@dottedmag.net>
+Copyright (c) 2006-2007 The Written Word, Inc.
+Copyright (c) 2007 Eli Fant <elifantu@mail.ru>
+Copyright (c) 2009-2014 Daniel Stenberg
+Copyright (C) 2008, 2009 Simon Josefsson
+All rights reserved.
+
+Redistribution and use in source and binary forms,
+with or without modification, are permitted provided
+that the following conditions are met:
+
+ Redistributions of source code must retain the above
+ copyright notice, this list of conditions and the
+ following disclaimer.
+
+ Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials
+ provided with the distribution.
+
+ Neither the name of the copyright holder nor the names
+ of any other contributors may be used to endorse or
+ promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+
END OF TERMS AND CONDITIONS
diff --git a/wx+/image_holder.h b/wx+/image_holder.h
index f4bf3c8a..aada581f 100755
--- a/wx+/image_holder.h
+++ b/wx+/image_holder.h
@@ -20,7 +20,7 @@ struct ImageHolder //prepare conversion to wxImage as much as possible while sta
ImageHolder(int w, int h, bool withAlpha) : //init with memory allocated
width_(w), height_(h),
- rgb_(static_cast<unsigned char*>(::malloc(w * h * 3))),
+ rgb_( static_cast<unsigned char*>(::malloc(w * h * 3))),
alpha_(withAlpha ? static_cast<unsigned char*>(::malloc(w * h)) : nullptr) {}
ImageHolder (ImageHolder&&) noexcept = default; //
diff --git a/wx+/popup_dlg.cpp b/wx+/popup_dlg.cpp
index 6633d2ab..689b364e 100755
--- a/wx+/popup_dlg.cpp
+++ b/wx+/popup_dlg.cpp
@@ -34,7 +34,7 @@ void setBestInitialSize(wxTextCtrl& ctrl, const wxString& text, wxSize maxSize)
if (sz.x > bestWidth)
bestWidth = std::min(maxSize.x, sz.x);
- rowCount += (sz.x + maxSize.x - 1) / maxSize.x; //integer round up: consider line-wraps!
+ rowCount += numeric::integerDivideRoundUp(sz.x, maxSize.x); //integer round up: consider line-wraps!
rowHeight = std::max(rowHeight, sz.y); //all rows *should* have same height
return rowCount * rowHeight >= maxSize.y;
diff --git a/zen/crc.h b/zen/crc.h
index ebac538f..df460a03 100755
--- a/zen/crc.h
+++ b/zen/crc.h
@@ -7,8 +7,7 @@
#ifndef CRC_H_23489275827847235
#define CRC_H_23489275827847235
-//boost, clean this mess up!
-#include <boost/crc.hpp>
+#include "type_traits.h"
namespace zen
@@ -27,28 +26,86 @@ inline uint32_t getCrc32(const std::string& str) { return getCrc32(str.begin(),
template <class ByteIterator> inline
-uint16_t getCrc16(ByteIterator first, ByteIterator last)
+uint16_t getCrc16(ByteIterator first, ByteIterator last) //http://www.sunshine2k.de/articles/coding/crc/understanding_crc.html
{
+ constexpr uint16_t crcTable[] =
+ {
+ 0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241, 0xc601, 0x06c0, 0x0780, 0xc741, 0x0500, 0xc5c1, 0xc481, 0x0440,
+ 0xcc01, 0x0cc0, 0x0d80, 0xcd41, 0x0f00, 0xcfc1, 0xce81, 0x0e40, 0x0a00, 0xcac1, 0xcb81, 0x0b40, 0xc901, 0x09c0, 0x0880, 0xc841,
+ 0xd801, 0x18c0, 0x1980, 0xd941, 0x1b00, 0xdbc1, 0xda81, 0x1a40, 0x1e00, 0xdec1, 0xdf81, 0x1f40, 0xdd01, 0x1dc0, 0x1c80, 0xdc41,
+ 0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0, 0x1680, 0xd641, 0xd201, 0x12c0, 0x1380, 0xd341, 0x1100, 0xd1c1, 0xd081, 0x1040,
+ 0xf001, 0x30c0, 0x3180, 0xf141, 0x3300, 0xf3c1, 0xf281, 0x3240, 0x3600, 0xf6c1, 0xf781, 0x3740, 0xf501, 0x35c0, 0x3480, 0xf441,
+ 0x3c00, 0xfcc1, 0xfd81, 0x3d40, 0xff01, 0x3fc0, 0x3e80, 0xfe41, 0xfa01, 0x3ac0, 0x3b80, 0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840,
+ 0x2800, 0xe8c1, 0xe981, 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41, 0xee01, 0x2ec0, 0x2f80, 0xef41, 0x2d00, 0xedc1, 0xec81, 0x2c40,
+ 0xe401, 0x24c0, 0x2580, 0xe541, 0x2700, 0xe7c1, 0xe681, 0x2640, 0x2200, 0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0, 0x2080, 0xe041,
+ 0xa001, 0x60c0, 0x6180, 0xa141, 0x6300, 0xa3c1, 0xa281, 0x6240, 0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441,
+ 0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41, 0xaa01, 0x6ac0, 0x6b80, 0xab41, 0x6900, 0xa9c1, 0xa881, 0x6840,
+ 0x7800, 0xb8c1, 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41, 0xbe01, 0x7ec0, 0x7f80, 0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40,
+ 0xb401, 0x74c0, 0x7580, 0xb541, 0x7700, 0xb7c1, 0xb681, 0x7640, 0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101, 0x71c0, 0x7080, 0xb041,
+ 0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, 0x5280, 0x9241, 0x9601, 0x56c0, 0x5780, 0x9741, 0x5500, 0x95c1, 0x9481, 0x5440,
+ 0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40, 0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841,
+ 0x8801, 0x48c0, 0x4980, 0x8941, 0x4b00, 0x8bc1, 0x8a81, 0x4a40, 0x4e00, 0x8ec1, 0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41,
+ 0x4400, 0x84c1, 0x8581, 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641, 0x8201, 0x42c0, 0x4380, 0x8341, 0x4100, 0x81c1, 0x8081, 0x4040
+ };
+ static_assert(arraySize(crcTable) == 256 && arrayAccumulate<uint32_t>(crcTable) == 8380544);
static_assert(sizeof(typename std::iterator_traits<ByteIterator>::value_type) == 1);
- boost::crc_16_type result;
- if (first != last)
- result.process_bytes(&*first, last - first);
- auto rv = result.checksum();
- static_assert(sizeof(rv) == sizeof(uint16_t));
- return rv;
+
+ uint16_t crc = 0;
+ std::for_each(first, last, [&](unsigned char b)
+ {
+ crc = (crc >> 8) ^ crcTable[(crc ^ b) & 0xFF];
+ });
+ return crc;
}
template <class ByteIterator> inline
-uint32_t getCrc32(ByteIterator first, ByteIterator last)
+uint32_t getCrc32(ByteIterator first, ByteIterator last) //https://en.wikipedia.org/wiki/Cyclic_redundancy_check
{
+ constexpr uint32_t crcTable[] =
+ {
+ 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
+ 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
+ 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
+ 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
+ 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
+ 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
+ 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
+ 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
+ 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
+ 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
+ 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
+ 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
+ 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
+ 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
+ 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
+ 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
+ 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
+ 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
+ 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
+ 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
+ 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
+ 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
+ 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
+ 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
+ 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
+ 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
+ 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
+ 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
+ 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
+ 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
+ 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
+ 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
+ };
+ static_assert(arraySize(crcTable) == 256 && arrayAccumulate<uint64_t>(crcTable) == 549755813760);
static_assert(sizeof(typename std::iterator_traits<ByteIterator>::value_type) == 1);
- boost::crc_32_type result;
- if (first != last)
- result.process_bytes(&*first, last - first);
- auto rv = result.checksum();
- static_assert(sizeof(rv) == sizeof(uint32_t));
- return rv;
+
+ uint32_t crc = 0xFFFFFFFF;
+ std::for_each(first, last, [&](unsigned char b)
+ {
+ crc = (crc >> 8) ^ crcTable[(crc ^ b) & 0xFF];
+ });
+ return crc ^ 0xFFFFFFFF;
}
}
diff --git a/zen/file_access.cpp b/zen/file_access.cpp
index fca1e3d8..9c351e25 100755
--- a/zen/file_access.cpp
+++ b/zen/file_access.cpp
@@ -14,8 +14,8 @@
#include "symlink_target.h"
#include "file_id_def.h"
#include "file_io.h"
-#include "crc.h" //boost dependency!
-#include "guid.h" //
+#include "crc.h"
+#include "guid.h"
#include <sys/vfs.h> //statfs
#include <sys/time.h> //lutimes
@@ -34,7 +34,7 @@ Opt<PathComponents> zen::parsePathComponents(const Zstring& itemPath)
{
auto doParse = [&](int sepCountVolumeRoot, bool rootWithSep) -> Opt<PathComponents>
{
- const Zstring itemPathFmt = appendSeparator(itemPath); //simplify analysis of root without seperator, e.g. \\server-name\share
+ const Zstring itemPathFmt = appendSeparator(itemPath); //simplify analysis of root without separator, e.g. \\server-name\share
int sepCount = 0;
for (auto it = itemPathFmt.begin(); it != itemPathFmt.end(); ++it)
if (*it == FILE_NAME_SEPARATOR)
@@ -347,8 +347,11 @@ void renameFile_sub(const Zstring& pathSource, const Zstring& pathTarget) //thro
if (!equalFilePath(pathSource, pathTarget)) //exception for OS X: changing file name case is not an "already exists" situation!
{
- bool alreadyExists = true;
- try { /*ItemType type = */getItemType(pathTarget); } /*throw FileError*/ catch (FileError&) { alreadyExists = false; }
+ const bool alreadyExists = [&]
+ {
+ try { /*ItemType type = */getItemType(pathTarget); return true; } /*throw FileError*/
+ catch (FileError&) { return false; }
+ }();
if (alreadyExists)
throwException(EEXIST);
@@ -422,7 +425,7 @@ void setWriteTimeNative(const Zstring& itemPath, const struct ::timespec& modTim
return;
//in other cases utimensat() returns EINVAL for CIFS/NTFS drives, but open+futimens works: https://freefilesync.org/forum/viewtopic.php?t=387
- const int fdFile = ::open(itemPath.c_str(), O_WRONLY | O_APPEND); //2017-07-04: O_WRONLY | O_APPEND seems to avoid EOPNOTSUPP on gvfs SFTP!
+ const int fdFile = ::open(itemPath.c_str(), O_WRONLY | O_APPEND | O_CLOEXEC); //2017-07-04: O_WRONLY | O_APPEND seems to avoid EOPNOTSUPP on gvfs SFTP!
if (fdFile == -1)
THROW_LAST_FILE_ERROR(replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtPath(itemPath)), L"open");
ZEN_ON_SCOPE_EXIT(::close(fdFile));
@@ -636,7 +639,7 @@ FileCopyResult copyFileOsSpecific(const Zstring& sourceFile, //throw FileError,
//it seems we don't need S_IWUSR, not even for the setFileTime() below! (tested with source file having different user/group!)
//=> need copyItemPermissions() only for "chown" and umask-agnostic permissions
- const int fdTarget = ::open(targetFile.c_str(), O_WRONLY | O_CREAT | O_EXCL, mode);
+ const int fdTarget = ::open(targetFile.c_str(), O_WRONLY | O_CREAT | O_EXCL | O_CLOEXEC, mode);
if (fdTarget == -1)
{
const int ec = errno; //copy before making other system calls!
diff --git a/zen/file_io.cpp b/zen/file_io.cpp
index 25dc93ce..df47e4c5 100755
--- a/zen/file_io.cpp
+++ b/zen/file_io.cpp
@@ -8,8 +8,8 @@
#include "file_access.h"
#include <sys/stat.h>
- #include <fcntl.h> //open, close
- #include <unistd.h> //read, write
+ #include <fcntl.h> //open
+ #include <unistd.h> //close, read, write
using namespace zen;
@@ -80,7 +80,7 @@ FileBase::FileHandle openHandleForRead(const Zstring& filePath) //throw FileErro
checkForUnsupportedType(filePath); //throw FileError; opening a named pipe would block forever!
//don't use O_DIRECT: http://yarchive.net/comp/linux/o_direct.html
- const FileBase::FileHandle fileHandle = ::open(filePath.c_str(), O_RDONLY);
+ const FileBase::FileHandle fileHandle = ::open(filePath.c_str(), O_RDONLY | O_CLOEXEC);
if (fileHandle == -1) //don't check "< 0" -> docu seems to allow "-2" to be a valid file handle
THROW_LAST_FILE_ERROR(replaceCpy(_("Cannot open file %x."), L"%x", fmtPath(filePath)), L"open");
return fileHandle; //pass ownership
@@ -180,7 +180,7 @@ FileBase::FileHandle openHandleForWrite(const Zstring& filePath, FileOutput::Acc
{
//checkForUnsupportedType(filePath); -> not needed, open() + O_WRONLY should fail fast
- const FileBase::FileHandle fileHandle = ::open(filePath.c_str(), O_WRONLY | O_CREAT | (access == FileOutput::ACC_CREATE_NEW ? O_EXCL : O_TRUNC),
+ const FileBase::FileHandle fileHandle = ::open(filePath.c_str(), O_WRONLY | O_CREAT | O_CLOEXEC | (access == FileOutput::ACC_CREATE_NEW ? O_EXCL : O_TRUNC),
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); //0666
if (fileHandle == -1)
{
diff --git a/zen/guid.h b/zen/guid.h
index 50ca64d2..89e800b5 100755
--- a/zen/guid.h
+++ b/zen/guid.h
@@ -7,21 +7,58 @@
#ifndef GUID_H_80425780237502345
#define GUID_H_80425780237502345
-#include <string>
- #include <boost/uuid/uuid_generators.hpp>
+ #include <fcntl.h> //open
+ #include <unistd.h> //close
+ //#include <uuid/uuid.h> -> uuid_generate(), uuid_unparse(); avoid additional dependency for "sudo apt-get install uuid-dev"
+
namespace zen
{
inline
std::string generateGUID() //creates a 16-byte GUID
{
- //perf: generator: 0.38ms per creation;
- // retrieve GUID: 0.13µs per call
- //generator is only thread-safe like an int => keep thread-local
- thread_local boost::uuids::random_generator gen;
- static_assert(boost::uuids::uuid::static_size() == 16);
- const boost::uuids::uuid nativeRep = gen();
- return std::string(nativeRep.begin(), nativeRep.end());
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 25) //getentropy() requires glibc 2.25 (ldd --version) PS: Centos 7 is on 2.17
+ std::string guid(16, '\0');
+ if (::getentropy(&guid[0], 16) != 0) //"The maximum permitted value for the length argument is 256"
+ throw std::runtime_error(std::string(__FILE__) + "[" + numberTo<std::string>(__LINE__) + "] Failed to generate GUID." +
+ "\n" + utfTo<std::string>(formatSystemError(L"getentropy", errno)));
+ return guid;
+
+#else
+ class RandomGeneratorPosix
+ {
+ public:
+ RandomGeneratorPosix()
+ {
+ if (fd_ == -1)
+ throw std::runtime_error(std::string(__FILE__) + "[" + numberTo<std::string>(__LINE__) + "] Failed to generate GUID." +
+ "\n" + utfTo<std::string>(formatSystemError(L"open", errno)));
+ }
+
+ ~RandomGeneratorPosix() { ::close(fd_); }
+
+ void getBytes(void* buf, size_t size)
+ {
+ for (size_t offset = 0; offset < size; )
+ {
+ const ssize_t bytesRead = ::read(fd_, static_cast<char*>(buf) + offset, size - offset);
+ if (bytesRead < 1) //0 means EOF => error in this context (should check for buffer overflow, too?)
+ throw std::runtime_error(std::string(__FILE__) + "[" + numberTo<std::string>(__LINE__) + "] Failed to generate GUID." +
+ "\n" + utfTo<std::string>(formatSystemError(L"read", bytesRead < 0 ? errno : EIO)));
+ offset += bytesRead;
+ assert(offset <= size);
+ }
+ }
+
+ private:
+ const int fd_ = ::open("/dev/urandom", O_RDONLY | O_CLOEXEC);
+ };
+ thread_local RandomGeneratorPosix gen;
+ std::string guid(16, '\0');
+ gen.getBytes(&guid[0], 16);
+ return guid;
+#endif
+
}
}
diff --git a/zen/perf.h b/zen/perf.h
index 40b6533d..77251f8c 100755
--- a/zen/perf.h
+++ b/zen/perf.h
@@ -28,19 +28,28 @@
namespace zen
{
-class PerfTimer
+
+//issue with wxStopWatch? https://freefilesync.org/forum/viewtopic.php?t=1426
+// => wxStopWatch implementation uses QueryPerformanceCounter: https://github.com/wxWidgets/wxWidgets/blob/17d72a48ffd4d8ff42eed070ac48ee2de50ceabd/src/common/stopwatch.cpp
+// => whatever the problem was, it's almost certainly not caused by QueryPerformanceCounter():
+// MSDN: "How often does QPC roll over? Not less than 100 years from the most recent system boot"
+// https://msdn.microsoft.com/en-us/library/windows/desktop/dn553408#How_often_does_QPC_roll_over_
+//
+// => using the system clock is problematic: https://freefilesync.org/forum/viewtopic.php?t=5280
+//
+// std::chrono::system_clock wraps ::GetSystemTimePreciseAsFileTime()
+// std::chrono::steady_clock wraps ::QueryPerformanceCounter()
+class StopWatch
{
public:
- [[deprecated]] PerfTimer() {}
-
- ~PerfTimer() { if (!resultShown_) showResult(); }
+ bool isPaused() const { return paused_; }
void pause()
{
if (!paused_)
{
paused_ = true;
- elapsedUntilPause_ += std::chrono::steady_clock::now() - startTime_; //ignore potential ::QueryPerformanceCounter() wrap-around!
+ elapsedUntilPause_ += std::chrono::steady_clock::now() - startTime_;
}
}
@@ -60,31 +69,43 @@ public:
elapsedUntilPause_ = std::chrono::nanoseconds::zero();
}
- int64_t timeMs() const
+ std::chrono::nanoseconds elapsed() const
{
auto elapsedTotal = elapsedUntilPause_;
if (!paused_)
elapsedTotal += std::chrono::steady_clock::now() - startTime_;
-
- return std::chrono::duration_cast<std::chrono::milliseconds>(elapsedTotal).count();
+ return elapsedTotal;
}
+private:
+ bool paused_ = false;
+ std::chrono::steady_clock::time_point startTime_ = std::chrono::steady_clock::now();
+ std::chrono::nanoseconds elapsedUntilPause_{}; //std::chrono::duration is uninitialized by default! WTF! When will this stupidity end???
+};
+
+
+class PerfTimer
+{
+public:
+ [[deprecated]] PerfTimer() {}
+
+ ~PerfTimer() { if (!resultShown_) showResult(); }
+
void showResult()
{
- const bool wasRunning = !paused_;
- if (wasRunning) pause(); //don't include call to MessageBox()!
- ZEN_ON_SCOPE_EXIT(if (wasRunning) resume());
+ const bool wasRunning = !watch_.isPaused();
+ if (wasRunning) watch_.pause(); //don't include call to MessageBox()!
+ ZEN_ON_SCOPE_EXIT(if (wasRunning) watch_.resume());
- const std::string msg = numberTo<std::string>(timeMs()) + " ms";
+ const int64_t timeMs = std::chrono::duration_cast<std::chrono::milliseconds>(watch_.elapsed()).count();
+ const std::string msg = numberTo<std::string>(timeMs) + " ms";
std::clog << "Perf: duration: " << msg << "\n";
resultShown_ = true;
}
private:
+ StopWatch watch_;
bool resultShown_ = false;
- bool paused_ = false;
- std::chrono::steady_clock::time_point startTime_ = std::chrono::steady_clock::now(); //uses ::QueryPerformanceCounter()
- std::chrono::nanoseconds elapsedUntilPause_{}; //std::chrono::duration is uninitialized by default! WTF! When will this stupidity end???
};
}
diff --git a/zen/ring_buffer.h b/zen/ring_buffer.h
index 1a67c452..6debd84e 100755
--- a/zen/ring_buffer.h
+++ b/zen/ring_buffer.h
@@ -163,16 +163,26 @@ public:
class Iterator
{
public:
+ using iterator_category = std::random_access_iterator_tag;
+ using value_type = Value;
+ using difference_type = ptrdiff_t;
+ using pointer = Value*;
+ using reference = Value&;
+
Iterator(Container& container, size_t offset) : container_(&container), offset_(offset) {}
Iterator& operator++() { ++offset_; return *this; }
+ Iterator& operator+=(ptrdiff_t offset) { offset_ += offset; }
inline friend bool operator==(const Iterator& lhs, const Iterator& rhs) { assert(lhs.container_ == rhs.container_); return lhs.offset_ == rhs.offset_; }
inline friend bool operator!=(const Iterator& lhs, const Iterator& rhs) { return !(lhs == rhs); }
+ inline friend ptrdiff_t operator-(const Iterator& lhs, const Iterator& rhs) { return lhs.offset_ - rhs.offset_; }
+ inline friend Iterator operator+(const Iterator& lhs, ptrdiff_t offset) { Iterator tmp(lhs); return tmp += offset; }
Value& operator* () const { return (*container_)[offset_]; }
Value* operator->() const { return &(*container_)[offset_]; }
private:
Container* container_ = nullptr;
- size_t offset_ = 0;
+ ptrdiff_t offset_ = 0;
};
+
using iterator = Iterator< RingBuffer, T>;
using const_iterator = Iterator<const RingBuffer, const T>;
diff --git a/zen/serialize.h b/zen/serialize.h
index 16375cff..d34b61b2 100755
--- a/zen/serialize.h
+++ b/zen/serialize.h
@@ -90,7 +90,7 @@ template <class BinContainer, class BufferedInputStream> BinContainer
bufferedLoad(BufferedInputStream& streamIn); //throw X
template <class N, class BufferedOutputStream> void writeNumber (BufferedOutputStream& stream, const N& num); //
-template <class C, class BufferedOutputStream> void writeContainer(BufferedOutputStream& stream, const C& str); //throw ()
+template <class C, class BufferedOutputStream> void writeContainer(BufferedOutputStream& stream, const C& str); //noexcept
template < class BufferedOutputStream> void writeArray (BufferedOutputStream& stream, const void* buffer, size_t len); //
//----------------------------------------------------------------------
class UnexpectedEndOfStreamError {};
diff --git a/zen/stl_tools.h b/zen/stl_tools.h
index 2ce2cf33..7365392f 100755
--- a/zen/stl_tools.h
+++ b/zen/stl_tools.h
@@ -43,8 +43,8 @@ template <class T, class Alloc>
void removeDuplicates(std::vector<T, Alloc>& v);
//binary search returning an iterator
-template <class ForwardIterator, class T, typename CompLess>
-ForwardIterator binary_search(ForwardIterator first, ForwardIterator last, const T& value, CompLess less);
+template <class Iterator, class T, typename CompLess>
+Iterator binary_search(Iterator first, Iterator last, const T& value, CompLess less);
template <class BidirectionalIterator, class T>
BidirectionalIterator find_last(BidirectionalIterator first, BidirectionalIterator last, const T& value);
@@ -125,9 +125,11 @@ void removeDuplicates(std::vector<T, Alloc>& v)
}
-template <class ForwardIterator, class T, typename CompLess> inline
-ForwardIterator binary_search(ForwardIterator first, ForwardIterator last, const T& value, CompLess less)
+template <class Iterator, class T, typename CompLess> inline
+Iterator binary_search(Iterator first, Iterator last, const T& value, CompLess less)
{
+ static_assert(std::is_same_v<typename std::iterator_traits<Iterator>::iterator_category, std::random_access_iterator_tag>);
+
first = std::lower_bound(first, last, value, less);
if (first != last && !less(value, *first))
return first;
diff --git a/zen/string_tools.h b/zen/string_tools.h
index 58cb6ea6..e09cb61f 100755
--- a/zen/string_tools.h
+++ b/zen/string_tools.h
@@ -14,7 +14,7 @@
#include <algorithm>
#include <cassert>
#include <vector>
-#include <sstream>
+#include <sstream> //std::basic_ostringstream
#include "stl_tools.h"
#include "string_traits.h"
@@ -446,7 +446,11 @@ namespace impl
template <class S, class T>
struct CopyStringToString
{
- T copy(const S& src) const { return T(strBegin(src), strLength(src)); }
+ T copy(const S& src) const
+ {
+ static_assert(!std::is_same_v<std::decay_t<S>, std::decay_t<T>>);
+ return T(strBegin(src), strLength(src));
+ }
};
template <class T>
diff --git a/zen/string_traits.h b/zen/string_traits.h
index 8187126d..cd7dbf1b 100755
--- a/zen/string_traits.h
+++ b/zen/string_traits.h
@@ -41,10 +41,14 @@ class StringRef
{
public:
template <class Iterator>
- StringRef(Iterator first, Iterator last) : len_(last - first), str_(first != last ? &*first : nullptr) {}
+ StringRef(Iterator first, Iterator last) : len_(last - first),
+ str_(first != last ? &*first : reinterpret_cast<Char*>(this) /*Win32 APIs like CompareStringOrdinal() choke on nullptr!*/)
+ {
+ static_assert(alignof(StringRef) % alignof(Char) == 0); //even though str_ is never dereferenced, make sure the pointer value respects alignment (why? because we can)
+ }
//StringRef(const Char* str, size_t len) : str_(str), len_(len) {} -> needless constraint! Char* not available for empty range!
- Char* data () const { return str_; } //1. no null-termination! 2. may be nullptr!
+ Char* data () const { return str_; } //no null-termination!
size_t length() const { return len_; }
private:
diff --git a/zen/thread.h b/zen/thread.h
index ee36f305..5828d07a 100755
--- a/zen/thread.h
+++ b/zen/thread.h
@@ -119,7 +119,7 @@ class Protected
{
public:
Protected() {}
- Protected(const T& value) : value_(value) {}
+ Protected(T& value) : value_(value) {}
//Protected( T&& tmp ) : value_(std::move(tmp)) {} <- wait until needed
template <class Function>
@@ -161,28 +161,46 @@ public:
ThreadGroup& operator=(ThreadGroup&& tmp) noexcept { swap(tmp); return *this; } //noexcept *required* to support move for reallocations in std::vector and std::swap!!!
- //context of controlling thread, non-blocking:
- void run(Function&& wi)
+ //context of controlling OR worker thread, non-blocking:
+ void run(Function&& wi /*should throw ThreadInterruption when needed*/)
{
- size_t tasksPending = 0;
{
std::lock_guard<std::mutex> dummy(workLoad_->lock);
+
workLoad_->tasks.push_back(std::move(wi));
- tasksPending = ++(workLoad_->tasksPending);
+ const size_t tasksPending = ++(workLoad_->tasksPending);
+
+ if (worker_.size() < std::min(tasksPending, threadCountMax_))
+ addWorkerThread();
}
workLoad_->conditionNewTask.notify_all();
-
- if (worker_.size() < std::min(tasksPending, threadCountMax_))
- addWorkerThread();
}
//context of controlling thread, blocking:
void wait()
{
- std::unique_lock<std::mutex> dummy(workLoad_->lock);
- workLoad_->conditionTasksDone.wait(dummy, [&tasksPending = workLoad_->tasksPending] { return tasksPending == 0; });
+ //perf: no difference in xBRZ test case compared to std::condition_variable-based implementation
+ auto promiseDone = std::make_shared<std::promise<void>>(); //
+ std::future<void> allDone = promiseDone->get_future();
+
+ notifyWhenDone([promiseDone] { promiseDone->set_value(); }); //std::function doesn't support construction involving move-only types!
+ //use reference? => not guaranteed safe, e.g. promise object theoretically might be accessed inside set_value() after future gets signalled
+
+ allDone.get();
+ }
+
+ //non-blocking wait()-alternative: context of controlling thread:
+ void notifyWhenDone(const std::function<void()>& onCompletion /*noexcept! runs on worker thread!*/)
+ {
+ std::lock_guard<std::mutex> dummy(workLoad_->lock);
+
+ if (workLoad_->tasksPending == 0)
+ onCompletion();
+ else
+ workLoad_->onCompletionCallbacks.push_back(onCompletion);
}
+ //context of controlling thread:
void detach() { detach_ = true; } //not expected to also interrupt!
private:
@@ -204,13 +222,21 @@ private:
Function task = std::move(wl->tasks. front()); //noexcept thanks to move
/**/ wl->tasks.pop_front(); //
- dummy.unlock();
-
- task();
+ dummy.unlock();
+ task(); //throw ThreadInterruption?
dummy.lock();
+
if (--(wl->tasksPending) == 0)
- wl->conditionTasksDone.notify_all(); //too difficult to notify outside the lock
+ if (!wl->onCompletionCallbacks.empty())
+ {
+ std::vector<std::function<void()>> callbacks;
+ callbacks.swap(wl->onCompletionCallbacks);
+
+ dummy.unlock();
+ for (const auto& cb : callbacks) cb(); //noexcept!
+ dummy.lock();
+ }
}
});
}
@@ -230,7 +256,7 @@ private:
RingBuffer<Function> tasks; //FIFO! :)
size_t tasksPending = 0;
std::condition_variable conditionNewTask;
- std::condition_variable conditionTasksDone;
+ std::vector<std::function<void()>> onCompletionCallbacks;
};
std::vector<InterruptibleThread> worker_;
diff --git a/zen/warn_static.h b/zen/warn_static.h
index 6f0a2691..fb8fbb95 100755
--- a/zen/warn_static.h
+++ b/zen/warn_static.h
@@ -18,7 +18,7 @@ Usage:
#if defined __GNUC__ //Clang also defines __GNUC__!
#define warn_static(MSG) \
- _Pragma(ZEN_STATIC_WARNING_STRINGIZE(GCC warning MSG))
+ _Pragma(ZEN_STATIC_WARNING_STRINGIZE(GCC warning MSG))
#endif
#endif //WARN_STATIC_H_08724567834560832745
diff --git a/zen/zstring.h b/zen/zstring.h
index cb19318c..026737da 100755
--- a/zen/zstring.h
+++ b/zen/zstring.h
@@ -18,7 +18,7 @@
//a high-performance string for interfacing with native OS APIs in multithreaded contexts
using Zstring = zen::Zbase<Zchar>;
- //for special UI-contexts: guaranteed exponential growth + ref-counting
+//for special UI-contexts: guaranteed exponential growth + ref-counting
using Zstringw = zen::Zbase<wchar_t>;
@@ -65,8 +65,20 @@ Zstring appendSeparator(Zstring path) //support rvalue references!
inline
Zstring getFileExtension(const Zstring& filePath)
{
- const Zstring shortName = afterLast(filePath, FILE_NAME_SEPARATOR, zen::IF_MISSING_RETURN_ALL);
- return afterLast(shortName, Zchar('.'), zen::IF_MISSING_RETURN_NONE);
+ //const Zstring fileName = afterLast(filePath, FILE_NAME_SEPARATOR, zen::IF_MISSING_RETURN_ALL);
+ //return afterLast(fileName, Zstr('.'), zen::IF_MISSING_RETURN_NONE);
+
+ auto it = zen::find_last(filePath.begin(), filePath.end(), FILE_NAME_SEPARATOR);
+ if (it == filePath.end())
+ it = filePath.begin();
+ else
+ ++it;
+
+ auto it2 = zen::find_last(it, filePath.end(), Zstr('.'));
+ if (it2 != filePath.end())
+ ++it2;
+
+ return Zstring(it2, filePath.end());
}
diff --git a/zenXml/zenxml/bind.h b/zenXml/zenxml/bind.h
index e33809d2..28f02745 100755
--- a/zenXml/zenxml/bind.h
+++ b/zenXml/zenxml/bind.h
@@ -55,7 +55,7 @@ void save(const XmlDoc& doc,
const std::string& lineBreak = "\r\n",
const std::string& indent = " ") //throw XmlFileError
{
- std::string stream = serialize(doc, lineBreak, indent); //throw ()
+ std::string stream = serialize(doc, lineBreak, indent); //noexcept
saveStream(stream, filename); //throw XmlFileError
}
diff --git a/zenXml/zenxml/dom.h b/zenXml/zenxml/dom.h
index 566af330..8793d5bd 100755
--- a/zenXml/zenxml/dom.h
+++ b/zenXml/zenxml/dom.h
@@ -147,10 +147,10 @@ public:
{
public:
using iterator_category = std::input_iterator_tag;
- using value_type = T;
- using difference_type = std::ptrdiff_t;
- using pointer = T*;
- using reference = T&;
+ using value_type = T;
+ using difference_type = ptrdiff_t;
+ using pointer = T*;
+ using reference = T&;
PtrIter(IterTy it) : it_(it) {}
PtrIter(const PtrIter& other) : it_(other.it_) {}
diff --git a/zenXml/zenxml/parser.h b/zenXml/zenxml/parser.h
index 76497ce7..a3975297 100755
--- a/zenXml/zenxml/parser.h
+++ b/zenXml/zenxml/parser.h
@@ -30,7 +30,7 @@ namespace zen
*/
std::string serialize(const XmlDoc& doc,
const std::string& lineBreak = "\r\n",
- const std::string& indent = " "); //throw ()
+ const std::string& indent = " "); //noexcept
///Exception thrown due to an XML parsing error
struct XmlParsingError : public XmlError
bgstack15